pax_global_header00006660000000000000000000000064147575307170014532gustar00rootroot0000000000000052 comment=2b7d35fb70649e2a28b1d4a9aa307f0190737e1a variety-0.8.13/000077500000000000000000000000001475753071700133065ustar00rootroot00000000000000variety-0.8.13/.github/000077500000000000000000000000001475753071700146465ustar00rootroot00000000000000variety-0.8.13/.github/ISSUE_TEMPLATE/000077500000000000000000000000001475753071700170315ustar00rootroot00000000000000variety-0.8.13/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000036071475753071700215310ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- **Version of Variety** **Describe the bug** **Context** **To Reproduce** 1. 2. 3. **Attach Variety's log file** **Desktop environment and version** **OS name and version** **Screenshots** **Attached files** **Additional context** variety-0.8.13/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000017211475753071700225570ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project title: '' labels: '' assignees: '' --- **Version of Variety you are using** **Is your feature request related to a problem? Please describe.** **Describe the solution you'd like** **Additional context** variety-0.8.13/.gitignore000066400000000000000000000013731475753071700153020ustar00rootroot00000000000000# Autogenerated by setup.py variety_lib/variety_build_settings.py .idea/workspace.xml # Build artifacts __pycache__/ *.py[cod] *$py.class .pybuild/ # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST debian/debhelper-build-stamp debian/files debian/*.log debian/*.substvars debian/*.debhelper debian/variety/ # PyInstaller *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ variety-0.8.13/.isort.cfg000066400000000000000000000003421475753071700152040ustar00rootroot00000000000000# Ensure consistent settings between isort and Black # This is necessary when using them in pre-commit hooks [settings] multi_line_output=3 include_trailing_comma=True force_grid_wrap=0 combine_as_imports=True line_length=100 variety-0.8.13/.mailmap000066400000000000000000000002031475753071700147220ustar00rootroot00000000000000James Lu James Lu variety-0.8.13/.quickly000066400000000000000000000002131475753071700147640ustar00rootroot00000000000000project = variety version = 12.08.1 template = ubuntu-application dependencies = imagemagick, python-lxml, python-gi-cairo lp_id = variety variety-0.8.13/.tx/000077500000000000000000000000001475753071700140175ustar00rootroot00000000000000variety-0.8.13/.tx/config000066400000000000000000000002441475753071700152070ustar00rootroot00000000000000[main] host = https://www.transifex.com [variety.variety-pot] file_filter = po/.po minimum_perc = 0 source_file = po/variety.pot source_lang = en type = PO variety-0.8.13/AUTHORS000066400000000000000000000001761475753071700143620ustar00rootroot00000000000000Copyright (c) 2012-2019, Peter Levi 2017-2019, James Lu variety-0.8.13/CHANGELOG.txt000077700000000000000000000000001475753071700210302data/ui/changes.txtustar00rootroot00000000000000variety-0.8.13/CONTRIBUTING.md000066400000000000000000000071041475753071700155410ustar00rootroot00000000000000# Contributing to Variety First off, thank you for helping! ## Bug tracking and bug fixing Many of the reported bugs for Variety are about a problem happening in a particular OS or desktop environment, under very particular conditions, or are more or less impossible for us, the main developers, to reproduce. Thus a pull request where the author has managed to reproduce reliably a bug and provides a fix is an extremely valuable contribution - these are always very welcome. ## Translations As of July 2021 we are using Transifex for managing translations: https://www.transifex.com/variety/variety Please ping **@jlu5** if you want to be added to the project. ## Bigger changes or new features If you plan on implementing any significant changes or developing new features, please sync your intentions with the main developers, Peter Levi and James Lu ahead of time, then open a PR early in the development phase. ## New image sources If you plan on developing support for new image sources in Variety, please sync ahead of time with Peter Levi. Every new image source to be added to Variety should meet several criteria: - The license of the images there must explicitly permit usage of the images as wallpapers - The image source should provide some sort of an API or a structured feed (e.g., json or xml). Scraping data out of HTML is not acceptable for new sources in Variety. - The image source must provide image author attribution - Additionally, as a general rule we should try to select high-quality sources that make good wallpapers. The general policy is that we prefer quality over both quantity and searchability / customization. Suggestions for adding specific Flickr photographers' feeds as default sources are also welcome, as long as their images meet the license and quality criteria above (the other two are met by default with Flickr) ## Code style We use Black and isort, using line length of 100 symbols. If you wish to contribute, please install Black and isort with `pip install black isort`. Run on changed files with: ``` isort -rc edited_file_or_folder black --line-length 100 --target-version py35 edited_file_or_folder ``` Or use directly the provided script `toolchain/autoformat` for this. There are also configuraton files for both isort and black (`.isort.cfg` and `pyproject.toml`), so just running `black` without passing in parameters will still use the correct settings. There is also a pre-commit hook available that will do these steps for you, install it with ``` cd .git/hooks && ln -sf ../../toolchain/pre-commit-autoformat pre-commit ``` ## Testing We don't have CI support, yet. Please make sure all tests under the `tests` folder pass in your branch. Run tests with, from the root of the project: ``` python3 -m unittest discover -p 'Test*.py' tests ``` All of the tests for the various image sources actually access the image source, so these could fail sometimes when the remote site is down for maintenance - use common sense for whether your changes caused the failure or it failed because of ax external reason. Please note the test suite is not yet very extensive, and also does not cover any of the UI aspects of Variety - always do some manual tests before you consider your PR is complete. ## Editing UI files We have used Glade to develop the GTK UI dialogs of Variety. To install glade on Ubuntu: ```commandline sudo apt install glade ``` If you just run it and try to open one of the .ui files in `data/ui`, it would give you an error. Here is how to run it successfully: ``` GLADE_CATALOG_SEARCH_PATH=data/ui/ glade data/ui/PreferencesVarietyDialog.ui ``` variety-0.8.13/LICENSE000066400000000000000000001045131475753071700143170ustar00rootroot00000000000000 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 . variety-0.8.13/README.md000066400000000000000000000073221475753071700145710ustar00rootroot00000000000000# Variety Variety is a wallpaper manager for Linux systems. It supports out-of-the-box most Linux desktop environments, and can be configured to work on more esoteric ones. It can use local images or automatically download wallpapers from Flickr, Wallhaven, Unsplash, Bing, Reddit and other online sources, allows you to rotate them on a regular interval, and provides easy ways to separate the great images from the junk. Variety can also display wise and funny quotations or a nice digital clock on the desktop. Where supported, Variety sits as a tray icon to allow easy pausing and resuming. Otherwise, its desktop entry menu provides a similar set of options. ## Screenshot ![Screenshot from 2022-07-30 16-36-55](https://user-images.githubusercontent.com/1457048/181916884-8a388e15-67dc-45ff-a8e2-e05aac7fca91.png) ## Installation ### As a system package Variety is available in the distro repositories of: - [Arch Linux](https://archlinux.org/packages/extra/any/variety/) - [Debian 9+](https://packages.debian.org/search?keywords=variety) - [Fedora](https://www.rpmfind.net/linux/rpm2html/search.php?query=variety) - [OpenSUSE](https://software.opensuse.org/package/variety?search_term=variety) - [Ubuntu 16.04+](https://packages.ubuntu.com/search?keywords=variety) - [NixOS](https://search.nixos.org/packages?show=variety&type=packages&query=variety) On a recent Ubuntu or Debian-based system (Universe repository has to be enabled on Ubuntu): ``` sudo apt update && sudo apt install variety ``` ### Ubuntu PPA Variety backports to older Ubuntu releases are available at this PPA: https://launchpad.net/~variety/+archive/ubuntu/stable. The PPA usually provides newer releases than the ones available in the Universe repository: ``` sudo add-apt-repository ppa:variety/stable sudo apt update sudo apt install variety ``` If you have added the PPA, you may also install [Variety Slideshow](https://github.com/peterlevi/variety-slideshow) – a pan and zoom image slideshow/screensaver, which is an nice optional addition and integrates well into Variety. It is not available in the standard Ubuntu Universe repository. ``` sudo apt install variety-slideshow ``` ### Install from source To install Variety from source, you will need Git, Python 3.8+ and [distutils-extra](https://launchpad.net/python-distutils-extra). To actually run Variety, you will also need the following: #### Runtime Requirements - GTK+ 3 - gexiv2 - libnotify - Python 3 libraries: - BeautifulSoup4 - lxml - Pycairo - PyGObject, built with Cairo integration - ConfigObj - Pillow - packaging - Requests - *Optional*: httplib2 (for more quotes sources) - *Optional*: imagemagick (for wallpaper filters) - *Optional*: feh or nitrogen: used by default to set wallpapers on i3, openbox, and other WMs - *Optional*: libayatana-indicator (for AppIndicator support) - *Optional*: for tray icon support on GNOME, the [GNOME AppIndicator extension](https://github.com/ubuntu/gnome-shell-extension-appindicator) - *Optional*: libavif-gdk-pixbuf (for avif format support) See `debian/control` for an equivalent list of runtime dependencies on Debian/Ubuntu. #### Install steps 1. Clone the git repository: `git clone https://github.com/varietywalls/variety.git && cd variety` 2. Run `python3 setup.py install`. By default, this will install Variety into `/usr/local`; for a local installation, use `python3 setup.py install --prefix $HOME/.local`. 3. Run `variety` from the command line or its desktop menu entry. ## Launching Regardless of how you install, you can launch Variety from the dash or applications menu, or by running `variety` in a terminal. Run `variety --help` to see the command-line options. They allow you to control Variety from the terminal. variety-0.8.13/bin/000077500000000000000000000000001475753071700140565ustar00rootroot00000000000000variety-0.8.13/bin/variety000077500000000000000000000053201475753071700154670ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import os import sys if os.geteuid() == 0: print( 'Variety is not supposed to run as root.\n' 'You should NEVER run desktop apps as root, unless they are supposed to make ' 'system-global changes and you know very well what you are doing.\n' 'Please run it with your normal user.\n' '\n' 'If you are trying to run as root because Variety does not start at all with your normal ' 'user, you may be hitting a file permission issue or a bug.\n' 'Here is what to do to troubleshoot:\n' '\n' '1. Open a terminal and run "variety -v" with your normal user.\n' 'Look for exceptions and hints in the log for what the problem might be.\n' '\n' '2. You may try to rename ~/.config/variety to ~/.config/variety_bak and try again.\n' 'This will have Variety start from a clean state.\n' 'Your old config and images will remain in variety_bak\n' '\n' '3. If none of these helps, open a bug in https://github.com/varietywalls/variety/issues ' 'and follow the instructions there.' ) exit(1) # Add project root directory (enable symlink and trunk execution) PROJECT_ROOT_DIRECTORY = os.path.abspath( os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0]))) ) python_path = [] if os.path.abspath(__file__).startswith("/opt"): syspath = sys.path[:] # copy to avoid infinite loop in pending objects for path in syspath: opt_path = path.replace("/usr", "/opt/extras.ubuntu.com/variety") python_path.insert(0, opt_path) sys.path.insert(0, opt_path) if os.path.exists(os.path.join(PROJECT_ROOT_DIRECTORY, "variety")): python_path.insert(0, PROJECT_ROOT_DIRECTORY) sys.path.insert(0, PROJECT_ROOT_DIRECTORY) if python_path: os.putenv( "PYTHONPATH", "%s:%s" % (os.getenv("PYTHONPATH", ""), ":".join(python_path)) ) # for subprocesses import variety # isort:skip variety.main() variety-0.8.13/data/000077500000000000000000000000001475753071700142175ustar00rootroot00000000000000variety-0.8.13/data/config/000077500000000000000000000000001475753071700154645ustar00rootroot00000000000000variety-0.8.13/data/config/filters.txt000066400000000000000000000010051475753071700176710ustar00rootroot00000000000000# These are automatically appended to the user's filters. # New default filters should be added here, as well as in the default config so that existing users will also see them # (they already have a config file, so the default config is not used for them) False|Keep original| False|Grayscale|-type Grayscale False|Heavy blur|-scale 20% -blur 0x10 -resize 500% False|Soft blur|-scale 20% -blur 0x2 -resize 500% False|Oil painting|-paint 8 False|Pointilism|-spread 10 -noise 3 False|Pixellate|-scale 3% -scale 3333% variety-0.8.13/data/config/sources.txt000066400000000000000000000005061475753071700177110ustar00rootroot00000000000000# These are automatically appended to the user's sources. # New default sources should be added here, not in the default config so that existing users will also see them # (they already have a config file, so the default config is not used for them) False|favorites|The Favorites folder True|fetched|The Fetched folder variety-0.8.13/data/config/ui.conf000066400000000000000000000003601475753071700167470ustar00rootroot00000000000000# Position of thumbnails stripe: bottom, top, left or right thumbs_position=bottom # Size of thumbnails stripe in pixels thumbs_size=120 # Limit number of shown images for better performance, use "Unlimited" for no limit thumbs_limit=200 variety-0.8.13/data/config/variety.conf000066400000000000000000000255641475753071700200320ustar00rootroot00000000000000# change_on_start = change_on_start = False # change_enabled = change_enabled = True # change_interval = change_interval = 300 # internet_enabled = internet_enabled = True # safe_mode = safe_mode = False # What scripts to use to set the wallpaper, or to obtain the path to the current wallpaper # Variety automatically manages and upgrades these two files: # ~/.config/variety/scripts/set_wallpaper # ~/.config/variety/scripts/get_wallpaper # If you want some custom logic to happen when Variety tries to set/get the wallpaper, e.g. because # you use some Desktop Environment that is not supported by default, please create copies of one # or both of these files, make the new files executable, and provide the new paths here. # Having a functional set_wallpaper script is essential, get_wallpaper is not so important. set_wallpaper_script = ~/.config/variety/scripts/set_wallpaper get_wallpaper_script = ~/.config/variety/scripts/get_wallpaper # download_folder = - when not specified, the default is ~/.config/variety/Downloaded download_folder = ~/.config/variety/Downloaded # download_preference_ratio - if we have "unconsumed" download sources, we'll prefer to show a newly # downloaded image instead of an existing one in this percentage of the cases download_preference_ratio = 0.9 # Determine if the download folder should not exceed a certain size (in megabytes) # quota_enabled = # quota_size = quota_enabled = True quota_size = 1000 # Wallhaven API key, by default it's an empty string wallhaven_api_key = "" # favorites_folder = - when not specified, the default is ~/.config/variety/Favorites favorites_folder = ~/.config/variety/Favorites # Prefer Copy to Favorites or Move to Favorites operation (or both), depending on the folder of the current image # favorites_operations = # The default is: Downloaded:Copy;Fetched:Move;Others:Copy # Order is important - the first matching entry will determine what operation(s) to show in the menu for a specific file # Special folder names you can use: Downloaded, Fetched and Others (same as "/" - use it as last entry to determine the default operation) # Example1: Downloaded:Copy;Fetched:Move;/pics/RandomImages:Move;/pics/OrganizedAlbums:Copy;Others:Copy # Example2: Others:Both - always show both Copy and Move to Favorites, no matter which image is shown # Move to Favorites is only shown when the user has write permissions over the file, otherwise we fallback to Copy favorites_operations = Downloaded:Copy;Fetched:Move;Others:Copy # wallpaper_auto_rotate = wallpaper_auto_rotate = False # wallpaper_display_mode = <"os" | # "smart" | "zoom" | "fill-with-black" | "fill-with-blur" | # "gnome-zoom" | "gnome-centered" | "gnome-scaled" | "gnome-stretched" | "gnome-spanned", "gnome-wallpaper"> wallpaper_display_mode = "os" # fetch_folder = - when not specified, the default is ~/.config/variety/Fetched fetched_folder = ~/.config/variety/Fetched # Clipboard monitoring settings # clipboard_enabled = # clipboard_use_whitelist = # clipboard_hosts = clipboard_enabled = False clipboard_use_whitelist = True clipboard_hosts = "wallhaven.cc,wallpapers.net,flickr.com,imgur.com,deviantart.com,interfacelift.com,vladstudio.com,imageshack.us,deviantart.net,imageshack.com" # Icon settings # icon = icon = Light # Prefer only images with this color: # desired_color_enabled = # desired_color = # DISCLAIMER: This feature is still experimental desired_color_enabled = False desired_color = None # Minimum size of images to use, as a percentage of the screen resolution # min_size_enabled = # min_size = min_size_enabled = False min_size = 80 # Should we use only landscape-oriented images? # use_landscape_enabled = use_landscape_enabled = True # Prefer light or dark images # lightness_enabled = # lightness_mode = <0 for Dark, 1 for Light> lightness_enabled = False lightness_mode = 0 # Use a filter by rating? # min_rating_enabled = # min_rating = <1 | 2 | 3 | 4 | 5> min_rating_enabled = False min_rating = 4 # Use a name regex filter? # name_regex_enabled = # name_regex = name_regex_enabled = False name_regex = .* # What parts of the initial wizard have we covered smart_notice_shown = False smart_register_shown = False stats_notice_shown = False # Are smart features enabled (i.e. data collection on Fav/Trash operations), also sync, and anonymous usage stats collection? # smart_enabled = smart_enabled = False sync_enabled = True stats_enabled = True # Folder to copy the wallpaper image to and make it world-readable. Provides LightDM support. # copyto_enabled = , default is False # copyto_folder = , the default is Default # Default means to use the XDG Pictures folder when home folder is unencrypted and /usr/share/backgrounds when it is encrypted. copyto_enabled = False copyto_folder = Default # Clock settings # clock_enabled = # clock_font = , default is "Serif 70" # clock_date_font = , default is "Serif 30" clock_enabled = False clock_font = "Serif 70" clock_date_font = "Serif 30" # clock_filter = # # The filter defines the ImageMagick command that Variety uses to render the clock on the wallpaper. # First some scaling is applied to get the image down to the screen size - this ensures # the final drawn clock won't be rescaled by the desktop wallpaper system. # Easiest way to see what's happening is to run variety with -v, enable clock and see what ImageMagick # commands Variety dumps in the log. # # The user may want to customize the following aspects: # fill - color of "filling" # stroke - color of outline # strokewidth - width of outline # gravity - in which corner to display the clock - SouthEast, NorthEast, SouthWest, NorthWest # annotate - these must be in the form 0x0+[%HOFFSET+X]+[%VOFFSET+Y], where you can edit X and Y - # distance from the screen corner defined by gravity. Write them in even if they are 0. # # The %HOFFSET and %VOFFSET parameters are there for Variety to replace in order to compensate for the # diferent dimensions of every image and screen. # The several %FONT parameters are there for Variety to replace with the font settings from the GUI. # # The texts can contain these symbols: # # %H - hours (24), %I - zero-padded hours (12), %l - hours (12), %p - am or pm, %M - minutes, # %A - day of week (full), %a - day of week abbreviation, %B - month name, %b - month abbreviation, %d - day of month, %Y - year. # The full list for these can be seen here: http://docs.python.org/library/datetime.html#strftime-strptime-behavior # Have in mind that Variety will not update the clock more often than once every minute, so using seconds (%S) for example is pointless # # A tutorial on "annotating" with ImageMagick that you may use as a reference: http://www.imagemagick.org/Usage/annotating/ # You can get a very uniquely looking clock with some of the more advanced techniques (e.g. circle-shaped text, interesting colors and shading, etc....). clock_filter = "-density 100 -font `fc-match -f '%{file[0]}' '%CLOCK_FONT_NAME'` -pointsize %CLOCK_FONT_SIZE -gravity SouthEast -fill '#00000044' -annotate 0x0+[%HOFFSET+58]+[%VOFFSET+108] '%H:%M' -fill white -annotate 0x0+[%HOFFSET+60]+[%VOFFSET+110] '%H:%M' -font `fc-match -f '%{file[0]}' '%DATE_FONT_NAME'` -pointsize %DATE_FONT_SIZE -fill '#00000044' -annotate 0x0+[%HOFFSET+58]+[%VOFFSET+58] '%A, %B %d' -fill white -annotate 0x0+[%HOFFSET+60]+[%VOFFSET+60] '%A, %B %d'" # Quotes settings # quotes_enabled = # quotes_font = , default is "Serif 30" # quotes_text_color = , default is 255 255 255 # quotes_bg_color = , default is 80 80 80 # quotes_bg_opacity = <0-100>, default is 55 # quotes_width = <0-100>, default is 70 # quotes_hpos = <0-100>, default is 100 # quotes_vpos = <0-100>, default is 40 # quotes_max_length = a positive integer, quotes above this length will not be displayed # (as they often won't fit well on screen) # quotes_text_shadow = , default is False # quotes_disabled_sources = <|-separated list of disabled quote plugin names>, default is "Urban Dictionary" # quotes_tags = , default is empty # quotes_authors = , default is empty # quotes_change_enabled = # quotes_change_interval = , default is 300 quotes_enabled = False quotes_font = "Serif 30" quotes_text_color = 255 255 255 quotes_bg_color = 80 80 80 quotes_bg_opacity = 55 quotes_text_shadow = False quotes_width = 70 quotes_hpos = 100 quotes_vpos = 40 quotes_max_length = 250 quotes_disabled_sources = Urban Dictionary quotes_tags = quotes_authors = quotes_change_enabled = False quotes_change_interval = 300 quotes_favorites_file = ~/.config/variety/favorite_quotes.txt quotes_favorites_format = fortune # Slideshow settings slideshow_favorites_enabled = True slideshow_sources_enabled = True slideshow_downloads_enabled = False slideshow_custom_enabled = False slideshow_custom_folder = Default slideshow_sort_order = Random slideshow_monitor = All slideshow_mode = Fullscreen slideshow_seconds = 6 slideshow_fade = 0.4 slideshow_zoom = 0.2 slideshow_pan = 0.05 # List of sources # Each source is srcX = # location depends on type - path or url or search options, or just a name for unconfigurable sources # Folders are included recursively # BE CAREFUL: all keys below (src1, src2, etc.) MUST be different [sources] src1 = True|favorites|The Favorites folder src2 = True|fetched|The Fetched folder src5 = True|folder|/usr/share/backgrounds src11 = True|flickr|user:www.flickr.com/photos/peter-levi/;user_id:93647178@N00; # Image filters to apply randomly to every wallpaper (ImageMagick is used for this) # Each filter is filterX = # BE CAREFUL: all keys below (filter1, filter2, etc.) MUST be different [filters] filter1 = False|Keep original| filter2 = False|Grayscale|-type Grayscale filter3 = False|Heavy blur|-scale 20% -blur 0x10 -resize 500% filter4 = False|Soft blur|-scale 20% -blur 0x2 -resize 500% filter5 = False|Oil painting|-paint 8 filter6 = False|Pointilism|-spread 10 -noise 3 filter7 = False|Pixellate|-scale 3% -scale 3333% variety-0.8.13/data/icons/000077500000000000000000000000001475753071700153325ustar00rootroot00000000000000variety-0.8.13/data/icons/22x22/000077500000000000000000000000001475753071700161115ustar00rootroot00000000000000variety-0.8.13/data/icons/22x22/apps/000077500000000000000000000000001475753071700170545ustar00rootroot00000000000000variety-0.8.13/data/icons/22x22/apps/variety-indicator-dark.png000066400000000000000000000012671475753071700241440ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsϐtEXtSoftwarewww.inkscape.org<4IDAT8KqG[˥3a-i"tH.!BMXle%D:D6j-+hE:h>&߅ |>z~|3c?$ \/ Z[m!^`RK~213,SC =IȳA FY6Ms.ձf~Hv"8SBg6fe@eS*ɏSTv>7k!MQz?f0@$5:L%{jNk.{Vxv; w 5MVlo,,FHĭo ~H,LLg&' vһx?+[Mc>9ZWׇ=g=a_t5 y"@6ŋ 0~3ݩRy (^U˻|ᆌ5K,H$3Wd&fD@&1WD[?o\d ( lz5==wysx`XS vh,b/}4MJF ?(0sIENDB`variety-0.8.13/data/icons/22x22/apps/variety-indicator.png000066400000000000000000000012561475753071700232230ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsϐtEXtSoftwarewww.inkscape.org<+IDAT8KhQsg&*5$X_ .T Etj 6!-+pa7JEWҕEP|&͘43s]$*_s8;.+!"UpDeGp? Dd^8P~^ݼsv",2?ݿ{E(xzzAp^'> 9t]dMnn6+tz1F'U1&$62b(4x`cKwoObșH&gƂK1YΎF"N0fp媊Y8Jzގ}u[;:CSÃ]~Nk: +b$IENDB`variety-0.8.13/data/icons/scalable/000077500000000000000000000000001475753071700171005ustar00rootroot00000000000000variety-0.8.13/data/icons/scalable/apps/000077500000000000000000000000001475753071700200435ustar00rootroot00000000000000variety-0.8.13/data/icons/scalable/apps/variety.svg000066400000000000000000000073311475753071700222530ustar00rootroot00000000000000 image/svg+xml variety-0.8.13/data/media/000077500000000000000000000000001475753071700152765ustar00rootroot00000000000000variety-0.8.13/data/media/sfw-0.svg000066400000000000000000000042531475753071700167570ustar00rootroot00000000000000 image/svg+xml variety-0.8.13/data/media/sfw-100.svg000066400000000000000000000043121475753071700171140ustar00rootroot00000000000000 image/svg+xml variety-0.8.13/data/media/sfw-50.svg000066400000000000000000000043111475753071700170370ustar00rootroot00000000000000 image/svg+xml variety-0.8.13/data/media/sfw-80.svg000066400000000000000000000043121475753071700170430ustar00rootroot00000000000000 image/svg+xml variety-0.8.13/data/media/tray-screenshot.png000066400000000000000000001245441475753071700211500ustar00rootroot00000000000000PNG  IHDR<B$sBIT|d pHYs ׆tEXtSoftwarewww.inkscape.org< IDATxyfU=U>.J-$[%! $c[08|&$d&wcla2dBB&,`8^ے-}Voܪ3T]W-!>nݪSVS*ODD&N ?cw\mg6g={zzi߷t^gF-mcZYS,끜?m t._3Wz&@M:Uؿg8#?~|#`.6;wp Cq۾lo)_SdxqKφ t.weyg&pFqo۷o, L@wq8|M,//UÙ\ tmɏ%Awmt͹ x#`7d&:],\KKkW2Jg^W9ʲ=UzesJt|6m:0=;9$ xL}&-p5@nyyYS]Icm'n vn7 x;Ʊ}._!B\N4o;vdSS`fSMGuz&qG%tƁY^Qeiw 溲֓nwz tYK׃uomsu~ia?|\Y63!jV+WuS@N[:z33M6)ϓOjhAo쮩uvemkM6 ߟh@B6T!Aȯ(,|X,1Wiwt/ξ 盞*3^=(ϲ,ͫ<ϴʕXkZv++mt.-utǎ2?'oϞ=zwsNzقseyyYvVk233~ SiYͺStRNE!0Cveu;4}1,iǘIiU!^WN։:r1 dM{s݀ʲLWk)˺\ZtӦO/i|۷?;80z+렗`Y0l/ lY9)e5뙢pnwdM{z18ksZ+E:0u:gxh/3I`SyԂTO-d3fqGX}ԁb(rrtcy:W6ף3l2<&խwBSCծkQf~WE^kY7әWW;ffk\VY>^qż?|rrҼUU$&y-'O4[.H16:5)LufL67~khDQQj.| M=)FHS?lոiѸ?ǸۑGN:WfLcrIQU9`b9֧*>eLkH&ePVşL)i|x8#2IǗ1Ac VT`t D{O:~z՞qӾye'::c?0fӦ>|spCzU(MںWYvVk٬M,k,ˌ ZkZc5(rɽq&xx%x2,s1χjYe<  F8#/T|L3ɱ_ Nc>s3 {S d #ݍvɓ'KWFD,SΪZĚ ƶ3``eLVx30X^ P)UEr$G숬Z9\cFV_&44|ن(\F^O/-tyw!N/gC) qI.g#ah̨ʻ\:?UЙR1q&.U 1TT8/ye>wUqS켱6wv颗|EA `nnM=8prԵ<&4xؔ}kr&SDVdՂtg V1cpF3+ƊU^5F%}ǭ$0 Fg{hJM'٘ dyUW16( ??#%sY9UI2o* kx"!\ 1NZoDzqf^D1⌈qgqYzָ, _ej^Q>qUd~>";_Plݺ f3"Vfs>sg L3P ZQgXU FQX-ī5*% {P@97G#PM$ǵJN2Pר|uPJc HlaYaS; úX"&1!S4\3UJV'Q$Eng3gMo~Y8 *~3 \ms UۿCJ,؅1Ƙ<_3`Ly[:{ @idfXb QcŨWD bԮSծ[%c[EتHto: &Cz͢\HJ-ZV+NUGrl &: 𢳀s j N쬭de-VY XBo;$!°#LR904I{ȹXe?!$U0wn㲲 OH=_7jfԟ3$jAQ,h!bQUŋx&wDԉ˜0Κ"{Sx=6l.z5:5V9îllA>,pp`XmhN) lv{ހ5-f3<\u{eV qb-xk ƫ1F*+52?IF$U+bWo5{QA * nǫu֏L7ChQt}Ѧ(ؕc/z|6&P{>Zz58<ƃ7`jւ|DcT L&, 'Q5`(ekb*Fy;3`<=+x$A 8C0ɫtp}o Z6N~WW7(9B}az{-nfUM =[ YjxABM+/AU88#"ƘdQcjSS?pnTDtvvU#s`3`iiIvljw"Eqlm1ΩufYYQS"R%osp-09)aⱂA1jFA Z4$̸oQZG%z1UT5vahSB2QHl h0JP)x5T~_S]j6T1>Y 9x ])UQ(41A&y!b &j}ƌzPl *t,W `#dRu& "*Q}|ˎ@lƳPJ A#\g0IMӨ55S5P65C竟Ģh\TpWoL<8D BU 1:Z#Ɖ3FƒyEmGEvSE./Os R1;q.2gt?acu^?o9Yr0-Ȥis_] tΎ,;]3}\2V_2SU?=}Ç^*8Z{<<6 [8LJUe-Afg"ݧ:u] tZXqeLňGwYہѩU]^,-Ȗ-wҙ۽&[-,qΙNǙ~o,з`fVɼ\m=Sо]hݍS_'<]$X+@|yWhfbu:=6-Kys,;)!@%,-cSSΞ^hqb09cd0+L v37>W;2@޹cOk綿bNLހ~@ݢz ?I1䨸ɜf:&["k:+0-۶mBr ikEǏ\Jwq%6]AakcVfhnoy&*z 0 /ccO7xփΝ;ɓ4uťeN^W7V+3g譬cfz-[A6\Z"*Ư yl;^!L@n[rpkc$RH.c#)+XZumgÿd-:("(:RZ- ~Jsw :6wկzw}O3,,.25= ˝%zsysxr!^]WsG*LjSf/_.?^3w?Gxg8b nFuzgAmvlΎ'"]|E\|E<#$3"V8g7N X3 ,e W?Ց+r((Tھ-h_<ޠb\8l̹o  YZ\(g_=I,-P̲yv,kp(6{WVm"(vvn߆լQaaUy'(+lW^ߚb2{e 0̜,/d/7x n8Kwo{Y{a ~k&>^f>'ʽ=xvݵPhu_V.y.޳V|ws.ny<#|;YY]ennVZw/~?S^v9}J\ o{W1u=xՁpqE;wx^K^r^>O~7Ċct:⫆4KYQ0aP,Vj&rp^rHK{bZ]6oԩrq<-@nJOvӢ;ss"-'A41N1"bUP M*Z^v˘{pȓLMuns",_ucPUzzw4EXkquO1x~W%ث_?|(_NѯJ7oo]w{on{[+?Gl<{fgp7m(:-.pi/{KWK/^y/~K|C?u^]]w}^ ^i-svn5dO\ݢ5/ol[c龯qrI+؏ΗB{l[ǿ17ܶH~]'ӎٹcocvvlc1^K/oyk?1_#>JO*ub N\2ܠv{h=x C&KR3(XTnqދL9gԈ Šo'Ӹreu%vlu+yKnڵWps˟9o|gx*罿imo}3~moݿt;o>D]x ԩpms{brauvBKo˼;7<7{ԯpjťG8ɟy ?%^ky¿7?wu7Wo?ki0ϔsΝ޵sPN>|fggxӬ1u+N"XU3#Ю.sfG8ǯ.=Ƭϡ/!`m򗎏[i X˷vW|߭܌3'uc"p||TEb1{aJeP8q\f&3ȑ#AӋ#pέI4x`TD {F?syo0M ܵW|6VU<;i6n_`8l>}ܔ@99vwīС)֡@ zǎ{8i[ܞ̦yRz3uIͳf B;ཷkf={otZdc}z:F :6v;cq·z՛^wvg9[O5sr85 ʽ IDAT @֍g 2YY\diN/ǣWα{.vvdC/|[dOp=q0_yضuGŋ77*ԋKķ뭫jq,sND 6QcQ:iRM;'}yٍ7|{w/|>/  VE{!{kR)$!b_$o_;(-烿@>.ѼM_ UNw~Gw0a_~FK-ޕBwu7y߯]o;&}| Y}[E/|AQΔLȽ*"c,~^E1`0\nհ岽\WC7o>Z-{E?86ަϟ :XayУ7X\)lX^aqi%2PUUQ獘W/VsN:6ׁlnc kj^CDN1a~ ObqEԫ1xZC ÷ʭ|%++lq+.jHDQdEՇ|JqC J Kszt(cװ 9n{[֠] -;~3|OdAfy@D 7J߸.`;Z7o~'r_v%?ˋ_R盞 8q;GX$𙛛cnVXXXdvfٙVWXY]`n&mTf9|?〚9vea}Oy+zCw.b^". ]<"OGy+̫*ae峫z.^}5Օ5/#8g<*=Ŋ`ַ,./J A!j4m%S $ jTPcFivW5l]ٙZIQXYYauu}Q RÔLUZ㖴޵Uz(l1R 1__O?γOÛUq)7,?><ꫮmo}[P+YX\`YnP}/yy~yϿy\{|_ǟ/y _td)nJ,78M19yg \q%WacQs_kS?ȏ!_=ʩb,Lpw^~~_ (¡P?C{nN1(N$S@`zވ X#m跺KPj{e\E8^ :^NltqUEѸabCOJyF-Ofl(W&Qx[U>y,˃H@5^Ndn _Qk#")#[MRWOXX xc|}C)-| ĘmL97N]nr(R׿qkv~5|>G? nhǑzO}owqj!y#Ge{/A1Ǟ9G^q9+_0\2}_K*!z ⁇q'F2='gfg^gzzz|xm>Gb- c/Rء3CH7‡7x/r2@cEԂxYË|5(QS5dMڜǟxTMbG>kGٺes `&%u_%)E_ÿ15P6!~;~vh~E~~r;ĩ-BYq73o{9z8{y1dY}|Ko_::D34kkk,>-gyͭ$|ŋ/HK㖴!<6;0\$v^BNٮ7e7e|#YmOgFc^gE#+W GJ]Gdn毥x)2MVrhL4wgeecǎoL Dsh;H4c|V$4QXAN&^-sUV׺{#:p&?ï ?F~|unGףn4'^}ՕڹCO=ƞ={=9$>|<ۨvϪ\<9Øe,U]-t1#]qY`u?0Na7o.{/nJ!Bu|m|W1xE F&Ձ,?xhCi5 RQQ;)O-];^ 97NJ\q^8\%MOOO4O΅3=5?G%>?GLOOv4SGuY sv];X\Xԩgu:T˙hfz*X4+-m^w [(F8Ѓxd "މ+&.&~i]Kn]|}yGpI竫T1PR^hkĈ#g5DSS>O*3[,JMGceeƯuRqN"jec*38bMvKz6EuQaw(ie;_TC͈q6<9397]yW5xLOUm `'8s8Q*z ijOntS_?_y}'xǰֆJ3JcSA#`iF֙'hp8X[ݘJjȫV7^H La3cP`hO@|FhHƟUҰAmewb-g'V"+.-q/MTf^6-fR0,z: Iy u_Nzl559kZBߦ&fR&͢7k[m%۶Q1 @@2\h;J|o Fi<]LYhDbs3S53) ^JZmt#5īDQA,I3*AbX|Z[VMYgap<.]=FXXǦ˟`O_fv.2+vxhq'yt4FP )'LJ|<#jaJ!u-*%J*dAT1oKaHyYDA^?\JɪX7l 88&_w,vJ\{&Rpb ˦RFF5`+~+N*) FZz5PX799U!Kӹ ,ۣeƵ)rX8>+.faGǃ# jAfabiCk5 KZf=,-u9 %AՎžlż"f_k'<1ܢR^ui(z|z@-#nXo;ز% :?@ aV,NkI+zxpEhX ˰Jw =bJ_B긼 =Mwby{x)$aL8q'i˩{C%jK X1ضB!3&ǡf"mE-/6fф K^rGW`((9**/^ >M6 S* !:Ě<5 FM*s"pG:Fx0xkR)Lj4Y1Fۯ2:We)aMvTLG dVZ^f;SX#D58\ŽD:(9Ͱ84Vx103|PPbG`lVţN:Q30AËu2x58u|vmϿmϿ?X~ﻂG/ˀnQ4[|~Ƅ{P2,H0NKڛ]b1g%uHChfCXUkuCuH@`dҚ  gx'h5L甧4wr+Rv㴳d6YIYbu솕iЋVFDN04ixإNVM6R:wK=LLRxUCT%mAZףH,kX΃UOAX ETɇumrSmR?K@ J* O&>jF).]u| 6_|Ua.~?_Xwx D B&&4@!)ɴJ5~V CU9ƨ&LQ#1B}.&1M[@ WTc+`Rۋu<.j )hm5$M`Ԁ!. ^-Win=Adfʑk>Sx+Y(Ƚ9A+#aۀc4'NKlY4XaUqjCJi: 3gaYkrUuH+,6S0JM{)A';QP3R\ #Ju3*3,@$q` #Z}BL59@64iF5_i&رa}DzZKZŪB6 M9 Q;2:hOhJ_kgl^++* ֎oc=,>mq"YXKZ0Juʾq 4}$6 Njz$f:1 2C@c##uk\~LZ7XkKpM:l-vaPh)Z8UJ jHmd>H +C#^:dk3q嬇 ARoBwQn"L5 K6mŸ5ޥ1[jiqDGy1Q-}y>}ߤҬ$7\Sa&!*6 "e"6iGcSkw>XUfc7'YpxqG६szEf܅Ja( UTEyd&#TS}1hh4)AOȈDJfM_9*q=rִIqm2U%;։jy `ez)h+~DjNZp4B$jv*'TjXZ*&o 4ҜRҴ3VLԁA )Y3P?jKLGԇm1;oJZ;&̧quՀa-L.1N8djl P9oOT[yN8Ml9/>_֞(2ØfC RzD#&n^0ݲWO΁>mV/aK5ד(k .0V^ ʄU%lV7B!fYXϛHæHkVzmczfIRxU?F5zu͡R6';i7e^5I%14|ßQKG jV-fPU`XLzQ%MNHE6{+0EpoIf/tOu#;Y|bi]Ye~e;2,N3UD%)&Mi2UsӤ>j+LOΣX‹V +FIF,i1Cm6KcF2T jD$I}Tq\ZIKJK/njo,2ui}nTXLOwO) ĵi(hJf^ɬ9Y<='z!jD:%Zd75kAQ]wڱ6 IDATƚ{9nt)V Ž. BקLTqذB ]ϧQUo@5pnC?M&m2{A_Z1[a8 V$4* eMz$ur\OIH쌒47THlIDШ}]|H~U5ŦHu D p(rQ8אj _Z%2"SHǐ tlQ Iȫ422ʢrdHm4}3jt&逜-]` +sLT֝ZMӡqfk=a=k]84͐97ǥL xM0YGr{tUKó>]۸#+Nsұ'5g#Tv1H8?֘,תi Ai7c8j?N*q л\64kw"u} DmTk_ y)g!DT`ΘμALwX2%L N /'ū y1~ayU迏RCH-lc> f&@jWӗc3e^g,:;C70^jZ3{Hic-_b+c EC;b52-D狛 f9mv0Q&^\;1orN-ꉀ;-."aLdd#;7OlkC_#lnʬ@6.z3BpEA؝pGo E8)guXVtg4˞y/W jO܁ (ǜ ڏA,J<R=MeU r9[nٕZމ~e0:q3Y$#* Gjn3\93 _$s B߉ &^ 3 ; 0'ow'oasm|<>34PQª" jM̨ur =pM a eݴKt;)Ƽmf"jkM造S6e(R~ɧPښ*/7LF_%ۦsbYH/&֣+#{+凕@o=-QPu YҠÝh"3X㐔$@:Je rM(6iU'c6vk:yq(\ x7鵛MZ !~ ) >\R4KJR{)\/{DN) | [{ &2ƦBA#P۠u@kzE)ج@-a.w+N̡'&yצVfef%N+qY*ҸS& $8цh>\\w~4qا#{<-cv[%b*-hBz|זXBW9{4)beءS.7i1 R:]{ߚC7R3 ]"r=>0ds?!8q0]}ōϾ/?xDxN3$n^S-vnM2"U8En$Cp/خYdgn>߫b qߦa`{2[ZC^gQ雰NjMPQz v&A'(&% 0MD =J{h Ii i2]6 594a~z,0i6: Q*fIPFciau _!DB^o/]ًO+~[x-Yf4z@;΁*`l`QEմ5L vFt`;n)bjK a&RVhX=רݕ/3jVC࿖HAq|0`5tB +c\r %/x`O}wҌnaF i>{؞ ^+ [s0abѸ@䧋ڼ AtVHvXw&nSj* @.ynvk@ov?O"BZ; 9;t d}t*<@BlN?OVg cuM3GrZݳxg8vB;%A8)Mr crU` 4 0m¾zڠ1J݅'R҂e_,&ܦe6gsS vkrB~dbğ[nYs!Msv$u/F&.އmn#Q_#Lg43f4R21 3+u9nM Y('1 &bl(@sk$NgƾHܟU)=7t *:A1ۧh]-[2!ya=߇ J6 WYz:mXc sUhyFo@YCٵyiLHO(QdNĥ>Z]+J1'QZ+Ibuc1WK*u_ kKgP7Jg 8v"f›$vN NGv;*GW~[|?yY%kLƴ.`ff4gFנ Sg31 [^e+Q2X.gpS117U 4ia-Qe%4UW)jbk+eVp2a?܁IQ0E7IO}) :n6yX8,Z1֎㑲n 0<6s$+~ @f>+?hĤP}輽x_0S)ww[{|LW /ųt FךLPJqz$ւQZbLV)&Wz]{nl'=Pq&.72:}L՚23gvLb2S2%s,T {88;MlslLۆ̴N!4(KJ{tkD4o@`jd0ReZUb{NZno%4_)p;/|ڻZ_k, cd +7o.?bRHb 6\=Zi3ť'V҃>[  ӃNRժ@kvfz'+ޅ/ N3v+{ +وKN7Vކh׭#ȉDz?wC|w1 ?oxV3:#斖6 }rC]7/S] m=;C= w2y2G71 rri׺T*L2mrszXۘsr0<~(yhf߫w,oy P:sQx ;4`e] O)&2lnǗ%BF'+ ^;໿Q9BXݩj[wQ` wo^Xz|/nZ9Ac9pfRhaV%GAlMIr6u2 ,J@AξYsF Һb塴FW5,2m͔ ^H3ybEJX!umc>ˋ;fx9t\ !/qsYqm__%J!ޓã@u6DޏFm K} fɉtE°CUjÏEާqtkZ*Hբ6UB%SB3|''lڋ_|m m>y11+3k3k{qkɬ3׊" Y,=,Zw?_tv%&>3H[6QˀO^ HgYJ uƷiWXlj :ƴ/d<"-_&IϏ L= MNӃ-"X y8vAؒQ\e.^W%`}|7+@[{aYTŹ|Iyg_ɭcl;HTK{ϡmf5>_|Ϝl1˜I ɴhю FkQ'L@+Iu=ȐQUOUe60@kM Z0[?XuchDAgO^A{j+{ .2VJk?7I SL*J uV R٩ln%R^ UjT*gh/_q /^-2:K3){%1< FuSb>cX%Ï#8@IE.WE+2ƷBʜ?=Y~kTH,_zCꐂRk eɰs3=1حLFWʓzAg5?-pxk}3fK>Hm,@c]S|:UzĚ?dF贼FavZeh2;pvر,˗B%m̘Ar2A+b#j{|uW/Mem+=d_< H:47p2Ǚ:7ՂZeEE"f=Uq+z݂?G?uzT 8cߵur€OO$H*O ޺o?QLj~0`໯ :fc{M<2NuޙlfS!i@ pCoL׭O#&<@>FDb|X=TG,^`s1Rl_(Q/qwJ[ sՄ 8 Qr@5zk>zڄWJ>U빊l.+UVb(;w_. Qh鏇 I gDj^p uւ ock;iCi3AeqDE8SXcePV*--y WPE\aq zMЯ]YӖqo?'.6ZZ K 8{~Wl=He~Ň˧~m arX1M3S8)^%n3l7Tϗ 7>?gOowꫩ3ɤƮɵ# IDATቶJ^R&NxSl0i} F> P!+HM"qXBq.v}3u*~ ৈ > r\o!\CN3%$``Vo^}˹vkA9ѺrwFW0֚ ;JmCnIiԣcP7FD>hCEc LŕHJQl^W Ӥ>{f|JRxW^uu2VS6K˲Niۤ:%a3i ;:eo7m 2@k# %4P쯩PHܫǘbr@ w;t>&8`|V6K>k_)ؚ]Nv;8t;2b+<:"V rw4zkY9ae)|b_F7_y@\yڛ~ycД +ـ]+ WeӲ3*lsOrϼx:64u#k'+8ȷ KGcC=3l20!v/ve⭰{l2󾆴!u'-mqk}5_Yl M.rz2Ҵ>n2+5 #+ā\(ز̥nX+Ѝ7K7vxWRil;gC,._^ݷN ).lAn\˶=ȑvJWJ M 6{.,͏#|ڍ~B"*3ַ"k`W^o3\+fҀX@36.Uxൽ` zDz:`Z (@N-LMUa?}> `G&6G]}hN^[Jdk`uGiX6? G(P1t)Uo[ [*gra}b8}:< -m@u3`;Q5PH i)UτbRqzT K@fBѱ*$f΃N` =0~rۃ8fi/~iªD!@a^<-;eth`|F/@}ksLjE}XDƓˊ1?9®T|O=N?>y/D=!wkL@-x>ۑCȯ<% %N \+WO‡zR6..i!EހYp/zZaL"?2n5Su:9 y#JT;uXq]t J!0ZH}i`P=R(&AB^k3/xt\bR(n(n,E孼aaOo |r=P?w^Ý 3l: ˰nPQV~BB%I,3wxr=FKi2l"ԇGooc93@Т:,XlS=N.v)XS>~a$.tK'$| : z>݌ ļrޥ4F)۷+G}O64t+kr)oh3ɪPA3p`U]}a Iz[9g u[aͮg.b7 6hD윲c.iBcx?׿ ^X>ۥc6dU`9E{x/=~12}ݰ{'uK@0v옪 F,,rtvTveCi8Igrm : ̇Zr{66m=k6͐ƪ,-#k%07ˆM<-$JɌS˾^O[5t.pg^8veJ;w|"߶"[{OJm^)lui*_F|8#$~\xGqE.q?WO\NhXoNmL \?B{X# `Y|{uu@]~ Z9vY] ,l:%˟+>N߃3# 8hV 5RVPY9ON՘;G  υ5֩/#9s?ht(N.Bw{+Vu8l:#h;hZq8*@ w?Z 7q6?m IYa6HNR=i{[%>䠉P%ϩo xZN[ =& ~`] Rogu) f6 7;7Nv ^SNC+$\Jgt=05$'#-;(XgYcM"ul:jRi;MKNr0?0h=eyK)/=KR0O>w?o- wnE|/a> &)]VS@)Y͘-U< ِ߯:; p>ĸ{.7! ŀkgk@=%D" 8UE`G4=~B/n_Q+^߃9sYD`96wWSm?% E*[|U 0 q=Z^“R0]fN>fQRNBH;Vf|tezU͏CicyQ5\fkKYYf~SMω!^Sƒ⳵'{e߹#4\eUw:)ɮAYQf zH`Hd1MP~D1a*Z/i?D>1oY=9X4zũA7ȗݒXd[=/v 3ra?1ٓNbLx?`@`}\K f_Z'e[Qh|:Q׹V^i/m-,: Ѱv)V }Th~dh4+&{ U TIh4O%k=p# ?xgz?"ٺR#miHଖ1E=fcdgσ Z{x*|E t0|eq; ד)٤e+2cvV:TR.mkY}o sH@W>|\J͛Ʉ0{r;vbU߱)j4/w]3j&/uӗ!!\Xj`5b]eFdZn&åz~? $ UX\ 9m:g%fC ?IT=ogF%ϖwYRXF8@ju# ݷe&Y\nG7+&4R6/2"¤~b8J% I_8_ K66 ptoi"#=٩$p=ʌAW%QATbNItBLN"tr85|I&.~sxw.[Ĩ,b.. v绵 >uRPԏ3(eLkM^|leU̔, #ە?Qkm.?kZA1}ƙu2!9a.ʹ8Xz]3eO3N=QP:ػNW6'zTFk%|ғax x3B/: ވlAeMf$:rs3(lOrXH ֞~ F3h|o=}: [N&VF1w" dqF3[%t_Uq"S WG{48h.`ȷ'&t1bo ` ֻeV&18#1HswX]^X{F; fZ2?pTZ͐o"K0 dװ%_a91AC}-y^O 25l P<_".O: ]ۍWNy\2 ?p  C1xY;awT~^l֎T@@_2/9_4ec~؃w*^1PZH 6u6d Ěc͹V%\fl݊}?!w&, Z^|I}2LxhXjgby=DGEU yULn!u=pKYJ7SEyi&j4 3@iOȯ8[dxuB!w5ږ EBNqr~2'`Q50𛑝H j;NL5U[[cVKj~~NĀu+v&]PnӖLm[Va˗fӠqEdd tݸ݋PuMJ|zEC0Iq.Bz$܊3]1;/w;C=$Q}@vL' WJ?4RxT.nb)iDHbZHZxev`Q7䂷Ǫ晗`>3[Ԍ ]8;0>VHف|aIqR̅I0fq_KrѤyLOzBl}monVRX%&. WcF 1l-d_g"MoD~8xkG1К~#a#v2(|a2*[IY^24I1ioήIyNS't K+< xh0 Y0U7.Ի VZMفuc21 bKe'"٭/ID@,͞@i[Uiw{`vXzӼuBS}.UC]gA="ug i,BmQ}9Е}yY jg1=zsYGTlNOLyPǐlzpr!VeuXHLf p+̻y2lGcLZ ;7G=0 3# :Rg+lh-7%N6nd_/H\5=H#XIz({" u* g'~Ƌͭw!@Ϻ&ܥ+2h"Y37Ϧ?aJ]u`6n!؟'` h6I_b%|6ǭޘ Ay;%c6e`nA5A,=Ϧ4ng$BWGdxUyU=8ImJ$n{{vmծ4ML9VFV o}>,-j]VJyXWV2gu3!cL_Ue2闯- /ŢhWj.t峸lbEeL}R0\ycv|{ࠕz'lZ ~lim<Ynv PX@°w (b4`PY yG\1P hm\ω10>ځ/_~M]nG[I20o*y;tiQ}gEGjb&%BiVs~c?U;Oʤ&BH/-HA+"|[k@l:7F ZqJۇT%v(KKO L:}"}@zH3}k: }x.)>oIyK|^+?{X p04t/r]ڳ?xg2QafB)"]h`au-B<\X˳_KvKXIVg;}R?<Ubk$Oe[$1ǁb&g̭Jh <όv3{5lo;o<`yfnAܦJ3**Ĩ>VjYxcs邾C]tՎjxww:Sj`DS1 g'L|PmB0x,ȍ\.p``"\vt|]L`-ݗnIb?D"zs@Lܔ DmsL ļ1m<7o^uqݖ[Q|ji.Tv#r(thSbll/r :+~@CФF8v ݱ3$/^W?KK{o$Y. ;] iQkU=β!OߌmBKw 玾^68 Yxuf SH30L#ZB) PW->S%IN`K0˚Fu ǞN3MQg}$6uo' ]%q)seay)"4~_X{i~ClONZyb&nrM,aZ,j[c8$'/V<1IōZ*m v3 |dnp;Zا^ P!!*cBCU}86v &_~,+,/^l)Oq2YRWm>gv.MSճǛ*eF.ZX9K Y\J~-TPƦaKV+qerIV{.GI_ս& xlA۴1a\ff򌝐#Büc̻#sƇ73~?_˄}MAx]_=xwo3={#1Ѯіmm y2cƮԲ犎FRW9:c;r)^~^k]'9^0pgJQeK̂!ʘ.Htvz Zr5L 6CxN\)s5-.>rar{䗃Q纝^`ׄ 0En;O9hwHezy)' })oh;ؓ%hrzQ-@ڎKUŽ[y|Z=FF\o=dckw#eƻ |uk_-?ޜ٧wwZbfcx1;ZzVo#[XlheOx>K)zHnGB$ xWjB `?zd^ #!s $f%ˑԆסVdl@_'*W65` )BRbҝ,(GRӬ%`d0]??m@i_&Dz(g_~5rm5Ol$^#z4iϴN( ƵlMDsn34y;hw[#ۭ/.2ⳌGg03||p2a0x73SeP ;pV* /h.aAiPc@Xggu!AiF~,+!SE\z <Ǻ([.ܳQlg`&Wt͛$s,ma= \ޞDyG]pek>&ca>pcdj oeSK4R]wqV0CDeܾRF'Do`}17mmn*;~fCZ='{"a*yy[|ހL\prv1qG7| ﶲl sJcqf^k3kf nwO;Gk쓀؄e^=Z!ZYrK|ugun##W@Kځ:  ƢVpNZe] Jܵ50&ۍ %ajީ7gu9ɑuH0{}p5_}rݎy eU'pQuYy6s#[Y#<W^z+/ϸGSGMfE nZpn'w7ᬸl >{='U0qG{ZGX8&#HUh =\K`=\e:s0cL9B0-`rHXܫ@Y%~8#ʉ{[^ٛ58ni==b ေֺ[]M:RY1'ɠ+q(lǜN OZvc:FXvgԸSò_ejI:^k)jƄ{9KHnͳ^5 l~ \7,W x̳NT8!^ O ¶V 3t{z XV]~|!P 6`N}'vכ] |:in|+ߤ>|/Q2=O?3餖&:мچhf7xC( 1&ZPZ*gŒ+ZK+Һz?+x4t]5=5Y8rxyYS.h˖P~q鶻|듫 5BP 63s%j33Z<ю vhm([oy۶9x;tж`wy&ڵ3[;oGڗ~7D 1O&.1Np#nT@6G#":cIT6wh hmif0euW/eB#**1-^*[>)`j?K= {J9~BqkGٗ=XXU`<}USu8cu7IxUKo~x?:w<֛M4cv>a:hݮm`D*+T uThEɞqgBUx?㩋??z[/Ur*Lъ[,G(3q!1zv 1ZCCDDg6vg36m3xKN&ڵ Z;o{vOo޿Ϗ)Wk^}+K=󧌛7Z Ў}*ڎYja44n'TPS-eʬ{쨠0[Ԉ"McGk+y?D`hSI۽yx}eY-L{Ugi酃I:fRb'=k%2;ԇ ˢ@!ff1AN'm\yfZ`ږnQ{nSݻ%_{-+) W1u~p 7woʵ̏p}sM~CF g|2Om63:]2jIDATMuku[͖sjF\U]S;={ ܹ~*'.'$tL!JcJ@8ܛw*=Vsv.ɶ];}tv4rf gF' f<%X "A @FdI]gѺ[e1PRg֭3P:p$3 C`>8ռ7,tU3o>JɷO;ieVaY(מ0j@\s=oA=~Tp r1T(K,#&.5\ |=X A4R/S䲛rOl7W7e7[*5*\d^|rZezdtKad@L5'C, 4_(WRDFD~ Ы4TvU_)i>@(1%mg-֘zw/_x)f [xi#/| K=ޞ㸣}n%?0BnFsb3 T,S<sPLUbBp&Ups&ӠCmݭ$.LZK zXs|9Vt,u:\^:/t00s;*A)f0oX`fD,58SQT xCj/yTO;{۵Gh_w.PhkxC:oړ}ƤY?JFJB,Gy7оCq.PLRAB /dX ILⅵO&1qo7*c⺞Rrcf+K `BRE:\'FՍ rDHF ,0¡aYfFX!t@f5'PT]hTj*ED?؄PmtvNVLU"3YK4u@?˛I*{Bk/nPT\5*HWNT#M  3! Y(A,+Bp!|+aIwx 0gl7kTMa=oH0{t QdC2強`>++YffN,5 8=I@^a~=X~iur8Y%<]웧gH0"=j-þʞK]tG_KNjۋ`(]"XR02pdze4JPL?I7Knvgm/*.*r3ݱN_6p􁒏gXAũfYj fibUR,Z-4ۃzF8ݷfmEdd=Cl#oY=>dJ d5NwdxYI:)U^vwcKw8p(N%ҫ$CezBC/jwm@6Pِ^.4,.KqY݆Mש2zNoSР̬X4JE3eSexR1ňce84*X6unrn/Bh+y9q$M^hq~<++q/5YI݃N {`(`xsa?(wE8S6JM[*ZJE+XyhJv~`TόQo}{2ak'"PvkLC%RW>Q<v/pٺG^Kx[lV{=\d\ړدO<ǏnNrQdrLP9'1`:ވ)Ż/}_g$VeO3|< ϓ7R[%ǤhQN1'ܓ{&߅ |>z~|3c?$ \/ Z[m!^`RK~213,SC =IȳA FY6Ms.ձf~Hv"8SBg6fe@eS*ɏSTv>7k!MQz?f0@$5:L%{jNk.{Vxv; w 5MVlo,,FHĭo ~H,LLg&' vһx?+[Mc>9ZWׇ=g=a_t5 y"@6ŋ 0~3ݩRy (^U˻|ᆌ5K,H$3Wd&fD@&1WD[?o\d ( lz5==wysx`XS vh,b/}4MJF ?(0sIENDB`variety-0.8.13/data/media/variety-indicator-dark.svg000066400000000000000000000130551475753071700223770ustar00rootroot00000000000000 image/svg+xml variety-0.8.13/data/media/variety-indicator-num1.png000066400000000000000000000016351475753071700223240ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs٘tEXtSoftwarewww.inkscape.org<IDAT8_H[W?DCjh;JؓLleЗH_&c }^*)}qcoҴnbXmIs7{f;ΏG|~c g%:4+ tPW&|(PVånGjQǪ+U*Y3>' %[IJ)֮*&E#DM> @A}/*4@+nAyA\{^LL%3:|^ / Υ}'GN%\+G(O v?sV3#GRȪAmۂ %Gv6$ X<"MmֆYia rm|PkâZ\nR)l۹ѐm~[tSLOQx}.|zGilʙD)ٻsj =Yʔm3:f^Lsk~֑R]>7{"Ljܵ{套9|붃`y^,&L2pdwO{ޞ^z|CXmsi"݅vzX]weŶ֮P(ZV2'J !FGPL& ?>w;R,Djjj\_o].::rG~=Ohg;:vwuS_@ PG,3r]X gT.U2\a! @R!"ݩ73[%IENDB`variety-0.8.13/data/media/variety-indicator-num1.svg000066400000000000000000000063601475753071700223370ustar00rootroot00000000000000 image/svg+xml 1 variety-0.8.13/data/media/variety-indicator-num2.png000066400000000000000000000020341475753071700223170ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs٘tEXtSoftwarewww.inkscape.org<IDAT8_h[UǿMmmR${D+0vPJKчU`/bꃊl-FºVn>m3],n!Y2mrs9wsZHs~^gS 0zUB3'yu0e6oT޴ s-ϾA~l41XXԸ{G~ 8Do(a@rnDV?/|2a4T?H$eQ(z{\x1 >?/g|)y&E)aum.!,Ce܋0$/v} Oyۃqx<p+X"&0NSiG̠Cq}Zy^ϗ͸4u|XOoT24d6B`.SGVQq-Ww%EA$-(NEP(H|\}OP]<ۋM!:ZB]%ܺS|fe0;SZC<yKM>฽?]&ť.Tg>[SJ0\[`LisVy]VP RSSʖx{k3rEvvG-Snk0c_…pjddx*MZ6AաJ[[&994?Ԯ( CcBB0\h~T*sb.uҙC]gGO>{~TfA'Oξϰw CBWW'j<$CVS !<22Zi333&co a ! qi`IENDB`variety-0.8.13/data/media/variety-indicator-num2.svg000066400000000000000000000064401475753071700223370ustar00rootroot00000000000000 image/svg+xml 2 variety-0.8.13/data/media/variety-indicator-num3.png000066400000000000000000000021131475753071700223160ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs٘tEXtSoftwarewww.inkscape.org<IDAT8ML\Us 3 ?)RjiM`0h7M4&&j4čMcLpa MhB:m0T֪V4 u;ýE $}W~}swshtb Ӈ5KƅFl}*[^<^oΔSH$'smGvW=Jԏg/`RDcڏSW/k5$P!.Ժ#MBI*-){_Lݏ/]l`H48 @,h{tʺƆVON!huu8ց͖ܝ|kXY'/Mev[˳x=H)yΘÑ5SYQfbFʬBwﲹԍGP/utf !p:=)ei>8دc;RJQZRk&'7\&^jz^NJK0MqFFwD".**H:;:yp:LNOed[I ~bfZ0 <<ʦ Ühȯ xO|p.j?^0 ̱@mM-9֜ JX[+O5X\`.-(=3u):'yή^7& 0M[tooβr廁3j..66T67ZinQ\T&''sap~B0x_Ӵ7'&Ewkw_ .(/u\ݴΰpR~333yJ˲n[Oh5t4UgmgzNah_VUT֑&/ABOY ܙEO$BBy+]^ka[):p(\R !@w‰IENDB`variety-0.8.13/data/media/variety-indicator-num3.svg000066400000000000000000000063601475753071700223410ustar00rootroot00000000000000 image/svg+xml 3 variety-0.8.13/data/media/variety-indicator-num4.png000066400000000000000000000017611475753071700223270ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs٘tEXtSoftwarewww.inkscape.org<nIDAT8]L[e9@ ]lƄHn0],jLv ј1cLFo$,F^q6dW(cV:(P(==nm <{󞼏VWN)Q؇ R ۼ/BbBf(Nmmk1 u n̗Rյ@um׶^R 5( frM(#/_u?nM|[`#URMx~&]Go~+)( UJqm*x,WY˥5[~iBěS7 rm˩TRLLNTѹS06]MJX,͚ ]FJ'Z; !p9\5MӜ7&Y.ކAd-/Ռfy#4U~dc\.@Aj=V6,F3A:. 0MȢ}a{k9A3 {uVkQwPJ:3n!ߴYzyvGw:x=#e"3Re >_ͭJoe1Koo`G1 FY`hhdoor(آm66`&W<u]grrj5;*~D^mrݥ6^u,Bh}}A`Pݿb*:XF? DH_pqj/zm75onjƒ !L8&pLB|+}(zzzw+:"J@qDQ~ZykIENDB`variety-0.8.13/data/media/variety-indicator-num4.svg000066400000000000000000000064221475753071700223410ustar00rootroot00000000000000 image/svg+xml 4 variety-0.8.13/data/media/variety-indicator.png000066400000000000000000000012561475753071700214450ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsϐtEXtSoftwarewww.inkscape.org<+IDAT8KhQsg&*5$X_ .T Etj 6!-+pa7JEWҕEP|&͘43s]$*_s8;.+!"UpDeGp? Dd^8P~^ݼsv",2?ݿ{E(xzzAp^'> 9t]dMnn6+tz1F'U1&$62b(4x`cKwoObșH&gƂK1YΎF"N0fp媊Y8Jzގ}u[;:CSÃ]~Nk: +b$IENDB`variety-0.8.13/data/media/variety-indicator.svg000066400000000000000000000067531475753071700214670ustar00rootroot00000000000000 image/svg+xml variety-0.8.13/data/media/variety-small.svg000066400000000000000000000047111475753071700206130ustar00rootroot00000000000000 image/svg+xml variety-0.8.13/data/media/variety-very-small.svg000066400000000000000000000051421475753071700215750ustar00rootroot00000000000000 image/svg+xml variety-0.8.13/data/media/variety.svg000066400000000000000000000073311475753071700175060ustar00rootroot00000000000000 image/svg+xml variety-0.8.13/data/media/variety128.png000066400000000000000000000045351475753071700177310ustar00rootroot00000000000000PNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxlUW?Ua2c87q4R5f&3[ܜ6Ef-l1SbHlc%$HQXzk_?V}s_$'i}sϹs{LSA-F1h@sc#49F1h@scМl$l0QB%༔2<᭥)`pW47&_,)Ua*f ! j"g!{8|]JHT.b"$lKw0lJ)k} (Qb$8,4c4COO^z{ aY퓵fa$MxZJr(.r㋅MsF{%M;pYOw+?+ ,[9e+eIkaAN k||(b">{svNZaɫ/NzuC\ݘǷ35̤0{4T>l˾ZC{ػCG=4 9{l߯oq`~΅ڄ(G.X̝oq? ogWcN9 xavӍMԜJ)XV<6{? 9'o&vn8h'@/-!a`YPq?hWz ?)ط׹?,^|'ׯvzx vvn"t5FKCg0Rq˛ilpB)a.XW'MTWz3^Tr0&D ;y3"Yʱ*ljj}f-κ^SU =#Anb lM==tO7@ooCbDsd/~חpߏJXMtu s6=tǞw)x'`9_)J)[>ppQcWC@18,/._R&CIoEwp7M2sɒ\HCDk24i !D>y`1P0Z`RP RN&ͤpъލ%!H)b2/49F1h@sc#49F1h@sc#4gRS2kr4=3kA1 ( $ R͖]A-F1h@sc#49AbPBIENDB`variety-0.8.13/data/media/variety14.png000066400000000000000000000013521475753071700176350ustar00rootroot00000000000000PNG  IHDR(sRGBPLTE%!$$'##$$$&$$$$$$$$$#%%y}##)IK &$$#%{$ &#$$##*CD)'%$$$$$"'kp! .LM%&%$$##$,-/#$ _b%&(*&=@0 @@TVY\120,+$&%$##~"~!}!}!|!z"z~"ZV%0 pHYs  tIME 'eL(tEXtCommentCreated with GIMPWIDATc``dbFV6`ED\ I)iY9yWAQIYAUMc70426153awptrvqusa  aOHLҳaHNIMK a/(,*.)-+dohljnimk:'IENDB`variety-0.8.13/data/media/variety16.png000066400000000000000000000007421475753071700176410ustar00rootroot00000000000000PNG  IHDRh6sRGB pHYs  tIME !tEXtCommentCreated with GIMPWOIDAT(ύJAgv7yK;kA,F0L%b0 *PBH Qٱ\,bc#-`gmƬD FQ  ILl fEWߧ JA?Pl IENDB`variety-0.8.13/data/media/variety16a.png000066400000000000000000000010221475753071700177720ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs$$t<tEXtSoftwarewww.inkscape.org<IDAT8MK[Q|Tk4JZ!"B)t[/pEwn\(tQBWAD]ibF 5+er3.norb33;3U1"5'd,`ﲑ_fePIn钇X%}\>5A޾{ʋQSNݝrS%efφh~n~JEn1<7d3'՞/+"QC,-NvfGדO#9p.VK^PU@pMPQd`ڌF+Z+;hחTeu7VKN?ොv4eBmuyE$|Wգz; tʆ& M|IENDB`variety-0.8.13/data/media/variety24.png000066400000000000000000000010621475753071700176340ustar00rootroot00000000000000PNG  IHDRw=sBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<IDATHKSa?϶ ԁgV?Ƽ  J$1 DQ#’.h[AggsG=$9N4o/}'BǪ~bm -GQUbT{q4 ieԷWI=MpCX@@) !QAPܿkNNӨ{ ޼fi=lq'ȵV.]>]N1u]tǭ?w){4t&Ig|f\I¡2h'mWՃ2~'&2tu7yi}q|X Z)x |UE̸Qm !I&:V_: ?Y$"ZZ7St:s9o\U7 ~IENDB`variety-0.8.13/data/media/variety256.png000066400000000000000000000112441475753071700177260ustar00rootroot00000000000000PNG  IHDR\rfsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<!IDATx{tUK.KTPeNK3NGY^-:/x]:#(JEт D =!s$6D${>\9{_>>Zi"S8L 0"S8L 0"S8L 0"S8L 0"S8L 0"S8L 0"S8L 0" cG(mQ(uցظw@~nL$W?ZkW-1'7L~+Oya ؊H&[17c2R1' )[tLnO SƘӁ)Yl}?+KIc%29JLkmQ+JmO[YpyL:7\}^Z6mlfff>XI\Ο< s+/|mmµMm"'g' ̂23E瞩ZCKK+Ya2|8py795]F)Wq4Hj)bX֬jdͪF!Ùt^tJ)*;Wu'瓏ofreù|]_"-: hoѿ/e:¬\=e/onĺuTw)-i羻/yos/,0kg+X> ;,]ƹmmW*VR8`8GޗHIJdqSZĪKt(B%=GMui.ya'*}~~y^Y5 OH @}oٵ*_cOXr ΩּGuo@R `滓rEl/۶wHģU~RY@-_"=,# \w^v9 ij`~eޢv~{6+ Y: ߟ"SOTsei DƒEgm7S7}O!a-LVA$~ib6w)(BB58Ny>̯Iq@u0^e8ZXT w^V\=-1+u@k[+)tF6aes GzPS1r{JeGxt m[Z F˪⪽)\՜P[o. Y`b_XyM<`%-- |MY"=e[o. `˫nj1~R2$N}fT-PZMח0wNU`햻(A=t|i=o `w`bS/._Hw9Wc.IG3UPZˆ]smeu]ox^yjnrϝ崷GХp]?R§kK>ocJː$}5PWmUZk˦n46FDn҆FvХ~;oǾX -4X]KK7Wii]66.b֌J*+J[Mo˗c,'\"<\IUU8{tV>h@ܾnY~fWQSA`-̜^K/;. TХ-S9Ui5udKmaW]*S[Eu,Y\DŽ|Y1~Wֻh+1@$+:. 763,a\xQ>C}n d]]Iq;sTԼjsNeY9rHo554Dvo9nhKw @V˚UYՈ1p‰)KY9C4@M>\H \Zر[yO5 ĸ\ &P0>wP_ǫumò7yXS0>Oc8,23/<_˫Y 6vƮh##0LFf1ٌc9,{٩l{[Xvs72IHShO;E{YiHU!cmlA$AL8&c  0ò"22L JU 3   _a"P8L 08,@:q@aqz"S8L , P"(=oJ1qR.ƞk-Xlzv5_uw{+GWut}G{snu>|ۺlxux`=UZ=k{ Rt{F%H}]8Z_̆ FkĝAM`qGדwb?ؑ7GfHxji^c(/ӷފx`ۉMv5J`IKċNm~hhz܌_A}@x?XWaC7#URW)@m;(kV5zeMeF֬Jk 664e[άt@7--Qfͨdڽ.ZomrcJto|3_:N̡#3<8"~hmR]aVTOyA־eA`YLIzk9^N6NrkSڀqڏ wHf"4~H`g'"IkmR&ƘФW&"Xk=Mu!B.S>S3pq*? Zuʯ7)n]#QbmjlgKbc'Dܰj]+0d?%O IZ)YkmS߯cCƌ 6Fp:p$0 {& ."6=A& xXmXH1`@vnavn"S8L 0"S8L 0"S8L 0"S8L 0"S8L 0"S8L 0"S8L 0"S8L 0"S8L L HƘ)Z]~F'cRRkm]ZZw c&gע$Q lVsK WcNg]`v߅1LFg:tR1T= Z_㬵]Hc2'QwA6d>w Z"dS\w2Qt=(0ƌ"uH8s;i`ߵȀ[k;.O:] m7~PtydiS1a~"v߅M=szc^.W[k"B=.txDK.$H1,q4kZP| cHbO:p4SlZk.&""S8L 0"S8L 0"S8L 0"S8L 0"S8Ns~p{ϻw=#FjC7oaGD.sΩjz,A#nE>WT/瓧X{y`⡡Pik TFjkMVC6`bG\%_! N}BE{˛TJx!D8A:zj.#1 2 N DNw.)*ނ#%R)ٓ8C=0{n*pND"gkLpwB3gn23kOi}4r3_E x7=3 ݎL{+ڞx<(!2|7 h>XCmёXR`ѹ"•*q&."pH ?9T Yg>{OqѿqMRsr.$^Lr1b5W&$DglGiU}Գ8i߁-/`Y4 "/4YL 5;c'Ip؁f9c'hα) u p{S8"IENDB`variety-0.8.13/data/media/variety48.png000066400000000000000000000020521475753071700176420ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<IDATh_hSW?YjZ󠥊"CܨPMe^&:e(CE)3p2cÐY j6XԴMnko 7͹M{~~Wj.dJ2b"TDr gY [YݨR!^x&}$"+9Jvz i f>_1tZb^N|cc Ct)TD@*eOqm;wI&͒l*"B?%ٹnQgNJx3_'G<7Q~\zˎw'/mqe(_Of59s*/p&|%kcZ"prQ(iWQVnm~|u8irsOMNLk#{ГAO_Տ׫x1.kr8yމ C/\ >_q5qzk]BK*51EOb;2IĔ\{{CL$ߛ8T3r aKme#V7:Ȅ|0 0EdȺ*T; W,E#sJ6`F'mVhj]p9]n uF]@4Z,4I&RS[cECR ՔtuY'EdzߴJEDDZu LC@_= X&:UF 1AVIENDB`variety-0.8.13/data/media/variety64.png000066400000000000000000000024011475753071700176360ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<~IDATxmL[UG0+a3J,%h13.ƘqY>mLԩ,lYe'c"ً Lf)h?@-kIϹys9JDg\nM@7 &y/@jF:`]d "2UD`;$Kxї }M+txUt&*.wm52~;H ""ȍPâ蘒B2SXh["_鑿4|Qt3 YA.WnoQhoufA/}mnbn.=ͮQz"H.*&]!?tVEK-|PȺ߇{ԦhΜYޯ/d pP6/́'-k%q7%͞"&O7Տa߄& E$'Ϥl:ݱp .4Bpyw~3o|Ɵ: qօ@}!e{\t!p){>s{T9{.ө s=^_p| |0΅U.pTZȲB ,b>,~i}.q|v.70|zIC<,3s'w4'bml^]ZƢl&@DWT=(UdF&K0>S%b 6";,Xtʡnjsގ;}o}pg@ xS/d{% )Bζ'`f=~ֵ_kmoGFިm-t͹ BHUےLΔ(* L4vG봓̙l4|.ZBHNn o| Ylo.'ԁcw~ 95A>`aiPϺ̧^vu(5qI{Òu)5r}D6+o8$*xy!MF ϰJ)$%:+eۏ𶏯"6GlWlcXH۠G.-j7\%c ?xP π+YmfYp_|}}`mM-NJ$?kok"R(=I %v&eTP@ĉ1Crûɦ$qqF&KPy!o7}|J;pZ9kYxy Pi%7\4M<2=g۾|}w9\ T R/E9Ṡ rDXsKsvkVM= E#SC!)xx,J&"% ( ;[ IadHcbX]w8GFY9E)-ٻ۠qz:xݲUWwd{{{k'ȯN"}Xó~𬞧^y_糮'YYnjnOx45:0, GdLLT~Kh#2KZ+!-hirT݀P *(DȈ)96QD(A%)|̎CeNJײ?x#c3]Rр7}.F ׾qE־߽_3;^ެ::B qᬻ|茇XA:Ǐ> od2)X2BKa$c %\dSXq/VhNظָdxBDn(+ }#1~;)MʊR"\MtWC8OFwat9Kw)9RW&%/?^ZCĢv핟y5g׍ɖ5uFg4/%k]YGo?j_,n&h )XֹEH7GA̰qUU-IJ$}6u@T`dP45 s k!R27%cUsZ[/cyc;,+SNX^R6959}v巳|J!ˁ Pa:DJXl}|ޯ'fs;^>'N{Yg,> `4Mny+_-1Bg**\\BaqVqa&mY Ktlʲ+;'X0\ԌJ\˒|gD"4"L>{\tp׽jM[|7f~] 7Rt-+H g0e)j2x恡5R4,Lӌκw>;zSflk:Yp_DОys}Jv.䢦>"߂R LӔY4"|<6M4*HՔdX懏MCؼ*Q(U9zHgÓ@2pC'31V Hqă,:FaCv3#6RޏFO 3=$^ ӼVs  ;Rvl1 Uôp($cƿ?Oo'NϮE -(1{D|-FPc8f#x DL*M3US#&Ucrҥ&} -98ё<'=X⢵LL>Z#|J ш}HӁ@5VtP~x߾%_y99ۃ9Yp_DqiI3<,jf[9wojZ!$RCbKOb~Gv" A$fwL\?$50Di!XXۖc6m #cz \/tO2x24U8V(LovfjD0B_HDir27 C(~2с2`;Z)v"T%ܪ-CypocsS o)/4:s?_ve_`O?Es;;u'8Ksts_o ZkL;e5IʗA2d崷ϗ]?({~| Do H$u&hZI3 "NP`IAl(W%ŷVej&I%ROsS,JkR0$T0 CM4)nȖ/‹.f衇ݶ!-$ӄ_<'= /^g/6آ|׬`+ͭ=fZ~ k/}R*U7%˙$ɰb2>~=at=pܕA @#8KZ׍ѹR5Jy)ONUD,Bv]S$o|5m|}M&]efi{#v墌VkYt1A_^ ]Ze۽-5%ڴ;VOݞe ȄSQa̓ǘΞp&iie:%~:5qecC_gp޺5W&*Çv#TClt1G+}O^Wi9w_Vq5-PZm"0@ahEc7DwW;놺hO/Ws"kJ̺v6 i pJwZbN=-i266ͺ[ο~sFGɑ~|.Y 6l\϶mw$Hc,_%ltZh Fk⸫km~C 3g'A`-O1IGofWm!4"LWt+cHC |%P;,jp(m,nCk#JaJIиH%B 4CRJ >Gu?kLE}wjgmAp~~Nkhgi>xف';.H-{xx⍛Q#'vn=3'^Mkk+!wjS>υ}w{lܰ8p(!9b%o9+_{"L{4&1W-P>Q})NeJPKE.،YejZ Aܱ 0Q($Oqop+Vp'Zsla)n|+p.eպ3RBhh&^2ltf4*"tic8\jSS)YZԤ15MLS*lZݎ[qh^;^0tńPMFF-!ɳ"''#B!h)I`%B7;@35F(U!r&ECchT]`Gf{}g<*ssg_wj xI|ZB;K;wƎs;~C"o.C a qͅ?+{kYHJxܽH];w 3|_5Iz_\yV =*=ByRbl ŝ;(n-:y&FԆ P۔[d\$d:JGs^q%҄0F d)C|u˛DQLGДP5yLA4!xHT3?٢QqRKcdyur~π{//:_jy}B΅vdxO;h_[ꪫ>/eUeq'+^K[t|Lqk.]B$!ސ?@[u!B$"BVv;l?P֍^ 44 іCrul;w/m#WLdzp]?װ;a}7Wg(W}fKK2~)DVj"FXA?c %X=2֨em켯_0 UIS,k۸򪗑K%ؼMm:5z[,Z`8)d$WDQda2!DS6ɴb}MCT(H*Rգ- -D{ɔ8RհJ|'ʤ "'wԉ8h>Pz;~Nz3Vо1ٓ,>{;bv1o}+f,B_zHō UhvoC֑xΡ͍no+kf^|#x+%'SA=yQy:KML(4CT_3l|dԄE)P(_ kxd2,[M}1qma(Ez7 '[6RQRfx+G5Ҁ"CV#&j(l6mP)3yLp\*CXƼ?8^BC ̉{7΅vl"9us5;2=Ma@ٙfuO+hgT}ٓxVu6_C;v3r^ۉ?:lѻ"7a`h]a,0!Z#ݻӿ}E.e<Hx:Ox_)˺6P~㼕ԆRv =TڿɩG1l5MY'* N RX5^dAAloc2!"&dA( KiDdT35SekVkLZ!M$*PqB!Iqh hT\A堢qA~FH lH]mnCsk,Ͼn8W {-R.>}Ng|@;K3sO' kW-_;;*J֜#D"*CYݾq7qt(Qhp#xA+ְmo9p(g?K|Nl6>1o0OpE cE&b+ a *^4 4&jBk͚KҸ"ug?ceDrT`W \7M~Ơf1p  E*\Գْn$>Q|e2^ 0З5U ö"zɱie۴,VY|?~m '`9;41MP깆8_ضRZG'\.vwwyjj3f5}:D/󺺺6Dќ8۶BӲ, àVZmxzHCs3#pRts N,(b[wgYduzwIH-'*ҴHl򁤵M}[پ n}BPҔǺ,@+@wRhQZ o`ٲe|>iXmHrIhL%iM444U eh &0W4$eAZ25[\nխDҔ$1(iR\SESJe4RB!!BZZ:xCwK)_4 L˪aG]??b$S IDAT>'ϷkȆ\ԭ/56MO؉=|* 4+Wr12QMo S//XV&Jα{=]9ڈtu}Ny+^d|p <F6R8`X$ID TH iwh6A.`thk_7n ӒuX4E$`[&41 SZ!ZJRh] FFYzIhibҒ\\1Y1(\1yfY;L%#37hLMuГ1͗~U'>a D"dR(Úcxb O)r$MR֨j)ʄ⋷O}4qX}ѡ΅vv_w7 Si  !YePf^PZM2gP8 3Ӹn˖h-F,GJeJRPX"4PHS +MPB0}HS2U iJZY|E 9̀6XF4UXDmE Xڢ C!E4q,M2 A(pR) $l:NoO'- O.ಭ#ۉDy6_Қ};%%)*l'y <#@ZX5L!H^ XZ8kty r> |(wQX2J4 KWJ Ȼ:(~gōSOg<نpO7hrH7Жԇ[8>Rc*_J44APVZ(ȡir H\jrE/1,X"E՝&p݆c ɤ88p pCg|Ra7X>( ӒjޕK3 K!5d2EbjbbEj0/dC8RoU+ V$1AB&28M }߭`'qdžȆhK(YF$;inѽc$q\xfB)<޾ WXM^oGw6n] L(Eŭ#M:]Mr&x>r WB#eD$4mN̘bX\&pgC4o{ϪzNhޥaO>\7fVA@[ 4HЪHFwCtp7N9燏UGYuN+jHkg=S>NԡaM= -D,^z|Kn2h9NsKv%KVrP: 86+Z8f@W jr.֦ vkhL=B4Ķ%]͠B.AZ>4980^!8Aє"|*lgrYz5R~=QmŎ&M22\P(;6ERpP BXnzR 47W-Wznj8U""VHjbjfZU33XF-4D\ ! MX\et57t27={/ 5\T"|" Þ 7J=Y9.4!zXiSiM_FH$AA2o 6 j>f}{ѡP E_\f| ZF l*eEPRŽLms4.IFGơY,ڻ}k"]n2>L lR8/o5X\\Y]sVttrOnݺ+F'rA $S!, Rz LP!FP<ږCC ˖"dÖv$Ds8$\7 ȩ%kE;ȯuIgIcS']Z1csɱ->RԇLf"(!5 3_ӐI2%b3|\G{Qi8D.α|H cҤ'v%ͦhwM%T!64)L0 iaY00 ) G <21LixxT\WUd7,[%1we4ٲT2490b54ؚ/ BS\Ͳs.6;]vow,U/5},9k4rM%CJ)/CVj".дGN$syh?_pS)-9c%ŊǾ)ػJ iK~03e~튷KLKC+w@O#4Q6ɸMĖH345/aϮ4}&!G+7fpջO&1KiĢ6XZʐDh0#(e!edW% x86gޡ^c%fUH!!A aiH"Q, LC}5TZٌ ab Q00BQP(Mb%h2R<#]N(ёLO hzLB)#fLM)7B%2.k#N^@a St'l+k\w^UB>`X'DBz۴IM!BX18k\ $($#Uw~6N2cc ɤEa:$n戠wxF88BgK!ˤ8š59cz 3NٷHv >N@P'LFҖѴ79D"!Q;µWm3{%{,r ? "Ua%C"ioibv )$S|}`&( 1a?%kb1ݹ@ Vh$ 0CYzPPkRBw\sq;c 2BV \MJ@F'`څ#I)'-v7%لOĐl'\QP-IzrT e5K R E2`HҖ4Pu쥱Ų,<`v3-$SӸʠZn檋Y8! k8fv(Ki?|* @ B Q{>(AQR=dKF'V+7VlT*,Vn@!LHb^|D"*lh( XczP1(GXerjP0ĐJhm 4P@!Df֠BxG|KWE<&\\W33:E:3\CyӀ}Ul;**/+2&'BQIڒD3H 4!B1s+yl;@BυV^ٰ He— 0ԸFBBԇL .!k##Q&P2琢ni@Q hBGJtV7<ɓGL}O2Ԩ&50,1BZo69_ TV5ġ\01U#Dsl4$ %5Wu91 bȥ>}fݏkd;jXYDP50$TI0EOsKj*tB%,[avG*djlP+ҠXcQڽt*M\4뿳nV(c/{o-uy>Cթ ݫY$$ttH:, Mn@@a! !CbǎǓٲ5ҕ<Խ3?ʑe;v?uV[ҹw}:DG6$0*v^W՟p\(4ٮzuJb`8O16RZ8N -i4 +MC E)8"٘NPhD'NV # (]a6ZtJ#S^&;rjk%zQE߳k dYVS?CRmҵwKGt#[E" dG8nM 4WTcLjGiB%c W[M0vZsf(PخK>7 ǡVo&Y^.K`YF նޡ 4$TJUFsM2$l6ʥ Ҳ={7Z ˒ضrVǶ HiVDRb!5Qch,]iF#ٴPXY&Gww7[~T9AZAix3zdY$kKV1,[p-?#_ /$\}kBͻly|e|'⺮4W3r9*+~nHTU xi8C.REѷw1l6_yxGTzg_;Z/7ӾQ^HrD~ ! vc{GP<r0rسDzII3o)Ok;62ԗ|{l>G;w}NV܅ٹ.tVcQTA$1X l֤,\r"÷ʬ~|Oj Eg`tl>i5;B}֣-z~SE*_?gC_;?v^_=!|AH0*qj_?n ˻ndn(1£ /OY~?KC)Ii9d߰\IbԐ F㽚ŠOۀi^ھ%-^hz=~f'\ҔYAJbRM"Y^4ԚsY s)f*yЪ[nK u̖wP!eGbrXhBq d%E9UWbҩiY0'u~BICnpo[PT˂{~zWQVLI%dӴuuf1Z`!Hy HaSx؎M p,堃&$kتh$2[oi',u2gvulO} 86=i6m颿=YΜ7l%t"$|l7qqH.fJ&_~1QUE@D&eTHٖTɺ`˶>R%N=V4FM=y;%C .wnM₦4tjd-sk6^|D~Џ3%6q M$l8M*'-C.T!%H)lg9zӫWsfol,έrwQT8 FB!F #@-.}2:gI&pVHD9p- rsw:c X߇Ե8AK3xJl-^ m!m4iYX%_z/AZ N"ptHUJ)⺝3؅b)*~H=6;׎r6?1D+ĄTLҵY-XX0\Gq#'ɤ\}F_Y2h&i֍ kI:FkC&ߎV!v:E4SG9++<'k8~zLcWFyp eέ#iHgXz`23eo,N^xnɉ9>~1vI{jHRg!WsxGW2:~.OpHwFs-FcPeAt}{g/PB걦~;7{KsokreVD>RۉQ2kmsfCGh1$lB#0xo;GY.qnn9M#yv_s^&$KMch#1BzބaVAo"A3dXL*Ohʧy#{?/xSOQrs_{.\=˿dUJ>rHuGuV$RM B G⾿Q:=[;NnjAm!-Pް3*:.-A Iq{+<+fEY'\jK:0qrB*F(l"&w#4.`IA"IjAGx &ʸL8]ܼs?vxa:&ihaLRt@W8_`}2CC9vCG_7v$(c%mM14*dB1&QU 8tYI[ ]9}>@i RskkDz ϐ|NGgNybY>M>mёMlA`4Ӣ-*|~Hi f.hNh̯ƻ"Yf~IOG,X^4 l;OT8vr-_7%kٔ(l'VMRV&CMClY*(fqCIww^kVq/ɩOSHsU5Xm.r3?WV&7~N`aZ1R7q }Q%ұޭmX\l9U6ܷ۟%wpkcGvp|S)2Sٗlܚls` UCq/8zFAttШN*3ȅBJ9dh\:z&EKMS$.JTk3}',f]*M7Ń\EXQHgbkԿn8r)pC[7[ n[2-߉+sd9wOggtg< e~ ֠r2K3iBZG6n"AIg$9!\V Uf LRS-k3_>'͵;'qO15;rvfEIoG;0yjpM۹1:oKjnaTB@n%h0Hk*ct/8gPtv n4dz =98YtߐWOHL,x/w-/%eMba'}j L'- J5@)C#"ZzLx^Te1Z g5ɉ3J΁$4G Pf-I0A"!xih͢#%)LQVU)CJ\_dbCE&+]5YUPj@3'8h)p cF ol- zč*qR =m M׸f}obnvZAq!عwܤhP!>cH'<7쪤Zs].:'(4~ϻY)aj-\6=MX2X7i떎YFHв%/k[Nϗ1{ZvL. Aՠ(@QӰ gk٭=zA8Twf?؅Wx@2K/E*jrNUThjuI F00Ԫ>QUk>4ڴHZQ! ћiހ ڻ8OxTel=,W%eKY+P^+٬[f?<LdP;]vuŐkp`Z5 k=+rK{Mj\G+0QlR {7rfX Řepp}f 8IKLEdr*$wxiKZhԤQ)E[Bb9Z'aQPeGڒXF& =zrԙY0gvg6)@XFV-6zo۴FKޱB[wܣg ]h2a7F=Hg`Xz{w@+Ie&:a4O"J:'MWO7Ҳ\"ӝde,:kz~*Fy!-X5a0ydhX*xv;FOo0pKK *ޕwJqG صj-Z]EEc`aV- !B0%e12Og-C1"24pu7RW8U;bd;qcY3sր&J A%ӹyf?16l8΍I$ bÿϛnE,!@$Q$2-ݩVJTkY(1_ wHħ&lDtށ#--yѧ $K5&g?rz-`uY,԰6jS,rI6~~M. :{fL*AjK (J)%(H Fhܢ"ա&X(qn#{( bݢ0Xkl!Db$cqv;Iwgn${o'ilY7FizNq؄7M!`p+|)Llu,G\}9 Zal];o|% f̅J:fLCʑ$, )/2IҙvM9\{Mp̹drK1hMEN8^{}~#?{j䎓k$Ð.RCizViqp晏s\2 mx4V;K%|F,jOt],)B5-sj Z#kքb4qrnMԛ$R rQC,71zR+2_i'lBpɣԍ gbBiH%5AdrrӽCXWزT sUC6N)ɘti6`hv=͸9^LKzg˃<#"R-$T׬n*{\bqM<]Yn3s41Q _|oR[6IozmJmD!YUTX^@ }xnGuؖA`HJhem;ď5e $tExiwƿ`/%.1pƞ-w -vlQ$X@NVl Do3e/f}wү*X,XA΅u]1xeI,)[ڷkHHiEHŀ@YWgJ4X !Ra6Tjg[9s_£lq. \FJ`iGX= VdW\WqnF^L lmQhv{f!yG,UvLd0T 1A+, % Keذ(5","IʊG 5oaJL~'v]7n`([ZdsӆFd(6aH+q@^ ^%>TPEjΎ:iYs.0P4(neh)böLLW0=tLS"6٪O?[_O{wˣ倽Hmώ[d>l @ ]"=~3V>CdcEXqLK2Xic]$=w|&E%pQ]d[Wf?uV'dZ'TK)Tf0 Ě[__(Y7a,\c hWuztaZǚgk#ĺ )#Ai#SlH8/tR0)ɮVUáDj%;BMѹ#MĔ y6o[I džb3"&[K^cϯk<%hj<+bg>z+n>O1l"(chr̄Py\+Je_/lb}덿*suP,Hc$}q⳿F%.,|RدsDlkȢM|T-k` ņsX!?Octח鶟c^Jj6RB TcJsݎ \ӟ}ǩON>RJ~֍Z:~̡s&ϲZHې˥Y+m(I}nabBZ%0b*hg'FN2&U,b!If1<2ܭqIFTLJ̓$VM`T!mg3%)Vbiݝ .2A3f7}q"'/`%eGXP̦6:&j(G^ࣴ;󶟢^b!R]oZiG5GJCsy)el"%Iעl0nBRvXCÀH0P3X\Z_|? I&$KU5{vqR ߧR Rcږ," Yj=\%JDyI凗.Q,Kn_``OHDZ RQ5R$c$ c\;Ԥ-;{8,qW wԺ 8k c\ɧ=mSiN5rwXc IDATwA@Je;0ظ^B":h(gvudE_涔:Ok8bij9׈PF0AgrF,k1v$=Pqer+BZB_];˅@?w{n])%%>j>gdHױڻp. ߐa&i\ssvj»Auox$ iX)\&!ILk&N792|Ou8B2ڰ}Q_[;!$5i#Z!V6CHZ8zƙ'I1lhX|VMq VMr|-:| (8Mkٍ9 Vq Ef˚axlD,C.a4_ c"mmU5 lV{⭻ aDZ$ݶ8OfM3#dWR,*<v05M#RJo3K:¶J82 ,81k4Jby\:NX JKl,69p = f>Mccct|#u(Շ,L xwlrimՀ\2v46_=鰹+Jbh33sWa}c 0*F{\iMSk\ZRFX\VRj(jOk:'[ V2OaQ4C eWVH=W1rrV/Rm #6yC$x$Ԋ}_} O`4/ܫu=^MMG~vT!!%aAh UVFĂ dl<\gR'QYsbDJ,uJΓ~d{y6|݊R~xMI2 n|^>Co&GC^cZF|[1HiʵY) TXIFEH,-x.ZH `AVH%Qhi8"Du U(6D'd[Is\ L)jk?sNaVvm JBEÈN=oҨ."L LL4/a!Z\ Q DE:JH3oc_Ƭ.3m;wû7N$7$78&=K4D@Ӕ9:ՃYm,F|fseƇ`bk9 5cv"IK*"¢ҌZ&]lUiiE^ aBV1ʗd>[W<%4U[[ FG u/"h˟#CAB4 uHFufl3'P$Nmj ѭd(ΝfyfD!*&hƌv#']D@V" mԂj`>9O0UԪUdU0Y8<}v#" &"s1M;o"PN? ΪB;eIe .$ %MjL0ԝꫯ\^瑃Py| %e/G g>z2Tѵ>m#$#MMEP=~#݃y|45ܚd_ܤY+p)HQ+)"H# b0Bu@cBS bL!PCIѕ8,OI 2oec|)fy?RCXmn[nX!,#(dMRs}NMr]*k^W߲{uaemjԉ'RxK_ҙ1 aK0":FADA혓>$c8E,\1c{#̳Kb(tdԽrz Dw(: ()gXvsXz7G,Sl}'Vv8}Nя0lёnL e_^L331s6ȢQ:] 6u~d]tD@)Ǐk9p 7=[%e ] JnS 9z6ilIݺaq@ 1u)yצ"k* E$|MU֜NKW0Ut 4ch[mE(*t 4T*Ϙئ J-A [0՘SnV8qjfšZ[ggW$)Xhj\A>,3C; Yj'iW"AW6y9O=ՠwHaf&&iI 9Ub7r@*f4T獻rg"Ҧg1$4~4Uӊ%$7ܳϡÓx+9ѐQLǨ4f۽U}%ͮgT$$C}?@4< Voo|ק>Ň|^K0@Jv8oa.΍ɯ}6X)&v}3懏h2`($3A2B:֑M׈)Xuy-y?/{tdd!vlo7ܶ˩sx񃹳6"`stm^,OLT95ɇ?cYYOE`^e+wftl4eU_܏@::DGDaNV].恿[NrϽOo ő:"K'Ze}#|I.Uٻ؍MAQ ŝ{b L8S_GBkttҡۮy %1OW>̩;NKEЬo?_9 : D jXNQL.]2ٖ԰5-E'TTVB|ow}tB-čE EE%x ĬLRO=,`𡐾!4 )+38ӓcchg! 6qVjPwЯx=__ޏPǖ31޿RpC^lq_&i}Ř'e_$0uaGc;e{BnLFW+L{8=@E)6nm|ձ4'D S&qW%WnX[1yn%vYNUWD!ݲMtN,j4fygWJʼK A1RsQi9,6}&$50^by*b6(OL1fv0;/IMZ"A6Ka= %NWSS,"m8n+觡x8yjB zG13o=\DX/K j9L;(w4(]tKr{oe!.pp~?g= &$h}_Um:0ud}pap0G&jW@$hakLJ`'g\4Nš9fgg7Toq4ޏn[$ cѯtwBs4Ee8O7Of '(r^KЗ$?.{2/淦am/7^:2:gŶ`SqR( %, -] 8m"M biĪd<-Eh@"r&;ӱ$ npVCON()ZH[Яڨs+xHLVc qR&wVLM5=Ct琜;oNu 92^J܂zIVY\MҮI'`Q,&T a:&; 4Fr)Yj %[Т 0 +[@$_[76ͣ), n X FRŵ5R ݘާݿ A !od6.rpßN e&YdP!1#I")NR;l’ؾ7:ԑԬ7.`yp_$~-Z ]d зwߟ6X;>Ʃ oҟQhL:JRFS&awLY8i8ܿq[F2HN'U선-X*v[[|>FI]A=s<= w.!'\ n]YXiZEҘixN);vӪPp4 1U"VVѕ/d5I:KˋhE!UW`!>Fz'KV˘ ZKXZs#"E:'76SkL,` h.cUvn JwUI)-WK*i"lC7&glOr7"saKj 2+̍)N 8!Ձ4mУQJa9J/bIeV"=N//3[/?\YgǦ=,A'&91?j0utcgQP,a@QXMڵ8ҎLdi\q277Gi-mϝb$ᆝ9uУl3`.[ .t5GSReKcH\_c  jF1$akQގ5$*5 U6\`n qAa"#V VlzTHk.=P*XN[k(FIb!p*RHa* BoAHtF$ oXsMF;?4_"~V.=^x~Œǟڗ2˭y`5@eoo^s;57#.$7}h;d%P%[Rs$Tڒ0LGx:fa2p [?lpn=Yw-_6JL1Kn ~ޖ'Q㎝mXmcUةWxF4tKHh15^AK}0R]L(-S@dkY= r$3$UjN`:(qw{cUT>d\.%ǂPٸ +T Adq㐑è>70@qN}Ěv[=Js|f7|t-=:Ҩӯ.U/nS7KMcZط)YL4cNWt.ʤh:6fSiv@hڹ N "JtŐbZ@t:M"6]1MЌCZ͐#y>Ɲ::J*\9hV!jGdkUHt|x"p !AL'@sF.%n,({cf㏿,Y v܀_&+#jо,!XAX `hx]HVT8bh0'TMpu}u%ƿ?}LL8AMpg׷z EEjVd=ɥ1}ܴ\#:л搮΄:4jʓːRࣜ+ }U޴Gm*OG>U!-bVUP2R nhtGmO7)i!H i\lfPk^FgH8LW*I܉UNRfIw1n,#fxs/+3 xZHw"# %8pޑ,Zo\L7 >@`o$\{ud)ܦç?斸y^r5l@>Ȥ{vQT&|mQȱaEev3qR}*uڝq, K6"5RHD( رiՊY6]~#n " 7 U"20W25w-halBA5&]CF*}$!QKpWHUbvHWд@uMotΏo"Zln~ʉ,P$]⠿cG؞TQ_]xM"i3k7lQ$ITfS:I ߿tԒ'}j]:u_ kR\ gFm]]!?+ԧ3ՎhI੺FхVGj'T /tť3akS+xçb 7\.c{4L$brQ #@ѲF`:S>4zC0$2VجxR3ʢw}-t*U>.tJL溞lN<>Pq0Zk' S7ѕhظ1O.i2 v,p=hfldSMfNdE)VW?CW6GwRa=ZlEt<{җ! BƮ+i:* KZC} faԆ ttIN: tyɟޑ%Q&ybg:mٕ7 YH:e{06@ %OE7?Ql~fQu(O.`'M]ױ$k:NaPu ߍ(W\j-'@Q^18qlˮ.fQ*"r4z6K&y l*誏DEnv&V5J3q}IpJi)(JzWF3nޗ05(!HUaCOR{Q]:ugXy^FUU퀕 d>ZpTF#W:O\*Xk'뫁Uu&VyLڒ,;8ӬsaT*ܚǶcʔ$ :1+b:ԉJMKX&/526沭щUNy1;zU6ϴH$=.3@dQ0Uif^2)ԅU+.1TCUp[j`W5]YJHa HLYYRHdIYҟ{X.v8y vYnWpIF7ez&4^\'7.1 T. ӊEgqm E?E2-BP Jl"BI`$:=A-ZK"W"GOݼ1ʞ5[~sGEU jR]b/ϛ63- AhFcS6ɐj0ĆwXt➏m/(R -S.Fq^zR"룷'OLHMرckkkkAS;v\.355иeKAoo4MN>3?gr:8/>FGG9yݐRFݧ>Ctf޶ϝ/TlXU} W_OǫEUVT: >yI߅Z hg_EE0XCJ`j\$CɚXId, BV=fx3=[5ca%fa>&mh@Ej@u8BZ$}NYu/u7~0[&h!"GauBUNDJB_ Sz!(\צ;!b@M„CrJ8edmm+*Mߣv;-dщ0"^8p'0Ԡ\kڤRic/IL'" $HN)2 tb, ˬW6l!ERB#!H}XmYc`\&œ)u8,C [6Q*]3)c08EX#c E˧P0 qEh&`eij0zR]Z`49q>,C%ץ}V$'q=BDR` F* &H$Un3UVV4C'TN-73}9I㓵 z 3ՐJ->6 MǢZz3"1?tŶ%< PR &nA|;n}؛4"l9*8B35dF!)̘#b_'Cl6J."K|;|k(ًY}ʆ1dmMSŝn&5 {zAMâF8X?~fڷ>mc5 98`TṄaT]wzc)B#i`0{Y_"unv/ɴH6Dx:+ͥ;$LnvǞz,#[vsC/pJ+, G'uN^SYbmo307n!nY|3c3˩_:Ir!R,slEkE8˔}zuHkYl3J^gW˩X\: ̬pH*TmFHCaygvFY*:NTFhrRI{^~e >ÁeAw;Cf[4mh}νOy]j 1$숝*`&"RX<ɟPedS/GzL WJD}1,zIZI4pA[na0u7VFTZfK;q] C2rY#Հ6LKܠMrH3GƐYLz̶Hf$kz%ďRCp'q3nz(șD܄3$ZB OWI滳xY =)1xL1)t xU1 9-BCUY(BQTmO^6GּI~w/^-{|!/I%;ZF^D c$'- -ۃ2nm|GS7Dj*OsuVi2S(Db"Xv4>:dMm!O om s)tE1s*v}/hxUd1q9䢨*s1ss{w$rHC\|dnBۅ{m9P O- b)0Ag|,b#ECy⮳%/:yߥ PL&pd2ds6E6!6yQa lڍGws Y0 DçhrوDӧ|Q,AN.Efgѭ4 .ZbiEvi/ Hgəݜx,$\e=&399μ )ҊTUmmjVKݕVkQ^I++Ke-EHQ$@$`0 &o޿?$Ar]vݪu9yr6ʍbMzHe8e!V038X|W[c2 RZ-\AR&\DJĠp}Ohd%hӦTOI_1i42fM(*v.Fjz ag }Q3K~ŧq}t.A~O)/dƵ9~qK jQ/L%唽`t &l(vS2=v^-C3tJ ]L%t"B$a{I#_#O13.'e |yBopmAG|uv*&ۉ%*ş˿_k86_|/V9B0ѫ)[$QLgH_)mj.1jD^V)I dg룙Nİ"*x[`4=8 -cGDP9X$E$d0\F:ϟnr@NKǴ\41En0$LwPe[nuؖ$zW|Ϡ򁊺qm wyǖo]+&XR+P¬ S :* עEA{Eٻp,U?w5M$ _W׵ߑ"  ʺgOϹ'>Ko.|Zt,fbJ.俚76x'PtbUȼrc+DaFCrߤAe\b|T)vFc1a%%5C={(C#\"ϚyQUD^O{9zPF" y+:VJ=l|KTWh1?ro:J]D_H)h7@:Qj!:1y$Baȫ ~]'卯ٯR®לll>lZ;i_e_ \%Zz(Uf */!ۦ,R6} cFQ9wԹ`xvn\c D9C'L*ePH; 3:\8i.n> { 1ӄ}ssAXQRͦk!KM UϰF F\JӨ:~L 4T%dPqL!- ϯp߁:>%. 's:R\ 2d;):)*!3K+`hyTE* eHmwXA kNO#-灻iFE ~(.|^yJl,:7/3evi;8!%хU`~a kWH[LMdo8BT\F\bΘ3w>ۗ615HKкEb8Vh $&э$V0M!RLuj#5晓CN\2HbkG4ڒ Zm7|oA[C|@g+T[(y'Rݔ|% vTç&dNxEgi#1pQ84 vD?}X+ӾŰ^bR+01C'm` :oVL& z FRc߬8F5n|X+pU⭌XǿeprvQ2`X/z~`-T'l=4zl.f({XyQq'u.My:Q*y4~ЧgReuSQ=녜'L+ગqso~Ud XiTq*sm#."dk{ͳ|L۠>&8KT&0,0 ]ѽCIVU+rzWzT&g4{4ɥ5WPʇ#lb4 5$`d ˇ>$΀qW3\MTau6K!aBV& D} B*^ UP؏^*ܨ܈2"URyZ{2ֶC_{Md."w(F ͭuaTR)*xmQdy -*^B5ihUCYK q4ԗ E w[T@Bxa[7Y7q }"-o0!uVf> y΃U=w 7b~m;b0K\Ǡɶ#K8%1@82MT!z,q2EVw:l,vD`(Gg$PhT^S b TQ)XCƜ&M^D6Nyw#Db v W#P ސd`:*^@;L̎QCh6{4.l53{@υhe͐4"n[lr%dզR1kosmˤI9-t mE+0d:` 9}j%}=SPCvvb<'|[>B|e( ?~I:: w(:aODdA{eE\g)5w2T"[k^Ѵs7R'x&CP,\ 679Eoִ^eX` 1| bѳBYzK3R4tB/};I6~/qc6`|cO_#Kα)F vu>ݎGM>)Z !I3`;wu֗nbkE1=*Ø8m; KDѶBv{7Y]u:lw#,Bñ]lǂITFW"Md)ffbJi@PZOFt#CbD67ޫWgS=,-d)["fu:O E^QbNv-0;A'2Ѽii$!7^~ݫw]8p| 1G"~ jbA*)e@qϞ)?N^luv\=AOQ@YTo̫~ۏM01#4ZefbC&.$aHG.z]Hdqe*3#EV6;:N 5Uȇe}duˤr6WG\{luLjG8""Ʃ̀ P*$cC`#@5A@0bV) MM<pSӟ>MrˏqnNk 7}CIQmCxofB?#C(NE"~wq*!ҡVV-8\QiFЏ ՂLZ[GI1?μgɟpnw~c W ]h܅}\:,9]cOQ0'vTjtTV+wiR:)NjUnQ߸*o,~#6+yO4U!1LʬO)Ōu";TRHBKz*BQ "nǘIbgN;#HB$A?%L$l":͔QSPwk-V\ˍRAhYu.3p7n4ZVX78IJ%vңXxC*@ba;`R m{N]mTs9д0?ǗP@<(CdaeLLd]r3rF طP~Ot~)~g;Shz@-c!4~/FȒ7u-򫓳[+Ԛhv&ٱeg>>U%S'/R֥($ DHTf`y?Ȱ5vB[@xM ctF7pae=4gln! {){6mB\G%^FC'<\a{ i>$d. ު!1?b.b 31*Mw+eY੓MCp{C1[v=n#Ǐ0ta(Y$( A*3IB¤),I l(7(&-?P$a2>Rœ=orO)5=a!Uda"Dq &J`rD*1 KS0Cp&5,bĵ){&$[ os D ,8xR@"q]TFIplx9C/1q]=r[d&Gltɫ ^Ͱ*-$Q5,bN!f~)`vvcge')w[R4) cc&zWC( 0 $ H`H8wЈ"Am'*.[ع2,0t\N'|H8~0Ƌ*90Cz%ba-j5Nlz"5TH:4F IA3G_ N*0P o{M >;jG>9i(v16ѿ\|7B[W^y:999O:uOl}0^:;[w~O*eD%Vd_ޱHSD8HҌ,!P\] DBxytfw_ pc$h_d,~ N_ 7"I S @1 J&T UurFT05)H{e B4E"% a 3üx'OŒBW~Əvk!2F2P@>ZM ?5/s'D1oPpT$qPhZƕ BeYϣ01:"Ao-oA=#|7 ̼DP:xݐ̈́ZQM,`gai#CG s  wL"Ry{r<)b8<Y!dq 9=߉ qPHb Q{3۬ C4UA&4L"H KAH4MA鮋^"RS4QY"wu~!7-r%Of((yM"L0"AHQ iTyrʩ'OaS:ξ~3[ow/}x/ /G/R3 @d1F^F G1`~kl-]t<᏿ǔr ,emֻf4w_{m![ɳPaUc _/ݿ}өYer*\=ǘfI+ؙzjFedِn0Di6BAHg~LҴa<.S܆cQUA "!Fœ 6Wx%h63M2.?ʟPDb$o3Yp0OxuU(2}Zǁ#.EmbjHJܡFg5d`xI"Ԙh(P\vgwLs|SIk$ Rd(iNER4WEӉ#v-+ħ+R&X_M`)Tn$eބΉU.ՓKT*)t*"%7RJQR)) "QQUQVm$sv(# H4\<呕Mn\!`'LR`8b}2?E e2/ct o$  DZ !Y!}5"̌Ns׽{xo^huI\5*,d,/z3Œgbo2, ;'yPRDCt-eljs=~Ivև_.~s>RC~Gq״)9FgkS}~'}*-0ָeG-_'"lS>+\,]Fa$"na&OWX;ȏ*W3ԡG@ dNޣh֘!,-kH QGmU~?pG1aMb)mfGSv$5 9 Е"5^WO=JJ45s%Ԥ ^w& BTV6{{ Sy a'0hІۃ IDAT4!`U*01Edh-$8d{&yjq cX]aTvOeӝ>(YBa !ː%A$)Ll"aP j9]QRGqW ,{-9J2f6_58X+ ts5qK[-FF4Wѥ*3LFG ,ou u}dW.lF9ggx1ܹgn1>RxQkB<3 YĶ,Wα@^Zϝmvr Ϯ_B[q۔y<0G>z)~3= Ķvmav@-ȶRʀƭ:"m?A+./j<}cS L' d!o"0I w)PPHn-oV:3K.n.IZ"4va{;bBZ}p7JQ)2=i17o32ry|>!0:Rn*eTvy`xd9?RR$E79G%H2±#i>F*-|~ A7oiE;!("X%X& :vNÓ`*vp@_Iz @ psT>nC Yc\]mUi?G~g VU\E2P-f%Go"QK,e>eT)ڊOk:o}/#׷L"{ |Ľ5@#(Udg;`a!cg/m 톏ESJh!ooer&Υv^4yB?'])̮#'c6'OL#f&#k\\qVFwRw~L |V tɰԔщxfWA(ɩ,Q*gw}5Hrrqvoc*;(fcMԡT[ȼV1u68MNd[HQ-S4Qђ1HaZs AOrZ)TJu& ,I1ސ } c [!n̈"8}e.:˥;V]sw>yn&)Gxe}CrF&$bt FvNTY_r n?>ͱ#[[=: K&%2V|u=56(QuDF "ܕI)SN犈yIx\CPT4[hf)hƮ:Ra>5lkA[M'_=-rK29k{LiB4yŭуG9HG}񹀅(Nwnk7M6M<'W܂p[e/]oPsE,"L״ۿ.+|/+ ~ym7{[.˗xdtKu>^ƦradV'n=+WUpIJJ8\pn@xnV&>Vm[_<ۡe HF' ?Pc/Z8m^ 3Q .dYAE& WK_kwY6fX5vN"qm ^&Z@͜)8JzM7\ċWU5m4n"O5w Q Ӕ IJ ,.YX3b."{;ͻ|̼gnå6cnDhvԬnd|mg\f [6xӻocj'{̦:bQk,QK02NMD#~JeȀDbKr&)CnUk(",n: iުJ{B~~i\{l~}7tv6Wy8?$?Yʋz}qM%rOW/6=?F =$q麎٦X4Z~nHz{'0TQ`na8a'! yrۏN>o# o{e@xoCGܿYFj 6 KsO9}RE ?DIԳϒ-̳yLXqk͕ u1{̈́)YoP-/\ckhrKQnAaZe^GӡT0^0ȠfD2c* ;a?Aw:)/\j _,)k쬶v+-T@`E$J&?\jbf aϩOr .rU;} Zٜ4-z!|F\@K74K~tB0*TXQq`="[7s,cg;ʲ}ͩrUwUW'uZ"cc0x53Z,`dld0B(Bչ:T7{qxZT:}w_Vvͥ'eW_[/-KR?H5Vq- +dz5om`jMi`H( i6󝬝<Ȧ~`CXaFPs {He}|(@7N /34p;o: ,5ˑyr#/!}X.E'E__lH92I.r%VN9Xi O& Nq576:%'mH+?&[, j U-}l086@-X&MqJ|vg; KcHmr%FGK9  ˀӟ" F.+"thK |$awggYz"F.[*(4>8B 2xvL,b[o@T[1y ^Hmv1J4Zsu6d) &\)IdYČ4ctt=DZa+eY&HSIP>Γi4y d C% lڲcaM(FJ bRsg F*| ߣ8jb9Pg%هQ4>Y̳S8ϱWb*N-<|̳ ̞ÿDo dRٽzp_@k1/>~)/Wuc]9?Tᎍ;׺~Mf-g>[]Pq`H iooT|&~e:m=xA'O6FՄrzIbRN~B҈Dņe3\, ):4R FӚzgҳ.ް&K3rVmp>#EcTd=ÚBI<`0禖8>†+V9{vtN baŤ,I'UfkʒTAc@b ժdT΂lH&VrI +3jLXS؊l&(~8qk6ym;<>-aj [ר!F)$HUWu7]N leOv`ZbC;)-0:2I 3ОmЫ^i:: O$?1H1'9gLq=g[dZqXO2p.І\ahyʥCK%@TE6j7k+Gݽϵ7]Su[.{6O]WQnwqd#Lmjw%';0OWw9='n MJg{S^8[_IH5(xeF-83(t  }}2i{<?ЇL/4iiښcX$EsqݙFsrURծSn7RfJjuCWUyHཔ{,VyK Ax`6ͫ$3qo8wX B~ WqwaއW+;ujB1QWr94=2) _&HqX[zϳcq+]vhl`K%2Mu0beqb}z-$ggkQ( [4 J(&i[4f~dlV5g&J@*L@D<d4 N(xv[ߴǞXb20%Ź'CЩ,fv*`|7F0.jP$Z*{t^d-~0W"eoK+ 5VA zLۊ Hfؚ:ܡl#[)G1ssRiF''(M7C zNQZh!6: h^`/Ko*84!IFG::CvY1ϭ84GGQI̱S3tBz^>ŊJ'@w?cjs5aprݾEhm4gx˅"K>52rf,F%`~, 2~RUtctۧ8QǨ>bJDQ+H)U*ITWfyƟFcY8$q@ce2ãE2}}ls0PSeaJ1gs[ʰ" Q$gp+qo+QJV]S>3wsjjy;FةnW^l2N +s~BŒJB&cdyH[8iyZtHTdm%iǐ +,wXiNx]I7$OqfJm{Lfȷx{2o=,aȶ {!ٜıA z4`X`G6d,ܘ2j+\[ E Qb6bg<1Қsَ N/162L|M7"zR. }*qFu fbEmdEM VD_! ?0'fte8L}G{f;whLFXXu_KT6Ɨs+g Ց89Wel?)ohy/lH2Pfg@Ds[Ly =2}91T=`˾yY<~Xei\@mUrA&6 z5K3KKټ;di!D>*!S(lzٹmH-5gX)sdHQĸӁl:MȎtMϜߡ:6an:>c =G'Z6YWj_JL z #p2fʤ8`_vHKH$1X˒=!9sg)*t=87}K81ui4k$kR[=^,G:H#8f)gQJ}E*8􉗗jB<F cew> 3M;_gx&½I֟֍Z!tmi/1?5F_F֢'w6̯輳kj44g,@*H9q_Eib! ZHҌyO݅trTN%&,\AmP]BG.%IFD*kwxt 0( 8@Hk\FrD$|Hz(#"M$3߸Ń4ښ`> gܴ2Bhr "Ɩiqv{f5Y-CcH0Z24W߽זw其ˁ A?[>O/{ضeYDQ\HXJ$Io"=8D/N*~öml&"$#u]Rf"Vs${>ϝGڋA"K^v~)Em[RߢG 2ıAi b]!1NeT QDNho XV L:4cT5v3iG!3鐵Uoê+w`ēȰ͹`x{\q0 `[" P DGې֋@)OB=P˱5 J,'DqptN;a6zNϞ'P~ tU~xF[6Эǒv&~jE |R1q¶$ T6`9t~mx1/PΡX](f)7æk<7@[=y@`[a eO̖=N3Fˈ"R$C$amw+NEao[O;F/FkAim4Ji0!Iz[GS-?_opB}T{` 4 t-7fƀ6Akp=~c> w'>\X LǼ$"-K^*?,I}K?mf HC$4}BKXM($XG(V,Ҷ$86wع{"YRf<ͺb'h8z 59AivgfUBǰR$I47^k"^j<rV"6b*Yt5@)X0f+m7}oW#, IDATV+ ٛu\훋$?r`Z!g ;X>=\ 5'$6+Ϝ l,0!G Ę8DAWɗJE"DF|57{E!9;hQVgی'Gz+#p-!%u_SMV }\n,ת [F:gŭ7 19`x`'PR'jf .IDjuVC1W)W>FJa#x"*գ6UJ1q'0WD V]%1涄\7@!pBHc&BiE2$ZZ`? ƴ%8Q*ϫWW|qEC H(UPXiK#C)y3 VPcuO`)ET,yf윋Y֔.N4}WCUэ6AB0ēșӈvccZ=( V : Z,!G:W?Z@Pv37f tw;?Bg?K{Za~?k;t$}k|t% x yWH"(#)+7E~Q'5.6t݀Bi];r)Ne(Dօ7DH`qBnA.n3=yl!E,zBgpHTϗscrAK6Jq#^jE,lтD{D/Ok٦1h݋-Sxt:]#=&߇UB WJ Bc hc0BBAK~"<] ?SŠ0/7w׿V%ZD1U# 0n/NJndCℴ~߫8ԅYUHK$ADŠ +=d26VE@ a:\j?G|nۮdq &ca:ƗR^!0#o;ͯ@4;/p}.7- eQ;?T} uҙg)ɺmY2$Fu!2#A^߅k Z)(QZ%$$A) l •Ѻ{Ru*w\;B k;8Cr(XNi8B)E- F( k}aEߥsbLʦ1b~-ױFnn.!6l񂸊 roIϰtOظ_!Yۗ&IǼ̳ɝw^Ȗ&G8!>3_hȮH RI lQzRy=J$TkXC)H=NxU{l?ՈH cBC1dS6O(3[؎ũ皌dsYaLҮϓ6XaBW Q] )0Kjxӧ`.6M$tYc @K^SJz=ITLd0$I%k|?kH!H))RK Cr$$!1DZ4iIL,zFDpp K{/:z^bZ7W?b ~hB9c C@hfYtR8UqѕEw1~vtDJvqI35_c"b6yb,9Nsn=wPz'_qh)D,@\m[Ȗ^I Fn|Лv/lJ&G.OQ~5~3/ON|3m߾Wrp39l hbT<0 H!­SoȔ2-85pI21hA`$4}L@j6>4Wn*196sf)%PLB`$FHVZJ$: W&heaKIh: )~p |=;7o~JKOITe9la\ƚT֣d8|a742I`l ٘$Q$B% 0pki'}nFhJz\+b4u {^0M:G'L&kI<\<[ $EA6qQk0̹/pQy e)m^<{o`J@(XD(M*l;3a|}ҢA/obr#DƍBcmҊZ̫nJnj޾1&O+BXd2 #u{Q谁k,4 By?D)3XaP8o' x|kr"s?@k&72t )C%[O~ xu|38- .p WfѶ!n4$H4d&5VAQȵ;X $Gt![`[6E&I?n`SY1џbc,6 k s-ï|)Q ZK4-FQ= ^ҌdlFM@+_1̏{>+HuIlvcz,EX¶SXK6[Ra EVWȩ' I Ri*;6F6Ҝ?*W(Kfzn D=&EE Ջ _'?皱0mLw2VTM ILbaOF?xvM1R }Y#'t|Ŗ w%ǖr\SUpObc6 ^U^hM~;uJ:-V5CzY {T+ (bA>=zi F(C?z*VrݞAz2O湣m}}{ǡ mFӏ^auNP }Ua4&9`3g7^n3OVB'FuAZS\06r8;=(9* ]s=:Ycis;evx Fha$XKYw8P_!B1#gβsLQ&BM äAĐ.9ҥA Wn+~H Z)N0!!QlV=N"ekˍCl1ë߼1mԄA)s\ !%őXfk7̲oAB=lIHiju^//ܗ,h/ŖVP9e菿m}p etž~;a\as :oq~ uX\Ls; fՠ9j⁐NHWfIr;kƤV\gm2[!L ҐE4;K.`ndZ rAhtѫ-F[!AQ>z)vl$ O8WU2g}ܧdkT3;п;'Ci9rnU{vY0H-4>ۤhPhHЩj:ML2|GymAʤMQg! ('x!p"C a>{'~ƆX DQKZ{naazֱnr|t&Mg2eO|u^VRo|g_{zVsX6I`561c)m0T4>A2uzClx- '͓z `/a5* vm,x,\rbSMvyjA+NA!Da1 IMz$ų/sb7B|+ه v AniSW>Z+*.O4VZVPf1mE|anp1]XCָjc Vhߵط:\n"ْaP Ա$G0rt J`PJ+q,_>]SMk'w~' ;@v ӧy>7pG_˕Ǿ_Α~|$8!30CʨAR!Ja6خ 4ހAhNZX௿e ٽ&T1UѧpÞq@J?}8cgP:!#6b헏su;'u#txjLGHaQ2~^vݰS|K{'8Oc`ǧf06ѬE@+H <&YL-xlmϵIbX,|s3˔+C.9. $QOULu䲴] j!@A,ͳl]/X":V$@+?yKI^R/`m/l~>x~uCqQyN@ytmluJ dj=[6]Bx6)0j(!"6Dfhs42)ZivC!BC9kHbgQ&ֹi+hs")J$.ڒѫt_`_GĽRVxn{i6(&'II3UF+^W@%DfMG&Qc]64UE}P{.}N5®+tt1bh+%фOeXk cn$ "X"Je|t#A<O"c9}9,Bl{"O?=[o||v:Ycl5qIi8$~w{taEӌbηz.p'h y:fmpPvQ'ƈ2G_=lF3KZ Cdޏ gt{õg$P)]/udӫu-2'#|/[zMOrnAy|W?M|^?~ix55^@oF9C?AQ k+yq,AJa3h/褀Nvs= f$nĨiWj&j;_ö]Sk40FO9mH9J%j8NO>x4;3ع[byٸi3G?ͩg)!ߛ^aг8Anh#kIB+XZp\ؘ؆n9EryFeCfqpTdzl@H?l&% N ? zN۲ik8F.L(" IgK^n'Lh/Xٟ%gO$@+oHw>qlxqSZ bph,CMHlZ&nO7N@+ehkȦFi0>qGj O#_Uw&۷ T!#њЈTbu2Y{.ϡ611At~dY($>zaGo}zg;&,%r-a~,)zOQ._fwϖ?:K!)4oK~E?JpK8d'ѷf&֢zriQ#;G.Fp3Yllnyh%Ui" orV?Fy3Z̲ 9Hp1Dk,!J>66~y6RrR)T'O.u> ~S5שfҕ^?԰y@TJu=(։A*.5/6)2TW:4[ ?jd 6qd |v3#%m\i!Ӓ2HNq_K0 h1hD# "0nLhzέb^\TqI5|^K]bZ.tR+/!{-H^}+А;(ˮo~ u-ȯ=dO %>dkXL)n2V8TWl-RR9va*0C}d`Zq_Fv2y[!>=J2\ƅ !mc#? CW'<W04J5(N!3HrBCxX7پDd˵qNr덿DɏyMK^^\~g.-PYL>E86wh;cdko,M "$r Ck'Ty=/&T,X6}~6IXD)Ͳ|(fy̠K><"L 81]!-]y@k0Ifd%x'ѓMRXXH"˻St >}XlȻB`b9xyCM a#Ǐ翿瞻xVvۮwm: Vˋ^mÃ~pw/"S) 2\ 3QMk߿?yQ'VZ{B^K9˵( @* lj|̮䳱mz]x!S;oϿ7ozYνl{-G,}u,ԯ'|7~0 ڕj;Ub x_f,Hzl O@zEx~•uB/}W\U($㒁 s!f+xIBYk`6kv6g43|3RY>ZZ@zb%}6 6{(t?.5̷{tpx~4i`gp.[NutXg00\[w9;rq ss^eYo01(yԟ/| "pBeO̜f(^IfP,:*de. IO|(>Rh#QJ,X,R +(Q,8gY⥗o~TBKLAmD2RP.Q`Y kS1d!iZ"DI E<-YLHa];`i7f>G~F y_dd*s oXS(m8%=Lck~'Yf YQ"/ ,FDሐ2E`Ǜo4Ǫ/6Az%Fn%g)}6n4dR"bRrcE~ =~mt+OaU!$V173Em@)(Q,R)&# ֑d)Y ZQ Qc17OݦHtHc\pEk 43˸J!22 B!9rb_Xl5X,Yf#XY v?z᧟>޷-j*R?e 1(N(|B)bUBZ+e Ͳ<(a\!R`q|ߍ=|(IzQ.~n{R>ĉ!K-Y&oLK IfIiDFAJ'6y\Kk,4#N͜4A TP#={ cQơ,(!"ԚOH_+e}bdzXWĹ'HM"Bv$8z :mӮg:~~?[Ãի=pI Re*jIkў@)OoB\EDq| "rL2:Zh[ 3ާ9@me| k\5(8| ID#EEGˁqG|$IG:A9R Ge$i1,|jT)d>Ms$ijL036FiLB~{?*&F0iTBxK.~=e/}$fǧZp<Ȅ޻x3tkRK@ެ4Bs r M.cb=^?>/\", r~PQ:'Lr(IH[xO{h_2aB)'hO{3NjjJ|P$69SEdl !$yՐy6m5B7nsv%ലy5W켡=K {:O>=_~?J(BZ3$@\YA)\]R+KU081`CZE'ĮΦ%!0&edd+=O !2GLcG4P)C:|CSd3RIć#$NMBԃvCabB'E(1U_'&"iэ#JfR@K?L/.?3 \ pGnkpQyYlW26Y^43V"ɞBSXċ}([:A!%lCZGEk31С:`9C߳l TPHd10Tj5^LZEyܒR2Z`a5~f=Mi|Oe%6Wi=~~d 9Ͱ"Z']͐G Aj]tqw:;y!^a;]q#Vip!czi 柄RO,2>,&)Q73.3<518zbU>@1ia v388BNbŘ /PIbniUfc%y7y*vXes)H(cZnĤ r@RD/jԦ&n9ynsxmlm_w6?'vnoy޵}dL;p*%%Σ*olAeqWsdG%Pb(aSv0{lC (EKc;2άUEpr)[I2=GikY{ *7Qu6zmE@SXF6-6 Gb UA=- vs[~JaJKY)dOT4!SϓpB #U צϐ -ssttt'v4>LcGtZrsl-ӦbzMTҕ[s*1 zK8ۣ !qR0}.s'&,5:l6ZX/ ޸  RcE\1Q\"6B͓#R)QjW^)uH1xI"W:8&#W|`ºؕOe٧= se?>yrwÿW7tǦWTFAQOKqv^!AQjv#攏))CCSG9@J&|V)q*p5M3kSus0-#n|֫pd$[mSӌepÕ%K}xE$ ;/TMefHfB=FG3[eX-EopGob(/ HLӈ+,G9=D,1#E- {G'~dqK Xg1f.Yh/Z9U|5jc"2ئmPŖҞU1%jk+arAgO&)/ۋXJ0{, !/?ݙh*<:>~J$6Z lSE#nF|GkrTAQcGHlpeߗm\@d1NPQv4M9L)k K) U8Y O1?iq4D7<ábe(bpތސՏ#QuztKCY{n_ Έn N:Nq[}3GS2R|k}w H Y&sFVYcrఏ&fiM9 "3OŽ.B6vmNqsa=BD_#f{w>^yW;mfP%2PCWC]j*͎mlbaqZK܄bvv>agrzI+NJDiEu.fH# ZRAEPgY,"K1~=gl,HFVZ,:- 2(G{,5- Uiz,暑@X6Cu=䩐!(IfK-wxkJkcXY&Sd&,Zf%'g/`ݲbP`z|| 4eBr_gGD)x/9#w??ZmV8cYl6qϰek#g1M$,x( Ehu"<% |F>2 sO[j0DL2TJ2)?vgN\Yog=w vIX+ 7fx?~^oj՛JH$BާI|-l$?9Zy ֶ 2Z_+UCE{v$ ݘ'QD,a"\YHn2+²ʽCA%*ϯ#yk8XhXW=f~9RSv EZŔFOzTdoqJFD?b,'H& ~8%i,.:k^v(tNnYKƬ`bqd2%^j)Nx潕RqxߣcSQǎ,[x$#%%Z+ç96“fǠ?\^ǏiG{)qlJ1F{$@@P#B1Q#L/~G_Y񦫷T^`Br  +[ Ot?I 蟸.7}[C`LF%8g VTפ'R!V\uNnlS !7ﻎn#w<מg`͐.Хĥ}L?p glڞC!2Z8!\$MqVI|jIýX,t|* OX&ڎ"|^vc<8 锩Ŕ}+Hc@+pJ0}V7}Sx>ŽZn / C̑DGz`q&O/+;Ժ)ʓLTC'AT1[4iRZDχkvskVb*K8~q5%WSؽc -%>wn}-.Ź|Xla⌴c%q[8x @XI:m2IK̝nM|塯~(WK¤kW;պig.(.1zM啒yOğ޳ Љ+}NkqTR n9C"(S-"Ƕq͕ټi8OU-87w4™3J-9[28=To Y\FzMMkhR: |М +_n:xz_*\0%eP0o3xMM)bᶎP$8qoNgS%ǧknsbj*@JL! BS-^vmwN7X>"!2m32:pMI&%gl04Ta2ߚofBaKv =Xj04qgsӒS1˱ Ay`,ǽ,Ēi<0lGDHv}i3.KC 1ۯ="8t^\""Mr*%5ke^{˵rE)kqI:RZ\[X\[\Yn7{ y.|Hmmo]Σ υvJzC],?OE# 7] 9I\t`-l.jVCV9e6vZVk?߹}C=e{ݵ뵰lks./xou[/\v#{`u}Cszݵ=EִyV<ٚ! Оpzʪ n4~omۨyz>^7p(bºb%zBl;*k^[ 59cgx=X7_=~ت{,|]™&!"V١|!Y}75fgi:l^`ӿn;[jZ .]>_$+":m#`׾:9uY"pp󷶝ύK\- Fv_ t=@|Q4XuIENDB`variety-0.8.13/data/media/vrty-login.png000066400000000000000000001737661475753071700201420ustar00rootroot00000000000000PNG  IHDRsBIT|d pHYsD'tEXtSoftwarewww.inkscape.org< IDATxy\Wu}ΩIRke[-l'0ĆaqIn$$<7 .\H& `˳l˲[=CUgTV\-Կϩ>U]9oZk 5 zmJ!~ RbἿ6t d-8JuyTܧO\q…^E`Pm[W|7:'(^Z+SdUU@U7.\`Y-R(UUWN F9Ue_m 58u (T>.|*HTuEu@THƵ߂~+Uǩ|V N 8wֶ[sguE:=<#xIJw2̟޼_04=:x9Zg /G'@,!^!-4t0Ts#g - BFh޺u[s*ғD\PlIh${7oUnx'o;;\@q]?媫/fwC8t0ڸmײo>j'vC@㡏݁A Z B\ Ў$5`)Rc.H#dH_I_o\}nh:MpYâܒ81/ i!p  pf-%(AD@_ \cx~r #!:ڟ| uȆnZZfZL{XO<əge^Y7"q` ]}}q1^<ůhhMw^-A5/ӊLNRpsX1`|4):n'Mڈ5}HujYn['j!2k'i2d-TApSkc[wkUIVhޔ[/_gno}7cof[I& քe]B>~;\OCCH dDrQ REדY]bv_>̰fi;mdEmn H6EklTUm;tњO;/UKte-a`(SBD[9uo}OQ(Р 焂afGrEXQG׿Ɨ5nZ>bjj+o{곿7c+7{{{3#G`.G/kO`g!.|t&cCct[rQvX>s;wzf9r9\x.[8% }|w%zPX//{Vm"%2H|Y,_"`$V ' %ŢXΆ0o tɲ?{)Nbkje3ʩJByt˻cN 9 _tvt|>Mzh>Av;13 k]v˖o|ǯz;_y#G6˖/Fxy/MgOQe6:y9Z*ණ'#m6S2$J8  qc@6` ?O# yM{r]>3LgcaH,{|z:;}_qRzjr9V78<jُ%\JDaWetSf]IgCggxn`-<~ _2 b.KchxQdvuE][䑻Eoh+;xgcC Nvv= k jRrYf'%_찅k)TzSKcBª'8$#c05xhoSIvq(Ly?j:,븼ܞ;B7}8-z\VvjΗs 7x_T5|:vsp2@4%g6 awְrI32~5[?=J)$UwN&ט,u' Ku%tXrU!j㬿zAYNAk_dReCeGS|*S9+rBKxYox8"P]*]H[{?ϡGO0.Op)V,3$v^>-đ^m9,bߞl޲_]2m/; mfO7^˹7кu%2t0ߥ$,Kj=DbBz'=&Hd FHٚљ9T!ds G HL=YeqZ|10;&;2Qvw']ReO,{T8Yгr u 7<trw" oZ;Gobj Ò=lYE~|3|;L0bQi9/ZT EC;8Hs,,I~<|?c7GӒ$xLpu 295C\[jD &'OMIg N"aD)PAqq$t~030b: ږ'"~=~cYqٿ^QMc4X92N$1Ᏸy':gG#CVa6f߰H$3puKq y- GqB ?iOTs6Kb:ˡ1q9@6k}ӈq2^夙sIJ2"l& k}+9 \ 䕢zCvfϢ?rN'ho܏" %H0;5&k ArZ{%?*-x_.8~pHsz(u*C幭htjnDMhUxXoCjO7,3^ׁ_>ž93mgw`!aeC,S#,rLeb}h-H0Kb%E=t$hF}ёa,-1Z L1,ƔX$Hq]HLC= 0LǬb,L04<BQ9Ģa8Ԍ2- ck4śk\#`7iVjF.,FM SA,iII]HybSsc⑆ukBoϞOd`58jJw:vսJ+;jWUҫo88TV/6pZuoj5c.j-] Ÿ^U@JH9:$g{˱%`]P?*wi IDAT]'j8'>-fXbf,C8`|`]Y?Lr$sXn w?[9CXzO?N{[-Q W6A}DգEmpTg9p;A$S}i9u D d~A.'+شeqrS(87B]al_0~d9Vi@"``{ckfM(>=3hY\Z@kaDci勖8[|`w|] ]vTΆJQ C*=ɉK >xK͠\ Oo(C)FNۘ鈰)@r - LbYl∧h441(&G|=g(.˳du0Ǐ-I>ɘS=ȶ =6j#H#NsOXֱ?"cR`be΂bm9n Q H@ AAh0՝'vXyj|I~c|#|Yq,vK : |/^_w`Cb\*3LM("1:K8L&T8Z@b!BHFq@C#I$2?_sηynixlHXTWFC9OkbU33xvLc4U`H޾$:,e4>'V]̥sKZ@^tX̄FJh )=!@4z?^@ jum&},2q<+eJ˲$h JI@ojǡ\+gs]?`Ӛ>m8ڟ$"^`{ݗ)ţog#G&ۘY$ KG(Y}=&"6d4۶]Eta#Y&qpiu` G)R}28:M]ų@S?8>ֿg˦&PBZ8RiLfjo%PZ)BHaxHCc)ZIvB+gēo}oIw~^Oéj6^խpH9WzVz1y˕Gs);ѵv{G !E*]@GGD|,2R✽6K iixR9=%cxn1CCı=,Cb$]LMj1~g3tAOsw^Oy3YԾt/j``hap *Ml i'A{ `.RkO"A "1]cu\Ȣ~/84-LjDk9KaMű%l!%]Us̢o̰"E,d09 0hjŒM$0 ` V^lB)וxDJac+\."}L͍ܴ9֜1u[difgOBEek ^jUkRLj l>@3j"DGmVe~6 bϔsBBwFkrbxnq B4B> SDgAAd4CibN$LI},G,`rƊ:w aA;ʑ$Ԅkٳ;͑YB'@6Y,klsc&! 6j>Ȼ9G/9M6:uC1ɮ3:0J(< BsfP0 Iŝ,Y_8L*~H(X{g>SXim?L.v!jjk9ۏ%-jkjPH)p]'\z8CP@T֠G0rK#΍0ȒL(4|N˺Ǿ́#Ǯj*>K*^pYٯjXkI.;o0фOw8F#& [CUFf3#jb<ڂG-HT&EgS 3l>S C5 8k $t $sl6ht4~m- Ih24_d*X7s˶$N@,an.H i1>9M$A|`(O=Ͷ2<40!v@Kc!ϓ< 49,0Be(60-+5 Rj C syz:] /`#KxQf}E>t:=̉(UIC;7r)O~1nh_>#(R ټCod$4cq <29DcQHs6G&L]BzEsY0 ІPVxA@xPUIZf7l_q  Le^*HX Z+xHYt_Zͦ$'HZM+]'K@5*:Rrp>qtdjFCIseI\XTw4 5\>)fHB21>C.[@+p\Laݚ5Hfٳ5(3S|:CMM dDbzgY\"s] ZYš>B*hGyi 3&/L}sP]#Mbv Mj=O/c \9deޯC*sg)^elX:;$h0]Q\S_W O%IfHS33İ$ýsE8$((6 @p8W]ÎOb\ k{$R˓xDA/頩BH4i70x,n-9;@sk;ݝ˹[I`.W,XLa"hq<&o3$E^?\&U+l=nK+܉cyZt zبvw]or](Ro\)i- ˲GJI&y!Dqg] c"@T*EPxYQRa$ɗ`P(D2q?яxw{QQT6)/;?CY.͛7/ 8y'8^I2 P,넡Mb^_){‡DQ/ub/4Mz^7~1gJUSU{?z]Zِb %ZC-:FKJ< vdu7_S|g 1ߤ& $5Q?C%iG2l\V-xhӒsN~i=y&"0a#HPj|>MgR Fqq"#rmq,\@qtW?w=&g]EAak$vi3_r} Оiqݍ[]8Jk.kGkM399>yudr@֔WrxxUYWi5W^8S($(Md}6GsM 8gK6#e% ]l`dB{P`x"tȬ ?&  F`xڥoJ?m2>q=?dhZ+tS4Ch,G(`` 0p4YQ 4yWtS9Ir8糑!]gecu I#.as5}#_@a˙}РuBs~h%O,3܄@4. %ށe8L3x2IN;d] EJEBhx`ͻ)lwCu;`BHϏa x109&g>74PBD dpZX5֭G!00tA~.yfwz{ع?Ad&? qI| 1xud3C_|.v3?qu[y^an77]GyWt@FT܇߶^wp(S%$ʓoAڄkϐ,] iu gMBZb3 Vy)(h0%=M!/Z,m Dh %M<=1\6b}>Rtpƶw\t'=Nߴ~TE)rh BiN>jkxn.^9xb'g2CKtRPy9}:̝k9xhG:̾<-w9owo4-&Fgu>|o$V[C( ?#u?OV 8j(= ذ~@YV&~B;PxHC ȹض [xLj3őSXBL ,B{0p#Ab 6xeHs> mW44ƱD%=&jj}qgt!w@}mlg,sZwgzr(#dc!&&s}c{8a|96(KFM鸻{PiuCOI穧jv[_z&$Uj+B[jMo˖vQYm}:r/qEYՕ%jsQOL-ఘd0y)l 8C7X̱ ? #=o aE:E%HlĠ&̕A)! "$qu ,(% .VλR5AT䶿+~.i|;aͼ zJB'1d;zyG AfQ>ͻX5ƹYZVDlbf|=#D2 ~qZHrS29,T6z$%N2~z-n&xVb+B C5捿^},KxY]q]0 癝e@7)2)ו;7mg1?~i?SLbD,?l]\b >qzmx7\#-ZvoLđ R#oc! "c%4dpm7ؤIĭw`S8o~y_>@o[n?鹘UC9RKu3^_z{n܊l<·oCT]"Q7~[Yrd}=IWXf (qP!1-K`N+4jbްls> 6lnr{7"ǎN1:jRԨךKEPoj]a9 f?˞ba3Q%kvAG4<iqJ'H%H J۔*1% IDATqVvjr@6XŨD3}atܰ;ucjn {HѹzD"#cBrFęIA 1]0Z0y`63u=3|W#4W4f92̻0˜a|Q$ <㺸m۴!:a2.#fM$5[FR6$S3'dm824dI|OҞCHMv;E@1pi)M+h+Z=kE.ڲw*{=1eM32n蠧gh(M!F rϭw!T] ]9|ƶ G7OpxF.b~b{gh^2~P8K <_5ZEı"hDQ :1$qBr4]yJᬡcaݶ4S]v;_!tAI; $`,,fȯCYE2\_=ޓbۋϧ_y$;099Ï_4r mڜAJI*&@8.ITffz|>G6gǎm\ v*5LGޑ2䪋1 cLO51D_ǵ]3Ta]Pij" ֆkd\Zh2/?mZӕϰrdYƔ.oRQ <~HXv۷kF[Yƍ|#*" XV8g fе:|:8k/tgr/bq엳j@<ח@AaʧLh#@$ qV 5Jirȅc$l8r^%<1a05Oq[_Ah0(#0hjIYIw;KAӧ&9џ N*:\D}l7V* S&_~$ZR> srI:U.#+ehD$Īݏ |9Q [c}LNT:KU(D0F.?Sg/<]:=M?~K7i|}<}fDQeY{V/bĂ&#A8C>?Sj|~bS;4/00z>d:209x|z93G |3[7 a<{aZ$4s! Zd4T{m)l _s+|FqWr=C{?sF:4BNOa ! vgk49]H[6WMq$bp(`~4ar ^?v!SlqرZqm"]^!Mdvu!H h{ɓ.?qE0,,j/mmz˭.qOAtKZG -%֙Y4$IR`FZ-$ F C"_*J]lZ`"DEoҝI1VK0sE(,Q8җH )8~IzN,#9F:~Q5h$Pp̈́C:VŬZgsQc=6^L6Ss?~qy|{H9j̈́a9~Hi|@ohYE&!2((ZT1'&XbI#! C3IH۶ރ>1Hc0B`[6J$x.lȳitmW]ϿCZ t1y2gZ4uB_•xkzq]rQ:! (91El · %&OhE3̤St=e`v CBM!;-ƅ  S=|yŨ_0-C ڙ 6Pd%897Mg&&#Zy;:)X WA'E)UZƞ <~$T׌c.dYs0ie10q[DnHp='i`)jaSH,6M&L(Oa櫫Sܿ"f.1qF.)Ҁ@v*фY&z9^ mɉb_zO!)r*kt{Z!TRi0.8/u9WJ$̌?Bw4N N̠` Ï)LBa9?̙%N^۾b:e3Sj0߿^sC/<@\{srFf*eʑOolFJ4F%Hia$Q/Eo+}!B)>^͗B$h~jEgww=@wf7G2؛"F@WeT'cOM$cV15[eUoF3ίi*qGPCv 8{x2b\eЁ$ g)|{L؆m:EhII)<& %ٵ )]>w>.90ᐱ#yƧx@v`LdwDJh5b^fH68!R"M- dK ߫),n|*z:{0BǰpM ]=1qmjab9B+SpxTr|\dXi9P./ڱi^}i VH!XɿNw%zzbGgO}Ett;aBĠ~'Tp3]{eMo#TQZffî^] K%"A3%aR pI3@%lp)Zv jCv9[EJI)6X"΋ν >33v"Ac%uÚf>X 'fCTVUDGFņ,_˩#Y~6[:p W 5%W}(r9ߋ2L4VKIؖt=6_5/]T*K:Gj$1IPeLM|n$~설XdOk?Ⲵ|)- MOM%ooɤ\imaU&h!㞦.Zo@E0{ݏe?4jKxVY^ðSz l׿ukF6`A "Q kƑYR$+Tmk`}=t|oc$iԲ-[O{ZcT2pK/g!爓۾y7R -Ū.;#1/:D(BF:X T'+(#i'gh1_߼cv@]Eߙ#4\s~$Z1W8 Q8JQxVl=aAov9ttf\P}ks]Txǩ0n+d\A.# ttؑ I4+'|3J1nx_]7𛯰nrx>NyVaFS3H ǒJRi2t{cYͩ|7)CYqcz',]4k29+)@ᩚgբRt]_X v|SWG## !]䅅>iflnJERo%vcoc _tg̗<8c eqɴ%\ٳ|X'-kۨctS w'H,,20DILO|%q4FٺI/Ya 4.W8<1s"Ş!74'A撘'V A$*.q@BͻN( !ljtS=a7ji!$8Nq=JD7aw>$lXyz>ql]'WJeM/@\!"i(V yTʦ܈8Y6tJO׭]s_9rИస̹0{a$)x TbSaz0,N0eڒf5pV$߿ӜI#)2r^ioB2Ŏ-jqȇVLzg',ېv%y}/l_i+k96i_(Y i'(L! P %*iC#vQF7: hX jaBofZHóiD6*kX3u(/?,\ <ŦxY2 \Y@♼4z UϽ\3|ͯۊtB3 h4njQO9>ƎggہSë$5X?OăxŮO{2J䙓$0]fT*1 D2&cB Z*!%%1,A01]cG)X4@&n7=2f`DX!`$Zˤ^:Aht hY=ŭ8b fk;# ۣFx|[ψߴ[W f9".i6ـѵ)R.bEk&F$MFb63(f]nͯ^ݾ+5 e$@v@JM&%(4 sABhx9b8Nގ(55<\PXzs3?_ڒK?g ȧK$>7yaq,0Mr[+1R(FY%>p#G(NNW]KpM֛xn&j61&F%6o=͖otS+wŻh- m OZQkp\IKC1 %6̅r|h_| BP!R T 9WG+ig4 X0&5.|C.>;7ES!hH0jD2 'b]~9[]غv5fW81Wȁ55q˾l~{G%S͵Eeuy59 CY8ֈ iχtuMj7|x'wXƜe[.N<.|i.c~p_,si  ,>g*<[pXtfXTםwLR861mR(R+ѻr\8 baQ¡X-U 3z(8 a?Ib ?SoksQg.H!K;sQp.C ya`K_ 6oBv9HbE)pl F׵R`mn)-1Hўa ZH²-S9.*SK#TnaO@RԄq[;x Yy[pvlae(QR׆ {.倔f9:rO8\\kRsSl\'&2G#%"D tmR8Eh5v\/M*z`RX,XMjXļ0RwyЇn۽{4?P,D@;Xp,߬|\zrcKp/K\9m/'m>{Ѿ)`51|~\PuCϪ-9ꝛvӵB29mӪEBŦs[|_كq(#Ytol[Ün]wpCLL?SlTl۰q9zy<3 `uȤc- rIb}gˉ?[Pq;_vጎ.xk0LғHe0"w.pJ-.c #kFh,/W?>n[Wʲ,ϵ={HیUPeQ16s04>j&&&  X\:~s\R1$LKm3KԡD@ۃX O ?,8sx]O5o^4XA,ǂ-]'"Ӟm)˛w=FiȆ͘pgRcѢl#:"d:Lo<:å`p"r)MS N։e9< F+MՕ % )ǡPP|k_x+.V?-LH+aZdi{ =#n6 ?M\K|'CD VʡԄaMFW{ͱif%^SIfJ BJ ^}x?%1GwO5.^Ve$ߟ>di=Lx9]jMTa)z2]$a f>Ebhj0)gۑN.H-| p[=N_6<NfNCtU|^i{.Όc6?yWd20cyl?#x9A6mmseUݔ"4kЛ=[ԋǤ#I0Ė I0)$. .²q]UúϦMo3OX6 CO$IBa2!#+\+ cl6oSZ$ }]lHDN)+o_qR}\0>z*[ g˜? @eK@.e?.,^A, 0,pr/B8qszJc 逴̍ܳ. u%~[' FK V:E} + C$Ij)7ĶA[q"t ,D''b>ALve>ׂ!L&ib,Tj0yFadah2ن- 쀷eVLLH<>?򒭛/r{tP>UuТ=keO'\cXX:]yV4m5. ctL*`Q-yJUX/׎2]*l`>O(9W򭽇l \"3@|"06Xi9H9laӓwt1ve9>:$π% "0,cqu6G#7o3UjCn o9fzkoO۷|:GY˃^>rҝ.M>.W5XPW: 5%X+6J }O*ahL笅1n}$B$زeg B$}g`Yg$< Ơ/践Fa$C' @/bgJ[Bhhg\iHIPnYyX fһ,_վn HЈNIY Yf3Є )J$to4}y_%)eU =utM|"K˫3]Ӈ; 64X tt"Ug8`1ZIm |(^_#=:F/ ֱY'lAn[L~,f;.{GWb0$e#n_ٚJ@Ƽ؏?MtcVJN2fuɞ7؉VG<rr}z>@P޵mLGu^1as"W+8JoƗv_G$m7]nefǣop; ^JEc01yNNa6RxUd,̝gai}7yҝX/g&Q3&j.Emp(5i NwC!Ը˶}iz!nR@!O$v-?R,]{uBzv's Vu?Icei_W[uŻRC_ka3Sܷ*kvs)āLnN!KZ z24rYx9{{'?㷿kYQۅ;2ss%k6m UJU!!At: >_# |^Ggdۺ舀+hpǬLwZ@iO15}sSvTL*ZlQ̝ g'1d.rS*g/Mt2|k!X!%f@dP+*_:]F1?Ar,*'dHumkOS)eI4~]k9g"RCx]! &^e'Rut"cce}< p3y,TgpY9bYلNH:ٔI*%+^HRt 㺂z7&?q;VVgJA*Y rr2dvqW~ gG/qU}I+9IRXq5چc~/H񿎓 %:p ZefqM_9sZuɤ~ӄ#]C6]TQauL2{{W ],UN>:?DHFOlTycphU,Lq86Gػm'੯OyZ,ܙyGZ+X#lYu-VO40,__(w lӭ _]hXwgՐ4dk!H9>IbR٧=?L]xF֚C.í-SNѹDK dK7:**I@#<5p׍9rCD`x"] G${|}/*WKĕ2 +FR/ /(A {K; Tduu;E)hEsϥ3ϲc8Sͷ^ R5S>Cl$(09VLieCi",r)#yPGtgH#.s1"n٢c񎼗7?[*X̱gCo̥NǬ-C_[oQNj(eTB3 {?Y^$*ɐm‹W:ܪe'VYo_C9e"$M7*fK5LiPo~bf#UY^ZWMBFa #N3]b/O>{A?Njg]>wcB*}1fR ',//A7#?w~t p/?#?^93|@ DBغ{X9nOD (ara~((O?[ݍ|%,+ #Aigv`'v2M/vܥSWy="_28.9ilM%]5EBWpH/!!"ʕ;.K?ˋ'bج^jV W }v~ >s[Xt4 dص&.$3D$7\H-nf:e.N>bxh3t"xuﻇE&D6XXvyرl}lsϜbX#~J3sq}5U9-YnOճ=>SMC\[&rzaR` v۠=u_OYŴ4n!"`X;A vB.Zu\~][Or^HlJ]G9z9bF $hV ɤ\\?@1!bõߍU#Cj! [P[ı>V[S ` ksC |VW^Z[֙-n,IL4+n@  I3rIlPa,WdOf8ह:3uM'+bΟghL7pjmj iæ;B8& Y݃IF1sju1E1cԽޖd KɹKƊaV0'ͧ_`jr#?8X\8S'cab Ϭiauz@fZWIvuԶiDz-+ SȫiI_9i $K04enE_<vDU.H@B h1D*k B؉uG "@PAD1IYoĥErcssQ1(ƿ^?d׮ \ bJ(eB - &HT VZG0 <1 #-Gv܌Zfş]U9?=Ío3RqC'ei&ok73w>rb2`yЛ€C]› Üpιsx Q|ՑON1M&:h!%b~m*F*i tWG AEvxAT%11u; DdY9YTɘAԼOŠ1iMbd8.1aG`*!zC\ K*Xm@/t\ͨ^;vq#$Nߧ:O^xeIl|L=\^ i"aǖV~MĻ^U+l7 ^}m%~a#gm6Z-"L,w[UUFFFh۬&?i SըߕhB0 iz?:;;ԁ&Ŷv +O4^2W܏./ oz#_Dd2I2|(6b1JQz_iRl/gH$(˯s Jػw/@{缔6ĕm߯^B  :S,~ s;~S bo#,9mܿ;G?_|$;vgu)=wq4Aɍ7K_yF'08Ѝn{%سDs=Mc p"vF"SI fqQ+ _(ކ`'_G{-Qt\ΞuQX HN.g e(uVVWڃ=%uJe]46R7vmC>膽KÌuL [$_oU`>p4ۺ |/\v<@,#hJ C3PY6X=h:BqHD T AJrʙ rz#ĴUƷs[?#}Ʉ :]Xpb޾m%G]efggd *X4nэZ\)Ǯ=fvY "vʜY @tC:¢ͅ%c?ǭo*2̶$;vvUjUU:^nHz+VG֚t&:4>Cc:xJ"pT p/S7ΐtQr&ԧ4SKE}{, yU V{TWTV׺IJrbA-w'@QRW8bU7z}f%{}VaZl.$f7^Mۢ7R?8Hܲ=b&-23J% ]b`k:I ֧jO)tØTv0Q=8;M&c_S4ziϧIi| "I&S&V:U*t:u{I,Lsx5X^?OOn 1"X>ÎLL< aN[¬X]=Z;~bY#_6ɏh՚V;Z.81jӋZD RG1_QmA5_dq-ZN4%Jҹtr)C&ND"²4T$ ba.&9w2ȐЀJ"c&a`]Ʈ/|ajaFi#9yBxcJΕa+\|&5)ސ8yI”Λ>Pbׁ@xS,'( MX)"BH 8,lt HZKPfdhNlL-FD*J=h7RM\F1 KǹvV>(*ͥl9g1ء-5~ajnJab)ٔ>Ы5z.7Cn'Y`gl6i~L (OT ✁ĞO B&n"bڣ4נzNͼgUD=bdvN! p.,96|o]#[ OD LIf/=,U#_/gٝm+㥗W9|;/:y~E|5Zo5F|c塴*C㄁j(Ii p!﹑?r'չ~)BEVMQ]cpi2srY*dr&xB)K16m4;HU[߸@!G4{飧4wf|Hum84.9PN un&;}3se:N@2E}" ҅8R\qi @iy,N,cZ:ƢK/OD M쌊X Oa=iㆂd,Ff;!nĜ^nHTlB q)H rmVP˔hF~@^ k[m]|]^jx5/Z|; +a#N~;OpkkѰ*Ь~TB4UV )J J*701 t F(䇲t>V7/Pâ݆BK`x]&A%D:2V M׉8M7 {vstmT´j$Aɐy}\ms<^Sc ))X*>O߮,'Tk07Ϡ2 s:94Z!*x+mi(;TAfd~̨C3ђ19d6υyT}`G&)u-$lN a9|M|K|8r}?w8BN1vmUK01FC 7R J͟~VzjU(peB ^~8O=~|ԚNY\{!UD؏Rb&&-t.јGiEڵjGgH)1 mIQhUzD3v=.5U)BAWSjEBAHAzDK4[uH q+s]Z.dU_/KFZE4nc)SBYQ \3;]:'NXk)cjMzϧ=ܳriFqzP/3=1 ~~Vy[&bqygm L%/aZx~x"F*fƢ'CLrTEUa(.1I y6 #U3YILOdmJЬz/{1q C q,B $ ;v .=7)Gw]_}tR#(LГ!9Yfh5mf@iLbNG#fXAޤ8oXa|tv6UzqLBF)RwaR:RmfuN%76H4JA z]Ku.wiW,:Ja'\:aDM60^n ǟs8{>@; !B `q1fr>NH=)C-7j51leTBA–.^)I5ȮyF~4ſzz'~}F@\Sq Ma$ CPU5@DDct-YVs Ȅ$SKyt{/p]J,##צUB]&tQVs EkVdr 8V$tQQU.g.z*l^+BXWd= rB{>NRbb]WLN5Ewաq~f!oIb-\ݠ0nS;:]!Ib )$(*t"J#< ]sJ22,t:I}ܺ$Izꝣr/WUЛ_U9lJ xcʣ " Z?~]yXB.%R(QcD#E(aAhAR˖sšb@ZHXhV0B }<D}"Fn%QfY6Q kI.'bT "Xa:4j&H4jH!^A<>LR@ :D3ϓBY8uYN/`//qdPsc:=;8Mc9pL=I&X$+g0 RQBvuQD*vM>^ $jCnQ8>ńUU M"zC5`*d<0cGZQO?Dύcc1nWI ;X;i_+@0<]_+|P qQ Di[MRȒ* 25m)x*CϘH&$ή!pyuڵTy{~)bBLR dQ;!pg BYj TO%Oaxs8IU\⮵PIEpCmFUޚʢǙk¡C$U#X|דx~<<4L3"]߲vQ2\ߚKinsSWS xbS4m 6cʌ^I W0 'R9>r3RE"'6;ORad{ZD"c\) BrDA= cX^ R8dyޑ+vjv^G@\)Y^Cw~n9O*KmQՐ qZr7/ _׃Ou[9޴k HABtEjӵfOVI$ڨ mY P+~*\^"gC5MϒHaq< b%] / \CF1*N#nU^`z5tCZw19%H(\os=Ywo('CjY% AԒBmP0uz`CHRb:= n5BVB:/ 9]%l/3)3t܈A+@$S33GcNc6IXZ𖝻x.VL3 OcV:-!lYt{.'w .RFaZ%Z/j51\5)jW/Xnfr[FY)&rh 3*rNwt_Hw:I= ]*t;Q&NrH3x"r0M8UBF,CɩUh*BSw<^Ԯ':k {3/`$t%BU;(e2=P$Xc$qzt 󴝘QBy,͎h*Nd{'iO-"E[%HLk4yUYod cȰEs`mJgZs=`tcV${ʃtu`xgpސEOpch hTLn($LG|T:@؂f#fOb lCeIacz }+yv L&T$N_O)/SF!'NxhSShtPtz0hf]ܩH-bɪ,Ϋh(8=ksЬQS>V]1P ɋqeSfnN~\mH~ġ#f.\{K+%Z_yJMAD? XB#DA` sL;&/sH1(_糽HLkn/.IRC(NLQ&"y=-x}3Bo%&e%т]Q( &D{&B8FlFL%}iYEYXFXZDBc`DOe鲯b Oϰ\5Hf0mVb:O%"' Qd㰣呣'ٳ'β{|UZݐxJG.pMwQ3SӜnk$}9o|K2B%U.~mH@9T]df{o#"+-d:ρYMnËZLLto$KB!5j[DQ"꫒v]l  5dsccz^| VfWJƳjja+99z|C{}6a tX^^8~EQ5A>Ay WA,//.Gon|CO3 &.F.D1h4[z6\yՐr,,,|WLZTUett) x_ò,F-e144*Z5 T*^'x Ԟ6L`!leu\)l.PiFHY5lzR)*V?0$" x u_yr]bȾ3oC Aq‡sײ|evüe+0qftt1İ&-|/a244]߅8IN@nˎ3VAl"L`lÕ c6.8% dVen- ,3Ʃ }罜j Q'9:J+2YR)r\"8Z-pbMnSoD E2D|$ơ%޷%G*:,,)]:%XJWh1^ ""$"k<ϓ'}hؖ FU2tEc+B(41~N 1n0'N)lRRK3t] lSqDJgyG%k4#]%fyCɉs.s~XKߠuO)f4(ԈB%oq26OY9HGG P>,DdrEV&FB2yAiCZG?^OT%CԬDchH[c׉q! MB|ƂG9p> R5| B)A q%qA>˳  )UrW!%ǞW6rl&ͤVlV 鋍ڑ+-[ a̶"Nջ ISG8h # +ph(97.$ŭ IDAT_yw:ėO-m YҐF`q<2^2~`cSZjf{@0Y~Arm!C9'cD! Aܑ孷p>P>!oӈ h**Q "QuA XM9\Sk{L-"B` 3nކekCt%D}R"RB:X =LE!ISa" uX Øqmok循䫄db+fH`^ytbק:,7Bzfz-de%d['aH4Փ]8Ŕg~Ö{y]g{\C5:!7ADQHɒ,Y9hmyjI;c0IGlɖs&H t@{B])tWu}9393?FmGO<ᔠox؍[_F< |z;qi&>b~z}h^G<ß{'&)|.O>4"Eo" tP`%s9WabFCP2teq!Taa]dr5D4>F lkv; EGiGN&q qj,(qk3Bzf}ej3d{Ҙ)’xǍyryfU\_bi[LVۤ|rBAP(J+\đUFܗ_`yI+?~GSXYy6j&}M܂tHbA&mi3_&9SeVD"bH DJH PIMmq~@8dA 4piTA?)љ@U:DG8 /I@K8&eU+ "m2L$06{ĥOx'8XR4Lݼx(<YµlP} [TKY]z[-X5H?tMB>?~ N 4c(prނ"=P#Qdp?NE#/R2@ x7Ij5 Ezr=[X&i\5SIN^~F͕'G{}kA~XX"pltAb`q)h3?dDr=9VH 嶢H9NJ/%|MrQ;MbӦ !Ì]|;2|/1"rS˓L]\TٹשI뿹c'sX>+M~!g"7j-ZW03.2awy4k|jMCȮ;jInmAwV]ϱ '(#ftȎ!ٵw7eM% ipmW6!B31զՊY!\kIlӜX#2x2ddL9^9Tex@9n㥱%&I#⬁c+D&;wWmGEˋ4Sy[8 q$ͩózk1^ē)ld6`Мٸfz1$t>A4#d$!B }:dD:/1lFVHm0Mael Wb:i@+捜|.lly(ob;% Wª3_eF=51uVE6.U/r. qW;+r1™Bq՟bg?T¶++_Z}7ÿ_[G?&H̿roCo=EEofv28z]k<9|5>:58I>[#Tĕ}*}&>ntYpuq{ ]ybs0 ٗxbqj^$QcXXv@M0RJ,[w/IR?cYT mT[ ĺr0~&n:E4,sv#&8VenlJ&K*n+~7}? owvC'0srMW1Xnqv\䴋I=U,gW2=v޲ _x3c`^pm*1L %1B4IF/+)ЖI},byو'3Ys|q)B;Hmk"m "B)MaHV$ ׭#>Ȧa >4 O3l%jv޷sS-+0744Kb V7_}޼V0ؼ0}f/Wm 0wbl&q6XR>_! z7c/l&+1;ylzS0;d ݂{ fO7X9JP W F!+3 w'ufz`۾uL?x!(Ӳ RIE@GVHҖ՗ORfy=y/x#Qf8rO ֭Y=yp<4mV{:߮v)@pUrq9oktrt }|{֝DɉxɐSW"GՀȞ.Qfeӓ0IԒGprn-;)CL:!J;z7Ej3&VZaZi^uY<Ӡ>kn{g0bgq,@tE]5:&cU0alQtF V!u,2ќ(&mK¥zq|tLНI1DPY!U$HFO.:.]όMv^V:IT8P;UsXs3|Vn:Sm@3"[Op~ZuQyl#awJnNkӳVkNÐgTCL>k}t0M6'H&á7_P,栐'l\N<S;cǿWl[uW[25ۦ]YX]d3t3aHEw7>(X&Ŕ_ipk ;]faIX/n#jXb[V ]P3)%rW\_MΎ5HL,7ƶcD\O4H`ucZ+>&a@0f˶U[5ݦ{QN7 .yB&ۈ/?VH+naK߽Kr9RZ57[ĺSIB[l 87&($i8 @  L'HL)LG`e+f2C=yi}z s~bnb ו d,sUlRfz741X\ ^OpTR\f[DG9+!zanъV"Zuk6S9]7KlDvq΅=9r] 8ݕq6fr#sϜ蔣%=#|nb.^B6O)!㦱\C)< qSpnN[g!5Fz^WRctN/h~FPܟgzƱ5U3+uM7)rr~"`lt8 y䞓{YQ~M_Ĵ!]}c!F+VoRu@62Aۄ!iB!B'Yi+B_ * QLG.Fg~y9Rsؤ<96up9{E~lɥ 뚥ӂ2FڬN[y.lr8 YL*riZX+ V̴@fr;fqqPDzǏT}YcݕGmca%gfZfL #i#<< G|=7J_ƥ'ʷ  ^/p{ .Ն>gCI]hU[b-Rhu[0 WxrϑL|FB{Kowbɸſ Z  a}*\U%||NayDzɥsdsYliI,i%O?^i`+j lG}SR }D 3111DZ2p}؆LG;Z6,Wߴ!`uZNp"?| j˚TNS!dlJ@F8v1*H 1#Tfŧ>.r~@;"Z<&Tݛ3yԬSpӒA7xFe~Lai,a2;䐱D+hJ旖@SX0K'xKRgA|K..py)/-3 ;^=}i+|^uO2v=_$X_&/f}\zv gHځ[[B$^N/u=r08)qH[6]^>'TsT evD7[B=[FFB o~vD``4h!̙Efq͛޼Rv~uآ́f j6M1Úbm[SP 1 a3–.K1 CEЎHSJ,f۴* !$| 儨a7rN1&UX$cv&è FbtNXAÆa|fAIՄ u6AcϦXhq 4FiM"t,ӠFr6,pn7 [TQcX`!p26gg)XM"e/K}@BF!="AG-z[Wfl|l.//Wx b"(/kkqڶ"¯}㾣o}giZ A96 O3ɑSk(nsOeoT˜K*g%,ӓ\ш=OK,K00\b]^iXr3!T'3?99v]⍷Ь vj虃,Uyg˜>5KyA!Iu;]yͶkzehrG3LprnW[\ ?dur^V.%qBa) 2_b 79|InkGcUU&E0q:ID*|hbmW/ `%^Aa8 ŒED IƏ5RhÐ]'"+̬;}n#OMx=]Zl5042bbzSh'ǰ; /oxmqipxnI,>\6CUfg4~ S oz;ӼoCpu"hԘmA{ {+ %?>** !1H`]!{˩4' t`y#%0Қ|+"S&JEO Hs M>͵7n! |딨yҩ4f ° Җ,iGjyFO?Źsg ƧTEzYtXt aѩ$KڢΘl> Z:ARcŔקqRٸ-na^}L4+M*FB-0|%%àtW(˼Pհ} HLAZ,/)qi4 qZwZ]$=hPf:A1o%4B8JR`K oZ|Ec o؛ŠSlng"H`uB\㇘h2Iui$ .3rqY:.ꁸxb8K9/ݻwIoo/DQKEDQDt6vVŭ}ǵ}t=L6]]ꢯvMض}AcBcb=5.. E5=Ffaa56T*]6y-<֯_ORaqq5)299/>fٸ馛RBGJGIGŧ5^ ~].ͮ)CCoy#<+|\tӚ(Z-&FfU1y{qaQj1 4R^*0x'^|taWͷ Pa[V|֓O>9˿ٶ&՛B֭z6cЬMq7us^]oԚR jz+;0G|7q&./T;Pdצ^p ŸA5^*E#bhI /D4X •$ꁦilC5Ŕ Lo}I&C|0Lp]Idy0c2\8(j)V AlH[S.]GqMRV#M<3N_\!;>ohJQZ]8&0!I:'Zvpq+ ɵIo#$ ' Օ##yF驕Sɿw/q qNTMAB%jD1պOBy5?8Ž[xhzʑjDbza'Wyϓv Ҷ|h}ޭ-cVj[6 ]ihveEgjK' Rsux;%,TDob\TZoo~+x>r Oj}}K<-䉇k|ļ0e J놘鈱-mt8PqN'qD$ QU#nF=y?] گ,4'άʐ34!DM ,ҩfglG?Mh<+q8:B-H@%1. xZ"hCТ:JuѬ.;w> !PDhs^6 :QDE"C " u:ʫpaV^RZ\F:|7g,//+JwHc;HZ]?pW5! iW}aڎ-;.PeĉkOdb!mȘPi`gbk/:U%SJn?} ~~:zF!ʑȥ%P!XFyrעОTt!:J;yMSXƧ7NE{8g}ɷyzGsc,n'YwD/D*-NkqmJ3=1 sBHT1 2l ;$:&8 CTf8z$LiaN0AġCe2aiTr\I.R,.TuÑA*!Qh1iIH(;I(!x@\\ \;/>ޙ|gpqqqbʹg=жnv;0칑jɉ N:ȕ&fkdKhF!x80HdR`kk=/1J 6 } &[3=«BYLGTOƸd!%$sЁ0-11.:rܽ+|/֏W:;{'Kt9?PӳAB{߮`۱L/yUW#OOR8{^™u$!z{%vfϕ1YTE)'`{Vjð€$9[̝/deZ<|yqSlrL0HJ=PDIlM)%qLc!I֊fk.HnF:H4 Ry ;0 A{DIthV-`S0WGdgXKs`z>{P$8IHbEĉ" #NֱR^/Å~X55X,.0k'om`N'4UGwI٦DYAbkA;R&Nྒྷ}$6+oJWFdM -IOJ& I:)*3$:ka۱MԀK~QB Y33kF>b)$j%rh#ra<~"<{Oߵ³{h>p.܁╏<_ۗ\g6 O]c\gl=ͭ"nskx,Zeo$QWJ1_@.;4jԛ㸩7- bemdjw?\Bwǘo1[Wh!ݱ@P5J HQH9$Z`H E0?^k ,\IEJ!wK4BطɥѦCwLP0fKm2yAS.E'qFKˋ&g5O+oAz g *t \tCۈDǠr^0hAkD^ #>տٝlÆWn>![o(7. pKyazf8}sΤ@u0j'qm1)6 4=3x $qYzLq@0 ),O44CR8̍otA'l `sUfk1)8JXfs*Ƴ5BJ i`H !h5S y=9"]I163fShB`Rixҥ$C?R "4-t!7uQ.SI x)TM>s\>snsWű.uwX+uZ|~?O16zՕ&t˲YŜYhJ# XCEѭzcdC˻2-,T˸:3,i`F VIF ҆%C̪4 mQ#4Ξ;Fa`?SOĞz$fBmf3kx؏*#SpQ TЋ#|씍,'s%Sb_6RT݁ d2G~z#{y!14Iآt լ5bDSP9,bgr<9"CVHewVpㄹ%B-.qF3Tz=;X9mS7]ܰhc^٢ҟvoYnј7y_WLc^jWQ `h. .^Zs`Nۺv"ݽ]AaB'CH{x[1=|oM#yG `|O*A-L"lz;+gϐ(((^M 9`yXa.*Nd:CC!EK(^*Aqw0sg8rxX"5R5# XBkP̘`bJ$HM%`u-ü5tj?6}!^wp(%/GL^l{k?߾ʾ|Ǜk:,/-biꭄ IqrɌ)CRpG6]W2y,/ 2(lQSv&\Y<7f{W|HLLSTBYV@S\y?C+ "ζ4,Ab#4݄I óKȍìBt8nΎStQ3qwU+&b=M3_10a ڽX opJo7k9oj3mń0s ~KИbiZh*ƕŠ$EͷĤ%Ь.I]Aq_)r O,&]Lvmn}2FWE65;\>+? A&NFJı"R$,68;[2\6Y[fjv'1g'صHOͩ ӳS(/CnpDOy\[JV;4%[ظ)*T*Jk!󢌨m|tbJ4qӚ68]LH^LF9}WOֶ1\ O']W4L_&W-d5TEwO-ҘkQ 8O0DT~Cdzxt*ն+7 mŬot4?,*?WPl?/4W8kJ7&RTO|sUtEK!WX)BFks|To]GD6iK@F) 6m# R.$ښX4&zݼc,C;MwCJ> _x^!حUN;H¤SJď:6U?۔twhvϳk:1vۮľ@?#"骍8"ft|Cy[aw||x#x)j\1$*!r@D]gڴ[55KmvhFH?eK;۾/ᢸ4{XUa\qӆ(IgRd iwiD:cn{?y]W}?{3̓'Kd[ l fqH6MVX4i`%iI ZҕMi i 0 6IxdMd==yg_='Ygxw=goݣ<&!23E;Jۦy/ w_?{3c=l'RܐjKLB&hd!g-qvv \< yW߽ɯ?"eE!2AC4_wތ*Q؁B l Nu i@l"LP7STǃ%.M_ṷ׸Xӛ_á8mFQm{bS?w\ޯ?owӄ]1$آSPKsZEYIRG00l,YC %Z[Xj'=οv kmCj139sl'79HOS*Ħ-tQD$Xa){mS)c;l"Ij>Դ pX;JaVdlfV't>ZBX+"#/}%m\kRrMhUjERx<,3 `aMeIlNҩܨKqQzp  z=9W穟.=Hd}+/%3|WrkPZ9'/ur}' ,j=?$Ǘ&%bi(ފ3=KCݏӋD)L~Ĉp1dt( `hsaE`H)e5^׫bn%;+=;hz4} #m[gd0["ނWG $ != 1OҜ"h{}8^땐NAj͒GmҴ-QR0pJbs-&-dԭC,RqU'(Q|G6B?L_Xx_U{ IBO# 1V!sя\.=_b9KտǬ~_: RJ 7ofyyfy0˪DZ_X{, C6oٳgi6ߓq`JTbdd3g| &#`tty~ל2n}^>AWĖ͗<9|7v^Foz GoFiD6skhҌ}vq͕\w>R3E?D:B1: yd 6C4ɟDzu2ڛQq8rC?)&O,T9>f:tSOH\"#B*,RS ;޼{5w= }?tqݎi.FcR|[_q.V/c6zCr/^tkOs!QJynַS'VajX3Иh"!-ʱ'@JK 8:(rp< < hx| K":cYH}gAzz]k()(a/VTȍd/xy$ϗ9m0v ;<93ιщCsϞ,|\{ݗ9;R~g<:Oo_uTFyN}|nHJA⠳,Ris+{ ZiP.yx" [qť;xn~^q]%m. ѠR WvtS6l-}EQ(G JR.=%vnǠ;WS+B=UE!\"8Ϙ| NS&mJ0Qàlw+]Z*'5ΌY ̂N&̷`mSpQHpҜ2YlhyePr-Ȍ J,4Qu:hXZcj(pfvs2:Sq|⋔o_lsS2Y>p/W:v6=‰{"&9b#M(3HwdD.22EV>ǥE qAQ*& k sa1A[B)5%Lx=~Y1.}C ts^bf;;W}f-MIwx6 \@ssݬnU~7]uo]?|ŕv O1byÕ 5"]BHӄ^@s8EZpjEf^`-k ղb7 rЊ 1H i*8αRq6iܢ!4=3!>Y0lۺTG|0_y Fo5ZRS)e1(s v4<\aRx4;QNI)C:8J RQ2[× `hS-QFfsb?a|v|kZhI$”AzGaWRZoir;?"vZ1 rg切3uN:MqԬXMEEliQ3VUR+BHM%Z[p)D3T)=Wm&&Sͨι0X/7.~)=.T7$6O}Ǚ]H}Th.-sTP^ ]h+1x$>WF1SNƪ1;TE(I L)y=%ØHϓئ`>mGx$Nc ݋!20__L A!t a=RU coj29 /xk %Z i> z/'r)n@ePgeRv-ǁRho=@,!m֋dqؐ&ntl[rD6%0.`q -r -"n4.t\I%(^S ddđ$(:'Clۍ"yJ-RJ]OM|jLq. Э08XbE*|:7¿B7_wMK_cȨ:N.C$"í2jI9. N"<}RA 0`zAt/hvR1;7Go#ԗs4 xrYZBWL($qޢXt4T1RPArя2SY< jA!/ :]H G& [M.L[|̶gZg$%?a[AÏk:qO=WǍW=X6_)n ש\X۽XBBUfN7;=>ܫr TG#}jR+=[ bP*AS"t!PI^ƭhK)I3fq^0;mZ-l@4H(4(q|aZ)?nNc`bOsQ[g&}ԛǵg~tg9ϋgt e!RmLڪ͵Q\[wsl;k^{̚emYy5 dnF?B|-([5FMH `W X JRݠl gkut_E{F^݅c^FPX/=/1~XO;z y  Ed u-Bb#P=GyzA0|28K"6*ZkY ײ >Ezc#;n=b=Hzb 7o^p KE7{ u#.1\+x)7}U U. }l=ڵX/๑p;ʷ & n/%|_n{a^$W_*.t1lFQ\|8_,EP?vH7:v|_^W](@',6:l?ppXu 7v|01ͮ}>O|_o/ACCǛ޾бY+Rߙ]Gq/tmBse /,`?xRps_N@趋p.<8\]A\aR(mIENDB`variety-0.8.13/data/media/vrty-users.png000066400000000000000000002024111475753071700201470ustar00rootroot00000000000000PNG  IHDRdxsBIT|d pHYsFtEXtSoftwarewww.inkscape.org< IDATxm\u?yK7dqH(J&e[cJ cppA`mA~#SʖZopFsD6YCU|&9I3Ҍ3vUu[z=s{TOI<'$ēwI<'$ēx/0>'$ēxKOI<'$R<xOI<'MyQ>dۊ}D۷߮Ot}ADmD۷;[I 0->4/_P¹}8{y?M|$eYKzn.ʮ$?1e9+𰶳6߲o[7Ф-@ A`ø3W…zyqg~cvno;(S.65ߞgϞ}V/:vh{>[}4g^+sm/(m(gaͷq+Wָp<^ޗk^w}i`xeZ@pѾq,0oa>w\q<3g/saX.o $wKR2M¹lEx6Wq`~E]x .W ey`|&Y|kmb\=0)\\y:-wu8wś wU\ۇyY*n3 ^6n xaǧw<>3(o\ X.@V{B+ /W9 l~t釁Snԉ2}4R`k 3+ƅA>["+g6͛3mFܝs\ .k@M.ztWpv!9EWp8Ο鹶ш`2l8mu{W^oS]]ڵ eP^xIIG:%bճC:6F#:vk!mW;9fO7Y[.0e\KV2}3ۋXre6ɸl\ ZF{}s'~Ok:1me`QQ=:3&Cŕg/\P\H~so]^IkՈ6_?J0cLbJ'p#?%kvn j\BWXk:>W {fSkzq}|r{(7lun/.mYkAs׎W\}+^|iDpg BtB0 tvsln~{PȣROtԯtz;ׅ&M>ˀ$ž5IE"~  pku|G6@RuwD8GŨfpp1 lЊPZi;UOg&;9[sg> 0䲋T\)7p~5aׯу5u|C-Klדiz>6M }@/u;*ZqH.p@n"_ ^hmt6[`m6m=ankj,fЪt2hh)AwUC:Cr~F 6 Qq.;͛SO@4kt@MMP)[: ٸs^&ޫZXWv=\[[k׎`| @\IRCF qMvm@f-qi~AH[Gv}"xsi': S Z*--hWC=X߅$?\"\Zr\׮ѹspShT +܈{%nLNi2.hm 1;&"̄>^՘ƾ6NCk@uyF?}Zׇ"/-$ǀq/mƝ.aXnWv\O1ymGjMI$N^wE'SUji8]MSSQX4A3G2/N_G=ǥx1Zݢуt{|k+4v-7v&T5P1RY.#@Ji'Xku Z ~K}մ*d{Օj~4Y:'ot|p^8{A/C~&9!Q9qo).m wbEb23M˙yI[cgc6VuڸFmԹZW7:SU)˱޿_CAnۜrE'8/ ś;eZ[25-q7҃q\E␈bLD14euNygرF)5Ϊ8lxR;?ѕԑeP cARlkktQj{%S1@^CUE+EAy w|I+(՛'ok:d_y@o.=1Om"QprΔr"TsMS&cj0FZJ):f:gȁu9ҌϞM9%Z@ф`j*jT)I=Y@rjH۷oO?-Kh=䒶/. i cȎHB6 =][jnSA(y"4yqifek4A q2V+I֨Hin~DWW{R#yTj@p p/_K33 WtOy!Vs-kypQnW~WȰÑJTh٤(6iSYZבxe+'aU 5N*+I_꠩7Iе^u4K;w=`$"ZlK{zgZ&wnpzsq*-zIM[`Xږ5Y-sL %2>˚ kV2*Yˆp!녢HEf e.BUFJ׷8}=Y% :!~wC} ܳ]~df6R+h -Lr`K,HM= e>`tBO-@$6= r+l!6 3Qb"HDI Q2agU&rR"⬨XB&#"N#Y$IH[YIɱجʉiv]z~0=K>zOU4yMVyM=$pr:1/aߘ.%kLM`LDBP+hۊfHʅvyXjYLs[7c@Brшs2NzM^?=pg7. w8+9??\4<.`w!Ę 1:YaX`Ʋ: fΪFIBIiq)((+kVb#)UHD(KD6DYLjR&ΎbSbΉ(̹kL(߈TM6Y_+WYYZ}Tt7Qu|vLp&&g2iL06MhskfS4hLb'N8qL"BbT`b_EըkęsIe#q3.K&Sexԓphg0,2ʻe(.]d)@lLhi\NPFDS5j0DĜ12vHYXըUYTDH92@PRt29*O?=qwQٻe(^v\"n Ok &^zU\n9fᔂ9Yj$[km5&[#bkU ,GM2HEHը@UTU323,8sJ'I&cSk}RLe!ʽid|(ȣ=P[:Jqr+y"l] #6&;Y,ֲd2 )L6ְde3(a){+BXYUU&*J)PsNPI'CʖK=9xxUN]xntRvV./y])h0K,yk\-x_8RaVڂ!Yk[j%Z۷8 `Sfʎ2[)QU԰BIFDH sM(R"5d64 6SE T E'2>?7U^:(^#I 㣡xoR{t`,&sV0"zMV,"06QrȥLΒX[ZdEa0 bj  &U@&I2ARRN4B9 k4HjKL,1%F6"7/n5b{G8ʭq=3\WH(BWM%"\vцvM 5,6չu gHdM  JL,yfa@,([eʞM*&'&9vǎ+N\ I.)SSS9Y.㠈i!2;b'Y=9"TGBNBj)@`!%H`dQ B@TfNQDRI$Ja)f((DҔ 'шK9 -r[ /Jw L.s 0X T\D뒪kpDߤֵW.HALR"MB`0f`FRu`ae1lSNL7+X5E,O="DGETXGvR(9;Y)ԓS;"5V*6ݝ).R(f1Dbr$gK6Ev1صPO6;"rp1-֒Zec tr &`Ii|G,stF[_rv rѕ](Lvl2V񜍥JE43i̤Id2[\OuQ٦bdbb"q͈b9%ۏ1pV+ypYw|QP fD |9U#wu$g ]NmV/ /ވ ZWCTgpȞ=|7%:ό7+:Av}p_%D3(g-b%ƴ 1gU dAη L"i*5Kd,$;q1չM$(j&ߤ[k%Z9Wy7QܽwM&Bթpq|Qs/< g-srɳ(p$<م](kYl( h("E0G"d;eOMes49ܛrYqSOv|3gSn9ιL ̎Yzc 7WVo@rԏGnߝz啗S?ӣ[F9G-tqB3~5'>qN>?ì h(! B 1 ((d!\hOy?y29*ަCyԢӳSt;4N(_Q,&J. {!/@Z&ll)W&GXrC!r9{2rɂ=*4NO >Uh "IS$*"S!g h`sL| IDAT=NSެ 7G'r}Zpb1;;?~Y!WOcpqƨKm|aW&zmQqK g+Mt5BrG{Ŀz{d_o#0"* ޼AO?ۊKbREj)B#6(ۖ94 mɅl(18,.$r6<ފrȝ#[2;;PI%u~fOM2b:[b< R)f`T\KBaͯn^D({=9}X_-K|Ls,-3b5[62k4!{6JJ8G<u0UllE6q" HYs(E>wjO y 4E""P"01c*~QIZ'*vg^Mm-l, jD6!Z)Js;;>EoȏrP`ʒYN] SɅ1\0k"1[¿K?]9̇o\!yhbt  +_n޺~ԩ?ҟn$A[iEy6~C@,  $Qs4IR* geo;r>N.źָZJ.fY VբP2 pd_l|$\z ]yTi_`#_k_{ /tYZR %HK[JԲ6V5&$&*:%4Jypb&rC8>}qgOJ.XƬxZKIH; g{%2ph.g_vѵޏ‹ñ9:87qA񌻅xnFߴp$$x6x=[nsx_ܺ~$E6mm۠l# (ژ5Dڜb*7HA MnM8~W`=OQqi|66i`z!1dRIJTTHgL5}9hKyyB(]+-O/Ϥ-6šƒ6bF,9KSiӑeJ 8>9~;%Ax(i]1d $3r$)2h.Ţ~1)H ~=[AUڝx>LL'Yg`rxj҆g:$xk%u$- dB4R88|CƍxE `%GPoH.T(L$BɎ \2qa /南?qm;++~/bC3YV4:lZV!Ɛ%"GSIq`*px.3qB .{=.04cXsxŘf;Y8YF!%-\E21ll~?U`X޹ przioFVRC"MVjrZV9j0mXJrҠx/[A7)y8`a ]vVϾWR*C Oʎ G[>_rg|`%ÿ_wtV;M4u$=>~ ͛5ɾm7AmmT$-mA )h"r( ǧlɵGQq6q{ CĵKYAl P)%,(U씝_Zڜw3@T_u{à  [jul B hYEKm*h EOp\$mΜy)vzMؚXsjj.|XRAX&*YsJ:ڿi~Ns->{QPEN "@-S1;Mr"U+kի¯|_\dpMdhH17I Fc\UV:_›r]Y6էkkkpeY"J۶.ZvLULaB(d@+"̨>WGW_}7cfU NxգG/{9kjMTFT1hLA"6:łyNX\ի?}V+O ]fQ|ZD}( +Z*deV[1sLeC>'~&|_͛l^P [C?>SڗoHnH254QcmĘ}lqviP`W_9oέ=sfk}J`s!%UN'Si-HX¦J +)}dg^~eDBX[ /}h߄h}sχ.^ '@C{/૭&d(DMVӐMP)XumJ&'Fؒ鱞?^/#}9JgNpS\@qj\EƵ\dE JC>֯V-欳ᱯ\.N+b};wYyg8ǿͯ Scj4lm#֗Uh q89i>w 9WeݞCP,V=i(`HYʜTJX˔sAUȡ?~t?Bi,XHީJ5~~!bLqz)@5,x wG~ƃ:ڃkS;Y*kP $8p^kr84o;_⢧hE) R)(jL%T2G?O~yރlR|WU߹}{YP#S@5Zkۤ$-8 > aNټAKv%yW|iu>7:Ioƕ[<kr/ 1P%3W`L%DU>[d>EyvR^oo;έ$&:Snl暑,hhkEۼGIǝⲄF/P,l.6Р0NͱLa)Je9VQ9 ՇVѪԿVXc)?K *sÏ1OFVz+aD[]O-7~~ăH΂::ZբL!199{zq*;\ٯe(=OGX%hƹXiC%k,AZIGM愞BO~o>"v`X$=>Mno|v{Q_A R^!}"t+X+K(ISOZV{I&=I!9N/_@50s( LӲ)Ħj+X.=ԇbЕ?iFhΆ\budPyH yMb_JBQ:Xk?vU#￁-wOmo~GO2o="jEє$\(9mf nЕ3>D|4,8"$4Le&[iFWAO~?⯾(hsC U.eolw&=ņu67^\_!`,}c.4wA k -wqj-,7 >}4-XkvՂ_>?Oqˮb'8Ρh%)#!t肹'@_+''ӓ2.KPZz- O-; {},r*?'m߸OB@?}n$hi3b3m6L”ǯ74 ^~.xZEɐV[, Ԡ U"\5Uྈر#ol؞Aqg8:Fl ả+{*;@ 5 &?^|g Z7'o>py}QTs 8.{RoE|.qv4[OT+˗wԣo1.JmN׸sӁGi4f6*f3PFe{8Hg~_ 1m;)YVB ږTQuMPbykFF`wzf΅WyP6m1\9w"TfՊJQNV鸪v̳ݿڟBG lf?4 H¯`ob9 7aI=i^_!6)fB-ڀj0ZeiI8PV6H[ȹϬ 6.*#b[l3 ݻSZImHŸѧfu<E  iPLgSʄh 21 y+U[O|_?ddL vfrMvX61jNYg_9~BP+^p #\FgT<@Z4JaC(w ;>tI"O6q"WOox qAv}د{scf %O.%)|I$M=i+ɪV$j)JVJ.U @*V˒J9R*U˅rٱEi)$rI.w$X<`^wf뼾qΝ`v0{Nݿ/3SPj<VPW4Q ]_*`1~ S<|VUAxlt0jIC4Ta)EJdFyEYa,>E0Ð02 ɝ|]F{\#<8rrw>Х7Ze0il+ 1"`"4@hP34j~ՋzKhC=s&F$  h|鋿`} G!(U3P#F#|^~>jA~ߔU+]RUT8!#3: ,\ljۥGiqq'N+8ruG#sRՒ`3[wf^J IlLe44@p3ү]o\! AS>,M( 4xhy?ss[}d^Ս@̀Ͽu$o?$ @c T9RTL&Ξݯ \\ij'8cþ gWN`A6 #>edwe;FiShҜo,ܮIEN_E1 zP@~!Դ& 3seHb$ҀP`j^TZt2צqkpMe*T*mep`.]3#d@V^W gA3߇}*sO>3/߳)p jīkOJMڑ:[a 3zӕKGi"N8=vo05Z,ZOf04yim-Y<="R"aB`4Y8>motǫAu A1gXtWaCA(g@TՇ1( )ͯg,GXy*3]l M?pWgIJWƚYU +ĨH}sB{XF#u#8uUE:ZmjpQ4M6Īu>\@al|G[^^W^?[h*$B` _O?y̻j%"}bU\\@qVVD?3կS݄N  II2< 5%tUDFҒ^Y=~8]{dNX\v.˰-u]̹+=D$eDڴ1Z_| @y(/w= ̩C<2nv0HA~xi `[Ǫ!2|/2vn*WWN-8^;@6(XQeCpjCSLckd״l4{4xNO@NLex*7!o؄MTR5$n HL|tإT{W1]"f3PqEѺkUzJ1$/iQ@IqujxW4@u󅷷'\+ P0J@^,W"e?T^X~/eqt|!wñx@Ô(Aӝ795jY8@n0SCh=/}җ!BĶby,g6*-19c aq]v@01qҶcx; {ŅΡF Q'q:p[M|O}{T-<)TTĂI7$N3SNy፥ځj# c >~(@ Њ vqIG@P[o?\e7*D?cG|׾J #J@ZhƤLȌ64%*uv0 WÇv(B"6 Kl1,Έ-:e*Ѹ4(a(7¥/./`7-Tx5IYk5Ts}Oݓ+gY "?gPRlq_?i?#\EX_p@Ԉ$*ҰRtʰʢilKE:KZ?;jVI.(7ZzFH$$ N&NƏK7)ա|S]kUձQn #j?H_$jtB V%8Aw amȖ\Qنv; >OGVp)?vgs;hqB=JG.0Qi!GeT*jh w { IDATE@KNcV=ް-Jw`m kk`cc{S)yUeðC?PLfph3?cK=f0Ё 4ج(MZFE+$©YWMpsm.9(sk)CS!M7!~/_mgji[贎vi85IayhMb&Da_dEkN]lta cL6zecKqڏ?3xyoC3P|#+|^+%--͸p!bk3CT(ZGRR nVD&myCO\xWox/דTf6 CloƏ_u6UL~ mOfl:6̷Q}Q+P #>ȴIy\8Ƙ0 dwgcZ]Bdt5Aib`|)[N#h(@e I[c+?Vlc eO~o{Go1v_ws mZ\_0`"75lwoxד*ݳC.҅?VAԇꐌ2QN׬/bE>,Gf|tEVgPf>y>6~g6fOi(vF4)7܀-krGg. 幥aQG*'K*1yjc~_{cc]9J/c>nt*2q> ;MׯTeT?y%}1Wс14!$O4eY> Ͳ4pM鞹z+_r,JF@B]SM{%L@fGv<Ó5&!;3(PSE[Dc&D|=Y }{gg qjZFJgK9zp4i(Is0?qFQ84qpԐ_ε~Fe@V櫀 @O7MVnD׾W'U M6ii·\iم2@0"fms?G޾܉iHE]'w)-6=.Qj NE&bUITB# 44yYYW<̑[=  wJvڎ0: O⇭ӳ5oɓA7IhCT?4)B)<"B1+Vh}sG/gܥQQ@0rPlHw%5o~}ۏNFl W{sT/+m#Ց< jبW3,ސlTdR=R[O.9~-DDǁ',ґ{hiq-KLִ:>H)!&D)4j Z̧N?96r #8\t̷oϯUE`ftMi (aj?w*|} A?\z, rDBQ ׵") 1  *Ίdj#vZM1^½gc{_|+t ѕYZ+/r3n#3[لROʑދA 6"іmxz`ܦ-ItͿEOMSC8't8`0cvQ&&'"DC:assiE kȞxsoSoAvtA YS@R,oB(.5El+8W* 8pWWX9NE+: . Ppr^Ԛ׏"]-;GboNȖwܛŽ&+ @{ȏ5GևZKKO5D%!!RP%"jr+Q=zػw/RveqVK J7#q)>2qAҰ2Z$hÕΛr Yh'k$tQ{ב[ggw2J`X TDVXZE88َn\{D=gm ݁)GJZĮdAClEBD eK*h+â[k=eya"4@;ma|PFH,^ ˃)&`#8*߭L!%rP( *$Gy)`Wp߹_۸YWVЌyX7QEYш@1B;|4V۟`mm@ K]Эw߂jU014WR@B xoC2C(UjPF dξemh@C8*KNK+mL[Un'=V',b[d'cU68%xIYh<!2~tv"jbJĤޚE,"1{Nhiiiݞxwvfi/ު( C4@nx_>" TRĠ/DT(4f *Z"Pku`Dlm%=Jx8r9y>ONBK?@,# 5Ίz +(aؤ_0XP#p-nz+ 1w(QW+ Ichq >1}gjWoIA2*YZG#s/t&TqZ͘n%j'=j;E[[V,3;  ˶q+GOh]q!!JL(sg<#x1nl_6P;MUX '&`VONuQ)ꐃʱD6Mb06O-'?LЄbPl#{N;Q㩣Uז٣+^:LZq12M) c" jJ 9`<7<l\;7#vݵ(P{0 Є q4f I\5edMBf^:͞:Jp,-nSiq35+T֫*l}2(HQ|QE!n;:x}4Uf:,t<Ǵ&<{e*DpU7ۑ2^\#"!lDJU8’Z3J< D-O3XT""xT%J f0pw|FKKiQAnE -VllaB+E }ʨ݅aSQMz͢"nMwx[ FDۨWFG.h)Z?}Z6WH(7JJgYY$x~/Z/JM0IRq 7jYZOmY$\񈹂MiT𿢪 b!Db(.4--7Ñ͞K۠*_[Sojw7*X1QW{l-Qb5ZTs$Ab27/=G]S\Y͢LG)4Qxgv.Ef#O "73jUd9` oj2el\5vӧ=K5)2M -CACdƶBUYuRnl 3VWV@\|ʛubiK҇CUMCE "2UAӔ&Fl&Zƀy_Z(<8*Ĩ)QYP4)X=QI.Y8ܨˆ Br8Ib 3\/tKw!E+Ib J(ՆfR؇>)%U*.҅Hk{ϝ5vvIEWh18Y+!RB )q /_$eܷZzequ3rB7~S*Y)RF4FԲ1 6#4ȯ_3y\ lBjH -qXT}= uI"`U5dUV;sLuW&@TKEd`Dgx.|⾉##N9,647UqggNmSw =LƱts)D4oS9o9J+u:GGA5"ȡ񓯯g{&lEҪZA rU={p݋{1d\wW,TK8~ţT| ~)y(G3q֑pn;88Q` OT8`sgiVrk:Kt:[d'"8eOe&5YYQHD{08ۭr!|vkJE^F{zFw}_%0w@ O=|- Gz@+JimL[]inۥ`6BTqE~#O=- 9b)V3k Gǣш._kssߥdloAJs&0F-8q!ҀXbi3 KPLR4IHXPy߹Q?\BcRrdT 16b";ӣu.uhrzy9ek4dul Gg6C9@ŝ RX 2|g 5 (M+PjPu)# 8 PA RmWV7|bc"X۠d,`Ya8M [$旺jQ3>7GMߡlx˦TSx`Q#"' UNc]4ъCVd%~3Gٜ 1Z&''q |;ڌGcynAg((GBȡdghiMFfTj˴x}}rE m T@Qzvҝ#ke(9|˜kr /,X}ݏ']נ .!K-^Zh<0Xz~/ Cd scEM=;sgAg@tB]_Y#g0JG QϤї5~p}YqPPuv!ERy l3WC4֔xDam6Q=ĝN} ?WG8w o, |[>B`r r8K1S2zmF9H> h9MiպB-D]{(ljc?2/a5&bASƒ f˘p;Yʿk$2 @41Q}hkAfma ..}Pg*)2WbH, X*ZN9 hY9E+#g]_o<q 8N=B88*zmlJ>/X" @-g W{?]X AL@A'ШpO#{GVSx((k@QZm`e(r9ZȐGPoVAH)7E۾+ :&\Pos;Cf8 1FVI,8 ˭{jCI y U<|Uq8n`8,??k3,!r ]cJvv |_R +DU2x9oh.%,[+\@ 5VQANС^y[}B ]y=m‚m4" Ҵ6=JwU!r8B9AE{U{@E{[.q#8կ'w^|<8 5 ` [nN'm6H|J]x`ROjd%qE)k@]|{X!NG~'߸mLyz.ߕ!W{~A,QnZ SN'pIj|e9[슘 c9?98K];Ԯz渒<ğA1i>{ Eهt+D /m )":HGُs<y#ƩQG` W&fuPt rNNbR,a#G;،[g-B,\qo>M騨[]M@ Q a( IRՌIA(f--zꃐ DN!V2kY`1p2t{αm4{(x2JNw˃P!q괂dl(nE bzDĈf.ٓc*U:q"u uLH` Ts&fx{p\rJC0$: ~ķӷ3fnMO!{hZC.ǁ{ ث?=*غD0 T#BYSrLQG%<$vSo$76ZEFhkmDmd.Ucj r ӚV U^Q :G=QL6e&Uu*Z2֐USڌ%q #q"hPo%Fi`C3^1 ]vw>G-⨁ Az߾9$ sa E9U읝3cy (@(*n4HyD@ ul"eiY`M!%đk4h5)*㒌1\fjȱFOnUoo9}3D T+cvͧ`"PF(]lb0Iϩ*RTF+J<xx_;e#TE^}JjURu3f)[;,oҰݦ^;%No#Af\pɐ%C K KPGPGG~w'U?a< G +8 j;zJ@q`p|੊}]lA {o3&r*nO5w+VvI:Cd*-kmixT y"24z+=V?ohMNΔT CF!VnX7:~Ug03X(4%n}H)$jeǎcǑ')XQ,'Rӊ% ."0el{?{`Qsww_խ_UF_6FMti.19p+ ZF\<@=YM>~? KJ(y%\Tld(zr,KP'QN E& fn!f76}|#GnCqpYw\ n "9t2E]8pC/n:LnZN4wp}THf&꣣+kSWIRS 27^Փz+RMv8@=T}۶oh+[ |0Yy]ve%ݹuϪ>\,v2$"E %i<2DzvH1?P]ED 'ع};@zBΩNC(e#׵PK*Pu1^g2!2{Q^ćIYai0b@svӟ^H,oo%_% Gy6!)|Tz8:mtS/4OgdN|j;uQyQFy'٨wzSSs6 pI)xL@~-ς; x;pg,/z%rd]` 9/6fNi_`bdw#;+/_VPOU F'TOЫߴ%S6l{PnKyZ;%nawjB|%t)˲j0ܽ A X z (].etT49UkT3WJ>%[LT2'*jՌNJG'Gsc߇0q54; ?~;v)1w݈w 86/\iOzѲm)SmjgŻnw&Ŕ ԌUꞘێ'3d h ˋu#Ԁ5hHWjhv~M]M@}~("4\i{24R j^_&VE$FK#Y?W9}܀g ". wURk7^,EAp։8köW$eZĵS IT'NB;޷-w'.5<s{*!*)BލXa&yp}&G1S伪2 * 4z@P:^3Uj0z.mY0꒣*Hwvȼ- }O0H3US5ƄM~ nN_6|D݁L ~GF{GvCx4-=lb '{vg89UFĺ"+-KY) raŵQQitgѼe箸%aqM=mwN\g]MvRLVc(zϿ1dm7ߍ|M8q$;zس87 u ɓ oBFoI8֓4%g!e.HEic& Aع ?o !$@w!x)9[Eׅ%7#~'B>zuB4lԘKC8bm3xsWJ_ÈT'3 T[uM ){1oZZй⢃Cqn]  w8 oFUŇ0[X0ܶ2]|཯ɧsgVPaПp{kWЗ _^܉ z^v8 8=Q@9q"zP[4ʤx#ET v\+cZ gbM PpPD@8z4lVLTfx7b X\bso x^wⷐk~hvU;D!Q838uANǵ2*ٞO '\f^T MTqNPx7n /ilq`|,hynI̚ P" S(3̏ގ7ڑg$wU-\p kэg/M&|8 0^ERus"EBH`!5Zj1Dt  z]ƦMpV>"tUb/7V!;g?6բshڀ4P795>seeﲤUT"4zQ UsWiۊ 10kQdXDZ!Nʼn ё͸{8ǾwOEQ*:ۻ#).zymdD m0O0sacuҪ'Ɋ#8RR*! QtX*'۝ ־ک:fNR΃;A&E;^ o-aж]H+@O=8wÎ˯2!|;D~opmwo>`n9o_@XNRL}pxD@|uNEŢ3ɵ'AZ"D rzEvxݘ(0ghAUUYgyc]{ww;~?[ 8l {xI o[n1Fe*S{Lp]G̩p߆x(4U"jSul]rli @*,:SPUH6=1#{ŝګ c_}^p|~*0i.N85aE;}wyz -~giRܬKMoǾkA--Rp`V-*/ALĻVi#q^3ѶɜHLqy]Fwwmv^ ^vq-C ^dw߯;w-19*x?$N@4q"WЈ^\SIVWR4``Gm{/*tN-/hu0fT<%`ci p7\!C*!c0~Au)[ CC2O&"*tN̼ĘIemeڴ "D$^DL%BL z'zB|QYlISwssߎsAߖ㧶Af=C` $?E|y9lVAѨEE4mP Q\QkɋJKQ9ZuOEDL ȬΔLuAF|wc{^L&cu4u_ʏ"Upzsq@wu?&m#fh6O^HQUQ5Q/ hmaR//NG\bt8HGA/^̢BDʼn B3f'Pu 0+-:efA+4rZQ&^< }aDyI#((ZETREqqiޮ?% @ `!9+4} hM*E61vqU55"eDk2߆<+ͤXj/`:FSvgξgburEyՕⴂc?_jt%>D:djTfa3<'J*Bz5qb B!`Z RQ Q@'m4'ڼu3@"G7̀^g:z7b-?=o[u[ʃM݃ paxT3C,DLE553ED`A)RXn7pN57<"};PO&(QLPL(ʸ^2" &J{4G)bl4mEo, Pb0 5Q0eRUXG*T .O7EW A@In"^*6Gas,XLHf9`T цBd5sՙNHBR6>˭k)UPa{VQ3;΍7Hn<8u F+o3ng"BM|99$(!CuoHhN(-2 a.YpNg;%?S?7cqBUm܊,m&Uz`F,S!AHI5 M7Įh5mă܇H;r0mFo߁ K`Lh;o>7}BEф xfJIv)d9Vc6.X5/K4t$; #IpJD"_TBԗ$I'= ?&iyK v'U.U j6-*`U(Gwx-7KF0![vg8)%\OV>d$"Q`֫&aGQJ 2np Q5;Qzw!h$a$[hv- k&HH)nv빲vB8B7\Y^IQRsܨ>CmWW( fg̥r:p0;_m;KD[h#4w܊x}qWK^\#9@%@m`aW4SA Xaq@K-Hwu~20/v DZx9~Ø~.XsGoyξ_?CooM m2$^@AEZA:`g^uW\:H&>Cjg/NfJ&$4{߉}~%!gp Ue%QLT4Cr+4cʵ?!Z3bVKc3*~v IDAT l]IhjW p-G-.(LK8,/ i'=DKϥKq7㚐,bROuiRs0wz>'A;n|2bx@:$4bX^68]ѼJZ+R{u|1hAL S,@GT6:c]Ud;4 '?sg[߄?Ʒ޴F JT"Τj{06Uڦ^ڨ8#9T+@=2Lc$um0,g:lG߇fI$(&juٚ䮮 GAҬ573{'pLɵf䢟]JͥѧBjU#Uf}xAZ#4uo! $>p{0F΄G^zee]0Y΋ufSG&+oK`9K>, ;(*$D qleW,5s nB"Yl+!03czѵ D[8亳05&~XuwǩzɀN rq+/^T]8l{Y^[LJ YJѢ,gS$9kP1Ů&)z _ _}TN V)MH(\o/˦dQ޺x!,;\(JnŧM#|nU̔Jm5u-JL"$g+#I ) Rn:xtoWZlgKp wĴk4 H5"N y_:JبaI6z-h?K@I#}̝LZ +}Ƨu|J0&:57{k%R*00FH;՜|f'E/'FZ'_R$dT4u6mPhapRrlV F-]C:e$+HwnɶH "PЦ:N[ x**A<nMh~!7OL5GXʺS\45HsK1-c Fq:\V Zx+; Ō/@qBL'X v;`CKd\Y_DҌ|3G&͗׼&8_"^6 镧qߙ/" k}̶kAi 3Ĝа_6`;^sbٮWji5Ӏ@^%yEIVzͭ 9!ԔȘ!{y^ް 6 ""ڵ\W_FzYvcJoGK'yԥc?ze u%el]YeNH1.,pEyמm)hΛ3sԌ '62xulmfK=_=m:,DbuhchGeMIÒ;"Ϊ(L;F!/ USiD.t3&dړ̬B8L  õTUQEY鳐8\*<5"`0#AF[-.>IMjDT2"4;2G(T!V' Bxt\3\FΦE|akb0F\h'mjF'HAk'}կyY>OPWQ\fє)A:DD?; QИ>* ъ<on4/"HgєbͶ?>'Sch/[ۋH_q3uʒWܜxVNg/k+*fZFgl#)٫Jb U s A)10jZrz(ylNRC͈@3dHUH0$C.g[G~wB9  `m*']\A`ICe 2)ř+{Fװ<4B{2T5D6玹C7n_!`?Ypc6 wgU(b3/K =]YQH*r"|ǺvFѩ561֞bS@"h43IҌʱ>U~i}a~Ǚ~:rt|{O3h–QiIW>qɳ{R=d2b=4̀ژ1XȖb4bfDn]fGkhLi<5>[fE xarn5a눫fbjNhb4kb6l˖F8™0SAA;^|\8 ˏFW1%sXyF\k+ ~:RhݲqldU޳qޛyY"ɤ M#GXK3Sd]Eߞ\6` xSclVjw\1!*4^Pz%$Q!G@9%k1,c/0L'̓M"ό-jYȡQa 0A`_ @4 Ep1RKlor *_SYI"Yh7b e͢3n/VXcd˚5lm,W)IFs@4H_;] p %lŘX7Pht`$h$-²17i`U'rIբ@p'1˘Q$:3"g>knت{_5AKdpg>_`jc//<߽[\{GgK[a֙7 ƚ~v0e׌u;hPS͢uS#|-]5ԞǗqnt/A䅠S<;X^o!Lm (ą/kQ DY03k :Ljմjaܢ賨JsH p@;RIN0px.)wBs:PYܠvRV:N 'k]ܯt#妣H@rY7iY4Us6yboVy¦mM7D--޻U" FW"@o0?S\ͬ5@яϞZ@֡E\$o@1!)#Ќ mKzַد+, u0f.7ߚ@hd 0*ܻI^͒Xz1Mh}x:$3P۽o-R42w1,HOwMWt˾&g=n;dlh&mH $872J)^~y {Dʩ`!աy\' ښbQBnښ1cVlǶ3=Z޲{Фa((@ T_;h.Qùg`q|JV;I ^y fYz`P d0AԘG$z Ebb-f-͛)Emc]HV|ˠy5P`!"yy)+K"qA kV0 q!C'RAcq nBbFD35,!tJ]b<͋!0R$?<&P!mHHex쑧P xQ nCԉp ԁXM,xErD6ܠ=|d`+j~ޠ崍,Ң]ffEtvPe9y|Cn翄zKRBSO܅v"v@-'т@X`Yp|4fر0RT**\_b25hn^C L/Aǎ8.Di dx~9,,ݻgK@AgϞŅ0}*p!6Mi~jq/ M]LLh̚ {yz;3BQ&0shQ/lݵ KGǷtlB3E;w`0ʲxO:{β|_Hkd \XjŕXv2`ث&x~\p_ @p[8R7FiDz5t:{EB~uU΋7[$1 JεڞX֟]*T$Dt{@byy U5 'tosx%uε ̪`M74kvkb A Abt-hdɓg|pî#'( 1 81LbRg5<_5O[m#>Ăvװ̦8^s2x 0®kPYWyLGa,^ "I4"h@1XPDsE:9m8.9PϒjhT+Q/ sp^.(#i8%E6|.80&JgZdm}d6Dnܔ;cn,_9+CB4#DQ 5VUG=5qճtN dI[kn.ү5 QYM,Ng#1!-ΠHʰz?Fd$||BU"ļö$g¹^E6EۆXEF$PڊhCh#{R3" wa+h>[+5L\"2ʄ߿A<OJjiA~~L_!"XhĜط8Zp_xX-+h)11歚 (]}ߩ\,=L2u{P[.+kN9v5\3wfqhTQ)!6yzŜxn~#{/Uv]֕JvvK#1{;| 2Уe6FRY9Gv{^|Uo⟒y`Ġh/KN P Q)\ I._j[|񏎢\f ]5{" pyrUk`$. |N{)hhlwD-\ȄQ#spxe`BqWXB4ESmz&MsnB{5 h}4u]65ZCu`9\wgp8hxiL ƺ ˰ ( 0ytBkړ뚉gW:_"騹br o!?qo]u~s}#fPŚY,%J"eRɲ&+nVV;ĝN:I;N5؎%'Jl$[dYĢ$(5dŚ޻58NY P{gf|x*0S x=$ a9\ "}Dr sp'L@:ouamXMN[c )2At nJv'5#fj ǖb?|چ5<1[$%i 8s "> ,5p%V%UM .JIj]±MC`DC:Ě?|K?BKZ}y)Xc$H IDATis'W|4ݞ\ Y,7!.7,,کo/am:1\ Y .)>OcF SOmQ$(յ i#4Z(Űb! CnjPx0=Wnל&|_3D%PZvONlv K(yh`aa @2T\_xx@JlbcC(Q() p֔AS<EĎ9 _OWJ\X;?_sO46^{a*MkN|Tz K*80 mCbqy-_Al!_.'eyi+.Ϝ8^Z0X| G <3hL.Iڡm\ fX/Rp `_ps7) 06axkpYJAYTl'zb W2 fAD[u=g~.*"Qdz#X ͞VN7>\6V91<3R$$MFic j" rB'xOHJPHK_zX]'V_b_~{14YWP'~X\TYiP%lD^JV 6lܱ'wDht=c5Ro[^b3߸%х" ':AR&qe;oerfzH^ڇjE8^]%pE<ㄽBK(̥,܋wPF`"1s\F Mk>1. 5QA H hml_e.?߂V+&B?2ޠF辷x_2 ؠiQ*T /tT ѩݲ ]g#R)GJ (-t"=/HoVٻr5|CC!={ }WW%6 }dhԀ6N,cBXPP3yEjt< =7 ͟j++jcNz4^nn=p`{-E/'mꍼuz˝ slGap8+OK56m2_W09 /Brjj@Y]2W]v\6@P"Nvd=S!9:u'vY!X}r_<W7p}sCهZkVٵ^u3A ;O6@T4эa&{b_؏Fؼ "9AN`*ld)hˎM}Mm:Kl.eڤ]\IJk=)B~ĈB)N]w=.}̂l}c@>O}>K.Sz 0PCT~Ou7(Q)8W.A~.4;qyG  s|W7VLL`=*(#X'm90=Y"K3iu4M4ױr(>ZBb<8q?nZ+je),G(^L6{?VѾ\)ǻޔqU+z MJ( @H `#ȺQ;u;Ğ@- 0"P(RZ1)/U`DEAE'|E co\y?IHH wO AP1eD!А6Y  \6 (#1"eP/?v ®ЖoP75i1f >oZuItJFeB02C}"W漲.n9]?NPbY@E(DCZQ(kZ~s6B*Mp}֢h $+EnM yI!0+xy,2 "bѝBhχN߶k4e"zA\]peqzfltſPW4Rb* USa|Wa4)IMۥSP ;W(Jcҹ  )bH)4ir D9<>υb6vl{qrdzM.ECe(w +PD+R6,bET0ѭplB/ En7Ejci׷8<P[s5 ɠLƁ8VEp(vA!آitPw;+)NI+U!(5)QQVϬkbz̍qP3;Μ~_yG~n-,wDe|L#v$5|5J}8F} k_^9=PA)Щ'ѓZ}(ѕK4Ƿ۟~LrBZ 9 77GOX"̒\)*+`xc_A,wd7%{[ L5ƥYvHR/lu\`*: 1dӫ3{o.?1Ơ"F/9++pr.ט|Boj/\h+`dvDK.l\gom"1Ld011R*b,? .Әx-MZV@$8 FPP0;% ,0BƔ` 怅{㔌t9Pʂ G A !H(bBT5P7MJj}!TJ !bO~ ow/&Gj|T4wCA(.*j ;Wb PIOGQa~ oȻaBl"l$PJ8pƶ$ K_}mAE (֐e%MsR:AAB6^LH_Z\ M9LN6 4ҨV%.9VmՈBɳ!vc ?Xƫs,Pc|%vtI;BФ;MH97C;_=Kkb^}CVC[@P4TJ@q:ɹ3#+CxՁASg[pϸ%} EDBcvN >쵍{7zx5"q\ri_XCtl@[\scu58dT"xU@Y͝Fm=r6e.b{^á)<Z$RD!kwdZP+lv~Sdl<6Z$Ʊ21"c?Gox˝w߽UO .tC lBϳ!oER! t AJWH.ڧvO[;ϞzEуc#Xo6ty`{E(Pӄv4 "Z;_C6#"ϑ)[^=/;ތ'mS}Z>OroT C`%C °1e<84g%(!\: M*SeNӴ huoOի\4o{C# >pWWdMff!0X!3kWa 皘=ׄ-]퉨-.z v:lxYMl'E=xvF?=+Wp`.@80PFoTd%0DV(X.*SLq/dPj:GCc.a!#GH!EDC(D%Ş'G,= {`J!x(z,C{c t:m/D*AFu"&%~j(_dHȻB- (z"RlVVůq76AvZkDVʟ.4LgDip2_$j=!Fy¿#R] FƤA#!X]*ho B,oz=4Qh4/_qYwi{>&U)CE(c ņTE*}>w>q0wρѿSBY{Y3%AitzwA /շ )(V q(+ Ɔ^"` mCi<} -g Bx)4"h]Cl\%ľa۔G1L4>Af^<8~wYl˚]xԲ,;F8AsdEB-eR&k+_WO"[Hl6Z_"̗3RX_Z " [-Xmf;KX(#\l('At%N3qZ?Z1`znzܻ-)<J\/"`@U.I8Lc@~k *#LfG?8G_ABdK6'_? Ԓ^{98A9`&hDW>ZR֒rLʡ U;x>Z>]Vt?p;|Ux {͹md)(2i$YS(l,3{a-ڵ[NqsmOOˡF8x!w0.q.4N<+k >s֪/RSh#KSET+H*e$I0v?K-"2lll<ϯ]7R IDAT'LOѭxӇK}-g2T5%hNYrVF*> BR LʥSu/w>♏_(r)͖}ǶIYG` skBrݷ!!. (ժa]+oΦoҔ:A"' dT,ĕّvo|;0ٹ GQa `9rrIąX 7̗2cVK/=ڼǣiYlK2Qp\ul>`)묲E *Gws|v2-6Z?t*@qt/|ѕ );ΜY fS\ Zc,uj؞.ב#G(1-v#jl<+'D*Wk18 ݫ.]7*8UOGsz/@~z<~o {ub4aMDc=…H{/)ϔ ElLwG-T(~{A`S7^Ιq!n睓ތOOo6?53Yμ Fx`OrUNVlay % FW{װ'+\>{F{-9VKck1ƃ_`E(ʁ :su~Ac볒uin3W /K'G%o4r>@yAwV93oF9 Fy9dqhH7%;FzȌl5lDu=1AS|p  A2:/){tn)p'g=(>P6hv"*ԍ H,oƸLMˑ#CkzxzNM5$[h_d``g(*8G"xk.|N" |tu[\$8u֧`_| .O?PTk|+qz1I"\iv[@$!'N_m4 Q R֒Y.xg#n)Ŷ4f8\oZgffLNN'8cB^kr Ė*ygؤR܍cս@F-PE1Q[hۈ ۤhCHm8qs`92t:F*:F?K*Z'[AlH(RmmT[ClSX[YD9IbҒQYjq,6Ibve.{WZ˵%!@Pߔw82#, Nas.op(xz(1e^':#-by|o߹ۉavnwykB[VPXkF>}v"SLFLq/|3\΅幥`G]8-c@F967'S /erA(|lFQaXJō4q>rl-D5nxJ^%\/Ф#-rUyYH:' zOiRɺ4";'s(OZ-;ύ:ҁU7*6W=ѐ>eEt""A)`z|3+VY@8&+"rAù@ThR 2wv<}9cK`W7wo?yv#eT) :uQt@V .Pm)F`^6 #G 3U‘F/EU"S AQ@ A A哟O}QϽ}ݵ6]n>K~R\6/׾s"vw>]q7qjD>#zp(Ae,ֺ0QN|θ{/(膗`k fgg1==jX79H'UPk*G QH"R9H G/=n|mc_j'~՚`!W\=5tp[ |_&D J Qd Ld#"mo6[Bp0O>}7EEIN*d!HJ r\N`(x~ǼqHfnk/i`v9ڱn BVtT'PB352IX${۱Я沈R9[wӅO:*p !#VQ+R:THsiα.>ff+u 9zfqի+X#*bR1ehJ8 FĔ{/[_޵wrOre-K|Ήw@ UK/id_8P_9X5X j@iOʵ,Dw@@9 ͜ek]б*08}TY 4rS7d^ek><ݫfTݥCUȚ:Ha+"*0w:倮8x' ԅONWM?_u7&&'h#xrrȕe}sGf,jf8ݽdKi7r8 v A $@@vHq$$q(Êq J%[ZjW[˙v,޻?U];;b׽z|9sg؆5Js=LϛTnիמ;zUXT_ @>H1rt4ISYk!<,"M=I 'w~W~9=gdɪ/߾ƾsgC& q*S!"F-1CnbNvH>(zykB]ɾWu{{[iQɬ#Zy]wYcKmԭ3g"`:  =LucVLD&7f!76c46c%?xċƪf+ 0 &L.0*`Jb~Ydv\;)27akfYagȋ4c_ =ni86ԩS$OK|{[/.ͽDr't8ӐlT6kjDcfyꭙ4l&pi-glR?z7Ӑ7f<:Ymj>V -"Iֹ4漌7+,.y8:CQ9`,`j?#f\ Cߦi\*R;e Re!UYHK2/~2!"iԳQɼz6EIHLqT6)V&^KnSӸKÌCH8eGzCqgH[>;*{>={PKGI\JmbT1M&0Va|'?!h$s^ƒh"I&hΤNU UlCI4X *=Wdoӭ`yB"Wt77~Skۑ5*J(4Qc㹩u4)M؋ş?tر n{O_on~q 80Hy̳IB#F|i b=mLZ;}>5-[C{ʍx#־*!d͗)L]-!wy)]Y[K3-L3>_9G c'JS54U*jk6Cg54MS(Mvvl'fBDJp:&Tc[k=xۻWt t0nKs@},&=J6x8N3yjBT:SN|ɽ4O K8AjdƻKGk%hli XcY (}0 }]rک,U4?F&׉_X|vЄ<5a}&m%swKs@2XFm%߬*I-5ٹFnE!o,51 Jjr"!(HAAϩOl%ѿ(/zh,6ҥ|K_mQ(ךP6dv!a/FWPq\۔gy4y#+P\>O}1ZWAҌ K lfp9C,9fQJ1LJW3F>9!x#I&(iQc/r >18W:39RRbQ&_J'YUmsk#(8mRZe3Xke4M“YoU,2s eNWQ'X8E8hDfIΦd8yBhHk0~+‹v"ug.vOŇmB;ߪɘ֞UJjۆ*! U5Ƙt! WrYK΍ھzUׇW%=<[P.ǦA IDAT#];B FکN)%$0gnKưS e4ױT3EEx`r9> 6]qjpSkR M$ 8 H&1]LC;|:TjGF3J7c / @zBCmio"M6Zn1zRfqŮA$jbB9T T@%4RU:^8AjW)wvj@Ԁ!Ɛ6lL, Ӏȃ^*\e &3ɖlo`kXqU!o" `gE7vtyK\t5Cml7ޅfYyNO1MO)Oyܹ?v̦>"UPA~wOoocL6ιM]yӲ)kreno yԘxž I]9s_P>B}?]mmmQK!?}=bM{Mb49cK[$T!q 09β@YT(ABYJ,H!A$j2Nn> d C3'i 839À )Db`Ѡ(!%FK>4Yt+ q4tZy;e_!ԫ5˸,ts]p}k@m<oۙɸe3+ (.lk0GOT8\!*[ ڻե^I^[kTC2g7YPrTM2N1'S($i'%~ Ly"+9BCZ^8:j`Y]K}S_1fdA$%%g?{zVzwp8x0T@ 8^}wڏ]_ i 33ϭm1̸)̷ NY2s>r.DEN9I4W)3y|LSfؔdz@wy{"IlE^sݮS7 0zSؒ33s-;׸drUd8Мe SFL2R~il>6 ^kGok3,: '_Wx>ɼ'7{x~oݯ}QO^E<;䉌cܘcפ4^ͱUz9ېhO{ȕyޣ)3H>83^u-ɓwKṃ}{i'o[M̂Ĝ4,(IKbP$bG/+|xG|?Oxx~?9y7i~Ɨ25)UQA6mZ(TuTO3V ɱ>ztN6FQ[C]qngmAx`Sp h{{H{{)skra FF5:&zo ޙ@.B3͘ɥSҌ9%qpjl5"0߼ٷ ڿ{bp֡U8/п@$9I9(k`w0^A*y,m[3`,$8d:&uviܼAxAU8^ڢ.u76~$F^O47ЦIe؎gpzW7M}f!d5)e),:Uu1S%j d`o|k_:=xP%Ze^{M762T5$D,Q cύZr;kCZe2nNKE;YGd_&>q"uLδRF.(󾡸z.ƫWp<3r :9}ͦVCmتV;1E24sI0aԀ#׍8/iM]CUbd&Vt$e=R@5RJidv-U5x_-ݝ+6Ձǀvw Iȷqh" o > 13&sѤLعĔPFLhʔcc:&80YXȩOfꊾ<%iXϽQ@ A)0<1^X,!(&5$`.ҙG>bAІl<5^&p[[iwOߣ電֨iMy[MMfēL)M ) GFs%"na/L~~')4 gX[e ?C?M,],[%$ 'ɍ!ϙa; 26d15Cqۅ"<!]ܻHMj&gYwc4,bH@դIr6ErI"DNXUł٪`Hf%JDUYHUH%DE""5jHlQ l4`'cq!()st佗+HooOomrDzף]x3sXyS5θևh޻UruJNDqEaEQ&"JZT*QTEII @4"@tāC͟ c68zXfYDQĵN"KL% iracC/zrj [t{I ")"FQR @ƓR`!)+#>Da4M+&}bL/x/²#=W. O{HCkpKi4>%g]HrH)̃̈́hmP 0j"++#L$VUBQtшDV N J>'iT;2 28j0ѓM3ӴN? wOis}bĥ|䛧e/zvvv0 0H77i0jn+yG,U1RL2$Qm&1Ȫ3*V@%"&RV01)͗U TTŀEa^J$pL""8E,86zp2dcDDWॗRF#d0iR//BGpz]ۇLDa&O2(uTiJ~&(j!"V Z3%0)&#( )HIIUG QըVb1!9 3X9'gSC[;c_GΰvwuB ]:oʕ\.n 5b#UzqͧpXmxZB\ӊ&֠mRᣢShIh8Uijס[ޡ-͌`kaq`pVP*:I5  Z)dr;v/αy=P"\ͭ A=m{k:!HL()'URT根"e25Doԓ@JDLf,8ƔC"Y 1 R 4 N(xF"YmTkR0Y:$ 9ױҜ%t0R|HP\bz![o^C}@AIe!hH#15 É*(+a߰.Ѽ.4$DHD2^5 s.}l>qe@(/Ep`hl{)9- %40FV8 ,F&3eM`4;v1MD ) %J$RSQ*b"ɢR&M!zΦSɽi.WyP\Q*wwvpaG}mlh|ESc+M2"4aRXU dJPP 0+2*4Ԁ^utYY¬"jIXM@SDID"Њ"H2޴S1NRlRB)"pmB#dB,vHhoAgPe (t]+ #o+HqT\*pEwvVFGb+m`5p![ԫZk~ UviD54E K "’!C !f$f)c61N@RP"$%JJR"PԤ pQQCHImRԲ1y$N9![9-#,u0(~(6a% zU?l!Q˪ª \E 1& 5>Z&cU&VC, BU%VN0%qt!DӠ>Euy`EYӤ:˴~Ksr42@l-rJ} UWJ': NJ.\9/p}fpa7K}3:]]P\+wW?|ݮ #mwiAool٥NZgCSm6 d8i g! r0$00[&!"iWwQ"1T4_sT($eM5 kF$z";Stt&t) ۋ2|6)=>PM݋{tiIoaƇMb &%geѪ+i$R#D,Ib"$#,*@))gm4 1Z9iMu|#[:b~?D}d,s8`Ms>{vLf|DE 01\A5a103%" Y%" ʑ9s0"9IJYQ(>d &5(!ǥ:޽{zy`~<:]\t{ M{{{9cʲ<4 1,lfl6Ѳ$kئIJlEH#]VT`dV A#1bbdZ+I1)sjiY__ӧk+Ss!V:x }evo^f$_>Q;tqJ g|~?Q,{m.omЅ^&x6=.+U$6Y)6g`6ֱ1-G#lD 1*U1,)H b<Dy荴Ohud[qG:/OWx_9w;xa>9; r4Vf\+D9~L$1bRc s1+f8ZKQ%y%G6jc:1"GRaPjkE85I>$)aSUG9ul:U(fglƣxe LU*룼e'n'TU}:88`=UUn9HV$3N)Q*IJTr#0?֦Q6FMetUj7bժjsv( כ{7lё_zpusHF1v)6şR$t`4XvZZ{v[< eNG{wzz{K|O2 YM _vVv%$a=s#AF#cHNNTu&,+}=\_&IDAT KnXb(gCxzX."'"^M7v)4/p Ɇ?M1w;p8wey{{@=<Ϗ`xNOvhOwɽVvǿ;u <]G|{F+^dئ66q~TPr 'O'[k !]}CW _S==Y]&p|8q> p\Mʹ` ;u&c|؛RVUtPw nM!sz{n@7/t/K=5jk)T: +@\zI6GE#Q C˸G06&`:.y Pӣv8wnNt Bx - >-$p מ-xL%\,@ 9\GfYq|1(R(|3p 싐'̎~ C     C   n" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?#vFzREM>w&{EPEPEPEPEPEPEPEPEPEPJ\c%);'` (( ( ( ( (2NWO Eĺ[: iOC.G?1‹9.ukU=d_O^ 2UДCc>Ÿ?"ҼgbE)+#5W01)lŢ#hlR%QE;QLAEPEUK`QEHQ@Q@Q@cxRA9P3& (t@䎣Ҿ&b[it$oMs gˑ\d9cͱ}2.Et|mj_TQy9?\8k(VH*˴8q]~4x'I}dpWI\RWƛ[m-$v~? p"ލ)__|=vhƽiw< ' ƀVbG{+tsRD>9i8 mZQ 9큞OJZ3xhVUB{ 7uGhcWQf@}3>mx޴ycU=ξ1Wxq=GҊcVQE +;_}VnNO6i3Ymu[(/,bOIVҧ=gm_^E)2=kQ@Q@PAץl;oÏ%դ cd=dlPz1 ɯx'o/(U g0"xHߥin6Ț NW}|q޿3#UhڥOuZaQE~`QEQE)<߇<]CXtMBJ 9Ky =Xy)F3V4=H^qYt?/_e]i լLH$z0#?˞}W~F=.MJG6^ hI>3g˱zy{>VOVyF?i7*ZPUgS&XJF`gɓGq^9+S;i$S؂91_K!?[m{yx_Ca_":TdRNIz$,p1 Jۡk9> Qt"`|Y. ZD?sϡ~hm~*R>۰5j>5I޹Y<;%X\mJ:rUmsvR`AGC~c= 2_?/ xO>]F%*O3_xQ՜gfMWMɿR/3K_`bq#*Z1F+V|t>{ǖ[+[}:U#נq VZ B)?=VJM>7 &VE7J )C@}]?KW)ЏAQ w?$xs05?/ƝҿdK|=')?I<%*!?ľW}J0}~’uBOoRŽqD¿&*!?ľW}AG+?gÏ'5I ' >%_~vۧ =s ? --bPUTtP ~Back works OK to revert back to the pre-Variety wallpaper. desktop="$DESKTOP_SESSION" # Gnome 3, Unity: if [ "$desktop" == "ubuntu" ] || [ "$XDG_CURRENT_DESKTOP" == "Unity" ]; then gsettings get org.gnome.desktop.background picture-uri # XFCE elif [ "$desktop" == "xubuntu" ] || [ "$XDG_CURRENT_DESKTOP" == "XFCE" ]; then xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitor0/workspace0/last-image # Lingmo OS elif [ "$XDG_CURRENT_DESKTOP" == "Lingmo" ]; then qdbus com.lingmo.Settings /Theme com.lingmo.Theme.wallpaper # LXDE/PCManFM elif [ "$XDG_CURRENT_DESKTOP" == "LXDE" ]; then # The PCManFM config path varies by session name; Lubuntu is effectively a special case here if [ "$desktop" == "Lubuntu" ]; then desktop="lubuntu" # Curse this inconsistency in cases fi grep wallpaper=/ "$HOME/.config/pcmanfm/$desktop/desktop-items-0.conf" | sed -e 's/wallpaper=//g' # LXQt/PCmanFM-qt elif [ "$XDG_CURRENT_DESKTOP" == "LXQt" ]; then grep wallpaper=/ ~/.config/pcmanfm-qt/lxqt/settings.conf | sed -e 's/wallpaper=//g' # MATE elif [ "$XDG_CURRENT_DESKTOP" == "MATE" ]; then gsettings get org.mate.background picture-filename # Cinnamon after 2.0 elif [ "$desktop" == "Cinnamon" ] || [ "$XDG_CURRENT_DESKTOP" == "X-Cinnamon" ]; then gsettings get org.cinnamon.desktop.background picture-uri # KDE Plasma 5+ elif [ "$XDG_CURRENT_DESKTOP" == "KDE" ]; then grep 'Image=' ~/.config/plasma-org.kde.plasma.desktop-appletsrc | sed 's/Image=//' # Trinity elif [ "$XDG_CURRENT_DESKTOP" == "Trinity" ]; then # The "1" refers to the virtual desktop number dcop kdesktop KBackgroundIface currentWallpaper 1 2> /dev/null # All above fails => fallback to the Gnome 3 way else gsettings get org.gnome.desktop.background picture-uri fi # Feh # sed "s/\ /\n/g" ~/.fehbg | grep \' # Gnome 2 # gconftool-2 --get /desktop/gnome/background/picture_filename variety-0.8.13/data/scripts/set_wallpaper000077500000000000000000000306761475753071700205120ustar00rootroot00000000000000#!/usr/bin/env bash # # This script is run by Variety when a new wallpaper is set. You can use Bash, Python or whatever suits you best. # Here you can put custom commands for setting the wallpaper on your specific desktop environment, # or run commands like notify-send that notify you of the change. You can also add commands to theme your browser, # login screen or whatever you desire. # # Occasionally new versions of this script are released to bring support for new desktops. To apply them, you # should either delete this copy (in ~/.config/variety/scripts/) and restart Variety, or merge in the changes yourself. # Bug fixes are automatically applied by Variety provided the local copy is never changed. # # PARAMETERS: # $1: The first passed parameter is the absolute path to the wallpaper image to be set as wallpaper # (after effects, clock, etc. are applied). # # $2: The second passed parameter is "auto" when the wallpaper is changed automatically (i.e. regular change), "manual" # when the user has triggered the change, or "refresh" when the change is triggered by a change in quotes, clock, etc. # # $3: The third passed parameter is the absolute path to the original wallpaper image (before effects, clock, etc.) # # $4: Fourth parameter comes from the display mode setting: "os" means that set_wallpaper should try to # leave the OS setting unchanged. "zoom" means to try to fill the screen fully with the provided image. # Other parameters that could be passed are the scaling modes used by GNOME: # "centered", "scaled", "stretched", "zoom", "spanned", "wallpaper" # TODO: Ideally all sections below for different DEs would take this setting into account # # EXAMPLE: # echo "$1" # /home/username/.config/variety/wallpaper/wallpaper-clock-fac0eef772f9b03bd9c0f82a79d72506.jpg # echo "$2" # auto # echo "$3" # /home/username/Pictures/Wallpapers/Nature/green-tunnel-1920x1080-wallpaper-861.jpg # Here you may apply some additional custom operations on the wallpaper before it is applied. # In the end put the path to the actual final wallpaper image file in the WP variable. # The default is to simply set WP=$1. WP=$1 detect_desktop() { if [ -n "$XDG_CURRENT_DESKTOP" ]; then case "${XDG_CURRENT_DESKTOP,,}" in *"gnome"*) echo "gnome" ;; *"unity"*) echo "unity" ;; *"kde"*) echo "kde" ;; *"xfce"*) echo "xfce" ;; *"lxde"*) echo "lxde" ;; *"lxqt"*) echo "lxqt" ;; *"mate"*) echo "mate" ;; *"cinnamon"*) echo "cinnamon" ;; *"lingmo"*) echo "lingmo" ;; *"deepin"*) echo "deepin" ;; *"trinity"*) echo "trinity" ;; *"fluxbox"*) echo "fluxbox" ;; *"sway"*) echo "sway" ;; *"enlightenment"* | *"moksha"*) echo "enlightenment" ;; *) echo "$XDG_CURRENT_DESKTOP" | tr '[:upper:]' '[:lower:]' ;; esac return fi if [[ "$XDG_SESSION_DESKTOP $DESKTOP_STARTUP_ID" == *"awesome"* ]]; then echo "awesome" return fi echo "unknown" } DE=$(detect_desktop) if [ "$DE" == "enlightenment" ]; then # Enlightenment # Needs Modules/System/DBus Extension loaded to work OUTPUT_DIR="$HOME/.e/e/backgrounds" TEMPLATE=' images { image: "@IMAGE@" USER; } collections { group { name: "e/desktop/background"; data { item: "style" "4"; item: "noanimation" "1"; } max: @WIDTH@ @HEIGHT@; parts { part { name: "bg"; mouse_events: 0; description { state: "default" 0.0; aspect: @ASPECT@ @ASPECT@; aspect_preference: NONE; image { normal: "@IMAGE@"; scale_hint: STATIC; } } } } } } ' OFILE="$OUTPUT_DIR/variety_wallpaper_$RANDOM" DIMENSION="$(identify -format "%w/%h" "$WP")" if [ -n "$DIMENSION" ]; then WIDTH="$(echo "$DIMENSION" | cut -d/ -f1)" HEIGHT="$(echo "$DIMENSION" | cut -d/ -f2)" IMAGE="$(echo "$WP" | sed 's/[^[:alnum:]_-]/\\&/g')" if [ -z "$HEIGHT" ] || [ "$HEIGHT" = "0" ]; then ASPECT="0.0" else ASPECT="$(echo "scale=9; $DIMENSION" | bc)" fi fi printf "%s" "$TEMPLATE" | \ sed "s/@ASPECT@/$ASPECT/g; s/@WIDTH@/$WIDTH/g; s/@HEIGHT@/$HEIGHT/g; s|@IMAGE@|$IMAGE|g" > "$OFILE.edc" edje_cc "$OFILE.edc" "$OFILE.edj" 2>/dev/null rm "$OFILE.edc" ## Get the current number of virtual desktops desk_x_count=$(enlightenment_remote -desktops-get | awk '{print $1}') desk_y_count=$(enlightenment_remote -desktops-get | awk '{print $2}') ## Get the current number of screens screen_count=1 # If xrandr is available use it to get screen desk_x_count if command -v xrandr >/dev/null 2>&1; then screen_count=$(xrandr -q | grep -c ' connected') fi ## Set the wallpaper for each virtual desktop for ((x=0; x "$LAST_WALLPAPER_FILE" elif [ "$DE" == "kde" ]; then plasma_qdbus_script=" let allDesktops = desktops(); for (let d of allDesktops) { if (d.wallpaperPlugin == 'org.kde.image') { d.currentConfigGroup = Array('Wallpaper', 'org.kde.image', 'General'); d.writeConfig('Image', 'file://""$WP""'); } } " dbus-send --type=method_call --dest=org.kde.plasmashell /PlasmaShell org.kde.PlasmaShell.evaluateScript string:"$plasma_qdbus_script" dbus_exitcode="$?" if [[ "$dbus_exitcode" -eq 0 && "${KDE_SESSION_VERSION}" -eq '6' ]]; then # Update KDE lock screen background kwriteconfig6 --file kscreenlockerrc --group Greeter --group Wallpaper --group org.kde.image --group General --key Image "$WP" fi if [[ "$dbus_exitcode" -ne 0 && "${KDE_SESSION_VERSION}" -eq '5' ]]; then kdialog --title "Variety: cannot change Plasma wallpaper" --passivepopup "Could not change the Plasma 5 wallpaper; \ make sure that you're using Plasma 5.7+ and have widgets unlocked.\n----\n \ Due to Plasma limitations, external programs cannot automatically change the wallpaper when the widgets are locked.\n \ See https://git.io/vprpM for more information." --icon variety 10 fi exit "$dbus_exitcode" elif [ "$DE" == "gnome" ] || [ "$DE" == "unity" ]; then # Gnome 3, Unity gsettings set org.gnome.desktop.background picture-uri "file://$WP" 2>/dev/null gsettings set org.gnome.desktop.background picture-uri-dark "file://$WP" 2>/dev/null if [[ "$4" =~ ^(wallpaper|centered|scaled|stretched|zoom|spanned)$ ]]; then gsettings set org.gnome.desktop.background picture-options "$4" fi if [ "$(gsettings get org.gnome.desktop.background picture-options)" == "'none'" ]; then gsettings set org.gnome.desktop.background picture-options 'zoom' fi # GNOME Screensaver / Lock screen - thanks to George C. de Araujo for the patch gsettings set org.gnome.desktop.screensaver picture-uri "file://$WP" 2>/dev/null if [[ "$4" =~ ^(wallpaper|centered|scaled|stretched|zoom|spanned)$ ]]; then gsettings set org.gnome.desktop.screensaver picture-options "$4" fi if [ "$(gsettings get org.gnome.desktop.screensaver picture-options)" == "'none'" ]; then gsettings set org.gnome.desktop.screensaver picture-options 'zoom' fi elif [ "$DE" == "deepin" ]; then # Deepin if [ "$(gsettings list-schemas | grep -c com.deepin.wrap.gnome.desktop.background)" -ge 1 ]; then gsettings set com.deepin.wrap.gnome.desktop.background picture-uri "file://$WP" if [[ "$4" =~ ^(wallpaper|centered|scaled|stretched|zoom|spanned)$ ]]; then gsettings set com.deepin.wrap.gnome.desktop.background picture-options "$4" fi if [ "$(gsettings get com.deepin.wrap.gnome.desktop.background picture-options)" == "'none'" ]; then gsettings set com.deepin.wrap.gnome.desktop.background picture-options 'zoom' fi fi elif [ "$DE" == "xfce" ]; then # XFCE command -v xfconf-query >/dev/null 2>&1 rc=$? if [[ $rc = 0 ]]; then for i in $(xfconf-query -c xfce4-desktop -p /backdrop -l | grep -E -e "screen.*/monitor.*image-path$" -e "screen.*/monitor.*/last-image$"); do xfconf-query -c xfce4-desktop -p "$i" -n -t string -s "" 2>/dev/null xfconf-query -c xfce4-desktop -p "$i" -s "" 2>/dev/null xfconf-query -c xfce4-desktop -p "$i" -s "$WP" 2>/dev/null done fi elif [ "$DE" == "lingmo" ]; then # Lingmo OS qdbus com.lingmo.Settings /Theme com.lingmo.Theme.setWallpaper "$WP" 2>/dev/null elif [ "$DE" == "lxde" ]; then # LXDE/PCmanFM pcmanfm --set-wallpaper "$WP" 2>/dev/null elif [ "$DE" == "lxqt" ]; then # LXQt/PCmanFM-qt pcmanfm-qt --set-wallpaper "$WP" 2>/dev/null elif [ "$DE" == "fluxbox" ]; then # Fluxbox fbsetbg "$WP" 2>/dev/null ## fix ~/.fluxbox/lastwallpaper to using latest wallpaper when relogin fluxbox mkdir -p ~/.fluxbox echo '$''full ''$'"full|$WP||:0.0" >~/.fluxbox/lastwallpaper elif [ "$DE" == "sway" ]; then # If swaybg is available, use it as prevents system freeze. # See https://github.com/swaywm/sway/issues/5606 if command -v "swaybg" >/dev/null 2>&1; then # Grey background flicker is prevented by killing old swaybg process after new one. # See https://github.com/swaywm/swaybg/issues/17#issuecomment-851680720 PID=$(pidof swaybg) swaybg -i "$WP" -m fill & if [ -n "$PID" ]; then sleep 1 kill "$PID" 2>/dev/null fi else swaymsg output "*" bg "$WP" fill 2>/dev/null fi elif [ "$DE" == "trinity" ]; then # trinity # The 4 refers to display mode 4; valid ones are 1-8 dcop kdesktop KBackgroundIface setWallpaper "$WP" 4 2>/dev/null elif [ "$DE" == "mate" ]; then # MATE after 1.6 gsettings set org.mate.background picture-filename "$WP" 2>/dev/null if [ "$(gsettings get org.mate.desktop.background picture-options 2>/dev/null)" == "'none'" ]; then gsettings set org.mate.desktop.background picture-options 'zoom' fi if [[ "$4" =~ ^(wallpaper|centered|scaled|stretched|zoom|spanned)$ ]]; then gsettings set org.mate.desktop.background picture-options "$4" fi elif [ "$DE" == "cinnamon" ]; then # Cinnamon after 2.0 gsettings set org.cinnamon.desktop.background picture-uri "file://$WP" 2>/dev/null if [ "$(gsettings get org.cinnamon.desktop.background picture-options 2>/dev/null)" == "'none'" ]; then gsettings set org.cinnamon.desktop.background picture-options 'zoom' fi if [[ "$4" =~ ^(wallpaper|centered|scaled|stretched|zoom|spanned)$ ]]; then gsettings set org.cinnamon.desktop.background picture-options "$4" fi elif [ "$DE" == "awesome" ]; then # Awesome Window Manager # Be sure to start variety when you start awesome, such as by adding it to ~/.xinitrc # NOTE: This config will change the wallpaper after your current awesome theme sets it. # As such, the theme's wallpaper will briefly appear before being replaced with Variety's wallpaper. echo "for s in screen do require(\"gears\").wallpaper.maximized(\"$1\", s) end" | awesome-client else # For simple WMs, use either feh or nitrogen # TODO: These should take the scaling parameter $4 into account and use other options than --bg-fill if command -v "feh" >/dev/null 2>&1; then feh --bg-fill "$WP" 2>/dev/null elif command -v "nitrogen" >/dev/null 2>&1; then nitrogen --set-zoom-fill --save "$WP" 2>/dev/null fi fi exit 0 variety-0.8.13/data/ui/000077500000000000000000000000001475753071700146345ustar00rootroot00000000000000variety-0.8.13/data/ui/AboutVarietyDialog.ui000066400000000000000000000057251475753071700207420ustar00rootroot00000000000000 False 5 About Variety ../media/variety128.png normal Variety placeholder version Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors An automatic wallpaper changer, downloader and manager. https://github.com/varietywalls/variety https://github.com/varietywalls/variety # Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 <http://www.gnu.org/licenses/>. ../media/variety128.png gpl-3-0 True False 10 10 10 10 vertical 2 True False end False True end 0 variety-0.8.13/data/ui/AddConfigurableDialog.ui000066400000000000000000000220171475753071700213260ustar00rootroot00000000000000 960 False 5 Title ../media/variety.svg normal 600 True False vertical 2 True False end gtk-cancel False True True True True False False 0 gtk-ok False True True True True True 5 True False False 1 False True end 4 True False start 10 10 15 Title False True 0 True True start 10 10 15 Instruction True fill True 130 False True 1 True False True False 10 Short Instruction True False True 0 True True True True 10 True True False True 1 False True 2 True False end start False Just a moment to check for images False True 0 False end 10 False True 1 True False end 5 20 False True 2 False True 3 btn_cancel btn_ok variety-0.8.13/data/ui/AddFlickrDialog.ui000066400000000000000000000454011475753071700201420ustar00rootroot00000000000000 650 False 5 Variety - add Flickr as an image source True True ../media/variety.svg normal True False vertical 2 True False 5 end gtk-cancel False True True True False True False False 0 gtk-ok False True True True True True False True False False 1 False True end 0 True False 10 True vertical True False start 15 10 10 Flickr False True 0 True False start 15 Please specify the <a href="http://flickr.com">Flickr</a> search criteria. Photos that match all of the chosen criteria will be downloaded. Leave unneeded criteria empty. True fill True 130 False True 1 True False 15 20 True False start Tags: 0 2 1 1 True True True True True 1 2 1 1 True False start 20 A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match. Example: yellow,car True 1 3 1 1 True False start User: 0 4 1 1 True True True True True 1 4 1 1 True True start 20 Please insert the URL to the user's photostream or to one of their photos. Example: <a href="http://www.flickr.com/photos/peter-levi/">http://www.flickr.com/photos/peter-levi/</a> True 1 5 1 1 True False start Group: 0 6 1 1 True True True True True 1 6 1 1 True True start Please insert the group's URL. Example: <a href="http://www.flickr.com/groups/wallpapers/">http://www.flickr.com/groups/wallpapers/</a> True 1 7 1 1 True False start Text: 0 0 1 1 True True True True True 1 0 1 1 True False start 20 Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -. Example: apple -pie True 1 1 1 1 False True 5 True False end 15 False Just a moment to check this search False True 0 False end 10 False True 1 True False end 20 False True 2 False True 6 False True 1 btn_cancel btn_ok variety-0.8.13/data/ui/AddWallhavenDialog.ui000066400000000000000000000326161475753071700206550ustar00rootroot00000000000000 960 False 5 Variety - Add Wallhaven.cc source 960 ../media/variety.svg normal True False 10 10 5 vertical 2 True False end gtk-cancel False True True True True False False 0 gtk-ok False True True True True True True False False 1 False True end 5 True False start 10 15 Wallhaven.cc False True 0 True False start 15 Instruction True fill True False True 1 True False True False Short instruction True False True 0 True True True True True True True False True 1 False True 2 True False 20 False True 3 True False start 20 <b><span size="x-large">Wallhaven API key</span></b> True False True 4 True False start 10 To fetch <b>NSFW</b> images, you can provide your own <a href='https://wallhaven.cc/settings/account'>Wallhaven API key</a>. You need a free Wallhaven account, log in, go to <a href='https://wallhaven.cc/settings/account'>Account Settings</a>, find it under <b>API Key</b>. Without an API key, even if your search shows NSFW images in the browser, Variety will not be able to fetch them. Even with an API key, in order to fetch <b>NSFW</b> images, you need to provide a full search URL, not just keywords. <b>Note: This is a global setting which affects all Wallhaven sources</b> True fill True False True 5 True False 5 -1 -1 True False 5 API Key: False True 0 True True 36 False True 1 True False 5 True False True 2 False True 6 True False end start False Just a moment to check for images False True 0 False end False True 1 True False end 20 False True 2 False True 9 btn_cancel btn_ok variety-0.8.13/data/ui/EditFavoriteOperationsDialog.ui000066400000000000000000000220111475753071700227400ustar00rootroot00000000000000 False 5 Copy to Favorites vs. Move to Favorites ../media/variety.svg normal True False vertical 2 True False end Reset to Default False True True True False False True 0 gtk-cancel False True True True False True False False 1 gtk-ok False True True True False True False False 2 False True end 0 True False vertical True False start 10 10 15 Copy to Favorites vs. Move to Favorites False True 0 True False start 10 10 Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the menu depending on the image location: False True 1 120 True True 10 10 5 10 True True in True True 5 5 5 5 word textbuffer False True 2 True False 10 10 Please enter one entry per line, each entry in the form <Folder>:<Copy, Move or Both>, where Folder can be Downloaded, Fetched, Others or a specific folder path. Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list. Example: Downloaded:Copy Fetched:Move /pics/RandomImages:Move /pics/OrganizedAlbums:Copy Others:Both fill True 130 False True 3 False True 1 reset btn_cancel btn_ok variety-0.8.13/data/ui/PreferencesVarietyDialog.ui000066400000000000000000007546261475753071700221440ustar00rootroot00000000000000 image/* seconds 1 minutes 60 hours 3600 days 86400 minutes 60 hours 3600 days 86400 100 1 10 100 1 10 100 1 10 100 1 10 1 0.050000000000000003 0.20000000000000001 0.01 0.5 1000 0.5 1 0.050000000000000003 850 False Variety Preferences center 960 200 True ../media/variety.svg normal True False vertical 50 True False 5 5 end gtk-close False 35 True True True True False False 1 False True end 2 True True 10 10 10 True False True vertical True False True False start vertical True False start 15 10 General False True 0 Start Variety when the computer starts True True False start 30 7 True False True 1 True False 30 10 True Change wallpaper every True True False True False True 0 True True True Minimum interval is 5 seconds Minimum interval is 5 seconds 4 False True 1 True False True Minimum interval is 5 seconds Minimum interval is 5 seconds liststore_change_interval 0 0 False True 5 2 False True 2 Change wallpaper on start True True False start 30 True False True 3 False True 0 True False 20 vertical True False start 10 Use Internet Access False True 0 True True Turning off means Variety will not download new images or quotes from online sources, or initiate other internet connections. end 5 True False False 1 False True end 1 False True 0 True False True vertical True False start start 15 20 5 Images False True 0 True False True True False vertical 250 True True 30 10 True True in True True True sources_model True 2 multiple Enabled 0 Type 1 Location 2 False True 0 True True 0 True False end 20 vertical 2 start _Add... False 100 True True True Add images, folders or online image sources Add images, folders or online image sources True False True 0 _Open Folder False True True True Edit the selected source Edit the selected source 2 True False True 1 _Edit... False True True True Edit the selected source Edit the selected source 2 True False True 2 _Remove... False True True True True Remove selected image sources Remove selected image sources 2 True False True 3 _Use False True True True Enable the selected sources and disable all others Enable the selected sources and disable all others 2 True False True 4 False True 1 True True 1 False True 1 True False end vertical True False end vertical True False start 15 20 Favorites False True 0 True False start 30 20 15 True True False Copy favorite wallpapers to False True 0 Label False 30 True True True True 0 False True 1 True False False True 2 False True 1 False True 0 False True 2 True False General False True False 15 15 10 vertical True False start 10 Alignment and scaling False True 0 True False 20 vertical Auto-rotate the image according to EXIF data True True False 7 True False True 0 True False 7 True False Display mode False True 0 True False 10 os False True 1 False True 1 True False start 7 Description goes here fill True False True 2 True False start 7 Experimental: Some options may not work well in all desktop environments or multi-monitor configurations. fill True False True 3 False True 1 True False start 20 Effects False True 2 True False 20 vertical True False start 7 Randomly apply these effects to the displayed wallpapers (thanks to the wonderful ImageMagick): fill True False True 0 True False 10 vertical 5 20 False True 1 False True 3 1 True False Wallpaper 1 False True False 15 15 10 vertical True False start Quotes False True 0 True False 15 vertical Show random wise quotes on the desktop True True False start 7 True False True 0 True False 5 True Change quote every False True True False 0 True False True 0 True True True Minimum interval is 10 seconds Minimum interval is 10 seconds 4 False True 1 True False True Minimum interval is 10 seconds Minimum interval is 10 seconds liststore_change_interval 0 0 False True 5 2 False True 1 False True 1 True False start 15 Appearance False True 2 True False 15 vertical True False 5 True False Text color: 0 False True 0 False True True True False True 1 True False start 20 Text font: 0 False True 2 False True True True Sans 12 Neither success, nor failure, are final. False False True 3 Draw a text shadow False True True False start 40 5 0 True False True 4 False True 0 True False True False start Backdrop color: 0 False True 0 False True True True False True 1 True False 20 Backdrop opacity: 0 False True 2 True False Transparent 0 False True 3 100 True True 10 quotes_bg_opacity_adjustment 100 False False True 4 True False Opaque False True 10 5 False True 1 False True 3 True False start 15 Placement False True 4 True False 15 vertical True False 7 True False Horizontal position: 0 False True 0 True False Left 1 False True 1 100 True True 10 quotes_hpos_adjustment 100 False False True 2 True False Right False True 10 3 True False 60 -1 True False Quotes area width: 0 False True 0 True False Narrow 1 False True 1 100 True True quotes_width_adjustment 100 False False True 2 True False Wide False True 10 3 False True 4 False True 1 True False 7 True False Vertical position: 0 False True 0 True False Top 1 False True 1 100 True True 10 quotes_vpos_adjustment 100 False False True 2 True False Bottom False True 10 3 False True 2 False True 5 True False start 15 Sources and filtering False True 6 True False 15 vertical True False True True False start 10 Show quotes from these sources: True fill True False True 0 False True 0 True False 7 vertical 5 20 False True 2 True True start 5 10 True <small><a href='https://github.com/varietywalls/variety/wiki/Plugins'>More plugins</a></small> True fill True False True 3 True False start 10 Show only these tags and authors. Leave empty to show random quotes. fill True False True 4 True False 10 5 True True True 1 1 True True True 1 0 True False start Tags: 0 0 0 True False start Example: funny, inspirational True 2 0 True False start Example: Albert Einstein, Voltaire True 2 1 True False start Authors: 0 0 1 False True 5 False True 8 2 True False Quotes 2 False True False 15 15 10 vertical True False start Clock False True 0 Show a nice big digital clock on the desktop, displaying the current time and date True True False To configure the clock's appearance edit the clock_filter property in Variety's settings file (~/.config/variety/variety.conf). Use the comments in ~/.config/variety/variety_latest_default.conf as a guide. start 15 7 0 True False True 1 True False vertical True False start 20 Appearance False True 0 True False 15 15 vertical True False 5 True False start Clock font: 0 False True 0 False True True True Sans 12 Neither success, nor failure, are final. False False True 1 False True 0 True False True False start Date font: 0 False True 0 False True True True Sans 12 Neither success, nor failure, are final. False False True 1 False True 1 True True start 7 These don't work? <a href="https://answers.launchpad.net/variety/+faq/2138">Read here</a>. How to further configure the clock? <a href="https://github.com/varietywalls/variety/wiki/Configuring-the-clock">Read here</a>. True fill True False True 2 False True 1 False True 2 3 True False Clock 3 False True False True vertical True False start vertical True False start start 15 10 3 Images for slideshow False True 0 True False start 30 20 True vertical Favorite images False True True False start 2 0 True False True 0 Images in all enabled image sources False True True False start 2 0 True False True 1 All images in the Downloads folder False True True False start 0 True False True 2 True False start 5 True Custom folder (includes images in subfolders) False True True False 1 0 True False True 0 Label False 30 True True True True 0 False True 1 True False False True 2 False True 3 True False True False Order of images in slideshow 0 False True 0 True False Random By name, A to Z By name, Z to A By date, oldest first By date, newest first False True 1 False True 4 False True 1 True False start start 15 15 Screen False True 2 True False 30 vertical True False True False Run on monitor 0 False True 0 True False False True 1 False True 0 True False True False Window mode for the slideshow 0 False True 0 True False Fullscreen Desktop (stays below other windows) Maximized window Normal window False True 1 False True 1 False True 3 False True 0 True False True vertical True False start start 15 15 Dynamics False True 0 True False 30 20 vertical True False 5 True False Interval between image changes 0 False True 0 True True slideshow_seconds_adjustment 1 True False True 1 True False seconds False True 2 False True 0 True False vertical True False 5 True False Quick fade 0 False True 0 140 True True slideshow_fade_adjustment 1 1 False False True 10 2 True False Slow fade False True 3 False True 0 True False 5 True False Less zoom 0 False True 0 140 True True slideshow_zoom_adjustment 1 False False True 10 2 True False More zoom False True 3 False True 1 True False 5 True False Less pan 0 False True 0 140 True True slideshow_pan_adjustment 1 False False True 10 2 True False More pan False True 3 False True 2 False True 1 Reset to defaults False True True True start False False 2 False True 1 False True 1 True False end 20 Changes on this page take effect after the slideshow is restarted False True 2 Start slideshow now False 150 35 True True True end 30 20 10 False True 3 4 True False Slideshow 4 False True False True vertical True False start vertical True False start start 15 10 Fetch folder False True 0 True False start 30 10 True True False Save manually downloaded wallpapers to False True 0 Label False 30 True True True True 0 False True 1 True False False True 2 False True 1 True False start start 15 20 Drag and drop False True 2 True False start start 28 25 10 Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop. To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access. fill True 130 False True 3 False True 0 True False 20 True vertical True False start start 15 20 Clipboard monitoring False True 0 Monitor clipboard for image URLs and fetch them False True True False start start 25 10 0 True False True 1 But fetch only when the URL host is one of these: False True True False start start 25 5 0 True False True 2 200 True True 28 20 True in True True 10 10 10 10 True clipboard_hosts_buffer False True 3 False True 1 5 True False Downloading 5 False True False vertical True False start 15 15 10 When possible use images that: False True 0 True False vertical True False start 15 10 Size False True 0 Have landscape orientation False True True False start 30 0 True False True 2 True False 30 10 Are big at least False True True False 0 True False True 0 True False 3 50 80 100 False True 1 True False 5 % of the screen resolution False True 2 False True 3 False True 1 True False vertical True False start 15 10 Color False True 0 True False 30 10 Are dark or light: False True True False 0 True False True 0 True False 0 Dark Light False True 1 False True 1 True False 30 10 Contain this color: False True True False 0 True False True 0 False True True True False True 1 True False False 5 (Takes effect after some initial searching) False True 2 False True 2 False True 2 True False vertical True False start 15 10 5 Rating False True 0 True False Have EXIF rating at least False True True False start 30 0 True False True 0 True False 1 2 3 4 5 False True 1 False True 1 False True 3 True False vertical True False start 15 10 5 Name False True 0 True False Matches RegEx: False True True False start 30 0 True False True 0 True True False 50 False False 1 False True 1 False True 4 6 True False Filtering 6 False True False start True vertical True False vertical True False start start 15 10 Indicator Icon False True 0 True False 30 True False start 10 5 Indicator icon: fill True 0 False True 0 True False Light Dark Number 1 Number 2 Number 3 Number 4 Use current wallpaper Custom image... None False True 1 False 10 30 filter_images Select an icon False True 2 False True 1 True False start 30 30 7 When the icon is hidden, Variety can be controlled from the command line, or from the launcher quicklist. Run "variety --help" to see all available commands. fill True False True 5 False True 0 True False vertical True False start start 15 20 Favorites Operations False True 0 True False 30 True False start 10 5 Favorites operations to show in main menu: fill True 0 False True 0 True False Copy to Favorites Move to Favorites Both Copy and Move Depends on folder... False True 1 Edit... False 80 True True 10 30 False True 2 False True 1 False True 1 True False start vertical True False start start 15 18 Login Screen Support False True 0 True False start 30 30 True vertical Make sure the wallpapers set by Variety will be used on the login screen False True True False start 7 0 True False True 0 True False start 7 <b>Privacy warning:</b> To show your wallpaper LightDM needs read permissions over the image. With this option on, Variety will copy the wallpapers to a public folder and change their permissions to make them readable by all. By default, the folder is ~/Pictures if your home folder in not encrypted, and /usr/share/backgrounds if it is. Please use with care on multiuser systems. True fill True 130 False True 1 True False 5 True False start Copy wallpaper image files to this folder: 0 False True 0 Copy-to folder False 30 True True True True False True 1 Reset to default False True True True 5 False True 2 Still doesn't work? False True True True True end 20 5 none https://answers.launchpad.net/variety/+faq/2271 False True 3 False True 2 False start 5 It seems your home folder is encrypted, so using folders inside it will not work. False True 3 False 5 vertical True False start You don't have write permissions for this folder. 0 False True 0 True False start Permissions do not allow LightDM to read files from this folder. 0 False True 1 True False start Variety can adjust the permissions, but you will have to provide superuser privileges. True fill True False True 2 OK, adjust the permissions False True True True start False True 3 False True 4 False True 1 False True 3 7 True False Customize 7 False True False 15 15 vertical True False start 10 5 Tips and tricks False False 0 80 True True True in True True False word tips_buffer False True 1 True False vertical True True False start 10 Visit website 0 0 https://github.com/varietywalls/variety False True True True True start none https://github.com/varietywalls/variety 0 1 True False start 10 Report a bug or request a feature 0 2 https://github.com/varietywalls/variety/issues False True True True True start none https://github.com/varietywalls/variety/issues 0 3 True False start 10 Donate to Variety 1 2 Donate via PayPal False True True True True start none https://www.paypal.com/donate/?business=DHQUELMQRQW46&no_recurring=0&item_name=Variety+Wallpaper+Changer&currency_code=EUR 1 3 False True end 3 8 True False Tips 8 False True False 15 15 vertical True False start 10 5 Recent changes False False 0 True True in True True 3 3 False word changes_buffer True True 1 True False vertical True True False start 10 Visit website 0 0 https://github.com/varietywalls/variety False True True True True start none https://github.com/varietywalls/variety 0 1 True False start 10 Report a bug or request a feature 0 2 https://github.com/varietywalls/variety/issues False True True True True start none https://github.com/varietywalls/variety/issues 0 3 True False start 10 Donate to Variety 1 2 Donate via PayPal False True True True True start none https://www.paypal.com/donate/?business=DHQUELMQRQW46&no_recurring=0&item_name=Variety+Wallpaper+Changer&currency_code=EUR 1 3 False True end 2 9 True False Changelog 9 False 10 10 False False True 0 False end 10 15 2 Status message True True False True 3 save variety-0.8.13/data/ui/PrivacyNoticeDialog.ui000066400000000000000000000273271475753071700211050ustar00rootroot00000000000000 PrivacyNoticeDialog 960 200 True True True baseline Variety - Privacy Notice True center-always 960 200 variety dialog True True center center 2 2 2 2 vertical True True 15 end True True 5 end 4 300 200 True True 10 10 10 vertical True False <span font="15" weight="bold">Privacy Notice</span> True False True 0 True False 10 ../media/vrty-cloud.png False True 1 True False 15 Before we start, here are some things you need to be aware of and agree to: <b>Variety is an open-source application, provided as is, without any warranties</b>. By using it, you agree to the terms and conditions of the <a href="https://www.gnu.org/licenses/gpl-3.0.en.html">GNU GPLv3 license</a> under which it is distributed. <b>Variety is an internet-connected application.</b> With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. <b>Note that all internet connectivity can be disabled.</b> <b>Variety fetches and applies rate limiting settings defined by the development team.</b> This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them. <b>Some image sources require us to track additional information when enabled.</b> For example the terms of <a href="https://help.unsplash.com/en/articles/2511245-unsplash-api-guidelines">Unsplash</a> require us to track and report when users download and view images from Unsplash. True True False True 2 0 True False 40 10 True False start True False 5 10 10 <b>Use Internet Access:</b> <i>Can be changed later in Preferences</i> True False True 0 True False vertical True True Enabling internet access is highly recommended. Without it, many of the functions Variety provides are disabled. You can change this setting later in Preferences. True False True 0 False True 1 True True 0 Reject and Quit 220 35 True True True False False 1 Accept and Continue 220 35 True True True True True 15 False False 2 False True 3 False True 2 1 variety-0.8.13/data/ui/WelcomeDialog.ui000066400000000000000000000203561475753071700177140ustar00rootroot00000000000000 960 200 True True True 5 Welcome to Variety! True center-always 960 200 ../media/variety.svg dialog 750 520 True False start vertical True False end 15 10 end Continue False 150 35 True True True True True False True 0 False True end 0 True False 25 25 vertical True False start start 20 Welcome to Variety! False True 0 True False start start Variety is an automatic wallpaper changer. It rotates your desktop wallpaper on a regular basis using local images or images downloaded from various online sources. It runs quietly in the background - to control it, click this icon in your system tray: True fill True 130 False True 1 True False ../media/tray-screenshot.png False True 2 True True start start Variety is open-source software, created by Peter Levi, a software developer from Bulgaria. If you like it, please <a href="https://www.paypal.com/donate/?business=DHQUELMQRQW46&amp;no_recurring=0&amp;item_name=Variety+Wallpaper+Changer&amp;currency_code=EUR">donate</a>. True fill True 130 False True 3 True True start start 20 Now please take some time to set your preferences on the following screens. True fill True 130 0 False True 4 True True 1 continue_button variety-0.8.13/data/ui/about_variety_dialog.xml000066400000000000000000000006171475753071700215560ustar00rootroot00000000000000 variety-0.8.13/data/ui/add_configurable_dialog.xml000066400000000000000000000006201475753071700221430ustar00rootroot00000000000000 variety-0.8.13/data/ui/add_flickr_dialog.xml000066400000000000000000000005721475753071700207630ustar00rootroot00000000000000 variety-0.8.13/data/ui/add_wallhaven_dialog.xml000066400000000000000000000006041475753071700214660ustar00rootroot00000000000000 variety-0.8.13/data/ui/changes.txt000066400000000000000000000236021475753071700170100ustar00rootroot000000000000000.8.13 Fix #741: Fix downloading server side options (remove tiny.cc redirector) Fix #733: Fix for EarthviewDownloader Fix #704: In "smart" display mode, tile small wallpapers using ImageMagick (#727) Improvement #731: Add support for KDE 6 lockscreen Improvement #752: set_wallpaper: default to feh/nitrogen instead of hardcoding a list of WMs Feature #756: Add support for Fluxbox (via fbsetbg) Feature #619: Add regex name filter for wallpapers Update French and German translations 0.8.12 Fix #672: add support for KDE Plasma 6 0.8.11 Fix #652: use importlib to support Python >= 3.12 Fix #424: Use only the primary monitor for thumbs window (#649) Improvement #609: filter Unsplash Plus images Improvement #604: download UHD images from Bing Feature #621: Add AVIF image format support Updated translations: Spanish (#607) and Brazilian Portuguese (#614) set_wallpaper: add support for i3-gnome (#595), Hyprland (#618), spectrwm (#626) set_wallpaper: only set Plasma wallpaper on desktops using an image background (#611) set_wallpaper: use dbus-send instead of qdbus for setting KDE wallpaper (#633) 0.8.10 Bugfix #577: Fix Unsplash downloads Bugfix #553: Keep the current quote when using Image->Next Bugfix #418: on AwesomeWM, apply the same image on all monitors separately instead of stretching across them Feature #559: add support for handling Unsplash topic URLs Improvement #586: Use official API for EarthView 0.8.9 Bugfix #536, #537: Fix errors when there is no primary monitor configured 0.8.8 Feature #89: Added options to select fit size / wallpaper mode. Added an image-dependent smart fit mode. Bugfix #519: Fix issues with autostart. Bugfix #534: Fix the fallback Wallhaven non-API downloading mode used for some Wallhaven URLs. Bugfix #480: Improve image searching: Avoid deep/huge folders causing Variety to ignore the other folders. 0.8.7 Added a global switch to turn Internet connectivity for Variety off or on. Wallhaven sources now use the Wallhaven API, not html parsing. Support for fetching NSFW images from Wallhaven. When adding Wallhaven sources, you can provide your own Wallhaven API key. If provided, and the source URL is set to search for NSFW images, Variety will obey. Auto-upgrade set_wallpaper/get_wallpaper scripts. Starting from this release, Variety will always automatically upgrade the set_wallpaper/get_wallpaper scripts to make sure fixes to those are picked up. Your old files have been preserved in the ~/.config/variety/scripts folder. If you need to use custom scripts, please set their paths in the set_wallpaper_script/get_wallpaper_script properties in ~/.config/variety/variety.conf. 0.8.6 New source: National Geographic's photo of the day New source: ArtStation Add support for Gnome's Dark style Change default font for quotes and clock to Serif for greater compatibility Translation updates and bugfixes 0.8.5 Fixes for Python 3.9 support Fix GH-388: Cleanup of wallpaper folder now cleans all image types Fix GH-363: We were almost never triggering purging downloads Enable support for Qtile-venv (GH-386) Updated Japanese translations 0.8.4 Remove dead Desktoppr, ChromeOS sources (GH-323) Properly verify TLS certificates when downloading images (GH-326) Fix banning images when using Delete to Trash option (GH-304) Preserve file extensions when copying wallpapers to another folder (GH-240) Fix crash in indicator code when image origin is not available (GH-287) Remove spurious "No such schema “org.cinnamon.desktop.background” errors" (GH-329) Update Unsplash rate limit (GH-332) Better detection for AwesomeWM (GH-282) 0.8.0 - 0.8.3 Image sources are now plugins Add support for sequential albums Add support for multiple simultaneously running Variety profiles (--profile command option) Add a Privacy Notice dialog Add support for configurable Unsplash sources Add two new sources (ChromeOS Wallpapers and Google Earth View Wallpapers) Remove World Sunlight Map source Added Urban Dictionary and UNIX fortune program as quote sources Download linked to wallpaper changing, not configured as a separate interval Add a dedicated --set/--set-wallpaper option Make the thumbs display much faster Fix bugs related to GTK threading usage Multiple bugfixes Dev process: Use auformatting on all Python files (black, isort) 0.7.2 Add support for Sway, bspwm Enable AwesomeWM support by default Fix crash on --help or --version if a Variety instance is already running (GH-148) Fix spurious "file not found" errors when checking for animated GIFs (GH-132) New translations: Chinese, Japanese 0.7.1 Fix remaining bugs from the Python 3 port: errors when saving favorite quotes and generating pencil_tile.png 0.7.0 New translation: Turkish Fix possible download issues when upgrading from older Variety versions and having safe mode enabled GoodreadsSource: fix stray HTML tags being displayed in quote authors 0.7.0-beta1 Port to Python 3 Fix broken trash deletion on some systems by directly using Gio libraries Fix potential log file corruption when trying to start multiple instances Support for setting GNOME Screensaver / GDM background Removed outdated functionality for publishing to Facebook Updated URL for QuotationsPage plugin Update default clipboard_hosts: add deviantart.net, imageshack.com; remove (dead) ns223506.ovh.net 0.6.9 Removed broken "SSL dependency" installation code Fix trash deletion (0.6.8 regression) and replace gvfs-trash (deprecated) with 'gio trash' Skip metadata checks on non-image files, leading to "GExiv2: unsupported format" warnings Use subprocess.Popen to run xdg-open so that it doesn't block on some distros (LXQt, Trinity DE) Removed more dead code related to VRTY.org, Panoramio, KDE 4 Add get_wallpaper support for KDE Plasma 5; fix support for LXDE Move bug tracker links to GitHub 0.6.8 Unsplash API update Remove everything related to VRTY.org which is not running anymore 0.6.7 Fix "unary operator expected" errors on KDE variables in set_wallpaper New WM support: i3 with logging (i3-with-shmlog), Moksha (e17 fork), dwm i3 and openbox code now uses either feh or nitrogen interchangeably Removed Debian-specific use of dpkg-query in checks for nitrogen Switch to Ayatana indicators by default Many fixes to set_wallpaper pointed out by shellcheck 0.6.6 [Security] Fixed multiple shell injection issues in the "Delete to Trash", filter, and clock code Add long-awaited wallpaper changing support on KDE Plasma 5 Fix crash when gi-appindicator isn't installed Removed verbose console output by default, as this tends to spam syslog and ~/.xsession-errors when launched via autostart - see https://bugs.launchpad.net/bugs/1685003 Fixed Variety showing the wrong version in the About dialog 0.6.5 Fix "Previous" wallpaper button on MATE 1.10 and later Fix quote applying with Pillow >= 4.2.0, patch from Elon Bing Remove Panoramio support, as that service no longer exists. Initial patch by Balló György in Arch Linux. Fix high CPU usage when mousing away from the thumbnail selector Add trinity-desktop support and AppStream metadata for GNOME Software Center 0.6.2 - 0.6.4 Safe mode added for filtering out NSFW images 0.6.1 Bugfixes 0.6.0 Variety Slideshow 0.5.4 - 0.5.5 Moving to a standard Debian-style installation Bing and Unsplash support Out-of-the-box support for i3 and LXQt 0.5.1 - 0.5.3 Bugfixes 0.5.0 VRTY.ORG integration, synchronization of favorites Wallhaven support Reddit support Google Image Search option Updated autostart desktop file Bugfixes 0.4.20 Unicode-related bugfixes 0.4.19 Fixed Flickr and Wallpapers.net support Added Panoramio support Added support for Enlightenment Added Wallpaper Selector option Streamlined menu Easier Facebook sharing process Unicode support fixes and other bugfixes 0.4.18 Fixes for XFCE 4.10 and up and KDE 4.10 and up Other bugfixes 0.4.16, 0.4.17 Fixed Wallbase and Wallpapers.net support Quote plugins, much richer quote sources 0.4.14, 0.4.15 Add support for MATE 1.6 and Cinnamon 1.8 Better support for LightDM Fix problems with the folder choosers Many bugfixes 0.4.13 Bugfixes and polishing First translations added: Spanish, Russian, Bulgarian Better Remove source functionality 0.4.12 Quotes Preferences take effect immediately, no Save button Customizable indicator icon Image rating support 0.4.11 Bugfixes Option to choose between Move and Copy to Favorites 0.4.10 Media RSS support Live Earth sunlight map support Simplified menu (separate Playback submenu) Display source option Option to show recent downloads Support for command-line arguments 0.4.9 Mark current wallpaper in thumbnails view Bugfixes and speed improvements KDE support 0.4.8 Sharing to Facebook Option to show a nice clock on the desktop 0.4.7 Support more desktop environments out of the box (Tested on Xubuntu, Lubuntu, Mint MATE and Mint Cinnamon) 0.4.6 Reordered menu for quicker access to most common actions Added Fast Forward function to skip forward history 0.4.5 History view Better thumbnails view: configurable size and position, file operations 0.4.4 Faster filters Store origin info inside image metadata, not txt files 0.4.1 - 0.4.3 Added thumbnail view, initial version. Bugfixes. 0.4 Manual image downloading via drag-and-drop or clipboard 0.3.14 Editing of sources Better trash/favorite operations 0.3.13 Wallbase.cc support NASA Astronomy Picture of the Day support variety-0.8.13/data/ui/edit_favorite_operations_dialog.xml000066400000000000000000000006611475753071700237670ustar00rootroot00000000000000 variety-0.8.13/data/ui/preferences_variety_dialog.xml000066400000000000000000000006331475753071700227430ustar00rootroot00000000000000 variety-0.8.13/data/ui/privacy_notice_dialog.xml000066400000000000000000000006101475753071700217100ustar00rootroot00000000000000 variety-0.8.13/data/ui/welcome_dialog.xml000066400000000000000000000005571475753071700203370ustar00rootroot00000000000000 variety-0.8.13/data/variety-autostart.desktop.template000066400000000000000000000006751475753071700231430ustar00rootroot00000000000000[Desktop Entry] Name=Variety Comment=Variety Wallpaper Changer Categories=GNOME;GTK;Utility; Exec=/bin/bash -c "sleep 20 && {VARIETY_PATH} --profile {PROFILE_PATH}" MimeType=text/uri-list;x-scheme-handler/variety;x-scheme-handler/vrty; Icon=variety Terminal=false Type=Application StartupNotify=false Actions=Next;Previous;PauseResume;History;Preferences; Keywords=Wallpaper;Changer;Change;Download;Downloader;Variety; StartupWMClass={WM_CLASS} variety-0.8.13/data/variety-profile.desktop.template000066400000000000000000000017071475753071700225520ustar00rootroot00000000000000[Desktop Entry] Name={PROFILE_NAME} - Variety Comment=Variety Wallpaper Changer, running with profile {PROFILE_NAME} Categories=GNOME;GTK;Utility; Exec={VARIETY_PATH} --profile {PROFILE_PATH} %U MimeType=text/uri-list;x-scheme-handler/variety;x-scheme-handler/vrty; Icon=variety Terminal=false Type=Application StartupNotify=false Actions=Next;Previous;PauseResume;History;Preferences; Keywords=Wallpaper;Changer;Change;Download;Downloader;Variety; StartupWMClass={WM_CLASS} [Desktop Action Next] Exec={VARIETY_PATH} --profile {PROFILE_PATH} --next Name=Next [Desktop Action Previous] Exec={VARIETY_PATH} --profile {PROFILE_PATH} --previous Name=Previous [Desktop Action PauseResume] Exec={VARIETY_PATH} --profile {PROFILE_PATH} --toggle-pause Name=Pause / Resume [Desktop Action History] Exec={VARIETY_PATH} --profile {PROFILE_PATH} --history Name=History [Desktop Action Preferences] Exec={VARIETY_PATH} --profile {PROFILE_PATH} --preferences Name=Preferences variety-0.8.13/debian/000077500000000000000000000000001475753071700145305ustar00rootroot00000000000000variety-0.8.13/debian/changelog000066400000000000000000001222631475753071700164100ustar00rootroot00000000000000variety (0.8.13) noble; urgency=medium * Fix #741: Fix downloading server side options (remove tiny.cc redirector) * Fix #733: Fix for EarthviewDownloader * Fix #704: In "smart" display mode, tile small wallpapers using ImageMagick (#727) * Improvement #731: Add support for KDE 6 lockscreen * Improvement #752: set_wallpaper: default to feh/nitrogen instead of hardcoding a list of WMs * Feature #756: Add support for Fluxbox (via fbsetbg) * Feature #619: Add regex name filter for wallpapers * Update French and German translations -- James Lu Tue, 28 Jan 2025 19:01:27 -0800 variety (0.8.12) jammy; urgency=medium * Fix #672: add support for KDE Plasma 6 -- James Lu Sat, 20 Jan 2024 14:37:23 -0800 variety (0.8.11) jammy; urgency=medium * Fix #652: use importlib to support Python >= 3.12 * Fix #424: Use only the primary monitor for thumbs window (#649) * Improvement #609: filter Unsplash Plus images * Improvement #604: download UHD images from Bing * Feature #621: Add AVIF image format support * Updated translations: Spanish (#607) and Brazilian Portuguese (#614) * set_wallpaper: add support for i3-gnome (#595), Hyprland (#618), spectrwm (#626) * set_wallpaper: only set Plasma wallpaper on desktops using an image background (#611) * set_wallpaper: use dbus-send instead of qdbus for setting KDE wallpaper (#633) -- James Lu Fri, 27 Oct 2023 18:12:42 -0700 variety (0.8.10) jammy; urgency=medium * Bugfix #577: Fix Unsplash downloads * Bugfix #553: Keep the current quote when using Image->Next * Bugfix #418: on AwesomeWM, apply the same image on all monitors separately instead of stretching across them * Feature #559: add support for handling Unsplash topic URLs * Improvement #586: Use official API for EarthView -- James Lu Sun, 29 Jan 2023 00:51:42 -0800 variety (0.8.9) focal; urgency=medium * Bugfix #536, #537: Fix errors when there is no primary monitor configured -- Peter Levi Thu, 23 Jun 2022 00:22:00 +0200 variety (0.8.8) focal; urgency=medium * Feature #89: Added options to select fit size / wallpaper mode. Added an image-dependent smart fit mode. * Bugfix #519: Fix issues with autostart. * Bugfix #534: Fix the fallback Wallhaven non-API downloading mode used for some Wallhaven URLs. * Bugfix #480: Improve image searching: Avoid deep/huge folders causing Variety to ignore the other folders. -- Peter Levi Fri, 17 Jun 2022 13:00:00 +0200 variety (0.8.7) focal; urgency=medium * Added a global switch to turn Internet connectivity for Variety off or on * Wallhaven sources now use the Wallhaven API, not html parsing * Support for fetching NSFW images from Wallhaven * Auto-upgrade set_wallpaper/get_wallpaper scripts. Should fix issues with Dark style in GNOME. * Newly added non-configurable sources will be disabled by default -- Peter Levi Sat, 30 Apr 2022 19:00:41 +0200 variety (0.8.6) focal; urgency=medium * New source: National Geographic's photo of the day * New source: ArtStation * Add support for Gnome's Dark style * Change default font for quotes and clock to Serif for greater compatibility * Translation updates and bugfixes -- Peter Levi Sat, 23 Apr 2022 16:10:41 +0200 variety (0.8.5) focal; urgency=medium * Fixes for Python 3.9 support * Fix GH-388: Cleanup of wallpaper folder now cleans all image types * Fix GH-363: We were almost never triggering purging downloads * Enable support for Qtile-venv (GH-386) * Updated Japanese translations -- James Lu Tue, 01 Dec 2020 22:10:41 -0800 variety (0.8.4) focal; urgency=medium * Remove dead Desktoppr, ChromeOS sources (GH-323) * Properly verify TLS certificates when downloading images (GH-326) * Fix banning images when using Delete to Trash option (GH-304) * Preserve file extensions when copying wallpapers to another folder (GH-240) * Fix crash in indicator code when image origin is not available (GH-287) * Remove spurious "No such schema “org.cinnamon.desktop.background” errors" (GH-329) * Update Unsplash rate limit (GH-332) * Better detection for AwesomeWM (GH-282) -- James Lu Thu, 16 Jul 2020 11:30:53 -0700 variety (0.8.3) bionic; urgency=medium * Remove World Sunlight Map source -- Peter Levi Wed, 12 Feb 2020 01:12:00 +0200 variety (0.8.2) bionic; urgency=medium * Bugfixes * Added Urban Dictionary and UNIX fortune program as quote sources -- Peter Levi Thu, 09 Jan 2020 8:41:00 +0200 variety (0.8.1) bionic; urgency=medium * Bugfixes -- Peter Levi Sat, 28 Dec 2019 23:06:00 +0200 variety (0.8.0) bionic; urgency=medium * Image sources are now plugins * Add support for sequential albums * Add support for multiple simultaneously running Variety profiles (--profile command option) * Add a Privacy Notice dialog * Add support for configurable Unsplash sources * Add two new sources (ChromeOS Wallpapers and Google Earth View Wallpapers) * Download linked to wallpaper changing, not configured as a separate interval * Add a dedicated --set/--set-wallpaper option * Make the thumbs display much faster * Fix bugs related to GTK threading usage * Mulitple bugfixes * Dev process: Use auformatting on all Python files (black, isort) -- Peter Levi Sun, 22 Dec 2019 10:38:00 +0200 variety (0.7.2) bionic; urgency=medium * Add support for Sway, bspwm * Enable AwesomeWM support by default * Fix crash on --help or --version if a Variety instance is already running (GH-148) * Fix spurious "file not found" errors when checking for animated GIFs (GH-132) * New translations: Chinese, Japanese -- James Lu Sun, 21 Apr 2019 19:36:59 -0700 variety (0.7.1) bionic; urgency=medium * Fix remaining bugs from the Python 3 port: errors when saving favorite quotes and generating pencil_tile.png -- James Lu Tue, 23 Oct 2018 08:49:01 -0700 variety (0.7.0) bionic; urgency=medium * New translation: Turkish * Fix possible download issues when upgrading from older Variety versions and having safe mode enabled * GoodreadsSource: fix stray HTML tags being displayed in quote authors -- James Lu Tue, 17 Jul 2018 15:41:18 -0700 variety (0.7.0~a1) UNRELEASED; urgency=medium * Port to Python 3 * Fix broken trash deletion on some systems by directly using Gio libraries * Fix potential log file corruption when trying to start multiple instances * Support for setting GNOME Screensaver / GDM background * Removed outdated functionality for publishing to Facebook * Updated URL for QuotationsPage plugin * Update default clipboard_hosts: add deviantart.net, imageshack.com; remove (dead) ns223506.ovh.net -- James Lu Tue, 17 Jul 2018 15:41:18 -0700 variety (0.6.9) bionic; urgency=medium * Removed broken "SSL dependency" installation code * Fix trash deletion (0.6.8 regression) and replace gvfs-trash (deprecated) with 'gio trash' * Skip metadata checks on non-image files, leading to "GExiv2: unsupported format" warnings * Use subprocess.Popen to run xdg-open so that it doesn't block on some distros (LXQt, Trinity DE) * Removed more dead code related to VRTY.org, Panoramio, KDE 4 * Add get_wallpaper support for KDE Plasma 5; fix support for LXDE * Move bug tracker links to GitHub -- James Lu Thu, 12 Jul 2018 11:01:25 -0700 variety (0.6.8) bionic; urgency=medium * Unsplash API update * Remove everything related to VRTY.org which is not running anymore -- Peter Levi Wed, 11 Apr 2018 00:20:03 +0200 variety (0.6.7) bionic; urgency=medium * Fix "unary operator expected" errors on KDE variables in set_wallpaper * New WM support: i3 with logging (i3-with-shmlog), Moksha (e17 fork), dwm * i3 and openbox code now uses either feh or nitrogen interchangeably * Removed Debian-specific use of dpkg-query in checks for nitrogen * Switch to Ayatana indicators by default, patch by Unit 193 * Many fixes to set_wallpaper pointed out by shellcheck -- James Lu Mon, 26 Mar 2018 18:12:12 -0700 variety (0.6.6) xenial; urgency=medium * [Security] Fixed multiple shell injection issues in the "Delete to Trash", filter, and clock code * Add long-awaited wallpaper changing support on KDE Plasma 5 * Fix crash when gi-appindicator isn't installed * Removed verbose console output by default, as this tends to spam syslog and ~/.xsession-errors when launched via autostart - see https://bugs.launchpad.net/bugs/1685003 * Fixed Variety showing the wrong version in the About dialog -- James Lu Tue, 19 Sep 2017 11:50:11 -0700 variety (0.6.5) xenial; urgency=medium * Variety 0.6.5: See https://bazaar.launchpad.net/~variety/variety/trunk/changes/599 for a list of changes. -- James Lu Tue, 22 Aug 2017 11:50:11 -0700 variety (0.6.4) trusty; urgency=low * Remove automatic killswitch for old versions -- Peter Levi Fri, 29 Apr 2017 00:20:03 +0200 variety (0.6.3) trusty; urgency=low * Add way to outdate old versions -- Peter Levi Fri, 22 Jul 2016 00:20:03 +0200 variety (0.6.2) trusty; urgency=low * Safe mode added for filtering out NSFW images * Initial version of anonymous stats reporting -- Peter Levi Fri, 22 Jul 2016 00:20:03 +0200 variety (0.6.1) trusty; urgency=low * Workaround for Wallhaven SSL issues * Removed code for no-longer supported Wallpapers.net source -- Peter Levi Fri, 22 Jul 2016 00:20:03 +0200 variety (0.6.0) trusty; urgency=low * Added Variety Slideshow * Using official Unsplash API now -- Peter Levi Wed, 30 Dec 2015 01:45:03 +0200 variety (0.5.5) precise; urgency=low * Bumped the version to 0.5.5 * Updated translation files * Added some more default image sources * Disable Latest source by default, put NSFW warning in description * set_wallpaper: Fix support for KDE Plasma 5 * Fixed minor typo in Add Reddit dialog -- Peter Levi Sun, 20 Sep 2015 00:33:42 +0300 variety (0.5.5) precise; urgency=low * Bumped the version to 0.5.5 * Updated translation files * Added some more default image sources * Disable Latest source by default, put NSFW warning in description * set_wallpaper: Fix support for KDE Plasma 5 * Fixed minor typo in Add Reddit dialog -- Peter Levi Sun, 20 Sep 2015 00:33:04 +0300 variety (0.5.4ubuntu1) precise; urgency=low * -- Peter Levi Sun, 20 Sep 2015 00:27:37 +0300 variety (0.5.4) precise; urgency=low * Updated setup.py to not change icon paths in desktop file * Remove requests dependency for UnsplashDownloader * Remove requests dependency for UnsplashDownloader * More localization-related fixes * Fix UI of all dialogs to prevent labels from maximizing them horizontally * Localization-related fixes. Updated translations. * Minor update to changes and tips info * Smart: updated report_file to heed needs_reupload response * Bumping version number to 0.5.4 * Updated dependencies in debian/control to include python-requests * Disable sorting of Images table by clicking in header * UI cosmetics on non-Unity: Add some spacing between buttons next to Images table * Fix UI of PreferencesVarietyDialog to prevent labels from maximizing it horizontally * Use explicit python2 hashbangs in all scripts, as Ubuntu will be moving to Python 3 as default * Removed some unnecessary junk files * Unsplash: sanitize filenames of downloaded images, just in case some unexpected char pops up there in the future * Added support for Unsplash.com * Added Bing Photo of the Day image source * Update tests to run on local modules, not global Variety modules * Simplify Donate tab in Preferences * Small change to bin/variety to facilitate local testing when Variety is installed in the classic Debian way * Preparing to move Variety to a classic Debian-style package: Icons * Fixed Facebook publishing: use publish_actions scope * Fixes to LXQt support (thanks to Erik Nelson) * Add out-of-the-box support for LXQt (Thanks to panfren) * Better detection of images coming from MediaRSS feeds when sourceType is missing * Out-of-the-box support for i3-wm -- Peter Levi Wed, 05 Aug 2015 23:01:43 +0300 variety (0.5.3ubuntu1) precise; urgency=low * -- Peter Levi Wed, 05 Aug 2015 21:14:58 +0300 variety (0.5.3) precise; urgency=low * Updated some translations, added Korean * Bumped version ot 0.5.3 * Fix fetching of Wallhaven image SFW rating -- Peter Levi Sun, 08 Feb 2015 20:03:36 +0200 variety (0.5.2ubuntu1) precise; urgency=low * -- Peter Levi Sun, 08 Feb 2015 19:58:14 +0200 variety (0.5.2) precise; urgency=low * Bumping version to 0.5.2 * More logging by default, no need for -v argument * Missing XDG directory definitions were causing Variety to fail. Fixed now. -- Peter Levi Tue, 20 Jan 2015 12:08:11 +0200 variety (0.5.2) precise; urgency=low * Bumping version to 0.5.2 * More logging by default, no need for -v argument * Missing XDG directory definitions were causing Variety to fail. Fixed now. -- Peter Levi Tue, 20 Jan 2015 12:07:04 +0200 variety (0.5.1ubuntu1) precise; urgency=low * -- Peter Levi Tue, 20 Jan 2015 12:02:48 +0200 variety (0.5.1) precise; urgency=low * Bumping version to 0.5.1 * SafeLogger wraps all logging in lambda calls to avoid UnicodeDecodeErrors in building log messages * Add a No, thanks button to the VRTY.ORG invitation screen * Minor fix to move_or_copy_file to handle outer metadata.json files * Use safe_print to avoid UnicodeEncodeError when printing messages on badly configured terminals * VRTY.ORG invitation screen: Closing with X button or Esc is interpreted as Don't participate * Do not fail to start when smart_user.json is broken -- Peter Levi Sun, 11 Jan 2015 22:17:01 +0200 variety (0.5.0ubuntu1) precise; urgency=low * -- Peter Levi Sun, 11 Jan 2015 14:03:59 +0200 variety (0.5.0) precise; urgency=low * Smart: updated again some texts * Removed some unnecessary delays in Timer calls * Trashing was slow due to smart-reporting: update queues and wallpaper first, report and delete in an outer thread afterwards * Added TestRedditDownloader * Initial registration screen: Register link instructs user to look for a new browser tab * Smart: updated some welcome screens texts * Smart: try to load user in init to avoid exception related to creating RecommendedDownloader * Updated variety.pot * Bumped version to 0.5.0 * Merged variety-smart branch, preparing for 0.5.0 release * MediaRSS: use variety:author info when present * Merged in Simotek's Enlightenment related fix * Minor refactor: added VarietyWindow.register_downloaded_file * Show Next and Previous in main menu only in non-Unity DEs (Unity supports indicator scroll, no need for them there) * Make sure to delete metadata json when purging downloaded folder * Unicode: Make _u and _str transparent for None * Util.get_xdg_pictures_folder uses GLib.get_user_special_dir(GLib.USER_DIRECTORY_PICTURES), not subprocess call to xdg-user-dir * Merge in multi-screen Enlightenment-related changes from Simotek * set_wallpaper: Do not call unity-greeter gsettings command, it is causing issues on some machines * Use another server options URL, specific for the current version. * Merge changes to indicator.py from variety-smart * Merged in some changes from variety-smart * Merged in updates to Downloaders from the variety-smart branch * Next and previous options in main menu * Bumping the version number to 0.4.21 * Added forgotten RedditDownloader.py * Added support for Reddit as an image source * Refactored out some duplicate code in AddXXXDialogs, added AbstractAddByQueryDialog * Option to search image with Google Image Search * More structured throttling of do_set_wp and scroll handling. Fix to ThumbsWindow when showing bad file * Autostart desktop file: use bash || command to run Variety wherever it is located. Create autostart entry on first run. Update it on every version upgrade * Minor fix to the desktop file * Ensure Variety starts and works OK when there is no wallpaper image * Fetch and save in EXIF SFW rating from Wallhaven * Update to Wallhaven search * Fixed some failing tests * Removed some outdated quotes-related tests * View at... option in right-click thumbnail menu as well * Updates related to Wallbase->Wallhaven change, not possible anymore to add Wallbase sources * Wallbase -> Wallhaven update to default sources * Adding Wallhaven.cc support * Merging changes to reading/writing metadata from variety-smart * Bugfix: do not remove delete wallpaper file in cleanup_old_wallpapers() * Faceboook sharing: do not include link to full image, let Facebook choose image itself * Bugfix: Make sure all dialogs require just one click on the X button to close * Bugfix: Add image source dialogs required two clicks on the X button to close * Use proper origin URL for Desktoppr images * Fix Unicode error related to non-ascii font names -- Peter Levi Wed, 07 Jan 2015 09:34:19 +0200 variety (0.4.20) precise; urgency=low * Bumping version to 0.4.20 * set_wallpaper: Do not call the XFCE-related code when xfconf-query is not present * Another Unicode-related fix (logging with -vvv was throwing Unicode- related errors) * Another Unicode-related fix * Another Unicode-related fix -- Peter Levi Mon, 05 Jan 2015 01:36:09 +0200 variety (0.4.19ubuntu1) precise; urgency=low * -- Peter Levi Thu, 17 Jul 2014 15:46:32 +0300 variety (0.4.19) precise; urgency=low * Fix to Facebook first run dialog. Added latest translations. * Separate Author entry in menu for images from Panoramio * Bumped version to 0.4.19 * Merged with trunk * Save author when dowloading from Panoramio * Panoramio support: added search box * Panoramio support, initial drop * Thumbs: show 100, not 200 images, reduces CPU spike period * Menu: merged Playback and Image submenus * Facebook sharing: Updated text of first time dialog * Facebook sharing updates, bugfix * Polishing updates to Facebook publishing. Easy way to include quote with image. * Facebook authentication uses variety:// redirects, not internal Webkit windows * More explicit Unicode handling. Tackle unicode encode/decode errors by working with unicode internally for filepaths, options, etc. * Minor update to indicator icon * Use 22px png for the indicator, not svg - works better in XFCE and Gnome * Minor fix related to clipboard monitoring hosts * Removed preferences for Facebook and Rating menuitems, not needed anymore * Added support for Enlightenment * Streamlining the menu, TODO: remove preferences for Facebook and Rating menuitems * Menuitem and command option to show thumbsbar for manual wallpaper selection * Fixing Wallpapers.net support * Update Flickr calls to use https (Flickr closed non-SSL API access) * Cinnamon: Fix for reverting scaling mode to Zoom on every WP change -- Peter Levi Tue, 15 Jul 2014 09:02:16 +0300 variety (0.4.18ubuntu1) precise; urgency=low * -- Peter Levi Tue, 15 Jul 2014 01:32:31 +0300 variety (0.4.18) precise; urgency=low * Adding latest translations * Bumping version to 0.4.18 * Note about KDE updated in tips and tricks * Changes to KDE support. Added more translations. * Fix support of XFCE (4.10 changed the way wallpapers are set) * Fix 'Desktop manager not active' bug caused by pcmanfm - run it only when LXDE active * Merge * Fixed an https-related problem with Flickr (Bug #1305370) * Fixes in the changelog for some build experiments * Streamlined the image-searching code * Local files quotes plugin was getting perplexed by Windows line endings * Add missing Texts.py * Some slight chnages to texts, Bulgarian transaltion updated * Bitcoin donate link * Translatable image source descriptions * Translatable filter names * Translatable tips and tricks * More fixes to saving quotes to Favorites * Configurable location of quotes favorites file * Saving favorite quotes: use % for delimiter, as in the fortune file format * Proper fix for bad unicode characters in quotes from TheQuotationsPage * Options to save quotes to favorites and view the saved favorites * Replace some more bad unicode characters in quotes from TheQuotationsPage * Replace some bad unicode characters in quotes from TheQuotationsPage * Ignore error when GSettings lookup fails * Creating ubuntu package * Bugfix: Wallpapers.net downloader was failing when there were subcategories on the page -- Peter Levi Fri, 09 May 2014 11:35:52 +0300 variety (0.4.17ubuntu1) precise; urgency=low * -- Peter Levi Fri, 09 May 2014 11:32:53 +0300 variety (0.4.17) precise; urgency=low * Upped version to 0.4.17 * Fix Wallbase collections URLs support -- Peter Levi Thu, 26 Sep 2013 18:39:46 +0300 variety (0.4.16) precise; urgency=low * Append http: to links starting with // * Updated translation files * Quick access to quotes preferences * QuotesEngine: different notif. warnings when sites are down and when search criteria are bad * Changes to filters - removed charcoal, added soft blur * Option to reveal the clean image when using any effects * Upped version to 0.4.16 * Added Recommended sources link under image sources list * Quotes: better search by tags for Goodreads; local files also support fortune file format * Mrgd in variety-plugins * Updated Wallbase dialog - simpler, allows entering keywords or URL * Updating WallpapersNetDownloader to work with current Wp.net site * Updating WallbaseDownloader to work with current Wallbase site * QuoteWriter now works on GTK thread (fixes potential SegmentationFault) * Proper handling of terminating signals * Fix bad quotes in Cinnamon section in set_wallpaper -- Peter Levi Wed, 25 Sep 2013 00:08:30 +0300 variety (0.4.15ubuntu1) precise; urgency=low * -- Peter Levi Tue, 24 Sep 2013 23:43:57 +0300 variety (0.4.15) precise; urgency=low * Merged from trunk -- Peter Levi Tue, 11 Jun 2013 23:27:18 +0300 variety (0.4.14) precise; urgency=low * Allow themeable indicator icon (looks for variety-indicator icon name). Updated translations. * Fixing UnicodeDecodeErrors when applying filters or clock * Enhanced LightDM support: more flexible in the case of encrypted home * Log exceptions in Util.makedirs. Minor test added. * Updates changes.txt, preparing to release 0.4.14 * Fix get_wallpaper to better differentiate between MATE 1.6 and older * Bug 1173347: Remove sources button was not always showing menu * FolderChooser: show only basename, not full path * Custom FileChooser replaces the very buggy Gtk.FileChooserButton * Updated perform_upgrade functionality to reflect the changes to scripts and to wallpaper setting functionality * Removed unused apport and GSettings code (auto-generated by quickly) * Bug 1136025: Use trash-put (from trash-cli) for Delete to Trash * Bug 1181628: Always use different filename on wallpaper update * Bug 1181736: use ~ for paths when possible when persisting config file * Add support for Cinnamon 1.8 * Option for better LightDM support * Fix for #1171552: Guard set_wallpaper with a timeout to prevent from hangs * Merged: Add support for MATE 1.6 * Add X-GNOME-Autostart-Delay=20 to autostart desktop file, should fix bug #1163172 * Do not crash if gsettings schema org.gnome.desktop.background is missing * Filters can now use %FILENAME% and %FILEPATH% variables for image annotation * #1173636: Pass original filename as third parameter to set_wallpaper * Some more logging in VarietyWindow * Logging: add time; log all method calls when run with -vvv * Fix exception when deleting to Trash * Updated changes.txt -- Peter Levi Tue, 11 Jun 2013 23:22:32 +0300 variety (0.4.13ubuntu1) precise; urgency=low * -- Peter Levi Tue, 11 Jun 2013 09:31:09 +0300 variety (0.4.13) precise; urgency=low * Try/finally around some remaining threads_enter/threads_leave calls * Changed server options URL; Use Cache-Control header to avoid stale data from server * Adding translations: es, ru, bg * Minimum download interval increased to 1 minute; Serverside options support for Wallpapers.net downloader as well * Bugfix: Also clear prepared_from_downloads when prepared queues need clearing * Use try/finally around all places using Gtk.threads_enter/threads_leave to prevent from freezes in case of error * FB image publishing might sometimes fails without a valid reason. Solved by retrying up to 3 times. * Updated variety.pot * Auto-update set_wallpaper script on upgrade when it has not been modified by the user * Fix freezing when exceptions happen in update_indicator * Translations: Fix to Light/Dark translation context * Updated pot file * Minor fix: delay fetching of server options at start * Quotes were giving an error on KDE, installing python-gi-cairo fixes it - adding it to deps * XFCE was not refreshing wallpaper when using quotes or clock * Bug #1096630: Fix exception on first run when there is no current wallpaper image * Log to a file (~/.config/variety/variety.log), not only to console * Prettier approach to fetching serverside options; Added supoprt for server-defined Wallbase min intervals * Minor fix to the Remove... menu labels * Pressing Enter now works in the Add dialogs (no need to click OK) * Removing sources and files: take actions to remove the files from various queues * Remove sources menu to delete or not the downloaded files; initial version * Changes to AUTHORS and copyright notice in FacebookHelper * Bugfix: Proper clearing of prepared buffer when settings change * Support for showing a serverside-obtained status message in Preferences * Dynamic restrictions on how often Flickr API calls are made * More minor localization-related fixes * Upgrade handling support. Handle download folder changes on upgrade to 0.4.13 * More options for the download folder - allow it to be an empty folder, or one used before for downloading * Translating to Bulgarian and fixing various localization issues on the way * Protect user files when changing download folder: Use a subfolder when DL dir is outside Variety's config dir * Bug 1084961: modifying the thumbs bar prefs was only hiding it, not showing it again with the new settings * Fixes for SVG: Util.get_size was failing; Run no filtering if the filter is empty (e.g. Keep original) -- Peter Levi Thu, 14 Feb 2013 16:43:14 +0200 variety (0.4.12ubuntu1) precise; urgency=low * -- Peter Levi Thu, 14 Feb 2013 16:32:46 +0200 variety (0.4.12) precise; urgency=low * Updated tips and changes txt * Bugfix: Save original wallpaper name when quotes are applied * Bugfix: a download was forcing the thumbs window to reshow when already hidden * Minor fix * Improvements related to image preparing; Minor bug-fixes * Trigger a download when too few images found; Livelier thumbs when showing folders, not only history and downloads (new downloads are auto-shown) * Merged in variety-instant-preferences * Fix: removed class Window was still referred at one place * Replaced some unnecessary timers with calls to GObject.timeout_add * Reordered prefs tabs. Command-line way to set options * Added UI preferences tab * Removed unneeded files * Stripping VarietyWindow from Quickly's boilerplate; Separate WelcomeDialog * Quotes: fix image scaling * Merged in lp:~peterlevi/variety/variety-quotes * Unity qucklist added, initial version; Show Preferences if run again with no parameters - better launcher button behaviour * Commandline options to hide/show/toggle visibility of indicator icon and to show preferences * Added Rating option to main menu - optional (off by default) * Added funtionality to set image ratings * Filtering by rating added; Preparations for adding simple functionality to rate images * Ensure wallpaper is changed even if the current background is a solid color in Gnome/Unity * Minor fixes * Commandline options for toggling History and Recent downloads * Updated icons 14x14 and 16x16 * Thumbs: back to showing 200 instead of 100 * When appindicator is not present fallback gracefully to a GTK StatusIcon * Minor fix * Made strings translatable * Updated chnages.txt; Fixed unnecessary heavy preparing of images during purge_download_folder * Better prioritizong of new downloads to give equal exposure to refreshers and normal downloading sources * Added a Donate page and link in preferences -- Peter Levi Tue, 27 Nov 2012 00:08:57 +0200 variety (0.4.11ubuntu1) precise; urgency=low * -- Peter Levi Mon, 26 Nov 2012 23:54:26 +0200 variety (0.4.11) precise; urgency=low * Fix for WB * Minor bugfixes * Fix separators - call SeparatorMenuItem.new() instead of SeparatorMenuItem() * Option to choose between Copy to Fav, Move to Fav. * Option to choose between Copy to Fav, Move to Fav. Fixes to thumbs popup menu. * Use gvfs-trash for proper moving to trash, not custom file move operation * Bugfix 1064592: Preferences dialog too high for netbooks (1024x600px) * Bugfix 1065284: Thumbs: Auto-scrolling continues even after user pops a right-click menu or sets a wallpaper * Bugfix for 1064667: Variety doesn't fetch images urls from InterfaceLift - use a normally looking User-Agent for all requests * Bugfix for 1051743: Variety sometimes uses 100% of the CPU -- Peter Levi Tue, 16 Oct 2012 22:25:20 +0300 variety (0.4.10) precise; urgency=low * Minor edit of Media RSS dialog text * Set proper Media RSS dialog title * Updated changes.txt for 0.4.10 * Updated MediaRSS dialog; Thumbs: show less thumbs (100, not 200), but faster so dialog is fully responsive sooner * Minor fix - append to history only when image is not same as previous one * More work for EarthDownloader; Bugfix: sources Enable checkboxes were not always reacting to clicks * Live Earth sunlight map support, initial version * Simplified menu - moved rarely used playback items to a submenu * Display Source option implemented, initial version * URL-unquote and make safe local filename when downloading. More Picasa-specific rss fixes * Picasa RSS feeds - add imgmax=d parameter to feed URL to get full image resolutions * Wrap url in quotations when calling xdg-open with it * Recent downloads view * #1048238 Fix fetching a file with same name as existing file * Media RSS feeds, initial support * Command-line options for next, previous, fav, trash, pause, etc. Can be used at start or passed via dbus to running instance -- Peter Levi Sun, 07 Oct 2012 15:50:37 +0300 variety (0.4.9ubuntu1) precise; urgency=low * -- Peter Levi Tue, 11 Sep 2012 00:04:04 +0300 variety (0.4.9) precise; urgency=low * Autostart: create .config/autostart if needed; Handle case when user sets local clock back in time * KDE support, initial version * Do not destroy preferences dialog, just hide it, cache it on start - shows much faster now * Thumbs menu: radio mark on the current size and position menu items * Initial wallpaper refresh in a Timer - faster start when filters are used * Minor fix: make prepare thread not wake every 30 seconds * Clipboard monitoring: option to bypass the whitelist * Separate filter and clock filter so that only clock filter is applied every minute (reduced CPU usage when both are used); Better icon (128 px, not blurry in gnome shell) * Persist last wallpaper change moment. Use it when change interval is >= 6 hours to ensure wallpaper changes regularly even between restarts; Fixed bug in history persisting - was persisting too much * Minor fix to comments in variety.conf * Marking of current file in thumbnails view * Proper listening for thumbs window closed event - updates the Close/Show history state -- Peter Levi Tue, 04 Sep 2012 23:02:17 +0300 variety (0.4.8ubuntu1) precise; urgency=low * -- Peter Levi Mon, 03 Sep 2012 17:20:48 +0300 variety (0.4.8) precise; urgency=low * Facebook - show image in publish dialog; Clock - apply on start, hide on quit; Bugfixes for Facebook and clock * Clock, initial version * Sharing on Facebook, initial version * Reread options from file just before Save, so as not to persist stale options * Better handling of dropping local images - do not fetch them, add them directly; Proper update of history view on fetch/add * Sharing on Facebook, initial support infrastructure * Beeter blur filter -- Peter Levi Sat, 18 Aug 2012 16:43:20 +0300 variety (0.4.7ubuntu1) precise; urgency=low * -- Peter Levi Sat, 18 Aug 2012 16:39:10 +0300 variety (0.4.7) precise; urgency=low * More fixes to support Xubuntu, Lubuntu, Mint properly * Bug #1036649, Make prefs dialog non-modal - thumbnails window was not receiving any clicks on XFCE, LXDE, MATE * Updated get/set wallpaper scripts, tested on XFCE, LXDE, MATE * Persist history between runs -- Peter Levi Fri, 17 Aug 2012 18:55:15 +0300 variety (0.4.6ubuntu1) precise; urgency=low * -- Peter Levi Wed, 15 Aug 2012 09:01:52 +0300 variety (0.4.6) precise; urgency=low * One more slight chnage to order in menu * Updated changes * ImageFetcher: use fetched image as notification icon * Remove NSFW warning for Desktoppr - it now seems to return only safe images; make a sanity check in DesktopprDownloader * Reordered menu for faster access to most common actions (Fav/Trash); Added Fast Forward * Write more comprehensive origin metadata to downloaded images * Make indicator icon stand out better with Radiance theme -- Peter Levi Wed, 15 Aug 2012 16:13:08 +0300 variety (0.4.5ubuntu1) precise; urgency=low * -- Peter Levi Mon, 13 Aug 2012 10:33:29 +0300 variety (0.4.5) precise; urgency=low * More fixes to history display; some minor UI updates (tooltips, etc.) * Updated tips. Minor bugfix. * Better clicking in history; Bugfixes * Trash/Fav in thumbs menu; Live updating of thumbs for trash/history operations * Bugfix: Make scripts executable on start (Installation clears their executable bits) * Fixes - autosroll threads used to live forever and eat cpu * GTK threading fixes again * Slicker autoscrolling stop effect; Show History in menu * Refactored ThumbsWindow; Added size and position options for thumbnails * ThumbsWindow: support for other positions (not only bottom); no GUI yet * Minor fix * Autoscroll for thumbnails view * Merged convert-metadata and set/get wallpaper scripts revisions * Support for custom commands on wallpaper set - use scripts for getting/setting the wallpaper -- Peter Levi Sat, 11 Aug 2012 14:47:44 +0300 variety (0.4.4ubuntu1) precise; urgency=low * -- Peter Levi Sat, 11 Aug 2012 14:39:48 +0300 variety (0.4.4) precise; urgency=low * Updated changes.txt * Faster filters - scale to screen resolution first * More random Util.list_files - used to be lousy for deep big folders, now better but still far from being fair-random * Metadata inside image (XMP), txt file only as fallback * Use button - a quick way to set the sources to use * Simplify click handing code in ThumbsWindow -- Peter Levi Mon, 06 Aug 2012 01:43:04 +0300 variety (0.4.3ubuntu1) precise; urgency=low * -- Peter Levi Sun, 05 Aug 2012 23:30:04 +0300 variety (0.4.3) precise; urgency=low * Updated changes.txt * Bugfixes: more thumbs/gtk/threading fixes -- Peter Levi Fri, 03 Aug 2012 11:01:13 +0300 variety (0.4.3) precise; urgency=low * Updated changes.txt * Bugfixes: more thumbs/gtk/threading fixes -- Peter Levi Fri, 03 Aug 2012 10:42:03 +0300 variety (0.4.2) precise; urgency=low * Updated changes.txt * Bugfixes (mainly thumbs/gtk threading stuff); Forced kill when quit takes too long -- Peter Levi Fri, 03 Aug 2012 02:15:30 +0300 variety (0.4.1ubuntu1) precise; urgency=low * -- Peter Levi Fri, 03 Aug 2012 02:05:34 +0300 variety (0.4.1) precise; urgency=low * Update changes.txt * Select files to show as thumbnails randomly * Thumbnails, initial version * Focus newly added sources; When auto-populating sources and filters, only check the type/name for equality * Single Add button with a drop-down menu for the different image sources * Image preview when adding images; Removed unnecessary default sources * Bugfix: underscores in filename and folder path in indicator -- Peter Levi Thu, 02 Aug 2012 23:54:26 +0300 variety (0.4.1) precise; urgency=low * Update changes.txt * Select files to show as thumbnails randomly * Thumbnails, initial version * Focus newly added sources; When auto-populating sources and filters, only check the type/name for equality * Single Add button with a drop-down menu for the different image sources * Image preview when adding images; Removed unnecessary default sources * Bugfix: underscores in filename and folder path in indicator -- Peter Levi Thu, 02 Aug 2012 23:53:50 +0300 variety (0.4) precise; urgency=low * Extracted makedirs calls to Util * Bugfix: create config dir on startup * Minor fixes to clipboard monitoring * Minor fixes to fetching; Tips and tricks in Preferences * Cosmetic GUI fix * Preferences for manual downloading; Clipboard monitoring * Drag and drop support - drop an image link on the launcher icon to download the image * Merged quickly changes for 0.3.15 -- Peter Levi Thu, 02 Aug 2012 17:49:53 +0300 variety (0.3.15) precise; urgency=low * Bug fixed: update_indicator was failing on the first run (at startup) -- Peter Levi Tue, 31 Jul 2012 22:46:45 +0300 variety (0.3.14) precise; urgency=low * Disable Move/Copy immediately after automatic chnages to avoid inadvertent clicking; Better notifications; Better filters error handling * Bug #1027708: Change Move to Favs to Copy to Favs. Remove confirmation dialogs. * Open folder/View image instead of Edit for folders and images * Editing of sources now possible * Purge downloaders cache if size options change; Log level INFO on - v, DEBUG on -vv -- Peter Levi Tue, 24 Jul 2012 01:34:03 +0300 variety (0.3.13) precise; urgency=low * Minor fixes; Add some wallbase to default sources * Notify user when after Next or MoveToTrash we cannot find another image to display * Full Wallbase.cc support * Wallbase downloader added (no GUI yet); Some duplicate code refactored * Fix bug 1025615: Variety may refuse to start because of incorrect lock/PID checking -- Peter Levi Sun, 22 Jul 2012 03:08:30 +0300 variety (0.3.12) precise; urgency=low * NASA APOD - Use archive instead of RSS, but still always put in queue the newest 3 images * NASA's Astro pic of the day, initial support (RSS-feed-based) -- Peter Levi Mon, 16 Jul 2012 23:36:07 +0300 variety (0.3.11) precise; urgency=low * Merged in some suggested packaging-related changes from lp:~andrewsomething/ubuntu-app-reviews/variety * Fix bug: Flickr downloader could download several different sizes of the same image during several consecutive fills of the queue -- Peter Levi Thu, 12 Jul 2012 22:16:55 +0300 variety (0.3.10ubuntu1) precise; urgency=low * -- Peter Levi Thu, 12 Jul 2012 17:01:35 +0300 variety (0.3.10) precise; urgency=low * Initial release. -- Peter Levi Mon, 09 Jul 2012 21:30:07 +0300 variety-0.8.13/debian/compat000066400000000000000000000000021475753071700157260ustar00rootroot000000000000009 variety-0.8.13/debian/control000066400000000000000000000036321475753071700161370ustar00rootroot00000000000000Source: variety Section: graphics Priority: optional Build-Depends: debhelper (>= 9), dh-python, python3, python3-distutils-extra (>= 2.18) Maintainer: Peter Levi Uploaders: James Lu Standards-Version: 4.1.0 Homepage: https://github.com/varietywalls/variety/ Vcs-Git: https://github.com/varietywalls/variety Vcs-Browser: https://github.com/varietywalls/variety Package: variety Architecture: all Depends: gir1.2-gdkpixbuf-2.0, gir1.2-gexiv2-0.10, gir1.2-glib-2.0, gir1.2-gtk-3.0, gir1.2-notify-0.7, gir1.2-pango-1.0, imagemagick, python3-bs4, python3-lxml, python3-cairo, python3-configobj, python3-dbus, python3-gi, python3-gi-cairo, python3-packaging, python3-pil, python3-requests, ${misc:Depends}, ${python3:Depends} Recommends: gir1.2-ayatanaappindicator3-0.1 | gir1.2-appindicator3-0.1, python3-httplib2, fortune-mod, libavif-gdk-pixbuf Suggests: feh | nitrogen, gnome-shell-extension-appindicator | gnome-shell-extension-top-icons-plus Description: Wallpaper changer, downloader and manager Variety is an open-source wallpaper changer, downloader, and manager for Linux. It supports a variety of sources for wallpapers, including local files, online services such as Unsplash, Flickr, Wallhaven.cc, NASA Astronomy Picture of the Day, Desktoppr.co, and media RSS feeds (Picasa, deviantART, etc.). . You can also install the following (suggested) packages to enhance Variety's functionality on certain desktop setups: * feh | nitrogen: used for wallpaper changing on i3-wm, Openbox, and dwm * gnome-shell-extension-top-icons-plus: adds indicators support to GNOME Shell, so that Variety's tray icon can be displayed variety-0.8.13/debian/copyright000066400000000000000000000051711475753071700164670ustar00rootroot00000000000000Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: variety Upstream-Contact: Peter Levi Source: https://launchpad.net/variety Files: * Copyright: (C) 2012-2017, Peter Levi (C) 2012, Rosetta Contributors and Canonical Ltd License: GPL-3 Files: debian/* Copyright: (C) 2012-2017, Peter Levi (C) 2012, Rosetta Contributors and Canonical Ltd (C) 2015-2017, James Lu License: GPL-3 License: GPL-3 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, version 3. . 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 . . On Debian systems, the complete text of the GNU General Public License can be found in `/usr/share/common-licenses/GPL-3’. License: BSD-3-Clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: . 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. . THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. variety-0.8.13/debian/rules000077500000000000000000000006761475753071700156210ustar00rootroot00000000000000#!/usr/bin/make -f export PYBUILD_NAME=variety %: ifneq ($(shell dh -l | grep -xF translations),) dh $@ --with python3,translations --buildsystem=pybuild else dh $@ --with python3 --buildsystem=pybuild endif override_dh_auto_clean: # Remove the auto-generated .pot file so successive builds work. rm -f po/variety.pot dh_auto_clean override_dh_auto_test: # Not used in Debian build since they predominantly require network access true variety-0.8.13/debian/source/000077500000000000000000000000001475753071700160305ustar00rootroot00000000000000variety-0.8.13/debian/source/format000066400000000000000000000000151475753071700172370ustar00rootroot000000000000003.0 (native) variety-0.8.13/debian/variety.1000066400000000000000000000060111475753071700162730ustar00rootroot00000000000000.TH VARIETY "1" "March 2018" "variety 0.6.x" "User Commands" .SH NAME variety \- open\-source wallpaper changer for Linux .SH SYNOPSIS .B variety [\fI\,options\/\fR] [\fI\,files or urls\/\fR] .SH DESCRIPTION Variety is an open\-source wallpaper changer, downloader, and manager for Linux. It supports a variety of sources for wallpapers, including local files, online services such as Flickr, Wallbase.cc, Wallpapers.net, NASA Astronomy Picture of the Day, Desktoppr.co, and media RSS feeds (Picasa, deviantART, etc.). .SH NOTES Passing local files will add them to Variety's queue. Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue. .PP To set a specific wallpaper: variety \fI\,/some/local/image.jpg\/\fP \fB\-\-next\fR .SH OPTIONS .TP \fB\-\-version\fR show program's version number and exit .TP \fB\-h\fR, \fB\-\-help\fR show this help message and exit .TP \fB\-v\fR, \fB\-\-verbose\fR Show logging messages (\fB\-vv\fR shows even finer debugging messages, \fB\-vvv\fR debugs variety_lib too) .TP \fB\-q\fR, \fB\-\-quit\fR Make the running instance quit .TP \fB\-\-get\fR, \fB\-\-current\fR, \fB\-\-show\-current\fR Print the current wallpaper location. Used only when the application is already running. .TP \fB\-n\fR, \fB\-\-next\fR Show Next wallpaper .TP \fB\-p\fR, \fB\-\-previous\fR Show Previous wallpaper .TP \fB\-\-fast\-forward\fR Show Next wallpaper, skipping the forward history .TP \fB\-t\fR, \fB\-\-trash\fR Move current wallpaper to Trash. Used only when the application is already running. .TP \fB\-f\fR, \fB\-\-favorite\fR Copy current wallpaper to Favorites. Used only when the application is already running. .TP \fB\-\-move\-to\-favorites\fR Move current wallpaper to Favorites. Used only when the application is already running. .TP \fB\-\-pause\fR Pause on current image .TP \fB\-\-resume\fR Resume regular image changes .TP \fB\-\-toggle\-pause\fR Toggle Pause/Resume state .TP \fB\-\-quotes\-next\fR Show Next quote .TP \fB\-\-quotes\-previous\fR Show Previous quote .TP \fB\-\-quotes\-fast\-forward\fR Show Next quote, skipping the forward history .TP \fB\-\-quotes\-toggle\-pause\fR Toggle Quotes Pause/Resume state .TP \fB\-\-quotes\-save\-favorite\fR Save the current quote to Favorites .TP \fB\-\-history\fR Toggle History display .TP \fB\-\-downloads\fR Toggle Recent Downloads display .TP \fB\-\-preferences\fR, \fB\-\-show\-preferences\fR Show Preferences dialog .TP \fB\-\-selector\fR, \fB\-\-show\-selector\fR Show manual wallpaper selector \- the thumbnail bar filled with images from the active image sources .TP \fB\-\-set\-option\fR=\fI\,SET_OPTIONS\/\fR Sets and applies an option. The option names are the same that are used in Variety's config file ~/.config/variety/variety.conf. Multiple options can be set in a single command. Example: 'variety \fB\-\-setoption\fR icon Dark \fB\-\-set\-option\fR clock_enabled True'. USE WITH CAUTION: You are changing the settings file directly in an unguarded way. .TP \fB\-\-debug\-smart\fR Debug VRTY.ORG and sync functionality by using local server variety-0.8.13/debian/variety.manpages000066400000000000000000000000211475753071700177210ustar00rootroot00000000000000debian/variety.1 variety-0.8.13/jumble/000077500000000000000000000000001475753071700145645ustar00rootroot00000000000000variety-0.8.13/jumble/IPlugin.py000066400000000000000000000054501475753071700165110ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import abc class IPlugin(object, metaclass=abc.ABCMeta): """ The most simple interface to be inherited when creating a plugin. """ @classmethod @abc.abstractmethod def get_info(cls): """ Returns the basic info about the plugin. Please make sure the name is unique among all Variety plugins Format: return { "name": "Sample name", "description": "Sample description", "version": "1.0", "author": "Author name", # optional "url": "Plugin homepage URL" # optional } """ pass def __init__(self): """ All plugins must have a default constructor with no parameters. Remember to call super. """ self.active = False # These will be filled in by Jumble.load() and available before the first activate() call self.jumble = None self.path = None # Path to the plugin python file self.folder = ( None ) # Folder where plugin is located (can be used for loading UI resources, etc.). # This folder may be read-only. A separate config folder convention should be used to store config files. def activate(self): """ Called at plugin activation. Please do not allocate large portions of memory or resources before this is called. Remember to call super first. This method can be called multiple times within a session. It may be called when the plugin is already active - in this case it should simply return. """ if self.active: return self.active = True def deactivate(self): """ Called when the plugin is disabled. Please free used memory and resources here. Remember to call super first. This method can be called multiple times within a session. It may be called when the plugin is already inactive - in this case it should simply return. """ self.active = False def is_active(self): return self.active variety-0.8.13/jumble/Jumble.py000066400000000000000000000107031475753071700163550ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import importlib.util import sys import inspect import logging import os from .IPlugin import IPlugin logger = logging.getLogger("variety") class Jumble: def __init__(self, folders): self.folders = folders def _walk_python_files(self): for folder in self.folders: for location, directories, filenames in os.walk(folder): for f in filenames: if f.endswith(".py"): yield location, f def _walk_modules(self): for location, f in self._walk_python_files(): path = os.path.join(location, f) name = os.path.splitext(f)[0] if (spec := importlib.util.spec_from_file_location(name, path)) is not None: try: module = importlib.util.module_from_spec(spec) logger.info(lambda: "Jumble loading module in %s from %s" % (name, path)) sys.modules[name] = module spec.loader.exec_module(module) yield module, path except Exception: logger.exception("Could not load plugin module %s" % path) continue def _walk_plugin_classes(self): for module, path in self._walk_modules(): def is_plugin(cls): return ( inspect.isclass(cls) and issubclass(cls, IPlugin) and cls.__module__ == module.__name__ ) for name, cls in inspect.getmembers(module, is_plugin): yield cls, path def load(self): """ Loads all plugins from the plugin folders, without activating them """ logger.info(lambda: "Jumble loading") self.plugins = [] for cls, path in self._walk_plugin_classes(): try: info = cls.get_info() except Exception: logger.exception("Jumble: not a plugin class: %s" % str(cls)) continue if not info: logger.warning("Jumble: %s: get_info() returned None" % str(cls)) continue try: plugin = cls() logger.info(lambda: "Jumble found plugin class: %s: %s" % (str(cls), str(info))) plugin.jumble = self plugin.path = os.path.realpath(path) plugin.folder = os.path.dirname(plugin.path) self.plugins.append({"plugin": plugin, "class": cls, "info": info}) except Exception: logger.exception("Jumble: could not instantiate plugin class: %s" % str(cls)) continue def get_plugins(self, clazz=None, typename=None, name=None, active=None): """ Searches for plugins that match the given criteria. If no criteria are given, all loaded plugins are returned. :param clazz: parent plugin class; optional :param typename: plugin type name; optional :param name: plugin name, should match exactly; optional :param active: specifies whether the plugin should be currently active, or inactive; optional, by default both are returned :return: all matching plugins, as hashes {"plugin": plugin, "class": plugin_class, "info": info} """ return sorted( [ p for p in self.plugins if (not clazz or issubclass(p["class"], clazz)) and (not typename or p["class"].__name__ == typename) and (not name or p["info"]["name"] == name) and (active is None or p["plugin"].is_active() == active) ], key=lambda p: p["info"]["name"], ) variety-0.8.13/jumble/__init__.py000066400000000000000000000000001475753071700166630ustar00rootroot00000000000000variety-0.8.13/po/000077500000000000000000000000001475753071700137245ustar00rootroot00000000000000variety-0.8.13/po/bg.po000066400000000000000000002071751475753071700146700ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:05+0000\n" "Last-Translator: James Lu , 2021\n" "Language-Team: Bulgarian (https://www.transifex.com/variety/teams/123174/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "Не намерих картинки" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "Изберете папка" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "Отказ" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "ОК" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "Изтегляне" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "Не е картинка" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "Картинката е твърде малка, игнорираме я" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "Съжалявам, получихме грешка %s..." #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "Това означава, че линкът вече е невалиден" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "Изтеглянето беше неуспешно" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "" "За повече информация, моля стартирайте Variety в терминал с опция -v и " "повторете действието." #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "_Следваща" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "_Предишна" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "Текущ тапет" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "Отвори източника" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "Копирай в _Любими" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "Премести в Любими" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "Изтрий към Коша" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "Следваща, пропускайки историята" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Съвет: Скролирайте с колелцето\n" "върху иконата за да сменяте тапета." #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "Пауза върху тази картинка" #: ../variety/indicator.py:140 msgid "_Image" msgstr "_Картинка" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "Откъде идва?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "Покажи без ефектите" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "Търсене на картинката с Google Image Search" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "EXIF оценка" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "Запиши в Любими" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "Виж Любимите..." #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "Копирай в клипборда" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "Потърси цитата в Google" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "Потърси автора в Google" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "Настройки..." #: ../variety/indicator.py:250 msgid "Turn off" msgstr "Изключи" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "_Цитат" #: ../variety/indicator.py:262 msgid "_History" msgstr "_История" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "Избиране на тапет" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "_Скорошно изтеглени" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:300 msgid "About" msgstr "За приложението" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "Направи дарение" #: ../variety/indicator.py:308 msgid "Quit" msgstr "Изход" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "Получихме сигнал за излизане, излизаме..." #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Variety е вече пусната. Изпращаме командата към вървящата инстанция." #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr "" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Variety: Настройки" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "Картинки" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "Папки" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "Изтрий от списъка, запази файловете" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "Изтрий от списъка, запази файловете" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "Изтрий от списъка и изтрий изтеглените файловете" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "Изтрий от списъка и изтрий изтеглените файловете" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "Добавяне на картинки" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "Добави" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Добавяне на папки - добавяйте само най-горната папкa, подпапките се включват" " автоматично в търсенето" #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "Редактирай..." #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "Отвори папката" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "Виж картинката" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "Нямате права за писане" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "На успях да променя правата" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Може да пробвате ръчно да изпълните следната команда:\n" "sudo chmod %s \"%s\"" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "Няма плъгини за цитати" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "Нямате инсталирани плъгини за цитати" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "Няма подходящи плъгини за цитати" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "Никой от плъгините за цитати не поддържа търсене по думи и автори" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "Не успях да изтегля цитати" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "" "Може би няма връзка със сървърите за цитати, ще продължим да опитваме." #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "Не намерихме цитати" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "Може би търсите нещо твърде затънтено?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "Запазване на оригинала" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "Степени на сивото" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "Силно размазване" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "Леко размазване" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "Картина с маслени бои" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "Пойнтилизъм" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "Пикселизация" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "Папка с Любими" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "Папка с ръчно изтеглени" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "" "Препоръчано от Variety. Адаптира се към вкуса Ви докато маркирате картинки " "като любими или триете към коша." #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Случайно избрани тапети от Desktoppr.co" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "НАСА: Астрономическа смимка на деня" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "Bing Фото на деня" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "Фотографии с висока резолюция от Unsplash.com" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" "Можете да сменяте тапета като въртите колелцето на мишката нагоре или надолу" " върху индикаторната икона." #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" "Можете да контролирате Variety от командния ред, като това може да се " "използва и за да зададете глобални клавишни комбинации за фунцкиите, които " "ползвате най-често. Пуснете \"variety --help\", за да видите списък с " "достъпните команди." #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" "Сваляйте ръчно тапети като завлачите линк към картинката върху иконата на " "Variety в launcher-a. За по-бързо сваляне от конкретни сайтове може да " "включите и опцията за наблюдение на клипборда (вижте таба \"Ръчно " "изтегляне\")." #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" "Използването за филтъра за силно размазване е лесен начин да получите " "абстрактно-изглеждащи и ненатрапчиви тапети, подобни на стандартния тапет на" " Убунту." #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" "Когато селектирате някой източник, картинките в него се изобразяват в " "долната част на екрана. Натиснете върху картинка, за да я зададете като " "тапет. Натиснете с десен бутон за да затворите лентата и за други опции. Ако" " изберете няколко източника едновременно, ще видите картиките им заедно. " "Имайте предвид, че лентата с картинка е ограничена до няколкостотин случайно" " подбрани картинки от източниците." #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" "Индикаторната икона на Variety може да се настройва в GTK темата - ако " "изберете опцията \"Светла индикаторна икона\", Variety ще провери дали в " "текущата GTK тема има икона с име \"variety-indicator\" преди да използва " "стандартната си икона." #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "Долу" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Горе" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Вляво" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "Вдясно" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "Разположение" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "Размер" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "Отвори папката" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "Довлечено: Покажи източника" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "Виж във %s" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "Премести в _Любими" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "Затвори" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "Не успях да запиша EXIF оценката" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "Без оценка" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "Отхвърлено" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "Variety: История" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Variety: Скорошно изтеглени" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Variety: Картинки" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "Подай сигнал за излизане към вървящия процес" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" "Покажи пътя към текущия тапет. Използва се само при вървящо приложение." #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "Покажи следващия тапет" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "Покажи предишния тапет" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "Покажи нов тапет, като пропуснеш forward историята" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Премести текущия тапет в Коша. Използва се само при вървящо приложение." #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Копирай текущия тапет в Любими. Използва се само при вървящо приложение." #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Премести текущия тапет в Любими. Използва се само при вървящо приложение." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "Пауза върху текущата картинка" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "Поднови регулярната смяна" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "Паузирай или възобнови" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "Покажи следващия цитат" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "Покажи предишния цитат" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "Покажи нов цитат като пропуснеш forward историята" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "Паузирай или възобнови смяната на цитати" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "Запиши текущия цитат в Любими" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "Покажи или скрий историята" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "Покажи или скрий скорошно изтеглените" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "Покажи диалога за настройки" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Ръчен избор на тапет - показва лентата с картинки от текущо активните " "източници" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" "Задава и включва в действие дадена опция. Имената на опциите са същите като " "тези в конфигурационния файл ~/.config/variety/variety.conf. Могат да се " "задават няколко опции с една команда. Пример: 'variety --set-option icon " "Dark --set-option clock_enabled True'. ИЗПОЛЗВАЙТЕ ВНИМАТЕЛНО: Сменяте опции" " директно в конфигурационния файл без да се извършва проверка за коректност." #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "опциите --next/--fast-forward и --previous са взаимно изключващи се" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "опциите --trash и --favorite са взаимно изключващи се" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "опциите --pause и --resume са взаимно изключващи се" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "опциите --quotes-next/--quotes-fast-forward и --quotes-previous са взаимно " "изключващи се" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "Вече е в Любими" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "Неизвестно" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "Автор: %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "Поднови регулярната смяна" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "Твърде строги филтри?" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "" "Variety намира много малко картинки, които съответстват на филтрите ви." #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "" "Моля добавете още източници на картинки или изчакайте да се изтеглят нови" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "Моля добавете още източници на картинки" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "Няма повече тапети" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "Текущият тапет не е в никой от източниците" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "" "Не успях да преместя в %s. Вероятно нямате права да местите този файл." #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" "Не можах да копирам в %s. Вероятно нямате права да копирате този файл." #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "Неуспешно изтриване" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "Нямате права да преместите %s в Коша." #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "" "Ще отворя конфигурационния файл в редактор и ще презаредя промените след " "като запишете и затворите редактора." #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "Добавено в опашката" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "Натиснете \"Напред\" за да го видите" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "Изтеглено" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "Този тип източник не се поддържа" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "Сигурни ли сте, че използвате последната версия на Variety?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "Добавих нов източник на картинки" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "" "Този източник на картинки вече е в списъка, включихме го за използване." #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "Картинката беше изтеглена и зададена като тапет" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "Работи!" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "Ура, Variety линковете работят. Чудесно!" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "Неизвестна команда" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "Не успяхме да обработим зададения variety:// линк." #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "" "Стартирайте Variety с настройка за подробен лог, за да видите повече " "информация." #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "На успяхме да създадем Autostart файла" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "Случи се грешка при създаване на Autostart desktop файла.\n" "Моля пуснете Vairety в терминал с флаг -v и опитайте отново." #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "Относно Variety" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "" "Програма за автоматично изтегляне, управление и смяна на тапети за работния " "плот" #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://peterlevi.com/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr "" #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Variety - добавяне на Flickr като източник" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" "Моля задайте критерии за търсене във Flickr. Ще бъдат сваляни снимки, които " "отговарят на всички зададени критерии. Оставете ненужните критерии празни." #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "Етикети: " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "Списък от етикети, разделени със запетаи. Една снимка трябва да съдържа всичките етикети, за да отговаря на критериите.\n" "Пример: yellow,car" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "Потребител: " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "Моля въведете URL към фотострийма на Flickr потребител, или към някоя негова снимка.\n" "Пример: http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "Група: " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "Моля въведете URL на групата.\n" "Пример: http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "Текст:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "Свободен текст, който да бъде търсен в заглавията, описанията и етикетите на снимките. Cложете '-' в началото, за да изключите текст.\n" "Пример: apple -pie" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "Секунда да проверим това търсене" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Копирай в Любими или Премести в Любими" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "Върни оригиналната стойност" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "" "Изберете дали в менюто предпочитате \"Копирай в Любими\" или \"Премести в " "Любими\" в зависимост от папката, в която е картинката:" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "Моля въведете по един запис на линия, всеки от тях във формат <Папка>:, където Папка може да е Downloaded, Fetched, Others или път към локална папка.\n" "Редът е важен. Когато се покзва картинка, първата папка в този лист, която съдържа картинката, ще определи кои операции да се покажат в менюто на Variety. 'Others' трябва да бъде последен запис в списъка, понеже всеки файл попада в тази категория.\n" "\n" "Пример:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "секунди" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "минути" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "часа" #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "дни" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "Общи" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "Стартирай Variety при стартиране на компютъра" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "Сменяй тапета на всеки " #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "Минималният интервал е 5 секунди" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "Сменяй тапета при стартиране" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "Използвай" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "Тип" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "Адрес" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "_Добави..." #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "Добавяне на картинки, папки или онлайн източници" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "Редактиране на избрания източник" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "_Редактирай..." #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "_Изтрий…" #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "Премахване на избрания източник" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "_Използвай" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "Активирай избрания източник и деактивирай всички други" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "Любими" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "Копирай любимите тапети във " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "Филтри" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" "Върху тапетите прилагай някой случайно избран филтър от следните (с " "благодарности към ImageMagick):" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "Цитати" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "Показвай разнообразни умни цитати върху работния плот" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "Цвят на текста: " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "Шрифт на текста: " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "Цвят на фона: " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "Прозрачност на фона: " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " Прозрачен" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "Непрозрачен" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "Добави сянка под текста" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "Външен вид" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "Ширина на полето за цитати: " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "Тясно " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "Широко" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "Хоризонтална позиция: " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "Вляво " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "Вертикална позиция: " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "Горе " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "Разположение" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "Показвай цитати от следните източници: " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" "Още " "плъгини" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" "Показвай само тези тагове и автори. Оставете празно, за да се показват " "случайни цитати." #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "Пример: funny, inspirational" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "Пример: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "Автори: " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "Източници и филтриране" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "Сменяй цитата на всеки " #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "Минималния интервал е 10 секунди" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "Регулярна смяна" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "Часовник" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "Показвай красив дигитален часовник с дата и час" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "За да настроите външния вид на часовника, редактирайте clock_filter полето в" " конфигурационния файл на Variety (~/.config/variety/variety.conf). " "Използвайте коментарите в ~/.config/variety/variety_latest_default.conf като" " гайд." #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "Шрифт за часа: " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "Шрифт за датата: " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "Тези не работят? Чети тук. Как " "да донастроим часовника? Чети тук." #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "Ефекти" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "Папка за ръчно изтегляне" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "Записвай ръчно изтеглените тапети във " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "Влачене и пускане" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "Иконата на Variety в Launcher-a служи като поле за пускане. Завлачете URL " "към картинка или локална картинка върху нея и тя ще бъде изтеглена и " "добавена в опашката. След това можете да натиснете \"Напред\" за да я " "използвате като тапет. Можете да покажете иконата в Launcher-a като отворите" " Настройки. След това можете да я заключите там за лесен достъп по всяко " "време." #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "Следене на клипборда" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Следи клипборда за адреси към картинки и ги изтегляй" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "Но ги изтегляй само когато домейнът в адреса е един от тези:" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "Ръчно теглене" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "Когато е възможно, използвай картинки, които:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "Са с хоризонтална ориентация" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "Са големи поне " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "% от размера на екрана" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "Цвят" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "Са тъмни или светли:" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Тъмни" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Светли" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "Съдържат този цвят: " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(Влиза в действие след известно време за търсене)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "Оценка" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "Имат EXIF оценка поне " #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "Цвят и размер" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "Индикаторна икона" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "Индикаторна икона:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "Светла" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "Тъмна" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Използвай текущия тапет" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "Задай картинка..." #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "Без икона" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "Изберете икона" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" "Когато иконата е скрита, може да контролирате Variety през терминал, или " "през Launcher иконата. Пуснете \"variety --help\" за да видите списък с " "поддържаните команди." #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "Операция за добавяне в Любими" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "Операция за Любими в менюто:" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "Копирай в Любими" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "И двете (Копирай и Премести)" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "Зависи от папката..." #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "Интеграция с логин екрана" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "Искам всички тапети, зададени от Variety, да се показват и на логин екрана" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" "Предупреждение: За да може да покаже тапета, LightDM трябва да има " "права за четене върху него. Ако активирате тази опция, при смяна на тапета, " "Variety ще копира файла в публична папка и ще смени правата му, така ще " "всички потребители да имат право на четене. По подразбиране папката е " "~/Pictures ако home директорията Ви не е крипирана и /usr/share/backgrounds" " - ако е криптирана. Моля използвайте тази опция внимателно." #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "Копирай тапетите в тази папка: " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "По подразбиране" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "Пак не работи?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Изглажда home директорията Ви е криптирана. Опцията няма да сработи с папки," " които са вътре." #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "Нямате права за писане в тази папка" #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "Правата на тази папка не допускат LightDM да чете оттам." #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "Variety може да промени правата, но ще трябва да предоставите root " "привилегии." #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "Персонализиране" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "Полезни съвети" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "Последни промени" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "Посети уебсайта" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "Докладвай за бъг или поискай нова функция" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "Изпрати отзив" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "Направи дарение за Variety" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "Направи дарение чрез PayPal" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "Работя над Variety в свободното си време, което обикновено означава късните часове след като децата ми си легнат. Благодарен съм за всички дарени суми. Те ми показват, че Вие - потребителите - цените Variety, и ме мотивират да продължавам да работя активно над програмата.\n" "\n" "Благодаря,\n" "Петър Леви" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "1EHtkck9pw2Ry4NP6Es8rAXWEeADLdkqcu" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Добре дошли във Variety!" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "Напред" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" "Variety е програма за автоматична смяна на тапети. Тя сменя тапета на " "работния плот през определен интервал от време, като използва картинки от " "компютъра Ви или такива, които е свалила автоматично от разнообразни " "източници в Интернет. Variety върви незабележимо на заден план - за да я " "контролирате, натиснете тази иконка в системаната лента:" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" "Variety е софтуер с отворен код, създаден от Петър Леви, програмист от " "България. Ако програмата Ви харесва, моля направете дарение." #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" "Моля, отделете малко време да настроите програмата в следващите няколко " "екрана." variety-0.8.13/po/ca.po000066400000000000000000001713471475753071700146640ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:05+0000\n" "Last-Translator: James Lu , 2021\n" "Language-Team: Catalan (https://www.transifex.com/variety/teams/123174/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "No s'ha trobat cap imatge" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "Trieu una carpeta" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "Cancel·la" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "D’acord" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "S'està obtenint" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "No és una imatge" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "La imatge és massa petita, s'ignorarà" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "Discupleu, s'ha obtingut l'error %s..." #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "Això vol dir que l'enllaç ja no és vàlid." #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "L'obtenció ha fallat per algun motiu" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "" "Per obtenir-ne més informació, si us plau executeu el Variety des del " "terminal amb l'opció -v i torneu a provar l'acció" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "Següe_nt" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "_Anterior" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "Fons de pantalla actual" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "Mostra'n l'origen" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "Copia-ho als _favorits" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "Desplaça-ho als favorits" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "Elimina a la _paperera" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "_Següent, omet l'historial que segueix" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Consell: moveu la rodeta sobre la icona\n" "per a Següent i Anterior" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "Atura't a l'actual" #: ../variety/indicator.py:140 msgid "_Image" msgstr "_Imatge" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "D'on és?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "Mostra-ho sense efectes" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "Cerca d'imatges de Google" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "Establiu la puntuació d'EXIF" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "Desa-ho als favortis" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "Mostra els favorits..." #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "Copia al porta-retalls" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "Cita de Google" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "Autor de Google" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "Preferències..." #: ../variety/indicator.py:250 msgid "Turn off" msgstr "Desactiva" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "_Cita" #: ../variety/indicator.py:262 msgid "_History" msgstr "_Historial" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "Se_lector de fons" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "Baixa_des recents" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "Inicia la presentació" #: ../variety/indicator.py:300 msgid "About" msgstr "Quant a" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "Feu una donació" #: ../variety/indicator.py:308 msgid "Quit" msgstr "Surt" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "S'ha rebut el senyal de terminació, se sortirà..." #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "" "El Variety ja s'està executant. S'envia l'ordre a la instància que " "s'executa." #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr "" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Preferències del Variety" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "Tot" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "Imatges" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "Carpetes" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "Elimina la font, mantén els fitxers" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "Elimina les fonts, mantén els fitxers" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "Elimina la font i esblrra els fitxers descarregats" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "Elimina les fonts i esborra els fitxers descarregats" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "Afegeix les imatges" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "Afegeix" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Afegeix carpetes - Solament afegeix les carpetes arrel, les subcarpetes són " "cercades recursivament" #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "Edita..." #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "Obre la carpeta" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "Visualitza la imatge" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "No teniu permisos d'escriptura" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "No s'han pogut ajustar els permisos" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Podeu intentar d'executar manualment aquesta ordre:\n" "sudo chmod %s \"%s\"" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "Sense connectors de citació" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "No hi ha cap connector de citació instal·lat" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "No hi ha cap connector de citació adient" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "" "No teniu connectors de citació que admetin la cerca per paraules clau i per " "autors" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "No s'han pogut obtenir citacions" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "El servei de citacions pot haver caigut. Es continuarà intentant" #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "No s'han pogut trobar citacions" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "Potser busqueu alguna cosa molt amagada?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "Conserva l'original" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "Escala de grisos" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "Molt desenfocat" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "Una mica desenfocat" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "Pintura a l'oli" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "Puntillisme" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "Pixela" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "La carpeta de favorits" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "La carpeta de recuperats" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "" "Recomanat pel Variety. S'adapta al vostres gustos a mesura que marqueu " "imatges com a favorites o les elimineu." #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" "Les últimes favorites d'altres usuaris del Variety. [Pot contenir imatges " "NSFW]" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Fons de pantalla aleatoris des de Desktoppr.co" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "Imatge astronòmica de la NASA del dia" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "Foto del dia de Bing" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "Fotos d'alta resolució des d'Unsplash.com" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" "Podeu canviar el fons de pantalla endavant i enrere movent la roda del " "ratolí sobre la icona indicadora." #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" "El Variety es pot controlar des de la línia d'ordres i es pot usar per " "definir dreceres de teclat per a les operacions d'ús més freqüent. Executeu " "«variety --help» per veure totes les ordres disponibles." #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" "Podeu deixar anar enllaços o fitxers a la icona de llançament per baixar-los" " i usar-los com a fons de pantalla. Per a una baixada més ràpidar des d'un " "lloc específic, també podeu usar el monitoratge del porta-retalls (vegeu la " "pestanya \"Baixada manual\")." #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" "L'aplicació d'un bon filtre de desenfocament és una bona manera d'aconseguir" " fons de pantalla d'aspecte abstracte i discrets però coloristes, semblant " "en esperit al que ve per defecte a l'Ubuntu." #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" "Quan seleccioneu una font d'imatge, les seves imatges es mostren a una " "finestra a la part inferior de la pantalla. Cliqueu aquí a una imatge per " "establir-la com a fons de pantalla. Feu un clic amb el botó dret del ratolí " "per tancar la finestra, per modificar la seva aparença o per realitzar " "operacions amb fitxers. Podeu seleccionar fonts múltiples d'imatges per " "crear una vista de miniatures «fusionada» de totes. Si us plau tingueu en " "compte que aquesta vista de miniatures està limitada a uns quants centenars " "d'imatges seleccionades aleatòriament." #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" "La icona de l'indicador del Variety també es pot tematitzar. Si trieu " "l'opció \"Clara\" per a la icona, el Variety primer comprovarà si el tema " "actual GTK té una icona anomenada \"variety-indicator\" i l'usarà en comptes" " de la icona clara inclosa." #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "A baix" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "A dalt" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "A l'esquerra" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "Dreta" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "Posició" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "Mida" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "Mostra la carpeta que la conté" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "Obtingut: mostra l'origen" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "Mostra-ho a %s" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "Desplaça-ho als _favorits" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "Tanca" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "No s'ha pogut establir la puntuació d'EXIF" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "Sense puntuació" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "Rebutjada" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "Historial del Variety" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Baixades recents del Variety" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Imatges del Variety" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "Fes que surti la instància en execució" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" "Imprimeix la ubicació del fons actual. S'usa només quan l'aplicació ja " "s'executa." #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "Mostra el fons de pantalla següent" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "Mostra el fons de pantalla anterior" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "Mostra el fons de pantalla següent i omet l'historial que segueix" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Desplaça el fons de pantalla actual a la paperera. S'usa només quan " "l'aplicació ja s'executa." #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Copia el fons de pantalla actual als favorits. S'usa només quan l'aplicació " "ja s'executa." #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Desplaça el fons de pantalla actual als favorits. S'usa només quan " "l'aplicació ja s'executa." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "Pausa a la imatge actual" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "Continua els canvis regulars d'imatges" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "Commuta l'estat de pausa / continua" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "Mostra la cita següent" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "Mostra la cita anterior" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "Mostra la cita següent i omet l'historial que segueix" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "Commuta l'estat de pausa / continua de cites" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "Desa la cita actual als favorits" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "Commuta la vista de l'historial" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "Commuta la vista de les baixades recents" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "Mostra el diàleg de preferències" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Mostra el selector manual de fons de pantalla, amb la barra de miniatures " "plena d'imatges de les fonts actives." #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" "Estableix i aplica una opció. Els noms de les opcions són els mateixos que " "s'usen al fitxer de configuració del Variety ~/.config/variety/variety.conf." " Es poden establir opcions múltiples amb una sola ordre. Exemple: \"variety" " --set-option icon Dark --set-option clock_enabled True\". USEU-HO AMB " "PRUDÈNCIA: esteu canviant el fitxer de configuració directament sense " "protecció." #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "" "Les opcions --next/--fast-forward i --previous són mútuament excloents." #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "Les opcions --trash i --favorite són mútuament excloents" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "les opcions--pause i --resume són mútuament excloents." #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "Les opcions --quotes-next/--quotes-fast-forward i --quotes-previous són " "mútuament excloents." #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "Ja és als favorits" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "Desconegut" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "Autor: %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "Continua els canvis regulars" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "El filtre és massa estricte?" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "" "El Variety troba massa poques imatges que coincideixin amb els vostres " "criteris de cerca" #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "Si us plau, afegiu més fonts d'imatges o espereu algunes baixades" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "Si us plau, afegiu més fonts d'imatges" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "Ja no hi ha més fons de pantalla" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "El fons actual no és a les fonts d'imatges" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "" "No s'ha pogut desplaçar a %s. Probablement no teniu permisos per desplaçar " "aquest fitxer." #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" "No s'ha pogut copiar a %s. Probablement no teniu permisos per copiar aquest " "fitxer." #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "No es pot esborrar" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "No temiu permisos per enviar %s a la paperera." #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "" "Obriré un editor amb el fitxer de configuració i aplicaré els canvis després" " que els deseu i tanqueu l'editor." #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "S'ha afegit a la cua" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "Premeu següent per veure-ho" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "Obtingut" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "Tipus de font no admesa" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "Executeu l'última versió del Variety?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "S'ha afegit una font d'imatges nova" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "La font d'imatges ja existeix, s'habilitarà" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "Obtingut i aplicat" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "Funciona!" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "Bé, els enllaços del Variety funcionen. Genial!" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "Ordre no admesa" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "No s'ha pogut precessar la variety:// URL donada" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "Executeu-ho amb la depuració habilitada per veure'n els detalls" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "No s'ha pogut crear una entrada d'inici automàtic" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "S'ha produït un error mentre es creava l'entrada d'autoarrencada a l'escriptori\n" "Si us plau executeu-lo des d'una terminal amb l'etiqueta -v i torneu a provar." #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "Sense imatges" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "No hi ha imatges a les carpetes de presentació" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "Quant al Variety" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Un canviador, descarregador i gestor de fons de pantalla automàtic." #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr "" #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Variety - afegeix Flickr com a font d'imatges" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" "Si us plau, especifiqueu el criteri de cerca de Flickr. Es baixaran les fotos que " "coincideixin amb tots els criteris escollits. Deixeu en blanc els criteris " "que no siguin necessaris." #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "Etiquetes: " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "Una llista separada per comes de les etiquetes. Una fotografia les ha de contenir totes al mateix temps per coincidir-hi.\n" "Exemple: groc, cotxe." #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "Usuari: " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "Si us plau, introduïu l'URL a la galeria de fotos de l'usuari o a una de les fotos.\n" "Exemple: http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "Grup: " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "Si us plau, introduïu l' URL del grup.\n" "Exemple: http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "Text:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "Cerca de text lliure als títols, descripcions i etiquetes de les fotografies. Per excloure'n termes avantposeu-hi -.\n" "Exemple: pastís -de poma." #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "Només un moment per fer aquesta cerca" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Copia als favorits contra Desplaça als favorits" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "Restableix al valor predeterminat" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "" "Seleccioneu si preferiu «Copia als favorits» o «Desplaça als favorits» al " "menú segons la ubicació de la imatge:" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "Si us plau, introduïu una entrada per línia, cada entrada amb la forma :, on la carpeta es pot baixar, obtenir, altres o un camí de carpeta específic.\n" "L'ordre és important. Quan es mostra una imatge, la primera carpeta de la llista que contingui la imatge determinarà quines operacions es mostraran al menú del Variety. \"Altres\" fa coincidir qualsevol fitxer i hauria de ser l'últim de la llista.\n" "\n" "Exemple:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "segons" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "minuts" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "hores" #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "dies" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "General" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "Inicia el Variety quan s'iniciï l'ordinador" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "Canvia el fons cada " #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "L'interval mínim és de 5 segons" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "Canvia el fons en iniciar" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "Habilitat" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "Tipus" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "Ubicació" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "_Afegeix..." #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "Afegeix imatges, carpetes o fonts d'imatges en línia" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "Edita la font seleccionada" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "_Edita..." #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "Sup_rimeix..." #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "Elimina les fonts d'imatges seleccionades" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "_Usa" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "Habilita les fonts seleccionades i inhabilita totes les altres" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "Favorits" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "Copia els fons favorits a " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "Filtres" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" "Aplica aquests filtres aleatòriament als fons que es mostren (gràcies al " "magnífic ImageMagick):" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "Cites" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "Mostra cites sàvies aleatòriament a l'escriptori" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "Color del text: " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "Tipus de lletra del text: " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "Color del fons: " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "Opacitat del fons: " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " Transparent" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "Opac" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "Dibuixa una ombra de text" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "Aparença" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "Amplada de l'àrea de cites: " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "Estreta " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "Ampla" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "Posició horitzontal: " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "Esquerra " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "Posició vertical: " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "A dalt " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "Ubicació" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "Mostra cites d'aquestes fonts: " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" "Més " "connectors" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" "Mostra només aquestes etiquetes i autors. Deixeu-ho en blanc perquè es " "mostrin les cites aleatòriament." #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "Exemple: divertit, inspirat" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "Exemple: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "Autors: " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "Fonts i filtratge" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "Canvia la cita cada " #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "L'interval mínim és de 10 segons" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "Canvi regular" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "Rellotge" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "" "Mostra un rellotge digital bonic i gros a l'escriptori que indiqui l'hora i " "la data actuals" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "Per configurar l'aparença del rellotge editeu la propietat clock_filter del " "fitxer de configuració del Variety (~/.config/variety/variety.conf). Useu " "els comentaris de ~/.config/variety/variety_latest_default.conf com a guia." #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "Tipus de lletra del rellotge: " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "Tipus de lletra de la data: " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "No funciona? Llegiu aquí. " "Com configurar més el rellotge? Llegiu " "aquí." #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "Efectes" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "Imatges per a la presentació" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "Imatges favorites" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "Imatges de totes les fonts d'imatges habilitades" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "Totes les imatges de la carpeta de baixades" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "Carpeta personalitzada (inclou les imatges de les subcarpetes) " #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "Ordre de les imatges de la presentació " #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "Aleatori" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "Per nom, de la A a la Z" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "Per nom, de la Z a la A" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "Per data, primer la més antiga" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "Per data, primer la més nova" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "Pantalla" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "Executa al monitor" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "Mode de la finestra per a la presentació " #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "Pantalla completa" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "Escriptori (es manté sota d'altres finestres)" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "Finestra maximitzada" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "Finestra normal" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "Dinàmica" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "Interval entre canvis d'imatge " #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr " segons" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "Atenuació ràpida " #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "Atenuació lenta" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "Menys zoom" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "Més zoom" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "Menys abast" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "Més abast" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "Torna als valors predeterminats" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" "Els canvis en aquesta pàgina tenen efecte després que es reinicia la " "presentació" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "Inicia la presentació ara" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "Presentació" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "Carpeta d'obtenció" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "Desa els fons baixats manualment a " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "Arossegueu-ho i deixeu-ho anar" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "La icona del Variety del llançador serveix com a destinació per deixar-hi anar elements. Si hi deixeu anar qualsevol URL o fitxer, es desarà a la carpeta d'obtenció. Podeu prémer \"Següent\" per veure-ho a l'escriptori.\n" "Per mostrar la icona al llançador, trieu \"Quant a\" o \"Preferències\". Potser voldríeu bloquejar-la-hi per tenir més fàcil deixar-hi anar elements." #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "Monitoratge del porta-retalls" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Monitora el porta-retalls per a URLs d'imatges i obtén-les" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "Però obtén-les només quan l'URL amfitrió sigui un dels següents:" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "Baixada manual" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "Quan sigui possible usa imatges que:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "Tinguin una orientació apaïsada" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "Tinguin una mida mínima del " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "% de la resolució de la pantalla" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "Color" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "Siguin fosques o clares:" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Fosques" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Clares" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "Continguin aquest color: " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(Té efecte després d'una cerca inicial)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "Puntuació" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "Tinguin una puntuació d'EXIF d'un mínim de " #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "Color i mida" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "Icona indicadora" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "Icona indicadora:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "Clara" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "Fosca" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Usa el fons actual" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "Imatge personalitzada..." #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "Cap" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "Seleccioneu una icona" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" "Quan la icona està amagada, el Variety es pot controlar des de la línia " "d'ordres o bé des de la llista ràpida del llançador. Executeu \"variety " "--help\" per veure totes les ordres disponibles." #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "Operacions favorites" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "Operacions favorites per mostrar al menú principal:" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "Copia als favorits" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "Copia i també desplaça" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "Depèn de la carpeta..." #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "Suport de la pantalla d'entrada" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "Assegura que els fons establerts pel Variety s'usin a la pantalla d'entrada" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" "Avís de privacitat: per mostrar el vostre fons, el LightDM necessita " "permisos de lectura per a la imatge. Amb aquesta opció activada, el Variety " "copiarà els fons a una carpeta pública i en canviarà els permisos perquè " "siguin llegibles per a tothom. Per defecte, la carpeta és ~/Imatges, si no " "teniu encriptada la carpeta personal, i /usr/share/backgrounds si ho està. " "Si us plau, useu-ho amb compte en sistemes amb més d'un usuari." #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "Copia els fitxers de fons a aquesta carpeta: " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "Restableix als valors predeterminats" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "Encara no funciona?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Sembla que la vostra carpeta personal està encriptada; per tant, no " "funcionarà usar-hi carpetes dins." #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "No teniu permisos d'escriptura per a aquesta carpeta." #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "" "Els permisos no permeten que el LightDM llegeixi fitxers d'aquesta carpeta." #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "El Variety en pot ajustar els permisos, però haureu de proporcionar " "privilegis de superusuari." #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "Personalitza" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "Consells i trucs" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "Canvis recents" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "Visiteu-ne el lloc web" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "Informeu d'un error o demaneu una característica" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "Envia comentaris" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "Feu una donació al Variety" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "Feu una donació per PayPal" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "Estic desenvolupant el Variety durant el meu temps lliure, que en general significa les últimes hores després que els meus fills se'n vagin a dormir. Qualsevol quantitat que doneu serà apreciada. Em mostrarà que el Variety és valorat per vosaltres, els usuaris, i em motivarà a continuar treballant-hi activament.\n" "\n" "Gràcies,\n" "Peter Levi" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Benvigut al Variety!" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "Continua" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" "El Variety és un canviador de fons de pantalla automàtic. Canvia el fons de " "l'escriptori de forma regular usant imatges locals o imatges baixades de " "diverses fonts en línia. S'executa tranquil·lament en un segon pla. Per " "controlar-lo, cliqueu en aquesta icona a la safata del sistema:" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" "El Variety és programari de codi obert, creat per Peter Levi, un " "desenvolupador de programari búlgar. Si us agrada, si us plau, feu una " "donació a ." #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" "Ara, si us plau, dediqueu una estona a configurar les preferències a les " "pantalles següents." variety-0.8.13/po/de.po000066400000000000000000002061551475753071700146650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2024-11-04 12:15+0100\n" "Last-Translator: Christian Lauinger \n" "Language-Team: German (https://www.transifex.com/variety/teams/123174/de/)\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: Poedit 3.5\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "Keine Bilder gefunden" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "Bilder von Flickr" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "Ordner wählen" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "Abbrechen" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "OK" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "Wird abgerufen" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "Kein Bild" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "Bild zu klein, wird ignoriert" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "Entschuldigung, es gab %s Fehler..." #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "Das bedeutet, dass die Verknüpfung nicht mehr gültig ist" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "Der Abruf versagte aus irgendeinem Grund" #: ../variety/ImageFetcher.py:155 msgid "To get more information, please run Variety from terminal with -v option and retry the action" msgstr "Um mehr Information zu erhalten, starten Sie Variety im Terminal mit »-v« als Option und wiederholen Sie den Vorgang" #: ../variety/indicator.py:63 ../variety/indicator.py:110 ../variety/indicator.py:179 msgid "_Next" msgstr "_Nächstes" #: ../variety/indicator.py:68 ../variety/indicator.py:115 ../variety/indicator.py:184 msgid "_Previous" msgstr "_Vorheriges" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "Aktuelles Hintergrundbild" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "Ursprung anzeigen" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "Zu _Favoriten kopieren" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "Zu Favoriten verschieben" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "In _Papierkorb verschieben" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "Nächstes, Verlauf überspringen" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Tipp: Über dem Symbol rollen\n" "für Vorheriges und Nächstes" #: ../variety/indicator.py:136 ../variety/indicator.py:200 ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "Beim Aktuellen anhalten" #: ../variety/indicator.py:140 msgid "_Image" msgstr "_Bild" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "Woher stammt das Bild?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "Ohne Effekte anzeigen" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "Google-Bildersuche" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "Exif-Bewertung eingeben" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "Unter Favoriten speichern" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "Favoriten anzeigen …" #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "In die Zwischenablage kopieren" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "Google-Zitate" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "Google-Autor" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "Einstellungen …" #: ../variety/indicator.py:250 msgid "Turn off" msgstr "Ausschalten" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "_Zitat" #: ../variety/indicator.py:262 msgid "_History" msgstr "_Verlauf" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "_Hintergrundbildauswahl" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "_Kürzlich heruntergeladen" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "Starte Diashow" #: ../variety/indicator.py:300 msgid "About" msgstr "Über" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "Spenden" #: ../variety/indicator.py:308 msgid "Quit" msgstr "Beenden" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "Abbruchsignal empfangen, wird beendet …" #: ../variety/__init__.py:195 msgid "Variety is already running. Sending the command to the running instance." msgstr "Variety läuft bereits. Befehl wird an die laufende Instanz gesendet." #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr " (Profil: {})" #: ../variety/PreferencesVarietyDialog.py:87 ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Variety-Einstellungen" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "Alle" #: ../variety/PreferencesVarietyDialog.py:396 ../variety/PreferencesVarietyDialog.py:595 ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "Bilder" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "Füge individuelle Hintergrundbilder hinzu" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "Ordner" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "Rekursive Suche nach bis zu 10000 Bildern, die in zufälliger Reihenfolge angezeigt werden" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "Sequentielle Alben (Reihenfolge nach Dateinamen)" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "Rekursive Suche nach Bildern, die nacheinander angezeigt werden (nach Dateinamen)" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "Sequentielle Alben (Reihenfolge nach Datum)" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "Rekursive Suche nach Bildern, die nacheinander angezeigt werden (nach Dateidatum)" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "Bilder von Flickr abrufen" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "Quelle entfernen, Dateien behalten" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "Quellen entfernen, Dateien behalten" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "Quelle entfernen und heruntergeladene Dateien löschen" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "Quellen entfernen und heruntergeladene Dateien löschen" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "Using this source requires wallpaper changing enabled at intervals of %d minutes or less. Settings were adjusted automatically." msgstr "Die Verwendung dieser Quelle erfordert einen Tapetenwechsel in Intervallen von %d Minuten oder weniger. Die Einstellungen wurden automatisch angepasst." #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "Bilder hinzufügen" #: ../variety/PreferencesVarietyDialog.py:588 ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "Hinzufügen" #: ../variety/PreferencesVarietyDialog.py:613 msgid "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "Ordner hinzufügen - Nur die Hauptordner, Unterordner werden rekursiv durchsucht" #: ../variety/PreferencesVarietyDialog.py:617 msgid "Add Sequential Albums (ordered by filename). Subfolders are searched recursively." msgstr "Sequentielle Alben hinzufügen (nach Dateinamen geordnet). Unterordner werden rekursiv durchsucht." #: ../variety/PreferencesVarietyDialog.py:621 msgid "Add Sequential Albums (ordered by date). Subfolders are searched recursively." msgstr "Sequentielle Alben hinzufügen (nach Datum geordnet). Unterordner werden rekursiv durchsucht." #: ../variety/PreferencesVarietyDialog.py:775 ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "Bearbeiten …" #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "Ordner öffnen" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "Bild anzeigen" #: ../variety/PreferencesVarietyDialog.py:1166 ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "Keine Schreibberechtigung" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "Berechtigungen konnten nicht angepasst werden" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Folgender Befehl kann manuell ausgeführt werden:\n" "sudo chmod %s »%s«" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "Keine Zitaterweiterungen" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "Es sind keine Zitaterweiterungen installiert" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "Keine brauchbaren Zitaterweiterungen" #: ../variety/QuotesEngine.py:251 msgid "You have no quote plugins which support searching by keywords and authors" msgstr "Es existieren keine Zitaterweiterungen, die das Suchen nach Stichwörtern oder Autoren ermöglichen" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "Zitate konnten nicht abgerufen werden" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "Möglicherweise sind Zitatdienste gerade nicht verfügbar, es wird weiter versucht" #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "Konnte keine Zitate finden" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "Möglicherweise suchen Sie nach etwas unklarem?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "Original beibehalten" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "Graustufen" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "Sehr verschwommen" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "Leicht verschwommen" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "Ölgemälde" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "Pointillismus" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "Verpixeln" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "Ordner für Favoriten" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "Ordner für heruntergeladene Bilder" #: ../variety/Texts.py:35 msgid "Recommended by Variety. Adapts to your taste as you mark images as favorite or trash." msgstr "Empfohlen von Variety. Passt sich Ihrem Geschmack an, wenn Sie Bilder als Favoriten oder Müll markieren." #: ../variety/Texts.py:39 msgid "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "Neueste Favoriten der anderen Nutzer von Variety. [Kann NSFW-Bilder enthalten]" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Zufällige Hintergrundbilder von Desktoppr.co" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "NASAs Astronomiebild des Tages" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "Bing-Foto des Tages" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "Hochauflösende Fotos von Unsplash.com" #: ../variety/Texts.py:54 msgid "You can change the wallpaper back and forth by scrolling the mouse wheel on top of the indicator icon." msgstr "Das Hintergrundbild kann, durch rollen über dem Anzeigensymbol, vor und zurück gewechselt werden." #: ../variety/Texts.py:57 #, python-brace-format msgid "If you want to run custom commands every time the wallpaper changes or if you use an alternative desktop environment, please edit the scripts in {PROFILE_PATH}scripts. There are examples there for various desktop environments." msgstr "" "Wenn Sie benutzerdefinierte Befehle jedes Mal ausführen möchten, wenn sich das Hintergrundbild ändert, oder wenn Sie eine andere Desktop-Umgebung verwenden, bearbeiten Sie bitte die Skripte in {PROFILE_PATH}scripts. Dort finden Sie Beispiele für verschiedene Desktop-Umgebungen." #: ../variety/Texts.py:60 msgid "Variety can be controlled from the command line and you can use this to define keyboard shortcuts for the operations you use most often. Run \"variety --help\" to see all available commands." msgstr "Variety kann von der Befehlszeile aus gesteuert werden. Damit ist es möglich, für Aktionen, die man am meisten benutzt, Tastenkürzel festzulegen. Mit »variety --help« wird eine Liste aller verfügbaren Befehle angezeigt." #: ../variety/Texts.py:63 msgid "You can drop image links or files on the launcher icon to download them and use them as wallpapers. For quicker downloading from a specific site, you can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" "Bildadressen oder Dateien können auf dem Startersymbol abgelegt werden, um sie herunterzuladen und als Hintergrundbild zu verwenden. Für ein schnelleres Herunterladen von einer bestimmten Seite kann auch die Überwachung der Zwischenablage aktiviert werden (siehe Reiter »Manuelles " "Herunterladen«)." #: ../variety/Texts.py:66 msgid "Applying a heavy blurring filter is a great way to get abstract-looking and unobtrusive, yet colorful wallpapers, similar in spirit to the default one in Ubuntu." msgstr "Das Anwenden eines starken Unschärfefilters ist ein großartiger Weg, um abstrakt und unaufdringlich auszusehen und doch farbenfrohe Hintergrundbilder zu haben. Ähnlich dem Standardhintergrund von Ubuntu." #: ../variety/Texts.py:69 #, python-brace-format msgid "Adding your own custom filters is quite easy: open {PROFILE_PATH}variety.conf in an editor and use the existing filters as an example. Every filter is just a line of options to be passed to ImageMagick's convert command." msgstr "" "Das Hinzufügen eigener benutzerdefinierter Filter ist ganz einfach: Öffnen Sie {PROFILE_PATH}variety.conf in einem Editor und verwenden Sie die vorhandenen Filter als Beispiel. Jeder Filter ist nur eine Zeile mit Optionen, die an den Konvertierungsbefehl von ImageMagick übergeben " "werden." #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the bottom of the screen. Click an image there to set is as wallpaper. Right-click to close the window, to modify its appearance or to perform file operations. You can select multiple image sources to create a " "\"merged\" thumbnail view of all of them. Please mind that thumbnail view is limited to several hundred randomly selected images." msgstr "" "Wenn eine Bildquelle ausgewählt wird, werden die Bilder in einem Fenster am unteren Rand des Bildschirms angezeigt. Man kann ein Bild anklicken, um es zum Bildschirmhintergrund zu machen. Mit dem Rechtsklick wird das Fenster geschlossen, das Aussehen angepasst und Dateiaktionen " "ausgeführt. Es können mehrere Bildquellen ausgewählt werden, um eine Vorschau von allen zusammen zu erhalten. Dabei ist zu beachten, dass diese Vorschauansicht immer auf einige Hundert zufällig gewählte Bilder beschränkt wird." #: ../variety/Texts.py:75 #, python-brace-format msgid "To enable desktop notifications when the wallpaper changes, uncomment the two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "Um Desktop-Benachrichtigungen zu aktivieren, wenn sich das Hintergrundbild ändert, entfernen Sie die Kommentarzeichen in den beiden Zeilen am Ende von {PROFILE_PATH}scripts/set_wallpaper." #: ../variety/Texts.py:78 msgid "Variety's indicator icon is themeable - if you you choose the \"Light\" option for the icon, Variety will first check if the current GTK theme has an icon named \"variety-indicator\" and will use it instead of the bundled light icon." msgstr "Varietys Anzeigensymbol ist thematisch anpassbar. Falls die »Hell«-Option für das Symbol gewählt wurde, wird Variety zuerst prüfen, ob es im aktuellen GTK-Thema ein Symbol mit dem Namen »variety-indicator« gibt und dieses nutzen, anstatt des mitgelieferten hellen Symbols." #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to {PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's local files quote source. If you want to use it - copy it to ~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" "Wenn Sie sich entscheiden, Zitate in den Favoriten zu speichern, werden diese standardmäßig in der Datei {PROFILE_PATH}favorite_quotes.txt gespeichert. Diese Datei ist mit der Zitatquelle der lokalen Dateien von Variety kompatibel. Wenn Sie sie verwenden möchten, kopieren Sie sie " "nach ~/.config/variety/pluginconfig/quotes/ und aktivieren Sie die Zitatquelle für lokale Dateien. Diese Datei ist auch mit dem Unix-Dienstprogramm fortune kompatibel." #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "Unten" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Oben" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Links" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "Rechts" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "Position" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "Größe" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "Maximal angezeigte Bilder" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "Zielordner anzeigen" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "Abgerufen: Herkunft anzeigen" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "Auf %s anzeigen" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "Zu _Favoriten verschieben" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "Schließen" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "Exif-Bewertung konnte nicht eingegeben werden" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "Nicht bewertet" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "Abgewiesen" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "Variety-Verlauf" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Variety: Kürzlich heruntergeladen" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Variety-Bilder" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" "%prog [Optionen] [Dateien oder URLs]\n" "\n" "Durch die Übergabe lokaler Dateien werden diese der Warteschlange von Variety hinzugefügt.\n" "Die Übergabe von Remote-URLs bewirkt, dass Variety sie in den Ordner „Fetched“ holt und in die Warteschlange stellt.\n" "\n" "Um ein bestimmtes Hintergrundbild zu setzen: %prog --set /some/local/image.jpg\n" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If not specified, this is ~/.config/variety/. If just a name is used instead of a full path, the profile folder will be ~/.config/variety-profiles/. Use only when initially starting Variety - changing " "the profile path requires restart. Several instances of Variety can be started when using different profiles, each with its own separate configuration. This can be used for example to control several different screens or workspaces under desktop environments like XFCE which allow " "this. To pass commands to a running instance, pass the same --profile argument as the one it was started with in subsequent commands." msgstr "" "Profilname oder vollständiger Pfad zum Konfigurationsordner, den Variety verwenden soll. Wenn nichts angegeben wird, ist dies ~/.config/variety/. Wenn nur ein Name anstelle eines vollständigen Pfades verwendet wird, lautet der Profilordner ~/.config/variety-profiles/. Nur beim " "ersten Start von Variety verwenden - eine Änderung des Profilpfads erfordert einen Neustart. Es können mehrere Instanzen von Variety gestartet werden, wenn verschiedene Profile verwendet werden, jede mit ihrer eigenen Konfiguration. Dies kann z.B. verwendet werden, um mehrere " "verschiedene Bildschirme oder Arbeitsbereiche unter Desktop-Umgebungen wie XFCE zu steuern, die dies erlauben. Um Befehle an eine laufende Instanz zu übergeben, geben Sie in nachfolgenden Befehlen das gleiche --profile-Argument an wie das, mit dem sie gestartet wurde." #: ../variety/VarietyOptionParser.py:90 msgid "Show logging messages (-vv to -vvvvv will profile various parts of Variety with increasing detail" msgstr "Logging-Meldungen anzeigen (-vv bis -vvvvv werden verschiedene Teile der Variety mit zunehmender Detailtiefe darstellen" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "Laufende Programminstanz beenden" #: ../variety/VarietyOptionParser.py:106 msgid "Print the current wallpaper location. Used only when the application is already running." msgstr "Aktuelles Hintergrundverzeichnis ausgeben. Wird nur genutzt, wenn die Anwendung bereits läuft." #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "Die angegebene Datei als Hintergrundbild festlegen, absoluter Pfad erforderlich" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "Nächstes Hintergrundbild anzeigen" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "Vorheriges Hintergrundbild anzeigen" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "Nächstes Hintergrundbild anzeigen, Verlauf vorwärts überspringen" #: ../variety/VarietyOptionParser.py:139 msgid "Move current wallpaper to Trash. Used only when the application is already running." msgstr "Aktuelles Hintergrundbild in den Papierkorb verschieben. Wird nur genutzt, wenn die Anwendung bereits läuft." #: ../variety/VarietyOptionParser.py:149 msgid "Copy current wallpaper to Favorites. Used only when the application is already running." msgstr "Aktuelles Hintergrundbild zu den Favoriten kopieren. Wird nur genutzt, wenn die Anwendung bereits läuft." #: ../variety/VarietyOptionParser.py:158 msgid "Move current wallpaper to Favorites. Used only when the application is already running." msgstr "Aktuelles Hintergrundbild zu den Favoriten verschieben. Wird nur genutzt, wenn die Anwendung bereits läuft." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "Beim aktuellen Bild anhalten" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "Regelmäßige Bildänderungen wieder aufnehmen" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "Zwischen Pause/Weiter umschalten" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "Ohne Effekte anzeigen“ für das aktuelle Bild ein- und ausschalten" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "Nächstes Zitat anzeigen" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "Vorheriges Zitat anzeigen" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "Nächstes Zitat anzeigen, Verlauf vorwärts überspringen" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "Zitatedurchlauf pausieren/fortsetzen" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "Aktuelles Zitat unter Favoriten speichern" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "Verlaufsanzeige ein-/ausschalten" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "Letztes Heruntergeladenes anzeigen/ausblenden" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "Einstellungen anzeigen" #: ../variety/VarietyOptionParser.py:241 msgid "Show manual wallpaper selector - the thumbnail bar filled with images from the active image sources" msgstr "Manuelle Hintergrundbildauswahl anzeigen - die Vorschauleiste, mit Bildern gefüllt von den aktiven Bildquellen" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in Variety's config file ~/.config/variety/variety.conf. Multiple options can be set in a single command. Example: 'variety --set-option icon Dark --set-option clock_enabled True'. USE WITH CAUTION: You are " "changing the settings file directly in an unguarded way." msgstr "" "Stellt eine Option ein und wendet sie an. Die Optionsnamen sind die gleichen wie die in der Variety-Konfigurationsdatei ~/.config/variety/variety.conf genutzten. Mit einem Befehl können mehrere Optionen eingestellt werden. Beispiel: »variety --set-option icon Dark --set-option " "clock_enabled True«. MIT VORSICHT NUTZEN: Die Konfigurationsdateien werden ungeprüft geändert." #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "Die Optionen --next, --fast-forward und --previous schließen sich gegenseitig aus" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "Die Optionen --trash und --favorite schließen sich gegenseitig aus" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "Die Optionen --pause und --resume schließen sich gegenseitig aus" #: ../variety/VarietyOptionParser.py:275 msgid "options --quotes-next/--quotes-fast-forward and --quotes-previous are mutually exclusive" msgstr "Die Optionen --quotes-next, --quotes-fast-forward und --quotes-previous schließen sich gegenseitig aus" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "Bereits in den Favoriten enthalten" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "Quelle: %s" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "Unbekannt" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "Autor: %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "Wiederaufnahme der regelmäßigen Änderungen" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "Filterung zu streng?" #: ../variety/VarietyWindow.py:1049 msgid "Variety is finding too few images that match your image filtering criteria" msgstr "Variety hat zu wenig Bilder gefunden, welche der Filterauswahl entsprechen" #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "Bitte fügen Sie zusätzliche Bildquellen hinzu oder warten Sie, bis weitere Bilder heruntergeladen wurden" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "Bitte zusätzliche Bildquellen hinzufügen" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "Keine weiteren Hintergrundbilder" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "Aktuelles Hintergrundbild ist nicht in den Bildquellen enthalten" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "Could not move to %s. You probably don't have permissions to move this file." msgstr "Konnte nicht nach %s verschoben werden. Möglicherweise haben Sie nicht die erforderlichen Rechte, um diese Datei zu verschieben." #: ../variety/VarietyWindow.py:1950 #, python-format msgid "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "Konnte nicht nach %s kopiert werden. Möglicherweise haben Sie nicht die erforderlichen Rechte, um diese Datei zu kopieren." #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "Konnte nicht gelöscht werden" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "Sie haben nicht die erforderlichen Rechte, um %s in den Papierkorb zu verschieben." #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "Das Löschen in den Papierkorb ist fehlgeschlagen, überprüfen Sie variety.log für weitere Informationen." #: ../variety/VarietyWindow.py:2325 msgid "I will open an editor with the config file and apply the changes after you save and close the editor." msgstr "Wird eine Textbearbeitung mit der Konfigurationsdatei öffnen und die Änderungen anwenden, nachdem Sie die Textbearbeitung geschlossen haben." #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "Zur Warteschlange hinzugefügt" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "Weiter klicken zum Anschauen" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "Abgerufen" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "Nicht unterstützter Quelltyp" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "Wird die aktuellste Version von Variety genutzt?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "Neue Bildquelle hinzugefügt" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "Diese Bildquelle ist bereits vorhanden und wird aktiviert" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "Abgerufen und angewendet" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "Es funktioniert!" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "Juhu, die Links zur Vielfalt funktionieren. Toll!" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "Nicht unterstützter Befehl" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "Die Adresse »variety://« konnte nicht verarbeitet werden" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "Mit aktivierter Protokollierung ausführen, um Details zu sehen" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "Abwechslung: Neuer Desktop-Eintrag" #: ../variety/VarietyWindow.py:2972 msgid "We created a new desktop entry in ~/.local/share/applications to run Variety with profile \"{}\". Find it in the application launcher." msgstr "Wir haben einen neuen Desktop-Eintrag in ~/.local/share/applications erstellt, um Variety mit dem Profil „{}“ auszuführen. Sie finden ihn im Anwendungsstartprogramm." #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "Variety: Autostart-Desktop-Eintrag erstellt" #: ../variety/VarietyWindow.py:2999 msgid "We created a new desktop entry in ~/.config/autostart. Variety should start automatically on next login." msgstr "Wir haben einen neuen Desktop-Eintrag in ~/.config/autostart erstellt. Variety sollte beim nächsten Login automatisch starten." #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "Autostarteintrag konnte nicht erstellt werden" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "Während der Eintragung als Startprogramm ist ein Fehler aufgetreten.\n" "Bitte im Terminal mit dem Zusatz -v ausführen und erneut probieren." #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "Keine Bilder" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "Es sind keine Bilder in den Diashow-Ordnern vorhanden" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "Über Variety" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety-Mitwirkende" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Anwendung zum automatischen Wechseln, Herunterladen und Verwalten von Hintergrundbildern." #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "https://github.com/varietywalls/variety" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# Dieses Programm ist freie Software: Sie können es weiterverteilen und/oder modifizieren\n" "# unter den Bedingungen der GNU General Public License Version 3, wie veröffentlicht\n" "# der Free Software Foundation.\n" "#\n" "# Dieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, # aber\n" "# OHNE JEGLICHE GEWÄHRLEISTUNG; auch ohne die stillschweigenden Garantien der\n" "# MARKTGÄNGIGKEIT, ZUFRIEDENSTELLENDE QUALITÄT oder EIGNUNG FÜR EINEN BESTIMMTEN\n" "# ZWECK. Siehe die GNU General Public License für weitere Details.\n" "#\n" "# Sie sollten eine Kopie der GNU General Public License zusammen mit diesem Programm erhalten haben.\n" "# mit diesem Programm erhalten haben. Falls nicht, siehe .\n" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "Just a moment to check for images" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr "" #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Variety - Flickr als Bildquelle hinzufügen" #: ../data/ui/AddFlickrDialog.ui:101 msgid "Please specify the Flickr search criteria. Photos that match all of the chosen criteria will be downloaded. Leave unneeded criteria empty." msgstr "Bitte legen Sie das Flickr-Suchkriterium fest. Bilder, die alle angegebenen Kriterien erfüllen werden heruntergeladen. Nicht benötigte Kriterien können leer gelassen werden." #: ../data/ui/AddFlickrDialog.ui:124 ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "Schlagworte: " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "Eine Liste von Schlagwörtern, durch Kommata getrennt. Ein Bild muss alle davon enthalten, um als passend zu gelten.\n" "Beispiel: yellow,car" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "Benutzer: " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "Bitte die Adresse des Benutzers zum Fotostrom oder eines Fotos eingeben.\n" "z. B.: http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "Gruppe: " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "Bitte die Gruppenadresse eingeben. \n" "z. B.: http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "Text:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "Freie Textsuche in Bildtiteln, -beschreibungen und -schlagwörtern. Begriffe können durch Voranstellen von »-« ausgeschlossen werden.\n" "Beispiel: apfel -kuchen" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "Suche benötigt einen Moment" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Zu Favoriten kopieren oder zu Favoriten verschieben" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "Vorgaben wiederherstellen" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the menu depending on the image location:" msgstr "Bitte auswählen, ob Ihnen »Zu Favoriten kopieren« oder »Zu Favoriten verschieben« im Menü mehr zusagt, abhängig vom Speicherort des Bildes:" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "Bitte einen Eintrag pro Zeile eingeben und jeden Eintrag in folgender Form eingeben: »Ordner:Kopieren,Verschieben oder Beides«\n" "Der Ordner kann »Downloaded«, »Fetched«, »Others« oder ein bestimmter Ordnerpfad sein.\n" "Der Befehl kann »Copy« (Kopieren), »Move« (Verschieben) oder »Both« (Beides) sein.\n" "Die Reihenfolge ist wichtig. Wenn ein Bild angezeigt wird, dann wird der erste Ordner, welcher das Bild enthält, darüber entscheiden welche Aktionen im Variety-Menü angezeigt werden. »Others« trifft auf jede Datei zu und sollte deshalb an letzter Stelle stehen.\n" "\n" "Beispiel:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/Bilder/Zufallsbilder:Move\n" "\t/Bilder/OrganisierteAlben:Copy\n" "\tOthers:Both" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "Sekunden" #: ../data/ui/PreferencesVarietyDialog.ui:28 ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "Minuten" #: ../data/ui/PreferencesVarietyDialog.ui:32 ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "Stunden" #: ../data/ui/PreferencesVarietyDialog.ui:36 ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "Tage" #: ../data/ui/PreferencesVarietyDialog.ui:196 ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "Allgemein" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "Variety mit dem Rechner starten" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "Wechsel des Hintergrundbildes alle " #: ../data/ui/PreferencesVarietyDialog.ui:257 ../data/ui/PreferencesVarietyDialog.ui:258 ../data/ui/PreferencesVarietyDialog.ui:275 ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "Kürzeste Zeitspanne beträgt fünf Sekunden" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "Hintergrundbild beim Start wechseln" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "Aktiviert" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "Typ" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "Standort" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "_Hinzufügen …" #: ../data/ui/PreferencesVarietyDialog.ui:454 ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "Bilder, Ordner oder Internetbildquellen hinzufügen" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "_Ordner öffnen" #: ../data/ui/PreferencesVarietyDialog.ui:472 ../data/ui/PreferencesVarietyDialog.ui:473 ../data/ui/PreferencesVarietyDialog.ui:491 ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "Gewählte Quelle bearbeiten" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "_Bearbeiten …" #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "_Entfernen …" #: ../data/ui/PreferencesVarietyDialog.ui:511 ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "Gewählte Quelle entfernen" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "_Benutzen" #: ../data/ui/PreferencesVarietyDialog.ui:530 ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "Gewählte Quellen aktivieren und alle anderen deaktivieren" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "Favoriten" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "Die Lieblingshintergrundbilder kopieren nach " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "Filter" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "Randomly apply these filters to the displayed wallpapers (thanks to the wonderful ImageMagick):" msgstr "Zufällig diese Filter auf die angezeigten Hintergrundbilder anwenden (dank des wundervollen ImageMagick)" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "Zitate" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "Zitate auf dem Schreibtisch nach dem Zufallsprinzip anzeigen" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "Textfarbe: " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "Schriftart: " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "Hintergrundfarbe: " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "Hintergrunddeckkraft: " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " Transparent" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "Deckend" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "Textschatten anzeigen" #: ../data/ui/PreferencesVarietyDialog.ui:1028 ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "Erscheinungsbild" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "Breite des Zitatbereichs: " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "Schmal " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "Breit" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "Horizontale Position: " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "Links " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "Senkrechte Position: " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "Oben " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "Platzierung" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "Zitate von diesen Quellen anzeigen: " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "More plugins" msgstr "Mehr Erweiterungen" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "Nur diese Schlagworte und Autoren anzeigen. Leer lassen, um zufällige Zitate anzuzeigen." #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "Beispiel: lustig, inspirierend" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "Beispiel: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "Autoren: " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "Quellen und Filter" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "Zitatwechsel alle " #: ../data/ui/PreferencesVarietyDialog.ui:1547 ../data/ui/PreferencesVarietyDialog.ui:1548 ../data/ui/PreferencesVarietyDialog.ui:1565 ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "Kürzeste Zeitspanne beträgt zehn Sekunden" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "Regelmäßiger Wechsel" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "Uhr" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "Show a nice big digital clock on the desktop, displaying the current time and date" msgstr "Eine nette, große, digitale Uhr mit aktueller Zeit und Datum auf dem Schreibtisch anzeigen" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "To configure the clock's appearance edit the clock_filter property in Variety's settings file (~/.config/variety/variety.conf). Use the comments in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "Um das Aussehens der Uhr anzupassen, muss der clock_filter-Wert in der Einstellungsdatei von Variety angepasst werden (~/.config/variety/variety.conf). Die Kommentare in ~/.config/variety/variety_latest_default.conf dienen als Anleitung." #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "Uhrschriftart: " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "Datumsschriftart: " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "These don't work? Read here. How to further configure the clock? Read here." msgstr "Funktioniert nicht? Hier lesen. Weitere Einstellmöglichkeiten für die Uhr? Hier lesen." #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "Effekte" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "Bilder für Diashow" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "Bevorzugte Bilder" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "Bilder in allen aktivierten Bildquellen" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "Alle Bilder im Ordner Downloads" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "Benutzerdefinierter Ordner (enthält Bilder in Unterordnern) " #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "Reihenfolge der Bilder in der Diashow " #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "Zufällig" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "Nach Namen, von A bis Z" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "Nach Namen, von Z bis A" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "Nach Datum, älteste zuerst" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "Nach Datum, neueste zuerst" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "Bildschirm" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "Auf Monitor laufen lassen" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "Fenstermodus für die Diashow " #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "Vollbildschirm" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "Desktop (bleibt unter anderen Fenstern)" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "Maximiertes Fenster" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "Normales Fenster" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "Dynamik" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "Intervall zwischen den Bildwechseln " #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr " Sekunden" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "Schnelles Verblassen " #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "Langsam verblassen" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "Weniger Zoom" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "Mehr Zoom" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "Weniger Pfanne" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "Mehr Pfanne" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "Auf Standardwerte zurücksetzen" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "Änderungen auf dieser Seite werden erst nach einem Neustart der Diashow wirksam" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "Diashow jetzt starten" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "Diashow" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "Abrufordner" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "Manuell heruntergeladene Hintergrundbilder speichern unter " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "Ziehen und Ablegen" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "Varietys Symbol im Starter dient als Fläche zum Ablegen. Dateien oder Adressen, die darauf gezogen werden, werden im Abrufordner gespeichert. Wenn Sie dann auf »Weiter« klicken, sehen Sie es als Hintergrund.\n" "Um das Symbol im Starter anzuzeigen, wählen Sie Info oder Einstellungen. Für vereinfachtes Ziehen-und-Ablegen kann es dort auch angeheftet werden." #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "Überwachung der Zwischenablage" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Zwischenablage auf Bildadressen überwachen und diese abrufen" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "Aber abrufen, wenn die Adresse eine der Folgenden ist:" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "Manuelles Herunterladen" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "Möglichst Bilder benutzten, auf die Folgendes zutrifft:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "Sind im Querformat" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "Mindestgröße ist " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "% der Bildschirmauflösung" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "Farbe" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "Sind dunkel oder hell:" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Dunkel" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Hell" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "Enhalten diese Farbe: " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(Wirkt sich nach einigen anfänglichen Suchen aus)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "Bewertung" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "Haben mindestens die Exif-Bewertung " #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "Farbe und Größe" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "Anzeigensymbol" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "Anzeigensymbol:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "Hell" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "Dunkel" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "Nummer 1" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "Nummer 2" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "Nummer 3" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "Nummer 4" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Aktuelles Hintergrundbild verwenden" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "Benutzerdefiniertes Bild …" #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "Keins" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "Symbol auswählen" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "When the icon is hidden, Variety can be controlled from the command line, or from the launcher quicklist. Run \"variety --help\" to see all available commands." msgstr "Wenn das Symbol nicht angezeigt wird, kann Variety von der Befehlszeile oder von der Schnellwahl des Starters aus gesteuert werden. Um alle möglichen Befehle zu sehen bitte »variety --help« ausführen." #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "Favoritenoperationen" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "Favoritenoperationen, welche im Hauptmenü angezeigt werden sollen:" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "Zu Favoriten kopieren" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "Sowohl Kopieren, als auch Verschieben" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "Abhängig vom Ordner …" #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "Unterstützung für das Anmeldefenster" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "Sicherstellen, dass die Hintergrundbilder von Variety auch im Anmeldefenster genutzt werden" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read permissions over the image. With this option on, Variety will copy the wallpapers to a public folder and change their permissions to make them readable by all. By default, the folder is ~/Pictures if your home folder " "in not encrypted, and /usr/share/backgrounds if it is. Please use with care on multiuser systems." msgstr "" "Privatsphärenwarnung: Um das Hintergrundbild anzuzeigen benötigt LightDM Leserechte für das Bild. Mit dieser Option wird Variety die Bilder in einen öffentlichen Ordner kopieren und es für alle lesbar machen. Die Vorgabe ist ~/Bilder, falls Ihr Persönlicher Ordner nicht " "verschlüsselt ist, ansonsten /usr/share/backgrounds. Bitte mit Sorgfalt auf Mehrbenutzersystemen verwenden." #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "Hintergrundbilder in diesen Ordner kopieren: " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "Auf Vorgabe zurücksetzen" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "Funktioniert immer noch nicht?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "It seems your home folder is encrypted, so using folders inside it will not work." msgstr "Vermutlich ist Ihr persönlicher Ordner verschlüsselt. Ordner innerhalb können deshalb nicht benutzt werden." #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "Keine Zugriffsrechte für diesen Ordner." #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "LightDM kann aufgrund fehlender Zugriffsrechte, Dateien in diesem Ordner nicht lesen." #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "Variety can adjust the permissions, but you will have to provide superuser privileges." msgstr "Variety kann die Rechte anpassen, aber dazu sind Systemverwalterrechte erforderlich." #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "Anpassen" #: ../data/ui/PreferencesVarietyDialog.ui:3619 ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "Tipps und Tricks" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "Letzte Änderungen" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "Internetseite besuchen" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "Fehler melden oder neue Funktionen vorschlagen" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "Rückmeldung senden" #: ../data/ui/PreferencesVarietyDialog.ui:3821 ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "Für Variety spenden" #: ../data/ui/PreferencesVarietyDialog.ui:3833 ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "Über PayPal spenden" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "Ich entwickle Variety in meiner Freizeit, was normalerweise heißt, wenn meine Kinder im Bett sind. Jede Spende ist willkommen. Diese zeigen mir, dass Sie - der Nutzer - Variety wertschätzen und das motiviert mich, das Programm aktiv weiterzuentwickeln.\n" "\n" "Vielen Dank,\n" "Peter Levi" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "Um in Bitcoin zu spenden, senden Sie bitte an dieses Wallet:" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "Variety - Datenschutzhinweis" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "Ablehnen und aufhören" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "Akzeptieren und fortfahren" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "Datenschutzhinweis" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using " "Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github." "com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" "Bevor wir beginnen, müssen Sie einige Dinge wissen und akzeptieren:\n" "\n" "Variety ist eine Open-Source-Anwendung, die ohne Mängelgewähr bereitgestellt wird. Durch die Nutzung erklären Sie sich mit den Bedingungen der GNU GPLv3 Lizenz einverstanden, unter der sie vertrieben wird. \n" "\n" "Variety ist eine Anwendung, die mit dem Internet verbunden ist. Mit den Standardeinstellungen lädt Variety Bilder aus dem Internet herunter. Webserver, von denen es Bilder herunterlädt, können Informationen über Ihr Gerät, wie die IP-Adresse, sammeln. Variety sendet keine " "persönlich identifizierbaren Informationen. Durch die Nutzung von Variety akzeptieren Sie die Nutzung der Internetverbindung. Beachten Sie, dass alle Online-Bildquellen deaktiviert werden können. \n" "\n" "Variety holt sich vom Entwicklungsteam definierte Einstellungen zur Ratenbegrenzung und wendet diese an. Dies kann die Download-Rate neuer Bilder beeinträchtigen, trägt aber dazu bei, dass Variety unabhängig davon funktioniert, wie viele Personen es benutzen. Diese " "Einstellungen werden von gist.github.com heruntergeladen, wo wir sie hosten.\n" "\n" "Bei einigen Bildquellen müssen wir zusätzliche Informationen nachverfolgen, wenn sie aktiviert sind. Zum Beispiel verlangen die Bedingungen von Unsplash, dass wir nachverfolgen und berichten, " "wenn Nutzer Bilder von Unsplash herunterladen und ansehen." #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Willkommen zu Variety!" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "Fortsetzen" #: ../data/ui/WelcomeDialog.ui:94 msgid "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper on a regular basis using local images or images downloaded from various online sources. It runs quietly in the background - to control it, click this icon in your system tray:" msgstr "" "Variety ist ein automatischer Hintergrundwechsler. Variety ändert den Schreibtischhintergrund regelmäßig. Es verwendet dafür lokale Bilder oder welche, die von verschiedenen Fotoseiten heruntergeladen wurden. Variety läuft leise im Hintergrund, um es zu steuern bitte auf das " "folgende Symbol in der Systemleiste klicken:" #: ../data/ui/WelcomeDialog.ui:124 msgid "Variety is open-source software, created by Peter Levi, a software developer from Bulgaria. If you like it, please donate." msgstr "Variety ist ein quelloffenes Programm, von Peter Levi, einem Programmierer aus Bulgarien, geschrieben. Wenn es Ihnen gefällt, dann spenden Sie bitte." #: ../data/ui/WelcomeDialog.ui:143 msgid "Now please take some time to set your preferences on the following screens." msgstr "Jetzt bitte etwas Zeit nehmen, um die Einstellungen auf den folgenden Fenstern anzupassen." variety-0.8.13/po/es.po000066400000000000000000002060511475753071700146770ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # Ulices, 2023 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:50+0000\n" "Last-Translator: Ulices, 2023\n" "Language-Team: Spanish (https://www.transifex.com/variety/teams/123174/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "No se encontraron imágenes" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "Imágenes de Flickr" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "Seleccione una carpeta" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "Cancelar" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "Aceptar" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "Obteniendo" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "No es una imagen" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "La imagen es demasiado pequeña, se ignorará" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "Se obtuvo el error %s…" #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "Eso significa que el enlace no es válido" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "Falló la descarga por algún motivo" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "" "Para obtener más información, ejecute Variety desde la terminal con la " "opción -v y reintente la acción" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "_Siguiente" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "_Anterior" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "Fondo de pantalla actual" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "Mostrar origen" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "Copiar en _Favoritos" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "Mover a Favoritos" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "Mover a la _papelera" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "Siguiente, saltando hacia adelante en el historial" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Consejo: use la rueda del ratón sobre el\n" "icono para ir al fondo anterior/siguiente" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "Pausar en el actual" #: ../variety/indicator.py:140 msgid "_Image" msgstr "_Imagen" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "¿De dónde es?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "Mostrar sin efectos" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "Búsqueda de imágenes de Google" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "Establecer valoración de EXIF" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "Guardar en Favoritos" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "Ver favoritos…" #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "Copiar al portapapeles" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "Cita de Google" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "Autor de Google" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "Preferencias…" #: ../variety/indicator.py:250 msgid "Turn off" msgstr "Apagar" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "_Cita" #: ../variety/indicator.py:262 msgid "_History" msgstr "_Histórico" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "Selector de _fondos" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "_Descargas recientes" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "Iniciar pase de diapositivas" #: ../variety/indicator.py:300 msgid "About" msgstr "Acerca de" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "Donar" #: ../variety/indicator.py:308 msgid "Quit" msgstr "Salir" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "Señal de finalización recibida, saliendo…" #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "" "Variety ya se está ejecutando. Enviando la orden a la instancia en " "ejecución." #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr " (Perfil: {})" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Preferencias de Variety" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "Todo" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "Imágenes" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "Agregar imágenes de fondo de pantalla individuales" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "Carpetas" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" "Se buscó recursivamente hasta por 10000 imágenes, se muestran en orden " "aleatorio" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "Álbumes secuenciales (ordenar por nombre de archivo)" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" "Se buscó recursivamente por imágenes, se muestran en secuencia (por nombre " "de archivo)" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "Álbumes secuenciales (ordenar por fecha)" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" "Se buscó recursivamente por imágenes, se muestran en secuencia (por fecha de" " archivo)" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "Obtener imágenes de Flickr" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "Quitar el origen, mantener los archivos" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "Quitar los orígenes, mantener los archivos" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "Quitar el origen y eliminar los archivos descargados" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "Quitar los orígenes y eliminar los archivos descargados" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" "El uso de esta fuente requiere que el cambio de fondo de excritorio esté " "habilitado en intervalos de %dminutos o menos. La configuración se ajustará " "automáticamente." #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "Añadir imágenes" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "Añadir" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Añadir carpetas – Solo añada las carpetas raíz, las subcarpetas se buscarán " "recursivamente" #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" "Agregar álbumes secuenciales (ordenados por nombre de archivo). Las " "subcarpetas se buscan recursivamente." #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "" "Agregar álbumes secuenciales (ordenados por fecha). Las subcarpetas se " "buscan recursivamente." #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "Editar…" #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "Abrir carpeta" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "Ver imagen" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "Sin permisos de escritura" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "No se pudieron ajustar los permisos" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Puede probar a ejecutar esta orden:\n" "sudo chmod %s \"%s\"" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "Sin complemento de citas" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "No está instalado un complemento de citas" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "No hay complemento de citas disponible" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "" "No tiene actualmente ningún complemento de citas que soporte la búsqueda por" " palabras clave y autores" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "No se pudieron recuperar citas" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "" "El servicio de citas puede estar detenido. Continuaremos intentándolo." #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "No se pudieron encontrar citas" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "¿Quizá está buscando algo muy oculto?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "Mantener el original" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "Escala de grises" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "Desenfoque duro" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "Desenfoque suave" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "Pintura al óleo" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "Puntillismo" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "Pixelar" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "Carpeta de Favoritos" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "La carpeta Obtenidos" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "" "Recomendado por Variety. Se adapta a tu gusto según que imágenes marcas como" " favoritas o eliminas." #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" "Últimos favoritos de otros usuarios de Variety. [Puede contener imágenes " "NSFW]" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Fondos aleatorios de Desktoppr.co" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "Imagen astronómica del día de la NASA" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "Foto del día de Bing" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "Fotografías de alta resolución de Unsplash.com" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" "Puede cambiar de fondo ubicando el puntero del ratón sobre el icono " "indicador y usando la rueda de desplazamiento." #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" "Si desea ejecutar comandos personalizados cada vez que cambia el fondo de " "pantalla o si utiliza un entorno de escritorio alternativo, edite los " "scripts en {PROFILE_PATH}scripts. Allí hay ejemplos para varios entornos de " "escritorio." #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" "Es posible controlar Variety desde la consola; puede usar esta funcionalidad" " para establecer las combinaciones de teclas que más utiliza. Ejecute " "«variety --help» para ver todas las órdenes." #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" "Puede arrastrar y soltar enlaces o imágenes en el icono del lanzador para " "establecerlos como fondo. Para descargar rápidamente desde un sitio web, " "puede utilizar el monitoreo de portapapeles (vea la pestaña «Descarga " "manual»)." #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" "La aplicación de un filtro de desenfoque pesado es una excelente manera de " "obtener fondos de pantalla de aspecto abstracto y discreto, pero coloridos, " "similares en espíritu al predeterminado en Ubuntu." #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" "Agregar sus propios filtros personalizados es bastante fácil: abra " "{PROFILE_PATH}variety.conf en un editor y use los filtros existentes como " "ejemplo. Cada filtro es solo una línea de opciones que es pasada al comando " "de conversión de ImageMagick." #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" "Cuando selecciona una fuente de imágenes, sus imágenes se muestran en una " "ventana en la parte inferior de la pantalla. Haga clic en una imagen allí " "para establecerla como fondo de pantalla. Haga clic con el botón derecho " "para cerrar la ventana, modificar su apariencia o realizar operaciones de " "archivos. Puede seleccionar varias fuentes de imágenes para crear una vista " "en miniatura \"combinada\" de todas ellas. Tenga en cuenta que la vista en " "miniatura está limitada a varios cientos de imágenes seleccionadas al azar." #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" "Para habilitar las notificaciones de escritorio cuando cambia el fondo de " "pantalla, descomente las dos líneas en la parte inferior de " "{PROFILE_PATH}scripts/set_wallpaper." #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" "El ícono del indicador de Variety es tematizable: si elige la opción " "\"Claro\" para el ícono, Variety primero verificará si el tema GTK actual " "tiene un ícono llamado \"variety-indicator\" y lo usará en lugar del ícono " "claro incluido." #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" "Cuando elige guardar citas en Favoritos, estas se guardan de forma " "predeterminada en {PROFILE_PATH}favorite_quotes.txt. Este archivo es " "compatible con la fuente de citas de archivos locales de Variety. Si desea " "usarlo, cópielo en ~/.config/variety/pluginconfig/quotes/ y habilite la " "fuente de citas de archivos locales. Este archivo también es compatible con " "la utilidad fortune de Unix." #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "Abajo" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Arriba" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Izquierda" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "Derecha" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "Posición" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "Tamaño" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "Máximo de imágenes mostradas" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "Mostrar la carpeta contenedora" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "Obtenidos: Mostrar origen" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "Ver en %s" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "Mover a _Favoritos" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "Cerrar" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "No se pudo establecer la valoración de EXIF" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "Sin valorar" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "Rechazado" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "Histórico de Variety" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Descargas recientes de Variety" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Imágenes de Variety" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" "%prog [options] [files or urls]\n" "\n" "Pasar archivos locales los agregará a la cola de Variety.\n" "Al pasar las URL remotas, Variety las descargará en la carpeta Fetched y las colocará en la cola.\n" "\n" "Para establecer un fondo de pantalla específico: %prog --set /some/local/image.jpg\n" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" "Nombre de perfil o ruta completa a la carpeta de configuración que debe usar" " Variety. Si no se especifica, es ~/.config/variety/. Si solo se usa un " "nombre en lugar de una ruta completa, la carpeta del perfil será " "~/.config/variety-profiles/. Úselo solo cuando comience inicialmente " "Variety: cambiar la ruta del perfil requiere reiniciar. Se pueden iniciar " "varias instancias de Variety cuando se utilizan diferentes perfiles, cada " "uno con su propia configuración independiente. Esto se puede usar, por " "ejemplo, para controlar varias pantallas o espacios de trabajo diferentes en" " entornos de escritorio que lo permiten como XFCE. Para pasar comandos a " "una instancia en ejecución, pase el mismo argumento --profile con el que se " "inició en los comandos posteriores." #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" "Mostrar mensajes de registro (-vv a -vvvvv perfilarán varias partes de " "Variety con mayor detalle" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "Salir de la instancia en ejecución" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" "Mostrar la ubicación del fondo actual. Solo se utiliza cuando la aplicación " "ya está en ejecución." #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" "Establecer el archivo dado como fondo de pantalla, se requiere ruta absoluta" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "Mostrar el siguiente fondo" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "Mostrar el fondo anterior" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "Mostrar el siguiente fondo, omitiendo el histórico" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Mover el fondo actual a la papelera. Solo se utiliza cuando la aplicación ya" " está en ejecución." #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Copiar el fondo actual a favoritos. Solo se utiliza cuando la aplicación ya " "está en ejecución." #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Mover el fondo actual a favoritos. Solo se utiliza cuando la aplicación ya " "está en ejecución." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "Pausar en la imagen actual" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "Reanudar cambios periódicos de imagen" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "Pausar/reanudar" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "Alternar \"Mostrar sin efectos\" para la imagen actual" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "Ver la cita siguiente" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "Ver la cita anterior" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "Mostrar la siguiente cita, omitiendo el histórico" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "Pausar/reanudar citas" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "Guardar la cita actual en Favoritos" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "Mostrar/ocultar historial" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "Mostrar/ocultar descargas recientes" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "Mostrar el diálogo Preferencias" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Mostrar selector de fondo de pantalla manual: la barra de miniaturas se " "llena de imágenes de las fuentes de imágenes activas" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" "Establece y aplica una opción. Los nombres de las opciones son los mismos " "usados en el archivo de configuración de Variety " "~/.config/variety/variety.conf. Puede establecer varias opciones en una sola" " orden. Por ejemplo: «variety --set-option icon Dark --set-option " "clock_enabled True». ÚSELO CON PRECAUCIÓN: está modificando el archivo de " "configuración directamente, sin ningún tipo de protección." #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "" "las opciones --next/--fast-forward y --previous son mutualmente excluyentes" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "las opciones --trash y --favorite son mutualmente excluyentes" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "las opciones --pause y --resume son mutualmente excluyentes" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "las opciones --quotes-next/--quotes-fast-forward y --quotes-previous son " "mutualmente excluyentes" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "Ya está en Favoritos" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "Fuente: %s" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "Desconocido" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "Autor: %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "Reanudar cambios periódicos" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "¿El filtrado es demasiado estricto?" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "" "Variety encontró muy pocas imágenes en la búsqueda que coincidan con sus " "criterios de filtrado de imágenes." #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "" "Añada más orígenes de imágenes o espere a que se completen algunas descargas" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "Añada más orígenes de imágenes" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "No hay más fondos" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "El fondo actual no está en los orígenes de imágenes" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "" "No se pudo mover a %s. Probablemente no tenga permisos para mover este " "archivo." #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" "No se pudo copiar a %s. Probablemente no tenga permisos para copiar este " "archivo." #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "No se puede eliminar" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "No tiene permisos para mover %s a la papelera." #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" "No se pudo eliminar a la papelera, consulte variety.log para obtener más " "información." #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "" "Se abrirá un editor con el archivo de configuración; aplique los cambios " "después de guardar y cerrar el editor." #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "Añadido a la cola" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "Pulse Siguiente para verlo" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "Obtenidos" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "El origen no es compatible" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "¿Está utilizando la versión más reciente de Variety?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "Se añadió un origen de imágenes nuevo" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "El origen de imágenes ya existe. Activándolo" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "Obtenido y aplicado" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "¡Funciona!" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "Yey, los enlaces de Variety funcionan. ¡Excelente!" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "No se admite la orden" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "No se pudo procesar el URL variety:// dado" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "Ejecutar con el registro habilitado para ver los detalles" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "Variety: nueva entrada de escritorio" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" "Creamos una nueva entrada de escritorio en ~/.local/share/applications para " "ejecutar Variety con el perfil \"{}\". Encuéntralo en el lanzador de " "aplicaciones." #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "Variety: entrada de escritorio de inicio automático creada" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" "Creamos una nueva entrada de escritorio en ~/.config/autostart. Variety " "debería iniciar automáticamente en el próximo inicio de sesión." #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "No se pudo crear la entrada de inicio automático" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "Ocurrió un error al crear la entrada de inicio automático de escritorio\n" "Ejecute el programa desde la terminal con el parámetro -v e inténtelo de nuevo." #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "Sin imágenes" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "No hay ninguna imagen en las carpetas de pase de diapositivas" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "Acerca de Variety" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" "Copyright (c) 2012-2020, Peter Levi, James Lu y contribuidores de Variety" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Un cambiador, descargador y gestor de fondos automático." #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "https://github.com/varietywalls/variety" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" "# Copyright (c) 2012-2020, Peter Levi, James Lu y colaboradores de Variety\n" " # Este programa es software libre: puedes redistribuirlo y/o modificarlo\n" " # bajo los términos de la Licencia Pública General GNU versión 3, tal como se publicó\n" " # por la Fundación de Software Libre.\n" " #\n" " # Este programa se distribuye con la esperanza de que sea útil, pero\n" " # SIN NINGUNA GARANTÍA; sin siquiera las garantías implícitas de\n" " # COMERCIABILIDAD, CALIDAD SATISFACTORIA o IDONEIDAD PARA UN PARTICULAR\n" " # OBJETIVO. Consulte la Licencia pública general de GNU para obtener más detalles.\n" " #\n" " # Debería haber recibido una copia de la Licencia pública general de GNU junto con\n" " # con este programa. Si no, consulte .\n" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "Solo un momento para buscar imágenes." #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr " " #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Variety – Añadir Flickr como origen de imágenes" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" "Especifique los criterios de búsqueda en Flickr. Se descargarán las fotos que cumplan " "con todos los criterios. Deje vacíos los criterios que no sean necesarios." #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "Etiquetas: " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "Una lista de etiquetas separadas por comas. Para coincidir, una foto debe contener todos simultáneamente.\n" "Ejemplo: amarillo,auto" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "Usuario: " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "Inserte la dirección URL de la galería del usuario o una de sus fotos.\n" "Ejemplo: http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "Grupo: " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "Escriba la dirección URL del grupo.\n" "Ejemplo: http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "Texto:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "Búsqueda de texto en los títulos, descripciones y etiquetas de las fotos. Excluya términos anteponiéndoles -.\n" "Ejemplo: pastel -manzana" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "Un momento para revisar esta búsqueda" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Copiar a favoritos o mover a favoritos" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "Restablecer valores predeterminados" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "" "Seleccione si prefiere «Copiar a favoritos» o «Mover a favoritos» en el " "menú, dependiendo de la ubicación de la imagen:" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "Introduzca una entrada por línea, cada una con con forma : , donde «Carpeta» puede ser Descargados, Obtenidos, Otros o una ruta de carpeta específica.\n" "El orden es importante. Cuando se muestra una imagen, la primera carpeta de esta lista que contiene la imagen determinará las operaciones que se mostrarán en el menú de Variety. «Otros» coincide con cualquier archivo y debería ser el último de la lista.\n" "\n" "Ejemplo:\n" "\tDescargados:Copiar\n" "\tObtenidos:Mover\n" "\t/fotos/ImágenesAlAzar:Mover\n" "\t/fotos/ÁlbumesOrganizados:Copiar\n" "\tOtros:Ambos" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "segundos" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "minutos" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "horas" #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "días" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "General" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "Iniciar Variety cuando arranque el equipo" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "Cambiar el fondo cada " #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "El intervalo mínimo es de 5 segundos" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "Cambiar el fondo al iniciar" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "Activado" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "Tipo" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "Ubicación" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "_Añadir…" #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "Añadir imágenes, carpetas u orígenes de imágenes en línea" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "Abrir carpeta" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "Editar el origen seleccionado" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "_Editar…" #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "_Quitar…" #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "Quitar los orígenes de imágenes seleccionados" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "_Usar" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "Activar los orígenes seleccionados y desactivar los demás" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "Favoritos" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "Copiar los fondos favoritos a " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "Filtros" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" "Aplicar aleatoriamente estos filtros a los fondos de pantalla que aparecen " "(gracias al genial ImageMagick):" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "Citas" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "Mostrar citas sabias al azar en el escritorio" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "Color del texto: " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "Tipo de letra del texto: " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "Color de fondo: " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "Opacidad del fondo: " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " Transparente" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "Opaco" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "Dibujar una sombra de texto" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "Apariencia" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "Anchura de la zona de citas: " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "Estrecha " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "Ancha" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "Posición horizontal: " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "Izquierda " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "Posición vertical: " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "Arriba " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "Posición" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "Mostrar citas de estos orígenes: " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" "Más " "complementos" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" "Mostrar solo estas etiquetas y autores. Dejar en blanco para mostrar citas " "aleatorias." #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "Ejemplo: divertido, inspirador" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "Ejemplo: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "Autores: " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "Orígenes y filtrado" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "Cambiar la cita cada " #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "El intervalo mínimo es de 10 segundos" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "Cambio periódico" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "Reloj" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "Mostrar un reloj digital con fecha en el escritorio" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "Para configurar la apariencia del reloj, edite la propiedad clock_filter en " "el archivo de configuración de Variety (~/.config/variety/variety.conf). Use" " los comentarios en ~/.config/variety/variety_latest_default.conf como guía." #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "Tipo de letra del reloj: " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "Tipo de letra de la fecha: " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "¿No funcionan " "estas opciones? ¿Cómo " "personalizar aún más el reloj?." #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "Efectos" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "Imágenes para pase de diapositivas" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "Imágenes favoritas" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "Imágenes en todos los orígenes activados" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "Todas las imágenes en la carpeta Descargas" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "Carpeta personalizada (incluye las subcarpetas) " #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "Orden de las imágenes en el pase " #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "Al azar" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "Por nombre, de la A a la Z" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "Por nombre, de la Z a la A" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "Por fecha, las más antiguas primero" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "Por fecha, las más recientes primero" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "Pantalla" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "Ejecutar en el monitor" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "Modo de ventana del pase de diapositivas " #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "Pantalla completa" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "Escritorio (permanece bajo las otras ventanas)" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "Ventana maximizada" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "Ventana normal" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "Dinámica" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "Intervalo entre cambios de imagen " #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr " segundos" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "Desvanecimiento rápido " #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "Desvanecimiento lento" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "Menos acercamiento" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "Más acercamiento" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "Menos desplazamiento" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "Más desplazamiento" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "Restablecer a los valores predeterminados" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" "Los cambios en esta página surtirán efecto al reiniciar el pase de " "diapositivas" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "Iniciar pase de diapositivas ahora" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "Pase de diapositivas" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "Carpeta Obtenidos" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "Guardar los fondos descargados manualmente en " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "Arrastrar y soltar" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "Puede soltar imágenes o URL sobre el icono de Variety en el lanzador, para que el programa las guarde en la carpeta Obtenidos. Después, puede pulsar Siguiente para verla en su escritorio.\n" "Para mostrar el icono en el lanzador, elija Acerca de o Preferencias. Para facilitar el acceso a esta función, ancle el icono en el lanzador." #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "Monitoreo del portapapeles" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Detectar URL de imágenes en el portapapeles y obtenerlas" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "Pero solo obtenerlas cuando el sitio de la URL sea uno de estos:" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "Descarga manual" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "Siempre que sea posible usar imágenes que:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "Tienen orientación horizontal" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "Tienen por lo menos " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "% de la resolución de la pantalla" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "Color" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "Son oscuras o claras:" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Oscuras" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Claras" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "Contienen este color: " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(Será efectivo después de realizar algunas búsquedas)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "Valoración" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "Tener clasificación EXIF ​​de al menos" #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "Color y tamaño" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "Icono del indicador" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "Icono del indicador:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "Claro" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "Oscuro" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "Número 1" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "Número 2" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "Número 3" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "Número 4" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Usar el fondo actual" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "Imagen personalizada…" #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "Ninguna" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "Seleccione un icono" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" "Cuando el icono está oculto, puede controlar Variety desde la línea de " "órdenes o desde la lista rápida del lanzador. Ejecute «variety --help» para " "ver todas las órdenes disponibles." #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "Operaciones de favoritos" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "Operaciones de favoritos a mostrar en el menú principal:" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "Copiar a favoritos" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "Copiar y mover" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "Depende de la carpeta…" #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "Compatibilidad con pantalla de acceso" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "Asegúrese de que los fondos establecidos por Variety se usarán en la " "pantalla de inicio de sesión" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" "Aviso de privacidad: Para mostrar su fondo de escritorio LightDM " "necesita permisos de lectura sobre la imagen. Cuando se active esta opción " "Variety copiará los fondos a una carpeta pública y cambiará sus permisos " "para hacerlos legibles por todos. De forma predeterminada, esta carpeta es " "~/Imágenes si su carpeta personal no está cifrada, y /usr/share/backgrounds " "si lo está. Úselo con cuidado en sistemas multiusuario." #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "Copiar las imágenes de fondo en esta carpeta: " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "Restaurar al valor predeterminado" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "¿Sigue sin funcionar?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Parece que su carpeta personal está cifrada. No funcionarán las subcarpetas." #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "No tiene permisos de escritura para esta carpeta." #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "LigthDM no tiene permisos para leer los archivos de esta carpeta." #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "Variety puede ajustar los permisos, pero deberá proporcionarle privilegios " "de superusuario." #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "Personalizar" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "Consejos y trucos" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "Cambios recientes" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "Visitar el sitio web" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "Informar de un error o pedir una característica" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "Enviar comentarios" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "Done a Variety" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "Donar con PayPal" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "Desarrollo Variety en mi tiempo libre, que normalmente son las últimas horas del día, después de que mis hijos se van a la cama. Apreciaré cualquier cantidad que done. Eso me mostrará que Variety es significativo para usted —el usuario— y me motivará para continuar trabajando en él activamente.\n" "\n" "Gracias,\n" "Peter Levi" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "Para donar en Bitcoin, por favor envíe a esta billetera:" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "Variety - Aviso de Privacidad" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "Rechazar y salir" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "Aceptar y continuar" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "Aviso de Privacidad" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" "Antes de comenzar, aquí hay algunas cosas que debe tener en cuenta y aceptar:\n" "\n" "Variety es una aplicación de código abierto, que se proporciona tal cual, sin ninguna garantía. Al usarlo, acepta los términos y condiciones de la licencia GNU GPLv3 bajo la cual se distribuye. \n" "\n" " Variety es una aplicación conectada a Internet. Con la configuración predeterminada, Variety descarga imágenes de Internet. Los servidores web desde los que se descarga pueden recopilar información sobre su dispositivo, como la dirección IP. Variety no envía ninguna información de identificación personal. Al usar Variety, acepta su uso de la conectividad a Internet. Tenga en cuenta que todas las fuentes de imágenes en línea se pueden desactivar. \n" "\n" " Variety obtiene y aplica configuraciones de limitación de velocidad definidas por el equipo de desarrollo. Esto puede afectar la velocidad a la que descarga nuevas imágenes, pero ayuda a garantizar que Variety pueda funcionar independientemente de cuántas personas lo estén ejecutando. Estas configuraciones se descargarán de gist.github.com donde las alojamos.\n" "\n" " Algunas fuentes de imágenes requieren que rastreemos información adicional cuando están habilitadas. Por ejemplo, los términos de Unsplash nos exigen rastrear e informar cuando los usuarios descargan y ven imágenes de Unsplash." #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Le damos la bienvenida a Variety." #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "Continuar" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" "Variety es un cambiador de fondo de pantalla automático Rota el fondo de " "pantalla de su escritorio de forma regular usando imágenes locales o " "imágenes descargadas de varias fuentes en línea. Se ejecuta silenciosamente " "en segundo plano: para controlarlo, haga clic en este icono en la bandeja " "del sistema:" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" "Variety es un programa de código abierto creado por Peter Levi, un " "programador de Bulgaria. Si le gusta, haga un donativo." #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" "Dedique ahora unos minutos para configurar la aplicación en las ventanas " "siguientes." variety-0.8.13/po/fi.po000066400000000000000000001665241475753071700147000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:05+0000\n" "Last-Translator: James Lu , 2021\n" "Language-Team: Finnish (https://www.transifex.com/variety/teams/123174/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "Kuvia ei löytynyt" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "Valitse kansio" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "Peruuta" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "OK" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "Hakeminen" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "Ei ole kuva" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "Kuva on liian pieni, ohita se" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "Pahoittelut, sain %s virheen..." #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "Tämä tarkoittaa, että linkki ei ole enää kelvollinen" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "Hakeminen epäonnistui jostain syystä" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "" "Saat lisätietoja suoritamalla variety päätteestä -v valinnalla ja yritä " "uudelleen" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "_Seuraava" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "_Edellinen" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "Nykyinen työpöydän taustakuva" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "Näytä alkuperäinen" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "Kopioi Suosikkeihin" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "Siirrä Suosikkeihin" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "Tyhjennä _Roskakori" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "_Seuraava, historia ohitetaan" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Vinkki: Rullaa kuvakkeen päällä\n" "eteen ja taakse" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "Pysähdy tähän" #: ../variety/indicator.py:140 msgid "_Image" msgstr "_Kuva" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "Mistä tämä on kotoisin?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "Näytä ilman tehosteita" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "Google kuvien haku" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "Anna arvio EXIF" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "Tallenna suosikkeihin" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "Näytä suosikit..." #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "Koipioi leikepöydälle" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "Hae lainaus Googlesta" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "Hae tekiä Googlella" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "Asetukset..." #: ../variety/indicator.py:250 msgid "Turn off" msgstr "Sammuta" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "_Lainaus" #: ../variety/indicator.py:262 msgid "_History" msgstr "_Historia" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "_Taustakuvan valitsin" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "Viimeisimmät _Lataukset" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "Käynnistä diaesitys" #: ../variety/indicator.py:300 msgid "About" msgstr "Tietoja" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "Lahjoita" #: ../variety/indicator.py:308 msgid "Quit" msgstr "Sulje" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "Lopetusviesti vastaanotettu, lopetetaan..." #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "" "Variety on jo käynnissä. Lähettää komennon käynnissä olevalle instanssille." #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr "" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Variety asetukset" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "Kaikki" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "Kuvat" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "Kansiot" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "Poista lähde, säilytä tiedostot" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "Poista lähteet, säilytä tiedostot" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "Poista lähde ja poista ladatut tiedostot" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "Poista lähteet ja poista ladatut tiedostot" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "Lisää kuvia" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "Lisää" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Lisää kansioita - Lisää vain root-kansiot, alikansioita haetaan " "rekursiivisesti" #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "Muokkaa..." #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "Avaa kansio" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "Näytä kuva" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "Ei kirjoitusoikeuksia" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "Käyttöoikeuksia ei voitu muuttaa" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Voit suorittaa tämän komennon manuaalisesti\n" "sudo chmod %s \"%s\"" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "Ei lainauksien laajennusta" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "Lainausten laajennus ei ole asennettu" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "Ei ole sopiva lainauksen laajennus" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "" "Sinulla ei ole lainausten laajennusta, joka tukisi hakua avainsanojen ja " "tekijöiden perusteella" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "Lainauksia ei voi noutaa" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "Lainauspalvelut saattavat olla alhaalla, yritetään edelleen" #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "Ei löytänyt lainauksia" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "Ehkä etsit jotain hyvin hämärää?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "Säilytä alkuperäinen" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "Harmaasävy" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "Voimakas sumeus" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "Pehmeä sumeus" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "Öljyväri" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "Rakeinen" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "Pikselöity" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "Suosikit kansio" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "Noudetut kansio" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "" "Varietyn suositukset. Mukautuu makusi mukaan, kun merkitset kuvat suosikiksi" " tai roskaksi." #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "Variety viimeisimmät suosikit. [Voi sisältää NSFW-kuvia]" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Päivän kuva, Desktoppr.co" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "Päivän kuva, NASA tähtitiede" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "Päivän kuva, Bing" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "Päivän kuva, Unsplash.com" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "Voit vaihtaa taustakuvaa edestakaisin vierittämällä hiiren rullaa." #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" "Varietyn voi hallita komentoriviltä ja tämän avulla voit määrittää mm. " "useimmin käytetyt pikanäppäimet. Suorita \"variety --help\" nähdäksesi " "kaikki käytettävissä olevat komennot." #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" "Voit pudottaa ohjelman kuvakkeeseen linkkejä tai kuvatiedostoja ladataksesi " "ne ja käyttää niitä taustakuvina. Voit nopeammin ladata tietystä sivustosta," " käyttämällä leikepöydän valvontaa (katso \"Manuaalinen lataus\" " "-välilehti)." #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" "Voimakkaan sumennuksen käyttö on hieno tapa saada abstraktin näköisiä ja " "häiritsemättömiä, mutta värikkäitä taustakuvia. Nämä ovat hengeltään " "samanlaisia kuin oletuksena Ubuntussa." #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" "Kun valitset kuvien toimittajan, sen kuvat näkyvät ikkunassa näytön " "alareunassa. Napsauta kuvaa, jonka haluat asettaa taustakuvaksi. Sulje " "ikkuna, muokkaa sen ulkoasua tai suorita toimintoja napsauttamalla hiiren " "kakkospainikkeella. Voit luoda \"yhdistetyn\" näkymän pienoiskuvina kaikista" " kuvalähteistä valitsemalla useita kuvalähteitä. Huomaa, että näkymä on " "rajoitettu useaan sataan satunnaisesti valittuun kuvaan." #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" "Varietyn alavalikon kuvake on teemallinen - jos valitset kuvakkeelle " "\"Kevyt\" -vaihtoehdon. Variety tarkistaa ensin, onko nykyisessä GTK-" "teemassa kuvake nimeltä \"variety-indicator\" ja käyttää sitä mukana olevan " "kuvakkeen sijasta." #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "Alhaalla" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Ylhäällä" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Vasen" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "Oikea" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "Sijainti" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "Koko" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "Näytä sisältävä kansio" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "Haettu: Näytä alkuperäinen" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "Näytä kohteessa %s" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "Siirrä _Suosikkeihin" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "Sulje" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "Ei voitu asettaa arviota EXIF" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "Ei arviota" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "Poistettu" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "Variety historia" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Variety viimeisimmät lataukset" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Variety kuvat" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "Lopeta käynnissä oleva esiintymä" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" "Näytä taustakuvan nykyinen sijainti. Käytössä vain, kun sovellus on jo " "käynnissä." #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "Näytä seuraava taustakuva" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "Näytä edellinen taustakuva" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "Näytä seuraava taustakuva, historia ohitetaan" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Siirrä nykyinen taustakuva roskakoriin. Käytössä vain, kun sovellus on jo " "käynnissä." #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Kopioi nykyinen taustakuva Suosikkeihin. Käytössä vain, kun sovellus on jo " "käynnissä." #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Siirrä nykyinen taustakuva Suosikkeihin. Käytössä vain, kun sovellus on jo " "käynnissä." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "Jää tähän" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "Jatka säännöllistä kuvan vaihtoa" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "Vaihda tilaa Tauko/Jatka" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "Näytä seuraava lainaus" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "Näytä edellinen lainaus" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "Näytä seuraava lainaus, historia ohitetaan" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "Lainauksen tila Tauko/Jatka" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "Tallenna lainaus Suosikkeihin" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "Vaihda historian näyttöä" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "Vaihda Viimeisimmät lataukset näyttöä" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "Näytä asetukset ikkuna" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Näytä manuaalinen taustakuvan valitsin - kuvapalkki, joka on täynnä kuvia " "aktiivisista kuvalähteistä" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" "Asettaa ja käyttää valintoja. Vaintojen nimet ovat samat, joita käytetään " "Varietyn config-tiedostossa ~/.config/variety/variety.conf. Useita vaintoja " "voidaan asettaa yhdellä komennolla. Esimerkki: 'variety --set-option icon " "Dark --set-option clock_enabled True'. KÄYTÄ VAROEN: Muutat suoraan " "asetustiedostoa." #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "" "valinnat --next/--fast-forward ja --previous ovat toisensa poissulkevia" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "valinnat --trash ja --favorite ovat toisensa poissulkevia" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "valinnat --pause ja --resume ovat toisensa poissulkevia" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "valinnat --quotes-next/--quotes-fast-forward ja --quotes-previous ovat " "toisensa poissulkevia" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "Jo Suosikeissa" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "Tuntematon" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "Julkaisija: %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "Jatka säännöllistä vaihtoa" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "Suodatus liian tiukka?" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "" "Variety löytää liian vähän kuvia, jotka vastaavat kriteereitä suodatusessa" #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "Lisää kuvalähteitä tai odota latauksia" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "Lisää uusia kuvalähteitä" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "Ei enää taustakuvia" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "Nykyinen taustakuva ei ole kuvalähteissä" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "" "Kohdetta %s ei voitu siirtää. Sinulla ei todennäköisesti ole oikeuksia " "siirtää tätä tiedostoa." #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" "Kohdetta %s ei voitu kopioida. Sinulla ei todennäköisesti ole oikeuksia " "kopioida tätä tiedostoa." #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "Ei voi poistaa" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "Sinulla ei ole oikeuksia poistaa kohdetta %s roskakoriin." #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" "Roskakoriin poistaminen epäonnistui, tarkista lisätietoja on variety.log." #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "" "Avaan määrityksen editorin ja otan muutokset käyttöön tallentamisen ja " "sulkemisen jälkeen." #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "Lisätty jonoon" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "Paina Seuraava nähdäksesi sen" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "Haettu" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "Lähdetyyppiä ei tueta" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "Käytätkö uusinta Variety-versiota?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "Uusi kuvien lähde lisätty" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "Kuvalähde on jo olemassa, otetaan sen käyttöön" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "Haettu ja sovellettu" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "Se toimii!" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "Jee, Variety linkit toimivat. Loistava!" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "Komentoa ei tueta" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "Annettua verkko-osoitetta variety:// ei voitu käsitellä" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "Suorita lokiin kirjaaminen niin näet tiedot" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "Määritys käynnistykseen ei onnistunut" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "Työpöydän Autostart-merkinnän luomisessa tapahtui virhe\n" "Suorita terminaalista, valinnalla -v ja yritä uudelleen." #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "Ei kuvia" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "Diaesityksen kansioissa ei ole kuvia" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "Tietoja Variety" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Automaattinen taustakuvan vaihtaja, lataaja ja hallinta." #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr "" #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Variety - lisää Flickr kuvalähde" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" "Määritä Flickr haun ehdot. Kun kaikki " "valitut ehdot täyttävät valokuvat ladataan. Jätä ei-toivotut ehdot tyhjiksi." #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "Tunnisteet: " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "Pilkuilla erotettu lista tunnisteista. Valokuvan on sisällettävä ne kaikki samanaikaisesti, jotta ne vastaavat toisiaan.\n" "Esimerkki: yellow, car" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "Käyttäjä: " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "Lisää verkko-osoite käyttäjien valokuvavirtaan tai johonkin heidän valokuvistaan.\n" "Esimerkki: http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "Ryhmä: " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "Lisää ryhmän verkko-osoite\n" "Esimerkki: http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "Teksti:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "Vapaa tekstihaku valokuvien otsikoista, kuvauksista ja tunnisteista. Sulje ehdot pois tekemällä ne valmiiksi -.\n" "Esimerkki: apple -pie" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "Pieni hetki tarkistetaan tämä haku" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Kopioi Suosikkeihin vs. Siirrä Suosikkeihin" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "Palauta oletuksiin" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "" "Valitse, haluatko \"kopioida Suosikkeihin\" tai \"siirtää Suosikkeihin\" " "valikossa kuvan sijainnin mukaan:" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "Anna yksi merkintä riviä kohden, merkintä lomakkeessa :, mistä kansio voidaan ladata, hakea, muut tai tietty kansion polku.\n" "Järjestys on tärkeää. Kun kuva näytetään, luettelon ensimmäinen kansio, joka sisältää kuvan, määrittää, mitkä toiminnot näkyvät Varietyn valikossa. \"Muut\" täsmää mihin tahansa tiedostoon ja sen pitäisi olla viimeisenä luettelossa.\n" "\n" "Esimerkki:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "sekunti" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "minuutti" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "tunti" #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "päivä" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "Yleiset" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "Käynnistä Variety kun tietokone käynnistyy" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "Vaihda taustakuva joka " #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "Vähimmäisväli on 5 sekuntia" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "Vaihda taustakuva käynnistäessä" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "Käytössä" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "Tyyppi" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "Sijainti" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "_Lisää..." #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "Kuvien, kansioiden tai kuvalähteiden lisääminen verkosta" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "Muokkaa valittua lähdettä" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "_Muokkaa..." #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "_Poista..." #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "Poista valitut kuvalähteet" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "_Käytä" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "Ota valitut lähteet käyttöön ja poista kaikki muut käytöstä" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "Suosikit" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "Kopioi suosikkikuvat kohteeseen " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "Suodattimet" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" "Käytä näitä suodattimia satunnaisesti näytettyihin taustakuviin (upean " "ImageMagickin ansiosta):" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "Lainaukset" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "Näytä satunnaisia viisaita teesejä työpöydällä" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "Tekstin väri: " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "Tekstin fontti: " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "Taustan väri: " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "Taustan peittävyys: " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " Läpinäkyvä" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "Läpinäkymätön" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "Tekstin varjostus" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "Ulkonäkö" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "Lainaukset alueen leveys: " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "Kapea " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "Laaja" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "Vaakasuunnassa: " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "Vasen " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "Pystysuunnassa: " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "Ylhäällä " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "Sijoittelu" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "Näytä lainauksia näistä lähteistä: " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" "Lisäosia" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" "Näytä vain nämä tunnisteet ja julkaisijat. Jätä tyhjäksi näyttääksesi " "satunnaisia lainauksia." #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "Esimerkki: funny, inspirational" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "Esimerkki: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "Tekijät: " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "Lähteet ja suodatus" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "Vaihda lainaus joka " #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "Vähimmäisväli on 10 sekuntia" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "Säännöllinen vaihto" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "Kello" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "" "Näytä työpöydällä iso digitaalinen kello, joka näyttää nykyisen ajan ja " "päivämäärän" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "Muokkaa kellon ulkonäköä clock_filter ominaisuutta Variety asetukset " "tiedostossa (~/.config/variety/variety.conf). Käytä ohjeena " "~/.config/variety/variety_latest_default.conf tiedostoa." #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "Kellon fontti: " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "Päivän fontti: " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "Nämä ei toimi? Lue täällä. " "Kuinka määrittää kelloa? Lue täällä." #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "Tehosteet" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "Kuvien diaesitys" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "Suosikkikuvat" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "Kuvat kaikista käytössä olevista kuvalähteistä" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "Kaikki kuvat Lataukset-kansiossa" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "Mukautettu kansio (sisältää kuvat myös alikansioissa) " #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "Diaesityksen kuvien järjestys " #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "Satunnainen" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "Nimi A - Z" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "Nimi Z - A" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "Päivämäärä, vanhin ensin" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "Päivämäärä, uusin ensin" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "Näyttö" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "Suorita näytössä" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "Ikkunatila diaesitykseen " #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "Koko näyttö" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "Työpöytä (pysyy muiden ikkunoiden taustalla)" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "Suurennettu ikkuna" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "Normaali ikkuna" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "Mekaniikka" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "Aikaväli kun kuva vaihtuu " #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr " sekuntia" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "Nopea häivytys " #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "Hidas häivytys" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "Vähemmän suurennosta" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "Enemmän suurennosta" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "Vähemmän panorointia" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "Enemmän panorointia" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "Palauta oletuksiin" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" "Tämän sivun muutokset tulevat voimaan käynnistämällä diaesitys uudelleen" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "Käynnistä diaesitys nyt" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "Diaesitys" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "Hae kansio" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "Tallenna manuaalisesti ladatut taustakuvat kohteeseen " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "Raahaa ja pudota" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "Varietyn kuvake toimii pudotuskohteena. Pudota kuvalle minkä tahansa verkko-osoite tai tiedosto ja se tallennetuu hakukansioon. Voit painaa Seuraava nähdäksesi sen työpöydälläsi.\n" "Kuvakkeen voit näyttää valitsemalla Tietoja tai Asetukset. Voit halutessasi lukita sen vetämistä ja pudottamista varten." #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "Leikepöydän valvonta" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Tarkkaile leikepöydää verkko-osoitteissa ja nouda niitä" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "Mutta hae vain, kun verkko-osoite on yksi näistä:" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "Manuaalinen lataus" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "Käytä mahdollisuuksien mukaan kuvia, jotka:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "Vaakasuuntaisia" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "Ovat kookkaita vähintään " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "% näytön tarkkuudesta" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "Väri" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "Ovat tummia tai vaaleita:" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Tumma" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Vaalea" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "Sisältää tämä värin: " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(Tulee voimaan ensimmäisen etsinnän jälkeen)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "Arvio" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "EXIF-arvio vähintään " #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "Väri ja koko" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "Kuvake" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "Kuvake:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "Vaalea" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "Tumma" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Käytä nykyistä taustakuvaa" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "Mukautettu kuva..." #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "Ei mitään" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "Valitse kuvake" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" "Kun kuvake on piilotettu, Varietya voidaan hallita komentoriviltä tai " "käynnistysvalikon pikaluettelosta. Suorita \"variety --help\" nähdäksesi " "kaikki käytettävissä olevat komennot." #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "Suosikkien toiminnot" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "Suosikkien toiminnot, jotka näytetään päävalikossa:" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "Kopioi Suosikkeihin" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "Molemmat Kopioi ja Siirrä" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "Riippuu kansiosta..." #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "Kirjautumisnäytön tuki" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "Varmista, että Varietyn asettamia taustakuvia käytetään kirjautumisnäytössä" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" "Tietosuojavaroitus: Taustakuvan näyttämiseksi LightDM tarvitsee " "lukuoikeudet kuvaan. Kun tämä vaihtoehto on käytössä, Variety kopioi " "taustakuvat julkiseen kansioon ja muuttaa niiden käyttöoikeuksia, jotta ne " "ovat kaikkien luettavissa. Oletuksena kansio on ~ /Kuvat jos kotikansiota ei" " ole salattu ja /usr/share/backgrounds jos se on. Käytä huolella monen " "käyttäjän järjestelmissä." #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "Kopioi taustakuvat tähän kansioon: " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "Palauta oletuksiin" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "Eikö vieläkään toimi?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Näyttää siltä, että kotikansiosi on salattu, joten sen sisällä olevan " "kansion käyttäminen ei toimi." #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "Sinulla ei ole kirjoitusoikeuksia tähän kansioon." #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "" "Käyttöoikeudet eivät salli LightDM:n lukea tiedostoja tästä kansiosta." #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "Variety voi muuttaa käyttöoikeuksia, mutta sinun on annettava pääkäyttäjän " "oikeudet." #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "Muokkaa" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "Vinkkejä" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "Viimeisimmät muutokset" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "Vieraile verkkosivustolla" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "Ilmoita virheestä tai pyydä ominaisuutta" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "Lähetä palautetta" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "Lahjoita Variety:lle" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "Lahjoita PayPal" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "Kehitän Varietya vapaa-ajallani, mikä tarkoittaa yleensä myöhäisiä tunteja lasteni nukkumaan menon jälkeen. Kaikki lahjoittamiasi summia arvostetaan. Se osoittaa minulle, että sinä - käyttäjät - arvostat Varietya ja motivoi minua jatkamaan aktiivista työskentelyä sen kanssa.\n" "\n" "Kiittäen,\n" "Peter Levi" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Tervetuloa ohjelmaan Variety!" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "Jatka" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" "Variety on automaattinen taustakuvan vaihtaja. Se kierrättää taustakuvia " "käyttämällä paikallisia kuvia tai kuvia, jotka on ladattu eri verkosta. Se " "toimii taustalla - voit hallita sitä napsauttamalla kuvaketta alavalikosta:" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" "Variety on avoimen lähdekoodin ohjelmisto, jonka on luonut Bulgarialainen " "kehittäjä Peter Levi. Jos pidät ohjelmasta, tee lahjoitus donate." #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "Varaa hieman aikaa ja tee omat asetukset seuraavissa näytöissä." variety-0.8.13/po/fr.po000066400000000000000000002122621475753071700147000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # Bruno Veilleux, 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:50+0000\n" "Last-Translator: Bruno Veilleux, 2024\n" "Language-Team: French (https://app.transifex.com/variety/teams/123174/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "Aucune image trouvée" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "Images de Flickr" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "Choisir un dossier" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "Annuler" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "OK" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "Récupération" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "Ceci n'est pas une image" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "Image trop petite, ignorée" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "Désolé, nous avons rencontré l'erreur %s..." #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "Cela signifie que le lien n'est plus valide" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "Échec de la récupération pour une raison inconnue" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "" "Pour obtenir plus d'information, veuillez exécuter Variety depuis le " "terminal avec l'option -v et retenter cette action" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "_Suivant" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "_Précédent" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "Fond d'écran actuel du bureau" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "Afficher l'origine" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "Copier vers _Favoris" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "Déplacer vers Favoris" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "Supprimer vers la _Corbeille" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "_Suivant, en ignorant la file d'attente" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Astuce : défiler avec la molette sur l'icône\n" "pour Suivant et Précédent" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "Pause sur l'image actuelle" #: ../variety/indicator.py:140 msgid "_Image" msgstr "_Image" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "D'où est-il ?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "Afficher sans effets" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "Recherche d'images Google" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "Donner une note EXIF" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "Sauvegarder dans les Favoris" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "Voir les Favoris..." #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "Copier dans le presse-papier" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "Chercher la citation sur Google" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "Chercher l'auteur sur Google" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "Préférences…" #: ../variety/indicator.py:250 msgid "Turn off" msgstr "Désactiver" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "_Citation" #: ../variety/indicator.py:262 msgid "_History" msgstr "_Historique" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "_Sélecteur de fond d'écran" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "_Téléchargements récents" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "Démarrer le diaporama" #: ../variety/indicator.py:300 msgid "About" msgstr "À propos" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "Faire un don" #: ../variety/indicator.py:308 msgid "Quit" msgstr "Quitter" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "Signal d'arrêt reçu. Arrêt en cours…" #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Variety est déjà démarré. Envoi de la commande à l'instance ouverte." #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr " (profil : {})" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Préférences de Variety" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "Toutes" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "Images" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "Ajouter des images de fond d’écran individuelles" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "Dossiers" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" "Recherche récursive menée sur jusqu’à 10 000 images, affichées aléatoirement" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "Albums en vue séquentielle (triés par nom de fichier)" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" "Résultats de recherche d’images récursive affichés séquentiellement (par nom" " de fichier)" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "Albums en vue séquentielle (triés par date)" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" "Résultats de recherche d’images récursive affichés séquentiellement (par " "date du fichier)" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "Récupérer des images de Flickr" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "Supprimer la source, garder les fichiers" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "Supprimer les sources, garder les fichiers" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "Supprimer la source et supprimer les fichiers téléchargés" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "Supprimer les sources et supprimer les fichiers téléchargés" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" "Utiliser cette source nécessite que le changement de fond d’écran soit " "activé à intervalles de %d minutes ou moins. Vos paramètres ont été modifiés" " automatiquement." #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "Ajouter des images" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "Ajouter" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Ajouter des dossiers - Ajouter seulement les dossiers racines, les sous-" "dossiers seront automatiquement pris en compte." #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" "Ajouter des albums séquentiels (triés par nom de fichier). Les sous-dossiers" " seront automatiquement pris en compte." #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "" "Ajouter des albums séquentiels (triés par date). Les sous-dossiers seront " "automatiquement pris en compte." #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "Modifier..." #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "Ouvrir le dossier" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "Afficher l'image" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "Pas de droits d'écriture" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "Impossible de régler les permissions" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Vous pouvez essayer d'exécuter manuellement cette commande :\n" "sudo chmod %s \"%s\"" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "Aucun greffon de citations" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "Il n'y a pas de greffon de citations installé" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "Pas de greffon de citations approprié" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "" "Vous n'avez pas de greffon de citations capable de chercher par mots-clés et" " auteurs" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "Impossible de récupérer des citations" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "" "Les services de citations rencontrent peut-être des problèmes, nous allons " "continuer d'essayer" #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "Impossible de trouver des citations" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "Vous cherchez peut-être quelque chose de trop précis ?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "Conserver l'original" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "Niveaux de gris" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "Flou intense" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "Flou léger" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "Peinture à l’huile" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "Pointillisme" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "Pixéliser" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "Le dossier Favoris" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "Le dossier récupéré" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "" "Recommandé par Variety. S'adapte à vos goûts lorsque vous marquez des images" " comme favorites ou les envoyez à la corbeille." #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" "Derniers favoris par les autres utilisateurs de Variety. [Peut contenir des " "images NSFW]" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Fonds d'écran aléatoires provenant de Desktoppr.co" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "Image astronomique du jour de la NASA" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "Photo du jour de Bing" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "Photos haute résolution de Unsplash.com" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" "Vous pouvez passer au fond d'écran précédent/suivant en utilisant la molette" " de la souris sur l'icône de l'indicateur." #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" "Si vous voulez exécuter des commandes personnalisées à chaque changement de " "fond d’écran ou si vous utilisez un autre environnement de bureau, veuillez " "modifier les scripts dans le dossier {PROFILE_PATH}scripts. Celui-ci " "contient des exemples pour différents environnements de bureau." #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" "La ligne de commande vous permet de contrôler Variety et de définir des " "raccourcis clavier pour les opérations les plus courantes. Lancez « variety " "--help » pour voir les commandes disponibles." #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" "Vous pouvez glisser des liens vers des images ou des fichiers sur l'icône du" " lanceur afin de les télécharger et de vous en servir comme fonds d'écran. " "Pour un téléchargement plus rapide depuis un site spécifique, vous pouvez " "aussi utiliser le gestionnaire de presse-papiers (voir l'onglet " "« Téléchargement manuel »)." #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" "Appliquer un filtre de flou intense est un excellent moyen d'obtenir des " "fonds d'écran d'apparence abstraits, discrets, mais colorés, dans la même " "veine que le fond d'écran par défaut d'Ubuntu." #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" "Vous pouvez facilement ajouter vos propres filtres personnalisés : ouvrez " "{PROFILE_PATH}variety.conf dans un éditeur et utilisez les filtres en place " "pour vous guider. Chaque filtre est une simple ligne d’options à transmettre" " à la commande « convert » d’ImageMagick." #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" "Quand vous choisissez une source d'images, ses images sont affichées dans " "une fenêtre en bas de l'écran. Cliquez sur une image pour la choisir comme " "fond d'écran. Effectuez un clic droit pour fermer la fenêtre, modifier son " "apparence ou réaliser des opérations sur le fichier. Vous pouvez " "sélectionner plusieurs sources d'images pour toutes les visualiser sous la " "forme d'une vue en vignettes « fusionnées ». Gardez à l'esprit que la vue en" " vignettes est limitée à quelques centaines d'images choisies de façon " "aléatoire." #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" "Pour activer les notifications de bureau au changement de fond d’écran, " "décommentez les deux lignes à la fin de {PROFILE_PATH}scripts/set_wallpaper." #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" "Des thèmes peuvent être appliqués à l'icône d'indicateur de Variety : si " "vous choisissez le thème « Light » pour l'icône, Variety va tout d'abord " "vérifier si le thème GTK actuel possède une icône nommée « variety-" "indicator » et l'utilisera en lieu et place de l'icône « light » fournie." #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" "Par défaut, quand vous choisissez d’enregistrer une citation dans vos " "Favoris, elle est ajoutée au fichier {PROFILE_PATH}favorite_quotes.txt. Ce " "fichier est compatible avec la source de citations « Fichiers locaux » de " "Variety. Pour l’utiliser, copiez le fichier vers " "~/.config/variety/pluginconfig/quotes/ et activez la source Fichiers locaux." " Ce fichier est aussi compatible avec l’utilitaire « fortune » de Unix." #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "Bas" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Haut" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Gauche" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "Droite" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "Position" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "Taille" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "Nombre maximal d’images affichées" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "Montrer le dossier parent" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "Récupéré : montrer l'origine" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "Vue à %s" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "Déplacer vers _Favoris" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "Fermer" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "Impossible de donner une note EXIF" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "Non évalué" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "Refusé" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "Historique de Variety" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Téléchargements récents de Variety" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Images de Variety" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" "%prog [options] [fichier ou adresses URL]\n" "\n" "Transmettre des fichiers locaux les ajoutera à la file d’attente de Variety.\n" "Transmettre des adresses URL distantes fera en sorte que Variety les télécharge dans le dossier Fetched (Récupérés) et les ajoute à la file d’attente.\n" "\n" "Pour définir un fond d’écran précis : %prog --set /dossier/local/image.jpg\n" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" "Nom de profil ou chemin d’accès complet au dossier de configuration que " "Variety doit utiliser. S’il n’est pas précisé, le chemin ~/.config/variety/ " "est utilisé. Si un nom est fourni au lieu d’un chemin d’accès, le dossier de" " profil sera ~/.config/variety-profiles/. À utiliser uniquement au " "démarrage de Variety; modifier le profil nécessite un redémarrage. Plusieurs" " instances de Variety peuvent être lancées à partir de profils multiples, " "chacun ayant sa propre configuration. Cela peut être utile notamment pour " "contrôler plusieurs écrans ou espaces de travail dans des environnements de " "bureau comme XFCE. Pour transmettre des commandes à une instance active, " "transmettez à chaque commande le même argument --profile qu’au démarrage." #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" "Afficher les messages de journalisation (-vv à -vvvvv profilent différents " "éléments de Variety avec de plus en plus de détail)" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "Quitter l'instance en cours" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" "Afficher l'emplacement du fond d'écran actuel. Utilisé uniquement lorsque " "l'application est déjà en fonctionnement." #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" "Définir le fichier indiqué comme fond d’écran; chemin d’accès absolu requis" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "Montrer le fond d'écran suivant" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "Montrer le fond d'écran précédent" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "Montrer le fond d'écran suivant, en ignorant la file d'attente" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Déplacer le fond d'écran actuel vers la Corbeille. Utilisé uniquement " "lorsque l'application est déjà en fonctionnement." #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Copier le fond d'écran actuel vers Favoris. Utilisé uniquement lorsque " "l'application est déjà en fonctionnement." #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Déplacer le fond d'écran actuel vers Favoris. Utilisé uniquement lorsque " "l'application est déjà en fonctionnement." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "Pause sur l'image actuelle" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "Reprendre les changements d'image réguliers" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "Basculer entre les modes Pause/Reprendre" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "Basculer l’option « Afficher sans effets » pour l’image actuelle" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "Montrer la citation suivante" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "Montrer la citation précédente" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "Montrer la citation suivante, en ignorant la file d'attente" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "Basculer entre les modes Pause/Reprendre pour les citations" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "Enregistrer la citation actuelle dans les Favoris" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "Afficher/masquer l'historique" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "Afficher/masquer les téléchargements récents" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "Afficher la fenêtre Préférences" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Afficher le sélécteur de fond d'écran manuel (une barre de miniatures " "utilisant les sources d'images actives)" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" "Choisit et applique une option. Le nom des options est le même que celui " "utilisé dans le fichier de configuration de Variety " "~/.config/variety/variety.conf. Plusieurs options peuvent être définies en " "une seule commande. Exemple : « variety --set-option icon Dark --set-option " "clock_enabled True ». À UTILISER AVEC PRÉCAUTION : vous êtes en train de " "changer directement le fichier des paramètres dans un mode non protégé." #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "" "les options --next, --fast-forward et --previous s'excluent mutuellement" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "les options --trash et --favorite s'excluent mutuellement" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "les options --pause et --resume s'excluent mutuellement" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "les options --quotes-next, --quotes-fast-forward et --quotes-previous " "s'excluent mutuellement" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "Déjà dans Favoris" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "Source : %s" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "Inconnu" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "Auteur : %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "Reprendre les changements réguliers" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "Filtrage trop strict ?" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "" "Variety ne trouve pas assez d'images correspondant à vos critères de " "filtrage" #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "" "Veuillez ajouter plus de sources d'images ou attendre des téléchargements" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "Veuillez ajouter plus de sources d'images" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "Plus d'autre fond d'écran" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "Le fond d'écran actuel ne se trouve pas dans les sources d'images" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "" "Déplacement vers %s impossible. Vous n'avez probablement pas les droits " "nécessaires pour déplacer ce fichier." #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" "Copie vers %s impossible. Vous n'avez probablement pas les droits " "nécessaires pour copier ce fichier." #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "Suppression impossible" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "" "Vous n'avez pas les droits nécessaires pour supprimer %s vers la Corbeille." #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" "Échec de la mise à la corbeille. Consultez variety.log pour plus de détails." #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "" "Je vais ouvrir le fichier de configuration avec un éditeur de texte et " "appliquer les changements une fois que vous aurez enregistré et fermé cet " "éditeur." #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "Ajouté à la file d'attente" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "Cliquez sur Suivant pour le voir" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "Récupéré" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "Type de source non pris en charge" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "Utilisez-vous la version la plus récente de Variety ?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "Nouvelle source d'images ajoutée" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "La source d'image existe déjà, maintenant activée" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "Récupérée et appliquée" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "Ça fonctionne !" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "Les liens Variety fonctionnent. Super !" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "Commande non prise en charge" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "Impossible de traiter l'URL variety:// demandée" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "Exécuter en activant les rapports pour voir les détails" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "Variety : Nouvelle entrée de bureau" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" "Nous avons créé une nouvelle entrée de bureau dans " "~/.local/share/applications pour exécuter Variety avec le profil « {} ». " "Vous la trouverez dans le lanceur d’applications." #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "Variety : Entrée de bureau de lancement automatique créée" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" "Nous avons créé une nouvelle entrée de bureau dans ~/.config/autostart. " "Variety devrait se lancer automatiquement à votre prochaine ouverture de " "session." #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "Impossible de créer l'entrée de démarrage automatique" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "Une erreur s'est produite lors de la création de l'option de démarrage automatique.\n" "Veuillez lancer le programme depuis un terminal avec l'option -v et essayer de nouveau." #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "Aucune image" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "Il n'y a aucune image dans les dossiers de diaporama" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "À propos de Variety" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" "Copyright (c) 2012-2020, Peter Levi, James Lu et contributeurs de Variety" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "" "Une application automatique pour changer, gérer et télécharger des fonds " "d'écran." #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "https://github.com/varietywalls/variety" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" "# Copyright (c) 2012-2020, Peter Levi, James Lu et contributeurs de Variety\n" "# Ce programme est un logiciel libre; vous pouvez le redistribuer et le\n" "# modifier conformément aux conditions de la Licence publique générale GNU\n" "# version 3, telle que publiée par la Free Software Foundation.\n" "#\n" "# Ce programme est distribué dans l’espoir qu’il soit utile, mais SANS\n" "# AUCUNE GARANTIE, ni même les garanties implicites de QUALITÉ MARCHANDE,\n" "# de QUALITÉ SUFFISANTE ou d’ADÉQUATION À UN USAGE PARTICULIER.\n" "# Consultez la Licence publique générale GNU pour plus de détails.\n" "#\n" "# Vous devriez avoir reçu une copie de la Licence publique générale GNU\n" "# avec ce programme. Sinon, consultez .\n" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "Veuillez patienter un moment pendant la recherche d’images" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr " " #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Variety - ajouter Flickr comme source d'images" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" "Veuillez spécifier les critères de recherche Flickr. Les photos qui coïncident avec tous " "les critères choisis seront téléchargées. Laissez vides les critères dont " "vous n'avez pas besoin." #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "Tags : " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "Une lise de tags séparés par des virgules. Une photo doit tous les contenir afin de coïncider.\n" "Exemple : jaune,voiture" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "Utilisateur : " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "Veuillez écrire l'URL du diaporama de l'utilisateur ou de l'une de ses photos.\n" "Exemple : http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "Groupe : " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "Veuillez écrire l'URL du groupe.\n" "Exemple : http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "Texte :" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "Recherche par texte libre dans les titres, descriptions ou balises de photos. Exclure des termes en les faisant précéder d'un tiret (« - »).\n" "Exemple : pomme -tarte" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "Juste un moment pour vérifier cette recherche" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Copier vers Favoris vs Déplacer vers Favoris" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "Restaurer les valeurs par défaut" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "" "Choisissez si vous préférez « Copier vers Favoris » ou « Déplacer vers " "Favoris » dans le menu en fonction de l'emplacement de l'image :" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "Veuillez inscrire un élément par ligne, chaque élément sous la forme :, où Dossier peut être Downloaded (Téléchargés), Fetched (Récupérés), Others (Autres) ou un chemin vers un dossier spécifique.\n" "L'ordre est important. Lorsqu'une image est affichée, le premier dossier dans cette liste qui contient l'image déterminera quelles opérations seront montrées dans le menu de Variety. « Others » correspond à n'importe quel fichier et devrait être en dernier dans la liste.\n" "\n" "Exemple :\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "secondes" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "minutes" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "heures" #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "jours" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "Général" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "Lancer Variety au démarrage" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "Changer le fond d'écran toutes les " #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "L'intervalle minimal est de 5 secondes" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "Changer le fond d'écran au démarrage" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "Activé" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "Type" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "Emplacement" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "_Ajouter…" #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "Ajouter des images, des dossiers ou des sources d'images en ligne" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "_Ouvrir le dossier" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "Modifier la source sélectionnée" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "_Modifier…" #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "_Supprimer…" #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "Supprimer les sources d'images sélectionnées" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "_Utiliser" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "Activer les sources sélectionnées et désactiver toutes les autres" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "Favoris" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "Copier les fonds d'écran favoris vers " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "Filtres" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" "Appliquer aléatoirement ces filtres aux fonds d'écran affichés (grâce au " "super logiciel ImageMagick) :" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "Citations" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "Afficher aléatoirement de sages citations sur le bureau" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "Couleur du texte : " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "Police du texte : " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "Couleur du fond : " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "Opacité du fond : " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " Transparent" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "Opaque" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "Dessiner une ombre pour le texte" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "Apparence" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "Largeur de la surface des citations : " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "Étroite " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "Large" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "Position horizontale : " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "Gauche " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "Position verticale : " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "Haut " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "Positionnement" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "Afficher des citations de ces sources : " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" "Plus de " "greffons" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" "Afficher seulement ces tags et auteurs. Laisser vide pour afficher des " "citations aléatoires." #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "Exemple : drôle, inspirant" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "Exemple : Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "Auteurs : " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "Sources et filtrage" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "Changer la citation toutes les " #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "L'intervalle minimal est de 10 secondes" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "Changement régulier" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "Horloge" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "" "Afficher une belle grosse horloge numérique sur le bureau affichant la date " "et l'heure actuelles" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "Pour configurer l'apparence de l'horloge, modifier la propriété clock_filter" " dans le fichier de configuration de Variety " "(~/.config/variety/variety.conf). Utilisez les commentaires de " "~/.config/variety/variety_latest_default.conf comme guides." #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "Police de l'horloge : " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "Police de la date : " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "Cela ne fonctionne pas ? Lire ici (en " "anglais). Comment configurer encore plus l'horloge ? Lire " "ici (en anglais)." #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "Effets" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "Images de diaporama" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "Images favorites" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "Images dans toutes les sources activées" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "Toutes les images du dossier Téléchargements" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "Dossier personnalisé (comprend les images des sous-dossiers) " #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "Ordre des images du diaporama " #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "Aléatoire" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "Par nom, de A à Z" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "Par nom, de Z à A" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "Par date, en commençant par la plus vieille" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "Par date, en commençant par la plus récente" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "Écran" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "Exécuter sur le moniteur" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "Mode de fenêtre du diaporama " #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "Plein écran" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "Bureau (demeure sous les autres fenêtres)" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "Fenêtre maximisée" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "Fenêtre normale" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "Dynamique" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "Intervalle entre les changements d'image " #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr " secondes" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "Fondu rapide " #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "Fondu lent" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "Moins de zoom" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "Plus de zoom" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "Moins de défilement" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "Plus de défilement" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "Rétablir les valeurs par défaut" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" "Les changements apportés ici seront appliqués au prochain lancement du " "diaporama" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "Démarrer le diaporama maintenant" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "Diaporama" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "Dossier de téléchargement" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "Sauvegarder les fonds d'écran téléchargés manuellement vers " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "Glisser-déposer" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "L'icône de Variety dans le lanceur sert de cible du dépôt. Déposez dessus n'importe quel fichier ou URL d'image et elle sera sauvegardée dans votre dossier de téléchargement. Vous pouvez ensuite appuyer sur Suivant pour la voir sur votre bureau.\n" "Pour afficher l'icône dans le lanceur, choisissez À propos ou Préférences. Vous pouvez choisir de la verrouiller pour faciliter l'accès au glisser-déposer." #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "Gestionnaire de presse-papiers" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Surveiller le presse-papiers pour récupérer les URL d'image" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "" "Mais récupérer uniquement quand l'hôte de l'URL fait partie de cette liste :" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "Téléchargement manuel" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "Quand cela est possible, utiliser des images qui :" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "Ont une orientation paysage" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "Ont une taille d'au moins " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "% de la résolution de l'écran" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "Couleur" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "Sont sombres ou claires :" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Sombres" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Claires" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "Contiennent cette couleur : " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(activé après quelques recherches préliminaires)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "Évaluation" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "Ont une note EXIF d'au moins " #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "Couleur et taille" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "Icône de l'indicateur" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "Icône de l'indicateur :" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "Claire" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "Sombre" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "Numéro 1" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "Numéro 2" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "Numéro 3" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "Numéro 4" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Utiliser le fond d'écran actuel" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "Image personnalisée…" #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "Aucune" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "Sélectionner une icône" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" "Quand l'icône est masquée, Variety peut être contrôlé en ligne de commande " "ou depuis la liste d'accès rapide du lanceur. Exécuter « variety --help » " "afin de voir toutes les commandes accessibles." #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "Opérations sur Favoris" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "Opérations sur Favoris à proposer dans le menu principal :" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "Copier vers Favoris" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "Copier et Déplacer" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "Selon le dossier…" #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "Prise en charge de l'écran de connexion" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "S'assurer que les fonds d'écran définis par Variety seront utilisés par " "l'écran de connexion" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" "Avertissement sur la vie privée : Pour afficher votre fond d'écran, " "LightDM a besoin des droits de lecture sur l'image. Avec cette option " "activée, Variety copiera les fonds d'écran dans un dossier public et " "changera leurs permissions pour être lisibles par tous. Par défaut, le " "dossier est ~/Images si votre dossier personnel n'est pas chiffré, et " "/usr/share/backgrounds s'il l'est. À utiliser avec précaution sur les " "systèmes multi-utilisateurs." #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "Copier les fichiers d'images de fond d'écran vers ce dossier : " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "Rétablir les valeurs par défaut" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "Cela ne fonctionne toujours pas ?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Il semble que votre dossier personnel soit chiffré, utiliser des dossiers à " "l'intérieur ne fonctionnera pas." #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "Vous n'avez pas les permissions d'écriture sur ce dossier." #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "" "Les permissions ne permettent pas à LightDM de lire les fichiers de ce " "dossier." #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "Variety peut ajuster les permissions, mais vous devrez fournir les " "privilèges de super-utilisateur." #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "Personnaliser" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "Trucs et astuces" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "Modifications récentes" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "Visiter le site Web" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "Signaler un bogue ou demander une fonctionnalité" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "Envoyer des commentaires" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "Faire un don à Variety" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "Faire un don via PayPal" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "Je développe Variety durant mon temps libre, ce qui signifie habituellement des heures tardives après que mes enfants soient allés au lit. Toute somme que vous donnerez sera appréciée. Cela me montrera que Variety a de la valeur pour vous, les utilisateurs, et me motivera à continuer de travailler activement dessus.\n" "\n" "Merci,\n" "Peter Levi" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "" "Pour faire un don en Bitcoin, veuillez l’envoyer au portefeuille suivant :" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "Variety - Avis de confidentialité" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "Refuser et quitter" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "Accepter et continuer" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "Avis de confidentialité" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" "Avant de commencer, voici quelques informations dont vous devez prendre connaissance et que vous devez accepter :\n" "\n" "Variety est une application à code source libre, fournie telle quelle, sans aucune garantie. En l’utilisant, vous acceptez les conditions de la licence GNU GPLv3 en vertu de laquelle elle est distribuée.\n" "\n" "Variety est une application connectée à Internet. Avec les réglages par défaut, Variety télécharge des images depuis Internet. Les serveurs Web qui fournissent ces images peuvent obtenir des informations au sujet de votre appareil, dont votre adresse IP. Variety ne transmet aucun renseignement personnel. En utilisant Variety, vous acceptez qu’elle utilise votre connexion à Internet. Notez que toutes les sources d’images en ligne peuvent être désactivées.\n" "\n" "Variety récupère et applique des paramètres de limitation du débit de transfert définies par l’équipe de développement. Cela peut influencer la vitesse de téléchargement de nouvelles images, mais aide aussi à nous assurer que Variety fonctionne peu importe le nombre d’utilisateurs. Ces paramètres seront téléchargés à partir de , où nous les hébergeons.\n" "\n" "Certaines sources d’images exigent que nous examinions des renseignements supplémentaires si elles sont activées. Par exemple, les conditions générales d’Unsplash exigent que nous surveillions et signalions le téléchargement et la consultation d’images d’Unsplash par les utilisateurs." #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Bienvenue sur Variety !" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "Continuer" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" "Variety est un changeur de fond d'écran automatique. Il modifie votre fond " "d'écran régulièrement en utilisant des images locales ou des images " "téléchargées à partir de diverses sources en ligne. Il s'exécute " "discrètement à l'arrière-plan; pour le contrôler, cliquez sur cette icône " "dans la barre d'état :" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" "Variety est un logiciel libre créé par Peter Levi, un développeur de " "logiciels bulgare. Si vous aimez ce logiciel, merci de faire un don." #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" "Maintenant, veuillez prendre un moment pour définir vos préférences dans les" " fenêtres qui suivent." variety-0.8.13/po/ja.po000066400000000000000000002002511475753071700146560ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:05+0000\n" "Last-Translator: James Lu , 2021\n" "Language-Team: Japanese (https://www.transifex.com/variety/teams/123174/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "画像が見つかりません" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "Flickr の画像" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "フォルダーを選択" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "キャンセル" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "OK" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "取得中" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "画像ではありません" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "画像が小さすぎるため無視します" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "残念ですが %s エラーです..." #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "このリンクは、もはや無効です" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "画像の取り込みに失敗しました" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "詳しい情報を得るには端末で -v オプションをつけて Variety を起動して再試行してください" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "次へ(_N)" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "前へ(_P)" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "現在のデスクトップの壁紙" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "取得元を表示" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "お気に入りにコピー(_F)" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "お気に入りに移動" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "ゴミ箱に移動(_T)" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "履歴を前方にスキップ(_N)" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "ヒント: アイコン上でマウスホイールを\n" "スクロールすると壁紙を変更します" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "現在の状態で一時停止" #: ../variety/indicator.py:140 msgid "_Image" msgstr "画像(_I)" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "画像がある場所は?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "エフェクトなしで表示" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "Google 画像検索" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "EXIF の評価をセット" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "お気に入りに保存" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "お気に入りを表示..." #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "クリップボードへコピー" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "Google で名言を検索" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "Google で作者を検索" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "設定..." #: ../variety/indicator.py:250 msgid "Turn off" msgstr "非表示" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "名言(_Q)" #: ../variety/indicator.py:262 msgid "_History" msgstr "履歴(_H)" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "壁紙選択(_W)" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "最近のダウンロード(_D)" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "スライドショーを開始" #: ../variety/indicator.py:300 msgid "About" msgstr "情報" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "寄付" #: ../variety/indicator.py:308 msgid "Quit" msgstr "終了" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "終了シグナルを受け取りました。終了します..." #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Variety はすでに実行しています。実行中のインスタンスにコマンドを送ります。" #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr "" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Variety の設定" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "すべて" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "画像" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "壁紙画像を個別に追加する" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "フォルダー" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "10000 個までの画像を再帰的に確認してランダム表示する" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "アルバム順 (ファイル名順)" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "画像を再帰的に確認してファイル名順に表示する" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "アルバム順 (日付順)" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "画像を再帰的に確認して日付順に表示する" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "Flickr から画像を取り込む" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "ファイルを残して場所を削除" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "ファイルを残して場所を削除" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "場所とダウンロードした画像も削除" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "場所とダウンロードした画像も削除" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "このソースを使用するには、壁紙の更新間隔を %d 分以下にして有効にする必要があります。設定を自動調整しました。" #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "画像を追加" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "追加" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "フォルダーを追加 - サブフォルダーも調べます" #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "アルバムをファイル名順に追加します。サブフォルダーを再帰的に検索します。" #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "アルバムを日付順に追加します。サブフォルダーを再帰的に検索します。" #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "編集..." #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "フォルダーを開く" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "画像を表示" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "書き込み権限がありません" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "パーミッションを変更できません" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "名言プラグインがありません" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "名言プラグインがインストールされていません" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "適切な名言プラグインがありません" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "キーワードと作者で検索できる名言プラグインがありません" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "名言を取り込めません" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "取り込みを続けますがおそらく名言サービスがダウンしています" #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "名言が見つかりません" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "見つけにくい指定になっていませんか?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "元の画像を維持" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "モノクロ" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "強いブラー" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "弱いブラー" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "油絵" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "点描画" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "モザイク" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "お気に入りフォルダー" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "取得済みフォルダー" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "Variety のお勧め。お気に入りとしてマークした画像などに合わせて変化します。" #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "他の Variety ユーザーによる最新のお気に入り (NSFW 画像を含む可能性があります)" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Desktoppr.co の壁紙をランダムに" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "NASA の今日の天文写真" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "Bing の今日の写真" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "Unsplash.com の高解像度写真" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "インジケーターアイコンの上でマウスホイールをスクロールすると壁紙を変更できます。" #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" "壁紙を変更するたびにカスタムコマンドを実行したい場合や、代替デスクトップ環境を使用している場合は、{PROFILE_PATH}scripts " "以下にあるスクリプトを編集してください。複数のデスクトップ環境でのサンプル例があります。" #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "フィルターの「強いブラー」を適用すると、カラフルな壁紙が抽象的で控えめな、Ubuntu のデフォルトの壁紙のような感じになります。" #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" "自分で簡単にカスタムフィルターを追加できます。{PROFILE_PATH}variety.conf " "をエディターで開き、既存のフィルターを参考にして追加してください。各フィルターは ImageMagick の convert コマンドのオプションです。" #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" "壁紙変更時のデスクトップ通知を有効にしたい場合は、{PROFILE_PATH}scripts/set_wallpaper の下部 2 " "行のコメントアウトを解除してください。" #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" "名言をお気に入りに保存することを選択した場合、デフォルトでは {PROFILE_PATH}favorite_quotes.txt " "に保存します。このファイルは Variety " "のローカル名言ソースファイルと互換性があります。ファイルを使用したい場合は、~/.config/variety/pluginconfig/quotes/" " にコピーし、名言のソースで「Local text files」を有効にしてください。このファイルは Unix fortune " "ユーティリティとも互換性があります。" #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "下" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "上" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "左" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "右" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "サムネイルの位置" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "画像のサイズ" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "表示する画像の最大数" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "画像のあるフォルダーを表示" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "取得済み: 元画像を表示" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "壁紙の場所: %s" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "お気に入りに移動(_F)" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "閉じる" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "EXIF の評価をセットできませんでした" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "評価なし" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "拒否" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "Variety 履歴" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Variety 最近のダウンロード" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Variety 画像" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "ログメッセージを表示 (-vv から -vvvvv まで増やすと Variety のより詳細な情報を表示します)" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "実行中のインスタンスを終了" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "現在の壁紙の場所を表示。起動中のみ使用可能。" #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "指定画像を壁紙にする (絶対パスが必要)" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "次の壁紙を表示" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "前の壁紙を表示" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "履歴を前方にスキップして壁紙を表示" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "現在の壁紙をゴミ箱に移動。起動中のみ使用可能。" #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "現在の壁紙をお気に入りにコピー。起動中のみ使用可能。" #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "現在の壁紙をお気に入りに移動。起動中のみ使用可能。" #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "現在の壁紙で停止" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "壁紙の自動変更を再開" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "一時停止/再開を切り替え" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "次の名言を表示" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "前の名言を表示" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "履歴を前方にスキップして名言を表示" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "名言の一時停止/再開を切り替え" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "現在表示されている名言をお気に入りに保存" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "履歴表示を切り替え" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "最近のダウンロードの表示を切り替え" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "設定ダイアログを表示" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "有効な画像を手動で壁紙に選択できるサムネイルバーを表示" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" "オプションを指定して適用。使用可能なオプションは Variety の設定ファイル ~/.config/variety/variety.conf " "にあります。一度に複数のオプションを指定できます。例: 'variety --set-option icon Dark --set-option " "clock_enabled True'。使用上の注意: 設定ファイルを直接編集することはお勧めできません。" #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "オプション --next/--fast-forward と --previous は同時使用できません" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "オプション --trash と --favorite は同時使用できません" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "オプション --pause と --resume は同時使用できません" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "オプション --quotes-next/--quotes-fast-forward と --quotes-previous は同時使用できません" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "お気に入りに入っています" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "不明" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "作者: %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "自動更新再開" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "フィルターが厳しいようです" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "基準に合う画像が少なすぎます" #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "画像の場所をさらに追加するかダウンロードされるまでしばらくお待ちください" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "さらに画像の場所を追加して下さい" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "壁紙が少なすぎます" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "現在の壁紙は画像の場所にありません" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "%s に移動する権限がありません。" #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "%s にコピーする権限がありません。" #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "削除できません" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "%s をゴミ箱に移動する権限がありません。" #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "ゴミ箱への削除に失敗したため、variety.log で詳細を確認してください。" #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "エディターで設定ファイルを開きます。保存後に変更が適用されます。" #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "キューに追加しました" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "次へを押してください" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "取り込みました" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "サポートしていない種類のソースです" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "Variety の最新バージョンを使用していますか?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "新しい画像ソースを追加しました" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "画像ソースはすでに存在するため有効にします" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "取得され適用されました" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "動作しています!" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "(`・ω・´)、Variety リンクが動作しました。グゥレイトォ!!" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "サポートしていないコマンドです" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "与えられた variety:// URL を処理できませんでした" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "ログを有効にして実行すると詳細を確認できます" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "Variety: 新しいデスクトップエントリー" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "Variety: 自動起動デスクトップエントリーを作成しました" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "自動起動エントリーを作成できませんでした" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "自動起動設定中にエラーが発生しました\n" "端末で -v オプションをつけて起動して再試行してください" #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "画像がありません" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "スライドショーフォルダーに画像がありません" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "Variety について" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "壁紙のダウンロードと管理ができる壁紙自動チェンジャー" #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://peterlevi.com/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "画像を確認中です、しばらくお待ちください" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr "" #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Variety - Flickr を画像の場所に追加" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" "指定した条件に合致したすべての写真を Flickr " "からダウンロードします。指定しない場合は空にしてください。" #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "タグ: " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "タグをすべて含む写真。タグはコンマで区切ってください。\n" "例: yellow,car" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "ユーザー: " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "ユーザーの写真がある URL を入れてください。\n" "例: http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "グループ: " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "グループ URL を入れてください。\n" "例: http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "文字:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "写真のタイトル、説明、タグを検索します。検索から除外する場合は - を使用してください。\n" "例: apple -pie" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "しばらくお待ち下さい" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "お気に入り動作メニューの設定" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "デフォルトに戻す" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "画像の場所よって「お気に入りにコピー」「お気に入りに移動」のどちらをメニューに表示するか選択してください:" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "一行に一つのエントリーを : の形式で記述してください。\n" "Folder には Downloaded、Fetched、Others、またはフォルダーパスを指定できます。\n" "順序は重要です。\n" "Variety は画像を表示するとリストを上から評価し、どの項目をメニューに表示するか決定します。\n" "Others はこのリストの最後に記述してください。\n" "\n" "例:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "秒" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "分" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "時間" #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "日" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "一般" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "Variety を自動的に起動" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "壁紙を次の間隔で更新 " #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "最短の間隔は5秒です" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "起動時に壁紙を変更" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "有効" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "種類" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "場所" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "追加(_A)..." #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "画像を追加します (フォルダーまたはオンラインの画像ソース)" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "フォルダーを開く(_O)" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "選択したソースを編集します" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "編集(_E)..." #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "削除(_R)..." #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "選択した画像ソースを削除します" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "使用(_U)" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "選択したソースを有効にして他を無効にします" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "お気に入りの壁紙" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "お気に入りのコピー先 " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "フィルター" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "表示された壁紙に対してこれらのフィルターをランダムに適用します (素晴らしい ImageMagic に感謝):" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "名言" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "名言をランダムに表示" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "文字の色: " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "文字のフォント: " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "背景色: " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "背景色の透過度: " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " 透明" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "不透明" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "文字に影をつける" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "外観" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "表示エリアの幅: " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "狭い " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "広い" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "水平位置: " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "左 " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "垂直位置: " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "上 " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "表示場所" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "名言のソース: " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" "他のプラグイン" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "これらのタグと作者を表示します。空の場合はランダムに選びます。" #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "例: funny, inspirational" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "例: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "作者: " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "名言のソースとフィルター" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "名言の更新間隔 " #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "最短の間隔は10秒です" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "定期的に更新" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "時計" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "素敵な大きいデジタル時計で現在の時刻と日付をデスクトップに表示" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "時計の外観を設定するには、Variety の設定ファイル (~/.config/variety/variety.conf) の clock_filter" " プロパティを編集します。~/.config/variety/variety_latest_default.conf 内のコメントを参考にしてください。" #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "時計のフォント: " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "日付のフォント: " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "動作しない場合はこちらを、時計の設定に関してはこちらをご覧ください。" #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "エフェクト" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "スライドショー用の画像" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "お気に入りの画像" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "有効な全画像ソースの画像" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "ダウンロードフォルダー内のすべての画像" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "カスタムフォルダー (サブフォルダー内の画像も含む) " #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "スライドショーでの画像の順序 " #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "ランダム" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "名前順 (A から Z)" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "名前順 (Z から A)" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "日付順 (古い方から)" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "日付順 (新しい方から)" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "スクリーン" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "実行するモニター" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "スライドショーのウィンドウモード " #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "フルスクリーン" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "デスクトップ (他のウィンドウの背後)" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "最大化されたウィンドウ" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "通常のウィンドウ" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "ダイナミクス" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "画像の変更間隔 " #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr " 秒" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "デフォルトに戻す" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "このページの変更はスライドショーの再スタート時に有効になります" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "スライドショーを今すぐ開始" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "スライドショー" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "取り込むフォルダー" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "下記操作での壁紙の保存先 " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "ドラッグ&ドロップ" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "ランチャーに表示された Variety のアイコンがドロップ対象です。任意の画像 URL " "またはファイルをドロップすると、上で設定したフォルダーに保存されます。「次へ」を押すことでデスクトップに表示できます。ランチャーにアイコンを表示するには「情報」または「設定」のウィンドウを開く必要があります。アイコンを常に表示したい場合はランチャーに登録してください。" #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "クリップボード監視" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "クリップボードを監視して画像の URL を取り込む" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "取り込む URL を指定:" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "手動ダウンロード" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "使用する画像:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "横向きの画像" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "最低でも画面解像度の " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "% 以上" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "色" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "画像の明るさ:" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "暗い" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "明るい" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "この色を含む: " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(初期調査を行った後に有効になります)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "評価" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "最低でも EXIF の評価が " #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "画像の指定" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "インジケーターアイコン" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "インジケーターアイコン:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "明るいアイコン" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "暗いアイコン" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "数字の 1" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "数字の 2" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "数字の 3" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "数字の 4" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "現在の壁紙" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "カスタム画像..." #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "なし" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "アイコンを選択" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" "アイコンが非表示の場合は、コマンドラインかランチャーのクイックリストで Variety を操作できます。\"variety --help\" " "を実行すると、利用可能なすべてのコマンドが表示されます。" #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "お気に入りの動作" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "メインメニューに表示するお気に入りの動作:" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "お気に入りにコピー" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "コピーと移動" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "フォルダーに依存..." #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "ログイン画面のサポート" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "ログイン画面に Variety の壁紙を適用" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" "プライバシー上の警告: 壁紙を表示するには LightDM " "が読み取れるパーミッションにする必要があります。このオプションを有効にすると、Variety " "は壁紙を公開フォルダーにコピーし、パーミッションを誰でも読み取れるように変更します。デフォルトでは、ホームフォルダーが暗号化されていない場合は " "~/ピクチャ と /usr/share/backgrounds が対象です。マルチユーザー環境で使用する場合はご注意ください。" #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "壁紙の画像ファイルをこのフォルダーにコピー: " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "デフォルトに戻す" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "まだ動作しませんか?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "ホームフォルダーが暗号化されていると思われるため、その中にあるフォルダーは使用できません。" #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "このフォルダーへの書き込み権限がありません。" #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "このフォルダーから LightDM がファイルを読み取る権限がありません。" #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "Variety に管理者権限を付与すると、Variety がパーミッションを調整できるようになります。" #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "カスタマイズ" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "ヒント" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "更新履歴" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "ウェブサイト" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "バグ報告と要望" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "作者に連絡" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "寄付" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "PayPal で寄付" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "私は Variety の開発を余暇に行っています。通常は子供達が寝た後の深夜です。額を問わず寄付を頂けると嬉しく思います。寄付は Variety があなたの役に立った事を意味し、活動を続けるモチベーションになります。\n" "\n" "Thank you,\n" "Peter Levi" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "ビットコインで寄付して頂ける場合はこのウォレットに送ってください:" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "1EHtkck9pw2Ry4NP6Es8rAXWEeADLdkqcu" msgstr "1EHtkck9pw2Ry4NP6Es8rAXWEeADLdkqcu" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "Variety - 個人情報に関する通知" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "拒否して終了" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "同意して続行" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "個人情報に関する通知" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" "設定を行う前に、以下の把握と同意が必要です:\n" "\n" "Variety は一切の保証なしで提供されるオープンソースアプリケーションです。Variety の使用は、Variety が GNU GPLv3 ライセンス に基づいて配布されていることに同意したとみなします。 \n" "\n" "Variety はインターネット接続を行うアプリケーションです。Variety の使用は、インターネット接続の使用を受け入れることになります。初期設定では、Variety はインターネット上から画像をダウンロードします。画像を配布しているウェブサーバーは、IP アドレスなどの個人情報を収集している可能性がありますが、Variety は個人を特定できるような情報の送信は行いません。また、オンラインの画像ソースは無効化できることを覚えておいてください。 \n" "\n" "Variety は開発チームが定義した利用制限を適用して画像を取得します。利用制限は Variety が新しい画像をダウンロードする速度に影響する可能性がありますが、Variety を使用中の人数が何人であろうと Variety の動作を保証します。利用制限の設定は我々がホストしている gist.github.com からダウンロードします。\n" "\n" "一部の画像ソースを有効にした場合、追加の情報を送信する必要があります。例えば Unsplash の利用規約では、ユーザーが Unsplash から画像をダウンロードして表示した場合、情報を送信する必要があります。" #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Variety へようこそ!" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "次へ" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" "Variety " "は自動壁紙チェンジャーです。様々なオンラインソースからダウンロードした画像や、ローカルにある画像を使用して、デスクトップの壁紙を定期的に変更します。バックグラウンドで動作し、システムトレイのアイコンをクリックして操作します:" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" "Variety はブルガリアのソフトウェア開発者 Peter Levi が作成したオープンソースソフトウェアです。気に入りましたら寄付をお願いします。" #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "次の画面で設定を行ってください。" variety-0.8.13/po/ko.po000066400000000000000000001761271475753071700147130ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:05+0000\n" "Last-Translator: James Lu , 2021\n" "Language-Team: Korean (https://www.transifex.com/variety/teams/123174/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ko\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "이미지를 찾을 수 없습니다" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "폴더를 선택하십시오" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "취소" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "확인" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "불러오는 중입니다" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "이미지가 아닙니다" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "이미지가 너무 작습니다, 무시합니다" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "죄송합니다, %s 오류가 발생했습니다..." #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "이는 링크가 더는 유효하지 않음을 뜻합니다" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "모종의 이유로 불러오는 걸 실패했습니다" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "더 자세한 정보를 보시려면, 터미널에서 버라이어티를 -v 선택 사항과 같이 실행하시고 다시 시도하십시오" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "다음(_N)" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "이전(_P)" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "현재 데스크톱 배경화면" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "원본을 봅니다" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "즐겨찾기에 복사하기(_F)" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "즐겨찾기로 이동합니다" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "휴지통에 삭제하기(_T)" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "다음(_N), 사용 기록을 앞으로 나아가는 걸 넘깁니다" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "비법: 아이콘 위에 마우스 휠을 스크롤 하셔서\n" "앞뒤로 넘기십시오" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "이미지 변경을 중지합니다." #: ../variety/indicator.py:140 msgid "_Image" msgstr "이미지(_I)" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "이것은 어디서 왔습니까?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "효과 없이 봅니다" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "구글 이미지 검색" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "EXIF 평점 정하기" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "즐겨찾기에 저장하기" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "즐겨찾기 보기..." #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "클립보드에 복사하기" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "구글 명언" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "구글 저자" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "환경 설정..." #: ../variety/indicator.py:250 msgid "Turn off" msgstr "끕니다" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "명언(_Q)" #: ../variety/indicator.py:262 msgid "_History" msgstr "사용 기록(_H)" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "배경화면 선택기(_W)" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "최근 내려받기 기록(_D)" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:300 msgid "About" msgstr "설명" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "기부하기" #: ../variety/indicator.py:308 msgid "Quit" msgstr "끝내기" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "받은 신호를 중지하는 중입니다, 종료하는 중입니다..." #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "버라이어티가 이미 실행 중입니다. 실행 중인 인스턴스에 명령어를 보냅니다." #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr "" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "버라이어티 환경 설정" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "이미지" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "폴더" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "플리커" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "파일들을 유지한 채, 소스를 삭제합니다" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "파일들을 유지한 채, 소스들을 삭제합니다" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "내려받은 파일들을 삭제하고 소스를 제거합니다" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "내려받은 파일들을 삭제하고 소스들을 제거합니다" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "이미지를 추가합니다" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "추가하기" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "폴더를 추가합니다 - 재귀 검색이 되는 루트 폴더, 하위 폴더만 추가합니다" #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "편집하기..." #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "폴더를 엽니다" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "이미지를 봅니다" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "쓰기 권한이 없습니다" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "권한을 조정할 수 없습니다" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "이 명령어를 직접 실행해보십시오:\n" "sudo chmod %s \"%s\"" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "명언 플러그인이 없습니다" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "설치된 명언 플러그인이 없습니다" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "적합한 명언 플러그인이 없습니다" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "당신은 키워드 및 저자 검색을 지원하는 명언 플러그인을 가지고 있지 않습니다" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "명언을 불러올 수 없습니다" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "명언 서비스가 다운된 것 같습니다, 계속 시도하고 있습니다" #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "명언을 찾을 수 없습니다" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "아마 당신은 매우 불분명한 무언가를 찾는 중일지도 모릅니다?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "원본 유지하기" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "흑백" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "강한 흐림" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "여린 흐림" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "유화" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "점묘화" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "픽셀화" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "즐겨찾기 폴더" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "불러오기 폴더" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "버라이어티가 추천하는 요소입니다. 당신이 이미지를 선호함 혹은 휴지통으로 선택하는 것에 따라 당신의 입맛대로 적응합니다." #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Desktoppr.co에서 무작위 배경화면을 불러옵니다" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "나사의 오늘의 천체 사진" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "당신은 지표 아이콘 위에서 마우스 휠을 스크롤 하시는 걸로 배경화면을 앞뒤로 바꾸실 수 있습니다." #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" "버라이어티는 명령 줄 인터페이스로 제어할 수 있으며 당신은 이를 이용하여 주로 가장 많이 사용할 명령을 키보드 단축키로 지정할 수 " "있습니다. \"variety --help\"를 실행해서 모든 유효한 명령어를 보십시오." #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" "당신은 이미지 링크 혹은 파일을 런처 아이콘에 내려놓는 걸로 내려받기 및 배경화면으로 사용하실 수 있습니다. 특정 사이트로부터 더 빠르게" " 내려받으시려면, 클립 보드 관리를 사용할 수 있습니다(\"수동 내려받기\" 탭을 보십시오)." #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" "강한 흐린 필터를 적용하는 것은 추상적인 분위기와 튀지 않게 만들면서도, 우분투에 있는 기본 배경화면과 같은 화려한 배경화면을 제공해주는" " 훌륭한 방법입니다." #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" "이미지 소스를 선택할 때, 이것의 이미지는 화면의 밑에서 창으로 표시됩니다. 여기에 있는 이미지를 누르셔서 배경화면으로 설정하십시오. " "오른쪽 마우스 버튼으로 누르셔서 창을 닫으시거나, 이것의 외형을 수정 혹은 파일 명령을 내리실 수 있습니다. 당신은 여러 이미지 소스를 " "모든 이미지 소스를 \"합쳐진\" 섬네일로 보기로 설정할 수 있습니다. 이 섬네일로 보기는 무작위로 선택된 백여 개의 이미지 제한을 " "가지고 있으므로 유의하십시오." #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" "버라이어티의 지표 아이콘은 다른 테마로 꾸미실 수 있습니다 - 만약 당신이 \"밝음\" 아이콘 선택 사항을 선택하셨다면, 버라이어티는 맨" " 처음으로 현재 GTK 테마가 \"버라이어티-지표\"라는 이름의 아이콘을 가졌는지를 확인하고 기본으로 있는 밝음 아이콘 대신에 이 " "아이콘을 사용할 것입니다." #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "하단" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "상단" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "좌측" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "우측" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "위치" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "크기" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "들어있는 폴더를 봅니다" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "불러왔습니다: 원본을 봅니다" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "%s에서 봅니다" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "즐겨찾기로 이동합니다(_F)" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "닫기" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "EXIF 평점을 정할 수 없습니다" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "무등급" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "거부됨" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "버라이어티 사용 기록" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "버라이어티 최근 내려받기 기록" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "버라이어티 이미지" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "실행 중인 버라이어티를 즉시 종료합니다" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "현재 배경화면 위치를 복사합니다. 프로그램이 이미 실행 중일 때만 사용됩니다." #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "다음 배경화면 보기" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "이전 배경화면 보기" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "다음 배경화면 보기, 사용기록을 앞으로 넘깁니다" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "현재 배경화면을 휴지통에 이동합니다. 프로그램이 이미 실행 중일 때만 사용됩니다." #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "현재 배경화면을 즐겨찾기에 복사합니다. 프로그램이 이미 실행 중일 때만 사용됩니다." #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "현재 배경화면을 즐겨찾기에 이동합니다. 프로그램이 이미 실행 중일 때만 사용됩니다." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "이미지 변경을 중지합니다." #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "정기적 이미지 변경을 재개합니다" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "일시 정지/재개 상태를 바꿉니다." #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "다음 명언 보기" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "이전 명언 보기" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "다음 명언 보기, 사용기록을 앞으로 넘깁니다" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "명언 일시 정지/재개 상태를 바꿉니다." #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "현재 명언을 즐겨찾기에 저장하기" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "사용 기록 표시창을 켭니다" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "최근 내려받기 표시창을 켭니다" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "환경 설정 대화상자 보기" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "수동 배경화면 선택기 보기 - 섬네일 창에 활성 이미지 소스로부터 받은 이미지로 선택합니다" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" "선택 사항을 설정 및 적용을 합니다. 선택 사항 이름은 버라이어티의 설정 파일인 " "~/.config/variety/variety.conf에서 사용되는 선택 사항과 같습니다. 여러 개의 선택 사항은 단 하나의 명령어로 " "설정될 수 있습니다. 예시로: 'variety --set-option icon Dark --set-option clock_enabled " "True'와 같은 걸로 말입니다. 조심해서 다루십시오: 당신은 설정 파일을 직접 보호받지 않는 방법으로 바꾸고 계십니다." #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "선택 사항 --next/--fast-forward와 --previous는 상호 배타적입니다" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "선택 사항 --trash와 --favorite는 상호 배타적입니다" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "선택 사항 --pause와 --resume은 상호 배타적입니다" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "선택 사항 --quotes-next/--quotes-fast-forward와 --quotes-previous는 상호 배타적입니다" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "이미 즐겨찾기에 있습니다" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "알 수 없음" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "저자: %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "정기적 변경을 재개합니다" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "필터를 매우 까다롭게 설정하시겠습니까?" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "버라이어티는 당신의 필터 범위와 관련 있는 매우 적은 수의 이미지를 찾는 중입니다" #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "더 많은 이미지 소스를 추가하시거나 몇몇 내려받기를 기다려주십시오" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "더 많은 이미지 소스를 추가하십시오" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "더는 배경화면은 없습니다" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "현재 배경화면은 이미지 소스에 없습니다" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "다음 %s. 로 이동할 수 없습니다 이 파일을 옮길 권한이 없는 것 같습니다." #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "다음 %s. 로 복사할 수 없습니다. 이 파일을 복사할 권한이 없는 것 같습니다." #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "삭제할 수 없습니다" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "휴지통에 %s를 버릴 권한이 없습니다." #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "설정 파일과 함께 편집기를 열 것이고 당신이 편집기를 저장 및 닫고 나서 변경 사항을 적용할 것입니다." #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "대기열에 추가됐습니다" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "다음을 누르셔서 보십시오" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "불러왔습니다" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "지원되지 않는 소스 형태입니다" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "지금 당신은 최신 버전의 버라이어티를 실행하고 계십니까?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "새로운 이미지 소스가 추가됐습니다" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "이미 이미지 소스가 존재합니다, 이 소스를 사용합니다" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "불러왔고 적용되었습니다" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "실행이 잘됩니다!" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "와, 버라이어티 링크가 실행이 잘됩니다. 매우 기쁩니다!" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "지원되지 않는 명령어입니다" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "주어진 버라이어티:// URL을 처리할 수 없습니다" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "로깅 사용과 같이 실행하여 자세한 사항을 봅니다" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "자동 실행 항목을 만들 수 없습니다" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "데스크톱 자동 시작 항목을 설정하는 도중에 오류가 발생했습니다\n" "터미널에서 -v 플래그 옵션을 지정하시고 다시 시도하십시오." #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "버라이어티 설명" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "자동 배경화면 바꾸기, 내려받기 및 관리자 프로그램입니다." #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr "" #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "버라이어티 - 플리커를 이미지 소스로 추가합니다" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" "플리커 검색 조건을 지정하십시오. 선택하신 모든 조건에 일치하는 사진을 " "내려받을 것입니다. 조건을 설정하지 않을 경우, 공란으로 남겨두십시오." #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "태그: " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "쉼표로-분리된 태그 목록입니다. 이것은 관련 있는 사진을 찾기 위해 모든 태그를 포함하고 있는 사진을 능률적으로 검색합니다.\n" "예: 노란색, 자동차" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "사용자: " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "사용자의 포토스트림 또는 사진들의 URL을 집어넣으십시오.\n" "예: http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "그룹: " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "그룹의 URL을 집어넣으십시오.\n" "예: http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "문자:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "사진에 있는 제목, 설명과 태그로 검색하는 무료 문자 검색 기능입니다. 제외하고자 하는 항목 앞에는 -을 입력하십시오.\n" "예: 사과 -파이" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "검색을 확인 중이니 잠시 기다리십시오" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "즐겨찾기에 복사하기 대 즐겨찾기로 이동하기" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "기본 설정으로 초기화를 합니다" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "이미지 위치에 따라 메뉴에서 당신의 즐겨찾기가 '즐겨찾기에 복사합니다' 혹은 '즐겨찾기로 이동합니다' 인지를 선택하십시오:" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "한 줄마다 한 항목을 입력하시고, 내려받기, 불러올 수 있는 폴더, 다른 사항 혹은 특정 폴더 경로와 같은 각각 항목을 <폴더>:<복사합니다, 움직입니다, 혹은 두 개를 동시에 사용합니다>와 같은 형식으로 입력하십시오.\n" "여기서 중요한 것은 순서입니다. 이미지가 보일 때, 목록에서 이미지를 함유한 첫 번째 폴더는 버라이어티 메뉴에 보일 어떤 직업을 수행할지 정할 것입니다. '다른 사항'은 아무 파일과 관련시킬 것이며 목록의 끝 부분에 있어야 합니다.\n" "\n" "\n" "예:\n" "\n" "[tab]\n" "내려받은 폴더:복사합니다\n" "\n" "[tab]\n" "불러온 폴더:움직입니다\n" "\n" "[tab]\n" "/pics/RandomImages:움직입니다\n" "\n" "[tab]\n" "/pics/OrganizedAlbums:복사합니다\n" "\n" "[tab]\n" "다른 사항:두 개를 동시에 사용합니다" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "초" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "분" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "시간" #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "일" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "일반 설정" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "컴퓨터를 시작할 때 버라이어티 실행하기" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "배경화면을 바꾸는 주기 " #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "최소 간격은 5초입니다" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "시작할 때 배경화면 바꾸기" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "사용됨" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "형식" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "위치" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "추가하기(_A)..." #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "이미지, 폴더 혹은 온라인 이미지 소스를 추가합니다" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "선택한 소스를 편집합니다" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "편집하기(_E)..." #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "제거하기(_R)..." #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "선택한 이미지 소스를 제거합니다" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "사용하기(_U)" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "선택한 소스를 사용하고 다른 모든 소스를 사용하지 않습니다" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "즐겨찾기" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "선호하는 배경화면을 다음으로 복사합니다 " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "필터" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "이 필터를 표시된 배경화면에 무작위로 적용합니다(환상적인 프로그램인 이미지매직에 감사를 표합니다):" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "명언" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "바탕화면에 무작위 지혜로운 명언을 보기" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "문자 색깔: " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "문자 글꼴: " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "배경 색깔: " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "배경 불투명도: " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " 투명" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "불투명" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "문자에 그림자를 그리기" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "외형" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "따옴표 공간 너비: " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "좁은 " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "넓은" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "수평 위치: " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "좌측 " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "수직 위치: " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "상단 " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "배치" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "이 소스로부터 명언 보기: " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" "더 많은 " "플러그인" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "이 태그 및 저자만 봅니다. 공란으로 남겨서 무작위 명언을 봅니다." #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "예: 웃긴, 고무적인" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "예: 알베르트 아인슈타인, 볼테르" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "저자: " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "소스 및 필터링" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "명언을 바꾸는 주기 " #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "최소 간격은 10초입니다" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "정기적으로 변경하기" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "시계" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "크고 멋진 디지털 시계를 바탕화면에 보여서, 현재 시각 및 날짜를 표시합니다" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "시계의 외형을 설정하시려면 버라이어티의 설정 파일에서 clock_filter 속성을 " "편집하십시오(~/.config/variety/variety.conf). " "~/.config/variety/variety_latest_default.conf에 있는 설명을 참고하셔서 안내문으로 사용하십시오." #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "시계 글꼴: " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "날짜 글꼴: " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "이 방법의 효과가 미미하셨습니까? 여기에 들어가셔서 " "읽어보십시오. 어떻게 시계를 고급 설정을 합니까? 여기에 " "들어가셔서 읽어보십시오." #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "효과" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "폴더를 불러옵니다" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "수동으로 내려받은 배경화면 저장하기 " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "끌기와 놓기" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "런처에 있는 버라이어티의 아이콘은 대상을 놓는 장치로써 사용됩니다. 이 아이콘에 아무 이미지 URL이나 파일을 놓으시면 당신의 불러오기 폴더에 저장할 것입니다. 그러고 나서 당신은 다음을 누르셔서 당신의 바탕화면에서 이것을 볼 수 있습니다.\n" "런처에 있는 아이콘을 보시려면 설명 혹은 환경 설정을 선택하십시오. 당신은 쉽게 끌기-와-놓기를 사용하기 위해 이 아이콘을 바탕화면에 잠그실 수 있습니다." #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "클립보드 모니터링" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "이미지 URL 클립보드를 관리하고 불러옵니다" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "URL 호스트가 이들 중 하나일 때 불러오기만 합니다:" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "수동 내려받기" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "가능하다면 이러한 이미지를 사용합니다:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "가로 방향으로 전환합니다" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "최소 만큼 크게 합니다 " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "화면 해상도의 %" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "색깔" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "어둡거나 밝게 합니다:" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "어둡게" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "밝게" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "이 색깔을 함유합니다: " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(초기 검색을 마치고 나서 효과가 적용됩니다)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "평점" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "최소 점 만큼의 EXIF 평점을 가지고 있습니다 " #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "색깔 및 크기" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "지표 아이콘" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "지표 아이콘:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "밝음" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "어둠" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "현재 배경화면을 사용합니다" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "사용자 설정 이미지..." #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "사용 안 함" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "아이콘을 선택하십시오" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" "아이콘이 숨겨져 있을 때, 버라이어티는 명령 줄이나, 빠른 런처 목록으로부터 제어될 수 있습니다. \"variety --help\"를 " "실행하셔서 모든 유효한 명령어를 보십시오." #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "즐겨찾기 작업" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "주메뉴에서 즐겨찾기 작업을 봅니다:" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "즐겨찾기에 복사합니다" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "복사 및 이동을 동시에 사용합니다" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "폴더에 따라..." #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "로그인 화면 지원" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "버라이어티가 설정한 배경화면이 로그인 화면에서 사용될 것임을 명심하십시오" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" "개인 정보 침해 주의: 당신의 배경화면을 보시려면 라이트DM이 이미지를 읽을 수 있는 권한이 필요합니다. 이 선택 사항을 " "사용하시면, 버라이어티는 배경화면을 공용 폴더에 복사할 것이며 이 이미지를 읽기 가능으로 설정하는 것으로 이것의 권한을 바꿀 것입니다. " "기본으로, 만약 당신의 홈 폴더가 암호화되지 않았다면 폴더는 ~/Pictures이며, 암호화되었다면 폴더는 " "/usr/share/backgrounds입니다. 다중 사용자 시스템에서는 이 선택 사항을 주의 깊게 사용하십시오." #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "배경화면 이미지 파일을 이 폴더에 복사합니다: " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "기본 설정으로 초기화를 합니다" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "아직도 실행되지 않으십니까?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "당신의 홈 폴더가 암호화 상태인듯합니다, 그러므로 이 프로그램 안에서 폴더를 사용하는 것은 불가능합니다." #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "당신은 이 폴더에 작성 권한을 가지고 있지 않습니다." #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "이 권한은 라이트DM이 이 폴더에 있는 파일을 읽는 걸 허락하지 않습니다." #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "버라이어티는 권한을 조정할 수 있지만, 당신은 관리자 권한을 제공하셔야 합니다." #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "사용자 설정" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "비법과 요령" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "최근 변경 사항" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "웹사이트 방문하기" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "버그를 보고하거나 새로운 기능 추가 요구하기" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "피드백 보내기" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "버라이어티에 기부하기" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "페이팔을 통해 기부하기" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "나는 주로 내 자녀들이 취침한 후에 늦은 시간인, 내 자투리 시간을 활용해서 버리어이티를 개발합니다. 당신이 저에게 아무 액수만큼 기부하시면 고맙게 여기겠습니다. 이는 저에게 버라이어티가 당신과 - 여러 사용자에게 가치가 있다는 것을 보여주고 - 저에게 이 프로그램을 계속해서 활발하게 작업할 수 있는 동기를 유발합니다.\n" "\n" "이 프로그램을 사용해주셔서 감사합니다,\n" "\n" "피터 레비" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "버라이어티에 오신 걸 환영합니다!" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "계속" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" "버라이어티는 자동 배경화면 바꾸기 프로그램입니다. 이 프로그램은 당신의 데스크톱 배경화면을 로컬 이미지 혹은 여러 온라인 소스로부터 " "내려받은 이미지를 사용해서 규칙적으로 회전하도록 합니다. 버리아어티는 배경화면에서 조용히 실행되며 - 제어하시려면, 당신의 시스템 알림 " "상자에 있는 아이콘을 누르십시오:" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" "버라이어티는 오픈-소스 소프트웨어이자, 불가리아의 소프트웨어 개발자인, 피터 레비에 의해 개발되었습니다. 만약 당신이 이 소프트웨어를 " "좋아하신다면, 기부를 하십시오." #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "지금부터 당신은 시간을 두셔서 다음 화면에 있는 당신만의 환경 설정을 설정하십시오." variety-0.8.13/po/pl.po000066400000000000000000001612121475753071700147020ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:05+0000\n" "Last-Translator: James Lu , 2021\n" "Language-Team: Polish (https://www.transifex.com/variety/teams/123174/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "Nie znaleziono żadnych obrazów" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "Wybierz folder" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "Anuluj" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "OK" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "Pobieranie" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "Plik nie jest obrazem" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "Obraz jest za mały, ignoruj" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "" #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "Pobieranie się nie powiodło z jakiegoś powodu" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "" "Aby dowiedzieć się więcej, prosze uruchom Variety w terminalu z opcją -v i " "powtórz akcję" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "_Następny" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "_Poprzedni" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "Bieżąca tapeta" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "Pokaż źródło" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "Kopiuj do Ulubionych" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "Przenieś do Ulubionych" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "Usuń do _Kosza" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Wskazówka: Przewiń kółkiem nad ikoną,\n" "żeby zmienić na Poprzednią/Następną" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "" #: ../variety/indicator.py:140 msgid "_Image" msgstr "_Obraz" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "Skąd to jest?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "Pokaż bez efektów" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "Ustaw Ocenę EXIF" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "Zapisz do Ulubionych" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "Pokaż Ulubione..." #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "Skopiuj do schowka" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "Google Quote" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "Google Author" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "Preferencje…" #: ../variety/indicator.py:250 msgid "Turn off" msgstr "Wyłącz" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "_Cytat" #: ../variety/indicator.py:262 msgid "_History" msgstr "_Historia" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "_Wybieracz tapety" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "Ostatnio _Pobrane" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:300 msgid "About" msgstr "O programie" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "Przekaż darowiznę" #: ../variety/indicator.py:308 msgid "Quit" msgstr "Wyjdź" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "Otrzymano sygnał zakończenia. Zamykanie..." #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "" "Variety jest już uruchomione. Wysyłanie sygnału do działającego procesu." #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr "" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Preferencje" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "Obrazy" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "Katalogi" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "Usuń źródło, zachowaj pliki" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "Usuń źródła, zachowaj pliki" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "Usuń źródło i pobrane pliki" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "Usuń źródła i pobrane pliki" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "Add obrazy" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "Dodaj" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Dodaj katalogi – tylko katalog nadrzędny, podkatalogi są wyszukiwane " "automatycznie" #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "Edytuj…" #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "Otwórz katalog" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "Pokaż obraz" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "Brak uprawnień do zapisu" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "Nie można poprawić uprawnień" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Powinieneś ręcznie uruchomić tę komendę:\n" "sudo chmod %s \"%s\"" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "Brak wtyczek do cytatów" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "Nie ma już więcej zainstalowanych wtyczek do cytatów" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "Brak odpowiednich wtyczek do cytatów" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "" "Brakuje wtyczek do cytatów, które wspierają szukanie po słowach kluczowych " "lub autorach." #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "Nie można pobrać cytatów" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "" "Usługa pobierania cytatów może być niedostępna, żądanie będzie ponowione" #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "Nie znaleziono cytatów" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "Może szukasz czegoś dziwnego?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "Zachowaj oryginał" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "Odcienie szarości" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "Mocne rozmazanie" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "Słabe rozmazanie" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "Obraz olejny" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "Pointilism" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "Pixellate" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "Folder Ulubionych" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "Folder Złapanych" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "" #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Losowe tapety z Desktoppr.co" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "Astronomiczny Obraz Dnia od NASA" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" "Możesz przewijać tapety kółkiem myszy, gdy kursor jest nad ikonką stanu." #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" "Variety może być kontrolowane z linii komend. Można to wykorzystać do " "zdefiniowania skrótów dla najczęściej wykonywanych operacji. Uruchom " "\"variety --help\", żeby zobaczyć możliwe opcje." #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" "Możesz podać źródła obrazów przeciągając link na główną ikonę. Dla dalszego " "przyspieszenia pobierania można użyć monitorowania schowka (zobacz zakładkę " "\"Pobieranie ręczne\")." #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" "Użycie mocnego zamazania to świetny sposób na artystyczno-abstrakcyjne, ale " "bardzo kolorowe tapety, utrzymane w duchu domyślnej tapety Ubuntu." #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" "Gdy zaznaczysz źródło obrazów, jego obrazy są pokazywane na dole ekranu. " "Kliknij obraz, aby ustawić go jako tapetę. Kliknij prawym, żeby zamknąć okno" " w celu zmiany jego wyglądu lub zmiany plików. Można wybrać kilka źródeł " "obrazów i stworzyć ich połączony widok. Widok ten jest ograniczony do " "kilkuset wybranych obrazów." #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" "Ikona indykcyjna Variety jest modyfikowalna przez motywy - jeśli wybierzesz " "opcję \"Jasne\" dla ikon, Variety sprawdzi czy w bieżącym motywie GTK " "istnieje ikona \"variety-indicator\" i użyje jej zamiast domyślnej." #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "Dół" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Góra" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Lewo" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "Prawo" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "Pozycja" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "Rozmiar" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "Pokaż folder zawierający" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "Złapane: Pokaż źródło" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "Pokaż w %s" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "Przenieś do _Ulubionych" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "Zamknij" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "Nie udało się ustawić oceny EXIF" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "Bez oceny" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "Odrzucone" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "Historia" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Niedawno Pobrane" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Obrazy" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "Zamknij uruchomioną instancję" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "Pokaż położenie bieżącej tapety. Możliwe gdy aplikacja już działa." #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "Pokaż następną" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "Pokaż poprzednią" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "Pokaż następną, pomiń historię" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Przenieś bieżącą tapetę do kosza. Możliwe tylko wtedy, gdy aplikacja już " "działa." #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Przenieś bieżącą tapetę do kosza. Możliwe tylko wtedy, gdy aplikacja już " "działa." #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Przenieś bieżącą tapetę do Ulubionych. Możliwe tylko wtedy, gdy aplikacja " "już działa." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "Wstrzymaj/Wznów" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "Pokaż następny cytat" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "Pokaż poprzedni cytat" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "Pokaż następny cytat, pomiń historię" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "Wstrzymaj/Wznów cytaty" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "Zapisz bieżący cytat do Ulubionych" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "Pokaż/Ukryj historię" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "Pokaż/Ukryj Niedawno Pobrane" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "Pokaż preferencje" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Pokaż selektor do ręcznego wyboru tapety - pasek z obrazami z aktywnego " "źródła obrazów" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" "Ustawia i zastosowuje wybraną opcję. Nazwy opcji są takie same jak użyte w " "pliku konfiguracyjnym ~/.config/variety/variety.conf. Wiele opcji może być " "ustawione za pomocą jednego polecenia . Przykład: 'variety --set-option icon" " Dark --set-option clock_enabled True'. UŻYWAĆ OSTROŻNIE: Zmieniasz plik " "ustawień bezpośrednio niestrzeżonym sposobem." #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "opcje --next/--fast-forward i --previous się wykluczają" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "opcje --trash i --favorite się wykluczają" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "opcje --pause i --resume się wykluczają" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "opcje --quotes-next/--quotes-fast-forward i --quotes-previous się wykluczają" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "Jest już w Ulubionych" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "Autor: %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "Czy filtrowanie nie jest za ostre?" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "Variety znalazło zbyt mało obrazów spełniających wymagania" #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "Dodaj więcej źródeł lub poczekaj na pobranie nowych obrazów" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "Proszę dodać więcej źródeł obrazów" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "Nie ma już więcej tapet" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "Bieżącej tapety nie ma w źródłach" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "" "Nie można przenieść do %s. Prawdopodobnie nie masz uprawnień do " "przeniesienia tego pliku." #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" "Nie można przenieść do %s. Prawdopodobnie nie masz uprawnień do skopiowania " "tego pliku." #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "Nie można usunąć" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "Nie masz uprawnień do usunięcia %s do Kosza" #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "" "Otworzy się edytor pliku konfiguracji. Po zapisaniu pliku i zamknięciu " "edytora zmiany zostaną zastosowane." #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "Dodane do kolejki" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "Naciśnij Następny aby zobaczyć" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "Złapane" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "Czy używasz najnowszej wersji Variety?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "Nieobsługiwane polecenie" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "Wystąpił błąd podczas tworzenia wpisu autostartu.\n" "Uruchom aplikację z konsoli z flagą -v i spróbuj jeszcze raz." #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "O Variety" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Automatyczny pobieracz i zmieniacz tapet." #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr "" #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Variety - dodaj Flickr jako źródło obrazów" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" "Sprecyzuj kryteria dla Flickr. Zdjęcia, " "które spełniają wszystkie warunki będą pobrane. Zostaw niepotrzebną resztę " "kryteriów pustą." #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "Tagi: " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "Lista etykiet rozdzielona przecinkami. Zdjęcie się kwalifikuje gdy zawiera je wszystkie.\n" "Przykład: żółty,samochód" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "Użytkownik: " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "Proszę wkleić adres URL do photostream'a użytkownika lub jego zdjęcia.\n" "Przykład: http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "Grupa: " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "Proszę podać URL grupy.\n" "Przykład: http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "Tekst:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "Wyszukiwanie tekstu w tytułach, opisach i tagach zdjęć. Wyklucza słowa poprzedzone -.\n" "Przykład: jabłko -ciasto" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "Sprawdzanie wyników szukania..." #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Kopiuj do Ulubionych lub Przenieś do Ulubionych" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "Przywróć domyślne" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "" "Wybierz 'Kopiuj do Ulubionych' lub 'Przenieś do Ulubionych' w menu w " "zależności od położenia obrazu:" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "Proszę wprowadź jedno wejście na linię, każde w formie :, gdzie Folder może być: Pobrane, Złapane, Inne lub specyficzna ścieżka do folderu.\n" "Kolejność jest ważna. Kiedy obraz jest pokazywany, pierwszy folder na liście zawierający ten obraz decyduje jakie opcje będą pokazywane w menu. 'Inne' pasuje do każdego pliku i powinien być ostatni na liście.\n" "\n" "Przykład:\n" "\tPobrane:Kopiuj\n" "\tZłapane:Przenieś\n" "\t/pics/RandomImages:Przenieś\n" "\t/pics/OrganizedAlbums:Kopiuj\n" "\tInne:Oba" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "sekund(-y)" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "min" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "godz." #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "dni" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "Ogólne" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "Uruchom Variety wraz z systemem" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "Zmieniaj tapetę co: " #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "Najmniejszy odcinek czasu to 5 sekund" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "Zmień tapetę na starcie" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "Aktywne" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "Typ" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "Położenie" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "_Dodaj..." #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "Dodaj obrazy, foldery lub źródła obrazów online" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "Edytuj wybrane źródło" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "_Edytuj..." #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "_Usuń..." #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "Usuń zaznaczone źródła" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "_Użyj" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "Aktywuj zaznaczone żródła i deaktywuj resztę" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "Ulubione" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "Kopiuj ulubione tapety do " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "Filtry" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "Dodawaj losowe filtry do tapet (dzięki ImageMagick):" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "Cytaty" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "Pokaż losowy cytat na pulpicie" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "Kolor tekstu: " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "Czcionka: " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "Kolor tła: " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "Przezroczystość tła: " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " Przezroczyste" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "Nieprzezroczyste" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "Rysuj cień tekstu" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "Wygląd" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "Szerokość obszaru cytatów: " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "Wąski " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "Szeroki" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "Pozycja poziomo: " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "Lewa strona " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "Pozycja pionowo: " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "Góra " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "Położenie" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "Pokaż cytaty z: " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" "Więcej " "wtyczek" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "Pokaż tylko te tagi i autorów. Zostaw puste, aby cytaty były losowe." #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "Przykład: zabawny, interesujący" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "Przykład: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "Autorzy: " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "Źródła i filtrowanie" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "Zmień cytat co " #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "Najmniejszy odstęp czasu to 10 sekund" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "Regularna zmiana" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "Zegar" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "Pokaż duży, cyfrowy zegar na pulpicie" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "Aby zmienić wygląd zegara zmień własność clock_filter w pliku ustwawień " "Variety (~/.config/variety/variety.conf). Możesz skorzystać z komentarzy w " "~/.config/variety/variety_latest_default.conf jako przewodnika." #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "Czcionka zegara: " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "Czcionka daty: " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "Nie działa? Przeczytaj to. " "Jak jeszcze inaczej skonfigurować zegar? Przeczytaj to." #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "Efekty" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "Folder Złapanych" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "Zapisz ręcznie pobrane tapety do " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "Przeciągnij i upuść" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "Ikona Variety na pasku głównym może być używana do upuszczania. Upuść plik lub adres URL obrazu a zostanie on zapisany do folderu złapanych. Wtedy można klikając Następna ustawić ją na pulpicie.\n" "Aby pokazać ikonę na pasku głównym wybierz O programie lub Preferencje. Możesz ją także przypiąć do paska dla wygody w upuszczaniu." #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "Monitorowanie schowka" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Monitoruj schowek w poszukiwaniu adresów obrazów" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "Ale pobieraj tylko wtedy, gdy źródłem jest jeden z tych serwisów:" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "Ręcznie pobieranie" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "Gdy możliwe używaj obrazów, które są:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "Ułożone poziomo" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "Wielkości co najmniej " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "% rozdzielczości ekranu" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "Kolor" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "Ciemne czy jasne:" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Ciemne" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Jasne" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "Zawierające ten kolor: " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(Efekt widoczny po chwili początkowego szukania)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "Ocena" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "Posiadają ocenę EXIF co najmniej " #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "Kolor i wielkość" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "Ikona wskaźnika" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "Ikona wskaźnika:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "Jasna" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "Ciemna" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Użyj bieżącej tapety" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "Własny obraz..." #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "Brak" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "Wybierz ikonę" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" "Gdy ikonka jest niewidoczna, Variety może być sterowane z linii poleceń lub " "listą (prawy klik) głównego paska. Uruchom \"variety --help\", aby poznać " "wszystkie opcje." #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "Operacje na Ulubionych" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "Operacje na Ulubionych pokazywane w menu:" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "Kopiuj do Ulubionych" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "Kopiuj i Przenieś" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "W zależności od folderu..." #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "Wsparcie dla Ekranu Logowania" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "Upewnij się, że tapety ustawione przez Variety będą użyte przez ekran " "logowania" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" "Ostrzeżenie Prywatności: LightDM potrzebuje uprawnień do czytania " "pliku. Gdy opcja jest włączona, Variety skopiuje tapety do publicznego " "folderu i zmieni ich uprawnienia na odczytywalne. Domyślnie, jest to " "~/Pictures jeśli twój folder domowy nie jest zaszyfrowany, i " "/usr/share/backgrounds jeśli jest. Proszę używać ze szczególną ostrożnością " "na systemach z wieloma użytkownikami." #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "Kopiuj tapety do folderu: " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "Przywróć domyślne" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "Ciągle nie działa?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Wygląda na to, że folder domowy jest zaszyfrowany, więc zawarte w nim pliki " "nie będą działać." #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "Brak uprawnień do zapisu do tego folderu." #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "LightDM nie ma uprawnień do odczytania plików z tego folderu." #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "Variety może dostosować uprawnienia, jeżeli otrzyma uprawnienia " "administratora." #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "Dostosuj" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "Sztuczki i kruczki" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "Ostatnie zmiany" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "Odwiedź stronę" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "Zgłoś błąd lub zaproponuj funkcję" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "Wyślij zgłoszenie" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "Wspomóż Variety" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "Wspomóż przez PayPal" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "Rozwijam Variety w wolnym czasie, co oznacza najczęściej późno w nocy, gdy moje dzieci śpią. Każda kwota będzie mile widziana. W ten sposób możesz pokazać, że Variety jest dla Ciebie wartościowa i zmotywować mnie do dalszej pracy.\n" "\n" "Dziękuję,\n" "Peter Levi" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Witaj w Variety!" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "Kontynuuj" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" variety-0.8.13/po/pt_BR.po000066400000000000000000002057031475753071700153010ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Ronaldo Silva , 2023 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:50+0000\n" "Last-Translator: Ronaldo Silva , 2023\n" "Language-Team: Portuguese (Brazil) (https://app.transifex.com/variety/teams/123174/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "Imagens não localizadas" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "Imagens do Flickr" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "Escolha uma pasta" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "Cancelar" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "Ok" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "Buscando" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "Não é uma imagem" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "Imagem muito pequena, ignorando" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "Desculpe, encontramos %s erro..." #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "Isso indica que o link não é mais válido" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "A busca falhou por alguma razão" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "" "Para conseguir mais informações, por favor execute Variety a partir do " "terminal com a opção -v e refaça a ação" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "_Próximo" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "_Anterior" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "Wallpaper atual da área de trabalho" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "Mostrar Original" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "Copiar para _Favoritos" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "Mover para Favoritos" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "Enviar para _Lixeira" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "_Próximo, pulando histórico" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Dica: Deslize a roda do mouse sobre \n" "o ícone para próximo e anterior" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "Pare no atual" #: ../variety/indicator.py:140 msgid "_Image" msgstr "_Imagem" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "De onde é?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "Mostre sem efeitos" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "Pesquise no Google Imagens" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "Definir classificação EXIF" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "Salve nos Favoritos" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "Veja os Favoritos" #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "Copia para Área de transferência" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "Citação do Google" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "Autor do Google" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "Preferências" #: ../variety/indicator.py:250 msgid "Turn off" msgstr "Desligar" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "_Citação" #: ../variety/indicator.py:262 msgid "_History" msgstr "_Histórico" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "_Seletor de Wallpaper" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "_Downloads Recentes" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "Iniciar Apresentação de Slides" #: ../variety/indicator.py:300 msgid "About" msgstr "Sobre" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "Doar" #: ../variety/indicator.py:308 msgid "Quit" msgstr "Encerrar" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "Terminando o sinal recebido, encerrando..." #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "" "Variety já está executando. Enviando comando para a instância em execução." #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr "(Perfil: {})" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Preferências Variety" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "Tudo" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "Imagens" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "Adicione suas imagens de wallpaper pessoais" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "Pastas" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" "Pesquisado recursivamente por 10000 imagens, exibindo em ordem aleatória" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "Álbuns sequenciais (ordenados por nome de arquivo)" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" "Imagens pesquisadas recursivamente, exibidas em sequencia (por nome de " "arquivo)" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "Álbuns sequenciais (ordenado por data)" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" "Imagens pesquisadas recursivamente, exibidas em sequencia (por data do " "arquivo)" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "Buscar imagens do Flickr" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "Remova originais, mantenha os arquivos" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "Remova originais, mantenha os arquivos" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "Remova originais e apague arquivos baixados" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "Remova originais e apague arquivos baixados" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" "O uso dessa fonte requer a alteração do wallpaper ativada em intervalos de " "%d minutos ou menos. As configurações foram ajustadas automaticamente." #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "Adicione imagens" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "Adicione" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Adicionar pastas - adicione apenas as pastas raiz, as subpastas são " "pesquisadas recursivamente" #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" "Adicionar álbuns sequenciais (ordenados por nome de arquivo). As subpastas " "são pesquisadas recursivamente." #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "" "Adicionar álbuns sequenciais (ordenados por data). As subpastas são " "pesquisadas recursivamente." #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "Editar..." #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "Abrir pasta" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "Visualizar imagem" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "Sem permissão de escrita" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "Não é possível ajustar permissões" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Você deve tentar executar manualmente o comando:\n" "sudo chmod %s \"%s\"" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "Nenhum plugin de citação" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "Não há plugin de citação instalado." #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "Nenhum plugin de citação adequado" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "" "Você não tem plugins de citação que suportem a pesquisa por palavras-chave e" " autores" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "Não é possível buscar por citação" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "Serviço de citação pode estar inativo, você deve continuar tentando" #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "Citações não encontradas" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "Talvez você esteja procurando por algo muito obscuro?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "Mantenha o original" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "Escala de cinza" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "Desfoque pesado" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "Desfoque suave" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "Pintura à óleo " #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "Pontilhismo" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "Pixelado" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "Pasta de favoritos" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "Pasta de procurados" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "" "Recomendado pelo Variety. Adapta-se ao seu gosto conforme você marca as " "imagens como favoritas ou lixo." #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" "Últimos favoritos por outros usuários Variety. [Pode conter imagens NSFW]" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Wallpapers aleatórios por Desktoppr.co" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "Imagem astronômica do dia da NASA" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "Foto do dia por Bing" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "Fotos de alta resolução por Unsplash.com" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" "Você pode alterar o papel de parede para próxima e anterior deslizando a " "roda do mouse na parte superior do ícone indicador." #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" "Se você quiser executar comandos personalizados sempre que o papel de parede" " for alterado ou se usar um ambiente de área de trabalho alternativo, edite " "os scripts em {PROFILE_PATH} scripts. Existem exemplos para vários ambientes" " de área de trabalho." #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" "Variety pode ser controlada a partir da linha de comando e você pode usar " "isso para definir atalhos de teclado para as operações que usa com mais " "frequência. Execute \"variety --help\" para ver todos os comandos " "disponíveis." #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" "Você pode inserir links de imagens ou arquivos no ícone do iniciador para " "baixá-los e usá-los como papel de parede. Para um download mais rápido de um" " site específico, você também pode usar o monitoramento da área de " "transferência (consulte a guia \"Download manual\")." #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" "Aplicar um filtro de desfoque pesado é uma ótima maneira de obter papéis de " "parede de aparência abstrata e discretos, mas coloridos, semelhantes ao " "espírito padrão do Ubuntu." #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" "Adicionar seus próprios filtros personalizados é muito fácil: abra " "{PROFILE_PATH} variety.conf em um editor e use os filtros existentes como " "exemplo. Cada filtro é apenas uma linha de opções a serem passadas para o " "comando de conversão do ImageMagick." #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" "Quando você seleciona uma fonte de imagem, suas imagens são exibidas em uma " "janela na parte inferior da tela. Clique em uma imagem para definir como " "papel de parede. Clique com o botão direito do mouse para fechar a janela, " "modificar sua aparência ou executar operações de arquivo. Você pode " "selecionar várias fontes de imagem para criar uma visualização em miniatura " "\"mesclada\" de todas elas. Lembre-se de que a exibição em miniatura é " "limitada a várias centenas de imagens selecionadas aleatoriamente." #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" "Para ativar as notificações na área de trabalho quando o papel de parede " "mudar, remova o comentário das duas linhas na parte inferior de " "{PROFILE_PATH} scripts/set_wallpaper." #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" "O ícone do indicador do Variety é personalizável - se você escolher a opção " "\"Luz\" para o ícone, o Variety verificará primeiro se o tema GTK atual " "possui um ícone chamado \"variety-indicator\" e o usará em vez do ícone de " "luz incluído." #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" "Quando você escolhe salvar citações em Favoritos, elas são salvas por padrão" " em {PROFILE_PATH} favorite_quotes.txt. Este arquivo é compatível com a " "fonte de citação de arquivos locais da Variety. Se você quiser usá-lo - " "copie-o para ~/.config/variety/pluginconfig/quotes/ e ative a fonte de " "cotações de Arquivos locais. Este arquivo também é compatível com o " "utilitário Fortune do Unix." #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "Abaixo" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Acima" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Esquerda" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "Direita" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "Posição" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "Tamanho" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "Máximo de imagens exibidas" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "Mostrar pasta contendo" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "Localizado: Mostre origem" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "Ver em %s" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "Mova para _Favoritos" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "Fechar" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "Não foi possível definir a classificação EXIF" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "Sem classificação" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "Rejeitado" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "Histórico Variety" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Downloads recentes Variety" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Imagens Variety" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" "rog [opções] [arquivos ou urls]\n" "\n" "Passar arquivos locais irá adicioná-los à fila da Variety.\n" "Passar URLs remotos fará com que o Variety os busque na pasta Fetched e os coloque na fila.\n" "\n" "Para definir um papel de parede específico: rog --set /some/local/image.jpg\n" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" "Nome do perfil ou caminho completo para a pasta de configuração que a " "Variety deve usar. Se não for especificado, é ~/.config/variety/. Se apenas " "um nome for usado em vez de um caminho completo, a pasta de perfil será " "~/.config/variety-profiles/. Use apenas ao iniciar inicialmente o Variety - " "alterar o caminho do perfil requer reinicialização. Várias instâncias de " "Variety podem ser iniciadas ao usar diferentes perfis, cada uma com sua " "própria configuração separada. Isso pode ser usado, por exemplo, para " "controlar várias telas ou espaços de trabalho diferentes em ambientes de " "desktop como o XFCE, que permitem isso. Para passar comandos para uma " "instância em execução, passe o mesmo argumento --profile com o qual foi " "iniciado nos comandos subsequentes." #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" "Mostra as mensagens de registro (-vv a -vvvvv traçará o perfil de várias " "partes do Variety com detalhes crescentes" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "Fazer com que a instância em execução seja encerrada" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" "Exiba a localização atual do papel de parede. Usado apenas quando o " "aplicativo já está em execução." #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" "Defina o arquivo fornecido como papel de parede, o caminho completo é " "necessário" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "Mostre o próximo papel de parede" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "Mostre o papel de parede anterior" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "Mostre o próximo papel de parede, ignorando o histórico de avanço" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Mova o papel de parede atual para a Lixeira. Usado apenas quando o " "aplicativo já está em execução." #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Copie o papel de parede atual para os Favoritos. Usado apenas quando o " "aplicativo já está em execução." #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Mova o papel de parede atual para Favoritos. Usado apenas quando o " "aplicativo já está em execução." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "Parar na imagem atual" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "Retomar alterações regulares de imagem" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "Alternar o estado Pausar/Reiniciar" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "Alternar \"Mostrar sem efeitos\" para a imagem atual" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "Mostre a próxima citação" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "Mostra a citação anterior" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "Mostrar próxima citação, ignorando o histórico de avanço" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "Alternar estado de Citações Pausar/Reiniciar" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "Salve a citação atual nos Favoritos" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "Alternar exibição do histórico" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "Desativar exibição de downloads recentes" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "Mostre o diálogo de Preferências" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Mostrar seletor de papel de parede manual - a barra de miniaturas preenchida" " com imagens das fontes de imagem ativas" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" "Define e aplica uma opção. Os nomes das opções são os mesmos usados no " "arquivo de configuração do Variety ~/.config/variety/variety.conf. Várias " "opções podem ser definidas em um único comando. Exemplo: 'variety --set-" "option icon Dark --set-option clock_enabled True'. USE COM CUIDADO: Você " "está alterando o arquivo de configurações diretamente de forma desprotegida." #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "" "as opções --next/--fast-forward e --previous são mutuamente exclusivas" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "as opções --trash e --favorite são mutuamente exclusivas" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "as opções --pause e --resume são mutuamente exclusivas" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "as opções --quotes-next/--quotes-fast-forward e --quotes-previous são " "mutuamente exclusivas" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "Já está em Favoritos" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "Fonte:%s" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "Desconhecido" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "Autor: %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "Retomar mudanças regulares" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "Filtragem muito rigorosa?" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "" "Variety encontrau poucas imagens que correspondam aos seus critérios de " "filtragem de imagens" #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "Adicione mais fontes de imagens ou aguarde alguns downloads" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "Por favor adicione mais fontes de imagem" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "Não há mais papéis de parede" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "O papel de parede atual não está na fonte de imagens" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "" "Não foi possível mover para %s. Você provavelmente não tem permissão para " "mover este arquivo." #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" "Não foi possível copiar para %s. Você provavelmente não tem permissão para " "copiar este arquivo." #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "Não é possível apagar" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "Você não tem permissão para excluir %s para a Lixeira." #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" "Falha ao excluir para a lixeira, verifique o arquivo variety.log para obter " "mais informações." #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "" "Vou abrir um editor com o arquivo de configuração e aplicar as alterações " "depois que você salvar e fechar o editor." #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "Adicionado a fila" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "Pressione Avançar para vê-lo" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "Obtido" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "Tipo fonte não suportado" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "Você está executando a versão mais recente de Variety?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "Nova fonte de imagens adicionada" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "Fonte de imagens já existe, ativando-a" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "Obtido e aplicado" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "Funciona!" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "Sim, os links de Variety funcionam. Ótimo!" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "Comando não reconhecido" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "Não foi possível processar a URL variety:// fornecida" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "Execute com o registro ativado para ver os detalhes" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "Variety: Nova entrada para desktop" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" "Criamos uma nova entrada de área de trabalho em ~/.local/share/applications " "para executar o Variety com o perfil \"{}\". Encontre-o no iniciador de " "aplicativos." #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "Variey: Criada entrada de inicio automático para área de trabalho" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" "Criamos uma nova entrada de área de trabalho em ~/.config/autostart. Variety" " deve começar automaticamente no próximo login." #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "Não foi possível criar a entrada de auto inicio" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "Ocorreu um erro ao criar a entrada da área de trabalho de inicialização automática\n" "Execute a partir de um terminal com o sinalizador -v e tente novamente." #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "Sem imagens" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "Não há imagens nas pastas de apresentação de slides" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "Sobre Variety" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" "Direitos autorais (c) 2012-2020, Peter Levi, James Lu e colaboradores da " "Variety" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Um trocador automático de papel de parede, baixador e gerenciador." #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "https://github.com/varietywalls/variety" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" "# Direitos autorais (c) 2012-2020, Peter Levi, James Lu e colaboradores da Variety\n" "# Este programa é um software livre: você pode redistribuí-lo e/ou modificá-lo\n" "# sob os termos da GNU General Public License versão 3, conforme publicado\n" "# pela Free Software Foundation.\n" "#\n" "# Este programa é distribuído na esperança de que seja útil, mas\n" "# SEM QUALQUER GARANTIA; mesmo sem as garantias implícitas de\n" "# COMERCIABILIDADE, QUALIDADE SATISFATÓRIA ou ADEQUAÇÃO PARA UM DETERMINADO\n" "# PROPÓSITO. Consulte a Licença Pública Geral GNU para obter mais detalhes.\n" "#\n" "# Você deve ter recebido uma cópia da GNU General Public License junto\n" "# com este programa. Caso contrário, consulte .\n" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "Só um momento para verificar as imagens" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr " " #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Variety - adicionar Flickr como uma fonte de imagens" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" "Especifique os critérios de pesquisa no Flickr. As fotos que atenderem a todos os " "critérios escolhidos serão baixadas. Deixe os critérios desnecessários em " "branco." #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "Marcas:" #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "Uma lista de tags separadas por vírgula. Uma foto deve conter todos eles simultaneamente para corresponder.\n" "Exemplo: amarelo, carro" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "Usuário:" #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "Insira o URL do photostream do usuário ou de uma de suas fotos.\n" "Exemplo: http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "Grupo:" #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "Insira o URL do grupo.\n" "Exemplo: http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "Texto:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "Pesquisa de texto gratuita nos títulos, descrições e tags das fotos. Exclua os termos anexando-os com -.\n" "Exemplo: torta de maçã" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "Só um momento checando a pesquisa" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Copiar para Favoritos vs. Mover para Favoritos" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "Resetar para o padrão" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "" "Selecione se prefere 'Copiar para Favoritos' ou 'Mover para Favoritos' no " "menu, dependendo da localização da imagem:" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "Por favor insira uma entrada por linha, cada entrada no formato :, onde a Pasta pode ser Baixada, Buscada, Outros ou um caminho de pasta específico.\n" "A ordem é importante. Quando uma imagem é exibida, a primeira pasta desta lista que contém a imagem determinará quais operações serão exibidas no menu do Variety. 'Outros' corresponde a qualquer arquivo e deve ser o último da lista.\n" "\n" "Exemplo:\n" "Baixado:Copiar\n" "Obtido: Mover\n" "/pics/RandomImages:Mover\n" "/pics/OrganizedAlbums:Copiar\n" "Outros: Ambos" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "segundos" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "minutos" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "horas" #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "dias" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "Geral" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "Inicie Variety em conjunto com o computador" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "Troque o papel de parede todo dia" #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "Intervalo minimo de 5 segundos" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "Troque o papel de parede no inicio" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "Ativado" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "Tipo" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "Local" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "_Adicionar..." #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "Adicionar imagens, pastas ou fontes de imagens online" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "_Abrir Pasta" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "Editar fonte selecionada" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "_Editar..." #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "_Remover..." #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "Remover fontes de imagens selecionadas" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "_Usar" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "Habilitar as fontes selecionadas e desabilitar as demais" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "Favoritos" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "Copia papel de parede favorito para" #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "Filtros" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" "Aplique aleatoriamente esses filtros aos papéis de parede exibidos (graças " "ao maravilhoso ImageMagick):" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "Citações" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "Mostre citações sábias aleatoriamente na área de trabalho" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "Cor da fonte:" #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "Fonte do texto:" #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "Cor do pano de fundo:" #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "Opacidade do pano de fundo:" #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr "Transparência" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "Opacidade" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "Desenhar uma sombra no texto" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "Aparência" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "Largura da área de citações:" #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "Limite" #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "Largura" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "Posição horizontal:" #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "Esquerda" #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "Posição verticial:" #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "Topo" #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "Localização" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "Mostrar citações para essas fontes:" #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" "Mais " "plugins" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" "Mostrar apenas essas tags e autores. Deixe em branco para mostrar citações " "aleatórias." #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "Exemplo: engraçado, inspirativo" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "Exemplo: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "Autores:" #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "Fontes e filtros" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "Troque a citação a cada" #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "Intervalo minimo de 10 segundos" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "Mudança regular" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "Relógio" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "" "Mostre um grande relógio digital na área de trabalho, exibindo a hora e a " "data atuais" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "Para configurar a aparência do relógio, edite a propriedade clock_filter no " "arquivo de configurações do Variety (~/.config/variety/variety.conf). Use os" " comentários em ~/.config/variety/variety_latest_default.conf como um guia." #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "Fonte do relógio:" #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "Fonte da data:" #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "Estes não funcionam? Leia aqui. Como" " configurar ainda mais o relógio? Leia " "aqui." #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "Efeitos" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "Imagens para show de slides" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "Imagens favoritas" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "Imagens em todas as fontes habilitadas" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "Todas as imagens na pasta de Downloads" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "Pasta personalizada (inclui imagens em subpastas)" #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "Ordem das imagens no show de slides" #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "Aleatório" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "Por nome, A à Z" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "Por nome, Z à A" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "Por data, antigos primeiro" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "Por data, novos primeiro" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "Tela" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "Execute no monitor" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "Modo janela para o show de slide" #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "Tela cheia" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "Área de trabalho (fica abaixo de outras janelas)" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "Janela maximizada" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "Janela normal" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "Dinâmico" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "Intervalo entre alterações de imagem" #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr "segundos" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "Desfoque rápido" #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "Desfoque lento" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "Menos zoom" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "Mais zoom" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "Menos pan" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "Mais pan" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "Resetar para padrão" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" "As alterações nesta página entram em vigor depois que a apresentação de " "slides é reiniciada" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "Inicia show de slide agora" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "Show de Slide" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "Obter pasta" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "Salvar manualmente os papéis de parede para" #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "Arraste e solte" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "O ícone da Variety no lançador serve como um alvo para soltar. Solte qualquer URL ou arquivo de imagem nele e ele será salvo em sua pasta de busca. Você pode então pressionar Avançar para vê-lo em sua área de trabalho.\n" "Para mostrar o ícone no lançador, escolha Sobre ou Preferências. Você pode querer bloqueá-lo lá para facilitar o acesso de arrastar e soltar." #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "Monitorando área de transferência" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Monitorar área de transferência por URLs de imagens para obtê-las" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "Mas busque apenas quando o host da URL for um destes:" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "Baixando manualmente" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "Quando possível, use imagens que:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "Ter orientação de paisagem" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "São maiores que" #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "% da resolução da tela" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "Cor" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "É escura ou clara" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Escuro" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Claro" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "Contém esta cor:" #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(Entra em vigor após alguma pesquisa inicial)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "Avaliação" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "Ter classificação EXIF pelo menos" #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "Cor e tamanho" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "Ícone indicador" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "Ícone indicador:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "Claro" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "Escuro" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "Número 1" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "Número 2" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "Número 3" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "Número 4" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Use o papel de parede atual" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "Imagem personalizada..." #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "Nada" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "Selecione um ícone " #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" "Quando o ícone está oculto, o Variety pode ser controlado na linha de " "comando ou na lista rápida do lançador. Execute \"variety --help\" para ver " "todos os comandos disponíveis." #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "Operações favoritas" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "Operações favoritas para mostrar no menu principal:" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "Copiar para Favoritos" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "Ambos Copiar e Mover" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "Depende da pasta..." #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "Suporte para tela de login" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "Certifique-se de que os papéis de parede definidos pela Variety serão usados" " na tela de login" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" "Aviso de privacidade: para mostrar seu papel de parede, o LightDM " "precisa de permissões de leitura sobre a imagem. Com esta opção ativada, a " "Variety copiará os papéis de parede para uma pasta pública e alterará suas " "permissões para torná-los legíveis por todos. Por padrão, a pasta é " "~/Pictures se sua pasta pessoal não estiver criptografada e " "/usr/share/backgrounds se estiver. Use com cuidado em sistemas multiusuário." #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "Copie os arquivos de imagem de papel de parede para esta pasta:" #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "Resetar para o padrão" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "Ainda não funciona?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Parece que sua pasta pessoal está criptografada, portanto, usar pastas " "dentro dela não funcionará." #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "Você não tem permissões de gravação para esta pasta." #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "As permissões não permitem que LightDM leia arquivos desta pasta." #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "Variety pode ajustar as permissões, mas você terá que fornecer privilégios " "de superusuário." #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "Personalizar" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "Dicas e truques" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "Mudanças recentes" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "Visite o website" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "Relatar um bug ou solicitar um recurso" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "Envie um feedback" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "Doe para Variety" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "Doe via PayPal" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "Estou desenvolvendo o Variety em meu tempo livre, o que geralmente significa tarde da noite depois que meus filhos vão para a cama. Qualquer valor que você doar será apreciado. Isso vai me mostrar que a Variedade é valorizada por vocês - os usuários - e vai me motivar a continuar trabalhando ativamente nisso.\n" "\n" "Obrigado,\n" "Peter Levi" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "Para doar em Bitcoin, por favor envia para esta carteira:" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "Variedade - Aviso de Privacidade" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "Rejeitar e encerrar" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "Aceitar e Continuar" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "Aviso de Privacidade" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" "Antes de começarmos, aqui estão algumas coisas que você precisa estar ciente e concordar:\n" "\n" "Variety é um aplicativo de código aberto, fornecido como está, sem quaisquer garantias. Ao usá-lo, você concorda com os termos e condições da licença GNU GPLv3 sob a qual é distribuído.\n" "\n" "Variety é um aplicativo conectado à Internet. Com as configurações padrão, a Variety baixa imagens da Internet. Os servidores da Web dos quais ele baixa podem coletar informações sobre seu dispositivo, como endereço IP. A Variety não envia nenhuma informação de identificação pessoal. Ao usar a Variety, você aceita o uso da conectividade com a Internet. Observe que todas as fontes de imagens online podem ser desativadas.\n" "\n" "Variety busca e aplica configurações de limitação de taxa definidas pela equipe de desenvolvimento. Isso pode afetar a taxa de download de novas imagens, mas ajuda a garantir que o Variety funcione independentemente de quantas pessoas o estejam executando. Essas configurações serão baixadas de gist.github.com, onde as hospedamos.\n" "\n" "Algumas fontes de imagem exigem que rastreemos informações adicionais quando habilitadas. Por exemplo, os termos do Unsplash exigem que rastreemos e relatemos quando os usuários baixam e visualizam imagens do Unsplash." #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Bemvindo ao Variety!" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "Continue" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" "Variety é um trocador automático de papel de parede. Ele gira o papel de " "parede da área de trabalho regularmente usando imagens locais ou imagens " "baixadas de várias fontes online. Ele é executado silenciosamente em segundo" " plano - para controlá-lo, clique neste ícone na bandeja do sistema:" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" "Variety é um software de código aberto, criado por Peter Levi, um " "desenvolvedor de software da Bulgária. Se você gosta, por favor, doe." #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" "Agora, dedique algum tempo para definir suas preferências nas telas a " "seguir." variety-0.8.13/po/ru.po000066400000000000000000002140701475753071700147160ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:05+0000\n" "Last-Translator: James Lu , 2021\n" "Language-Team: Russian (https://www.transifex.com/variety/teams/123174/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "Изображения не найдены" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "Выберите папку" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "Отмена" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "OK" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "Получение" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "Не изображение" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "Изображение слишком маленькое, игнорирую его" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "Извините, получена ошибка %s..." #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "Это значит, что ссылка более не действительна" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "Получение прервано по некоторым причинам" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "" "Для получения более подробной информации, пожалуйста, запустите Variety из " "терминала с опцией -v и повторите действие" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "_Следующее" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "_Предыдущее" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "Текущее изображение на рабочем столе" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "Показать оригинал" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "Копировать в Избр_анные" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "Переместить в Избранные" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "Удалить в _Корзину" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "_Дальше, пропустив уже просмотренные" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Совет: прокручивайте обои вперёд и назад\n" "колесом мыши на индикаторе программы" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "Приостановить на текущем" #: ../variety/indicator.py:140 msgid "_Image" msgstr "_Изображение" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "Откуда это?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "Показать без эффектов" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "Google поиск по картинке" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "Задать EXIF оценку" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "Сохранить в Favorites" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "Смотреть Favorites..." #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "Копировать в буфер обмена" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "Искать цитату в Google" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "Искать автора в Google" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "Параметры…" #: ../variety/indicator.py:250 msgid "Turn off" msgstr "Выключить" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "_Цитата" #: ../variety/indicator.py:262 msgid "_History" msgstr "_История" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "_Переключатель обоев" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "Но_вые загрузки" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "Запустить слайд-шоу" #: ../variety/indicator.py:300 msgid "About" msgstr "О программе" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "Пожертвования" #: ../variety/indicator.py:308 msgid "Quit" msgstr "Выход" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "Получен сигнал отмены - выхожу..." #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Variety уже запущена. Отправка команды на запущенный экземпляр." #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr "" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Параметры Variety" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "Все" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "Изображения" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "Папки" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "Удалить источник, сохранить файлы" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "Удалить источники, сохранить файлы" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "Удалить источник и загруженные файлы" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "Удалить источники и загруженные файлы" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "Добавить изображения" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "Добавить" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Добавить папки — добавляйте только корневые папки, поиск в подпапках " "осуществляется автоматически." #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "Изменить..." #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "Открыть папку" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "Показать изображение" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "Нет прав для записи" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "Не удалось настроить права доступа" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Вы можете попробовать выполнить эту команду вручную:\n" "sudo chmod %s \"%s\"" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "Нет расширений для цитат" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "Не установлено ни одного расширения для цитат" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "Нет подходящих расширений для цитат" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "" "У вас нет расширений, поддерживающих поиск по ключевым словам и авторам в " "цитатах" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "Не удалось загрузить цитаты" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "Возможно, сервис цитат недоступен, но мы продолжим попытки" #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "Не удалось найти цитаты" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "Возможно, вы ищете что-то слишком неопределённое?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "Сохранить оригинал" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "Оттенки серого" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "Жёсткое размытие" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "Мягкое размытие" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "Масляная живопись" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "Пуантилизм" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "Пикселизация" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "Избранные" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "Загруженные вручную" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "" "Рекомендованные Variety. Подстраивается под ваш вкус, основываясь на " "избранных и удалённых изображениях." #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" "Избранные изображения других пользователей Variety (могут содержать " "непристойные изображения)" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Случайные обои с Desktoppr.co" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "NASA: астрономическое фото дня" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "Фото дня от Bing" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "Фото высокого разрешения из Unsplash.com" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "Вы можете менять обои прокруткой колеса мыши на индикаторе." #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" "Variety можно управлять из командной строки, например, назначить горячие " "клавиши для часто используемых операций. Запустите «variety --help», чтобы " "увидеть все доступные команды." #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" "Вы можете перетаскивать ссылки на изображения или файлы на значок в панели " "запуска для их загрузки и использования в качестве обоев. Для быстрой " "загрузки со специфичных сайтов, вы также можете использовать слежение за " "буфером обмена (см. вкладку «Ручная загрузка»)." #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" "Использование фильтра жёсткого размытия — лучший способ получить " "абстрактные, ненавязчивые, но, в то же время, красочные обои, подобные " "стандартным в Ubuntu." #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" "Когда вы выберете источник изображений, его содержимое появится в окне в " "нижней части экрана. Щёлкните там по изображению, чтобы назначить его " "обоями. Щёлкните правой кнопкой мыши, чтобы закрыть окно, изменить его " "внешний вид или выполнить операции с файлами. Вы можете выбрать несколько " "источников для «объединённого» просмотра эскизов. Обратите внимание, что " "просмотр миниатюр ограничен несколькими сотнями случайно выбранных " "изображений." #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" "Значок индикатора Variety поддерживает темы: если вы выберете «Светлый» вид," " то Variety сперва проверит, есть ли в текущей GTK-теме значок «variety-" "indicator», и использует его вместо встроенного." #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "Снизу" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Сверху" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Слева" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "Справа" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "Положение" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "Размер" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "Показать в папке" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "Выбранное: Показать оригиналы" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "Показать на %s" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "Переместить в Избр_анные" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "Закрыть" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "Не удалось задать EXIF оценку" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "Без оценки" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "Отклонено" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "История Variety" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Новые загрузки Variety" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Изображения Variety" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "Выйти из запущенного приложения" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" "Отобразить путь к изображению с рабочего стола. Работает только при " "запущенном приложении." #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "Показать следующие обои" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "Показать предыдущие обои" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "Показать следующее изображение игнорируя историю" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Переместить текущие обои в Корзину. Работает только при запущенном " "приложении." #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Копировать текущие обои в Избранные. Работает только при запущенном " "приложении." #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Переместить текущие обои в Избранные. Работает только при запущенном " "приложении." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "Приостановить на текущем изображении" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "Возобновить регулярную смену изображений" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "Переключение пауза\\воспроизведение" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "Показать следующую цитату" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "Показать предыдущую цитату" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "Показать следующую цитату игнорируя историю" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "Переключение пауза\\воспроизведение для цитат" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "Сохранить текущую цитату в Favorites" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "Переключить отображение истории" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "Переключить отображение последних загрузок" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "Показать диалог настроек" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Показать переключатель обоев — панель эскизов изображений из активных " "интернет-источников" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" "Указание и применение опций. Названия опций те же что и в файле конфигурации" " ~/.config/variety/variety.conf. Несколько опций можно указать одной " "командой. Пример: \"variety --set-option icon Dark --set-option " "clock_enabled True\". ИСПОЛЬЗУЙТЕ С ОСТОРОЖНОСТЬЮ: Вы меняете файл настроек " "непосредственно без механизмов защиты корректности." #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "опции --next/--fast-forward и --previous взаимоисключающие" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "опции --trash и --favorite взаимоисключающие" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "опции --pause и --resume взаимоисключающие" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "опции --quotes-next/--quotes-fast-forward и --quotes-previous " "взаимоисключающие" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "Всегда в Избранные" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "Неизвестно" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "Автор: %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "Возобновить регулярные изменения" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "Фильтр слишком строг?" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "" "Variety находит мало фотографий, подходящих вашим критериям фильтрации " "изображений" #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "" "Пожалуйста, добавьте несколько источников изображения или дождитесь загрузки" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "Пожалуйста, добавьте несколько источников изображения" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "Больше нет изображений" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "Данное изображение отсутствует в источнике" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "Не могу перенести в %s. Возможно не достаточно прав для перемещения." #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" "Не могу скопировать в %s. Возможно не достаточно прав для копирования." #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "Не могу удалить" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "У вас нет прав для удаления %s в корзину." #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" "Не удалось удалить в корзину, чтобы узнать подробности, проверьте " "variety.log." #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "" "я открою редактор с конфигурационным файлом и применю изменения после того " "как вы сохраните файл и закроете редактор." #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "Добавлено в очередь" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "Нажмите Далее для просмотра" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "Полученные" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "Неподдерживаемый тип источника" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "Вы используете последнюю версию Variety?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "Новый источник изображений добавлен" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "Такой источник изображений уже существует, включаю его" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "Загружено и применено" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "Работает!" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "Ура, ссылки Variety работают. Великолепно!" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "Неподдерживаемая команда" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "Не удалось обработать данный variety:// URL" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "Запуск с ведением журнала, чтобы видеть детали" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "Не удалось создать запись в автозагрузке" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "Ошибка при создании пункта автозагрузки\n" "Пожалуйста, запустите в терминале с опцией -v и попробуйте ещё раз." #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "Нет изображений" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "Нет изображений в папках для слайд-шоу" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "О Variety" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Автоматический сменщик, загрузчик и менеджер обоев." #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr "" #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Variety — добавление источника изображений Flickr" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" "Пожалуйста, задайте условия поиска на Flickr. Будут загружены только фотографии, " "соответсвующие всем условиям. Оставьте ненужные поля пустыми." #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "Теги: " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "Список тегов, разделённых запятой. Чтобы соответствовать, фотография должна содержать их все одновременно.\n" "Пример: жёлтый,машина" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "Пользователь: " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "Пожалуйста, укажите URL пользовательской галереи или одной из её фотографий.\n" "Пример: http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "Группа: " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "Пожалуйста, вставьте URL-адрес группы.\n" "Пример: http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "Текст:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "Свободный поиск по тексту заголовков, описаний и тегов фотографий. Исключаемые параметры предваряются знаком «-».\n" "Например: яблочный -пирог" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "Одну минуту, проверка поискового запроса" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Копировать или переместить в Избранные" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "Сбросить настройки" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "" "Выберите отображение в меню «Копировать в Избранные» или «Переместить в " "Избранные» в зависимости от расположения изображения:" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "Пожалуйста, делайте по одной записи на линию, все пункты вида <Папка>:, где папкой могут быть Downloaded, Fetched, Others или путь к определённой локальной папке.\n" "Порядок важен. Когда будет показано изображение, первая папка в списке, содержащая это изображение, определит, какие операции отобразятся в меню Variety. «Others» должна быть в конце списка, потому что любой файл входит в эту категорию.\n" "\n" "Пример (пишите именно по-английски):\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "секунды" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "минуты" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "часы" #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "дни" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "Основные" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "Запускать Variety при старте системы" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "Менять обои каждые " #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "Минимальный интервал 5 секунд" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "Менять обои при запуске" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "Включено" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "Тип" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "Расположение" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "_Добавить…" #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "Добавить изображения, папки или интернет-источники" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "Изменить выделенный источник" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "_Изменить…" #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "_Удалить..." #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "Удалить выделенные источники изображений" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "_Применить" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "Включить выбранные источники и отключить остальные" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "Избранные" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "Копировать избранные обои в " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "Фильтры" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" "Применять случайные фильтры к отображаемым обоям (спасибо чудесному " "ImageMagick):" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "Цитаты" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "Показывать случайные мудрые цитаты на рабочем столе" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "Цвет текста: " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "Шрифт текста: " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "Цвет фона: " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "Прозрачность фона: " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " Прозрачный" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "Непрозрачный" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "Рисовать текст с тенью" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "Внешний вид" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "Ширина области цитат: " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "Узкая " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "Широкая" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "Горизонтальное положение: " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "Слева " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "Вертикальное положение: " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "Сверху " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "Расположение" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "Показывать цитаты из этих источников: " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" "Больше " "расширений" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" "Показывать только эти теги и авторов (оставьте пустым для отображения " "случайных цитат)." #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "Пример: funny, inspirational" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "Пример: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "Авторы: " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "Источники и фильтры" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "Менять цитату через " #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "Минимальный интервал 10 секунд" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "Постоянная смена" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "Часы" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "" "Показывать на рабочем столе большие симпатичные цифровые часы с текущими " "временем и датой" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "Настройте внешний вид часов, отредактировав свойство clock_filter в файле " "настроек Variety (~/.config/variety/variety.conf). В качестве руководства " "используйте комментарии в ~/.config/variety/variety_latest_default.conf." #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "Шрифт часов: " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "Шрифт даты: " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "Не работают? Читай тут. Как " "ещё настроить часы? Прочти здесь." #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "Эффекты" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "Изображения для слайд-шоу" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "Избранные изображения" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "Изображения изо всех подключённых источников" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "Все изображения из папки Downloads" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "Папка по выбору (включая изображения из подпапок) " #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "Порядок изображений в слайд-шоу " #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "Случайный" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "По имени, от А до Я" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "По имени, от Я до А" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "По дате, сначала старые" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "По дате, сначала новые" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "Экран" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "Запустить на мониторе" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "Оконный режим для слайд-шоу " #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "Во весь экран" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "Рабочий стол (остаётся под другими окнами)" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "Развёрнутое окно" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "Обычное окно" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "Динамика" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "Интервал между сменой изображений " #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr " секунды" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "Быстрое исчезновение " #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "Медленное исчезновение" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "Меньше увеличений" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "Больше увеличений" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "Меньше смещений" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "Больше смещений" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "Сбросить настройки" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" "Изменения на этой странице будут применены после перезапуска слайд-шоу" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "Запустить слайд-шоу" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "Слайд-шоу" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "Загруженные вручную" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "Сохранить загруженные вручную изображения в " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "Перетаскивание" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "Значок Variety в панели запуска может служить целью для перетаскивания. Перетащите любой URL изображения или файл прямо на него, и они сохранятся в папку загруженных вручную изображений. Затем вы можете нажать кнопку «Следующие», чтобы увидеть их на рабочем столе.\n" "Чтобы значок отобразился в панели запуска, выберите пункт меню «О программе» или «Параметры». Вы можете закрепить его там для лёгкого доступа к функции перетаскивания." #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "Слежение за буфером обмена" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "" "Следить за буфером обмена и при обнаружении там URL изображений, загружать " "их" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "Загружать, только если URL хоста один из следующих:" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "Ручная загрузка" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "По возможности использовать изображения, которые:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "Имеют альбомную ориентацию" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "По крайней мере " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "% от размера экрана" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "Цвет" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "Тёмные или светлые:" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Тёмные" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Светлые" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "Содержат этот цвет: " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(Применяется после первоначального поиска)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "Оценка" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "EXIF оценка не меньше " #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "Цвет и размер" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "Значок индикатора" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "Значок индикатора:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "Светлый" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "Тёмный" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Текущие обои" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "Выбрать изображение..." #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "Нет" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "Выберите значок" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" "Когда значок индикатора скрыт, можно управлять Variety из командной строки " "или через списки действий панели запуска. Запустите «variety --help», чтобы " "посмотреть все доступные команды." #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "Избранные операции" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "Избранные операции, отображаемые в главном меню:" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "Копировать в Избранные" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "Обе (копировать и переместить)" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "Зависит от папки..." #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "Поддержка экрана входа в систему" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "Удостоверьтесь, что обои, установленные Variety, будут использоваться на " "экране входа в систему" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" "Предупреждение: Для отображения ваших обоев LightDM требуются права " "на чтение файла. При включённой опции Variety скопирует обои в общедоступную" " папку и изменит права досупа на чтение для всех. По умоланию, папка " "~/Pictures в домашней директории не зашифрована, как и " "/usr/share/backgrounds, если существует. Пожалуйста, используйте с " "осторожностью в многопользовательских системах." #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "Копировать файлы обоев в эту папку: " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "Сбросить настройки" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "Всё ещё не работает?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Похоже, ваш домашний каталог зашифрован, поэтому использовать его подпапки " "не получится." #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "У вас нет прав на запись в эту папку." #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "Права доступа не позволяют LightDM читать файлы из этой папки." #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "Variety может настроить права доступа, но вы должны предоставить права " "администратора." #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "Настройка предпочтений" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "Полезные советы" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "Последние изменения" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "Посетить сайт" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "Сообщить об ошибке или предложить новую функцию" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "Отправить отзыв" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "Пожертвовать на Variety" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "Пожертвовать через PayPal" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "Я разрабатываю Variety в своё свободное время, наступающее обычно в те поздние часы, когда мои дети укладываются спать. Буду благодарен за любую пожертвованную сумму. Это покажет мне, что Variety ценна для вас — пользователей — и побудит активнее продолжать работу над программой.\n" "\n" "Спасибо,\n" "Петр Леви" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Добро пожаловать в Variety!" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "Продолжить" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" "Variety – это автоматическая программа для смены обоев. Смена идёт на " "регулярной основе, используя изображения с компьютера и из онлайн-" "источников. Она работает в фоновом режиме – для настройки и управления " "нажмите иконку в системном трее." #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" "Variety — это свободное программное обеспечение, созданное болгарским " "разработчиком Петром Леви. Если оно вам понравилось, пожалуйста, сделайте пожертвование." #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" "Теперь уделите, пожалуйста, немного времени настройкам на следующих экранах." variety-0.8.13/po/sr.po000066400000000000000000002131151475753071700147130ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:05+0000\n" "Last-Translator: James Lu , 2021\n" "Language-Team: Serbian (https://www.transifex.com/variety/teams/123174/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\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" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "Нисам пронашао ниједну слику" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "Изаберите фасциклу" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "Откажи" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "У реду" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "Набављам" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "Није слика" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "Слика је превише мала, занемарујем је" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "Извините, добих „%s“ грешку..." #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "Ово значи да веза није више исправна" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "Набавка није успела због нечега" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "" "За више података, покрените програм у терминалу са опцијом „-v“ и поново " "покушајте радњу" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "_Следећа" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "_Претходна" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "Тренутна позадина површи" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "Прикажи извор" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "Умножи у _омиљене" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "Премести у омиљене" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "Пребаци у _смеће" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "_Следећи, прескачући историјат за напред" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Савет: Премакните точкић преко\n" "иконице за следећу и претходну" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "Застани на текућој" #: ../variety/indicator.py:140 msgid "_Image" msgstr "_Слика" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "Одакле је ово?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "Прикажи без дејства" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "Гуглова претрага слика" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "Подеси ЕКСИФ оцену" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "Сачувај у омиљеним" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "Прегледај омиљене..." #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "Умножи у оставу" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "Гуглови цитати" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "Гуглов аутор" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "Поставке..." #: ../variety/indicator.py:250 msgid "Turn off" msgstr "Искључи" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "_Цитат" #: ../variety/indicator.py:262 msgid "_History" msgstr "_Историјат" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "_Избирач позадине" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "Скорашња _преузимања" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "Покрени покретни приказ" #: ../variety/indicator.py:300 msgid "About" msgstr "О програму" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "Прилог" #: ../variety/indicator.py:308 msgid "Quit" msgstr "Изађи" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "Примио сам знак за прекид, излазим..." #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Разноврсност је већ покренута. Шаљем наредбу покренутом примерку." #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr "" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Поставке Разноврсности" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "Све" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "Слике" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "Фасцикле" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "Фликр" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "Уклони извор, задржи датотеке" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "Уклони изворе, задржи датотеке" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "Уклони извор и избриши преузете датотеке" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "Уклони изворе и избриши преузете датотеке" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "Додајте слике" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "Додај" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Додајте фасцикле — Додајте само корене фасцикле, садржане фасцикле се " "претражују дубински" #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "Уреди..." #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "Отвори фасциклу" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "Прегледајте слику" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "Немате овлашћење за упис" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "Нисам успео да подесим овлашћења" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Можете покушати ручно да покренете наредбу:\n" "sudo chmod %s „%s“" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "Нема прикључка цитата" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "Прикључак цитата није инсталиран" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "Нема одговарајућег прикључка цитата" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "" "Немате прикључак цитата који подржава претрагу по кључним речима и ауторима" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "Не могу да набавим цитате" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "Можда су се урушиле услуге цитата, покушаваћемо и даље" #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "Не могу да нађем цитате" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "Можда тражите нешто врло непознато?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "Задржи изворну" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "Лествица сивила" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "Тешко замућење" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "Меко замућење" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "Уље на платну" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "Истачкавање" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "Пикселизација" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "Фасцикла омиљених" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "Фасцикла преузетих" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "" "Које предлаже Разноврсност. Прилагођава се вашим укусима онако како " "означавате слике омиљеним или смећем." #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" "Последње омиљене других корисника Разноврсности. [Може да садржи НСФВ слике]" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Насумичне позадине са Десктоппр.цо-а" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "НАСА-ина астрономска слика дана" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "Бингова фотографија дана" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "Фотографије високе резолуције са Унсплаш.ком-а" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" "Можете да мењате позадину назад и напред премицањем точкића миша на врху " "иконице указивача." #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" "Разноврсност се може контролисати из линије наредби и ви то можете користити" " да одредите пречице тастатуре за радње које најчешће користите. Покрените " "„variety --help“ да видите све доступне наредбе." #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" "Можете убацити везе за слике или датотеке на иконици за покретање да их " "преузмете и користите као позадине. За брже преузимање са одређеног сајта, " "можете такође користити праћење оставом (видите језичак „Ручно преузимање“)." #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" "Примена пропусника тешког замућења је одличан начин за добијање апстрактног-" "изгледа и ненаметљиве, али обојене позадине, слично у духу са подразумеваним" " у Убунтуу." #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" "Када изаберете извор слике, његове слике се приказују у прозору на дну " "екрана. Притисните на слику да је поставите као позадину. Притисните десним " "тастером миша да затворите прозор, да измените његов изглед или да обавите " "радње са датотекама. Можете изабрати више извора слика да направите " "„стопљени“ преглед минијатура за све њих. Знајте да је преглед минијатура " "ограничен на неколико стотина случајно изабраних слика." #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" "Иконица указивача Разноврсности темска — ако изаберете „светлу“ опцију за " "иконицу, Разноврсност ће прво проверити да ли тренутна Гтк тема има иконицу " "под називом „variety-indicator“ и користиће је уместо приложене светле " "иконице." #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "Доле" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Горе" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Лево" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "Десно" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "Положај" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "Величина" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "Прикажи садржајну фасциклу" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "Добављено: прикажи изворну" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "Прегледај у %s" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "Премести у _омиљење" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "Затвори" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "Не могу да подесим ЕКСИФ оцену" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "Без оцене" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "Одбијено" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "Историјат програма" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Скорашња преузимања" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Слике програма" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "Искључује покренути примерак" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" "Исписује тренутну путању позадине. Користи се само када је програм већ " "покренут." #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "Приказује следећу позадину" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "Приказује претходну позадину" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "Приказује следећу позадину прескачући историјат наредних позадина" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Премешта тренутну позадину у смеће. Користи се само када је програм већ " "покренут." #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Умножава тренутну позадину у омиљене. Користи се само када је програм већ " "покренут." #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Премешта тренутну позадину у омиљене. Користи се само када је програм већ " "покренут." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "Застаје на текућој слици" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "Наставља са редовним променама слика" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "Окида стање застајања и наставка" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "Приказује следећи цитат" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "Приказује претходни цитат" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "Приказује следећи цитат, прескачући историјат наредних позадина" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "Окида стање застајања и наставка цитата" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "Чува текући цитат у омиљеним" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "Окида приказ историјата" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "Окида приказ скорашњих преузимања" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "Приказује прозор поставки" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Приказује ручног избирача позадина — траку минијатура испуњену сликама из " "активних извора слика" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" "Подешава и примењује опцију. Називи опција су исти као и они у датотеци " "подешавања „~/.config/variety/variety.conf“. Више опција може бити подешено " "у једној наредби. Пример: „variety --set-option icon Dark --set-option " "clock_enabled True“. КОРИСТИТЕ УЗ ОПРЕЗ: Мењате датотеку подешавања " "непосредно на незаштићен начин." #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "опције „--next/--fast-forward“ и „--previous“ се узајамно искључују" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "опције „--trash“ и „--favorite“ се узајамно искључују" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "опције „--pause“ и „--resume“ се узајамно искључују" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "опције „--quotes-next/--quotes-fast-forward“ и „--quotes-previous“ се " "узајамно искључују" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "Већ је међу омиљеним" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "Непознато" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "Аутор: %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "Настави са редовним променама" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "Да ли је разврставање превише строго?" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "" "Разноврсност проналази премало слика које се слажу са кључним речима " "издвајања" #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "Додајте још извора слика или сачекајте да се неке преузму" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "Додајте још извора слика" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "Нема више позадина" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "Тренутна позадина није из извора слика" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "" "Не могу да преместим у „%s“. Вероватно немате овлашћења за премештање ове " "датотеке." #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" "Не могу да умножим у „%s“. Вероватно немате овлашћења за умножавање ове " "датотеке." #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "Не могу да обришем" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "Немате овлашћења за премештање „%s“ у смеће." #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "" "Отвориће се уређивач текста са датотеком подешавања и биће примењене измене " "након што сачувате и затворите уређивач." #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "Заказано је" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "Притисните „Следећа“ да је видите" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "Набављена" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "Неподржана врста извора" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "Да ли радите са најновијим издањем програма?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "Нови извор слике је додат" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "Извор слике већ постоји, укључујем га" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "Набављено и примењено" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "Ради!" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "Опа бато, везе Разноврсности раде. Баш лепо!" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "Неподржана наредба" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "Не могу да обрадим дату адресу „variety://“" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "Покрените са укљученим записником да видите детаље" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "Не могу да направим ставку самопокретања" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "Дошло је до грешке приликом стварања уноса самопокретања\n" "Покрените програм из терминала са одредницом „-v“, и покушајте поново." #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "Нема слика" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "Нема слика у фасциклама покретних приказа" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "О Разноврсности" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Самостални измењивач позадина, преузимач и управник." #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr "" #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Додајте Фликр као извор слика" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" "Одредите Фликров начин претраге. Слике " "које се поклапају са изабраном кључном речи биће преузете. Оставите " "непотребне кључне речи празним." #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "Ознаке: " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "Списак ознака раздвојених зарезом. Слика мора да их садржи све истовремено да би одговарала претрази.\n" "Пример: жуто,кола" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "Корисник: " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "Унесите адресу за фото-токове корисника или за једну од њихових слика.\n" "Пример: http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "Скуп: " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "Унесите адресу скупа позадина.\n" "Пример: http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "Текст:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "Претрага наслова, описа и ознака слика. Искључите обухватање речи додавањем знака „-“.\n" "Пример: apple -pie" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "Само тренутак да проверим претрагу" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Умножавање у омиљене наспрам премештања у омиљене" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "Врати на основно" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "" "Изаберите да ли вам више одговара „Умножи у омиљене“ или „Премести у " "омиљене“ у изборнику зависно од путање слике:" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "Упишите један унос по реду, сваки унос у облику <Фасцикла>:<Умножи, Премести или Оба>, где фасцикла може бити преузетих, набављених, осталих или нарочита путања фасцикле.\n" "Редослед је важан. Када се прикаже слика, прва фасцикла на списку која садржи слику одредиће које радње ће бити приказане у изборнику Разноврсности. „Остале“ одговара било којој датотеци и треба бити последња на списку.\n" "\n" "Пример:\n" "\tПреузете:Умножи\n" "\tНабављене:Премести\n" "\t/pics/насумичне_слике:Премести\n" "\t/pics/сређени_албуми:Умножи\n" "\tОстале:Оба" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "секунде" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "минута" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "сати" #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "дана" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "Опште" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "Покрени Разноврсност са покретањем рачунара" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "Промени позадину након " #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "Најмањи период је 5 секунде" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "Промени позадину при покретању" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "Укључено" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "Врста" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "Путања" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "_Додај..." #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "Додајте слике, фасцикле или изворе слика на мрежи" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "Уредите изабрани извор" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "_Уреди..." #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "_Уклони..." #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "Уклоните изабране изворе слика" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "_Користи" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "Укључите изабране изворе а искључите све друге" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "Омиљене" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "Умножи омиљене позадине у " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "Пропусници" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" "Насумично примени ове пропуснике на приказане позадине (захваљујући дивној " "Магији слика):" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "Цитати" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "Прикажи насумичне мудре цитате на радној површи" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "Боја текста: " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "Слова текста: " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "Боја позадине: " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "Провидност позадине: " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " Прозирна" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "Непрозирна" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "Исцртај сенку текста" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "Изглед" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "Ширина области цитата: " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "Уска " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "Широка" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "Водораван положај: " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "Лево " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "Усправни положај: " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "Горе " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "Постављање" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "Прикажи цитате из ових извора: " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" "Још " "прикључака" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" "Прикажи само ове ознаке и ауторе. Оставите празно за приказивање насумичних " "цитата." #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "Пример: забавни, образовни" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "Пример: Никола Тесла, Десанка Максимовић" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "Аутори: " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "Извори и издвајање" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "Промени цитат након " #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "Најмањи период је 10 секунде" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "Редовна промена" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "Сат" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "" "Прикажи леп велики дигитални сат на радној површи, који приказује тренутно " "време и датум" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "Да подесите изглед сата уредите својство пропусника_сата у датотеци " "подешавања (~/.config/variety/variety.conf). Користите напомене у датотеци " "„~/.config/variety/variety_latest_default.conf“ као водич." #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "Слова за сат: " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "Слова за датум: " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "Ово не ради? Прочитајте " "овде. Како убудуће да подесите сат? Прочитајте овде." #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "Дејства" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "Слике за покретни приказ" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "Омиљене слике" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "Слике у свим укљученим изворима слика" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "Све слике у фасцикли за преузимања" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "Произвољна фасцикла (укључује слике у садржаним фасциклама) " #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "Редослед слика у покретном приказу " #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "Насумично" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "Према називу, од А до Ш (A-Z)" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "Према називу, од Ш до А (Z-A)" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "Према датуму, прво старије" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "Према датуму, прво новије" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "Екран" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "Покрени на екрану" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "Режим прозора за покретни приказ " #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "Преко целог екрана" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "Радна површ (остаје испод других прозора)" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "Увећан прозор" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "Уобичајен прозор" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "Динамика" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "Период између промена слика " #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr " секунде" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "Брзо ишчезавање " #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "Споро ишчезавање" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "Мање увеличање" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "Веће увеличање" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "Мање увлачење" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "Веће увлачење" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "Врати на основно" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" "Измене на овој страници ступају на снагу након поновног покретања покретног " "приказа" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "Сада покрени покретни приказ" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "Покретни приказ" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "Фасцикла за набавке" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "Сачувај ручно преузете позадине у " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "Превлачење и убацивање" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "Иконица Разноврсности у покретачу служи као мета убацивања. Убаците неку адресу слике или датотеке у њу и она ће бити сачувана у вашој фасцикли за набављање. Онда можете да притиснете „Следећа“ да је видите на радној површи.\n" "Да прикажете иконицу у покретачу изаберите „О програму“ или „Поставке“. Можете пожелети да је закључате тамо ради лакшег приступа превлачења и убацивања." #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "Праћење оставе" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Прати оставу за адресама слика и набави их" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "Али набави само када је домаћин адресе један од ових:" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "Ручно преузимање" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "Када је могуће користи слике:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "Које имају пејзажно усмерење" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "Које су величине барем " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "% резолуције екрана" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "Боја" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "Које су тамне или светле:" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Тамне" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Светле" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "Које садрже ову боју: " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(Ступају у дејство након почетне претраге)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "Оцењивање" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "Које имају ЕКСИФ оцену барем " #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "Боја и величина" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "Иконица указивача" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "Иконица указивача:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "Светла" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "Тамна" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Користи текућу позадину" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "Произвољна слика..." #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "Ништа" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "Изаберите иконицу" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" "Када је иконица скривена, Разноврсност можете контролисати са линије " "наредби, или са брзог списка покретача. Покрените „variety --help“ да видите" " све доступне наредбе." #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "Радње омиљених" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "Радње омиљених за приказ у главном изборнику:" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "Умножи у омиљене" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "И умножи и премести" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "Зависно од фасцикле..." #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "Подршка екрана пријављивања" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "Уверите се да ће позадине које подеси Разноврсност бити коришћене на екрану " "пријављивања" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" "Упозорење приватности: Да покаже вашу позадину Лаганом управнику " "приказа су потребна овлашћења за читање преко слике. Са овом опцијом " "укљученом, Разноврсност ће умножити позадине у јавној фасцикли и промениће " "њихова овлашћења чинећи да свако може да их чита. По основи, фасцикла је " "„~/Слике“ ако ваша лична фасцикла није шифрована, а „/usr/share/backgrounds“" " ако јесте. Користите уз опрез на системима са више корисника." #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "Умножи датотеке слика позадина у овој фасцикли: " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "Врати на основно" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "Да ли још увек не ради?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Изгледа да је ваша лична фасцикла шифрована, тако да коришћење фасцикли " "унутар ње неће радити." #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "Немате овлашћење за писање у овој фасцикли." #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "Овлашћења не дозвољавају да ЛајтДМ чита датотеке из ове фасцикле-." #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "Разноврсност може да прилагоди овлашћења, али ви морате да обезбедите " "овлашћења администратора." #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "Прилагођавање" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "Савети и трикови" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "Недавне измене" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "Посетите веб сајт" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "Пријавите грешку или затражите функцију" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "Пошаљите повратне информације" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "Приложите неки динар пројекту" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "Приложите неки динар путем Пеј-Пола" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "Развијам Разноврсност у моје слободно време, што обично значи у касним сатима након што моја деца оду на спавање. Сваки износ који будете приложили биће цењен. То ће ми показати да ви — и корисници — цените Разноврсност, и то ће ме мотивисати да наставим активно да радим на њему.\n" "\n" "Хвала вам,\n" "Питер Леви" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Добро дошли у Разноврсност!" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "Настави" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" "Разноврсност је самостални измењивач позадина. Кружи кроз ваше позадине " "радне површи на редовној основи користећи месне слике или слике преузете из " "различитих извора на мрежи. Ради тихо у позадини — да управљате њиме, " "притисните на ову иконицу у системској фиоци:" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" "Разноврсност је софтвер отвореног кода, који је приредио Питер Леви, " "програмер из бугарске. Ако вам се свиђа, приложите неки динар." #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "Сада одвојте мало времена да подесите поставке на следећим екранима." variety-0.8.13/po/tr.po000066400000000000000000001716071475753071700147250ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:05+0000\n" "Last-Translator: James Lu , 2021\n" "Language-Team: Turkish (https://www.transifex.com/variety/teams/123174/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "Resim bulunamadı" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "Bir dizin seç" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "Vazgeç" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "Tamam" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "Getiriliyor" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "Bir Resim değil" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "Görüntü çok küçük, görmezden geliyor" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "Üzgünüm, %s hatası var ..." #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "Bu, bağlantının artık geçerli olmadığı anlamına gelir" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "Getirme bazı nedenlerden dolayı başarısız oldu" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "" "Daha fazla bilgi almak için, lütfen Variety'yi terminalden -v seçeneğiyle " "çalıştırın ve eylemi yeniden deneyin" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "_Sonraki" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "_Önceki" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "Şimdiki masaüstü duvar kağıdı" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "Kökeni göster" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "_Sık Kullanılanlara Kopyala" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "Sık Kullanılanlara Taşı" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "_Çöpe Gönder" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "_İleri, ilerleme geçmişi atlanarak" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "İpucu: İleri veya Geri için simge\n" "üzerinde kaydırma tekerleği kullan" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "Geçerlide duraklat" #: ../variety/indicator.py:140 msgid "_Image" msgstr "_Resim" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "Bu nereden?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "Etkiler olmadan göster" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "Google Resim Arama" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "EXIF Puanını Ayarla" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "Sık Kullanılanlara Kaydet" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "Sık Kullanılanları Görüntüle..." #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "Panoya Kopyala" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "Google Alıntısı" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "Google Yazarı" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "Tercihler..." #: ../variety/indicator.py:250 msgid "Turn off" msgstr "Kapat" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "_Alıntı" #: ../variety/indicator.py:262 msgid "_History" msgstr "_Geçmiş" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "Duvar Kağıdı Seçici" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "Son _İndirilenler" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "Slayt Gösterisi Başlat" #: ../variety/indicator.py:300 msgid "About" msgstr "Hakkında" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "Bağış Yap" #: ../variety/indicator.py:308 msgid "Quit" msgstr "Çık" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "Sonlandırma sinyali alındı, çıkılıyor ..." #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Variety zaten çalışıyor. Komutu çalışan örneğe gönderme." #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr "" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Variety Tercihleri" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "Tümü" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "Resimler" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "Dizinler" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "Kaynağı kaldır, dosyaları sakla" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "Kaynakları kaldır, dosyaları sakla" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "Kaynağı kaldır ve indirilen dosyaları sil" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "Kaynakları kaldır ve indirilen dosyaları sil" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "Resimleri Ekle" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "Ekle" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Dizinleri Ekle - Sadece kök dizinleri ekleyin, alt dizinler tekrarlı olarak " "aranır" #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "Düzenle..." #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "Dizin Aç" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "Resmi Görüntüle" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "Yazma izni yok" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "İzinler ayarlanamadı" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Bu komutu elle çalıştırmayı deneyebilirsiniz:\n" "sudo chmod %s \"%s\"" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "Alıntı eklentisi yok" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "Kurulu alıntı eklentisi yok" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "Uygun alıntı eklentisi yok" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "" "Anahtar kelimelere ve yazarlara göre arama yapmayı destekleyen alıntı " "eklentileriniz yok" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "Alıntı alınamadı" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "Alıntıların hizmetleri düşebilir, denemeye devam edeceğiz" #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "Alıntılar bulunamadı" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "Belki çok belirsiz bir şey arıyor olabilir misin?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "Aslını koru" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "Gri tonlama" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "Ağır bulanıklık" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "Hafif bulanıklık" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "Yağlı boya" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "Pointilizm" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "Pikselleştir" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "Sık Kullanılanlar dizini" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "Getirilenler dizini" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "" "Variety tarafından önerilir. Resimleri sık kullanılan veya çöp olarak " "işaretlediğinizde zevkinize uyar." #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" "Variety'nin diğer kullanıcıları tarafından en son sık kullanılanlar. [NSFW " "görüntüleri içerebilir]" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Desktoppr.co'dan rastgele duvar kağıtları" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "NASA'nın Günün Astronomi Resmi" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "Günün Bing Fotoğrafı" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "Unsplash.com'dan yüksek çözünürlüklü fotoğraflar" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" "Duvar kağıdını gösterge simgesinin üstünde fare tekerleğini kaydırarak ileri" " ve geri değiştirebilirsiniz." #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" "Variety komut satırından kontrol edilebilir ve bunu en sık kullandığınız " "işlemler için klavye kısayollarını tanımlamakta kullanabilirsiniz. " "Kullanılabilir tüm komutları görmek için \"variety -help\" kullanın." #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" "İndirmek ve duvar kağıdı olarak kullanmak için başlatıcı simgesine resim " "bağlantıları veya dosyaları bırakabilirsiniz. Belirli bir siteden daha hızlı" " indirme için pano izleme de kullanabilirsiniz (bkz. \"Elle indirme\" " "sekmesi)." #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" "Ağır bir bulanıklaştırma etkisi uygulamak, Ubuntu'daki varsayılana benzer " "soyut ve göze batmayan, ancak renkli duvar kağıtları elde etmenin harika bir" " yoludur." #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" "Bir görüntü kaynağını seçtiğinizde, görüntüler ekranın altındaki bir " "pencerede görüntülenir. Bir görüntüyü duvar kağıdı olarak ayarlamak için " "tıklayın. Pencereyi kapatmak, görünümünü değiştirmek veya dosya işlemleri " "yapmak için sağ tıklayın. Hepsinin \"birleştirilmiş\" küçük resim görünümünü" " oluşturmak için birden fazla resim kaynağı seçebilirsiniz. Lütfen küçük " "resim görünümünün yüzlerce rastgele seçilmiş görüntü ile sınırlı olduğunu " "unutmayın." #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" "Variety'in gösterge simgesi temalanabilir - simge için \"Light\" seçeneğini " "seçerseniz Variety öncelikle mevcut GTK temasının \"variety-indicator\" adlı" " bir simgeye sahip olup olmadığını kontrol eder ve paketlenmiş Light simgesi" " yerine bunu kullanır ." #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "Alt" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Üst" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Sol" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "Sağ" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "Konum" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "Boyut" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "İçeren Dizini Göster" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "Getirildi: Kökeni Göster" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "%s'de görüntüle" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "_Sık Kullanılanlara Taşı" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "Kapat" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "EXIF derecelendirmesi ayarlanamadı" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "Derecelendirilmemiş" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "Reddedilen" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "Variety Geçmişi" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Variety Son İndirilenler" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Variety Resimleri" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "Çalışan örneğini bırak" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" "Geçerli duvar kağıdı konumunu yazdır. Sadece uygulama zaten çalışıyorsa " "kullanılır." #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "Sonraki Duvar Kağıdını Göster" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "Önceki Duvar Kağıdını Göster" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "İlerleme geçmişini atlayarak Sonraki duvar kağıdını göster" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Geçerli duvar kağıdını Çöpe taşı. Sadece uygulama zaten çalışıyorsa " "kullanılır." #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Geçerli duvar kağıdını Sık Kullanılanlara kopyala. Sadece uygulama zaten " "çalışıyorsa kullanılır." #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Geçerli duvar kağıdını Sık Kullanılanlara taşı. Sadece uygulama zaten " "çalışıyorsa kullanılır." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "Geçerli resimde durakla" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "Düzenli resim değişikliklerine devam et" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "Durdurma/Devam Geçişi durumu" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "Sonraki alıntıyı göster" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "Önceki alıntıyı göster" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "İlerleme geçmişini atlayarak Sonraki alıntıyı göster" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "Alıntıların Geçişini Durdur/Devam durumu" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "Geçerli alıntıyı Sık Kullanılanlara kaydet" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "Tarih görünümünü değiştir" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "Son İndirilenler ekranını değiştir" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "Tercihler iletişim kutusunu göster" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Elle duvar kağıdı seçiciyi göster - etkin resim kaynaklarından görüntülerle " "dolu küçük resim çubuğu" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" "Bir seçenek belirler ve uygular. Seçenek isimleri Variety'nin yapılandırma " "dosyası ~/.config/variety/variety.conf'da kullanılanla aynıdır. Tek bir " "komutta çoklu seçenekler ayarlanabilir. Örnek: 'variety --set-option icon " "Dark --set-option clock_enabled True'. DİKKATLİ KULLAN: Ayar dosyasını " "doğrudan korumasız bir şekilde değiştiriyorsunuz." #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "" "seçenekler --next/--fast-forward ve --previous karşılıklı olarak " "ayrıcalıklıdır" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "seçenekler --trash ve --favorite karşılıklı olarak ayrıcalıklıdır" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "seçenekler --pause ve --resume karşılıklı olarak ayrıcalıklıdır" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "--quotes-next/--quotes-fast-forward ve --quotes-previous seçenekleri " "birbirini dışlar" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "Zaten Sık Kullanılanlarda" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "Bilinmeyen" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "Yazar: %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "Düzenli değişiklikleri devam ettir" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "Süzme çok mu katı?" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "Variety, resim süzme ölçütlerinize uyan çok az resim buluyor" #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "" "Lütfen daha fazla resim kaynağı ekleyin yada bazı indirmeleri bekleyin" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "Lütfen daha fazla resim kaynağı ekleyin" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "Daha fazla duvar kağıdı yok" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "Geçerli duvar kağıdı resim kaynaklarında değil" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "" "%s konumuna taşınamadı. Büyük olasılıkla bu dosyayı taşımak için izinleriniz" " yok." #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" "%s konumuna kopyalanamadı. Büyük olasılıkla bu dosyayı kopyalamak için " "izniniz yok." #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "Silinemedi" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "%s dosyasını çöp kutusuna göndermek için izniniz yok." #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" "Çöpe gönderme başarısız, daha fazla bilgi için variety.log dosyasını kontrol" " edin." #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "" "Yapılandırma dosyasıyla bir editör açacağım ve sen değişiklikleri kaydedip " "kapattıktan sonra değişiklikleri uygulayacağım." #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "Sıraya eklendi" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "Görmek için İleri'ye basın" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "Getirildi" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "Desteklenmeyen kaynak türü" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "Variety'nin en son sürümünü mü kullanıyorsunuz?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "Yeni resim kaynağı eklendi" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "Resim kaynağı zaten var, onu etkinleştirin" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "Getirildi ve uygulandı" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "İşe yarıyor!" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "Variety bağlantıları çalışıyor. Harika!" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "Desteklenmeyen komut" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "Verilen variety:// URL işlenemedi" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "Ayrıntıları görmek için günlüğe kaydetme ile çalıştır" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "Otomatik başlatma girişi oluşturulamadı" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "Otomatik başlatma masaüstü girişi oluşturulurken bir hata oluştu\n" "Lütfen bir terminalden -v bayrağıyla çalıştırın ve tekrar deneyin." #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "Resim yok" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "Slayt gösterisi dizinlerinde resim yok" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "Variety Hakkında" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Otomatik bir duvar kağıdı değiştirici, indirici ve yönetici." #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr "" #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Variety - Flickr'ı bir resim kaynağı olarak ekle" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" "Lütfen Flickr arama kriterlerini belirtin." " Seçilen kriterlerin hepsine uyan fotoğraflar indirilecektir. Gereksiz " "kriterleri boş bırakın." #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "Etiketler: " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "Virgülle ayrılmış bir etiket listesi. Bir fotoğrafın eşleşmesi için hepsini aynı anda içermesi gerekir.\n" "Örnek: sarı,araba" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "Kullanıcı: " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "Lütfen URL'yi kullanıcının fotoğraf akışına veya fotoğraflarından birine ekleyin.\n" "Örnek: http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "Grup: " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "Lütfen grubun URL'sini ekleyin.\n" "Örnek: http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "Metin:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "Fotoğrafların başlıklarında, açıklamalarında ve etiketlerinde serbest metin araması. Şartları - ile hazırlayarak hariç tutun.\n" "Örnek: apple -pie" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "Bu aramayı kontrol etmek için sadece bir dakika" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Sık Kullanılanlara Kopyala vs. Sık Kullanılanlara Taşı" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "Varsayılana Sıfırla" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "" "Görüntü konumuna bağlı olarak, menüden 'Sık Kullanılanlara Kopyala' veya'Sık" " Kullanılanlara Taşı' tercihinizi seçin:" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "Lütfen her satır başına bir giriş, :, Dizinin İndirilebileceği, Getirilen, Diğerleri veya belirli birdizin yolunun bulunduğu bir biçimde giriş girin.\n" "Düzen önemlidir. Bir resim gösterildiğinde, bu listedeki görüntüyü içeren ilk dizin Variety'nin menüsünde hangi işlemlerin gösterileceğini belirler. 'Diğerleri' herhangi bir dosyayla eşleşir ve listede sonuncu olmalıdır.\n" "\n" "Örnek:\n" "\tİndirilenler:Kopyala\n" "\tGetirilenler:Taşı\n" "\t/resimler/RastgeleResimler:Taşı\n" "\t/resimler/DüzenlenmişAlbümler:Kopyala\n" "\tDiğerleri:Her ikiside" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "saniye" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "dakika" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "saat" #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "gün" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "Genel" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "Bilgisayar başladığında Variety'i başlat" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "Her duvar kağıdını değiştir " #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "En az aralık 5 saniyedir" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "Başlangıçta duvar kağıdını değiştir" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "Etkin" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "Tür" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "Konum" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "_Ekle..." #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "Resimler, dizinler veya çevrimiçi resim kaynakları ekle" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "Seçilen kaynağı düzenle" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "_Düzenle..." #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "_Kaldır..." #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "Seçilen resim kaynaklarını kaldır" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "_Kullan" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "Seçilen kaynakları etkinleştir ve diğerlerini devre dışı bırak" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "Sık Kullanılanlar" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "Sık kullanılan duvar kağıtlarını kopyala " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "Süzgeçler" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" "Bu süzgeçleri görüntülenen duvar kağıtlarına rastgele uygulayın (harika " "ImageMagick'e teşekkürler):" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "Alıntılar" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "Masaüstünde rastgele akıllı alıntıları göster" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "Metin rengi: " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "Metin yazı tipi: " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "Zemin rengi: " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "Zemin matlığı: " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " Saydam" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "Mat" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "Metin gölgesi çiz" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "Görünüm" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "Alıntıların alan genişliği: " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "Dar " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "Geniş" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "Yatay konum: " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "Sol " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "Dikey konum: " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "Üst " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "Yerleştirme" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "Bu kaynaklardan alıntıları göster: " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" "Daha fazla " "eklenti" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" "Sadece bu etiketleri ve yazarları göster. Rastgele alıntıları göstermek için" " boş bırakın." #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "Örnek: komik, ilham verici" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "Örnek: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "Yazarlar: " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "Kaynaklar ve süzme" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "Her alıntıyı değiştir " #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "En az aralık 10 saniyedir" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "Düzenli değişim" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "Saat" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "" "Masaüstünde şu anki saati ve tarihi gösteren güzel bir dijital saat göster" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "Saatin görünümünü yapılandırmak için Variety'nin ayarlar dosyasındaki " "clock_filter özelliğini düzenleyin (~/.config/variety/variety.conf). " "~/.config/variety/variety_latest_default.conf dosyasındaki yorumları kılavuz" " olarak kullanın." #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "Saat yazı tipi: " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "Tarih yazı tipi: " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "Bunlar çalışmıyor mu? Burayı oku. " "Saat nasıl yapılandırılır? Burayı okuyun." #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "Etkiler" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "Slayt gösterisi için resimler" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "Sık kullanılan resimler" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "Tüm etkin resim kaynaklarındaki resimler" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "İndirilenler dizinindeki tüm resimler" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "Özel dizin (alt dizinlerdeki görüntüleri içerir) " #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "Slayt gösterisindeki resimlerin sırası " #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "Rastgele" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "A'dan Z'ye isimle" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "Z'den A'ya isimle" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "En eski tarihle" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "En yeni tarihle" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "Ekran" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "Monitörde çalıştır" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "Slayt gösterisi için pencere modu " #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "Tam ekran" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "Masaüstü (diğer pencerelerin altında kalır)" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "Büyütülen pencere" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "Normal pencere" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "Dinamik" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "Görüntü değişiklikleri arasındaki mesafe " #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr " saniye" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "Hızlı solma " #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "Yavaş solma" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "Daha az yakınlaştırma" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "Daha fazla yakınlaştırma" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "Daha az göster" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "Daha fazla göster" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "Varsayılana sıfırla" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" "Slayt gösterisi yeniden başlatıldıktan sonra bu sayfadaki değişiklikler " "etkili olur" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "Slay gösterisini şimdi başlat" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "Slayt gösterisi" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "Dizini getir" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "Elle indirilen duvar kağıtlarını kaydet " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "Sürükle ve bırak" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "Variety'nin simgesi başlatıcıda bir bırakma hedefi olarak hizmet veriyor. Üzerine herhangi bir resim URL'sini veya dosyayı bırakın ve getirme dizinine kaydedilecektir. Daha sonra düğmesine basabilirsiniz. Masaüstünüzde görmek için ilerleyin.\n" "Başlatıcıdaki simgeyi göstermek için Hakkında veya Tercihler'i seçin. Kolay sürükle-bırak erişimi için orada kilitlemek isteyebilirsiniz." #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "Pano izleme" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Resim URL'leri için panoya göz atın ve onları getirin" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "Ancak, yalnızca URL sunucusu bunlardan biri olduğunda getir:" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "Elle indirme" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "Mümkün olduğunda görüntüleri kullanın:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "Manzara yönlendirmesi var" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "En azından büyükler " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "Ekran çözünürlüğünün yüzdesi" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "Renk" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "Koyu veya aydınlık:" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Koyu" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Aydınlık" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "Bu rengi içerir: " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(İlk aramadan sonra etkili olur)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "Değerlendirme" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "En az EXIF değerlendirmesi var " #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "Renk ve boyut" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "Gösterge Simgesi" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "Gösterge simgesi:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "Aydınlık" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "Koyu" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Geçerli duvar kağıdını kullan" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "Özel resim..." #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "Yok" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "Bir simge seç" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" "Simge gizlendiğinde, Variety komut satırından veya başlatıcı hızlı " "listesinden kontrol edilebilir. Kullanılabilir tüm komutları görmek için " "\"variety --help\" komutunu çalıştırın." #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "Sık Kullanılanlar İşlemleri" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "Ana menüde gösterilecek sık kullanılan işlemler:" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "Sık kullanılanlara kopyala" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "Hem Kopyala hem de Taşı" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "Dizine bağlı ..." #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "Giriş Ekranı Desteği" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "Variety tarafından ayarlanan duvar kağıtlarının giriş ekranında " "kullanılacağından emin olun" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" "Gizlilik uyarısı: Duvar kağıdınızı göstermek için LightDM görüntü " "üzerinde okuma izinlerine ihtiyaç duyar. Bu seçenek açık olduğunda, Variety " "duvar kağıtlarını herkese açık bir dizine kopyalar ve herkes tarafından " "okunabilir hale getirmek için izinlerini değiştirir. Varsayılan olarak, " "dizin, ev dizininiz şifrelenmemişse ve /usr/share/backgrounds ise ~/Pictures" " dizinidir. Çok kullanıcılı sistemlerde dikkatli kullanın." #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "Duvar kağıdı görüntü dosyalarını bu dizine kopyalayın: " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "Varsayılana sıfırla" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "Hala çalışmıyor mu?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Ev dizininiz şifreli görünüyor, bu yüzden içindeki dizinleri kullanmak işe " "yaramayacak." #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "Bu dizin için yazma izniniz yok." #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "İzinler, LightDM'nin bu dizindeki dosyaları okumasına izin vermez." #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "Variety izinleri ayarlayabilir, ancak süper kullanıcı ayrıcalıkları vermeniz" " gerekir." #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "Özelleştirme" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "Ipuçları ve Püf noktaları" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "Son değişiklikler" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "Siteyi ziyaret et" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "Bir hatayı bildirin veya bir özellik isteyin" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "Geribildirim gönder" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "Variety'e bağış yap" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "PayPal ile bağış yapın" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "Boş zamanlarımda Variety'yi geliştiriyorum, bu da genellikle çocuklarımın yatağına gittiği geç saatler anlamına geliyor. Bağışladığınız herhangi bir miktar takdir edilecek. Bu bana Variety'nin sizin tarafınızdan - kullanıcılar - değer verildiğini gösterecek ve aktif olarak çalışmaya devam etmem için beni motive edecek.\n" "\n" "Teşekkür ederim,\n" "Peter Levi" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Variety'e hoşgeldiniz!" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "Devam" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" "Variety bir otomatik duvar kağıdı değiştiricidir. Çeşitli çevrimiçi " "kaynaklardan indirilen resimler veya yerel resimler kullanarak masaüstü " "duvar kağıdınızı düzenli olarak döndürür. Arkaplanda sessizce çalışır - " "kontrol etmek için sistem çekmecenizdeki simgeye tıklayın:" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" "Variety, Bulgaristan'dan bir yazılım geliştiricisi olan Peter Levi " "tarafından oluşturulan açık kaynaklı bir yazılımdır. Beğendiysen lütfen bağış yap." #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" "Şimdi tercihlerinizi aşağıdaki ekranlarda ayarlamak için biraz zaman ayırın." variety-0.8.13/po/uk.po000066400000000000000000002141621475753071700147110ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:05+0000\n" "Last-Translator: James Lu , 2021\n" "Language-Team: Ukrainian (https://www.transifex.com/variety/teams/123174/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "Зображень не знайдено" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "Оберіть теку" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "Скасувати" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "Так" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "Отримання" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "Не є зображенням" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "Зображення надто мале, нехтуємо" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "Нажаль сталася помилка %s..." #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "Це не означає, що посилання більше не дійсне" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "Отримання перервано з певних причин" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "" "Для отримання докладнішої інформації, будь-ласка, запустіть Variety з " "терміналу з параметром -v та повторіть дію" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "Наступні" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "Попередні" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "Поточне зображення на стільниці" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "Показати оригінал" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "Копіювати у Вибрані" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "Перемістити у Вибрані" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "Вилучити у смітник" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "_Далі, пропускаючи вперед історію" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Порада: гортайте шпалери\n" "крутячи коліщатко миші на індикаторі" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "Призупинити на поточному" #: ../variety/indicator.py:140 msgid "_Image" msgstr "_Зображення" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "Звідкіля це?" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "Показати без ефектів" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "Пошук зображень на Google" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "Встановити EXIF рейтиг" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "Зберегти у Вибраних" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "Дивитися Вибрані..." #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "Копіювати до буферу обміну" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "Поґуглити цитату" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "Поґуглити автора" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "Налаштування…" #: ../variety/indicator.py:250 msgid "Turn off" msgstr "Вимкнути" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "_Цитата" #: ../variety/indicator.py:262 msgid "_History" msgstr "Історія" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "_Перемикач шпалер" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "Нові завантаження" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "Почати показ слайдів" #: ../variety/indicator.py:300 msgid "About" msgstr "Про проґраму" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "Пожертвувати" #: ../variety/indicator.py:308 msgid "Quit" msgstr "Вийти" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "Отримано сигнал припинення роботи — вихід…" #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Variety вже працює. Надсилання команди до запущеного примірника." #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr "" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Налаштування Variety" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "Усі" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "Зображення" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "Теки" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "Вилучити джерело, зберегти файли" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "Вилучити джерела, зберегти файли" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "Вилучити джерело й завантажені файли" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "Вилучити джерела й завантажені файли" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "Додати зображення" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "Додати" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Додати теки — додавайте лише кореневі теки, пошук у підтеках рекурсивний" #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "Змінити…" #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "Відкрити теку" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "Показати зображення" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "Немає прав для запису" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "Не вдалося змінити права" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Ви можете спробувати вручну виконати команду:\n" "sudo chmod %s \"%s\"" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "Додатки для цитат відсутні" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "Не встановлено жодного додатку для отримання цитат" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "Немає відповідного додатку для цитат" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "" "В Вас відсутні додатки з підтримкою пошуку за ключовими словами чи за " "автором" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "Не можу отримати цитати" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "" "Можливо сервіс цитат недоступний зараз, ми продовжимо спроби під’єднатися" #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "Не вдалося знайти цитати." #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "Можливо Ви шукаєте щось вельми темне?" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "Зберегти оригінал" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "Тони сірого" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "Жорстке розмиття" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "М’яке розмиття" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "Малювання олійною фарбою" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "Пуантилізм" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "Пікселізація" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "Вибрані" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "Завантажені вручну" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "" "Раджено Variety. Відповідно до Вашого смаку, віднести зображення до Вибраних" " або позначити як сміття." #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" "Останні вибрані зображення інших користувачів Variety. [Можуть бути " "неприйнятними (NSFW )]" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "Випадкові шпалери з Desktoppr.co" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "NASA: астрономічна світлина дня" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "Світлина дня від Bing" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "Світлина високої роздільности із Unsplash.com" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "Ви можете змінювати шпалери прокручуванням коліща миші на індикаторі." #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" "Variety можна керувати з командного рядка, наприклад, призначити гарячі " "клявіші для дій що часто використовуються. Запустіть «variety --help», аби " "побачити усі доступні команди." #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" "Ви можете перетягувати посилання на зображення або файли, на піктограму у " "панелі запуску для їх завантаження та використання у якости шпалер. Для " "швидкого завантаження зі специфічних сайтів, Ви також можете використовувати" " стеження за буфером обміну (див. вкладку «Ручне завантаження»)." #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" "Використання фільтру жорсткого розмиття — кращий спосіб отримати абстрактні," " ненав’язливі, але, у той же час, барвисті шпалери, подібні стандартним в " "Ubuntu." #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" "Коли Ви виберете джерело зображень, його вміст з’явиться у вікні у долішній " "частині екрану. Клацніть там по зображенню, щоб призначити його шпалерами. " "Клацніть правою кнопкою миші, щоб закрити вікно, змінити його зовнішній " "вигляд або виконати дії з файлами. Ви можете вибрати декілька джерел для " "«об’єднаного» перегляду ескізів. Зверніть увагу, що перегляд мініатюр " "обмежений декількома сотнями випадково вибраних зображень." #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" "Піктограма індикатора Variety підтримує теми: якщо Ви виберете «Світлий» " "вигляд, то Variety перш перевірить, чи є у поточній GTK-темі піктограма " "«variety-indicator», й використає її замість вбудованої." #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "Знизу" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Згори" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Ліворуч" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "Праворуч" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "Розташування" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "Розмір" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "Показати у теці" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "Обране: Показати оригінали" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "Показати на %s" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "Перемістити у Вибрані" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "Закрити" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "Не вдалося записати оцінку в EXIF" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "Без оцінки" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "Відхилено" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "Історія Variety" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Нові завантаження Variety" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Зображення Variety" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "Вийти із запущеного примірника" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" "Показати шлях до зображення зі стільниці. Працює лише при запущеному " "застосунку." #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "Показати наступні шпалери" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "Показати попередні шпалери" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "Показати наступне зображення нехтуючи історію" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Перемістити поточні шпалери до смітника. Працює лише при запущеному " "застосунку." #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Копіювати поточні шпалери у Вибрані. Працює лише при запущеному застосунку." #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Перемістити поточні шпалери у Вибрані. Працює лише при запущеному " "застосунку." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "Призупинити на поточному зображенні" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "Відновити регулярне змінювання зображень" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "Перемикання Призупинити/Відтворити" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "Показати наступну цитату" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "Показати попередню цитату" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "Показати наступну цитату нехтуючи історію" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "Перемикання Призупинити/Відтворити для цитат" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "Зберегти поточну цитату у Вибраних" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "Перемикнути показ історії" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "Перемикнути показ останніх завантажень" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "Показати діялоґ налаштувань" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Показати перемикач шпалер — панель ескізів зображень з активних інтернет-" "джерел" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" "Встановлення та застосування параметрів. Назви параметрів ті самі що й у " "файлі налаштувань ~/.config/variety/variety.conf. Декілька параметрів можна " "вказати однією командою. Приклад: 'variety --set-option icon Dark --set-" "option clock_enabled True'. ВИКОРИСТОВУЙТЕ З ОБЕРЕЖНІСТЮ: Ви змінюєте файл " "налаштувань безпосередньо без механізмів перевірки коректности параметрів." #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "параметри --next/--fast-forward та --previous є взаємовиключними" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "параметри --trash та --favorite є взаємовиключними" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "параметри --pause та --resume є взаємовиключними" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "параметри --quotes-next/--quotes-fast-forward та --quotes-previous є " "взаємовиключними" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "Завжди у Вибрані" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "Невідомо" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "Автор: %s" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "Відновити регулярні зміни" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "Фільтр занадто суворий?" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "" "Variety знаходить замало світлин, які відповідають Вашим критеріям " "фільтрації зображень" #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "" "Будь-ласка, додайте більше джерел зображень або дочекайтеся завантаження" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "Будь-ласка, додайте більше джерел зображень" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "Зображень більше немає" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "Це зображення відсутнє у джерелі" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "Не можу перенести у %s. Можливо не вистачає прав для переміщення." #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "Не можу скопіювати %s. Можливо не вистачає прав для копіювання." #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "Не можу вилучити" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "У Вас немає прав для вилучення %s у смітник." #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" "Не вдалося вилучити до смітника, щоб дізнатися подробиці, перевірте " "variety.log." #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "" "Буде відкритий редактор із файлом налаштувань, зміни будуть застосовані " "після того як ви збережете файл та закриєте редактор." #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "Додано до цитат" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "Натисніть Далі для перегляду" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "Отримані" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "Непідтримуваний тип джерела" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "Чи Ваша версія Variety найновіша?" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "Нове джерело зображень додано" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "Таке джерело зображень вже існує, вмикаю його" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "Завантажено та застосовано" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "Це працює!" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "Вау, посилання Variety працюють. Чудово!" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "Команда не підтримується" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "Не вдалося опрацювати дану variety:// URL" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "Запустити з журналюванням, щоб бачити подробиці" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "Не вдалося створити запис в автозавантаженні" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" "Помилка при створенні пункту автозавантаження\n" "Будь-ласка, запустіть у терміналі з параметром -v й спробуйте ще раз." #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "Зображення відсутні" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "Немає зображень у теках для перегляду слайдів" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "Про Variety" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Автоматичний змінювач, завантажувач та керівник шпалер." #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr "" #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Variety — додати Flickr як джерело зображень" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" "Будь-ласка, вкажіть умови пошуку на Flickr. Буде завантажено лише світлини які " "відповідають усім умовам. Залиште непотрібні поля порожніми." #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "Теґи: " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "Перелік теґів, розділених комою. Світлина повинна містити їх усі одночасно,\n" "Приклад: жовтий,машина" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "Користувач: " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" "Будь-ласка, вкажіть URL галереї користувача або однієї з його світлин.\n" "Приклад: http://www.flickr.com/photos/peter-levi/" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "Група: " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" "Будь-ласка, вставте адресу URL групи.\n" "Приклад: http://www.flickr.com/groups/wallpapers/" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "Текст:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "Вільний пошук за текстом заголовків, описів та теґів світлин. Параметри, що виключаються випереджуються знаком -.\n" "Приклад: яблучний -пиріг" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "Хвилинку, перевірка пошукового запиту" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Копіювати або перемістити у Вибрані" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "Перевстановити типові налаштування" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "" "Виберіть, чи Ви бажаєте бачити у меню 'Копіювати у Вибрані' чи 'Перемісти у " "Вибрані', залежно від розташування зображення:" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" "Будь-ласка, робіть по одному запису на лінію, усі пункти повинні виглядати як: <Тека>:, де текою можуть бути Downloaded, Fetched, Others або шлях до певної локальної теки.\n" "Порядок важливий. Коли буде показано зображення, перша тека у переліку, що містить зображення, визначить, які операції покажуться в меню Variety. 'Others' повинно бути у кінці переліку, тому що будь-який файл входить до цієї категорії.\n" "\n" "Приклад (Пишіть саме англійською):\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "секунд(и)" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "хвилин(и)" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "годин(и)" #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "дні(в)" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "Загальні" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "Запускати Variety при старті системи" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "Змінювати шпалери кожні " #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "Мінімальний інтервал 5 секунд" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "Змінювати шпалери при запуску" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "Увімкнено" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "Тип" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "Розташування" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "_Додати…" #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "Додати зображення, теки або інтернет-джерела" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "Змінити виділене джерело" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "З_мінити…" #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "_Вилучити…" #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "Вилучити виділені джерела зображень" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "_Застосувати…" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "Увімкнути вибрані джерела та від’єднати решту" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "Вибрані" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "Копіювати вибрані шпалери у " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "Фільтри" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" "Застосовувати випадкові фільтри до виведених на екран шпалер (дякуємо " "чудовому ImageMagick)" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "Цитати" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "Показати випадкові афоризми на стільниці" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "Колір тексту: " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "Шрифт тексту: " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "Колір тла: " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "Прозорість тла: " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " Прозорий" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "Непрозорий" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "Показувати тінь від тексту" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "Зовнішній вигляд" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "Ширина ділянки цитат: " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "Вузька " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "Широка" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "Горизонтальне розташування: " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "Ліворуч " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "Вертикальне розташування: " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "Вгорі " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "Розташування" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "Показувати цитати з цих джерел: " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" "Більше " "додатків" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" "Показувати лише для цих теґів та авторів. Залиште порожнім щоб показувати " "випадкові цитати." #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "Приклад: funny, inspirational" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "Приклад: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "Автори: " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "Джерела та фільтрування" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "Змінювати цитату через " #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "Мінімальний інтервал 10 секунд" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "Постійна зміна" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "Годинник" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "" "Показувати на стільниці великий цифровий годинник з поточним часом та датою" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "Налаштуйте зовнішній вигляд годинника, змінюючи параметр the clock_filter у " "файлі налаштувань Variety (~/.config/variety/variety.conf). У якости " "посібника використовуйте коментарі у " "~/.config/variety/variety_latest_default.conf." #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "Шрифт годинника: " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "Шрифт дати: " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "Не працює? Читай" " тут. Як ще налаштувати годинник? Прочитай тут." #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "Ефекти" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "Зображення для показу слайдів" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "Улюблені зображення" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "Зображення з усіх під’єднаних джерел" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "Усі зображення з теки Downloads" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "Тека за вибором (включаючи зображення із підтек) " #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "Порядок зображень при показі слайдів " #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "Випадково" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "За ім’ям, від А до Я" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "За ім’ям, від Я до А" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "За датою, спочатку старі" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "За датою, спочатку нові" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "Екран" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "Запустити на моніторі" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "Віконний режим для показу слайдів " #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "На увесь екран" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "Стільниця (залишається під іншими вікнами)" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "Розгорнуте вікно" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "Звичайне вікно" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "Динаміка" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "Інтервал між зміною зображень " #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr " секунди" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "Швидке зникнення " #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "Повільне зникнення" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "Менше збільшень" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "Більше збільшень" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "Менше зсувів" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "Більше зсувів" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "Скинути налаштування" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" "Зміни на цій сторінці будуть застосовані після перезапуску показу слайдів" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "Почати показ слайдів" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "Показ слайдів" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "Завантажені вручну" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "Зберегти завантажені вручну зображення у " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "Перетягування" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" "Піктограма Variety на панелі запуску може слугувати метою для перетягування. Перетягніть будь-яку URL зображення або файл прямо на неї, й вони збережуться у теку завантажених вручну зображень. Потім ви можете натиснути кнопку Далі, щоб побачити їх на стільниці.\n" "Щоб піктограма показалася у панелі запуску, виберіть пункт меню Про проґраму або Налаштування. Ви можете закріпити її там для простого доступу до функції перетягування." #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "Стеження за буфером обміну" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "" "Стежити за буфером обміну при виявлені там адреси зображення, завантажувати " "їх" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "Завантажувати, лише якщо URL хосту один з наступних" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "Ручне завантаження" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "За можливістю використовувати зображення які:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "Мають альбомну орієтацію" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "Принаймні " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "% від розміру екрану" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "Колір" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "Темні або світлі:" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Темні" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Світлі" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "Містять цей колір: " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "(Вступає у силу після деяких початкових пошуків)" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "Оцінка" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "Оцінка в EXIF не менше " #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "Колір та розмір" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "Піктограма індикатора" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "Піктограма індикатора:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "Світла" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "Темна" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Поточні шпалери" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "Вибрати зображення…" #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "Немає" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "Вибрати піктограму" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" "Коли піктограму індикатора приховано, можна керувати Variety з командного " "рядка або через переліки дій панелі запуску. Запустіть \"variety --help\" " "щоб переглянути усі доступні команди." #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "Вибрані операції" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "Вибрані операції, що показуються в основному меню:" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "Копіювати у Вибрані" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "Обидві (копіювати та перемістити)" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "Залежить від теки…" #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "Підтримка екрану входу у систему" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "Переконайтеся, що шпалери, встановлені Variety, будуть використовуватися на " "екрані входу у систему" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" "Попередження: Щоб показати Ваші шпалери, LightDM потрібен дозвіл на " "читання зображення. При увімкненні цього параметру, Variety скопіює шпалери " "у загальну теку та змінить права, так що усі користувачі будуть мати бачити " "їх. Типово це тека ~/Pictures, якщо Ваша домашня тека у не зашифрованому " "вигляді, та — /usr/share/backgrounds, якщо вона зашифрована. Будь ласка, " "використовуйте цей параметр обережно." #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "Копіювати файли шпалер для стільниці у цю теку: " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "Відновити типові значення" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "Усе ще не працює?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Здається, Вашу домашню теку зашифровано, так що використання теки в ній не " "буде працювати" #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "У Вас немає права на запис до цієї теки" #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "Права не дозволяють LightDM читати файли з цієї теки." #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "Можна налаштувати дозвіл, але Ви повинні будете надати Variety повноваження " "суперкористувача." #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "Налаштувати" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "Корисні поради" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "Останні зміни" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "Завітати на сайт" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "Звітувати про помилку або запропонувати нову функцію" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "Надіслати відгук" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "Пожертвувати на Variety" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "Пожертвувати через PayPal" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" "Я розробляю Variety у свій вільний час, який приходить звичайно у ті пізні години, коли мої діти лягають спати. Буду вдячний за будь-яку грошову підтримку. Це покаже мені, що Variety є корисною для Вас та надасть мені натхнення активніше продовжувати роботу над проґрамою.\n" "\n" "Дякую,\n" "Пітер Леві" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Ласкаво просимо до Variety!" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "Далі" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" "Variety автоматично змінює шпалери. Проґрама здійснює регулярну ротацію " "шпалер на стільниці використовуючи локальні або завантажені з різних " "інтернет-джерел зображення. Вона працює у тловому режимі - для керування " "нею, клацніть цю піктограму у системній таці:" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" "Variety є проґрамним забезпеченням з відкритим джерельним кодом, що створене" " розробником проґрамного забезпечення з Болгарії Пітером Леві. Якщо Вам ця " "проґрама подобається, будь ласка, пожертвуйте." #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" "Тепер, будь ласка, знайдіть час, щоб встановити параметри на наступних " "екранах." variety-0.8.13/po/variety.pot000066400000000000000000001430021475753071700161330ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-22 22:34-0800\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=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "" #: ../variety/display_modes.py:33 msgid "Controlled by OS settings, not by Variety. Fastest option." msgstr "" #: ../variety/display_modes.py:35 msgid "" "Display mode is controlled by your OS Appearance settings and by what is " "specified in set_wallpaper script for your desktop environment. " msgstr "" #: ../variety/display_modes.py:42 msgid "Zoom" msgstr "" #: ../variety/display_modes.py:44 msgid "" "Image is zoomed in or out so that it fully fills your primary screen. Some " "parts of the image will be cut out if its resolution is different from the " "screen's. " msgstr "" #: ../variety/display_modes.py:52 msgid "Fill with black" msgstr "" #: ../variety/display_modes.py:54 msgid "" "Image is zoomed in or out so that it fully fits within your primary screen. " "The rest of the screen is filled with black. " msgstr "" #: ../variety/display_modes.py:61 msgid "Fill with blur. Slow." msgstr "" #: ../variety/display_modes.py:63 msgid "" "Image is zoomed in or out so that it fully fits within your primary screen. " "The rest of the screen is a filled with blurred version of the image. " msgstr "" #: ../variety/display_modes.py:70 msgid "Pick dynamically between Zoom and Fill with black" msgstr "" #: ../variety/display_modes.py:72 msgid "" "Variety picks a good mode depending on image size. Images that are close to " "the screen proportions use 'Zoom'. Those that are vastly different use 'Fill " "with black'. " msgstr "" #: ../variety/display_modes.py:80 msgid "Pick dynamically between Zoom and Fill with blur. Slow." msgstr "" #: ../variety/display_modes.py:82 msgid "" "Variety picks a good mode depending on image size. Images that are close to " "the screen proportions use 'Zoom'. Those that are vastly different use 'Fill " "with blur'. " msgstr "" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:615 #: ../variety/PreferencesVarietyDialog.py:656 msgid "Cancel" msgstr "" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2581 msgid "Not an image" msgstr "" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "" #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and " "retry the action" msgstr "" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:719 msgid "Copy to _Favorites" msgstr "" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:728 #: ../data/ui/PreferencesVarietyDialog.ui:3554 msgid "Move to Favorites" msgstr "" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:863 ../variety/VarietyWindow.py:885 msgid "Pause on current" msgstr "" #: ../variety/indicator.py:140 msgid "_Image" msgstr "" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:892 msgid "Save to Favorites" msgstr "" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "" #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "" #: ../variety/indicator.py:250 msgid "Turn off" msgstr "" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "" #: ../variety/indicator.py:262 msgid "_History" msgstr "" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:300 msgid "About" msgstr "" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:4345 msgid "Donate" msgstr "" #: ../variety/indicator.py:308 msgid "Quit" msgstr "" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "" #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "" #: ../variety/PreferencesVarietyDialog.py:89 msgid " (Profile: {})" msgstr "" #: ../variety/PreferencesVarietyDialog.py:91 #: ../data/ui/PreferencesVarietyDialog.ui:122 msgid "Variety Preferences" msgstr "" #: ../variety/PreferencesVarietyDialog.py:258 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:406 #: ../variety/PreferencesVarietyDialog.py:622 #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Add individual wallpaper images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:409 msgid "Folders" msgstr "" #: ../variety/PreferencesVarietyDialog.py:410 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" #: ../variety/PreferencesVarietyDialog.py:417 msgid "Sequential Albums (order by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:418 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:425 msgid "Sequential Albums (order by date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:426 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:435 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:435 msgid "Fetch images from Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:488 msgid "Remove the source, keep the files" msgstr "" #: ../variety/PreferencesVarietyDialog.py:490 msgid "Remove the sources, keep the files" msgstr "" #: ../variety/PreferencesVarietyDialog.py:501 msgid "Remove the source and delete the downloaded files" msgstr "" #: ../variety/PreferencesVarietyDialog.py:503 msgid "Remove the sources and delete the downloaded files" msgstr "" #: ../variety/PreferencesVarietyDialog.py:538 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" #: ../variety/PreferencesVarietyDialog.py:612 msgid "Add Images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:615 #: ../variety/PreferencesVarietyDialog.py:656 msgid "Add" msgstr "" #: ../variety/PreferencesVarietyDialog.py:640 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" #: ../variety/PreferencesVarietyDialog.py:644 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:648 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:810 #: ../data/ui/PreferencesVarietyDialog.ui:3569 msgid "Edit..." msgstr "" #: ../variety/PreferencesVarietyDialog.py:812 msgid "Open Folder" msgstr "" #: ../variety/PreferencesVarietyDialog.py:818 msgid "View Image" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1216 #: ../variety/PreferencesVarietyDialog.py:1223 msgid "No write permissions" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1298 msgid "Could not adjust permissions" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1299 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" #: ../variety/QuotesEngine.py:248 msgid "No suitable quote plugins" msgstr "" #: ../variety/QuotesEngine.py:250 msgid "" "There are no quote plugins installed, enabled and applicable for the current " "settings" msgstr "" #: ../variety/QuotesEngine.py:267 msgid "Could not fetch quotes" msgstr "" #: ../variety/QuotesEngine.py:268 msgid "Quotes services may be down, we will continue trying" msgstr "" #: ../variety/QuotesEngine.py:272 msgid "Could not find quotes" msgstr "" #: ../variety/QuotesEngine.py:273 msgid "Maybe you are searching for something very obscure?" msgstr "" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "" #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" #: ../variety/Texts.py:57 msgid "" "You can configure how the wallpaper scales, zooms or tiles directly from the " "Appearance/Background settings in your OS. Variety sets which image to show, " "but does not tell the OS how to draw it." msgstr "" #: ../variety/Texts.py:61 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" #: ../variety/Texts.py:64 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" #: ../variety/Texts.py:67 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Downloading\" tab)." msgstr "" #: ../variety/Texts.py:70 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" #: ../variety/Texts.py:73 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open {PROFILE_PATH}" "variety.conf in an editor and use the existing filters as an example. Every " "filter is just a line of options to be passed to ImageMagick's convert " "command." msgstr "" #: ../variety/Texts.py:76 msgid "" "When you select an image source, its images are displayed in a window at the " "bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to " "several hundred randomly selected images." msgstr "" #: ../variety/Texts.py:79 msgid "" "Variety's indicator icon is themeable - if you choose the \"Light\" option " "for the icon, Variety will first check if the current GTK theme has an icon " "named \"variety-indicator\" and will use it instead of the bundled light " "icon." msgstr "" #: ../variety/Texts.py:82 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to ~/.config/" "variety/pluginconfig/quotes/ and enable the Local Files quote source. This " "file is also compatible with the Unix fortune utility." msgstr "" #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1527 msgid "Bottom" msgstr "" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Right" msgstr "" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2959 msgid "Size" msgstr "" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:750 msgid "Fetched: Show Origin" msgstr "" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:754 #: ../variety/VarietyWindow.py:876 #, python-format msgid "View at %s" msgstr "" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:720 msgid "Move to _Favorites" msgstr "" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place " "them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If " "not specified, this is ~/.config/variety/. If just a name is used instead of " "a full path, the profile folder will be ~/.config/variety-profiles/. " "Use only when initially starting Variety - changing the profile path " "requires restart. Several instances of Variety can be started when using " "different profiles, each with its own separate configuration. This can be " "used for example to control several different screens or workspaces under " "desktop environments like XFCE which allow this. To pass commands to a " "running instance, pass the same --profile argument as the one it was started " "with in subsequent commands." msgstr "" #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" #: ../variety/VarietyWindow.py:715 ../variety/VarietyWindow.py:892 #: ../variety/VarietyWindow.py:2983 msgid "Already in Favorites" msgstr "" #: ../variety/VarietyWindow.py:752 #, python-format msgid "Source: %s" msgstr "" #: ../variety/VarietyWindow.py:818 msgid "Unknown" msgstr "" #: ../variety/VarietyWindow.py:840 #, python-format msgid "Author: %s" msgstr "" #: ../variety/VarietyWindow.py:865 ../variety/VarietyWindow.py:887 msgid "Resume regular changes" msgstr "" #: ../variety/VarietyWindow.py:1041 msgid "Filtering too strict?" msgstr "" #: ../variety/VarietyWindow.py:1043 msgid "" "Variety is finding too few images that match your image filtering criteria. " "Please check if the settings in \"Filtering\" are correct." msgstr "" #: ../variety/VarietyWindow.py:1733 msgid "Please add more image sources or wait for some downloads" msgstr "" #: ../variety/VarietyWindow.py:1735 msgid "Please add more image sources" msgstr "" #: ../variety/VarietyWindow.py:1736 msgid "No more wallpapers" msgstr "" #: ../variety/VarietyWindow.py:2007 msgid "Current wallpaper is not in the image sources" msgstr "" #: ../variety/VarietyWindow.py:2040 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "" #: ../variety/VarietyWindow.py:2047 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" #: ../variety/VarietyWindow.py:2072 ../variety/VarietyWindow.py:2095 msgid "Cannot delete" msgstr "" #: ../variety/VarietyWindow.py:2073 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "" #: ../variety/VarietyWindow.py:2096 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" #: ../variety/VarietyWindow.py:2382 msgid "Upgraded scripts" msgstr "" #: ../variety/VarietyWindow.py:2384 msgid "" "If you had customized scripts for Variety, please see Preferences -> " "Changelog" msgstr "" #: ../variety/VarietyWindow.py:2435 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "" #: ../variety/VarietyWindow.py:2587 msgid "Added to queue" msgstr "" #: ../variety/VarietyWindow.py:2588 ../variety/VarietyWindow.py:2601 msgid "Press Next to see it" msgstr "" #: ../variety/VarietyWindow.py:2600 msgid "Fetched" msgstr "" #: ../variety/VarietyWindow.py:2651 msgid "Unsupported source type" msgstr "" #: ../variety/VarietyWindow.py:2652 ../variety/VarietyWindow.py:2700 msgid "Are you running the most recent version of Variety?" msgstr "" #: ../variety/VarietyWindow.py:2662 msgid "New image source added" msgstr "" #: ../variety/VarietyWindow.py:2664 msgid "Image source already exists, enabling it" msgstr "" #: ../variety/VarietyWindow.py:2690 msgid "Fetched and applied" msgstr "" #: ../variety/VarietyWindow.py:2695 msgid "It works!" msgstr "" #: ../variety/VarietyWindow.py:2695 msgid "Yay, Variety links work. Great!" msgstr "" #: ../variety/VarietyWindow.py:2699 msgid "Unsupported command" msgstr "" #: ../variety/VarietyWindow.py:2704 msgid "Could not process the given variety:// URL" msgstr "" #: ../variety/VarietyWindow.py:2705 msgid "Run with logging enabled to see details" msgstr "" #: ../variety/VarietyWindow.py:3070 msgid "Variety: New desktop entry" msgstr "" #: ../variety/VarietyWindow.py:3072 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety " "with profile \"{}\". Find it in the application launcher." msgstr "" #: ../variety/VarietyWindow.py:3097 msgid "Variety: Created autostart desktop entry" msgstr "" #: ../variety/VarietyWindow.py:3099 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" #: ../variety/VarietyWindow.py:3106 msgid "Could not create autostart entry" msgstr "" #: ../variety/VarietyWindow.py:3108 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "" #: ../variety/VarietyWindow.py:3173 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:3173 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "" #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:160 ../data/ui/AddWallhavenDialog.ui:255 msgid "Just a moment to check for images" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 #: ../data/ui/AddWallhavenDialog.ui:280 msgid " " msgstr "" #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria. " "Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "" #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1716 msgid "Tags: " msgstr "" #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them " "simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "" #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://" "www.flickr.com/photos/peter-levi/" msgstr "" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "" #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://" "www.flickr.com/groups/wallpapers/" msgstr "" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by " "prepending them with -.\n" "Example: apple -pie" msgstr "" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "" #: ../data/ui/AddWallhavenDialog.ui:96 msgid "Instruction" msgstr "" #: ../data/ui/AddWallhavenDialog.ui:181 msgid "" "To fetch NSFW images, you can provide your own Wallhaven API key. You need a free " "Wallhaven account, log in, go to Account Settings, find it under API Key. Without an API " "key, even if your search shows NSFW images in the browser, Variety will not " "be able to fetch them. Even with an API key, in order to fetch NSFW " "images, you need to provide a full search URL, not just keywords. \n" "\n" "Note: This is a global setting which affects all Wallhaven sources" msgstr "" #: ../data/ui/AddWallhavenDialog.ui:206 msgid "API Key:" msgstr "" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the " "menu depending on the image location:" msgstr "" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific " "folder path.\n" "Order is important. When an image is shown, the first folder in this list " "which contains the image will determine which operations will be shown in " "Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:25 msgid "seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:29 #: ../data/ui/PreferencesVarietyDialog.ui:51 msgid "minutes" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:33 #: ../data/ui/PreferencesVarietyDialog.ui:55 msgid "hours" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:37 #: ../data/ui/PreferencesVarietyDialog.ui:59 msgid "days" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:201 #: ../data/ui/PreferencesVarietyDialog.ui:731 msgid "General" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:214 msgid "Start Variety when the computer starts" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:239 msgid "Change wallpaper every " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:259 #: ../data/ui/PreferencesVarietyDialog.ui:276 #: ../data/ui/PreferencesVarietyDialog.ui:277 msgid "Minimum interval is 5 seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:304 msgid "Change wallpaper on start" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:338 msgid "Use Internet Access" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:353 msgid "" "Turning off means Variety will not download new images or quotes from online " "sources, or initiate other internet connections." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:449 msgid "Enabled" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:460 msgid "Type" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:471 msgid "Location" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:507 msgid "_Add..." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:513 #: ../data/ui/PreferencesVarietyDialog.ui:514 msgid "Add images, folders or online image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:526 msgid "_Open Folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:531 #: ../data/ui/PreferencesVarietyDialog.ui:532 #: ../data/ui/PreferencesVarietyDialog.ui:550 #: ../data/ui/PreferencesVarietyDialog.ui:551 msgid "Edit the selected source" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:545 msgid "_Edit..." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:564 msgid "_Remove..." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:570 #: ../data/ui/PreferencesVarietyDialog.ui:571 msgid "Remove selected image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:584 msgid "_Use" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:589 #: ../data/ui/PreferencesVarietyDialog.ui:590 msgid "Enable the selected sources and disable all others" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:641 msgid "Favorites" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:665 msgid "Copy favorite wallpapers to " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:751 msgid "Alignment and scaling" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:770 msgid "Auto-rotate the image according to EXIF data" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:793 msgid "Display mode" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:829 msgid "Description goes here " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:848 msgid "" "Experimental: Some options may not work well in all desktop environments or " "multi-monitor configurations." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:874 msgid "Effects" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:897 msgid "" "Randomly apply these effects to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:965 msgid "Wallpaper" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:985 #: ../data/ui/PreferencesVarietyDialog.ui:1786 msgid "Quotes" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Show random wise quotes on the desktop" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1027 msgid "Change quote every " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1048 #: ../data/ui/PreferencesVarietyDialog.ui:1049 #: ../data/ui/PreferencesVarietyDialog.ui:1066 #: ../data/ui/PreferencesVarietyDialog.ui:1067 msgid "Minimum interval is 10 seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1105 #: ../data/ui/PreferencesVarietyDialog.ui:1848 msgid "Appearance" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1131 msgid "Text color: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1160 msgid "Text font: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1188 msgid "Draw a text shadow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1222 msgid "Backdrop color: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1250 msgid "Backdrop opacity: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1263 msgid " Transparent" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1293 msgid "Opaque" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1322 msgid "Placement" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1348 msgid "Horizontal position: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1361 msgid "Left " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1410 msgid "Quotes area width: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1423 msgid "Narrow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1452 msgid "Wide" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1484 msgid "Vertical position: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1497 msgid "Top " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1556 msgid "Sources and filtering" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1584 msgid "Show quotes from these sources: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1652 msgid "" "More " "plugins" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1669 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1729 msgid "Example: funny, inspirational" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1742 msgid "Example: Albert Einstein, Voltaire" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1755 msgid "Authors: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1806 #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Clock" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1819 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1823 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1876 msgid "Clock font: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1918 msgid "Date font: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1957 msgid "" "These don't work? Read here. How to further configure the clock? Read here." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2019 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2041 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2060 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2078 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2165 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2179 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2180 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2181 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2182 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2183 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2215 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2240 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2276 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2290 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2291 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2292 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2293 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2338 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2365 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2394 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2423 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2453 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2477 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2506 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2530 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2559 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2583 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2617 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2630 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2658 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2685 msgid "Fetch folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2708 msgid "Save manually downloaded wallpapers to " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2762 msgid "Drag and drop" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2782 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL " "or file on it and it will be saved to your fetch folder. You can then press " "Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish " "to lock it there for easy drag-and-drop access." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2816 msgid "Clipboard monitoring" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2829 msgid "Monitor clipboard for image URLs and fetch them" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2851 msgid "But fetch only when the URL host is one of these:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2916 msgid "Downloading" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2936 msgid "When possible use images that:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2972 msgid "Have landscape orientation" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2997 msgid "Are big at least " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3019 msgid "50" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3020 msgid "80" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3021 msgid "100" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3036 msgid "% of the screen resolution" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3070 msgid "Color" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3089 msgid "Are dark or light:" msgstr "" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:3111 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:3112 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3137 msgid "Contain this color: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgid "(Takes effect after some initial searching)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3212 msgid "Rating" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3229 msgid "Have EXIF rating at least " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3252 msgid "1" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3253 msgid "2" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3254 msgid "3" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3255 msgid "4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3256 msgid "5" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3293 msgid "Name" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3310 msgid "Matches RegEx: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3369 msgid "Filtering" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3396 msgid "Indicator Icon" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3419 msgid "Indicator icon:" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3435 msgctxt "Icon option" msgid "Light" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3436 msgctxt "Icon option" msgid "Dark" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3437 msgctxt "Icon option" msgid "Number 1" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3438 msgctxt "Icon option" msgid "Number 2" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3439 msgctxt "Icon option" msgid "Number 3" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3440 msgctxt "Icon option" msgid "Number 4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3441 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3442 msgctxt "Icon option" msgid "Custom image..." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgctxt "Icon option" msgid "None" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3460 msgid "Select an icon" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3484 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or " "from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3514 msgid "Favorites Operations" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3537 msgid "Favorites operations to show in main menu:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3553 msgid "Copy to Favorites" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3555 msgid "Both Copy and Move" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3556 msgid "Depends on folder..." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3613 msgid "Login Screen Support" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3635 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3659 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in " "not encrypted, and /usr/share/backgrounds if it is. Please use with care on " "multiuser systems." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3681 msgid "Copy wallpaper image files to this folder: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3708 msgid "Reset to default" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3723 msgid "Still doesn't work?" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3753 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3774 msgid "You don't have write permissions for this folder." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3791 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3808 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Customize" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3886 msgid "Tips and tricks" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3932 #: ../data/ui/PreferencesVarietyDialog.ui:4109 msgid "Visit website" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3965 #: ../data/ui/PreferencesVarietyDialog.ui:4142 msgid "Report a bug or request a feature" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3998 #: ../data/ui/PreferencesVarietyDialog.ui:4175 #: ../data/ui/PreferencesVarietyDialog.ui:4239 msgid "Donate to Variety" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:4010 #: ../data/ui/PreferencesVarietyDialog.ui:4187 #: ../data/ui/PreferencesVarietyDialog.ui:4273 msgid "Donate via PayPal" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:4042 msgid "Tips" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:4063 msgid "Recent changes" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:4219 msgid "Changelog" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:4257 msgid "" "I am developing Variety in my spare time, which usually means the late hours " "after my kids go to bed. Any amount you donate will be appreciated. It will " "show me Variety is valued by you - the users - and will motivate me to " "continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:4305 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:4318 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:64 msgid "Privacy Notice" msgstr "" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:91 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any " "warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license " "under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, " "Variety downloads images from the internet. Web servers it downloads from " "may collect information about your device, like IP address. Variety does not " "send any personally identifiable information. By using Variety, you accept " "its use of internet connectivity. Note that all internet connectivity can " "be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the " "development team. This may affect the rate at which it downloads new " "images, but it helps ensure Variety can work regardless of how many people " "are running it. These settings will be downloaded from gist.github.com where " "we host them.\n" "\n" "Some image sources require us to track additional information when " "enabled. For example the terms of Unsplash require us to track " "and report when users download and view images from Unsplash." msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:128 msgid "" "Use Internet Access:\n" "Can be changed later in Preferences" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:147 msgid "" "Enabling internet access is highly recommended. Without it, many of the " "functions Variety provides are disabled. \n" "\n" "You can change this setting later in Preferences." msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:177 msgid "Reject and Quit" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:192 msgid "Accept and Continue" msgstr "" #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper " "on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer " "from Bulgaria. If you like it, please donate." msgstr "" #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" variety-0.8.13/po/zh_CN.po000066400000000000000000001453431475753071700152770ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # James Lu , 2021 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-07-27 21:49-0700\n" "PO-Revision-Date: 2021-07-28 05:05+0000\n" "Last-Translator: James Lu , 2021\n" "Language-Team: Chinese (China) (https://www.transifex.com/variety/teams/123174/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../variety/AddFlickrDialog.py:148 msgid "No images found" msgstr "没有找到图像" #: ../variety/FlickrDownloader.py:45 msgid "Images from Flickr" msgstr "" #: ../variety/FolderChooser.py:67 msgid "Choose a folder" msgstr "选择一个文件夹" #: ../variety/FolderChooser.py:70 ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Cancel" msgstr "取消" #: ../variety/FolderChooser.py:70 msgid "OK" msgstr "确定" #: ../variety/ImageFetcher.py:62 ../variety/ImageFetcher.py:108 msgid "Fetching" msgstr "正在获取" #: ../variety/ImageFetcher.py:66 ../variety/ImageFetcher.py:76 #: ../variety/ImageFetcher.py:83 ../variety/ImageFetcher.py:117 #: ../variety/VarietyWindow.py:2484 msgid "Not an image" msgstr "不是一个图像" #: ../variety/ImageFetcher.py:123 msgid "Image too small, ignoring it" msgstr "图片太小略过它" #: ../variety/ImageFetcher.py:148 #, python-format msgid "Sorry, got %s error..." msgstr "" #: ../variety/ImageFetcher.py:149 msgid "This means the link is no longer valid" msgstr "" #: ../variety/ImageFetcher.py:153 msgid "Fetch failed for some reason" msgstr "因为某些原因获取失败" #: ../variety/ImageFetcher.py:155 msgid "" "To get more information, please run Variety from terminal with -v option and" " retry the action" msgstr "要获取更多信息,请在终端中以 -v 参数运行 Variety 然后重试操作" #: ../variety/indicator.py:63 ../variety/indicator.py:110 #: ../variety/indicator.py:179 msgid "_Next" msgstr "下一个(_N)" #: ../variety/indicator.py:68 ../variety/indicator.py:115 #: ../variety/indicator.py:184 msgid "_Previous" msgstr "上一个(_P)" #: ../variety/indicator.py:75 msgid "Current desktop wallpaper" msgstr "当前桌面壁纸" #: ../variety/indicator.py:79 msgid "Show origin" msgstr "显示来源" #: ../variety/indicator.py:90 ../variety/ThumbsManager.py:177 #: ../variety/VarietyWindow.py:729 msgid "Copy to _Favorites" msgstr "拷贝到收藏夹(_F)" #: ../variety/indicator.py:95 ../variety/VarietyWindow.py:738 #: ../data/ui/PreferencesVarietyDialog.ui:3289 msgid "Move to Favorites" msgstr "移动到收藏夹" #: ../variety/indicator.py:101 ../variety/ThumbsManager.py:197 msgid "Delete to _Trash" msgstr "移动到回收站(_T)" #: ../variety/indicator.py:120 ../variety/indicator.py:189 msgid "_Next, skipping forward history" msgstr "下一个(_N),跳过前进历史" #: ../variety/indicator.py:130 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Tip: 在缩略图上滚动滚轮\n" "可以向前或向后切换" #: ../variety/indicator.py:136 ../variety/indicator.py:200 #: ../variety/VarietyWindow.py:873 ../variety/VarietyWindow.py:895 msgid "Pause on current" msgstr "暂停自动切换" #: ../variety/indicator.py:140 msgid "_Image" msgstr "图片" #: ../variety/indicator.py:147 ../variety/ThumbsManager.py:206 msgid "Where is it from?" msgstr "" #: ../variety/indicator.py:151 msgid "Show without effects" msgstr "" #: ../variety/indicator.py:161 msgid "Google Image Search" msgstr "" #: ../variety/indicator.py:168 ../variety/ThumbsManager.py:169 msgid "Set EXIF Rating" msgstr "" #: ../variety/indicator.py:206 ../variety/VarietyWindow.py:902 msgid "Save to Favorites" msgstr "" #: ../variety/indicator.py:211 msgid "View Favorites..." msgstr "" #: ../variety/indicator.py:218 msgid "Copy to Clipboard" msgstr "复制到剪贴板" #: ../variety/indicator.py:228 msgid "Google Quote" msgstr "" #: ../variety/indicator.py:233 msgid "Google Author" msgstr "" #: ../variety/indicator.py:240 ../variety/indicator.py:296 msgid "Preferences..." msgstr "首选项..." #: ../variety/indicator.py:250 msgid "Turn off" msgstr "关闭" #: ../variety/indicator.py:255 msgid "_Quote" msgstr "" #: ../variety/indicator.py:262 msgid "_History" msgstr "历史(_H)" #: ../variety/indicator.py:268 msgid "_Wallpaper Selector" msgstr "" #: ../variety/indicator.py:276 msgid "Recent _Downloads" msgstr "最近下载(_D)" #: ../variety/indicator.py:284 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:300 msgid "About" msgstr "关于" #: ../variety/indicator.py:304 ../data/ui/PreferencesVarietyDialog.ui:3991 msgid "Donate" msgstr "捐赠" #: ../variety/indicator.py:308 msgid "Quit" msgstr "退出" #: ../variety/__init__.py:121 msgid "Terminating signal received, quitting..." msgstr "收到退出信号,正在退出" #: ../variety/__init__.py:195 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Variey正在运行. 发送命令到正在运行的实例" #: ../variety/PreferencesVarietyDialog.py:85 msgid " (Profile: {})" msgstr "" #: ../variety/PreferencesVarietyDialog.py:87 #: ../data/ui/PreferencesVarietyDialog.ui:121 msgid "Variety Preferences" msgstr "Variety 首选项" #: ../variety/PreferencesVarietyDialog.py:246 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:396 #: ../variety/PreferencesVarietyDialog.py:595 #: ../data/ui/PreferencesVarietyDialog.ui:342 msgid "Images" msgstr "图片" #: ../variety/PreferencesVarietyDialog.py:396 msgid "Add individual wallpaper images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:398 msgid "Folders" msgstr "文件夹" #: ../variety/PreferencesVarietyDialog.py:399 msgid "Searched recursively for up to 10000 images, shown in random order" msgstr "" #: ../variety/PreferencesVarietyDialog.py:405 msgid "Sequential Albums (order by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:406 msgid "Searched recursively for images, shown in sequence (by filename)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:412 msgid "Sequential Albums (order by date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:413 msgid "Searched recursively for images, shown in sequence (by file date)" msgstr "" #: ../variety/PreferencesVarietyDialog.py:419 ../data/ui/AddFlickrDialog.ui:83 msgid "Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:419 msgid "Fetch images from Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:461 msgid "Remove the source, keep the files" msgstr "从源里移除,但保留文件" #: ../variety/PreferencesVarietyDialog.py:463 msgid "Remove the sources, keep the files" msgstr "从源里移除,但保留文件" #: ../variety/PreferencesVarietyDialog.py:474 msgid "Remove the source and delete the downloaded files" msgstr "移除源,并且删除已下载文件" #: ../variety/PreferencesVarietyDialog.py:476 msgid "Remove the sources and delete the downloaded files" msgstr "移除源,并且删除已下载文件" #: ../variety/PreferencesVarietyDialog.py:511 #, python-format msgid "" "Using this source requires wallpaper changing enabled at intervals of %d " "minutes or less. Settings were adjusted automatically." msgstr "" #: ../variety/PreferencesVarietyDialog.py:585 msgid "Add Images" msgstr "添加图片" #: ../variety/PreferencesVarietyDialog.py:588 #: ../variety/PreferencesVarietyDialog.py:629 msgid "Add" msgstr "添加" #: ../variety/PreferencesVarietyDialog.py:613 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "增加文件夹-只需要添加顶层文件夹,子文件夹会自动添加" #: ../variety/PreferencesVarietyDialog.py:617 msgid "" "Add Sequential Albums (ordered by filename). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:621 msgid "" "Add Sequential Albums (ordered by date). Subfolders are searched " "recursively." msgstr "" #: ../variety/PreferencesVarietyDialog.py:775 #: ../data/ui/PreferencesVarietyDialog.ui:3304 msgid "Edit..." msgstr "编辑..." #: ../variety/PreferencesVarietyDialog.py:777 msgid "Open Folder" msgstr "打开文件夹" #: ../variety/PreferencesVarietyDialog.py:783 msgid "View Image" msgstr "浏览图像" #: ../variety/PreferencesVarietyDialog.py:1166 #: ../variety/PreferencesVarietyDialog.py:1173 msgid "No write permissions" msgstr "没有写权限" #: ../variety/PreferencesVarietyDialog.py:1248 msgid "Could not adjust permissions" msgstr "不能修改权限" #: ../variety/PreferencesVarietyDialog.py:1249 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "你需要手动运行命令:\n" "sudo chmod %s \"%s\"" #: ../variety/QuotesEngine.py:243 msgid "No quote plugins" msgstr "没有箴言插件" #: ../variety/QuotesEngine.py:243 msgid "There are no quote plugins installed" msgstr "箴言插件没安装" #: ../variety/QuotesEngine.py:250 msgid "No suitable quote plugins" msgstr "没合适的箴言插件" #: ../variety/QuotesEngine.py:251 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "没支持搜索关键字和作者的箴言插件" #: ../variety/QuotesEngine.py:266 msgid "Could not fetch quotes" msgstr "不能获取箴言" #: ../variety/QuotesEngine.py:267 msgid "Quotes services may be down, we will continue trying" msgstr "" #: ../variety/QuotesEngine.py:271 msgid "Could not find quotes" msgstr "" #: ../variety/QuotesEngine.py:272 msgid "Maybe you are searching for something very obscure?" msgstr "" #: ../variety/Texts.py:21 msgid "Keep original" msgstr "保持原始" #: ../variety/Texts.py:22 msgid "Grayscale" msgstr "灰度" #: ../variety/Texts.py:23 msgid "Heavy blur" msgstr "" #: ../variety/Texts.py:24 msgid "Soft blur" msgstr "" #: ../variety/Texts.py:25 msgid "Oil painting" msgstr "油画" #: ../variety/Texts.py:26 msgid "Pointilism" msgstr "" #: ../variety/Texts.py:27 msgid "Pixellate" msgstr "" #: ../variety/Texts.py:31 msgid "The Favorites folder" msgstr "" #: ../variety/Texts.py:32 msgid "The Fetched folder" msgstr "" #: ../variety/Texts.py:35 msgid "" "Recommended by Variety. Adapts to your taste as you mark images as favorite " "or trash." msgstr "" #: ../variety/Texts.py:39 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:41 msgid "Random wallpapers from Desktoppr.co" msgstr "" #: ../variety/Texts.py:42 msgid "NASA's Astronomy Picture of the Day" msgstr "" #: ../variety/Texts.py:43 msgid "Bing Photo of the Day" msgstr "" #: ../variety/Texts.py:46 msgid "High-resolution photos from Unsplash.com" msgstr "" #: ../variety/Texts.py:54 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" #: ../variety/Texts.py:57 #, python-brace-format msgid "" "If you want to run custom commands every time the wallpaper changes or if " "you use an alternative desktop environment, please edit the scripts in " "{PROFILE_PATH}scripts. There are examples there for various desktop " "environments." msgstr "" #: ../variety/Texts.py:60 msgid "" "Variety can be controlled from the command line and you can use this to " "define keyboard shortcuts for the operations you use most often. Run " "\"variety --help\" to see all available commands." msgstr "" #: ../variety/Texts.py:63 msgid "" "You can drop image links or files on the launcher icon to download them and " "use them as wallpapers. For quicker downloading from a specific site, you " "can also use clipboard monitoring (see \"Manual downloading\" tab)." msgstr "" #: ../variety/Texts.py:66 msgid "" "Applying a heavy blurring filter is a great way to get abstract-looking and " "unobtrusive, yet colorful wallpapers, similar in spirit to the default one " "in Ubuntu." msgstr "" #: ../variety/Texts.py:69 #, python-brace-format msgid "" "Adding your own custom filters is quite easy: open " "{PROFILE_PATH}variety.conf in an editor and use the existing filters as an " "example. Every filter is just a line of options to be passed to " "ImageMagick's convert command." msgstr "" #: ../variety/Texts.py:72 msgid "" "When you select an image source, its images are displayed in a window at the" " bottom of the screen. Click an image there to set is as wallpaper. Right-" "click to close the window, to modify its appearance or to perform file " "operations. You can select multiple image sources to create a \"merged\" " "thumbnail view of all of them. Please mind that thumbnail view is limited to" " several hundred randomly selected images." msgstr "" #: ../variety/Texts.py:75 #, python-brace-format msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of {PROFILE_PATH}scripts/set_wallpaper." msgstr "" #: ../variety/Texts.py:78 msgid "" "Variety's indicator icon is themeable - if you you choose the \"Light\" " "option for the icon, Variety will first check if the current GTK theme has " "an icon named \"variety-indicator\" and will use it instead of the bundled " "light icon." msgstr "" #: ../variety/Texts.py:81 #, python-brace-format msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "{PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's " "local files quote source. If you want to use it - copy it to " "~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote " "source. This file is also compatible with the Unix fortune utility." msgstr "" #: ../variety/ThumbsManager.py:41 ../data/ui/PreferencesVarietyDialog.ui:1242 msgid "Bottom" msgstr "底部" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "顶部" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "左侧" #: ../variety/ThumbsManager.py:44 ../data/ui/PreferencesVarietyDialog.ui:1173 msgid "Right" msgstr "右侧" #: ../variety/ThumbsManager.py:117 msgid "Position" msgstr "位置" #: ../variety/ThumbsManager.py:121 ../data/ui/PreferencesVarietyDialog.ui:2771 msgid "Size" msgstr "大小" #: ../variety/ThumbsManager.py:125 msgid "Maximum Shown Images" msgstr "" #: ../variety/ThumbsManager.py:139 msgid "Show Containing Folder" msgstr "显示包含的文件夹" #: ../variety/ThumbsManager.py:152 ../variety/VarietyWindow.py:760 msgid "Fetched: Show Origin" msgstr "抓到数据" #: ../variety/ThumbsManager.py:154 ../variety/VarietyWindow.py:764 #: ../variety/VarietyWindow.py:886 #, python-format msgid "View at %s" msgstr "在%s浏览" #: ../variety/ThumbsManager.py:186 ../variety/VarietyWindow.py:730 msgid "Move to _Favorites" msgstr "移动到收藏夹(_F)" #: ../variety/ThumbsManager.py:220 msgid "Close" msgstr "关闭" #: ../variety/ThumbsManager.py:240 msgid "Could not set EXIF rating" msgstr "" #: ../variety/ThumbsManager.py:260 msgid "Unrated" msgstr "未评级的" #: ../variety/ThumbsManager.py:267 msgid "Rejected" msgstr "已拒绝" #: ../variety/ThumbsManager.py:380 msgid "Variety History" msgstr "Variety 历史" #: ../variety/ThumbsManager.py:382 msgid "Variety Recent Downloads" msgstr "Variety 最近下载" #: ../variety/ThumbsManager.py:384 msgid "Variety Images" msgstr "Variety 图片" #: ../variety/VarietyOptionParser.py:51 msgid "" "%prog [options] [files or urls]\n" "\n" "Passing local files will add them to Variety's queue.\n" "Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue.\n" "\n" "To set a specific wallpaper: %prog --set /some/local/image.jpg\n" msgstr "" #: ../variety/VarietyOptionParser.py:69 msgid "" "Profile name or full path to the configuration folder Variety should use. If" " not specified, this is ~/.config/variety/. If just a name is used instead " "of a full path, the profile folder will be ~/.config/variety-" "profiles/. Use only when initially starting Variety - changing the " "profile path requires restart. Several instances of Variety can be started " "when using different profiles, each with its own separate configuration. " "This can be used for example to control several different screens or " "workspaces under desktop environments like XFCE which allow this. To pass " "commands to a running instance, pass the same --profile argument as the one " "it was started with in subsequent commands." msgstr "" #: ../variety/VarietyOptionParser.py:90 msgid "" "Show logging messages (-vv to -vvvvv will profile various parts of Variety " "with increasing detail" msgstr "" #: ../variety/VarietyOptionParser.py:95 msgid "Make the running instance quit" msgstr "让运行中的实例退出" #: ../variety/VarietyOptionParser.py:106 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "打印当前桌面图片地址。 只有当Variety运行时可用" #: ../variety/VarietyOptionParser.py:115 msgid "Set the given file as wallpaper, absolute path required" msgstr "" #: ../variety/VarietyOptionParser.py:119 msgid "Show Next wallpaper" msgstr "显示下一壁纸" #: ../variety/VarietyOptionParser.py:123 msgid "Show Previous wallpaper" msgstr "显示前一壁纸" #: ../variety/VarietyOptionParser.py:130 msgid "Show Next wallpaper, skipping the forward history" msgstr "显示下一张壁纸, 跳过前一壁纸历史" #: ../variety/VarietyOptionParser.py:139 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "删除当前壁纸。程序运行时可用" #: ../variety/VarietyOptionParser.py:149 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "拷贝当前壁纸到Favorites." #: ../variety/VarietyOptionParser.py:158 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "剪切当前壁纸到Favorites." #: ../variety/VarietyOptionParser.py:163 msgid "Pause on current image" msgstr "" #: ../variety/VarietyOptionParser.py:167 msgid "Resume regular image changes" msgstr "" #: ../variety/VarietyOptionParser.py:174 msgid "Toggle Pause/Resume state" msgstr "切换 暂停/继续 状态" #: ../variety/VarietyOptionParser.py:181 msgid "Toggle \"Show Without Effects\" for current image" msgstr "" #: ../variety/VarietyOptionParser.py:185 msgid "Show Next quote" msgstr "显示下一箴言" #: ../variety/VarietyOptionParser.py:192 msgid "Show Previous quote" msgstr "显示前一箴言" #: ../variety/VarietyOptionParser.py:199 msgid "Show Next quote, skipping the forward history" msgstr "显示下一箴言,跳过向前显示历史" #: ../variety/VarietyOptionParser.py:206 msgid "Toggle Quotes Pause/Resume state" msgstr "切换箴言 暂停/继续 状态" #: ../variety/VarietyOptionParser.py:213 msgid "Save the current quote to Favorites" msgstr "" #: ../variety/VarietyOptionParser.py:217 msgid "Toggle History display" msgstr "切换历史显示" #: ../variety/VarietyOptionParser.py:224 msgid "Toggle Recent Downloads display" msgstr "切换最近下载现实" #: ../variety/VarietyOptionParser.py:232 msgid "Show Preferences dialog" msgstr "现实首选项对话框" #: ../variety/VarietyOptionParser.py:241 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" #: ../variety/VarietyOptionParser.py:251 msgid "" "Sets and applies an option. The option names are the same that are used in " "Variety's config file ~/.config/variety/variety.conf. Multiple options can " "be set in a single command. Example: 'variety --set-option icon Dark --set-" "option clock_enabled True'. USE WITH CAUTION: You are changing the settings " "file directly in an unguarded way." msgstr "" #: ../variety/VarietyOptionParser.py:264 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "选项 --next/--fast-forward 和 --previous 是互斥的" #: ../variety/VarietyOptionParser.py:267 msgid "options --trash and --favorite are mutually exclusive" msgstr "选项 --trash 和 --favorite 是互斥的" #: ../variety/VarietyOptionParser.py:270 msgid "options --pause and --resume are mutually exclusive" msgstr "选项 --parse 和 --resume 是互斥的" #: ../variety/VarietyOptionParser.py:275 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "选项 --qutoes-next/--quotes-fast-forward 和 --quotes-previous 是互斥的" #: ../variety/VarietyWindow.py:725 ../variety/VarietyWindow.py:902 #: ../variety/VarietyWindow.py:2883 msgid "Already in Favorites" msgstr "收藏夹中已存在" #: ../variety/VarietyWindow.py:762 #, python-format msgid "Source: %s" msgstr "" #: ../variety/VarietyWindow.py:828 msgid "Unknown" msgstr "" #: ../variety/VarietyWindow.py:850 #, python-format msgid "Author: %s" msgstr "" #: ../variety/VarietyWindow.py:875 ../variety/VarietyWindow.py:897 msgid "Resume regular changes" msgstr "" #: ../variety/VarietyWindow.py:1048 msgid "Filtering too strict?" msgstr "匹配规则过于严格?" #: ../variety/VarietyWindow.py:1049 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "Varity用您目前的图片规则匹配到的图片太少" #: ../variety/VarietyWindow.py:1638 msgid "Please add more image sources or wait for some downloads" msgstr "请增加更多的图片源或者等待下载结束" #: ../variety/VarietyWindow.py:1640 msgid "Please add more image sources" msgstr "请增加更多的图片源" #: ../variety/VarietyWindow.py:1641 msgid "No more wallpapers" msgstr "没有更多的桌面图片" #: ../variety/VarietyWindow.py:1910 msgid "Current wallpaper is not in the image sources" msgstr "当前的桌面图片不在图片源中" #: ../variety/VarietyWindow.py:1943 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "不能移动到 %s。你可能没有相应的权限移动该文件。" #: ../variety/VarietyWindow.py:1950 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "不能复制到 %s。你可能没有相应的权限复制该文件。" #: ../variety/VarietyWindow.py:1975 ../variety/VarietyWindow.py:1998 msgid "Cannot delete" msgstr "无法删除" #: ../variety/VarietyWindow.py:1976 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "你没有权限删除 %s 到回收站。" #: ../variety/VarietyWindow.py:1999 msgid "Deleting to trash failed, check variety.log for more information." msgstr "" #: ../variety/VarietyWindow.py:2325 msgid "" "I will open an editor with the config file and apply the changes after you " "save and close the editor." msgstr "将要打开文本编辑器编辑配置文件。在您保存关闭文本编辑器后应用更改" #: ../variety/VarietyWindow.py:2490 msgid "Added to queue" msgstr "加入队列" #: ../variety/VarietyWindow.py:2491 ../variety/VarietyWindow.py:2504 msgid "Press Next to see it" msgstr "点击下一步查看" #: ../variety/VarietyWindow.py:2503 msgid "Fetched" msgstr "获取完毕" #: ../variety/VarietyWindow.py:2554 msgid "Unsupported source type" msgstr "" #: ../variety/VarietyWindow.py:2555 ../variety/VarietyWindow.py:2603 msgid "Are you running the most recent version of Variety?" msgstr "" #: ../variety/VarietyWindow.py:2565 msgid "New image source added" msgstr "" #: ../variety/VarietyWindow.py:2567 msgid "Image source already exists, enabling it" msgstr "" #: ../variety/VarietyWindow.py:2593 msgid "Fetched and applied" msgstr "" #: ../variety/VarietyWindow.py:2598 msgid "It works!" msgstr "" #: ../variety/VarietyWindow.py:2598 msgid "Yay, Variety links work. Great!" msgstr "" #: ../variety/VarietyWindow.py:2602 msgid "Unsupported command" msgstr "" #: ../variety/VarietyWindow.py:2607 msgid "Could not process the given variety:// URL" msgstr "" #: ../variety/VarietyWindow.py:2608 msgid "Run with logging enabled to see details" msgstr "" #: ../variety/VarietyWindow.py:2970 msgid "Variety: New desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2972 msgid "" "We created a new desktop entry in ~/.local/share/applications to run Variety" " with profile \"{}\". Find it in the application launcher." msgstr "" #: ../variety/VarietyWindow.py:2997 msgid "Variety: Created autostart desktop entry" msgstr "" #: ../variety/VarietyWindow.py:2999 msgid "" "We created a new desktop entry in ~/.config/autostart. Variety should start " "automatically on next login." msgstr "" #: ../variety/VarietyWindow.py:3006 msgid "Could not create autostart entry" msgstr "" #: ../variety/VarietyWindow.py:3008 msgid "" "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." msgstr "创建autostart desktop entry错误. 请从控制台重新运行程序(增加-v选项)" #: ../variety/VarietyWindow.py:3073 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:3073 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:9 msgid "About Variety" msgstr "关于 Variety" #: ../data/ui/AboutVarietyDialog.ui:14 msgid "Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:15 msgid "An automatic wallpaper changer, downloader and manager." msgstr "一个壁纸自动切换、下载和管理软件。" #: ../data/ui/AboutVarietyDialog.ui:17 msgid "https://github.com/varietywalls/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui:18 msgid "" "# Copyright (c) 2012-2020, Peter Levi, James Lu & Variety contributors\n" "# This program is free software: you can redistribute it and/or modify it\n" "# under the terms of the GNU General Public License version 3, as published\n" "# by the Free Software Foundation.\n" "#\n" "# This program is distributed in the hope that it will be useful, but\n" "# WITHOUT ANY WARRANTY; without even the implied warranties of\n" "# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR\n" "# PURPOSE. See the GNU General Public License for more details.\n" "#\n" "# You should have received a copy of the GNU General Public License along\n" "# with this program. If not, see .\n" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:160 msgid "Just a moment to check for images" msgstr "" #: ../data/ui/AddConfigurableDialog.ui:187 ../data/ui/AddFlickrDialog.ui:360 msgid " " msgstr "" #: ../data/ui/AddFlickrDialog.ui:9 msgid "Variety - add Flickr as an image source" msgstr "Variety - 添加 Flickr 作为图像来源" #: ../data/ui/AddFlickrDialog.ui:101 msgid "" "Please specify the Flickr search criteria." " Photos that match all of the chosen criteria will be downloaded. Leave " "unneeded criteria empty." msgstr "请指定Flickr的搜图规则。所有满足搜图规则的图片将被下载" #: ../data/ui/AddFlickrDialog.ui:124 #: ../data/ui/PreferencesVarietyDialog.ui:1440 msgid "Tags: " msgstr "标记: " #: ../data/ui/AddFlickrDialog.ui:155 msgid "" "A comma-separated list of tags. A photo has to contain all of them simultaneosly in order to match.\n" "Example: yellow,car" msgstr "" "不同标签用逗号分隔。包括所有标签的图片才可被选中\n" "例子: yellow, car" #: ../data/ui/AddFlickrDialog.ui:171 msgid "User: " msgstr "用户名: " #: ../data/ui/AddFlickrDialog.ui:202 msgid "" "Please insert the URL to the user's photostream or to one of their photos.\n" "Example: http://www.flickr.com/photos/peter-levi/" msgstr "" #: ../data/ui/AddFlickrDialog.ui:218 msgid "Group: " msgstr "群组: " #: ../data/ui/AddFlickrDialog.ui:248 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/groups/wallpapers/" msgstr "" #: ../data/ui/AddFlickrDialog.ui:264 msgid "Text:" msgstr "文本:" #: ../data/ui/AddFlickrDialog.ui:295 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by prepending them with -.\n" "Example: apple -pie" msgstr "" "搜索图片标题,描述和标签。 用“-”除去不需要的项\n" "例子:apple - pie(搜索苹果图片,但是不要苹果派的图片)" #: ../data/ui/AddFlickrDialog.ui:334 msgid "Just a moment to check this search" msgstr "稍待片刻" #: ../data/ui/EditFavoriteOperationsDialog.ui:8 #: ../data/ui/EditFavoriteOperationsDialog.ui:91 msgid "Copy to Favorites vs. Move to Favorites" msgstr "" #: ../data/ui/EditFavoriteOperationsDialog.ui:24 msgid "Reset to Default" msgstr "重置为默认值" #: ../data/ui/EditFavoriteOperationsDialog.ui:110 msgid "" "Select whether your prefer 'Copy to Favorites' or 'Move to Favorites' in the" " menu depending on the image location:" msgstr "" #: ../data/ui/EditFavoriteOperationsDialog.ui:155 msgid "" "Please enter one entry per line, each entry in the form :, where Folder can be Downloaded, Fetched, Others or a specific folder path.\n" "Order is important. When an image is shown, the first folder in this list which contains the image will determine which operations will be shown in Variety's menu. 'Others' matches any file and should be last in the list.\n" "\n" "Example:\n" "\tDownloaded:Copy\n" "\tFetched:Move\n" "\t/pics/RandomImages:Move\n" "\t/pics/OrganizedAlbums:Copy\n" "\tOthers:Both" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:24 msgid "seconds" msgstr "秒" #: ../data/ui/PreferencesVarietyDialog.ui:28 #: ../data/ui/PreferencesVarietyDialog.ui:50 msgid "minutes" msgstr "分钟" #: ../data/ui/PreferencesVarietyDialog.ui:32 #: ../data/ui/PreferencesVarietyDialog.ui:54 msgid "hours" msgstr "小时" #: ../data/ui/PreferencesVarietyDialog.ui:36 #: ../data/ui/PreferencesVarietyDialog.ui:58 msgid "days" msgstr "天" #: ../data/ui/PreferencesVarietyDialog.ui:196 #: ../data/ui/PreferencesVarietyDialog.ui:672 msgid "General" msgstr "基本设置" #: ../data/ui/PreferencesVarietyDialog.ui:209 msgid "Start Variety when the computer starts" msgstr "启动时同时启动Variety" #: ../data/ui/PreferencesVarietyDialog.ui:236 msgid "Change wallpaper every " msgstr "切换壁纸每 " #: ../data/ui/PreferencesVarietyDialog.ui:257 #: ../data/ui/PreferencesVarietyDialog.ui:258 #: ../data/ui/PreferencesVarietyDialog.ui:275 #: ../data/ui/PreferencesVarietyDialog.ui:276 msgid "Minimum interval is 5 seconds" msgstr "最小间隔是5秒" #: ../data/ui/PreferencesVarietyDialog.ui:303 msgid "Change wallpaper on start" msgstr "启动时切换壁纸" #: ../data/ui/PreferencesVarietyDialog.ui:390 msgid "Enabled" msgstr "启用" #: ../data/ui/PreferencesVarietyDialog.ui:401 msgid "Type" msgstr "类型" #: ../data/ui/PreferencesVarietyDialog.ui:412 msgid "Location" msgstr "位置" #: ../data/ui/PreferencesVarietyDialog.ui:448 msgid "_Add..." msgstr "添加(_A)..." #: ../data/ui/PreferencesVarietyDialog.ui:454 #: ../data/ui/PreferencesVarietyDialog.ui:455 msgid "Add images, folders or online image sources" msgstr "添加图片,文件夹或联机图片源" #: ../data/ui/PreferencesVarietyDialog.ui:467 msgid "_Open Folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:472 #: ../data/ui/PreferencesVarietyDialog.ui:473 #: ../data/ui/PreferencesVarietyDialog.ui:491 #: ../data/ui/PreferencesVarietyDialog.ui:492 msgid "Edit the selected source" msgstr "编辑被选中的源" #: ../data/ui/PreferencesVarietyDialog.ui:486 msgid "_Edit..." msgstr "编辑(_E)..." #: ../data/ui/PreferencesVarietyDialog.ui:505 msgid "_Remove..." msgstr "删除(_R)..." #: ../data/ui/PreferencesVarietyDialog.ui:511 #: ../data/ui/PreferencesVarietyDialog.ui:512 msgid "Remove selected image sources" msgstr "删除被选中的图片源" #: ../data/ui/PreferencesVarietyDialog.ui:525 msgid "_Use" msgstr "使用(_U)" #: ../data/ui/PreferencesVarietyDialog.ui:530 #: ../data/ui/PreferencesVarietyDialog.ui:531 msgid "Enable the selected sources and disable all others" msgstr "启用选中的源同时禁用其他的源。" #: ../data/ui/PreferencesVarietyDialog.ui:582 msgid "Favorites" msgstr "收藏夹" #: ../data/ui/PreferencesVarietyDialog.ui:606 msgid "Copy favorite wallpapers to " msgstr "拷贝收藏壁纸到 " #: ../data/ui/PreferencesVarietyDialog.ui:691 msgid "Filters" msgstr "修饰" #: ../data/ui/PreferencesVarietyDialog.ui:716 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "用下面的修饰风格随机应用于当前显示的壁纸(归功于神奇的ImageMagick):" #: ../data/ui/PreferencesVarietyDialog.ui:788 msgid "Quotes" msgstr "箴言" #: ../data/ui/PreferencesVarietyDialog.ui:801 msgid "Show random wise quotes on the desktop" msgstr "在桌面显示随机的智慧箴言" #: ../data/ui/PreferencesVarietyDialog.ui:840 msgid "Text color: " msgstr "文字颜色 " #: ../data/ui/PreferencesVarietyDialog.ui:869 msgid "Text font: " msgstr "文字字体: " #: ../data/ui/PreferencesVarietyDialog.ui:913 msgid "Backdrop color: " msgstr "背景色: " #: ../data/ui/PreferencesVarietyDialog.ui:941 msgid "Backdrop opacity: " msgstr "背景透明度: " #: ../data/ui/PreferencesVarietyDialog.ui:955 msgid " Transparent" msgstr " 透明" #: ../data/ui/PreferencesVarietyDialog.ui:986 msgid "Opaque" msgstr "不透明" #: ../data/ui/PreferencesVarietyDialog.ui:1004 msgid "Draw a text shadow" msgstr "显示文字阴影" #: ../data/ui/PreferencesVarietyDialog.ui:1028 #: ../data/ui/PreferencesVarietyDialog.ui:1777 msgid "Appearance" msgstr "外观" #: ../data/ui/PreferencesVarietyDialog.ui:1059 msgid "Quotes area width: " msgstr "箴言区域宽度 " #: ../data/ui/PreferencesVarietyDialog.ui:1073 msgid "Narrow " msgstr "窄 " #: ../data/ui/PreferencesVarietyDialog.ui:1104 msgid "Wide" msgstr "宽" #: ../data/ui/PreferencesVarietyDialog.ui:1128 msgid "Horizontal position: " msgstr "水平位置 " #: ../data/ui/PreferencesVarietyDialog.ui:1142 msgid "Left " msgstr "左侧 " #: ../data/ui/PreferencesVarietyDialog.ui:1197 msgid "Vertical position: " msgstr "竖直位置 " #: ../data/ui/PreferencesVarietyDialog.ui:1211 msgid "Top " msgstr "顶部 " #: ../data/ui/PreferencesVarietyDialog.ui:1264 msgid "Placement" msgstr "位置" #: ../data/ui/PreferencesVarietyDialog.ui:1298 msgid "Show quotes from these sources: " msgstr "显示箴言从如下源: " #: ../data/ui/PreferencesVarietyDialog.ui:1372 msgid "" "More " "plugins" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1391 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "仅显示如下标签和作者的,留空则随机显示箴言。" #: ../data/ui/PreferencesVarietyDialog.ui:1453 msgid "Example: funny, inspirational" msgstr "例如:funny, inspirational" #: ../data/ui/PreferencesVarietyDialog.ui:1466 msgid "Example: Albert Einstein, Voltaire" msgstr "例如:Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui:1479 msgid "Authors: " msgstr "作者: " #: ../data/ui/PreferencesVarietyDialog.ui:1500 msgid "Sources and filtering" msgstr "源和过滤器" #: ../data/ui/PreferencesVarietyDialog.ui:1526 msgid "Change quote every " msgstr "切换箴言每 " #: ../data/ui/PreferencesVarietyDialog.ui:1547 #: ../data/ui/PreferencesVarietyDialog.ui:1548 #: ../data/ui/PreferencesVarietyDialog.ui:1565 #: ../data/ui/PreferencesVarietyDialog.ui:1566 msgid "Minimum interval is 10 seconds" msgstr "最小间隔为10 秒" #: ../data/ui/PreferencesVarietyDialog.ui:1593 msgid "Regular change" msgstr "切换规则" #: ../data/ui/PreferencesVarietyDialog.ui:1622 msgid "Clock" msgstr "时钟" #: ../data/ui/PreferencesVarietyDialog.ui:1635 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "显示一个漂亮的大数字时钟,用于显示当前时间和日期。" #: ../data/ui/PreferencesVarietyDialog.ui:1640 msgid "" "To configure the clock's appearance edit the clock_filter property in " "Variety's settings file (~/.config/variety/variety.conf). Use the comments " "in ~/.config/variety/variety_latest_default.conf as a guide." msgstr "" "要配置时钟的外观可编辑Variety的配置文件中的clock_filter属性。可以参照~/.config/variety/variety_latest_default.conf中的内容。" #: ../data/ui/PreferencesVarietyDialog.ui:1676 msgid "Clock font: " msgstr "时钟字体: " #: ../data/ui/PreferencesVarietyDialog.ui:1719 msgid "Date font: " msgstr "日期字体: " #: ../data/ui/PreferencesVarietyDialog.ui:1760 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1803 msgid "Effects" msgstr "特效" #: ../data/ui/PreferencesVarietyDialog.ui:1831 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1853 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1872 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1890 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1915 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1977 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1991 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1992 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1993 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1994 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:1995 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2027 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2052 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2088 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2102 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2103 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2104 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2105 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2150 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2177 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2206 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2235 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2265 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2289 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2318 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2342 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2371 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2395 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2429 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2442 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2470 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2497 msgid "Fetch folder" msgstr "存放获取图片的文件夹" #: ../data/ui/PreferencesVarietyDialog.ui:2520 msgid "Save manually downloaded wallpapers to " msgstr "手动保存下载的壁纸到 " #: ../data/ui/PreferencesVarietyDialog.ui:2574 msgid "Drag and drop" msgstr "拖放" #: ../data/ui/PreferencesVarietyDialog.ui:2594 msgid "" "Variety's icon in the launcher serves as a drop target. Drop any image URL or file on it and it will be saved to your fetch folder. You can then press Next to see it on your desktop.\n" "To show the icon in the launcher choose About or Preferences. You may wish to lock it there for easy drag-and-drop access." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2628 msgid "Clipboard monitoring" msgstr "监视剪贴板" #: ../data/ui/PreferencesVarietyDialog.ui:2641 msgid "Monitor clipboard for image URLs and fetch them" msgstr "监视剪贴板中图片的URL并获取它们" #: ../data/ui/PreferencesVarietyDialog.ui:2663 msgid "But fetch only when the URL host is one of these:" msgstr "仅获取下面网站之一的图片" #: ../data/ui/PreferencesVarietyDialog.ui:2728 msgid "Manual downloading" msgstr "手动下载" #: ../data/ui/PreferencesVarietyDialog.ui:2748 msgid "When possible use images that:" msgstr "用到图片之处:" #: ../data/ui/PreferencesVarietyDialog.ui:2784 msgid "Have landscape orientation" msgstr "保持景观取向" #: ../data/ui/PreferencesVarietyDialog.ui:2809 msgid "Are big at least " msgstr "大小至少是 " #: ../data/ui/PreferencesVarietyDialog.ui:2831 msgid "50" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2832 msgid "80" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2833 msgid "100" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:2848 msgid "% of the screen resolution" msgstr "% 的屏幕分辨率" #: ../data/ui/PreferencesVarietyDialog.ui:2882 msgid "Color" msgstr "颜色" #: ../data/ui/PreferencesVarietyDialog.ui:2901 msgid "Are dark or light:" msgstr "暗或亮:" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2923 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "暗色" #. Color option - images that are dark or light #: ../data/ui/PreferencesVarietyDialog.ui:2924 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "加亮" #: ../data/ui/PreferencesVarietyDialog.ui:2949 msgid "Contain this color: " msgstr "包括该色彩: " #: ../data/ui/PreferencesVarietyDialog.ui:2985 msgid "(Takes effect after some initial searching)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3024 msgid "Rating" msgstr "评分" #: ../data/ui/PreferencesVarietyDialog.ui:3041 msgid "Have EXIF rating at least " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3064 msgid "1" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3065 msgid "2" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3066 msgid "3" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3067 msgid "4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3068 msgid "5" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3104 msgid "Color and size" msgstr "色彩与尺寸" #: ../data/ui/PreferencesVarietyDialog.ui:3131 msgid "Indicator Icon" msgstr "指示器图标" #: ../data/ui/PreferencesVarietyDialog.ui:3154 msgid "Indicator icon:" msgstr "指示器图标:" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3170 msgctxt "Icon option" msgid "Light" msgstr "加亮" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3171 msgctxt "Icon option" msgid "Dark" msgstr "暗色" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3172 msgctxt "Icon option" msgid "Number 1" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3173 msgctxt "Icon option" msgid "Number 2" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3174 msgctxt "Icon option" msgid "Number 3" msgstr "" #. Icon option #: ../data/ui/PreferencesVarietyDialog.ui:3175 msgctxt "Icon option" msgid "Number 4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3176 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "用当前壁纸" #: ../data/ui/PreferencesVarietyDialog.ui:3177 msgctxt "Icon option" msgid "Custom image..." msgstr "定制图片" #: ../data/ui/PreferencesVarietyDialog.ui:3178 msgctxt "Icon option" msgid "None" msgstr "无" #: ../data/ui/PreferencesVarietyDialog.ui:3195 msgid "Select an icon" msgstr "选择图标" #: ../data/ui/PreferencesVarietyDialog.ui:3219 msgid "" "When the icon is hidden, Variety can be controlled from the command line, or" " from the launcher quicklist. Run \"variety --help\" to see all available " "commands." msgstr "当图标隐藏时,可以通过命令或启动器图标的上下文菜单中控制Variety。运行\"variety --help\" 可以看到所有可用的命令。" #: ../data/ui/PreferencesVarietyDialog.ui:3249 msgid "Favorites Operations" msgstr "收藏夹操作" #: ../data/ui/PreferencesVarietyDialog.ui:3272 msgid "Favorites operations to show in main menu:" msgstr "在主菜单显示收藏夹操作" #: ../data/ui/PreferencesVarietyDialog.ui:3288 msgid "Copy to Favorites" msgstr "拷贝到收藏夹" #: ../data/ui/PreferencesVarietyDialog.ui:3290 msgid "Both Copy and Move" msgstr "拷贝且移动" #: ../data/ui/PreferencesVarietyDialog.ui:3291 msgid "Depends on folder..." msgstr "依赖文件夹..." #: ../data/ui/PreferencesVarietyDialog.ui:3348 msgid "Login Screen Support" msgstr "登录屏支持" #: ../data/ui/PreferencesVarietyDialog.ui:3370 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "确认登录屏壁纸由Variety设置" #: ../data/ui/PreferencesVarietyDialog.ui:3394 msgid "" "Privacy warning: To show your wallpaper LightDM needs read " "permissions over the image. With this option on, Variety will copy the " "wallpapers to a public folder and change their permissions to make them " "readable by all. By default, the folder is ~/Pictures if your home folder in" " not encrypted, and /usr/share/backgrounds if it is. Please use with care on" " multiuser systems." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3416 msgid "Copy wallpaper image files to this folder: " msgstr "复制壁纸图片到该文件夹: " #: ../data/ui/PreferencesVarietyDialog.ui:3443 msgid "Reset to default" msgstr "重置为默认设置" #: ../data/ui/PreferencesVarietyDialog.ui:3458 msgid "Still doesn't work?" msgstr "还不能工作?" #: ../data/ui/PreferencesVarietyDialog.ui:3488 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "貌似你的主文件夹被加密了,因此其中的文件夹不能使用。" #: ../data/ui/PreferencesVarietyDialog.ui:3509 msgid "You don't have write permissions for this folder." msgstr "你没有这个文件夹的写权限:" #: ../data/ui/PreferencesVarietyDialog.ui:3526 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "该文件夹没有赋予LightDM读文件的权限" #: ../data/ui/PreferencesVarietyDialog.ui:3543 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "Variety能够调整权限,但你必须提供超级用户的权限。" #: ../data/ui/PreferencesVarietyDialog.ui:3600 msgid "Customize" msgstr "自定义" #: ../data/ui/PreferencesVarietyDialog.ui:3619 #: ../data/ui/PreferencesVarietyDialog.ui:3865 msgid "Tips and tricks" msgstr "提示和窍门" #: ../data/ui/PreferencesVarietyDialog.ui:3667 msgid "Recent changes" msgstr "最近切换" #: ../data/ui/PreferencesVarietyDialog.ui:3719 msgid "Visit website" msgstr "浏览网站" #: ../data/ui/PreferencesVarietyDialog.ui:3754 msgid "Report a bug or request a feature" msgstr "报告BUG或申请特性" #: ../data/ui/PreferencesVarietyDialog.ui:3788 msgid "Send feedback" msgstr "发送反馈" #: ../data/ui/PreferencesVarietyDialog.ui:3821 #: ../data/ui/PreferencesVarietyDialog.ui:3885 msgid "Donate to Variety" msgstr "捐赠 Variety" #: ../data/ui/PreferencesVarietyDialog.ui:3833 #: ../data/ui/PreferencesVarietyDialog.ui:3919 msgid "Donate via PayPal" msgstr "通过PayPal捐赠" #: ../data/ui/PreferencesVarietyDialog.ui:3903 msgid "" "I am developing Variety in my spare time, which usually means the late hours after my kids go to bed. Any amount you donate will be appreciated. It will show me Variety is valued by you - the users - and will motivate me to continue working actively on it.\n" "\n" "Thank you,\n" "Peter Levi" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3951 msgid "To donate in Bitcoin, please send to this wallet:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui:3964 msgid "bc1qgxlvmwe2pj5lvku6vm53edes3q7c3ykta7xyu4" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:14 msgid "Variety - Privacy Notice" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:45 msgid "Reject and Quit" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:58 msgid "Accept and Continue" msgstr "" #: ../data/ui/PrivacyNoticeDialog.ui:97 msgid "Privacy Notice" msgstr "" #. Main text for the Privacy Notice dialog #: ../data/ui/PrivacyNoticeDialog.ui:124 msgid "" "Before we start, here are some things you need to be aware of and agree to:\n" "\n" "Variety is an open-source application, provided as is, without any warranties. By using it, you agree to the terms and conditions of the GNU GPLv3 license under which it is distributed. \n" "\n" "Variety is an internet-connected application. With default settings, Variety downloads images from the internet. Web servers it downloads from may collect information about your device, like IP address. Variety does not send any personally identifiable information. By using Variety, you accept its use of internet connectivity. Note that all online image sources can be disabled. \n" "\n" "Variety fetches and applies rate limiting settings defined by the development team. This may affect the rate at which it downloads new images, but it helps ensure Variety can work regardless of how many people are running it. These settings will be downloaded from gist.github.com where we host them.\n" "\n" "Some image sources require us to track additional information when enabled. For example the terms of Unsplash require us to track and report when users download and view images from Unsplash." msgstr "" #: ../data/ui/WelcomeDialog.ui:13 ../data/ui/WelcomeDialog.ui:76 msgid "Welcome to Variety!" msgstr "Variety 欢迎您!" #: ../data/ui/WelcomeDialog.ui:38 msgid "Continue" msgstr "继续" #: ../data/ui/WelcomeDialog.ui:94 msgid "" "Variety is an automatic wallpaper changer. It rotates your desktop wallpaper" " on a regular basis using local images or images downloaded from various " "online sources. It runs quietly in the background - to control it, click " "this icon in your system tray:" msgstr "" #: ../data/ui/WelcomeDialog.ui:124 msgid "" "Variety is open-source software, created by Peter Levi, a software developer" " from Bulgaria. If you like it, please donate." msgstr "" #: ../data/ui/WelcomeDialog.ui:143 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" variety-0.8.13/pyproject.toml000066400000000000000000000004631475753071700162250ustar00rootroot00000000000000[tool.black] line-length = 100 target_version = ['py35'] include = '\.pyi?$' exclude = ''' ( /( \.eggs # exclude a few common directories in the | \.git # root of the project | \.hg | \.mypy_cache | \.tox | \.venv | _build | build | dist )/ ) ''' variety-0.8.13/requirements.txt000066400000000000000000000001231475753071700165660ustar00rootroot00000000000000beautifulsoup4 lxml configobj pycairo requests pygobject pillow httplib2 packaging variety-0.8.13/setup.py000066400000000000000000000056531475753071700150310ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE from __future__ import print_function import os import sys from variety_lib.varietyconfig import get_version if sys.version_info[0] < 3: print("Variety requires Python 3 - please run this script using python3.", file=sys.stderr) sys.exit(1) try: import DistUtilsExtra.auto except ImportError: print( "To build variety you need python-distutils-extra for Python 3 - https://launchpad.net/python-distutils-extra", file=sys.stderr, ) sys.exit(1) assert DistUtilsExtra.auto.__version__ >= "2.18", "needs DistUtilsExtra.auto >= 2.18" # Dynamically generate and install the data directory for Variety BUILD_SETTINGS_PATH = "variety_lib/variety_build_settings.py" class InstallWithDataDirectory(DistUtilsExtra.auto.install_auto): def run(self): data_path = os.path.join(self.prefix, "share/variety/") with open(BUILD_SETTINGS_PATH, "w") as f: f.write("### Autogenerated by setup.py - do not edit!\n") f.write("__variety_data_directory__ = %r\n" % data_path) print("This build will look for Variety's data in %r." % data_path) DistUtilsExtra.auto.install_auto.run(self) DistUtilsExtra.auto.setup( name="variety", version=get_version(), license="GPL-3", author="Peter Levi", author_email="peterlevi@peterlevi.com", description="Wallpaper changer, downloader and manager", long_description=""" Variety is a wallpaper manager for Linux systems. It supports numerous desktops and wallpaper sources, including local files and online services: Flickr, Wallhaven, Unsplash, and more. Where supported, Variety sits as a tray icon to allow easy pausing and resuming. Otherwise, its desktop entry menu provides a similar set of options. Variety also includes a range of image effects, such as oil painting and blur, as well as options to layer quotes and a clock onto the background.""", url="https://github.com/varietywalls/variety", cmdclass={"install": InstallWithDataDirectory}, data_files=[("share/metainfo", ["variety.appdata.xml"])], ) # Remove this after we're done with the build if os.path.exists(BUILD_SETTINGS_PATH): os.remove(BUILD_SETTINGS_PATH) variety-0.8.13/tests/000077500000000000000000000000001475753071700144505ustar00rootroot00000000000000variety-0.8.13/tests/TestAPODDownloader.py000066400000000000000000000021151475753071700204230ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from tests.TestDownloader import get_plugin_downloader, test_download_one_for class TestAPODDownloader(unittest.TestCase): def test_download_one(self): dl = get_plugin_downloader("APODDownloader") test_download_one_for(self, dl) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestArtStationDownloader.py000066400000000000000000000042331475753071700217730ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from tests.TestDownloader import test_download_one_for from variety.plugins.builtin.downloaders.ArtStationSource import ArtStationSource class TestArtStationDownloader(unittest.TestCase): def test_download_one(self): test_download_one_for( self, ArtStationSource().create_downloader("https://www.artstation.com/anubis1982918.rss"), ) def test_validate(self): source = ArtStationSource() self.assertEqual( ("https://www.artstation.com/anubis1982918.rss", None), source.validate("https://www.artstation.com/anubis1982918.rss"), ) self.assertEqual( ("https://www.artstation.com/anubis1982918.rss", None), source.validate("https://www.artstation.com/anubis1982918"), ) self.assertEqual( ("https://www.artstation.com/anubis1982918.rss", None), source.validate("https://artstation.com/anubis1982918"), ) self.assertEqual( ("https://www.artstation.com/anubis1982918.rss", None), source.validate("http://artstation.com/anubis1982918"), ) self.assertEqual( ("https://www.artstation.com/anubis1982918.rss", None), source.validate("anubis1982918") ) self.assertIsNotNone(source.validate("http://cnn.com")[1]) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestAttrDict.py000066400000000000000000000031051475753071700173770ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from tests import setup_test_logging from variety.AttrDict import AttrDict setup_test_logging() class TestAttrDict(unittest.TestCase): def test_attr_dict(self): a = AttrDict({"a": {"b": 1}}) self.assertFalse(bool(a.deep.inside)) self.assertTrue(bool(a.a)) self.assertEqual(1, a.a.b) a.l.k = 3 self.assertEqual(3, a.l.k) a.f.g.h = 2 self.assertEqual(2, a.f.g.h) a["x"]["y"]["z"] = 1 self.assertEqual(1, a["x"]["y"]["z"]) b = AttrDict(x=1, y=2) self.assertFalse(bool(b.deep.inside)) self.assertEqual(1, b.x) self.assertEqual(2, b.y) b.c = {"z": 3} self.assertEqual(3, b.c.z) self.assertFalse(bool(b.c.dredrefre)) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestBingDownloader.py000066400000000000000000000023521475753071700205620ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from tests.TestDownloader import get_plugin_downloader, test_download_one_for class TestBingDownloader(unittest.TestCase): def test_download_one(self): dl = get_plugin_downloader("BingDownloader") test_download_one_for(self, dl) def test_fill_queue(self): dl = get_plugin_downloader("BingDownloader") queue = dl.fill_queue() self.assertTrue(len(queue) > 0) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestDownloader.py000066400000000000000000000032071475753071700177620ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import os import shutil import unittest from jumble.Jumble import Jumble from tests import setup_test_logging from variety import Util from variety.AttrDict import AttrDict setup_test_logging() def get_plugin_downloader(typename): p = Jumble(["variety/plugins/builtin"]) p.load() plugin = p.get_plugins(typename=typename)[0]["plugin"] parent = AttrDict() parent.size_ok = lambda x, y: True plugin.set_variety(parent) return plugin def test_download_one_for(test_case, dl): dl.target_folder = "/tmp/variety/%s" % dl.__class__.__name__ shutil.rmtree(dl.target_folder, ignore_errors=True) for _ in range(5): f = dl.download_one() if f and os.path.isfile(f) and Util.is_image(f, check_contents=True): return test_case.fail("Tried download_one 5 times, all failed") if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestEartviewDownloader.py000066400000000000000000000021271475753071700214710ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from tests.TestDownloader import get_plugin_downloader, test_download_one_for class TestEarthviewDownloader(unittest.TestCase): def test_download_one(self): dl = get_plugin_downloader("EarthviewDownloader") test_download_one_for(self, dl) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestFlickrDownloader.py000066400000000000000000000061241475753071700211160ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from tests.TestDownloader import test_download_one_for from variety.FlickrDownloader import FlickrDownloader class TestFlickrDownloader(unittest.TestCase): def test_download_one(self): test_download_one_for( self, FlickrDownloader(None, "user:www.flickr.com/photos/peter-levi/;user_id:93647178@N00;"), ) def test_obtain_userid_ok(self): self.assertEqual( (True, "ok", "34388055@N08"), FlickrDownloader.obtain_userid("http://www.flickr.com/photos/camillelacroix/"), ) def test_obtain_userid_fail(self): self.assertEqual( (False, "User not found", None), FlickrDownloader.obtain_userid("http://www.flickr.com/photos/bad_username_here_xxx/"), ) def test_obtain_groupid_ok(self): self.assertEqual( (True, "ok", "40961104@N00"), FlickrDownloader.obtain_groupid("http://www.flickr.com/groups/wallpapers/"), ) def test_obtain_groupid_fail(self): self.assertEqual( (False, "Group not found", None), FlickrDownloader.obtain_groupid("http://www.flickr.com/groups/bad_groupname_here_xxx/"), ) def test_get_photo_id(self): self.assertEqual( "7527967456", FlickrDownloader.get_photo_id("https://www.flickr.com/photos/peter-levi/7527967456/"), ) self.assertEqual( "7527967456", FlickrDownloader.get_photo_id("https://www.flickr.com/photos/peter-levi/7527967456"), ) def test_get_image_url(self): self.assertEqual( "https://live.staticflickr.com/8426/7527967456_41f8ae5caf_k.jpg", FlickrDownloader.get_image_url("https://www.flickr.com/photos/peter-levi/7527967456/"), ) def test_get_extra_metadata(self): expected = { "headline": "IMG_1924", "keywords": ["greece", "greek", "islands"], "description": "", "authorURL": "https://www.flickr.com/photos/93647178@N00", "author": "Peter Levi", } self.assertEqual( expected, FlickrDownloader.get_extra_metadata( "https://www.flickr.com/photos/peter-levi/7527967456/" ), ) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestGoodreadsSource.py000066400000000000000000000022601475753071700207520ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from jumble.Jumble import Jumble class TestGoodreadsSource(unittest.TestCase): def test_get_for_author(self): p = Jumble(["variety/plugins/builtin"]) p.load() source = p.get_plugins(typename="GoodreadsSource")[0] q = source["plugin"].get_for_author("Вежинов") self.assertTrue(len(q) > 0) self.assertEqual("Goodreads", q[0]["sourceName"]) variety-0.8.13/tests/TestImageFetcher.py000066400000000000000000000063741475753071700202170ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import os.path import shutil import unittest from variety import Util from variety.ImageFetcher import ImageFetcher class TestImageFetcher(unittest.TestCase): def test_fetch(self): target_folder = "/tmp/variety/ImageFetcher" shutil.rmtree(target_folder, ignore_errors=True) os.makedirs(target_folder) for url in [ "https://w.wallhaven.cc/full/dg/wallhaven-dgeqoj.jpg", "http://unsplash.com/photos/7EqQ1s3wIAI/download", ]: f = ImageFetcher.fetch(url, target_folder, verbose=False) self.assertIsNotNone(f) self.assertTrue(os.path.isfile(f)) self.assertTrue(Util.is_image(f, check_contents=False)) self.assertTrue(Util.is_image(f, check_contents=True)) self.assertNotEqual("download", f) def test_extract_from_cd(self): self.assertEqual( "img.jpg", ImageFetcher.extract_filename_from_content_disposition("attachment; filename=img.jpg"), ) self.assertEqual( "img.jpg", ImageFetcher.extract_filename_from_content_disposition( "attachment; filename='img.jpg'" ), ) self.assertEqual( "img.jpg", ImageFetcher.extract_filename_from_content_disposition( 'attachment; filename="img.jpg"' ), ) self.assertEqual( None, ImageFetcher.extract_filename_from_content_disposition("attachment; a=b") ) def test_url_ok(self): self.assertFalse(ImageFetcher.url_ok("some garbage", False, ["flickr.com", "wallbase.cc"])) self.assertFalse(ImageFetcher.url_ok("some garbage", True, ["flickr.com", "wallbase.cc"])) self.assertFalse(ImageFetcher.url_ok("http://www.host.com/x/y/z", False, ["flickr.com"])) self.assertFalse( ImageFetcher.url_ok("http://cnn.com/x/y", True, ["flickr.com", "wallbase.cc"]) ) self.assertFalse( ImageFetcher.url_ok("http://somehost.com/x/y", True, ["", "flickr.com", "wallbase.cc"]) ) self.assertTrue(ImageFetcher.url_ok("http://www.host.com/x/y/z.jpg", False, ["flickr.com"])) self.assertTrue( ImageFetcher.url_ok("http://www.wallbase.cc/x/y/z", True, ["flickr.com", "wallbase.cc"]) ) self.assertTrue( ImageFetcher.url_ok("https://www.flickr.com/a", True, ["flickr.com", "wallbase.cc"]) ) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestJumble.py000066400000000000000000000025471475753071700171100ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import os.path import sys import unittest from jumble.IPlugin import IPlugin from jumble.Jumble import Jumble from variety.plugins.IQuoteSource import IQuoteSource sys.path.insert(0, os.path.realpath(os.path.dirname(__file__))) class P1(IPlugin): pass class P2(IQuoteSource): pass class TestJumble(unittest.TestCase): def test_load(self): p = Jumble(["variety/plugins/builtin"]) p.load() self.assertEqual(18, len(p.get_plugins())) self.assertEqual(18, len(p.get_plugins(IPlugin))) self.assertEqual(1, len(p.get_plugins(name="Goodreads"))) variety-0.8.13/tests/TestMediaRssDownloader.py000066400000000000000000000034721475753071700214160ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from tests.TestDownloader import test_download_one_for from variety.plugins.builtin.downloaders.MediaRSSDownloader import MediaRSSDownloader from variety.plugins.builtin.downloaders.MediaRSSSource import MediaRSSSource class TestMediaRssDownloader(unittest.TestCase): def test_download_one(self): test_download_one_for( self, MediaRSSSource().create_downloader( "http://backend.deviantart.com/rss.xml?q=boost%3Apopular+leaves&type=deviation" ), ) def test_validate_deviantart(self): self.assertTrue( MediaRSSDownloader.validate( "http://backend.deviantart.com/rss.xml?q=boost%3Apopular+leaves&type=deviation" ) ) def test_validate_non_media_rss(self): self.assertFalse(MediaRSSDownloader.validate("http://www.dnevnik.bg/rss/?page=index")) def test_validate_non_rss(self): self.assertFalse(MediaRSSDownloader.validate("http://google.com")) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestNationalGeographicDownloader.py000066400000000000000000000021511475753071700234360ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from tests.TestDownloader import get_plugin_downloader, test_download_one_for class TestNationalGeographicDownloader(unittest.TestCase): def test_download_one(self): dl = get_plugin_downloader("NationalGeographicDownloader") test_download_one_for(self, dl) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestQuotationsPageSource.py000066400000000000000000000036701475753071700220140ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from jumble.Jumble import Jumble class TestQuotationsPageSource(unittest.TestCase): def test_get_random(self): p = Jumble(["variety/plugins/builtin"]) p.load() source = p.get_plugins(typename="QuotationsPageSource")[0] q = source["plugin"].get_random() self.assertTrue(len(q) > 0) self.assertEqual("TheQuotationsPage.com", q[0]["sourceName"]) def test_get_for_author(self): p = Jumble(["variety/plugins/builtin"]) p.load() source = p.get_plugins(typename="QuotationsPageSource")[0] q = source["plugin"].get_for_author("voltaire") self.assertTrue(len(q) > 0) self.assertEqual("TheQuotationsPage.com", q[0]["sourceName"]) self.assertEqual("Voltaire", q[0]["author"]) def test_get_for_keyword(self): p = Jumble(["variety/plugins/builtin"]) p.load() source = p.get_plugins(typename="QuotationsPageSource")[0] q = source["plugin"].get_for_keyword("funny") self.assertTrue(len(q) > 0) self.assertEqual("TheQuotationsPage.com", q[0]["sourceName"]) self.assertTrue(q[0]["quote"].lower().find("funny") >= 0) variety-0.8.13/tests/TestRedditDownloader.py000066400000000000000000000055411475753071700211210ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from tests.TestDownloader import test_download_one_for from variety.AttrDict import AttrDict from variety.plugins.builtin.downloaders.RedditDownloader import RedditDownloader from variety.plugins.builtin.downloaders.RedditSource import RedditSource class TestRedditDownloader(unittest.TestCase): def test_download_one(self): source = RedditSource() test_download_one_for(self, source.create_downloader("http://www.reddit.com/r/AutumnPorn/")) def test_build_json_url(self): self.assertEqual( "http://www.reddit.com/r/comics/.json?limit=100", RedditDownloader.build_json_url("http://www.reddit.com/r/comics/"), ) self.assertEqual( "http://www.reddit.com/r/comics/top/.json?limit=100", RedditDownloader.build_json_url("http://www.reddit.com/r/comics/top/"), ) self.assertEqual( "http://www.reddit.com/r/comics/top/.json?sort=top&t=week&limit=100", RedditDownloader.build_json_url("http://www.reddit.com/r/comics/top/?sort=top&t=week"), ) def test_validate(self): parent = AttrDict() parent.options.safe_mode = True source = RedditSource() source.set_variety(parent) def _validate(url): return source.validate(url)[1] is None self.assertTrue(_validate("http://www.reddit.com/r/comics")) self.assertFalse(_validate("http://www.reddit.com/r/nsfw/")) parent.options.safe_mode = False self.assertTrue(_validate("http://www.reddit.com/r/comics")) self.assertTrue(_validate("http://www.reddit.com/r/nsfw/")) self.assertTrue(_validate("http://www.reddit.com/r/AutumnPorn/")) self.assertTrue(_validate("http://www.reddit.com/r/AutumnPorn/top?sort=top&t=month")) self.assertFalse(_validate("http://www.reddit.com/r/bestof/")) self.assertFalse(_validate("http://www.reddit.com/r/dhkjregfhjregfjfdrejh/")) self.assertFalse(_validate("http://www.notreddit.com/r/dhkjregfhjregfjfdrejh/")) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestUnsplashConfigurableDownloader.py000066400000000000000000000037361475753071700240300ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from tests.TestDownloader import test_download_one_for from variety.AttrDict import AttrDict from variety.plugins.builtin.downloaders.UnsplashConfigurableSource import ( UnsplashConfigurableSource, ) class TestUnsplashConfigurableDownloader(unittest.TestCase): def _source(self): parent = AttrDict() parent.size_ok = lambda x, y: True source = UnsplashConfigurableSource() source.set_variety(parent) return source def test_download_one(self): test_download_one_for(self, self._source().create_downloader("landscape")) def test_validate(self): source = self._source() self.assertIsNone(source.validate("nature")[1]) self.assertIsNone(source.validate("https://unsplash.com/s/photos/landscape")[1]) self.assertIsNone(source.validate("https://unsplash.com/@pawel_czerwinski")[1]) self.assertIsNone( source.validate("https://unsplash.com/collections/3694365/gradient-nation")[1] ) def test_fill_queue(self): dl = self._source().create_downloader("nature") queue = dl.fill_queue() self.assertTrue(len(queue) > 0) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestUnsplashDownloader.py000066400000000000000000000024411475753071700214770ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from tests.TestDownloader import get_plugin_downloader, test_download_one_for class TestUnsplashDownloader(unittest.TestCase): def test_download_one(self): dl = get_plugin_downloader("UnsplashDownloader") test_download_one_for(self, dl) def test_fill_queue(self): dl = get_plugin_downloader("UnsplashDownloader") dl.target_folder = "/tmp/variety/" queue = dl.fill_queue() self.assertTrue(len(queue) > 0) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestUtil.py000066400000000000000000000260021475753071700165770ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import os import os.path import time import unittest from variety.Util import Util, cache, debounce, throttle class TestUtil(unittest.TestCase): @classmethod def setUpClass(cls): # Chdir to the tests directory so that we can find our test images curdir = os.path.dirname(os.path.abspath(__file__)) if curdir: os.chdir(curdir) def test_sanitize_filename(self): self.assertEqual("i_m____g_.jpg", Util.sanitize_filename("i?m?*%^g_.jpg")) def test_get_local_name(self): self.assertEqual("img.jpg", Util.get_local_name("http://example.com/a/img?a=b")) self.assertEqual("img.jpg", Util.get_local_name("http://example.com/a/img.jpg?a=b")) self.assertEqual("img.jpg", Util.get_local_name("http://example.com/a/img.jpg#x")) self.assertEqual("img.jpg", Util.get_local_name("http://example.com/a/img.jpg?a=b#x")) self.assertEqual("im g.jpg", Util.get_local_name("http://example.com/a/im%20g.jpg?a=b#x")) self.assertEqual("im_g.jpg", Util.get_local_name("http://example.com/a/im%22g.jpg?a=b#x")) self.assertTrue(len(Util.get_local_name("a" * 1000 + ".jpg")) < 255) def test_split(self): self.assertEqual(["a", "b", "c", "d", "e"], Util.split("a\nb,c ,,d\n e")) def test_metadata(self): self.assertTrue(os.path.exists("test.jpg")) info = { "sourceURL": "b", "imageURL": "d", "sourceName": "a", "sourceLocation": "c", "sourceType": "flickr", "author": "автор", "authorURL": "url", "keywords": ["дума1", "дума2"], "headline": "проба1 проба1", "description": "проба2 проба2", "sfwRating": 50, "extraData": {"key1": "val1", "key2": "val2"}, } self.assertEqual(info, Util.read_metadata("test.jpg")) self.assertTrue(Util.write_metadata("test.jpg", info)) self.assertEqual(info, Util.read_metadata("test.jpg")) self.assertTrue(os.path.exists("test.svg")) self.assertEqual(info, Util.read_metadata("test.svg")) Util.write_metadata("test.svg", info) self.assertEqual(info, Util.read_metadata("test.svg")) def test_read_write_rating(self): self.assertTrue(os.path.exists("test.jpg")) self.assertEqual(None, Util.get_rating("test.jpg")) Util.set_rating("test.jpg", None) self.assertEqual(None, Util.get_rating("test.jpg")) Util.set_rating("test.jpg", 4) self.assertEqual(4, Util.get_rating("test.jpg")) Util.set_rating("test.jpg", -1) self.assertEqual(-1, Util.get_rating("test.jpg")) Util.set_rating("test.jpg", 0) self.assertEqual(0, Util.get_rating("test.jpg")) Util.set_rating("test.jpg", None) self.assertEqual(None, Util.get_rating("test.jpg")) try: Util.set_rating("test.jpg", -10) self.assertTrue(False, "Exception expected") except ValueError: pass # OK def test_find_unique_name(self): self.assertEqual("/etc/fstab_1", Util.find_unique_name("/etc/fstab")) self.assertEqual("/etc/bash_1.bashrc", Util.find_unique_name("/etc/bash.bashrc")) def test_folderpath(self): self.assertEqual("/", Util.folderpath("/")) self.assertEqual("/a/b/c/", Util.folderpath("/a/b/c")) def test_gtk_to_fcmatch_font(self): self.assertEqual( ("Bitstream Charter:Bold:Italic:10", "10"), Util.gtk_to_fcmatch_font("Bitstream Charter Bold Italic 10"), ) def test_file_in(self): self.assertTrue(Util.file_in("/a/b/a.txt", "/a/")) self.assertTrue(Util.file_in("/a/b/a.txt", "/a/b/")) self.assertFalse(Util.file_in("/a/b/a.txt", "/c/")) def test_same_file_paths(self): self.assertTrue(Util.same_file_paths("/a/../b/c", "/b/c")) self.assertFalse(Util.same_file_paths("/a/../b/c", "/a/./b/c")) def test_compare_versions(self): self.assertEqual(-1, Util.compare_versions("0.6.9", "0.7.0-alpha1")) self.assertEqual(-1, Util.compare_versions("0.4.10", "0.4.11")) self.assertEqual(-1, Util.compare_versions("0.4.10", "0.5")) self.assertEqual(-1, Util.compare_versions("0.4.10", "1")) self.assertEqual(0, Util.compare_versions("0.4.10", "0.4.10")) self.assertEqual(0, Util.compare_versions("1.0.0", "1.0")) # PEP 440 details self.assertEqual(1, Util.compare_versions("0.4.10", "0.4.8")) self.assertEqual(1, Util.compare_versions("0.4.10", "0.4")) self.assertEqual(1, Util.compare_versions("0.4.10", "0")) self.assertEqual(1, Util.compare_versions("0.7.0-beta1", "0.7.0-alpha1")) self.assertEqual(1, Util.compare_versions("0.7.0", "0.7.0-alpha1")) self.assertEqual(1, Util.compare_versions("0.7.0", "0.7.0-beta1")) def test_md5(self): self.assertEqual("098f6bcd4621d373cade4e832627b4f6", Util.md5("test")) def test_md5file(self): self.assertEqual("6af710446c1554d7bc79d7939d6900e4", Util.md5file("test.jpg")) def test_collapseuser(self): self.assertEqual( "~/.config/variety", Util.collapseuser("%s/.config/variety" % os.path.expanduser("~")) ) self.assertEqual( "/home/peteraaa/.config/variety", Util.collapseuser("/home/peteraaa/.config/variety") ) self.assertEqual("/media/.config/variety", Util.collapseuser("/media/.config/variety")) def test_random_hash(self): s = set(Util.random_hash() for i in range(100)) self.assertEqual(100, len(s)) for x in s: self.assertEqual(32, len(x)) def test_get_file_icon_name(self): self.assertEqual("folder", Util.get_file_icon_name("/xxx/yyy/zzz")) # nonexistent self.assertEqual("user-home", Util.get_file_icon_name("~")) self.assertEqual("folder-pictures", Util.get_file_icon_name("~/Pictures")) def test_get_xdg_pictures_folder(self): self.assertEqual(os.path.expanduser("~/Pictures"), Util.get_xdg_pictures_folder()) def test_safe_map(self): def f(i): if i <= 10: raise Exception return i self.assertEqual([20, 30], list(Util.safe_map(f, [1, 5, 20, 10, 30, 4]))) def test_fetch(self): resp = Util.fetch("//google.com") self.assertTrue(len(resp) > 0) def test_convert_url(self): self.assertEqual( "wallpapers_net_some_category_html", Util.convert_to_filename("http://wallpapers.net/some-category.html"), ) def test_get_size(self): self.assertEqual((32, 32), Util.get_size("test.jpg")) self.assertRaises(Exception, lambda: Util.get_size("fake_image.jpg")) def test_is_image(self): self.assertTrue(Util.is_image("test.jpg")) self.assertTrue(Util.is_image("test.jpg", check_contents=True)) self.assertTrue(Util.is_image("fake_image.jpg")) self.assertFalse(Util.is_image("fake_image.jpg", check_contents=True)) def test_is_animated_gif(self): self.assertFalse(Util.is_animated_gif("test.jpg")) self.assertTrue(Util.is_animated_gif("animated.gif")) self.assertFalse(Util.is_animated_gif("not-animated.gif")) def test_is_dead_or_not_image(self): self.assertTrue(Util.is_dead_or_not_image(None)) self.assertTrue(Util.is_dead_or_not_image("not a URL")) self.assertTrue(Util.is_dead_or_not_image("http://www.cnn.com/")) self.assertTrue(Util.is_dead_or_not_image("http://vrty.org/")) self.assertTrue(Util.is_dead_or_not_image("http://www.google.com/dejkjdrelkjflkrejfjre")) self.assertFalse( Util.is_dead_or_not_image( "https://farm8.staticflickr.com/7133/7527967878_85fea93129_o.jpg" ) ) self.assertFalse( Util.is_dead_or_not_image( "http://interfacelift.com/wallpaper/D98ef829/00899_rustedbolt_2560x1600.jpg" ) ) self.assertTrue( Util.is_dead_or_not_image("http://wallpapers.wallbase.cc/rozne/wallpaper-1227671.jpg") ) self.assertTrue( Util.is_dead_or_not_image("http://ns223506.ovh.net/rozne/a1b2/wallpaper-1996019.png") ) def test_debounce(self): """ Test that the increment function is being debounced. The counter should only be incremented once 10 seconds after the last call to the function """ count = [0] @debounce(0.6) def increment(): count[0] += 1 self.assertTrue(count[0] == 0) increment() increment() time.sleep(0.4) self.assertTrue(count[0] == 0) increment() increment() increment() increment() self.assertTrue(count[0] == 0) time.sleep(0.6) self.assertTrue(count[0] == 1) def test_throttle_no_trailing(self): count = [0] @throttle(seconds=0.3) def increment(): count[0] += 1 self.assertTrue(count[0] == 0) increment() self.assertTrue(count[0] == 1) increment() self.assertTrue(count[0] == 1) time.sleep(0.2) increment() self.assertTrue(count[0] == 1) time.sleep(0.2) increment() self.assertTrue(count[0] == 2) increment() self.assertTrue(count[0] == 2) time.sleep(0.31) self.assertTrue(count[0] == 2) def test_throttle_with_trailing(self): count = [0] @throttle(seconds=0.3, trailing_call=True) def increment(): count[0] += 1 self.assertTrue(count[0] == 0) increment() self.assertTrue(count[0] == 1) increment() self.assertTrue(count[0] == 1) time.sleep(0.2) increment() self.assertTrue(count[0] == 1) time.sleep(0.2) increment() self.assertTrue(count[0] == 2) increment() self.assertTrue(count[0] == 2) time.sleep(0.31) self.assertTrue(count[0] == 3) def test_cache(self): @cache(ttl_seconds=10) def fib(n): return 1 if n <= 1 else fib(n - 1) + fib(n - 2) self.assertEqual(573147844013817084101, fib(100)) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestVarietyWindow.py000066400000000000000000000025261475753071700205020ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import unittest from variety.VarietyWindow import VarietyWindow class TestVarietyWindow(unittest.TestCase): def test_replace_clock_filter_offsets(self): f = "-fill '#DDDDDD' -annotate 0x0+[%HOFFSET+100]+[%VOFFSET+150] '%H:%M' -pointsize 50 -annotate 0x0+[%HOFFSET+100]+[%VOFFSET+100] '%A, %B %d'" ff = VarietyWindow.replace_clock_filter_offsets(f, 200, 3) expected = "-fill '#DDDDDD' -annotate 0x0+300+153 '%H:%M' -pointsize 50 -annotate 0x0+300+103 '%A, %B %d'" self.assertEqual(expected, ff) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/TestWallhavenDownloader.py000066400000000000000000000043761475753071700216340ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import os import tempfile import unittest from unittest.mock import MagicMock from tests.TestDownloader import test_download_one_for from variety.plugins.builtin.downloaders.WallhavenSource import WallhavenSource from variety.Util import Util class TestWallhavenDownloader(unittest.TestCase): def test_download_one(self): source = WallhavenSource() mock = MagicMock() mock.options.wallhaven_api_key = "" source.set_variety(mock) test_download_one_for(self, source.create_downloader("landscape")) def test_legacy_fallback_download_one(self): source = WallhavenSource() mock = MagicMock() mock.options.wallhaven_api_key = "" source.set_variety(mock) with tempfile.TemporaryDirectory() as tmpdir: dl = source.create_downloader("https://wallhaven.cc/user/lewdpatriot/favorites/935888") dl.update_download_folder(tmpdir) for _ in range(5): f = dl.download_one() if f and os.path.isfile(f) and Util.is_image(f, check_contents=True): return self.fail("Tried download_one 5 times, all failed") def test_fill_queue(self): source = WallhavenSource() mock = MagicMock() mock.options.wallhaven_api_key = "" source.set_variety(mock) dl = source.create_downloader("nature") queue = dl.fill_queue() self.assertTrue(len(queue) > 0) if __name__ == "__main__": unittest.main() variety-0.8.13/tests/__init__.py000066400000000000000000000005621475753071700165640ustar00rootroot00000000000000import logging def setup_test_logging(): print("Setting up variety logger") logger = logging.getLogger("variety") logger.setLevel(logging.DEBUG) ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") ch.setFormatter(formatter) logger.addHandler(ch) variety-0.8.13/tests/animated.gif000066400000000000000000000021321475753071700167170ustar00rootroot00000000000000GIF89a22Ha! ! NETSCAPE2.0,22*Ŵ-d(zɢlٞ%p[Pbq61z9}xbUu}*J47Ap[܏ўL&X'7g8xWi Y(9I㉩ْ:#zj9 qi*UVGC&!HD5GhC؋ 7ˋ%z}2E`f+˸-έa\4QRiԽ:=a|X[$0}S1ƍ ! ,-/򜏉#Ŵ-d(zZAZv-Pc6N 4+k L@$%Cjڔʒkk4*^ffiuk?U ^WHgwWt蔷88G'9h4Ù9)F2JY qzYy*ˇ6䊑vƣUk@|Eb˻W*==kV+f$ڷBF䭋t (>rE3fuh*O{ 8:䏱U(! ,-/򜏉#Ŵ-d(zZAZv-Pc6N 4+k L@$%Cjڔʒkk4*^ffiuk?U ^WHgwWt蔷88G'9h4Ù9)F2JY qzYy*ˇ6䊑vƣUk@|Eb˻W*==kV+f$ڷBF䭋t (>rE3fuh*O{ 8:䏱U(! ,-/򜏉#Ŵ-d(zZAZv-Pc6N 4+k L@$%Cjڔʒkk4*^ffiuk?U ^WHgwWt蔷88G'9h4Ù9)F2JY qzYy*ˇ6䊑vƣUk@|Eb˻W*==kV+f$ڷBF䭋t (>rE3fuh*O{ 8:䏱U(;variety-0.8.13/tests/fake_image.jpg000066400000000000000000000000141475753071700172150ustar00rootroot00000000000000Not an imagevariety-0.8.13/tests/not-animated.gif000066400000000000000000000001621475753071700175160ustar00rootroot00000000000000GIF89a((!,((Iڋ޼{"! pblߵUO¡h$!!hjܮ ;variety-0.8.13/tests/test.jpg000066400000000000000000000113031475753071700161270ustar00rootroot00000000000000JFIFExifII*2iJпроба2 проба2\проба2 проба2 1http://ns.adobe.com/xap/1.0/ автор проба2 проба2 дума1 дума2 pPhotoshop 3.08BIMTxпроба2 проба2iпроба1 проба1 дума1 дума2C     C   проба2 проба2 " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?OƔ|LZ{X4Y,"|c;X+˳=o5%љG2E,8 zTGShկf."WF>]h KIj#涉H63\8^?/3SK Wv]򜦌pՊ_~LO|Fm{ t9Cas+ mO V[ZHoRPc (x8ܤ 6{+tU w_kɩIڲ:kSۜ+ٝJIXd2mvMϣ9Upac(Z]z_]ߊZm|Q J.'db@Y $4t&v~ݷ[29RNOQo%ΡFե;}RV7u"cA~Yt~^z%c~1H#ˎ=9W1ݝd8hs)=m}vreyG^\{ORhZ5ip[ +Kr® L!faON*ׄ3kL{5sk $0m܂}{r7|UkwoE[ image/svg+xml variety-0.8.13/tests/test.svg.metadata.json000066400000000000000000000006501475753071700207000ustar00rootroot00000000000000{ "author": "автор", "authorURL": "url", "description": "проба2 проба2", "extraData": { "key1": "val1", "key2": "val2" }, "headline": "проба1 проба1", "imageURL": "d", "keywords": [ "дума1", "дума2" ], "sfwRating": 50, "sourceLocation": "c", "sourceName": "a", "sourceType": "flickr", "sourceURL": "b" }variety-0.8.13/tests/test_lint.py000066400000000000000000000031161475753071700170300ustar00rootroot00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import subprocess import unittest class TestPylint(unittest.TestCase): def test_project_errors_only(self): """run pylint in error only mode your code may well work even with pylint errors but have some unusual code""" return_code = subprocess.call(["pylint3", "-E", "variety"]) # not needed because nosetests displays pylint console output # self.assertEqual(return_code, 0) # un-comment the following for loads of diagnostics # ~ def test_project_full_report(self): # ~ '''Only for the brave # ~ # ~ you will have to make judgement calls about your code standards # ~ that differ from the norm''' # ~ return_code = subprocess.call(["pylint", 'variety']) if __name__ == "__main__": "you will get better results with nosetests" unittest.main() variety-0.8.13/toolchain/000077500000000000000000000000001475753071700152665ustar00rootroot00000000000000variety-0.8.13/toolchain/autoformat000077500000000000000000000010331475753071700173720ustar00rootroot00000000000000#!/usr/bin/env bash # This is our code autoformatting tool. It's run on all code files and runs Black, isort and # whatever other code-fixing tools we decide to use. # # Usage: autoformat [ ...] # Note this expects Black and isort to be in you path. if (( $# < 1 )); then echo 'Usage: autoformat [ ...]' exit 1 fi # isort must be run before Black echo 'Running isort' isort -rc "$@" echo 'Running Black' black --line-length 100 --target-version py35 "$@" variety-0.8.13/toolchain/generate-pot000077500000000000000000000006441475753071700176120ustar00rootroot00000000000000#!/usr/bin/env bash # This regenerates the pot file into po/variety.pot # This file must then be uploaded to https://translations.launchpad.net/variety/trunk/+translations-upload cd po || cd ../po TARGET="variety.pot" xgettext -k_ -kN_ -L Python -o "$TARGET" \ ../variety/*.py \ ../variety/**/*.py \ ../variety_lib/*.py \ ../jumble/*.py xgettext -k_ -kN_ -L Glade -j -o "$TARGET" \ ../data/ui/*.ui variety-0.8.13/toolchain/pre-commit-autoformat000077500000000000000000000007531475753071700214540ustar00rootroot00000000000000#!/bin/bash # # Pre-commit git hook that runs autoformat on all changed files # Install as a git hook by running this in the project root folder: # cd .git/hooks && ln -sf ../../toolchain/pre-commit-autoformat pre-commit # # Note that commits will proceed even when autoformat makes changes to the files # (which is different from how pre-commit hooks often work). git diff --cached --name-only --diff-filter=ACM | \ grep -E '\.py$' | \ xargs -i sh -c 'toolchain/autoformat {}; git add {}' variety-0.8.13/variety.appdata.xml000066400000000000000000000025501475753071700171260ustar00rootroot00000000000000 variety.desktop CC0-1.0 GPL-3.0 Variety Wallpaper changer that automatically downloads wallpapers

Variety changes the desktop wallpaper on a regular basis, using user-specified or automatically downloaded images.

Variety sits conveniently as an indicator in the panel and can be easily paused and resumed. The mouse wheel can be used to scroll wallpapers back and forth until you find the perfect one for your current mood.

Apart from displaying images from local folders, several different online sources can be used to fetch wallpapers according to user-specified criteria.

Variety can also automatically apply various fancy filters to the displayed images - charcoal painting, oil painting, heavy blurring, etc. - so that your desktop is always fresh and unique.

https://launchpad.net/variety https://github.com/varietywalls/variety/issues eclipseo_at_fedoraproject.org
variety-0.8.13/variety.desktop.in000066400000000000000000000013251475753071700167720ustar00rootroot00000000000000[Desktop Entry] _Name=Variety _Comment=Variety Wallpaper Changer Categories=GNOME;GTK;Utility; Exec=variety %U MimeType=text/uri-list;x-scheme-handler/variety;x-scheme-handler/vrty; Icon=variety Terminal=false Type=Application StartupNotify=false Actions=Next;Previous;PauseResume;History;Preferences; Keywords=Wallpaper;Changer;Change;Download;Downloader;Variety; StartupWMClass=Variety [Desktop Action Next] Exec=variety --next _Name=Next [Desktop Action Previous] Exec=variety --previous _Name=Previous [Desktop Action PauseResume] Exec=variety --toggle-pause _Name=Pause / Resume [Desktop Action History] Exec=variety --history _Name=History [Desktop Action Preferences] Exec=variety --preferences _Name=Preferences variety-0.8.13/variety/000077500000000000000000000000001475753071700147715ustar00rootroot00000000000000variety-0.8.13/variety/AboutVarietyDialog.py000066400000000000000000000023751475753071700211100ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging from variety_lib.AboutDialog import AboutDialog logger = logging.getLogger("variety") # See variety_lib.AboutDialog.py for more details about how this class works. class AboutVarietyDialog(AboutDialog): __gtype_name__ = "AboutVarietyDialog" def finish_initializing(self, builder): # pylint: disable=E1002 """Set up the about dialog""" super(AboutVarietyDialog, self).finish_initializing(builder) # Code for other initialization actions should be added here. variety-0.8.13/variety/AbstractAddByQueryDialog.py000066400000000000000000000064021475753071700221620ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import threading from gi.repository import Gdk, Gtk # pylint: disable=E0611 from variety.Util import Util class AbstractAddByQueryDialog(Gtk.Dialog): def validate(self, query): """ Example valid: return formatted(query), None Example invalid: return query, _('Not a proper XYZ query') """ raise NotImplementedError() def commit(self, final_query): """ Performs the actions to really add a valid query or URL to Variety Example: self.parent.on_add_dialog_okay(Options.SourceType.XYZ, final_query, self.edited_row) """ raise NotImplementedError() def finish_initializing(self, builder): """Called when we're finished initializing. finish_initalizing should be called after parsing the ui definition and creating a AbstractAddByQueryDialog object with it in order to finish initializing the start of the new AbstractAddByQueryDialog instance. """ # Get a reference to the builder and set up the signals. self.builder = builder self.ui = builder.get_ui(self) self.edited_row = None def set_edited_row(self, edited_row): self.edited_row = edited_row self.ui.query.set_text(self.edited_row[2]) def on_btn_ok_clicked(self, widget, data=None): if not len(self.ui.query.get_text().strip()): self.destroy() else: threading.Timer(0, self.ok_thread).start() def on_btn_cancel_clicked(self, widget, data=None): self.destroy() def ok_thread(self): def _start_ui(): self.ui.message.set_visible(True) self.ui.buttonbox.set_sensitive(False) self.ui.query.set_sensitive(False) self.ui.spinner.set_visible(True) self.ui.spinner.start() self.ui.error.set_label("") Util.add_mainloop_task(_start_ui) query = self.ui.query.get_text().strip() final_query, invalid_msg = self.validate(query) def _stop_ui(): if invalid_msg: self.ui.buttonbox.set_sensitive(True) self.ui.error.set_label(invalid_msg) self.ui.spinner.stop() self.ui.query.set_sensitive(True) self.ui.message.set_visible(False) self.ui.spinner.set_visible(False) self.ui.query.grab_focus() else: self.commit(final_query) self.destroy() Util.add_mainloop_task(_stop_ui) variety-0.8.13/variety/AddConfigurableDialog.py000066400000000000000000000034421475753071700214770ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE from variety.AbstractAddByQueryDialog import AbstractAddByQueryDialog from variety_lib.helpers import get_builder class AddConfigurableDialog(AbstractAddByQueryDialog): __gtype_name__ = "AddConfigurableDialog" def __new__(cls): builder = get_builder("AddConfigurableDialog") new_object = builder.get_object("add_configurable_dialog") new_object.finish_initializing(builder) return new_object def set_source(self, source): self.source = source self.set_title("Variety - add {} source".format(source.get_source_name())) self.ui.title.set_text(source.get_source_name()) self.ui.instruction.set_markup(source.get_ui_instruction()) self.ui.short_instruction.set_markup(source.get_ui_short_instruction()) def validate(self, query): return self.source.validate(query) def commit(self, final_query): if len(final_query): self.parent.on_add_dialog_okay( self.source.get_source_type(), final_query, self.edited_row ) variety-0.8.13/variety/AddFlickrDialog.py000066400000000000000000000141731475753071700203140ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import threading import urllib.parse from gi.repository import Gdk, Gtk # pylint: disable=E0611 from variety.FlickrDownloader import FlickrDownloader from variety.Options import Options from variety.Util import Util, _, on_gtk from variety_lib.helpers import get_builder logger = logging.getLogger("variety") class AddFlickrDialog(Gtk.Dialog): __gtype_name__ = "AddFlickrDialog" def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated AddFlickrDialog object. """ builder = get_builder("AddFlickrDialog") new_object = builder.get_object("add_flickr_dialog") new_object.finish_initializing(builder) return new_object def finish_initializing(self, builder): """Called when we're finished initializing. finish_initalizing should be called after parsing the ui definition and creating a AddFlickrDialog object with it in order to finish initializing the start of the new AddFlickrDialog instance. """ # Get a reference to the builder and set up the signals. self.builder = builder self.ui = builder.get_ui(self) self.edited_row = None def set_edited_row(self, edited_row): self.edited_row = edited_row location = edited_row[2] s = location.split(";") params = {} for x in s: if len(x) and x.find(":") > 0: k, v = x.split(":") params[k.lower()] = urllib.parse.unquote_plus(v) if "text" in params: self.ui.text.set_text(params["text"]) if "tags" in params: self.ui.tags.set_text(params["tags"]) if "user" in params: if "://" not in params["user"]: params["user"] = "https://" + params["user"] self.ui.user_url.set_text(params["user"]) if "group" in params: if "://" not in params["group"]: params["group"] = "https://" + params["group"] self.ui.group_url.set_text(params["group"]) def on_btn_ok_clicked(self, widget, data=None): """The user has elected to save the changes. Called before the dialog returns Gtk.ResponseType.OK from run(). """ threading.Timer(0, self.ok_thread).start() @on_gtk def show_spinner(self): self.ui.buttonbox.set_sensitive(False) self.ui.message.set_visible(True) self.ui.spinner.set_visible(True) self.ui.spinner.start() self.ui.error.set_label("") def ok_thread(self): search = "" if len(self.ui.tags.get_text().strip()): search += ( "tags:" + ",".join( [urllib.parse.quote_plus(t.strip()) for t in self.ui.tags.get_text().split(",")] ) + ";" ) if len(self.ui.text.get_text().strip()): search += "text:" + urllib.parse.quote_plus(self.ui.text.get_text().strip()) + ";" self.error = "" user_url = self.ui.user_url.get_text().strip() if len(user_url) > 0: self.show_spinner() u = FlickrDownloader.obtain_userid(user_url) if u[0]: search += ( "user:" + self.ui.user_url.get_text().replace("http://", "").replace("https://", "") + ";" ) search += "user_id:" + u[2] + ";" else: self.error = self.error + "\n" + u[1] group_url = self.ui.group_url.get_text().strip() if len(group_url) > 0: self.show_spinner() g = FlickrDownloader.obtain_groupid(group_url) if g[0]: search += ( "group:" + self.ui.group_url.get_text().replace("http://", "").replace("https://", "") + ";" ) search += "group_id:" + g[2] else: self.error = self.error + "\n" + g[1] if not len(self.error) and len(search) > 0: self.show_spinner() if FlickrDownloader.count_search_results(search) <= 0: self.error = _("No images found") def _stop_ui(): self.ui.buttonbox.set_sensitive(True) self.ui.spinner.stop() self.ui.spinner.set_visible(False) self.ui.message.set_visible(False) if len(self.error) > 0: self.ui.error.set_label(self.error) for entry in (self.ui.text, self.ui.tags, self.ui.user_url, self.ui.group_url): if entry.get_text().strip(): entry.grab_focus() break else: if len(search): self.parent.on_add_dialog_okay( Options.SourceType.FLICKR, search, self.edited_row ) self.destroy() Util.add_mainloop_task(_stop_ui) def on_btn_cancel_clicked(self, widget, data=None): """The user has elected cancel changes. Called before the dialog returns Gtk.ResponseType.CANCEL for run() """ self.destroy() if __name__ == "__main__": dialog = AddFlickrDialog() dialog.show() Gtk.main() variety-0.8.13/variety/AddWallhavenDialog.py000066400000000000000000000035231475753071700210200ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import urllib from urllib.parse import urlencode from variety.AddConfigurableDialog import AddConfigurableDialog from variety_lib.helpers import get_builder class AddWallhavenDialog(AddConfigurableDialog): __gtype_name__ = "AddWallhavenDialog" def __new__(cls, variety): builder = get_builder("AddWallhavenDialog") new_object = builder.get_object("add_wallhaven_dialog") new_object.finish_initializing(builder) new_object.options = variety.options new_object.ui.apikey.set_text((variety.options.wallhaven_api_key or "").strip()) return new_object def validate(self, query): api_key = self.ui.apikey.get_text().strip() query, msg = self.source.validate(query, api_key=api_key) if not msg: # valid query - persist the API key for future use self.options.wallhaven_api_key = api_key self.options.write() return query, msg @staticmethod def parse_location(location): url_parts = urllib.parse.urlparse(location) return urllib.parse.parse_qs(url_parts.query) variety-0.8.13/variety/AttrDict.py000066400000000000000000000036561475753071700170730ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import json from collections import defaultdict class AttrDict(defaultdict): @staticmethod def converted(v): if isinstance(v, AttrDict): return v elif isinstance(v, dict): return AttrDict(v) elif isinstance(v, (list, tuple)): r = list(map(AttrDict.converted, v)) return tuple(r) if isinstance(v, tuple) else r else: return v def merge(self, arg): if hasattr(arg, "items"): self.merge(arg.items()) else: for k, v in arg: self[k] = AttrDict.converted(v) def asdict(self): return json.loads(json.dumps(self)) def __init__(self, *args, **kwargs): super(AttrDict, self).__init__(AttrDict) if len(args) == 1: self.merge(args[0]) elif len(args) > 1: raise TypeError( "AttrDict expected at most 1 argument that is a map, got %i" % len(args) ) self.merge(kwargs) def __setitem__(self, k, v): return super(AttrDict, self).__setitem__(k, AttrDict.converted(v)) __getattr__ = defaultdict.__getitem__ __setattr__ = __setitem__ variety-0.8.13/variety/CalibrateDominantColors.py000066400000000000000000000017241475753071700221110ustar00rootroot00000000000000import os import sys from .DominantColors import DominantColors dir = sys.argv[1] m = {} for f in sorted(os.listdir(dir)): if f.lower().endswith(".jpg") or f.lower().endswith(".jpg"): try: d = DominantColors(os.path.join(dir, f)) calc = d.get_dominant_colors() print(f, "light:", calc[2]) continue for fuzzy in range(20): if DominantColors.contains_color(calc, (255, 217, 100), fuzzy): m[f] = fuzzy print(f, fuzzy) break else: m[f] = -1 print(f, "no match") except Exception: print("oops for " + f) raise # pass # print "\n----results----" # for fuzzy in xrange(10): # print fuzzy # for k, v in m.items(): # if v == fuzzy: # print k # # print "no match:" # for k, v in m.items(): # if v == -1: # print k variety-0.8.13/variety/DominantColors.py000066400000000000000000000117331475753071700203030ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import sys from PIL import Image, ImageFilter class DominantColors: def __init__(self, image_name, only_size_needed=True): self.imageName = image_name self.original = Image.open(image_name) if not only_size_needed: self.resized = self.original.resize((50, 50)) # self.resized = self.resized.filter(ImageFilter.BLUR) # load image data self.img_data = self.resized.load() def get_width(self): return self.original.size[0] def get_height(self): return self.original.size[1] def get_lightness(self): count = 0 pixel_sum = 0 for x in range(0, self.resized.size[0]): for y in range(0, self.resized.size[1]): count += 1 pixel = self.img_data[x, y] if not tuple == type(pixel): pixel_sum += pixel else: pixel_sum += sum(pixel) / 3 return pixel_sum // count def get_dominant_colors(self): colors = [ (0, 0, 0), (128, 128, 128), (192, 192, 192), (255, 255, 255), (128, 0, 0), (255, 0, 0), (128, 128, 0), (255, 255, 0), (0, 128, 0), (0, 255, 0), (0, 128, 128), (0, 255, 255), (0, 0, 128), (0, 0, 255), (128, 0, 128), (255, 0, 255), ] total = 0 pixel_sum = 0 iterations = 1 for counter in range( iterations ): # perform only X iterations of clustering, that should be enough sums = {} counts = {} for c in colors: sums[c] = [0, 0, 0] counts[c] = 0 total = 0 pixel_sum = 0 for x in range(0, self.resized.size[0], 2): for y in range(0, self.resized.size[1], 2): total += 4 pixel = self.img_data[x, y] if not tuple == type(pixel): pixel = (pixel, pixel, pixel) pixel_sum += sum(pixel) / 3 color1 = min((DominantColors.diff(c, pixel), c) for c in colors)[1] if len(colors) > 1: color2 = min( (DominantColors.diff(c, pixel), c) for c in colors if c != color1 )[1] else: color2 = color1 for i in [0, 1, 2]: sums[color1][i] += 3 * pixel[i] sums[color2][i] += 1 * pixel[i] counts[color1] += 3 counts[color2] += 1 colors = [c for c in colors if counts[c] > 0] if counter == iterations - 1: colors = [ ( counts[c], (sums[c][0] // counts[c], sums[c][1] // counts[c], sums[c][2] // counts[c]), ) for c in colors ] else: colors = [ (sums[c][0] // counts[c], sums[c][1] // counts[c], sums[c][2] // counts[c]) for c in colors ] s = sorted(colors, key=lambda x: x[0], reverse=True) return total, s, pixel_sum * 4 // total, self.get_width(), self.get_height() @staticmethod def contains_color(dominant_colors, color, fuzziness): total, colors, _, _, _ = dominant_colors # colors = [x for x in colors if x[0] > total / (40 + fuzziness * 40)] for position, c in enumerate(colors[:3]): if ( DominantColors.diff(c[1], color) < 1000 + (fuzziness * 1000) + max(0, 5 - position) * 300 ): return True return False @staticmethod def close_colors(c1, c2, fuzziness): return DominantColors.diff(c1, c2) < 2000 + (fuzziness * 1000) @staticmethod def diff(c1, c2): return sum((c1[i] - c2[i]) ** 2 for i in [0, 1, 2]) if __name__ == "__main__": pc = DominantColors(sys.argv[1]) print(pc.get_dominant_colors()) variety-0.8.13/variety/EditFavoriteOperationsDialog.py000066400000000000000000000050241475753071700231150ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE from gi.repository import Gtk # pylint: disable=E0611 from variety_lib.helpers import get_builder class EditFavoriteOperationsDialog(Gtk.Dialog): __gtype_name__ = "EditFavoriteOperationsDialog" def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated EditFavoriteOperationsDialog object. """ builder = get_builder("EditFavoriteOperationsDialog") new_object = builder.get_object("edit_favorite_operations_dialog") new_object.finish_initializing(builder) return new_object def finish_initializing(self, builder): """Called when we're finished initializing. finish_initalizing should be called after parsing the ui definition and creating a EditFavoriteOperationsDialog object with it in order to finish initializing the start of the new EditFavoriteOperationsDialog instance. """ # Get a reference to the builder and set up the signals. self.builder = builder self.ui = builder.get_ui(self) def on_btn_ok_clicked(self, widget, data=None): """The user has elected to save the changes. Called before the dialog returns Gtk.ResponseType.OK from run(). """ pass def on_btn_cancel_clicked(self, widget, data=None): """The user has elected cancel changes. Called before the dialog returns Gtk.ResponseType.CANCEL for run() """ pass def on_reset_clicked(self, widget): self.ui.textbuffer.set_text("Downloaded:Copy\nFetched:Move\nOthers:Copy") return True if __name__ == "__main__": dialog = EditFavoriteOperationsDialog() dialog.show() Gtk.main() variety-0.8.13/variety/FlickrDownloader.py000066400000000000000000000253071475753071700206030ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random import urllib.parse from variety.plugins.downloaders.DefaultDownloader import DefaultDownloader from variety.plugins.downloaders.ImageSource import ImageSource, Throttling from variety.Util import Util logger = logging.getLogger("variety") random.seed() API_KEY = "d9c4a1fd59926d27d091b69651c37a34" HASH = b"VAxWBwAJUlxWCQBQVQJWBVVUClBbDg1SDAVTC1RRB1E=\n" class FlickrDownloader(ImageSource, DefaultDownloader): def __init__(self, parent, location): ImageSource.__init__(self) DefaultDownloader.__init__(self, source=self, config=location) self.set_variety(parent) self.parse_location() @classmethod def get_info(cls): raise Exception("Not yet implemented as a plugin") def get_description(self): return _("Images from Flickr") def get_source_name(self): return "Flickr" def get_source_type(self): return "flickr" def get_default_throttling(self): return Throttling(max_downloads_per_hour=120, max_queue_fills_per_hour=20) def parse_location(self): s = self.config.split(";") self.params = {} for x in s: if len(x) and x.find(":") > 0: k, v = x.split(":") if k.lower() in ["text", "tags", "user_id", "group_id"]: self.params[k.lower()] = v.replace(" ", "+") # slight validation: for k in ["text", "tags", "user_id", "group_id"]: if k in self.params and len(self.params[k]) > 0: return raise Exception("Missing at least one of text, tags, user_id and group_id") @staticmethod def fetch(call): logger.info(lambda: "Making flickr API call: " + call) return Util.fetch_json(call) @staticmethod def obtain_userid(url): try: logger.info(lambda: "Fetching flickr user_id from URL: " + url) call = ( "https://api.flickr.com/services/rest/?method=flickr.urls.lookupUser&api_key=%s&url=%s&format=json&nojsoncallback=1" % (Util.unxor(HASH, API_KEY), urllib.parse.quote_plus(url)) ) resp = FlickrDownloader.fetch(call) if resp["stat"] == "ok": logger.info(lambda: "Found " + resp["user"]["id"]) return True, "ok", resp["user"]["id"] else: logger.info(lambda: "Oops " + resp["message"]) return False, resp["message"], None except Exception as e: logger.exception(lambda: "Exception while checking Flickr user") return (False, "Exception while checking user. Please run with -v and check log.", None) @staticmethod def obtain_groupid(url): try: logger.info(lambda: "Fetching flickr group_id from URL: " + url) call = ( "https://api.flickr.com/services/rest/?method=flickr.urls.lookupGroup&api_key=%s&url=%s&format=json&nojsoncallback=1" % (Util.unxor(HASH, API_KEY), urllib.parse.quote_plus(url)) ) resp = FlickrDownloader.fetch(call) if resp["stat"] == "ok": logger.info(lambda: "Found " + resp["group"]["id"]) return True, "ok", resp["group"]["id"] else: logger.info(lambda: "Oops " + resp["message"]) return False, resp["message"], None except Exception as e: logger.exception(lambda: "Exception while checking Flickr group") return ( False, "Exception while checking group. Please run with -v and check log.", None, ) @staticmethod def count_search_results(search): try: dl = FlickrDownloader(None, search) return dl.count_results() except Exception: logger.exception(lambda: "Exception while counting Flickr results") return 0 def count_results(self): call = ( "https://api.flickr.com/services/rest/?method=flickr.photos.search" "&api_key=%s&per_page=20&tag_mode=all&format=json&nojsoncallback=1" % Util.unxor(HASH, API_KEY) ) for k, v in self.params.items(): call = call + "&" + k + "=" + v resp = FlickrDownloader.fetch(call) if resp["stat"] != "ok": raise Exception("Flickr returned error message: " + resp["message"]) return int(resp["photos"]["total"]) def fill_queue(self): queue = [] call = ( "https://api.flickr.com/services/rest/?method=flickr.photos.search" "&api_key=%s&per_page=500&tag_mode=all&format=json&nojsoncallback=1" % Util.unxor(HASH, API_KEY) ) for k, v in self.params.items(): call = call + "&" + k + "=" + v resp = FlickrDownloader.fetch(call) if resp["stat"] != "ok": raise Exception("Flickr returned error message: " + resp["message"]) pages = int(resp["photos"]["pages"]) if pages < 1: return page = random.randint(1, pages) logger.info(lambda: "%d pages in the search results, using page %d" % (pages, page)) call = ( call + "&extras=owner_name,description,tags,o_dims,url_o,url_k,url_h,url_l&page=" + str(page) ) resp = FlickrDownloader.fetch(call) if resp["stat"] != "ok": raise Exception("Flickr returned error message: " + resp["message"]) used = set(x[0] for x in queue) size_suffixes = ["o", "k", "h", "l"] for s in size_suffixes: self.process_photos_in_response(queue, resp, s, used) if len(queue) > 20: break random.shuffle(queue) if len(queue) >= 20: queue = queue[: len(queue) // 2] # only use randomly half the images from the page - # if we ever hit that same page again, we'll still have what to download return queue def process_photos_in_response(self, queue, resp, size_suffix, used): logger.info( lambda: "Queue size is %d, populating with images for size suffix %s" % (len(queue), size_suffix) ) for ph in resp["photos"]["photo"]: try: photo_url = "https://www.flickr.com/photos/%s/%s" % (ph["owner"], ph["id"]) logger.debug(lambda: "Checking photo_url " + photo_url) if self.is_in_banned(photo_url): logger.debug(lambda: "In banned, skipping") continue if photo_url in used: logger.debug(lambda: "Already added or checked, skipping") continue if "url_" + size_suffix in ph: width = int(ph["width_" + size_suffix]) height = int(ph["height_" + size_suffix]) image_file_url = ph["url_" + size_suffix] logger.debug(lambda: "Image url: " + image_file_url) else: logger.debug(lambda: "Missing size " + size_suffix) continue # add to used now - if one of the checks below fails, we don't want the lower resolutions either used.add(photo_url) if self.is_in_downloaded(image_file_url): logger.debug(lambda: "Already in downloaded") continue if self.is_in_favorites(image_file_url): logger.debug(lambda: "Already in favorites") continue if self.is_size_inadequate(width, height): logger.debug(lambda: "Small or non-landscape size/resolution") continue try: extra_metadata = { "author": ph["ownername"], "authorURL": "https://www.flickr.com/photos/%s" % ph["owner"], "headline": ph["title"], "keywords": ph["tags"].split(" ")[ :200 ], # Flickr metadata can be excessive and hit Exif limits "description": ph["description"]["_content"][:10000], } except: extra_metadata = {} logger.debug(lambda: "Appending to queue %s, %s" % (photo_url, image_file_url)) queue.append((photo_url, image_file_url, extra_metadata)) except Exception: logger.exception(lambda: "Error parsing single flickr photo info:") @staticmethod def get_photo_id(origin_url): if origin_url[-1] == "/": origin_url = origin_url[:-1] return origin_url.split("/")[-1] @staticmethod def get_image_url(origin_url): photo_id = FlickrDownloader.get_photo_id(origin_url) call = ( "https://api.flickr.com/services/rest/?method=flickr.photos.getSizes&api_key=%s&photo_id=%s&format=json&nojsoncallback=1" % (Util.unxor(HASH, API_KEY), photo_id) ) resp = Util.fetch_json(call) s = max(resp["sizes"]["size"], key=lambda size: int(size["width"])) return s["source"] @staticmethod def get_extra_metadata(origin_url): photo_id = FlickrDownloader.get_photo_id(origin_url) call = ( "https://api.flickr.com/services/rest/?method=flickr.photos.getInfo&api_key=%s&photo_id=%s&format=json&nojsoncallback=1" % (Util.unxor(HASH, API_KEY), photo_id) ) resp = Util.fetch_json(call) ph = resp["photo"] extra_meta = { "headline": ph["title"]["_content"], "description": ph["description"]["_content"], "author": ph["owner"]["realname"], "authorURL": "https://www.flickr.com/photos/%s" % ph["owner"]["nsid"], "keywords": [x["_content"] for x in ph["tags"]["tag"]], } return extra_meta variety-0.8.13/variety/FolderChooser.py000066400000000000000000000064661475753071700201150ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import os.path from gi.repository import Gtk from variety.Util import Util, _ logger = logging.getLogger("variety") class FolderChooser: def __init__(self, button, on_change=None): self.button = button self.on_change = on_change self.folder = None self.chooser = None self.box = Gtk.Box(Gtk.Orientation.HORIZONTAL) self.label = Gtk.Label() self.image = Gtk.Image() self.image.set_margin_left(2) self.image.set_margin_right(5) self.image.set_from_icon_name("folder", Gtk.IconSize.MENU) self.box.add(self.image) self.box.add(self.label) self.box.set_margin_right(2) if self.button.get_child(): self.button.get_child().destroy() self.button.add(self.box) self.button.show_all() self.button.connect("clicked", self.browse) def destroy(self): if self.chooser: self.chooser.destroy() def get_folder(self): return self.folder def set_folder(self, folder): self.folder = os.path.normpath(folder) self.image.set_from_icon_name(Util.get_file_icon_name(self.folder), Gtk.IconSize.MENU) self.label.set_text(Util.collapseuser(self.folder)) self.button.set_tooltip_text(self.folder) def set_sensitive(self, sensitive): self.button.set_sensitive(sensitive) def browse(self, widget=None): try: self.chooser = Gtk.FileChooserDialog( _("Choose a folder"), parent=self.button.get_toplevel(), action=Gtk.FileChooserAction.SELECT_FOLDER, buttons=[_("Cancel"), Gtk.ResponseType.CANCEL, _("OK"), Gtk.ResponseType.OK], ) self.chooser.set_filename(self.folder) self.chooser.set_select_multiple(False) self.chooser.set_local_only(False) if self.chooser.run() == Gtk.ResponseType.OK: self.set_folder(self.chooser.get_filename()) try: if self.on_change: self.on_change() except Exception: logger.exception(lambda: "Exception during FolderChooser on_change:") finally: if self.chooser: try: self.chooser.destroy() self.chooser = None except Exception: logger.exception(lambda: "Exception during FolderChooser destroying:") variety-0.8.13/variety/ImageFetcher.py000066400000000000000000000146121475753071700176720ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import os import urllib.parse from PIL import Image from requests.exceptions import HTTPError from variety.Util import Util, _ logger = logging.getLogger("variety") class ImageFetcher: @staticmethod def url_ok(url, use_whitelist, hosts_whitelist): try: p = urllib.parse.urlparse(url) if p.scheme in ["http", "https"]: if use_whitelist: for host in hosts_whitelist: h = host.strip().lower() if h and p.netloc.lower().find(h) >= 0: return True else: return p.path.lower().endswith((".jpg", ".jpeg", ".png", ".tiff", ".avif")) # skip gif - they are usually small images return False except Exception: return False @staticmethod def fetch( url, to_folder, origin_url=None, source_type=None, source_location=None, source_name=None, extra_metadata=None, progress_reporter=lambda a, b: None, verbose=True, ): reported = verbose try: logger.info(lambda: "Trying to fetch URL %s to %s " % (url, to_folder)) if verbose: progress_reporter(_("Fetching"), url) if url.startswith("javascript:"): if verbose: progress_reporter(_("Not an image"), url) return None if url.find("://") < 0: url = "file://" + url r = Util.request(url, stream=True) if not "content-type" in r.headers: logger.info(lambda: "Unknown content-type for url " + url) if verbose: progress_reporter(_("Not an image"), url) return None ct = r.headers["content-type"] if not ct.startswith("image/"): logger.info(lambda: "Unsupported content-type for url " + url + ": " + ct) if verbose: progress_reporter(_("Not an image"), url) return None local_name = Util.get_local_name(r.url) if "content-disposition" in r.headers: cd = r.headers["content-disposition"] cd_name = ImageFetcher.extract_filename_from_content_disposition(cd) if cd_name: local_name = cd_name filename = os.path.join(to_folder, local_name) if os.path.exists(filename): m = Util.read_metadata(filename) if m and m.get("imageURL") == url: logger.info(lambda: "Local file already exists (%s)" % filename) return filename else: logger.info( lambda: "File with same name already exists, but from different imageURL; renaming new download" ) filename = Util.find_unique_name(filename) logger.info(lambda: "Fetching to " + filename) if not reported: reported = True progress_reporter(_("Fetching"), url) local_filepath_partial = filename + ".partial" with open(local_filepath_partial, "wb") as f: Util.request_write_to(r, f) try: img = Image.open(local_filepath_partial) except Exception: progress_reporter(_("Not an image"), url) Util.safe_unlink(local_filepath_partial) return None if img.size[0] < 400 or img.size[1] < 400: # too small - delete and do not use progress_reporter(_("Image too small, ignoring it"), url) Util.safe_unlink(local_filepath_partial) return None metadata = { "sourceType": source_type or "fetched", "sourceName": source_name or "Fetched", "sourceURL": origin_url or url, "imageURL": url, } if source_location: metadata["sourceLocation"] = source_location metadata.update(extra_metadata or {}) Util.write_metadata(local_filepath_partial, metadata) os.rename(local_filepath_partial, filename) logger.info(lambda: "Fetched %s to %s." % (url, filename)) return filename except Exception as e: # pylint: disable=no-member logger.exception(lambda: "Fetch failed for URL " + url) if reported: if isinstance(e, HTTPError) and e.response.status_code in (403, 404): progress_reporter( _("Sorry, got %s error...") % str(e.response.status_code), _("This means the link is no longer valid"), ) else: progress_reporter( _("Fetch failed for some reason"), _( "To get more information, please run Variety from terminal with -v option and retry the action" ), ) return None @staticmethod def extract_filename_from_content_disposition(cd): parts = cd.split(";") for p in parts: p = p.strip() if p.startswith("filename="): name = p[p.find("=") + 1 :] if name[0] in ['"', "'"]: name = name[1:] if name[-1] in ['"', "'"]: name = name[:-1] return name return None variety-0.8.13/variety/Options.py000066400000000000000000001006411475753071700170000ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import hashlib import logging import os from configobj import ConfigObj, DuplicateError from variety.profile import get_profile_path from variety.Util import Util from variety_lib import varietyconfig logger = logging.getLogger("variety") TRUTH_VALUES = ["enabled", "1", "true", "on", "yes"] class Options: OUTDATED_HASHES = {"clock_filter": ["dca6bd2dfa2b8c4e2db8801e39208f7f"]} SIMPLE_DOWNLOADERS = [] # set by VarietyWindow at start IMAGE_SOURCES = [] # set by VarietyWindow at start CONFIGURABLE_IMAGE_SOURCES = [] # set by VarietyWindow at start CONFIGURABLE_IMAGE_SOURCES_MAP = {} # set by VarietyWindow at start class SourceType: # local files and folders IMAGE = "image" FOLDER = "folder" ALBUM_FILENAME = "album (by filename)" ALBUM_DATE = "album (by date)" # special local folders FAVORITES = "favorites" FETCHED = "fetched" # predefined configurable sources FLICKR = "flickr" WALLHAVEN = "wallhaven" BUILTIN_SOURCE_TYPES = { IMAGE, FOLDER, ALBUM_FILENAME, ALBUM_DATE, FAVORITES, FETCHED, FLICKR, } LOCAL_PATH_TYPES = {IMAGE, FOLDER, ALBUM_FILENAME, ALBUM_DATE} LOCAL_TYPES = {IMAGE, FOLDER, ALBUM_FILENAME, ALBUM_DATE, FAVORITES, FETCHED} DL_TYPES = {FLICKR} EDITABLE_DL_TYPES = {FLICKR} REMOVABLE_TYPES = {FOLDER, IMAGE, ALBUM_FILENAME, ALBUM_DATE} | EDITABLE_DL_TYPES class LightnessMode: DARK = 0 LIGHT = 1 def __init__(self): self.configfile = os.path.join(get_profile_path(), "variety.conf") def read(self): self.set_defaults() try: config = self.read_config() needs_writing = self.fix_outdated(config) try: self.change_enabled = config["change_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.change_on_start = config["change_on_start"].lower() in TRUTH_VALUES except Exception: pass try: self.change_interval = int(config["change_interval"]) if self.change_interval < 5: self.change_interval = 5 except Exception: pass try: self.internet_enabled = config["internet_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.safe_mode = config["safe_mode"].lower() in TRUTH_VALUES except Exception: pass try: self.set_wallpaper_script = os.path.expanduser(config["set_wallpaper_script"]) except Exception: pass try: self.get_wallpaper_script = os.path.expanduser(config["get_wallpaper_script"]) except Exception: pass try: self.download_folder = os.path.expanduser(config["download_folder"]) except Exception: pass try: self.download_preference_ratio = max( 0, min(1, float(config["download_preference_ratio"])) ) except Exception: pass try: self.quota_enabled = config["quota_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.quota_size = max(50, int(config["quota_size"])) except Exception: pass try: self.wallhaven_api_key = str(config["wallhaven_api_key"]).strip() except Exception: pass try: self.favorites_folder = os.path.expanduser(config["favorites_folder"]) except Exception: pass try: favorites_ops_text = config["favorites_operations"] self.favorites_operations = list( [x.strip().split(":") for x in favorites_ops_text.split(";") if x] ) except Exception: pass try: self.wallpaper_auto_rotate = config["wallpaper_auto_rotate"].lower() in TRUTH_VALUES except Exception: pass try: self.wallpaper_display_mode = str(config["wallpaper_display_mode"]).strip() except Exception: pass try: self.fetched_folder = os.path.expanduser(config["fetched_folder"]) except Exception: pass try: self.clipboard_enabled = config["clipboard_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.clipboard_use_whitelist = ( config["clipboard_use_whitelist"].lower() in TRUTH_VALUES ) except Exception: pass try: self.clipboard_hosts = config["clipboard_hosts"].lower().split(",") except Exception: pass try: icon = config["icon"] if icon in ["Light", "Dark", "Current", "1", "2", "3", "4", "None"] or ( os.access(icon, os.R_OK) and Util.is_image(icon) ): self.icon = icon except Exception: pass try: self.desired_color_enabled = config["desired_color_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.desired_color = list(map(int, config["desired_color"].split())) for i, x in enumerate(self.desired_color): self.desired_color[i] = max(0, min(255, x)) except Exception: self.desired_color = None try: self.min_size_enabled = config["min_size_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.min_size = int(config["min_size"]) self.min_size = max(0, min(100, self.min_size)) except Exception: pass try: self.use_landscape_enabled = config["use_landscape_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.lightness_enabled = config["lightness_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.lightness_mode = int(config["lightness_mode"]) self.lightness_mode = max(0, min(1, self.lightness_mode)) except Exception: pass try: self.min_rating_enabled = config["min_rating_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.min_rating = int(config["min_rating"]) self.min_rating = max(1, min(5, self.min_rating)) except Exception: pass try: self.name_regex_enabled = config["name_regex_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.name_regex = config["name_regex"] except Exception: pass try: self.smart_notice_shown = config["smart_notice_shown"].lower() in TRUTH_VALUES except Exception: pass try: self.smart_register_shown = config["smart_register_shown"].lower() in TRUTH_VALUES except Exception: pass try: self.stats_notice_shown = config["stats_notice_shown"].lower() in TRUTH_VALUES except Exception: pass try: self.smart_enabled = config["smart_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.sync_enabled = config["sync_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.stats_enabled = config["stats_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.copyto_enabled = config["copyto_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.copyto_folder = os.path.expanduser(config["copyto_folder"]) except Exception: pass try: self.clock_enabled = config["clock_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.clock_filter = config["clock_filter"].strip() except Exception: pass try: self.clock_font = config["clock_font"] except Exception: pass try: self.clock_date_font = config["clock_date_font"] except Exception: pass try: self.quotes_enabled = config["quotes_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.quotes_font = config["quotes_font"] except Exception: pass try: self.quotes_text_color = list(map(int, config["quotes_text_color"].split())) for i, x in enumerate(self.quotes_text_color): self.quotes_text_color[i] = max(0, min(255, x)) except Exception: pass try: self.quotes_bg_color = list(map(int, config["quotes_bg_color"].split())) for i, x in enumerate(self.quotes_bg_color): self.quotes_bg_color[i] = max(0, min(255, x)) except Exception: pass try: self.quotes_bg_opacity = int(float(config["quotes_bg_opacity"])) self.quotes_bg_opacity = max(0, min(100, self.quotes_bg_opacity)) except Exception: pass try: self.quotes_text_shadow = config["quotes_text_shadow"].lower() in TRUTH_VALUES except Exception: pass try: self.quotes_text_color = list(map(int, config["quotes_text_color"].split())) for i, x in enumerate(self.quotes_text_color): self.quotes_text_color[i] = max(0, min(255, x)) except Exception: pass try: self.quotes_disabled_sources = config["quotes_disabled_sources"].strip().split("|") except Exception: pass try: self.quotes_tags = config["quotes_tags"] except Exception: pass try: self.quotes_authors = config["quotes_authors"] except Exception: pass try: self.quotes_change_enabled = config["quotes_change_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.quotes_change_interval = int(config["quotes_change_interval"]) if self.quotes_change_interval < 10: self.quotes_change_interval = 10 except Exception: pass try: self.quotes_width = int(float(config["quotes_width"])) self.quotes_width = max(0, min(100, self.quotes_width)) except Exception: pass try: self.quotes_hpos = int(float(config["quotes_hpos"])) self.quotes_hpos = max(0, min(100, self.quotes_hpos)) except Exception: pass try: self.quotes_vpos = int(float(config["quotes_vpos"])) self.quotes_vpos = max(0, min(100, self.quotes_vpos)) except Exception: pass try: self.quotes_max_length = int(config["quotes_max_length"]) self.quotes_max_length = max(0, self.quotes_max_length) except Exception: pass try: self.quotes_favorites_file = os.path.expanduser(config["quotes_favorites_file"]) except Exception: pass try: self.slideshow_sources_enabled = ( config["slideshow_sources_enabled"].lower() in TRUTH_VALUES ) except Exception: pass try: self.slideshow_favorites_enabled = ( config["slideshow_favorites_enabled"].lower() in TRUTH_VALUES ) except Exception: pass try: self.slideshow_downloads_enabled = ( config["slideshow_downloads_enabled"].lower() in TRUTH_VALUES ) except Exception: pass try: self.slideshow_custom_enabled = ( config["slideshow_custom_enabled"].lower() in TRUTH_VALUES ) except Exception: pass try: custom_path = config["slideshow_custom_folder"] if custom_path in ("None", "Default") or not os.path.isdir(custom_path): self.slideshow_custom_folder = Util.get_xdg_pictures_folder() else: self.slideshow_custom_folder = custom_path except Exception: pass try: slideshow_sort_order = config["slideshow_sort_order"] if slideshow_sort_order in [ "Random", "Name, asc", "Name, desc", "Date, asc", "Date, desc", ]: self.slideshow_sort_order = slideshow_sort_order except Exception: pass try: self.slideshow_monitor = config["slideshow_monitor"] except Exception: pass try: slideshow_mode = config["slideshow_mode"] if slideshow_mode in ["Fullscreen", "Desktop", "Maximized", "Window"]: self.slideshow_mode = slideshow_mode except Exception: pass try: self.slideshow_seconds = float(config["slideshow_seconds"]) self.slideshow_seconds = max(0.5, self.slideshow_seconds) except Exception: pass try: self.slideshow_fade = float(config["slideshow_fade"]) self.slideshow_fade = max(0, min(1, self.slideshow_fade)) except Exception: pass try: self.slideshow_zoom = float(config["slideshow_zoom"]) self.slideshow_zoom = max(0, min(1, self.slideshow_zoom)) except Exception: pass try: self.slideshow_pan = float(config["slideshow_pan"]) self.slideshow_pan = max(0, min(0.20, self.slideshow_pan)) except Exception: pass self.sources = [] if "sources" in config: sources = config["sources"] for v in sources.values(): try: self.sources.append(Options.parse_source(v)) except Exception: logger.debug(lambda: "Cannot parse source: " + v, exc_info=True) logger.info("Ignoring no longer supported source %s", v) # automatically append sources for all simple downloaders we have source_types = set(s[1] for s in self.sources) for downloader in sorted(self.SIMPLE_DOWNLOADERS, key=lambda dl: dl.get_source_type()): if downloader.get_source_type() not in source_types: self.sources.append( [False, downloader.get_source_type(), downloader.get_description()] ) self.parse_autosources() if "filters" in config: self.filters = [] filters = config["filters"] for v in filters.values(): try: self.filters.append(Options.parse_filter(v)) except Exception: logger.exception(lambda: "Cannot parse filter: " + str(v)) self.parse_autofilters() if needs_writing: logger.info(lambda: "Some outdated settings were updated, writing the changes") self.write() except Exception: logger.exception(lambda: "Could not read configuration:") def fix_outdated(self, config): changed = False for key, outdated_hashes in Options.OUTDATED_HASHES.items(): if key in config: current_hash = hashlib.md5(config[key].encode()).hexdigest() if current_hash in outdated_hashes: # entry is outdated: delete it and use the default logger.warning( lambda: "Option " + key + " has an outdated value, using the new default" ) changed = True del config[key] return changed def parse_autosources(self): try: with open(varietyconfig.get_data_file("config", "sources.txt"), encoding="utf8") as f: for line in f: if not line.strip() or line.strip().startswith("#"): continue try: s = Options.parse_source(line.strip()) if s[1] in [src[1] for src in self.sources]: continue self.sources.append(s) except Exception: logger.exception(lambda: "Cannot parse source in sources.txt: " + line) except Exception: logger.exception(lambda: "Cannot open sources.txt") def parse_autofilters(self): try: with open(varietyconfig.get_data_file("config", "filters.txt"), encoding="utf8") as f: for line in f: if not line.strip() or line.strip().startswith("#"): continue try: s = Options.parse_filter(line.strip()) for f in self.filters: if f[1].lower() == s[1].lower(): f[2] = s[2] break else: # not found at all in filters, append it self.filters.append(s) except Exception: logger.exception(lambda: "Cannot parse filter in filters.txt: " + line) except Exception: logger.exception(lambda: "Cannot open filters.txt") @staticmethod def parse_source(v): s = v.strip().split("|") enabled = s[0].lower() in TRUTH_VALUES return [enabled, s[1], s[2]] @staticmethod def parse_filter(v): s = v.strip().split("|") enabled = s[0].lower() in TRUTH_VALUES return [enabled, s[1], s[2]] @staticmethod def get_all_supported_source_types(): return Options.SourceType.BUILTIN_SOURCE_TYPES | Options.get_plugin_source_types() @staticmethod def get_downloader_source_types(): return Options.SourceType.DL_TYPES | Options.get_plugin_source_types() @staticmethod def get_editable_source_types(): return Options.SourceType.EDITABLE_DL_TYPES | Options.get_configurable_plugin_source_types() @staticmethod def get_removable_source_types(): return Options.SourceType.REMOVABLE_TYPES | Options.get_editable_source_types() @staticmethod def get_plugin_source_types(): return set(dl.get_source_type() for dl in Options.IMAGE_SOURCES) @staticmethod def get_configurable_plugin_source_types(): return set(dl.get_source_type() for dl in Options.CONFIGURABLE_IMAGE_SOURCES) def set_defaults(self): self.change_enabled = True self.change_on_start = False self.change_interval = 300 self.internet_enabled = True self.safe_mode = False self.set_wallpaper_script = os.path.join(get_profile_path(), "scripts", "set_wallpaper") self.get_wallpaper_script = os.path.join(get_profile_path(), "scripts", "get_wallpaper") self.download_folder = os.path.join(get_profile_path(), "Downloaded") self.download_preference_ratio = 0.9 self.quota_enabled = True self.quota_size = 1000 self.wallhaven_api_key = "" self.favorites_folder = os.path.join(get_profile_path(), "Favorites") self.favorites_operations = [ ["Downloaded", "Copy"], ["Fetched", "Move"], ["Others", "Copy"], ] self.wallpaper_auto_rotate = True self.wallpaper_display_mode = "os" self.fetched_folder = os.path.join(get_profile_path(), "Fetched") self.clipboard_enabled = False self.clipboard_use_whitelist = True self.clipboard_hosts = "wallhaven.cc,ns223506.ovh.net,wallpapers.net,flickr.com,imgur.com,deviantart.com,interfacelift.com,vladstudio.com".split( "," ) self.icon = "Light" self.desired_color_enabled = False self.desired_color = None self.min_size_enabled = False self.min_size = 80 self.use_landscape_enabled = True self.lightness_enabled = False self.lightness_mode = Options.LightnessMode.DARK self.min_rating_enabled = False self.min_rating = 4 self.name_regex_enabled = False self.name_regex = ".*" self.smart_notice_shown = False self.smart_register_shown = False self.stats_notice_shown = False self.smart_enabled = False self.sync_enabled = False self.stats_enabled = False self.copyto_enabled = False self.copyto_folder = "Default" self.clock_enabled = False self.clock_font = "Serif 70" self.clock_date_font = "Serif 30" self.clock_filter = "-density 100 -font `fc-match -f '%{file[0]}' '%CLOCK_FONT_NAME'` -pointsize %CLOCK_FONT_SIZE -gravity SouthEast -fill '#00000044' -annotate 0x0+[%HOFFSET+58]+[%VOFFSET+108] '%H:%M' -fill white -annotate 0x0+[%HOFFSET+60]+[%VOFFSET+110] '%H:%M' -font `fc-match -f '%{file[0]}' '%DATE_FONT_NAME'` -pointsize %DATE_FONT_SIZE -fill '#00000044' -annotate 0x0+[%HOFFSET+58]+[%VOFFSET+58] '%A, %B %d' -fill white -annotate 0x0+[%HOFFSET+60]+[%VOFFSET+60] '%A, %B %d'" self.quotes_enabled = False self.quotes_font = "Serif 30" self.quotes_text_color = (255, 255, 255) self.quotes_bg_color = (80, 80, 80) self.quotes_bg_opacity = 55 self.quotes_text_shadow = False self.quotes_disabled_sources = [] self.quotes_tags = "" self.quotes_authors = "" self.quotes_change_enabled = False self.quotes_change_interval = 300 self.quotes_width = 70 self.quotes_hpos = 100 self.quotes_vpos = 40 self.quotes_max_length = 250 self.quotes_favorites_file = os.path.join(get_profile_path(), "favorite_quotes.txt") self.slideshow_sources_enabled = True self.slideshow_favorites_enabled = True self.slideshow_downloads_enabled = False self.slideshow_custom_enabled = False self.slideshow_custom_folder = Util.get_xdg_pictures_folder() self.slideshow_sort_order = "Random" self.slideshow_monitor = "All" self.slideshow_mode = "Fullscreen" self.slideshow_seconds = 6 self.slideshow_fade = 0.4 self.slideshow_zoom = 0.2 self.slideshow_pan = 0.05 self.sources = [ [True, Options.SourceType.FAVORITES, "The Favorites folder"], [True, Options.SourceType.FETCHED, "The Fetched folder"], [True, Options.SourceType.FOLDER, "/usr/share/backgrounds/"], [ True, Options.SourceType.FLICKR, "user:www.flickr.com/photos/peter-levi/;user_id:93647178@N00;", ], ] self.filters = [ [False, "Keep original", ""], [False, "Grayscale", "-type Grayscale"], [False, "Heavy blur", "-blur 120x40"], [False, "Oil painting", "-paint 6"], [False, "Charcoal painting", "-charcoal 3"], [False, "Pointilism", "-spread 10 -noise 3"], [False, "Pixellate", "-scale 3% -scale 3333%"], ] def write(self): try: config = ConfigObj(self.configfile, encoding="utf8", default_encoding="utf8") except Exception: config = ConfigObj(encoding="utf8", default_encoding="utf8") config.filename = self.configfile try: config["change_enabled"] = str(self.change_enabled) config["change_on_start"] = str(self.change_on_start) config["change_interval"] = str(self.change_interval) config["internet_enabled"] = str(self.internet_enabled) config["safe_mode"] = str(self.safe_mode) config["set_wallpaper_script"] = Util.collapseuser(self.set_wallpaper_script) config["get_wallpaper_script"] = Util.collapseuser(self.get_wallpaper_script) config["download_folder"] = Util.collapseuser(self.download_folder) config["download_preference_ratio"] = str(self.download_preference_ratio) config["quota_enabled"] = str(self.quota_enabled) config["quota_size"] = str(self.quota_size) config["wallhaven_api_key"] = str(self.wallhaven_api_key) config["favorites_folder"] = Util.collapseuser(self.favorites_folder) config["favorites_operations"] = ";".join( ":".join(x) for x in self.favorites_operations ) config["wallpaper_auto_rotate"] = str(self.wallpaper_auto_rotate) config["wallpaper_display_mode"] = str(self.wallpaper_display_mode) config["fetched_folder"] = Util.collapseuser(self.fetched_folder) config["clipboard_enabled"] = str(self.clipboard_enabled) config["clipboard_use_whitelist"] = str(self.clipboard_use_whitelist) config["clipboard_hosts"] = ",".join(self.clipboard_hosts) config["icon"] = self.icon config["desired_color_enabled"] = str(self.desired_color_enabled) config["desired_color"] = ( " ".join(map(str, self.desired_color)) if self.desired_color else "None" ) config["min_size_enabled"] = str(self.min_size_enabled) config["min_size"] = str(self.min_size) config["use_landscape_enabled"] = str(self.use_landscape_enabled) config["lightness_enabled"] = str(self.lightness_enabled) config["lightness_mode"] = str(self.lightness_mode) config["min_rating_enabled"] = str(self.min_rating_enabled) config["min_rating"] = str(self.min_rating) config["name_regex_enabled"] = str(self.name_regex_enabled) config["name_regex"] = str(self.name_regex) config["smart_notice_shown"] = str(self.smart_notice_shown) config["smart_register_shown"] = str(self.smart_register_shown) config["stats_notice_shown"] = str(self.stats_notice_shown) config["smart_enabled"] = str(self.smart_enabled) config["sync_enabled"] = str(self.sync_enabled) config["stats_enabled"] = str(self.stats_enabled) config["copyto_enabled"] = str(self.copyto_enabled) config["copyto_folder"] = Util.collapseuser(self.copyto_folder) config["clock_enabled"] = str(self.clock_enabled) config["clock_filter"] = self.clock_filter config["clock_font"] = self.clock_font config["clock_date_font"] = self.clock_date_font config["quotes_enabled"] = str(self.quotes_enabled) config["quotes_font"] = self.quotes_font config["quotes_text_color"] = " ".join(map(str, self.quotes_text_color)) config["quotes_bg_color"] = " ".join(map(str, self.quotes_bg_color)) config["quotes_bg_opacity"] = str(self.quotes_bg_opacity) config["quotes_text_shadow"] = str(self.quotes_text_shadow) config["quotes_disabled_sources"] = "|".join(self.quotes_disabled_sources) config["quotes_tags"] = self.quotes_tags config["quotes_authors"] = self.quotes_authors config["quotes_change_enabled"] = str(self.quotes_change_enabled) config["quotes_change_interval"] = str(self.quotes_change_interval) config["quotes_width"] = str(self.quotes_width) config["quotes_hpos"] = str(self.quotes_hpos) config["quotes_vpos"] = str(self.quotes_vpos) config["quotes_max_length"] = str(self.quotes_max_length) config["quotes_favorites_file"] = Util.collapseuser(self.quotes_favorites_file) config["slideshow_sources_enabled"] = str(self.slideshow_sources_enabled) config["slideshow_favorites_enabled"] = str(self.slideshow_favorites_enabled) config["slideshow_downloads_enabled"] = str(self.slideshow_downloads_enabled) config["slideshow_custom_enabled"] = str(self.slideshow_custom_enabled) config["slideshow_custom_folder"] = Util.collapseuser(self.slideshow_custom_folder) config["slideshow_sort_order"] = self.slideshow_sort_order config["slideshow_monitor"] = self.slideshow_monitor config["slideshow_mode"] = self.slideshow_mode config["slideshow_seconds"] = str(self.slideshow_seconds) config["slideshow_fade"] = str(self.slideshow_fade) config["slideshow_zoom"] = str(self.slideshow_zoom) config["slideshow_pan"] = str(self.slideshow_pan) config["sources"] = {} for i, s in enumerate(self.sources): config["sources"]["src" + str(i + 1)] = str(s[0]) + "|" + str(s[1]) + "|" + s[2] config["filters"] = {} for i, f in enumerate(self.filters): config["filters"]["filter" + str(i + 1)] = str(f[0]) + "|" + f[1] + "|" + f[2] config.write() except Exception: logger.exception(lambda: "Could not write configuration:") @staticmethod def set_options(opts): config = Options().read_config() for key, value in opts: config[key] = value config.write() def read_config(self): config = ConfigObj(raise_errors=False, encoding="utf8", default_encoding="utf8") config.filename = self.configfile try: config.reload() except DuplicateError: logger.warning(lambda: "Duplicate keys in config file, please fix this") return config if __name__ == "__main__": formatter = logging.Formatter("%(levelname)s:%(name)s: %(funcName)s() '%(message)s'") logger = logging.getLogger("variety") logger_sh = logging.StreamHandler() logger_sh.setFormatter(formatter) logger.addHandler(logger_sh) o = Options() o.read() print(o.sources) print(o.filters) o.write() variety-0.8.13/variety/PreferencesVarietyDialog.py000066400000000000000000001563221475753071700223010ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE # This is the preferences dialog. import logging import os import random import stat import subprocess import threading from gi.repository import Gdk, GdkPixbuf, GObject, Gtk # pylint: disable=E0611 from variety import Texts from variety.AddConfigurableDialog import AddConfigurableDialog from variety.AddFlickrDialog import AddFlickrDialog from variety.AddWallhavenDialog import AddWallhavenDialog from variety.EditFavoriteOperationsDialog import EditFavoriteOperationsDialog from variety.FolderChooser import FolderChooser from variety.Options import Options from variety.plugins.IQuoteSource import IQuoteSource from variety.profile import ( get_autostart_file_path, get_profile_path, get_profile_short_name, get_profile_wm_class, is_default_profile, ) from variety.Util import Util, _, on_gtk from variety_lib import varietyconfig from variety_lib.PreferencesDialog import PreferencesDialog from variety_lib.varietyconfig import get_data_file random.seed() logger = logging.getLogger("variety") SLIDESHOW_PAGE_INDEX = 4 DONATE_PAGE_INDEX = 10 class PreferencesVarietyDialog(PreferencesDialog): __gtype_name__ = "PreferencesVarietyDialog" def finish_initializing(self, builder, parent): # pylint: disable=E1002 """Set up the preferences dialog""" super(PreferencesVarietyDialog, self).finish_initializing(builder, parent) # Bind each preference widget to gsettings # widget = self.builder.get_object('example_entry') # settings.bind("example", widget, "text", Gio.SettingsBindFlags.DEFAULT) if Gdk.Screen.get_default().get_height() < 750: self.ui.sources_scrolled_window.set_size_request(0, 0) self.ui.hosts_scrolled_window.set_size_request(0, 0) self.ui.tips_scrolled_window.set_size_request(0, 0) PreferencesVarietyDialog.add_image_preview(self.ui.icon_chooser, 64) self.loading = False self.fav_chooser = FolderChooser( self.ui.favorites_folder_chooser, self.on_favorites_changed ) self.fetched_chooser = FolderChooser( self.ui.fetched_folder_chooser, self.on_fetched_changed ) self.copyto_chooser = FolderChooser(self.ui.copyto_folder_chooser, self.on_copyto_changed) self.slideshow_custom_chooser = FolderChooser( self.ui.slideshow_custom_chooser, self.delayed_apply ) if not Util.check_variety_slideshow_present(): self.ui.notebook.remove_page(SLIDESHOW_PAGE_INDEX) profile_suffix = ( "" if is_default_profile() else _(" (Profile: {})").format(get_profile_short_name()) ) self.set_title(_("Variety Preferences") + profile_suffix) self.set_wmclass(get_profile_wm_class(), get_profile_wm_class()) self.reload() def fill_smart_profile_url(self, msg): if "%SMART_PROFILE_URL%" in msg: profile_url = self.parent.smart.get_profile_url() msg = msg.replace("%SMART_PROFILE_URL%", profile_url) if profile_url else "" return msg def update_status_message(self): msg = "" if self.parent.server_options: try: msg_dict = self.parent.server_options.get("status_message", {}) ver = varietyconfig.get_version() if ver in msg_dict: msg = msg_dict[ver].strip() elif "*" in msg_dict: msg = msg_dict["*"].strip() msg = self.fill_smart_profile_url(msg) except Exception: logger.exception(lambda: "Could not parse status message") msg = "" self.set_status_message(msg) @on_gtk def set_status_message(self, msg): self.ui.status_message.set_visible(msg) self.ui.status_message.set_markup(msg) def reload(self): try: logger.info(lambda: "Reloading preferences dialog") self.loading = True self.options = Options() self.options.read() self.ui.autostart.set_active(os.path.isfile(get_autostart_file_path())) self.ui.change_enabled.set_active(self.options.change_enabled) self.set_change_interval(self.options.change_interval) self.ui.change_on_start.set_active(self.options.change_on_start) self.ui.internet_enabled.set_active(self.options.internet_enabled) self.fav_chooser.set_folder(os.path.expanduser(self.options.favorites_folder)) self.ui.wallpaper_auto_rotate.set_active(self.options.wallpaper_auto_rotate) self.ui.wallpaper_display_mode.remove_all() for mode in self.parent.get_display_modes(): self.ui.wallpaper_display_mode.append(mode.id, mode.title) self.ui.wallpaper_display_mode.set_active_id(self.options.wallpaper_display_mode) self.fetched_chooser.set_folder(os.path.expanduser(self.options.fetched_folder)) self.ui.clipboard_enabled.set_active(self.options.clipboard_enabled) self.ui.clipboard_use_whitelist.set_active(self.options.clipboard_use_whitelist) self.ui.clipboard_hosts.get_buffer().set_text("\n".join(self.options.clipboard_hosts)) if self.options.icon == "Light": self.ui.icon.set_active(0) elif self.options.icon == "Dark": self.ui.icon.set_active(1) elif self.options.icon == "1": self.ui.icon.set_active(2) elif self.options.icon == "2": self.ui.icon.set_active(3) elif self.options.icon == "3": self.ui.icon.set_active(4) elif self.options.icon == "4": self.ui.icon.set_active(5) elif self.options.icon == "Current": self.ui.icon.set_active(6) elif self.options.icon == "None": self.ui.icon.set_active(8) else: self.ui.icon.set_active(7) self.ui.icon_chooser.set_filename(self.options.icon) if self.options.favorites_operations == [["/", "Copy"]]: self.ui.favorites_operations.set_active(0) elif self.options.favorites_operations == [["/", "Move"]]: self.ui.favorites_operations.set_active(1) elif self.options.favorites_operations == [["/", "Both"]]: self.ui.favorites_operations.set_active(2) else: self.ui.favorites_operations.set_active(3) self.favorites_operations = self.options.favorites_operations self.ui.copyto_enabled.set_active(self.options.copyto_enabled) self.copyto_chooser.set_folder(self.parent.get_actual_copyto_folder()) self.ui.desired_color_enabled.set_active(self.options.desired_color_enabled) self.ui.desired_color.set_color( Gdk.Color(red=160 * 256, green=160 * 256, blue=160 * 256) ) c = self.options.desired_color if c: self.ui.desired_color.set_color( Gdk.Color(red=c[0] * 256, green=c[1] * 256, blue=c[2] * 256) ) self.ui.min_size_enabled.set_active(self.options.min_size_enabled) min_sizes = [50, 80, 100] index = 0 while min_sizes[index] < self.options.min_size and index < len(min_sizes) - 1: index += 1 self.ui.min_size.set_active(index) self.ui.landscape_enabled.set_active(self.options.use_landscape_enabled) self.ui.lightness_enabled.set_active(self.options.lightness_enabled) self.ui.lightness.set_active( 0 if self.options.lightness_mode == Options.LightnessMode.DARK else 1 ) self.ui.min_rating_enabled.set_active(self.options.min_rating_enabled) self.ui.min_rating.set_active(self.options.min_rating - 1) self.ui.name_regex_enabled.set_active(self.options.name_regex_enabled) self.ui.name_regex.set_text(self.options.name_regex) self.ui.clock_enabled.set_active(self.options.clock_enabled) self.ui.clock_font.set_font_name(self.options.clock_font) self.ui.clock_date_font.set_font_name(self.options.clock_date_font) self.ui.quotes_enabled.set_active(self.options.quotes_enabled) self.ui.quotes_font.set_font_name(self.options.quotes_font) c = self.options.quotes_text_color self.ui.quotes_text_color.set_color( Gdk.Color(red=c[0] * 256, green=c[1] * 256, blue=c[2] * 256) ) c = self.options.quotes_bg_color self.ui.quotes_bg_color.set_color( Gdk.Color(red=c[0] * 256, green=c[1] * 256, blue=c[2] * 256) ) self.ui.quotes_bg_opacity.set_value(self.options.quotes_bg_opacity) self.ui.quotes_text_shadow.set_active(self.options.quotes_text_shadow) self.ui.quotes_tags.set_text(self.options.quotes_tags) self.ui.quotes_authors.set_text(self.options.quotes_authors) self.ui.quotes_change_enabled.set_active(self.options.quotes_change_enabled) self.set_quotes_change_interval(self.options.quotes_change_interval) self.ui.quotes_width.set_value(self.options.quotes_width) self.ui.quotes_hpos.set_value(self.options.quotes_hpos) self.ui.quotes_vpos.set_value(self.options.quotes_vpos) self.ui.slideshow_sources_enabled.set_active(self.options.slideshow_sources_enabled) self.ui.slideshow_favorites_enabled.set_active(self.options.slideshow_favorites_enabled) self.ui.slideshow_downloads_enabled.set_active(self.options.slideshow_downloads_enabled) self.ui.slideshow_custom_enabled.set_active(self.options.slideshow_custom_enabled) self.slideshow_custom_chooser.set_folder( os.path.expanduser(self.options.slideshow_custom_folder) ) if self.options.slideshow_sort_order == "Random": self.ui.slideshow_sort_order.set_active(0) elif self.options.slideshow_sort_order == "Name, asc": self.ui.slideshow_sort_order.set_active(1) elif self.options.slideshow_sort_order == "Name, desc": self.ui.slideshow_sort_order.set_active(2) elif self.options.slideshow_sort_order == "Date, asc": self.ui.slideshow_sort_order.set_active(3) elif self.options.slideshow_sort_order == "Date, desc": self.ui.slideshow_sort_order.set_active(4) else: self.ui.slideshow_sort_order.set_active(0) self.ui.slideshow_monitor.remove_all() self.ui.slideshow_monitor.append_text(_("All")) screen = Gdk.Screen.get_default() for i in range(0, screen.get_n_monitors()): geo = screen.get_monitor_geometry(i) self.ui.slideshow_monitor.append_text( "%d - %s, %dx%d" % (i + 1, screen.get_monitor_plug_name(i), geo.width, geo.height) ) self.ui.slideshow_monitor.set_active(0) try: self.ui.slideshow_monitor.set_active(int(self.options.slideshow_monitor)) except: self.ui.slideshow_monitor.set_active(0) if self.options.slideshow_mode == "Fullscreen": self.ui.slideshow_mode.set_active(0) elif self.options.slideshow_mode == "Desktop": self.ui.slideshow_mode.set_active(1) elif self.options.slideshow_mode == "Maximized": self.ui.slideshow_mode.set_active(2) elif self.options.slideshow_mode == "Window": self.ui.slideshow_mode.set_active(3) else: self.ui.slideshow_mode.set_active(0) self.ui.slideshow_seconds.set_value(self.options.slideshow_seconds) self.ui.slideshow_fade.set_value(self.options.slideshow_fade) self.ui.slideshow_zoom.set_value(self.options.slideshow_zoom) self.ui.slideshow_pan.set_value(self.options.slideshow_pan) self.unsupported_sources = [] self.ui.sources.get_model().clear() for s in self.options.sources: if s[1] in Options.get_all_supported_source_types(): self.ui.sources.get_model().append(self.source_to_model_row(s)) else: self.unsupported_sources.append(s) if not hasattr(self, "enabled_toggled_handler_id"): self.enabled_toggled_handler_id = self.ui.sources_enabled_checkbox_renderer.connect( "toggled", self.source_enabled_toggled, self.ui.sources.get_model() ) # self.ui.sources.get_selection().connect("changed", self.on_sources_selection_changed) if hasattr(self, "filter_checkboxes"): for cb in self.filter_checkboxes: # pylint: disable=access-member-before-definition self.ui.filters_grid.remove(cb) cb.destroy() self.filter_checkboxes = [] self.filter_name_to_checkbox = {} for i, f in enumerate(self.options.filters): cb = Gtk.CheckButton(Texts.FILTERS.get(f[1], f[1])) self.filter_name_to_checkbox[f[1]] = cb cb.connect("toggled", self.delayed_apply) cb.set_visible(True) cb.set_active(f[0]) cb.set_margin_right(20) self.ui.filters_grid.attach(cb, i % 4, i // 4, 1, 1) self.filter_checkboxes.append(cb) # pylint: disable=access-member-before-definition if hasattr(self, "quotes_sources_checkboxes"): for cb in self.quotes_sources_checkboxes: self.ui.quotes_sources_grid.remove(cb) cb.destroy() self.quotes_sources_checkboxes = [] for i, p in enumerate(self.parent.jumble.get_plugins(IQuoteSource)): cb = Gtk.CheckButton(p["info"]["name"]) cb.connect("toggled", self.delayed_apply) cb.set_visible(True) cb.set_tooltip_text(p["info"]["description"]) cb.set_active(p["info"]["name"] not in self.options.quotes_disabled_sources) cb.set_margin_right(20) self.ui.quotes_sources_grid.attach(cb, i % 4, i // 4, 1, 1) self.quotes_sources_checkboxes.append(cb) self.ui.tips_buffer.set_text( "\n\n".join( [ tip.replace("{PROFILE_PATH}", get_profile_path(expanded=False)) for tip in Texts.TIPS ] ) ) try: with open(get_data_file("ui/changes.txt")) as f: self.ui.changes_buffer.set_text(f.read()) except Exception: logger.warning(lambda: "Missing ui/changes.txt file") self.on_change_enabled_toggled() self.on_sources_selection_changed() self.on_desired_color_enabled_toggled() self.on_min_size_enabled_toggled() self.on_lightness_enabled_toggled() self.on_min_rating_enabled_toggled() self.on_name_regex_enabled_toggled() self.on_copyto_enabled_toggled() self.on_quotes_change_enabled_toggled() self.on_icon_changed() self.on_favorites_operations_changed() self.on_wallpaper_display_mode_changed() self.update_clipboard_state() self.update_status_message() finally: # To be sure we are completely loaded, pass via two hops: first delay, then idle_add: def _finish_loading(): self.loading = False def _idle_finish_loading(): Util.add_mainloop_task(_finish_loading) timer = threading.Timer(1, _idle_finish_loading) timer.start() def on_add_button_clicked(self, widget=None): def position(*args, **kwargs): button_alloc = self.ui.add_button.get_allocation() window_pos = self.ui.add_button.get_window().get_position() return ( button_alloc.x + window_pos[0], button_alloc.y + button_alloc.height + window_pos[1], True, ) add_menu = self.build_add_button_menu() add_menu.popup(None, self.ui.add_button, position, None, 0, Gtk.get_current_event_time()) def on_remove_sources_clicked(self, widget=None): def position(*args, **kwargs): button_alloc = self.ui.remove_sources.get_allocation() window_pos = self.ui.remove_sources.get_window().get_position() return ( button_alloc.x + window_pos[0], button_alloc.y + button_alloc.height + window_pos[1], True, ) self.build_remove_button_menu().popup( None, self.ui.remove_sources, position, None, 0, Gtk.get_current_event_time() ) def build_add_button_menu(self): add_menu = Gtk.Menu() items = [ (False, _("Images"), _("Add individual wallpaper images"), self.on_add_images_clicked), ( False, _("Folders"), _("Searched recursively for up to 10000 images, shown in random order"), lambda widget: self.on_add_folders_clicked( widget, source_type=Options.SourceType.FOLDER ), ), ( False, _("Sequential Albums (order by filename)"), _("Searched recursively for images, shown in sequence (by filename)"), lambda widget: self.on_add_folders_clicked( widget, source_type=Options.SourceType.ALBUM_FILENAME ), ), ( False, _("Sequential Albums (order by date)"), _("Searched recursively for images, shown in sequence (by file date)"), lambda widget: self.on_add_folders_clicked( widget, source_type=Options.SourceType.ALBUM_DATE ), ), "-", ] configurable_items = [ (True, _("Flickr"), _("Fetch images from Flickr"), self.on_add_flickr_clicked) ] for source in self.options.CONFIGURABLE_IMAGE_SOURCES: def _click(widget, source=source): self.on_add_configurable(source) configurable_items.append( ( source.needs_internet(), source.get_source_name(), source.get_ui_short_description(), _click, ) ) configurable_items.sort(key=lambda x: x[1]) items.extend(configurable_items) for x in items: if x == "-": item = Gtk.SeparatorMenuItem.new() item.set_margin_top(15) item.set_margin_bottom(15) else: item = Gtk.MenuItem() label = Gtk.Label("{}\n{}".format(x[1], x[2])) label.set_margin_top(6) label.set_margin_bottom(6) label.set_xalign(0) label.set_use_markup(True) item.add(label) if x[0] and not self.ui.internet_enabled.get_active(): # disable adding internet-requiring sources when internet is disabled item.set_sensitive(False) else: item.connect("activate", x[3]) add_menu.append(item) add_menu.show_all() return add_menu def build_remove_button_menu(self): model, rows = self.ui.sources.get_selection().get_selected_rows() has_downloaders = False for row in rows: type = model[row][1] if type in Options.get_editable_source_types(): has_downloaders = True self.remove_menu = Gtk.Menu() item1 = Gtk.MenuItem() item1.set_label( _("Remove the source, keep the files") if len(rows) == 1 else _("Remove the sources, keep the files") ) item1.connect("activate", self.remove_sources) self.remove_menu.append(item1) item2 = Gtk.MenuItem() def _remove_with_files(widget=None): self.remove_sources(delete_files=True) item2.set_label( _("Remove the source and delete the downloaded files") if len(rows) == 1 else _("Remove the sources and delete the downloaded files") ) item2.connect("activate", _remove_with_files) item2.set_sensitive(has_downloaders) self.remove_menu.append(item2) self.remove_menu.show_all() return self.remove_menu def source_enabled_toggled(self, widget, path, model): row = model[path] row[0] = not row[0] self.on_row_enabled_state_changed(row) def on_row_enabled_state_changed(self, row): # Special case when enabling refresher downloaders: refresher_dls = [ dl for dl in Options.SIMPLE_DOWNLOADERS # TODO: this will break if we have non-simple refresher downloaders if dl.get_source_type() == row[1] and dl.is_refresher() ] if row[0] and len(refresher_dls) > 0: refresh_time = refresher_dls[0].get_refresh_interval_seconds() updated = False if not self.ui.change_enabled.get_active(): self.ui.change_enabled.set_active(True) updated = True if self.get_change_interval() > refresh_time: self.set_change_interval(refresh_time) updated = True if updated: self.parent.show_notification( refresher_dls[0].get_description(), _( "Using this source requires wallpaper changing " "enabled at intervals of %d minutes or less. " "Settings were adjusted automatically." ) % int(refresh_time / 60), ) def set_time(self, interval, text, time_unit, times=(1, 60, 60 * 60, 24 * 60 * 60)): if interval < 5: interval = 5 x = len(times) - 1 while times[x] > interval: x -= 1 text.set_text(str(interval // times[x])) time_unit.set_active(x) return def set_change_interval(self, seconds): self.set_time(seconds, self.ui.change_interval_text, self.ui.change_interval_time_unit) def set_quotes_change_interval(self, seconds): self.set_time( seconds, self.ui.quotes_change_interval_text, self.ui.quotes_change_interval_time_unit ) def read_time(self, text_entry, time_unit_combo, minimum, default): result = default try: interval = int(text_entry.get_text()) tree_iter = time_unit_combo.get_active_iter() if tree_iter: model = time_unit_combo.get_model() time_unit_seconds = model[tree_iter][1] result = interval * time_unit_seconds if result < minimum: result = minimum except Exception: logger.exception(lambda: "Could not understand interval") return result def get_change_interval(self): return self.read_time( self.ui.change_interval_text, self.ui.change_interval_time_unit, 5, self.options.change_interval, ) def get_quotes_change_interval(self): return self.read_time( self.ui.quotes_change_interval_text, self.ui.quotes_change_interval_time_unit, 10, self.options.quotes_change_interval, ) @staticmethod def add_image_preview(chooser, size=250): preview = Gtk.Image() chooser.set_preview_widget(preview) def update_preview(c): try: file = chooser.get_preview_filename() pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(file, size, size) preview.set_from_pixbuf(pixbuf) chooser.set_preview_widget_active(True) except Exception: chooser.set_preview_widget_active(False) chooser.connect("update-preview", update_preview) def on_add_images_clicked(self, widget=None): chooser = Gtk.FileChooserDialog( _("Add Images"), parent=self, action=Gtk.FileChooserAction.OPEN, buttons=[_("Cancel"), Gtk.ResponseType.CANCEL, _("Add"), Gtk.ResponseType.OK], ) self.dialog = chooser PreferencesVarietyDialog.add_image_preview(chooser) chooser.set_select_multiple(True) chooser.set_local_only(True) filter = Gtk.FileFilter() filter.set_name(_("Images")) for s in ["jpg", "jpeg", "png", "bmp", "tiff", "svg"]: filter.add_pattern("*." + s) filter.add_pattern("*." + s.upper()) chooser.add_filter(filter) response = chooser.run() if response == Gtk.ResponseType.OK: images = list(chooser.get_filenames()) images = [f for f in images if Util.is_image(f) and os.path.isfile(f)] self.add_sources(Options.SourceType.IMAGE, images) self.dialog = None chooser.destroy() def on_add_folders_clicked(self, widget=None, source_type=Options.SourceType.FOLDER): if source_type == Options.SourceType.FOLDER: title = _( "Add Folders - Only add the root folders, subfolders are searched recursively" ) elif source_type == Options.SourceType.ALBUM_FILENAME: title = _( "Add Sequential Albums (ordered by filename). Subfolders are searched recursively." ) elif source_type == Options.SourceType.ALBUM_DATE: title = _( "Add Sequential Albums (ordered by date). Subfolders are searched recursively." ) else: raise Exception("Unsuppoted source_type {}".format(source_type)) chooser = Gtk.FileChooserDialog( title, parent=self, action=Gtk.FileChooserAction.SELECT_FOLDER, buttons=[_("Cancel"), Gtk.ResponseType.CANCEL, _("Add"), Gtk.ResponseType.OK], ) self.dialog = chooser chooser.set_select_multiple(True) chooser.set_local_only(True) response = chooser.run() if response == Gtk.ResponseType.OK: folders = list(chooser.get_filenames()) folders = [f for f in folders if os.path.isdir(f)] self.add_sources(source_type, folders) self.dialog = None chooser.destroy() def add_sources(self, type, locations): self.ui.sources.get_selection().unselect_all() existing = {} for i, r in enumerate(self.ui.sources.get_model()): if r[1] == type: if type in ( Options.SourceType.FOLDER, Options.SourceType.ALBUM_FILENAME, Options.SourceType.ALBUM_DATE, ): existing[os.path.normpath(r[2])] = r, i else: existing[self.model_row_to_source(r)[2]] = r, i newly_added = 0 for f in locations: if type in Options.SourceType.LOCAL_PATH_TYPES: f = os.path.normpath(f) elif type not in Options.get_editable_source_types(): f = ( list(existing.keys())[0] if existing else None ) # reuse the already existing location, do not add another one if not f in existing: self.ui.sources.get_model().append(self.source_to_model_row([True, type, f])) self.ui.sources.get_selection().select_path(len(self.ui.sources.get_model()) - 1) self.ui.sources.scroll_to_cell( len(self.ui.sources.get_model()) - 1, None, False, 0, 0 ) newly_added += 1 else: logger.info(lambda: "Source already exists, activating it: " + f) existing[f][0][0] = True self.ui.sources.get_selection().select_path(existing[f][1]) self.ui.sources.scroll_to_cell(existing[f][1], None, False, 0, 0) return newly_added def focus_source_and_image(self, source, image): self.ui.notebook.set_current_page(0) self.ui.sources.get_selection().unselect_all() for i, r in enumerate(self.ui.sources.get_model()): if self.model_row_to_source(r)[1:] == source[1:]: self.focused_image = image self.ui.sources.get_selection().select_path(i) self.ui.sources.scroll_to_cell(i, None, False, 0, 0) return def remove_sources(self, widget=None, delete_files=False): model, rows = self.ui.sources.get_selection().get_selected_rows() if delete_files: for row in rows: type = model[row][1] if type in Options.get_editable_source_types(): source = self.model_row_to_source(model[row]) self.parent.delete_files_of_source(source) # store the treeiters from paths iters = [] for row in rows: if model[row][1] in Options.get_removable_source_types(): iters.append(model.get_iter(row)) # remove the rows (treeiters) for i in iters: if i is not None: model.remove(i) def on_source_doubleclicked(self, tree_view, row_index, arg4=None): self.edit_source(self.ui.sources.get_model()[row_index]) def on_edit_source_clicked(self, widget=None): model, rows = self.ui.sources.get_selection().get_selected_rows() if len(rows) == 1: self.edit_source(model[rows[0]]) def on_open_folder_clicked(self, widget=None): model, rows = self.ui.sources.get_selection().get_selected_rows() if len(rows) != 1: return row = model[rows[0]] type = row[1] if type in Options.SourceType.LOCAL_PATH_TYPES: subprocess.Popen(["xdg-open", os.path.realpath(row[2])]) elif type == Options.SourceType.FAVORITES: subprocess.Popen(["xdg-open", self.parent.options.favorites_folder]) elif type == Options.SourceType.FETCHED: subprocess.Popen(["xdg-open", self.parent.options.fetched_folder]) else: subprocess.Popen( ["xdg-open", self.parent.get_folder_of_source(self.model_row_to_source(row))] ) def on_use_clicked(self, widget=None): model, rows = self.ui.sources.get_selection().get_selected_rows() for row in model: row[0] = False for path in rows: model[path][0] = True for row in model: # TODO we trigger for all rows, though some of them don't actually change state - but no problem for now self.on_row_enabled_state_changed(row) self.on_sources_selection_changed() def edit_source(self, edited_row): type = edited_row[1] if type in Options.get_editable_source_types(): if type == Options.SourceType.FLICKR: self.dialog = AddFlickrDialog() elif type in Options.CONFIGURABLE_IMAGE_SOURCES_MAP: if type == Options.SourceType.WALLHAVEN: self.dialog = AddWallhavenDialog(self.parent) else: self.dialog = AddConfigurableDialog() self.dialog.set_source(Options.CONFIGURABLE_IMAGE_SOURCES_MAP[type]) self.dialog.set_edited_row(edited_row) self.show_dialog(self.dialog) def on_internet_enabled_toggled(self, *args): self.delayed_apply() self.previous_selection = None self.on_sources_selection_changed() def on_sources_selection_changed(self, widget=None): model, rows = self.ui.sources.get_selection().get_selected_rows() enabled = set(i for i, row in enumerate(model) if row[0]) selected = set(row.get_indices()[0] for row in rows) self.ui.use_button.set_sensitive(selected and enabled != selected) # pylint: disable=access-member-before-definition if hasattr(self, "previous_selection") and rows == self.previous_selection: return self.previous_selection = rows self.ui.edit_source.set_sensitive(False) self.ui.edit_source.set_label(_("Edit...")) self.ui.open_folder.set_sensitive(len(rows) == 1) self.ui.open_folder.set_label(_("Open Folder")) if len(rows) == 1: source = model[rows[0]] type = source[1] if type == Options.SourceType.IMAGE: self.ui.open_folder.set_label(_("View Image")) elif type in Options.get_editable_source_types(): self.ui.edit_source.set_sensitive(self.ui.internet_enabled.get_active()) def timer_func(): self.show_thumbs(list(model[row] for row in rows)) # pylint: disable=access-member-before-definition if hasattr(self, "show_timer") and self.show_timer: self.show_timer.cancel() self.show_timer = threading.Timer(0.3, timer_func) self.show_timer.start() for row in rows: if model[row][1] not in Options.get_removable_source_types(): self.ui.remove_sources.set_sensitive(False) return self.ui.remove_sources.set_sensitive(len(rows) > 0) def model_row_to_source(self, row): return [row[0], row[1], Texts.SOURCES[row[1]][0] if row[1] in Texts.SOURCES else row[2]] def source_to_model_row(self, s): srctype = s[1] return [s[0], srctype, s[2] if not srctype in Texts.SOURCES else Texts.SOURCES[srctype][1]] def show_thumbs(self, source_rows, pin=False, thumbs_type=None): try: if not source_rows: return self.parent.thumbs_manager.hide(force=True) images = [] folders = [] for row in source_rows: if not row: continue type = row[1] if type == Options.SourceType.IMAGE: images.append(row[2]) else: folder = self.parent.get_folder_of_source(self.model_row_to_source(row)) folders.append(folder) folder_images = list( Util.list_files(folders=folders, filter_func=Util.is_image, max_files=10000) ) if len(source_rows) == 1 and source_rows[0][1] == Options.SourceType.ALBUM_FILENAME: folder_images = sorted(folder_images) elif len(source_rows) == 1 and source_rows[0][1] == Options.SourceType.ALBUM_DATE: folder_images = sorted(folder_images, key=os.path.getmtime) else: random.shuffle(folder_images) to_show = images + folder_images if hasattr(self, "focused_image") and self.focused_image is not None: try: to_show.remove(self.focused_image) except Exception: pass to_show.insert(0, self.focused_image) self.focused_image = None self.parent.thumbs_manager.show( to_show, screen=self.get_screen(), folders=folders, type=thumbs_type ) if pin: self.parent.thumbs_manager.pin() if thumbs_type: self.parent.update_indicator(auto_changed=False) except Exception: logger.exception(lambda: "Could not create thumbs window:") def on_add_flickr_clicked(self, widget=None): self.show_dialog(AddFlickrDialog()) def on_add_configurable(self, source): if source.get_source_type() == Options.SourceType.WALLHAVEN: dialog = AddWallhavenDialog(self.parent) else: dialog = AddConfigurableDialog() dialog.set_source(source) self.show_dialog(dialog) def on_wallpaper_display_mode_changed(self, *args): modes = [ m for m in self.parent.get_display_modes() if m.id == self.ui.wallpaper_display_mode.get_active_id() ] if modes: self.ui.wallpaper_mode_description.set_text(modes[0].description) else: self.ui.wallpaper_mode_description.set_text("") def show_dialog(self, dialog): self.dialog = dialog self.dialog.parent = self self.dialog.set_transient_for(self) response = self.dialog.run() if response != Gtk.ResponseType.OK: if self.dialog: self.dialog.destroy() self.dialog = None def on_add_dialog_okay(self, source_type, location, edited_row): if edited_row: edited_row[2] = location else: self.add_sources(source_type, [location]) self.dialog = None def close(self): self.ui.error_favorites.set_label("") self.ui.error_fetched.set_label("") self.hide() self.parent.trigger_download() self.on_destroy() def on_save_clicked(self, widget): self.delayed_apply() self.close() def delayed_apply(self, widget=None, *arg): if not self.loading: self.delayed_apply_with_interval(0.1) def delayed_apply_slow(self, widget=None, *arg): if not self.loading: self.delayed_apply_with_interval(1) def delayed_apply_with_interval(self, interval): # pylint: disable=access-member-before-definition if not self.loading: if hasattr(self, "apply_timer") and self.apply_timer: self.apply_timer.cancel() self.apply_timer = None self.apply_timer = threading.Timer(interval, self.apply) self.apply_timer.start() def apply(self): try: logger.info(lambda: "Applying preferences") self.options = Options() self.options.read() self.options.change_enabled = self.ui.change_enabled.get_active() self.options.change_on_start = self.ui.change_on_start.get_active() self.options.change_interval = self.get_change_interval() self.options.internet_enabled = self.ui.internet_enabled.get_active() if os.access(self.fav_chooser.get_folder(), os.W_OK): self.options.favorites_folder = self.fav_chooser.get_folder() self.options.favorites_operations = self.favorites_operations self.options.sources = [] for r in self.ui.sources.get_model(): self.options.sources.append(self.model_row_to_source(r)) for s in self.unsupported_sources: self.options.sources.append(s) self.options.wallpaper_auto_rotate = self.ui.wallpaper_auto_rotate.get_active() self.options.wallpaper_display_mode = self.ui.wallpaper_display_mode.get_active_id() if os.access(self.fetched_chooser.get_folder(), os.W_OK): self.options.fetched_folder = self.fetched_chooser.get_folder() self.options.clipboard_enabled = self.ui.clipboard_enabled.get_active() self.options.clipboard_use_whitelist = self.ui.clipboard_use_whitelist.get_active() buf = self.ui.clipboard_hosts.get_buffer() self.options.clipboard_hosts = Util.split( buf.get_text(buf.get_start_iter(), buf.get_end_iter(), False) ) if self.ui.icon.get_active() == 0: self.options.icon = "Light" elif self.ui.icon.get_active() == 1: self.options.icon = "Dark" elif self.ui.icon.get_active() == 2: self.options.icon = "1" elif self.ui.icon.get_active() == 3: self.options.icon = "2" elif self.ui.icon.get_active() == 4: self.options.icon = "3" elif self.ui.icon.get_active() == 5: self.options.icon = "4" elif self.ui.icon.get_active() == 6: self.options.icon = "Current" elif self.ui.icon.get_active() == 8: self.options.icon = "None" elif self.ui.icon.get_active() == 7: file = self.ui.icon_chooser.get_filename() if file and os.access(file, os.R_OK): self.options.icon = file else: self.options.icon = "Light" if self.ui.favorites_operations.get_active() == 0: self.options.favorites_operations = [["/", "Copy"]] elif self.ui.favorites_operations.get_active() == 1: self.options.favorites_operations = [["/", "Move"]] elif self.ui.favorites_operations.get_active() == 2: self.options.favorites_operations = [["/", "Both"]] elif self.ui.favorites_operations.get_active() == 3: # will be set in the favops editor dialog pass self.options.copyto_enabled = self.ui.copyto_enabled.get_active() copyto = os.path.normpath(self.copyto_chooser.get_folder()) if copyto == os.path.normpath(self.parent.get_actual_copyto_folder("Default")): self.options.copyto_folder = "Default" else: self.options.copyto_folder = copyto self.options.desired_color_enabled = self.ui.desired_color_enabled.get_active() c = self.ui.desired_color.get_color() self.options.desired_color = (c.red // 256, c.green // 256, c.blue // 256) self.options.min_size_enabled = self.ui.min_size_enabled.get_active() try: self.options.min_size = int(self.ui.min_size.get_active_text()) except Exception: pass self.options.use_landscape_enabled = self.ui.landscape_enabled.get_active() self.options.lightness_enabled = self.ui.lightness_enabled.get_active() self.options.lightness_mode = ( Options.LightnessMode.DARK if self.ui.lightness.get_active() == 0 else Options.LightnessMode.LIGHT ) self.options.min_rating_enabled = self.ui.min_rating_enabled.get_active() try: self.options.min_rating = int(self.ui.min_rating.get_active_text()) except Exception: pass self.options.name_regex_enabled = self.ui.name_regex_enabled.get_active() try: self.options.name_regex = self.ui.name_regex.get_text() except Exception: pass self.options.clock_enabled = self.ui.clock_enabled.get_active() self.options.clock_font = self.ui.clock_font.get_font_name() self.options.clock_date_font = self.ui.clock_date_font.get_font_name() self.options.quotes_enabled = self.ui.quotes_enabled.get_active() self.options.quotes_font = self.ui.quotes_font.get_font_name() c = self.ui.quotes_text_color.get_color() self.options.quotes_text_color = (c.red // 256, c.green // 256, c.blue // 256) c = self.ui.quotes_bg_color.get_color() self.options.quotes_bg_color = (c.red // 256, c.green // 256, c.blue // 256) self.options.quotes_bg_opacity = max( 0, min(100, int(self.ui.quotes_bg_opacity.get_value())) ) self.options.quotes_text_shadow = self.ui.quotes_text_shadow.get_active() self.options.quotes_tags = self.ui.quotes_tags.get_text() self.options.quotes_authors = self.ui.quotes_authors.get_text() self.options.quotes_change_enabled = self.ui.quotes_change_enabled.get_active() self.options.quotes_change_interval = self.get_quotes_change_interval() self.options.quotes_width = max(0, min(100, int(self.ui.quotes_width.get_value()))) self.options.quotes_hpos = max(0, min(100, int(self.ui.quotes_hpos.get_value()))) self.options.quotes_vpos = max(0, min(100, int(self.ui.quotes_vpos.get_value()))) self.options.quotes_disabled_sources = [ cb.get_label() for cb in self.quotes_sources_checkboxes if not cb.get_active() ] for f in self.options.filters: f[0] = self.filter_name_to_checkbox[f[1]].get_active() self.options.slideshow_sources_enabled = self.ui.slideshow_sources_enabled.get_active() self.options.slideshow_favorites_enabled = ( self.ui.slideshow_favorites_enabled.get_active() ) self.options.slideshow_downloads_enabled = ( self.ui.slideshow_downloads_enabled.get_active() ) self.options.slideshow_custom_enabled = self.ui.slideshow_custom_enabled.get_active() if os.access(self.slideshow_custom_chooser.get_folder(), os.R_OK): self.options.slideshow_custom_folder = self.slideshow_custom_chooser.get_folder() if self.ui.slideshow_sort_order.get_active() == 0: self.options.slideshow_sort_order = "Random" elif self.ui.slideshow_sort_order.get_active() == 1: self.options.slideshow_sort_order = "Name, asc" elif self.ui.slideshow_sort_order.get_active() == 2: self.options.slideshow_sort_order = "Name, desc" elif self.ui.slideshow_sort_order.get_active() == 3: self.options.slideshow_sort_order = "Date, asc" elif self.ui.slideshow_sort_order.get_active() == 4: self.options.slideshow_sort_order = "Date, desc" if self.ui.slideshow_monitor.get_active() == 0: self.options.slideshow_monitor = "All" else: self.options.slideshow_monitor = self.ui.slideshow_monitor.get_active() if self.ui.slideshow_mode.get_active() == 0: self.options.slideshow_mode = "Fullscreen" elif self.ui.slideshow_mode.get_active() == 1: self.options.slideshow_mode = "Desktop" elif self.ui.slideshow_mode.get_active() == 2: self.options.slideshow_mode = "Maximized" elif self.ui.slideshow_mode.get_active() == 3: self.options.slideshow_mode = "Window" self.options.slideshow_seconds = max(0.5, float(self.ui.slideshow_seconds.get_value())) self.options.slideshow_fade = max(0, min(1, float(self.ui.slideshow_fade.get_value()))) self.options.slideshow_zoom = max(0, min(1, float(self.ui.slideshow_zoom.get_value()))) self.options.slideshow_pan = max(0, min(0.2, float(self.ui.slideshow_pan.get_value()))) self.options.write() if not self.parent.running: return self.parent.reload_config() self.update_autostart() except Exception: if self.parent.running: logger.exception(lambda: "Error while applying preferences") dialog = Gtk.MessageDialog( self, Gtk.DialogFlags.MODAL, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, "An error occurred while saving preferences.\n" "Please run from a terminal with the -v flag and try again.", ) dialog.set_title("Oops") dialog.run() dialog.destroy() def update_autostart(self): file = get_autostart_file_path() if not self.ui.autostart.get_active(): if os.path.exists(file): logger.info(lambda: "Removing autostart entry") Util.safe_unlink(file) else: if not os.path.exists(file): self.parent.create_autostart_entry() def on_change_enabled_toggled(self, widget=None): self.ui.change_interval_text.set_sensitive(self.ui.change_enabled.get_active()) self.ui.change_interval_time_unit.set_sensitive(self.ui.change_enabled.get_active()) def on_quotes_change_enabled_toggled(self, widget=None): self.ui.quotes_change_interval_text.set_sensitive( self.ui.quotes_change_enabled.get_active() ) self.ui.quotes_change_interval_time_unit.set_sensitive( self.ui.quotes_change_enabled.get_active() ) def on_desired_color_enabled_toggled(self, widget=None): self.ui.desired_color.set_sensitive(self.ui.desired_color_enabled.get_active()) def on_min_size_enabled_toggled(self, widget=None): self.ui.min_size.set_sensitive(self.ui.min_size_enabled.get_active()) self.ui.min_size_label.set_sensitive(self.ui.min_size_enabled.get_active()) def on_min_rating_enabled_toggled(self, widget=None): self.ui.min_rating.set_sensitive(self.ui.min_rating_enabled.get_active()) def on_name_regex_enabled_toggled(self, widget=None): self.ui.name_regex.set_sensitive(self.ui.name_regex_enabled.get_active()) def on_lightness_enabled_toggled(self, widget=None): self.ui.lightness.set_sensitive(self.ui.lightness_enabled.get_active()) def on_destroy(self, widget=None): if hasattr(self, "dialog") and self.dialog: try: self.dialog.destroy() except Exception: pass for chooser in (self.fav_chooser, self.fetched_chooser): try: chooser.destroy() except Exception: pass self.parent.thumbs_manager.hide(force=False) def on_favorites_changed(self, widget=None): self.delayed_apply() if not os.access(self.fav_chooser.get_folder(), os.W_OK): self.ui.error_favorites.set_label(_("No write permissions")) else: self.ui.error_favorites.set_label("") def on_fetched_changed(self, widget=None): self.delayed_apply() if not os.access(self.fetched_chooser.get_folder(), os.W_OK): self.ui.error_fetched.set_label(_("No write permissions")) else: self.ui.error_fetched.set_label("") def update_clipboard_state(self, widget=None): self.ui.clipboard_use_whitelist.set_sensitive(self.ui.clipboard_enabled.get_active()) # keep the hosts list always enabled - user can wish to add hosts even when monitoring is not enabled - if undesired, uncomment below: # self.ui.clipboard_hosts.set_sensitive(self.ui.clipboard_enabled.get_active() and self.ui.clipboard_use_whitelist.get_active()) def on_edit_favorites_operations_clicked(self, widget=None): self.dialog = EditFavoriteOperationsDialog() self.dialog.set_transient_for(self) buf = self.dialog.ui.textbuffer buf.set_text("\n".join(":".join(x) for x in self.favorites_operations)) if self.dialog.run() == Gtk.ResponseType.OK: text = buf.get_text(buf.get_start_iter(), buf.get_end_iter(), False) self.favorites_operations = list([x.strip().split(":") for x in text.split("\n") if x]) self.delayed_apply() self.dialog.destroy() self.dialog = None def on_icon_changed(self, widget=None): self.ui.icon_chooser.set_visible(self.ui.icon.get_active() == 7) def on_favorites_operations_changed(self, widget=None): self.ui.edit_favorites_operations.set_visible( self.ui.favorites_operations.get_active() == 3 ) def on_copyto_enabled_toggled(self, widget=None): self.copyto_chooser.set_sensitive(self.ui.copyto_enabled.get_active()) self.ui.copyto_use_default.set_sensitive(self.ui.copyto_enabled.get_active()) self.on_copyto_changed() def on_copyto_changed(self): self.ui.copyto_faq_link.set_sensitive(self.ui.copyto_enabled.get_active()) if self.ui.copyto_enabled.get_active() and self.copyto_chooser.get_folder(): folder = self.copyto_chooser.get_folder() self.ui.copyto_use_default.set_sensitive( folder != self.parent.get_actual_copyto_folder("Default") ) under_encrypted = Util.is_home_encrypted() and folder.startswith( os.path.expanduser("~") + "/" ) self.ui.copyto_encrypted_note.set_visible(under_encrypted) can_write = os.access(self.parent.get_actual_copyto_folder(folder), os.W_OK) can_read = os.stat(folder).st_mode | stat.S_IROTH self.ui.copyto_faq_link.set_visible(can_write and can_read and not under_encrypted) self.ui.copyto_permissions_box.set_visible(not can_write or not can_read) self.ui.copyto_write_permissions_warning.set_visible(not can_write) self.ui.copyto_read_permissions_warning.set_visible(not can_read) else: self.ui.copyto_faq_link.set_visible(True) self.ui.copyto_encrypted_note.set_visible(False) self.ui.copyto_permissions_box.set_visible(False) self.delayed_apply() def on_copyto_use_default_clicked(self, widget=None): self.copyto_chooser.set_folder(self.parent.get_actual_copyto_folder("Default")) self.on_copyto_changed() def on_copyto_fix_permissions_clicked(self, widget=None): folder = self.copyto_chooser.get_folder() can_write = os.access(self.parent.get_actual_copyto_folder(folder), os.W_OK) can_read = os.stat(folder).st_mode | stat.S_IROTH mode = "a+" if not can_read: mode += "r" if not can_write: mode += "w" try: Util.superuser_exec("chmod", mode, folder) except Exception: logger.exception(lambda: "Could not adjust copyto folder permissions") self.parent.show_notification( _("Could not adjust permissions"), _('You may try manually running this command:\nsudo chmod %s "%s"') % (mode, folder), ) self.on_copyto_changed() def on_btn_slideshow_reset_clicked(self, widget=None): self.ui.slideshow_seconds.set_value(6) self.ui.slideshow_fade.set_value(0.4) self.ui.slideshow_zoom.set_value(0.2) self.ui.slideshow_pan.set_value(0.05) def on_btn_slideshow_start_clicked(self, widget=None): self.apply() self.parent.on_start_slideshow() variety-0.8.13/variety/PrivacyNoticeDialog.py000066400000000000000000000036241475753071700212470ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE from gi.repository import Gtk # pylint: disable=E0611 from variety_lib.helpers import get_builder class PrivacyNoticeDialog(Gtk.Dialog): __gtype_name__ = "PrivacyNoticeDialog" def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated PrivacyNoticeDialog object. """ builder = get_builder('PrivacyNoticeDialog') new_object = builder.get_object('PrivacyNoticeDialog') new_object.finish_initializing(builder) return new_object def finish_initializing(self, builder): """Called when we're finished initializing. finish_initalizing should be called after parsing the ui definition and creating a PrivacyNoticeDialog object with it in order to finish initializing the start of the new PrivacyNoticeDialog instance. """ # Get a reference to the builder and set up the signals. self.builder = builder self.ui = builder.get_ui(self) if __name__ == "__main__": dialog = PrivacyNoticeDialog() dialog.show() Gtk.main() variety-0.8.13/variety/QuoteWriter.py000066400000000000000000000141741475753071700176440ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import threading import cairo from PIL import Image from variety.Util import Util # fmt: off import gi # isort:skip gi.require_version("PangoCairo", "1.0") from gi.repository import Gdk, GdkPixbuf, GObject, Pango, PangoCairo # isort:skip # fmt: on class QuoteWriter: @staticmethod def write_quote(quote, author, infile, outfile, options=None): done_event = threading.Event() exception = [None] def go(): try: w, h = Util.get_scaled_size(infile) surface = QuoteWriter.load_cairo_surface(infile, w, h) QuoteWriter.write_quote_on_surface(surface, quote, author, options) QuoteWriter.save_cairo_surface(surface, outfile) except Exception as e: exception[0] = e finally: done_event.set() Util.add_mainloop_task(go) done_event.wait() if exception[0]: raise exception[0] # pylint: disable=raising-bad-type @staticmethod def load_cairo_surface(filename, w, h): # pylint: disable=no-member pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename, w, h, False) surface = cairo.ImageSurface(0, pixbuf.get_width(), pixbuf.get_height()) context = cairo.Context(surface) Gdk.cairo_set_source_pixbuf(context, pixbuf, 0, 0) context.paint() return surface @staticmethod def save_cairo_surface(surface, filename): try: # attempt faster method first # the get_data() call will fail with Cairo version < 1.15.4-1 (e.g. on 16.04) # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=809479 data = surface.get_data() size = surface.get_width(), surface.get_height() image = Image.frombuffer("RGBA", size, data.tobytes(), "raw", "BGRA", 0, 1).convert( "RGB" ) image.save(filename, quality=100) except: # fallback to slower method, but which works on 16.04 surface.write_to_png(filename) @staticmethod def write_quote_on_surface(surface, quote, author=None, options=None, margin=30): qcontext = cairo.Context(surface) # pylint: disable=no-member acontext = cairo.Context(surface) # pylint: disable=no-member iw = surface.get_width() ih = surface.get_height() sw, sh = Util.get_primary_display_size(hidpi_scaled=True) trimw, trimh = Util.compute_trimmed_offsets((iw, ih), (sw, sh)) width = max( 200, sw * options.quotes_width // 100 ) # use quotes_width percent of the visible width qlayout = PangoCairo.create_layout(qcontext) qlayout.set_width((width - 4 * margin) * Pango.SCALE) qlayout.set_alignment(Pango.Alignment.LEFT) qlayout.set_wrap(Pango.WrapMode.WORD) font = options.quotes_font if options else "Serif 30" qlayout.set_font_description(Pango.FontDescription(font)) qlayout.set_text(quote, -1) qheight = qlayout.get_pixel_size()[1] qwidth = qlayout.get_pixel_size()[0] if options.quotes_width < 98: width = qwidth + 4 * margin else: width = sw alayout = PangoCairo.create_layout(acontext) aheight = 0 if author: alayout.set_width(qwidth * Pango.SCALE) alayout.set_alignment(Pango.Alignment.RIGHT) alayout.set_wrap(Pango.WrapMode.WORD) alayout.set_font_description(Pango.FontDescription(font)) alayout.set_text(author, -1) aheight = alayout.get_pixel_size()[1] height = qheight + aheight + 2.5 * margin bgc = options.quotes_bg_color qcontext.set_source_rgba( bgc[0] / 255.0, bgc[1] / 255.0, bgc[2] / 255.0, options.quotes_bg_opacity / 100.0 ) # gray semi-transparent background hpos = trimw + (sw - width) * options.quotes_hpos // 100 vpos = trimh + (sh - height) * options.quotes_vpos // 100 qcontext.rectangle(hpos, vpos, width, height) qcontext.fill() qcontext.translate(hpos + (width - qwidth) / 2, vpos + margin) if options.quotes_text_shadow: qcontext.set_source_rgba(0, 0, 0, 0.2) PangoCairo.update_layout(qcontext, qlayout) PangoCairo.show_layout(qcontext, qlayout) qcontext.translate(-2, -2) tc = options.quotes_text_color qcontext.set_source_rgb(tc[0] / 255.0, tc[1] / 255.0, tc[2] / 255.0) PangoCairo.update_layout(qcontext, qlayout) PangoCairo.show_layout(qcontext, qlayout) acontext.translate(hpos + (width - qwidth) / 2, vpos + margin + qheight + margin / 2) if options.quotes_text_shadow: acontext.set_source_rgba(0, 0, 0, 0.2) PangoCairo.update_layout(acontext, alayout) PangoCairo.show_layout(acontext, alayout) acontext.translate(-2, -2) acontext.set_source_rgb(tc[0] / 255.0, tc[1] / 255.0, tc[2] / 255.0) PangoCairo.update_layout(acontext, alayout) PangoCairo.show_layout(acontext, alayout) qcontext.show_page() acontext.show_page() if __name__ == "__main__": QuoteWriter.write_quote( '"I may be drunk, Miss, but in the morning I will be sober and you will still be ugly."', "Winston Churchill", "test.jpg", "test_result.png", ) variety-0.8.13/variety/QuotesEngine.py000066400000000000000000000263421475753071700177600ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random import threading import time from variety.plugins.IQuoteSource import IQuoteSource from variety.Util import _ logger = logging.getLogger("variety") class QuotesEngine: def __init__(self, parent=None): self.parent = parent self.quote = None self.started = False self.running = False self.used = [] def update_plugins(self): for p in self.parent.jumble.get_plugins(IQuoteSource): name = p["info"]["name"] if name in self.parent.options.quotes_disabled_sources: try: p["plugin"].deactivate() except Exception: logger.exception(lambda: "Error deactivating %s" % name) else: try: p["plugin"].activate() except Exception: logger.exception(lambda: "Error activating %s" % name) self.plugins = self.parent.jumble.get_plugins(IQuoteSource, active=True) def stop(self): self.running = False self.started = False self.update_plugins() def start(self): if self.started or not self.parent.options.quotes_enabled: return logger.info(lambda: "Starting QuotesEngine") self.update_plugins() self.prepared = [] self.position = 0 self.prepared_lock = threading.Lock() self.prepare_event = threading.Event() self.change_event = threading.Event() self.cache = {} self.started = True self.running = True self.last_change_time = time.time() self.last_error_notification_time = 0 prep_thread = threading.Thread(target=self.prepare_thread) prep_thread.daemon = True prep_thread.start() change_thread = threading.Thread(target=self.regular_change_thread) change_thread.daemon = True change_thread.start() def quit(self): self.running = False self.prepare_event.set() def get_quote(self): return self.quote def has_previous(self): return self.position < len(self.used) - 1 def prev_quote(self): self.last_change_time = time.time() self.position += 1 if self.position >= len(self.used): if self.used: self.quote = self.choose_some_quote() self.used.append(self.quote) else: self.quote = self.used[self.position] return self.quote def bypass_history(self): self.position = 0 def next_quote(self, bypass_history=False): self.last_change_time = time.time() if self.position > 0 and not bypass_history: self.position -= 1 if self.position < len(self.used) - 1: self.quote = self.used[self.position] return self.quote else: if bypass_history: self.bypass_history() return self.change_quote() def choose_some_quote(self): with self.prepared_lock: if [x for x in self.prepared if x != self.quote]: self.quote = random.choice([x for x in self.prepared if x != self.quote]) elif [x for x in self.used if x != self.quote]: self.quote = random.choice([x for x in self.used if x != self.quote]) elif self.prepared: self.quote = random.choice(self.prepared) elif self.used: self.quote = random.choice(self.used) if self.quote in self.prepared: self.prepared.remove(self.quote) self.prepare_event.set() return self.quote def change_quote(self): self.last_change_time = time.time() self.choose_some_quote() self.used = self.used[self.position :] self.position = 0 if self.quote: self.used.insert(0, self.quote) if len(self.used) > 200: self.used = self.used[:200] return self.quote def on_options_updated(self, clear_prepared=True): if clear_prepared: logger.info(lambda: "Quotes: clearing prepared and updating plugins") with self.prepared_lock: self.prepared = [] self.update_plugins() self.prepare_event.set() self.change_event.set() def regular_change_thread(self): logger.info(lambda: "Quotes regular change thread running") while self.running: try: while ( not self.parent.options.quotes_change_enabled or (time.time() - self.last_change_time) < self.parent.options.quotes_change_interval ): if not self.running: return now = time.time() wait_more = self.parent.options.quotes_change_interval - max( 0, (now - self.last_change_time) ) if self.parent.options.quotes_change_enabled: self.change_event.wait(max(0, wait_more)) else: self.change_event.wait() self.change_event.clear() if not self.running: return if not self.parent.options.quotes_change_enabled: continue logger.info(lambda: "Quotes regular_change changes quote") self.last_change_time = time.time() self.parent.quote = self.change_quote() self.parent.refresh_texts() except Exception: logger.exception(lambda: "Exception in regular_change_thread") def prepare_thread(self): logger.info(lambda: "Quotes prepare thread running") while self.running: try: while ( self.running and self.parent.options.quotes_enabled and len(self.prepared) < 10 ): logger.info( lambda: "Quotes prepared buffer contains %s quotes, fetching a quote" % len(self.prepared) ) quote = self.get_one_quote() if quote: with self.prepared_lock: self.prepared.append(quote) if self.parent.options.quotes_enabled and self.parent.quote is None: self.parent.quote = self.change_quote() self.parent.refresh_texts() time.sleep(2) if not self.running: return except Exception: logger.exception(lambda: "Error in quotes prepare thread:") self.prepare_event.wait() self.prepare_event.clear() def get_one_quote(self): keywords = [] if self.parent.options.quotes_tags.strip(): keywords = self.parent.options.quotes_tags.split(",") authors = [] if self.parent.options.quotes_authors.strip(): authors = self.parent.options.quotes_authors.split(",") category, search = ("random", "") if keywords or authors: category, search = random.choice( [("keyword", k) for k in keywords] + [("author", a) for a in authors] ) plugins = list(self.plugins) if not self.parent.options.internet_enabled: plugins = [p for p in plugins if not p["plugin"].needs_internet()] if keywords or authors: plugins = [p for p in plugins if p["plugin"].supports_search()] if not plugins: self.parent.show_notification( _("No suitable quote plugins"), _( "There are no quote plugins installed, " "enabled and applicable for the current settings" ), ) raise Exception("No quote plugins") error_plugins = [] count_plugins = len(plugins) while self.running and self.parent.options.quotes_enabled: if not plugins: if ( time.time() - self.last_error_notification_time > 3600 and len(self.prepared) + len(self.used) < 5 ): self.last_error_notification_time = time.time() if len(error_plugins) == count_plugins: self.parent.show_notification( _("Could not fetch quotes"), _("Quotes services may be down, we will continue trying"), ) else: self.parent.show_notification( _("Could not find quotes"), _("Maybe you are searching for something very obscure?"), ) return None plugin = random.choice(plugins) plugin_name = plugin["info"]["name"] self.cache.setdefault(plugin_name, {"random": {}, "keyword": {}, "author": {}}) self.cache[plugin_name][category].setdefault(search, {}) cached = self.cache[plugin_name][category][search] if not cached: try: if category == "random": quotes = plugin["plugin"].get_random() elif category == "keyword": quotes = plugin["plugin"].get_for_keyword(search) elif category == "author": quotes = plugin["plugin"].get_for_author(search) else: raise RuntimeError("Unknown category") if quotes: for q in quotes: if len(q["quote"]) < self.parent.options.quotes_max_length: cached[q["quote"]] = q except Exception: logger.exception(lambda: "Exception in quote plugin") plugins.remove(plugin) error_plugins.append(plugin) continue if not cached: logger.warning(lambda: "No quotes for '%s' for plugin %s" % (search, plugin_name)) plugins.remove(plugin) continue quote = random.choice(list(cached.values())) del cached[quote["quote"]] if not cached: del cached return quote variety-0.8.13/variety/Texts.py000066400000000000000000000110771475753071700164600ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE from variety.profile import get_profile_path from variety.Util import _ FILTERS = { "Keep original": _("Keep original"), "Grayscale": _("Grayscale"), "Heavy blur": _("Heavy blur"), "Soft blur": _("Soft blur"), "Oil painting": _("Oil painting"), "Pointilism": _("Pointilism"), "Pixellate": _("Pixellate"), } SOURCES = { "favorites": ("The Favorites folder", _("The Favorites folder")), "fetched": ("The Fetched folder", _("The Fetched folder")), "recommended": ( "Recommended by Variety. Adapts to your taste as you mark images as favorite or trash.", _("Recommended by Variety. Adapts to your taste as you mark images as favorite or trash."), ), "latest": ( "Latest favorites by the other users of Variety. [May contain NSFW images]", _("Latest favorites by the other users of Variety. [May contain NSFW images]"), ), "desktoppr": ("Random wallpapers from Desktoppr.co", _("Random wallpapers from Desktoppr.co")), "apod": ("NASA's Astronomy Picture of the Day", _("NASA's Astronomy Picture of the Day")), "bing": ("Bing Photo of the Day", _("Bing Photo of the Day")), "unsplash": ( "High-resolution photos from Unsplash.com", _("High-resolution photos from Unsplash.com"), ), } profile_path = get_profile_path(expanded=False) TIPS = [ _( "You can change the wallpaper back and forth by scrolling the mouse wheel on top of the indicator icon." ), _( "You can configure how the wallpaper scales, zooms or tiles directly from the Appearance/Background settings in your OS. " "Variety sets which image to show, but does not tell the OS how to draw it." ), _( "If you want to run custom commands every time the wallpaper changes or if you use an alternative desktop environment, please edit the scripts in {PROFILE_PATH}scripts. There are examples there for various desktop environments." ), _( 'Variety can be controlled from the command line and you can use this to define keyboard shortcuts for the operations you use most often. Run "variety --help" to see all available commands.' ), _( 'You can drop image links or files on the launcher icon to download them and use them as wallpapers. For quicker downloading from a specific site, you can also use clipboard monitoring (see "Downloading" tab).' ), _( "Applying a heavy blurring filter is a great way to get abstract-looking and unobtrusive, yet colorful wallpapers, similar in spirit to the default one in Ubuntu." ), _( "Adding your own custom filters is quite easy: open {PROFILE_PATH}variety.conf in an editor and use the existing filters as an example. Every filter is just a line of options to be passed to ImageMagick's convert command." ), _( 'When you select an image source, its images are displayed in a window at the bottom of the screen. Click an image there to set is as wallpaper. Right-click to close the window, to modify its appearance or to perform file operations. You can select multiple image sources to create a "merged" thumbnail view of all of them. Please mind that thumbnail view is limited to several hundred randomly selected images.' ), _( 'Variety\'s indicator icon is themeable - if you choose the "Light" option for the icon, Variety will first check if the current GTK theme has an icon named "variety-indicator" and will use it instead of the bundled light icon.' ), _( "When you choose to save quotes to Favorites, these are by default saved to {PROFILE_PATH}favorite_quotes.txt. This file is compatible with Variety's local files quote source. If you want to use it - copy it to ~/.config/variety/pluginconfig/quotes/ and enable the Local Files quote source. This file is also compatible with the Unix fortune utility." ), ] variety-0.8.13/variety/ThumbsManager.py000066400000000000000000000375341475753071700201140ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import os import threading import webbrowser from gi.repository import Gdk, GdkPixbuf, GObject, Gtk from configobj import ConfigObj from variety.ThumbsWindow import ThumbsWindow from variety.Util import Util, _ from variety_lib import varietyconfig logger = logging.getLogger("variety") class ThumbsManager: POSITIONS = { "bottom": ThumbsWindow.BOTTOM, "top": ThumbsWindow.TOP, "left": ThumbsWindow.LEFT, "right": ThumbsWindow.RIGHT, } POSITION_NAMES = { "bottom": _("Bottom"), "top": _("Top"), "left": _("Left"), "right": _("Right"), } R_POSITIONS = {v: k for (k, v) in POSITIONS.items()} SIZES = [x * 30 for x in range(2, 11)] UNLIMITED = "Unlimited" LIMITS = [10, 50, 100, 200, 500, 1000, 2000, UNLIMITED] class Options: def __init__(self): self.position = ThumbsWindow.BOTTOM self.breadth = 120 self.limit = 200 def __init__(self, parent): self.parent = parent self.thumbs_window = None self.show_thumbs_lock = threading.Lock() self.pinned = False self.images = [] self.screen = None self.type = None self.folders = None self.active_file = None self.active_position = None def create_menu(self, file): options = self.load_options() menu = Gtk.Menu() position_menu = Gtk.Menu() for p, v in ThumbsManager.POSITIONS.items(): item = Gtk.CheckMenuItem(ThumbsManager.POSITION_NAMES[p]) item.set_draw_as_radio(True) item.set_active(options.position == v) def _set_position(widget, pos=p): self.set_position(pos) item.connect("activate", _set_position) position_menu.append(item) size_menu = Gtk.Menu() for size in ThumbsManager.SIZES: item = Gtk.CheckMenuItem(str(size)) item.set_draw_as_radio(True) item.set_active(options.breadth == size) def _set_size(widget, size=size): self.set_size(size) item.connect("activate", _set_size) size_menu.append(item) limit_menu = Gtk.Menu() for limit in ThumbsManager.LIMITS: item = Gtk.CheckMenuItem(str(limit)) item.set_draw_as_radio(True) item.set_active(options.limit == limit) def _set_limit(widget, limit=limit): self.set_limit(limit) item.connect("activate", _set_limit) limit_menu.append(item) position_item = Gtk.MenuItem(_("Position")) position_item.set_submenu(position_menu) menu.append(position_item) size_item = Gtk.MenuItem(_("Size")) size_item.set_submenu(size_menu) menu.append(size_item) limit_item = Gtk.MenuItem(_("Maximum Shown Images")) limit_item.set_submenu(limit_menu) menu.append(limit_item) menu.append(Gtk.SeparatorMenuItem.new()) open_file = Gtk.MenuItem(os.path.basename(file).replace("_", "__")) def _open_file(widget): self.parent.open_file(widget, file) open_file.connect("activate", _open_file) menu.append(open_file) open_folder = Gtk.MenuItem(_("Show Containing Folder")) def _open_folder(widget): self.parent.open_folder(widget, file) open_folder.connect("activate", _open_folder) menu.append(open_folder) info = Util.read_metadata(file) if info and "sourceURL" in info and "sourceName" in info: url = info["sourceURL"] source_name = info["sourceName"] if "Fetched" in source_name: label = _("Fetched: Show Origin") else: label = _("View at %s") % source_name if len(label) > 50: label = label[:50] + "..." show_origin = Gtk.MenuItem(label) def _show_origin(widget=None): logger.info(lambda: "Opening url: " + url) webbrowser.open_new_tab(url) show_origin.connect("activate", _show_origin) menu.append(show_origin) menu.append(Gtk.SeparatorMenuItem.new()) rating_item = Gtk.MenuItem(_("Set EXIF Rating")) rating_item.set_submenu(ThumbsManager.create_rating_menu(file, self.parent)) if not os.access(file, os.W_OK): rating_item.set_sensitive(False) menu.append(rating_item) menu.append(Gtk.SeparatorMenuItem.new()) self.copy_to_favorites = Gtk.MenuItem(_("Copy to _Favorites")) self.copy_to_favorites.set_use_underline(True) def _copy_to_favorites(widget): self.parent.copy_to_favorites(widget, file) self.copy_to_favorites.connect("activate", _copy_to_favorites) menu.append(self.copy_to_favorites) self.move_to_favorites = Gtk.MenuItem(_("Move to _Favorites")) self.move_to_favorites.set_use_underline(True) def _move_to_favorites(widget): self.parent.move_to_favorites(widget, file) self.remove_image(file) self.move_to_favorites.connect("activate", _move_to_favorites) self.move_to_favorites.set_visible(False) menu.append(self.move_to_favorites) trash_item = Gtk.MenuItem(_("Delete to _Trash")) trash_item.set_use_underline(True) def _trash(widget): self.parent.move_to_trash(widget, file) trash_item.connect("activate", _trash) menu.append(trash_item) focus = Gtk.MenuItem(_("Where is it from?")) focus.set_sensitive(self.parent.get_source(file) is not None) def _focus(widget): self.parent.focus_in_preferences(widget, file) focus.connect("activate", _focus) menu.append(focus) menu.append(Gtk.SeparatorMenuItem.new()) def close(widget): self.hide(force=True) close_item = Gtk.MenuItem(_("Close")) close_item.connect("activate", close) menu.append(close_item) menu.show_all() favs_op = self.parent.determine_favorites_operation(file) self.parent.update_favorites_menuitems(self, False, favs_op) return menu @staticmethod def create_rating_menu(file, main_window): def _set_rating_maker(rating): def _set_rating(widget, rating=rating): try: Util.set_rating(file, rating) main_window.on_rating_changed(file) except Exception: logger.exception(lambda: "Could not set EXIF rating") main_window.show_notification(_("Could not set EXIF rating")) return _set_rating try: actual_rating = Util.get_rating(file) except Exception: actual_rating = None rating_menu = Gtk.Menu() for rating in range(5, 0, -1): item = Gtk.CheckMenuItem("\u2605" * rating) item.set_draw_as_radio(True) item.set_active(actual_rating == rating) item.set_sensitive(not item.get_active()) item.connect("activate", _set_rating_maker(rating)) rating_menu.append(item) rating_menu.append(Gtk.SeparatorMenuItem.new()) unrated_item = Gtk.CheckMenuItem(_("Unrated")) unrated_item.set_draw_as_radio(True) unrated_item.set_active(actual_rating is None or actual_rating == 0) unrated_item.set_sensitive(not unrated_item.get_active()) unrated_item.connect("activate", _set_rating_maker(None)) rating_menu.append(unrated_item) rejected_item = Gtk.CheckMenuItem(_("Rejected")) rejected_item.set_draw_as_radio(True) rejected_item.set_active(actual_rating is not None and actual_rating < 0) rejected_item.set_sensitive(not rejected_item.get_active()) rejected_item.connect("activate", _set_rating_maker(-1)) rating_menu.append(rejected_item) rating_menu.show_all() return rating_menu def repaint(self): self.hide(keep_settings=True) if self.images: self.show( self.unlimited_images, screen=self.screen, type=self.type, folders=self.folders ) def set_position(self, position): logger.info(lambda: "Setting thumbs position " + str(position)) options = self.load_options() options.position = ThumbsManager.POSITIONS[position] self.save_options(options) self.repaint() def set_size(self, size): logger.info(lambda: "Setting thumbs size " + str(size)) options = self.load_options() options.breadth = size self.save_options(options) self.repaint() def set_limit(self, limit): logger.info(lambda: "Setting thumbs limit " + str(limit)) options = self.load_options() options.limit = limit self.save_options(options) self.repaint() def pin(self, widget=None): self.pinned = True def on_click(self, thumbs_window, file, widget, event): file = file self.pin() def _resume_scrolling(menu=None): thumbs_window.resume_scrolling() thumbs_window.pause_scrolling() if event.button == 1: if self.is_showing("history"): index = [info["eventbox"] for info in thumbs_window.all].index(widget) self.parent.move_to_history_position(index) else: self.parent.set_wallpaper(file) _resume_scrolling() else: menu = self.create_menu(file) def _compute_position(*args, **kwargs): x, y = event.get_root_coords()[0], event.get_root_coords()[1] h = menu.get_preferred_height()[1] return x, y - h if y - h >= 40 else y, True menu.connect("deactivate", _resume_scrolling) menu.popup(None, None, _compute_position, None, 0, event.time) def mark_active(self, file=None, position=None): self.active_file = file self.active_position = position if self.thumbs_window: if self.is_showing("history"): self.thumbs_window.mark_active(position=position) else: self.thumbs_window.mark_active(file=file) def show(self, images, screen=None, type=None, folders=None): options = self.load_options() with self.show_thumbs_lock: self.unlimited_images = images self.type = type limit = len(self.unlimited_images) if options.limit == self.UNLIMITED else options.limit self.images = self.unlimited_images[:limit] self.screen = screen self.folders = folders def _go(): try: if self.thumbs_window: self.thumbs_window.destroy() self.thumbs_window = None if len(self.images) > 0: self.initialize_thumbs_window() except Exception: logger.exception(lambda: "Could not create thumbs window:") Util.add_mainloop_task(_go) def initialize_thumbs_window(self): options = self.load_options() def _go(): self.thumbs_window = ThumbsWindow( screen=self.screen, position=options.position, breadth=options.breadth ) try: icon = varietyconfig.get_data_file("media", "variety.svg") self.thumbs_window.set_icon_from_file(icon) except Exception: logger.exception(lambda: "Could not set thumbs window icon") if self.type == "history": title = _("Variety History") elif self.type == "downloads": title = _("Variety Recent Downloads") else: title = _("Variety Images") self.thumbs_window.set_title(title) self.thumbs_window.connect("clicked", self.on_click) def _on_close(window, event): self.hide(force=True) self.thumbs_window.connect("delete-event", _on_close) self.mark_active(self.active_file, self.active_position) self.thumbs_window.start(self.images) Util.add_mainloop_task(_go) def load_options(self): options = ThumbsManager.Options() try: config = ConfigObj(os.path.join(self.parent.config_folder, "ui.conf")) try: s = config["thumbs_position"].lower() options.position = ThumbsManager.POSITIONS[s] except Exception: logger.exception(lambda: "Missing or bad thumbs_position option in ui.conf") try: options.breadth = int(config["thumbs_size"]) except Exception: logger.exception(lambda: "Missing or bad thumbs_size option in ui.conf") try: options.limit = ( int(config["thumbs_limit"]) if config["thumbs_limit"] != self.UNLIMITED else self.UNLIMITED ) except Exception: logger.exception(lambda: "Missing or bad thumbs_limit option in ui.conf") except Exception: logger.exception(lambda: "Could not read ui.conf") self.save_options(options) return options def save_options(self, options): try: config = ConfigObj(os.path.join(self.parent.config_folder, "ui.conf")) try: config["thumbs_position"] = ThumbsManager.R_POSITIONS[options.position] config["thumbs_size"] = options.breadth config["thumbs_limit"] = str(options.limit) config.write() except Exception: logger.exception(lambda: "Missing or bad thumbs_position option in ui.conf") except Exception: logger.exception(lambda: "Could not save ui.conf") def hide(self, force=True, keep_settings=False): if force: self.pinned = False if self.pinned: return if not keep_settings: self.type = None self.images = [] self.screen = None self.folders = None if self.thumbs_window: def _go(): self.thumbs_window.destroy() self.thumbs_window = None Util.add_mainloop_task(_go) self.parent.update_indicator(auto_changed=False) def remove_image(self, file): self.images = [f for f in self.images if f != file] if self.thumbs_window: if self.thumbs_window.fits_in_screen(+1000): self.repaint() else: self.thumbs_window.remove_image(file) def add_image(self, file): self.images.insert(0, file) if not self.thumbs_window: self.initialize_thumbs_window() else: self.thumbs_window.add_image(file, at_front=True) def is_showing(self, type): return self.type == type def get_folders(self): return self.folders variety-0.8.13/variety/ThumbsWindow.py000066400000000000000000000371541475753071700200070ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import os import threading import time from gi.repository import Gdk, GdkPixbuf, GObject, Gtk from variety.profile import get_profile_wm_class from variety.Util import Util, on_gtk logger = logging.getLogger("variety") class ThumbsWindow(Gtk.Window): __gsignals__ = {"clicked": (GObject.SIGNAL_RUN_FIRST, None, (str, Gtk.Widget, object))} LEFT = 1 RIGHT = 2 BOTTOM = 3 TOP = 4 def __init__(self, screen=None, position=BOTTOM, breadth=120): logger.debug(lambda: "Creating thumb window %s, %d" % (str(self), time.time())) super(ThumbsWindow, self).__init__() self.set_wmclass(get_profile_wm_class(), get_profile_wm_class()) self.running = True self.set_decorated(False) self.set_accept_focus(False) self.screen = screen if screen else Gdk.Screen.get_default() self.monitor_area = self.screen.get_monitor_workarea(self.screen.get_primary_monitor()) self.position = position self.breadth = int( breadth * ( 1 if self.is_horizontal() else float(self.monitor_area.width) / self.monitor_area.height ) ) self.box = Gtk.HBox(False, 0) if self.is_horizontal() else Gtk.VBox(False, 0) self.scroll = Gtk.ScrolledWindow() self.scroll.add_with_viewport(self.box) if self.is_horizontal(): self.scroll.set_min_content_height(self.breadth) self.scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.NEVER) else: self.scroll.set_min_content_width(self.breadth) self.scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) self.mouse_in = False self.mouse_position = None self.autoscroll_event = threading.Event() self.scrolling_paused = False self.scrolling_locked = False def mouse_enter(widget, event, data=None): self.mouse_in = True self.previous_speed = 0 self.autoscroll_event.set() def mouse_motion(widget, event, data=None): self.mouse_position = (event.x, event.y) if not self.scrolling_locked: self.scrolling_paused = False def mouse_leave(widget, event, data=None): self.mouse_in = False self.mouse_position = None self.previous_speed = 0 self.autoscroll_event.clear() eventbox = Gtk.EventBox() eventbox.set_visible(True) eventbox.add(self.scroll) eventbox.set_events( Gdk.EventMask.ENTER_NOTIFY_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK | Gdk.EventMask.POINTER_MOTION_MASK ) eventbox.connect("enter-notify-event", mouse_enter) eventbox.connect("leave-notify-event", mouse_leave) eventbox.connect("motion-notify-event", mouse_motion) self.add(eventbox) self.image_count = 0 self.active_file = None self.active_position = None self.mark = None self.marked_info = None self.all = [] def pause_scrolling(self): self.previous_speed = 0 self.scrolling_paused = True self.scrolling_locked = True def resume_scrolling(self): self.scrolling_locked = False def is_horizontal(self): return self.position == ThumbsWindow.TOP or self.position == ThumbsWindow.BOTTOM def pin(self, widget=None): self.pinned = True @on_gtk def start(self, images): self.images = images self._show() thumbs_thread = threading.Thread(target=self._thumbs_thread) thumbs_thread.daemon = True thumbs_thread.start() autoscroll_thread = threading.Thread(target=self._autoscroll_thread) autoscroll_thread.daemon = True autoscroll_thread.start() def _calc_start_position(self): area = self.monitor_area if self.position == ThumbsWindow.BOTTOM: return area.x + area.width // 2, area.y + area.height - self.breadth elif self.position == ThumbsWindow.TOP: return area.x + area.width // 2, area.y elif self.position == ThumbsWindow.LEFT: return area.x, area.y + area.height // 2 elif self.position == ThumbsWindow.RIGHT: return area.x + area.width - self.breadth, area.height // 2 else: raise Exception("Unsupported thumbs position: " + str(self.position)) def _show(self): self.set_default_size(1, 1) logger.debug(lambda: "Showing thumb window %s, %d" % (str(self), time.time())) self.move(*self._calc_start_position()) self.show_all() def _thumbs_thread(self): logger.debug(lambda: "Starting thumb thread %s, %d" % (str(self), time.time())) try: self.total_width = 0 for i, file in enumerate(self.images): if not self.running: Util.add_mainloop_task(self.destroy) return self.add_image(file, at_front=False) self.image_count = i except Exception: logger.exception(lambda: "Error while creating thumbs:") def add_image(self, file, at_front=False): try: if self.is_horizontal(): pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(file, 10000, self.breadth) else: pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(file, self.breadth, 10000) except Exception: logger.warning( lambda: "Could not create thumbnail for file %s. File may be missing or invalid." % file ) pixbuf = None def _go(): image_size = ( 0 if not pixbuf else pixbuf.get_width() if self.is_horizontal() else pixbuf.get_height() ) thumb = Gtk.Image() if pixbuf: thumb.set_from_pixbuf(pixbuf) thumb.set_visible(True) overlay = Gtk.Overlay() overlay.add(thumb) overlay.set_visible(True) eventbox = Gtk.EventBox() eventbox.set_visible(True) def click(widget, event, file=file): self.emit("clicked", file, widget, event) eventbox.connect("button-release-event", click) eventbox.add(overlay) image_info = { "file": file, "eventbox": eventbox, "thumb": thumb, "size": image_size, "overlay": overlay, } if at_front: image_info["start"] = 0 for info in self.all: info["start"] += image_size self.all.insert(0, image_info) position = 0 else: image_info["start"] = self.total_width self.all.append(image_info) position = len(self.all) - 1 self.total_width += image_size adj = ( self.scroll.get_hadjustment() if self.is_horizontal() else self.scroll.get_vadjustment() ) scrollbar_at_start = not adj or adj.get_value() <= adj.get_lower() + 20 self.box.pack_start(eventbox, False, False, 0) if at_front: self.box.reorder_child(eventbox, 0) # get adj again - we just added at front, scrollbar might have appeared adj = ( self.scroll.get_hadjustment() if self.is_horizontal() else self.scroll.get_vadjustment() ) if adj: if scrollbar_at_start: adj.set_value(adj.get_lower()) else: adj.set_value(adj.get_value() + image_size) self.update_size() if file == self.active_file or position == self.active_position: self.mark_active(self.active_file, self.active_position) Util.add_mainloop_task(_go) def _window_length(self): if self.is_horizontal(): return self.monitor_area.width else: return self.monitor_area.height def _calc_position(self): area = self.monitor_area if self.position == ThumbsWindow.BOTTOM: return ( area.x + max(0, (area.width - self.total_width) // 2), area.y + area.height - self.breadth, ) elif self.position == ThumbsWindow.TOP: return (area.x + max(0, (area.width - self.total_width) // 2), area.y) elif self.position == ThumbsWindow.LEFT: return (area.x, area.y + max(0, (area.height - self.total_width) // 2)) elif self.position == ThumbsWindow.RIGHT: return ( area.x + area.width - self.breadth, area.y + max(0, (area.height - self.total_width) // 2), ) else: raise Exception("Unsupported thumbs position: " + str(self.position)) def update_size(self): if self.total_width < self._window_length() + 1000: self.move(*self._calc_position()) if self.is_horizontal(): self.scroll.set_min_content_width(min(self.total_width, self.monitor_area.width)) else: self.scroll.set_min_content_height(min(self.total_width, self.monitor_area.height)) # TODO this method is buggy when width < screen and scrollbar not shown - a blank space remains @on_gtk def remove_image(self, image): for info in self.all: if info["file"] == image: eventbox = info["eventbox"] thumb = info["thumb"] self.box.remove(eventbox) eventbox.destroy() thumb.destroy() self.total_width -= info["size"] self.update_size() self.all = [info for info in self.all if info["file"] != image] def mark_active(self, file=None, position=None): def _mark(): logger.debug(lambda: "Marking file %s, position %s" % (file, str(position))) self.active_file = file self.active_position = position pos = position if self.active_file: try: pos = [info["file"] for info in self.all].index(self.active_file) except Exception: pass if self.mark: if self.marked_info: self.marked_info["overlay"].remove(self.mark) self.marked_info = None self.mark.destroy() self.mark = None if pos is not None and len(self.all) > pos: self.marked_info = self.all[pos] image_size = self.marked_info["size"] self.mark = Gtk.DrawingArea() if self.is_horizontal(): self.mark.set_size_request(image_size, 5) self.mark.set_valign(Gtk.Align.START) self.mark.set_halign(Gtk.Align.CENTER) else: self.mark.set_size_request(5, image_size) self.mark.set_valign(Gtk.Align.CENTER) self.mark.set_halign(Gtk.Align.START) def _draw_callback(widget, cr): if self.is_horizontal(): cr.rectangle(0, 0, image_size, 5) else: cr.rectangle(0, 0, 5, image_size) cr.set_source_rgba(255.0 / 255, 105.0 / 255, 44.0 / 255) cr.fill() return False self.mark.connect("draw", _draw_callback) self.mark.set_visible(True) self.marked_info["overlay"].add_overlay(self.mark) GObject.idle_add(_mark) def fits_in_screen(self, with_reserve=0): if self.is_horizontal(): return self.total_width < self.monitor_area.width + with_reserve def destroy(self, widget=False): logger.debug(lambda: "Destroying thumb window %s, %d" % (str(self), time.time())) self.running = False self.autoscroll_event.set() super(ThumbsWindow, self).destroy() def autoscroll_step(self, adj, total_size, current): if not adj: return if not hasattr(self, "previous_speed"): self.previous_speed = 0 left_limit = total_size / 5 right_limit = 4 * total_size / 5 if current <= left_limit and adj.get_value() > adj.get_lower(): speed = 30 * (left_limit - current) ** 3 / left_limit**3 if adj.get_value() < adj.get_lower() + 800: speed = speed * (adj.get_value() - adj.get_lower()) / 800 speed = min(speed, self.previous_speed + 0.1) self.previous_speed = speed adj.set_value(max(adj.get_lower(), adj.get_value() - speed)) elif current >= right_limit and adj.get_value() < adj.get_upper(): speed = 30 * (current - right_limit) ** 3 / (total_size - right_limit) ** 3 if adj.get_value() > adj.get_upper() - adj.get_page_size() - 800: speed = speed * (adj.get_upper() - adj.get_page_size() - adj.get_value()) / 800 speed = min(speed, self.previous_speed + 0.1) self.previous_speed = speed adj.set_value(min(adj.get_upper(), adj.get_value() + speed)) def _autoscroll_thread(self): last_update = time.time() while self.running: while not self.mouse_in: if not self.running: return self.autoscroll_event.wait(10) time.sleep(max(0, last_update + 0.005 - time.time())) if not self.mouse_position or self.scrolling_paused: continue x = self.mouse_position[0] y = self.mouse_position[1] def _go(): if self.is_horizontal() and y > 0: self.autoscroll_step( self.scroll.get_hadjustment(), self.scroll.get_min_content_width(), x ) elif not self.is_horizontal() and x > 0: self.autoscroll_step( self.scroll.get_vadjustment(), self.scroll.get_min_content_height(), y ) Util.add_mainloop_task(_go) last_update = time.time() if __name__ == "__main__": images = [] dir = "/usr/share/backgrounds" for f in os.listdir(dir): file = os.path.join(dir, f) if os.path.isfile(file) and file.endswith(".jpg"): images.append(file) print(images) win = ThumbsWindow() win.connect("delete-event", Gtk.main_quit) print("starting") win.start(images) print("gtk main") Gtk.main() variety-0.8.13/variety/Util.py000066400000000000000000000770341475753071700162730ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import base64 import codecs import datetime import functools import gettext import hashlib import json import logging import os import random import re import shutil import string import subprocess import sys import threading import time import urllib.parse from itertools import cycle import bs4 import requests from PIL import Image from variety_lib import get_version # fmt: off import gi # isort:skip gi.require_version("GExiv2", "0.10") gi.require_version("PangoCairo", "1.0") gi.require_version('Gdk', '3.0') from gi.repository import Gdk, GdkPixbuf, GExiv2, Gio, GLib, Pango # isort:skip # fmt: on USER_AGENT = "Variety Wallpaper Changer " + get_version() random.seed() logger = logging.getLogger("variety") gettext.textdomain("variety") def _(text): """Returns the translated form of text.""" if not text or not text.strip(): return text return gettext.gettext(text) def debounce(seconds): """ Decorator that will postpone a functions execution until after wait seconds have elapsed since the last time it was invoked. """ def decorator(fn): def debounced(*args, **kwargs): def call_it(): fn(*args, **kwargs) try: debounced.t.cancel() except (AttributeError): pass debounced.t = threading.Timer(seconds, call_it) debounced.t.start() return debounced return decorator class throttle(object): """ Decorator that prevents a function from being called more than once every time period. Allows for a trailing call. To create a function that cannot be called more than once a minute: @throttle(seconds=1) def my_fun(): pass """ def __init__(self, seconds=0, trailing_call=False): """ seconds - throttle interval in seconds trailing - if True, there will always be a call seconds after the last call """ self.seconds = seconds self.trailing_call = trailing_call self.time_of_last_call = 0 self.timer = None def __call__(self, fn): @functools.wraps(fn) def wrapper(*args, **kwargs): try: self.timer.cancel() except: pass def call_it(): self.time_of_last_call = time.time() return fn(*args, **kwargs) seconds_since_last_call = time.time() - self.time_of_last_call if seconds_since_last_call >= self.seconds: return call_it() elif self.trailing_call: self.timer = threading.Timer(self.seconds - seconds_since_last_call, call_it) self.timer.start() return wrapper def cache(ttl_seconds=100 * 365 * 24 * 3600, debug=False): """ caching decorator with TTL. Keep in mind the cache is per-process. TODO: There is no process for cache invalidation now. Introduce memcached and use it instead. :param ttl_seconds: TTL in seconds before the cache entry expires :param debug: use True to log cache hits (with DEBUG level) """ def decorate(f): _cache = {} @functools.wraps(f) def decorated(*args): cached = _cache.get(args) if not cached or cached["timestamp"] < datetime.datetime.now() - datetime.timedelta( seconds=ttl_seconds ): cached = {"timestamp": datetime.datetime.now(), "result": f(*args)} _cache[args] = cached elif debug: logger.debug(lambda: "@cache hit for %s" % str(args)) return cached["result"] return decorated return decorate class VarietyMetadata(GExiv2.Metadata): MULTIPLES = { "Iptc.Application2.Headline", "Iptc.Application2.Keywords", "Xmp.dc.creator", "Xmp.dc.subject", } NUMBERS = { "Xmp.variety.sfwRating", "Xmp.xmp.Rating", "Exif.Image.Rating", "Exif.Image.RatingPercent", } def __init__(self, path): super(VarietyMetadata, self).__init__(path=path) self.register_xmp_namespace("https://launchpad.net/variety/", "variety") def __getitem__(self, key): if self.has_tag(key): if key in self.MULTIPLES: return self.get_tag_multiple(key) elif key in self.NUMBERS: return self.get_tag_long(key) else: return self.get_tag_string(key) else: raise KeyError("%s: Unknown tag" % key) def __setitem__(self, key, value): if key in self.MULTIPLES: self.set_tag_multiple(key, value) elif key in self.NUMBERS: self.set_tag_long(key, value) else: self.set_tag_string(key, value) class ModuleProfiler: # How deep in other modules' code we should profile MAX_NONTARGET_DEPTH = 1 def __init__(self): """ Initializes the module profiler. """ self.target_paths = [] # Track how far deep we are in functions outside our target packages # The intent is to only log the first call to outside methods without following them further self.nontarget_depths = {} def log_class(self, cls): """ Adds the given class' module to the list of modules to be profiled. """ modulename = cls.__module__ if modulename not in sys.modules: logger.error( "ModuleProfiler: Could not add module %r (class %s) to the list of modules to trace - " "has it been imported entirely?", modulename, cls, ) return module = sys.modules[modulename] self.log_module(module, request=cls) def log_module(self, module, request=None): """ Adds the given module to the list of modules to be profiled. """ self.log_path(module.__file__, request=request) def log_path(self, path, request=None): """ Adds the given module path to the list of profile targets. """ self.target_paths.append(path) logger.info( "ModuleProfiler: added path %s to list of profile targets (request=%s)", path, request ) @functools.lru_cache(maxsize=2048) def is_target_path(self, path): """ Returns whether the given path matches one of our modules to be profiled. """ for target in self.target_paths: if os.path.isdir(target) and path.startswith(target + os.path.sep): return True elif path == target: return True return False def start(self): """ Starts the module profiler for all future threads. """ threading.setprofile(self.profiler) def stop(self): """ Removes the module profiler globally and from future threads. """ if sys.getprofile() != self.profiler: logger.warning( "ModuleProfiler: The currently enabled profile function was not ours - unbinding anyways" ) threading.setprofile(None) sys.setprofile(None) def profiler(self, frame, event, arg): filename = frame.f_code.co_filename tid = threading.get_ident() if not self.is_target_path(filename): if tid not in self.nontarget_depths: # Pick up where the main thread left off self.nontarget_depths[tid] = self.nontarget_depths.get( threading.main_thread().ident, 1 ) else: self.nontarget_depths[tid] += 1 else: self.nontarget_depths[tid] = 0 tname = threading.current_thread().name if event == "call": if self.nontarget_depths[tid] > self.MAX_NONTARGET_DEPTH: # Don't log past our max depth for packages that we're not tracking return else: # In order: function name, line number, filename s = "[%s] -> Entering function: %s\t(line %s in %s)" % ( tname, frame.f_code.co_name, frame.f_lineno, filename, ) if self.nontarget_depths[tid] == self.MAX_NONTARGET_DEPTH: s += ( " - not tracing further because MAX_NONTARGET_DEPTH=%s" % self.MAX_NONTARGET_DEPTH ) logger.debug(s) elif event == "return": if self.nontarget_depths[tid] > self.MAX_NONTARGET_DEPTH: return logger.debug( "[%s] -> Leaving function: %s\t(line %s in %s)" % (tname, frame.f_code.co_name, frame.f_lineno, filename) ) class InternetDisabledError(Exception): pass class Util: internet_enabled = True @staticmethod def sanitize_filename(filename): valid_chars = " ,.!-+@()_%s%s" % (string.ascii_letters, string.digits) return "".join(c if c in valid_chars else "_" for c in filename) @staticmethod def get_local_name(url, ensure_image=True): filename = url[url.rfind("/") + 1 :] index = filename.find("?") if index > 0: filename = filename[:index] index = filename.find("#") if index > 0: filename = filename[:index] filename = urllib.parse.unquote_plus(filename) filename = Util.sanitize_filename(filename) if len(filename) > 200: filename = filename[:190] + filename[-10:] if ensure_image and not Util.is_image(filename): filename += ".jpg" return filename @staticmethod def split(s, seps=(",", " ")): result = s.split() for sep in seps: result = [x.strip() for y in result for x in y.split(sep) if x.strip()] return result @staticmethod def makedirs(path): try: if not os.path.isdir(path): logger.info(lambda: "Creating folder %s" % path) os.makedirs(path) except OSError: logger.exception(lambda: "Could not makedirs for %s" % path) @staticmethod def is_image(filename, check_contents=False): if Util.is_animated_gif(filename): return False if not check_contents: return filename.lower().endswith( (".jpg", ".jpeg", ".gif", ".png", ".tiff", ".svg", ".bmp", ".avif") ) else: format, image_width, image_height = GdkPixbuf.Pixbuf.get_file_info(filename) return bool(format) @staticmethod def is_animated_gif(filename): if not filename.lower().endswith(".gif"): return False gif = Image.open(filename) try: gif.seek(1) except EOFError: return False else: return True @staticmethod def list_files( files=(), folders=(), filter_func=(lambda f: True), max_files=10000, randomize=True ): class NextFolderException(Exception): pass count = 0 for filepath in files: logger.debug( lambda: "checking file %s against filter_func %s" % (filepath, filter_func) ) if filter_func(filepath) and os.access(filepath, os.R_OK): count += 1 yield filepath folders = list(folders) if randomize: random.shuffle(folders) for folder in folders: folder_quota = max(20, int(max_files / len(folders))) if not os.path.isdir(folder): continue try: count_in_folder = 0 for root, subfolders, files in os.walk(folder, followlinks=True): subfolder_quota = max(10, int(folder_quota / (1 + len(subfolders)))) if randomize: random.shuffle(files) random.shuffle(subfolders) for filename in files[:subfolder_quota]: logger.debug( lambda: "checking file %s against filter_func %s (root=%s)" % (filename, filter_func, root) ) path = os.path.join(root, filename) if filter_func(path): count += 1 if count > max_files: logger.info( lambda: "More than %d files in the folders, stop listing" % max_files ) return yield path count_in_folder += 1 if count_in_folder > folder_quota: raise NextFolderException except NextFolderException: continue except Exception: logger.exception(lambda: "Could not walk folder " + folder) @staticmethod def start_force_exit_thread(delay): def force_exit(): time.sleep(delay) print("Exiting takes too long. Calling os.kill.") os.kill(os.getpid(), 9) force_exit_thread = threading.Thread(target=force_exit) force_exit_thread.daemon = True force_exit_thread.start() @staticmethod def write_metadata(filename, info): try: m = VarietyMetadata(filename) for k, v in sorted(info.items()): if k == "author": m["Xmp.variety." + k] = v if not "Xmp.dc.creator" in m: m["Xmp.dc.creator"] = [v] if k == "headline": m["Iptc.Application2.Headline"] = [v] elif k == "description": if v is not None: m.set_comment(v) else: m.clear_comment() elif k == "keywords": if not isinstance(v, (list, tuple)): v = [v] m["Iptc.Application2.Keywords"] = v m["Xmp.dc.subject"] = v elif k == "sfwRating": m["Xmp.variety." + k] = int(v) elif k == "extraData": m["Xmp.variety." + k] = json.dumps(v, sort_keys=True) else: m["Xmp.variety." + k] = v m.save_file() return True except Exception as ex: # could not write metadata inside file, use json instead logger.exception( lambda: "Could not write metadata directly in file, trying json metadata: " + filename ) try: with open(filename + ".metadata.json", "w", encoding="utf8") as f: f.write(json.dumps(info, indent=4, ensure_ascii=False, sort_keys=True)) return True except Exception as e: logger.exception(lambda: "Could not write metadata for file " + filename) return False @staticmethod def read_metadata(filename): try: m = VarietyMetadata(filename) info = {} for k in [ "sourceName", "sourceLocation", "sourceURL", "sourceType", "imageURL", "author", "authorURL", "noOriginPage", ]: if "Xmp.variety." + k in m: info[k] = m["Xmp.variety." + k] try: info["sfwRating"] = int(m["Xmp.variety.sfwRating"]) except: pass try: info["author"] = m["Xmp.dc.creator"][0] except: pass try: info["headline"] = m["Iptc.Application2.Headline"][0] except: pass try: info["description"] = m.get_comment() except: pass try: info["extraData"] = json.loads(m["Xmp.variety.extraData"]) except: pass try: info["keywords"] = m["Iptc.Application2.Keywords"] except: try: info["keywords"] = m["Xmp.dc.subject"] except: pass return info except Exception as e: # could not read metadata inside file, try reading json metadata instead try: with open(filename + ".metadata.json", encoding="utf8") as f: return json.loads(f.read()) except Exception: return None @staticmethod def set_rating(filename, rating): if rating is not None and (rating < -1 or rating > 5): raise ValueError("Rating should be between -1 and 5, or None") m = VarietyMetadata(filename) if rating is None: for key in ["Xmp.xmp.Rating", "Exif.Image.Rating", "Exif.Image.RatingPercent"]: if key in m: del m[key] # pylint: disable=unsupported-delete-operation else: m["Xmp.xmp.Rating"] = rating m["Exif.Image.Rating"] = max(0, rating) if rating >= 1: m["Exif.Image.RatingPercent"] = (rating - 1) * 25 elif "Exif.Image.RatingPercent" in m: del m["Exif.Image.RatingPercent"] # pylint: disable=unsupported-delete-operation m.save_file() @staticmethod def get_rating(filename): m = VarietyMetadata(filename) rating = None if "Xmp.xmp.Rating" in m: rating = m["Xmp.xmp.Rating"] elif "Exif.Image.Rating" in m: rating = m["Exif.Image.Rating"] elif "Exif.Image.RatingPercent" in m: rating = m["Exif.Image.RatingPercent"] // 25 + 1 if rating is not None: rating = max(-1, min(5, rating)) return rating @staticmethod def get_size(image): format, image_width, image_height = GdkPixbuf.Pixbuf.get_file_info(image) if not format: raise Exception("Not an image or unsupported image format") else: return image_width, image_height @staticmethod def get_primary_display_size(hidpi_scaled=True): display = Gdk.Display.get_default() monitor = display.get_primary_monitor() if not monitor: monitor = display.get_monitor(0) if monitor: geometry = monitor.get_geometry() scale = monitor.get_scale_factor() if hidpi_scaled else 1.0 return int(geometry.width * scale), int(geometry.height * scale) else: return Util.get_multimonitor_display_size() @staticmethod def get_multimonitor_display_size(): screen = Gdk.Screen.get_default() return screen.get_width(), screen.get_height() @staticmethod def find_unique_name(filename): index = filename.rfind(".") if index < 0: index = len(filename) before_extension = filename[:index] extension = filename[index:] i = 1 f = filename while os.path.exists(f): f = before_extension + "_" + str(i) + extension i += 1 return f @staticmethod def request(url, data=None, stream=False, method=None, timeout=5, headers=None): if not Util.internet_enabled: raise InternetDisabledError("Internet access in Variety is currently disabled") if url.startswith("//"): url = "http:" + url headers = headers or {} headers = {"User-Agent": USER_AGENT, "Cache-Control": "max-age=0", **headers} method = method if method else "POST" if data else "GET" try: r = requests.request( method=method, url=url, data=data, headers=headers, stream=stream, allow_redirects=True, timeout=timeout, ) r.raise_for_status() return r except requests.exceptions.SSLError: logger.exception("SSL Error for url %s:" % url) raise @staticmethod def request_write_to(r, f): for chunk in r.iter_content(1024): f.write(chunk) @staticmethod def fetch(url, data=None, **request_kwargs): return Util.request(url, data, **request_kwargs).text @staticmethod def fetch_bytes(url, data=None, **request_kwargs): return Util.request(url, data, **request_kwargs).content @staticmethod def fetch_json(url, data=None, **request_kwargs): return Util.request(url, data, **request_kwargs).json() @staticmethod def html_soup(url, data=None, **request_kwargs): return bs4.BeautifulSoup(Util.fetch(url, data, **request_kwargs), "lxml") @staticmethod def xml_soup(url, data=None, **request_kwargs): return bs4.BeautifulSoup(Util.fetch(url, data, **request_kwargs), "xml") @staticmethod def unxor(text, key): ciphertext = base64.decodebytes(text) return "".join(chr(x ^ ord(y)) for (x, y) in zip(ciphertext, cycle(key))) @staticmethod def folderpath(folder): p = os.path.normpath(folder) if not p.endswith("/"): p += "/" return p @staticmethod def compute_trimmed_offsets(image_size, screen_size): """Computes what width or height of the wallpaper image will be trimmed on each side, as it is zoomed in to fill the whole screen. Returns a tuple (h, v, scale_ratio) in which h or v will be zero. The other one is the pixel width or height that will be trimmed on each one of the sides of the image (top and down or left and right).""" iw, ih = image_size screen_w, screen_h = screen_size screen_ratio = float(screen_w) / screen_h hoffset = voffset = 0 if ( screen_ratio > float(iw) / ih ): # image is "taller" than the screen ratio - need to offset vertically scaledw = float(screen_w) scaledh = ih * scaledw / iw voffset = int((scaledh - float(scaledw) / screen_ratio) / 2) else: # image is "wider" than the screen ratio - need to offset horizontally scaledh = float(screen_h) scaledw = iw * scaledh / ih hoffset = int((scaledw - float(scaledh) * screen_ratio) / 2) logger.info( lambda: "Trimmed offsets debug info: w:%d, h:%d, ratio:%f, iw:%d, ih:%d, scw:%d, sch:%d, ho:%d, vo:%d" % (screen_w, screen_h, screen_ratio, iw, ih, scaledw, scaledh, hoffset, voffset) ) return hoffset, voffset @staticmethod def get_scaled_size(image): """Computes the size to which the image is scaled to fit the screen: original_size * scale_ratio = scaled_size""" iw, ih = Util.get_size(image) screen_w, screen_h = Util.get_primary_display_size() screen_ratio = float(screen_w) / screen_h if ( screen_ratio > float(iw) / ih ): # image is "taller" than the screen ratio - need to offset vertically return screen_w, int(round(ih * float(screen_w) / iw)) else: # image is "wider" than the screen ratio - need to offset horizontally return int(round(iw * float(screen_h) / ih)), screen_h @staticmethod def gtk_to_fcmatch_font(gtk_font_name): fd = Pango.FontDescription(gtk_font_name) family = fd.get_family() size = gtk_font_name[gtk_font_name.rindex(" ") :].strip() rest = gtk_font_name.replace(family, "").strip().replace(" ", ":") return family + ":" + rest, size @staticmethod def file_in(file, folder): return os.path.normpath(file).startswith(os.path.normpath(folder)) @staticmethod def same_file_paths(f1, f2): return os.path.normpath(f1) == os.path.normpath(f2) @staticmethod def collapseuser(path): home = os.path.expanduser("~") + "/" return re.sub("^" + home, "~/", path) @staticmethod def compare_versions(v1, v2): try: from packaging.version import parse as parse_version except ImportError: from pkg_resources import parse_version pv1 = parse_version(v1) pv2 = parse_version(v2) if pv1 == pv2: return 0 else: return -1 if pv1 < pv2 else 1 @staticmethod def md5(s): if isinstance(s, str): s = s.encode("utf-8") return hashlib.md5(s).hexdigest() @staticmethod def md5file(file): with open(file, mode="rb") as f: return Util.md5(f.read()) @staticmethod def random_hash(): try: return codecs.encode(os.urandom(16), "hex_codec").decode("utf8") except Exception: return "".join(random.choice(string.hexdigits) for _ in range(32)).lower() @staticmethod def get_file_icon_name(path): try: f = Gio.File.new_for_path(os.path.normpath(os.path.expanduser(path))) query_info = f.query_info("standard::icon", Gio.FileQueryInfoFlags.NONE, None) return query_info.get_attribute_object("standard::icon").get_names()[0] except Exception: logger.exception(lambda: "Exception while obtaining folder icon for %s:" % path) return "folder" @staticmethod def is_home_encrypted(): return os.path.isdir(os.path.expanduser("~").replace("/home/", "/home/.ecryptfs/")) @staticmethod def get_xdg_pictures_folder(): try: pics_folder = GLib.get_user_special_dir(GLib.USER_DIRECTORY_PICTURES) if not pics_folder: raise Exception("Could not get path to Pictures folder. Defaulting to ~/Pictures.") return pics_folder except: logger.exception( lambda: "Could not get path to Pictures folder. Defaulting to ~/Pictures." ) return os.path.expanduser("~/Pictures") @staticmethod def superuser_exec(*command_args): logger.warning(lambda: "Executing as superuser: %s" % command_args) subprocess.check_call(["pkexec"] + list(command_args)) @staticmethod def safe_map(f, l): for element in l: try: yield f(element) except Exception: continue @staticmethod def get_thumbnail_data(image, width, height): pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(image, width, height) return pixbuf.save_to_bufferv("jpeg", [], [])[1] @staticmethod def is_alive_and_image(url): try: r = Util.request(url, method="head") return r.headers.get("content-type", "").startswith("image/") except Exception: return False @staticmethod def is_dead_or_not_image(url): if not url: return True try: host = urllib.parse.urlparse(url).netloc if host.startswith("interfacelift.com"): return False if "wallbase.cc" in host or "ns223506.ovh.net" in host: return True except: return True try: r = Util.request(url, method="head") return not r.headers.get("content-type", "").startswith("image/") except requests.exceptions.RequestException: return True except: return False # makes the Gtk thread execute the given callback. @staticmethod def add_mainloop_task(callback, *args): def cb(args): args[0](*args[1:]) return False args = [callback] + list(args) Gdk.threads_add_idle(GLib.PRIORITY_DEFAULT, cb, args) @staticmethod def is_unity(): return os.getenv("XDG_CURRENT_DESKTOP", "").lower() == "unity" @staticmethod def start_daemon(target): daemon_thread = threading.Thread(target=target) daemon_thread.daemon = True daemon_thread.start() return daemon_thread @staticmethod def check_variety_slideshow_present(): return bool(shutil.which("variety-slideshow")) @staticmethod def convert_to_filename(url): url = re.sub(r"http://", "", url) url = re.sub(r"https://", "", url) valid_chars = "_%s%s" % (string.ascii_letters, string.digits) return "".join(c if c in valid_chars else "_" for c in url) @staticmethod def safe_unlink(filepath): try: os.unlink(filepath) except Exception: logger.exception(lambda: "Could not delete {}, ignoring".format(filepath)) @staticmethod def copy_with_replace(from_path, to_path, search_replace_map): with open(from_path, "r") as file: data = file.read() for search, replace in search_replace_map.items(): data = data.replace(search, replace) with open(to_path + ".partial", "w") as file: file.write(data) file.flush() os.rename(to_path + ".partial", to_path) @staticmethod def get_exec_path(): return os.path.abspath(sys.argv[0]) @staticmethod def get_folder_size(start_path): total_size = 0 for dirpath, dirnames, filenames in os.walk(start_path): for f in filenames: fp = os.path.join(dirpath, f) if not os.path.islink(fp): total_size += os.path.getsize(fp) return total_size def on_gtk(f): @functools.wraps(f) def wrapped(*args): Util.add_mainloop_task(f, *args) return wrapped def safe_print(text, ascii_text=None, file=sys.stdout): """ Python's print throws UnicodeEncodeError if the terminal encoding is borked. This version tries print, then logging, then printing the ascii text when one is present. If does not throw exceptions even if it fails. :param text: Text to print, str or unicode, possibly with non-ascii symbols in it :param ascii_text: optional. Original untranslated ascii version of the text when present. """ try: print(text, file=file) except: # UnicodeEncodeError can happen here if the terminal is strangely configured, but we are playing safe and catching everything try: logging.getLogger("variety").error( "Error printing non-ascii text, terminal encoding is %s" % sys.stdout.encoding ) if ascii_text: try: print(ascii_text) return except: pass logging.getLogger("variety").warning(text) except: pass variety-0.8.13/variety/VarietyOptionParser.py000066400000000000000000000212211475753071700213320ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import optparse from variety.Util import _, safe_print from variety_lib import varietyconfig class VarietyOptionParser(optparse.OptionParser): """Override optparse.OptionParser to allow for errors in options without exiting""" def __init__(self, usage, version, report_errors=True): optparse.OptionParser.__init__(self, usage=usage, version=version) self.report_errors = report_errors def print_help(self, file=None): """print_help(file : file = stdout) Print an extended help message, listing all options and any help text provided with them, to 'file' (default stdout). """ if file is None: safe_print(self.format_help()) else: file.write(self.format_help().encode()) def error(self, msg): if self.report_errors: optparse.OptionParser.error(self, msg) else: raise ValueError(msg) def parse_options(arguments, report_errors=True): """Support for command line options""" usage = _( """%prog [options] [files or urls] Passing local files will add them to Variety's queue. Passing remote URLs will make Variety fetch them to Fetched folder and place them in the queue. To set a specific wallpaper: %prog --set /some/local/image.jpg """ ) parser = VarietyOptionParser( usage=usage, version="%%prog %s" % varietyconfig.get_version(), report_errors=report_errors ) parser.add_option( "--profile", action="store", dest="profile", help=_( "Profile name or full path to the configuration folder Variety should use. " "If not specified, this is ~/.config/variety/. " "If just a name is used instead of a full path, the profile folder will be " "~/.config/variety-profiles/. " "Use only when initially starting Variety - changing the profile path requires " "restart. Several instances of Variety can be started when using different profiles, " "each with its own separate configuration. This can be used for example to control " "several different screens or workspaces under desktop environments like XFCE which " "allow this. To pass commands to a running instance, pass the same --profile " "argument as the one it was started with in subsequent commands." ), default=None, ) parser.add_option( "-v", "--verbose", action="count", dest="verbose", default=0, help=_( "Show logging messages (-vv to -vvvvv will profile various parts of Variety with increasing detail" ), ) parser.add_option( "-q", "--quit", action="store_true", dest="quit", help=_("Make the running instance quit") ) parser.add_option( "--get", "--get-wallpaper", "--current", "--show-current", action="store_true", dest="show_current", help=_( "Print the current wallpaper location. Used only when the application is already running." ), ) parser.add_option( "--set", "--set-wallpaper", action="store", dest="set_wallpaper", help=_("Set the given file as wallpaper, absolute path required"), ) parser.add_option( "-n", "--next", action="store_true", dest="next", help=_("Show Next wallpaper") ) parser.add_option( "-p", "--previous", action="store_true", dest="previous", help=_("Show Previous wallpaper") ) parser.add_option( "--fast-forward", action="store_true", dest="fast_forward", help=_("Show Next wallpaper, skipping the forward history"), ) parser.add_option( "-t", "--trash", action="store_true", dest="trash", help=_( "Move current wallpaper to Trash. Used only when the application is already running." ), ) parser.add_option( "-f", "--favorite", action="store_true", dest="favorite", help=_( "Copy current wallpaper to Favorites. Used only when the application is already running." ), ) parser.add_option( "--move-to-favorites", action="store_true", dest="movefavorite", help=_( "Move current wallpaper to Favorites. Used only when the application is already running." ), ) parser.add_option( "--pause", action="store_true", dest="pause", help=_("Pause on current image") ) parser.add_option( "--resume", action="store_true", dest="resume", help=_("Resume regular image changes") ) parser.add_option( "--toggle-pause", action="store_true", dest="toggle_pause", help=_("Toggle Pause/Resume state"), ) parser.add_option( "--toggle-no-effects", action="store_true", dest="toggle_no_effects", help=_('Toggle "Show Without Effects" for current image'), ) parser.add_option( "--quotes-next", action="store_true", dest="quotes_next", help=_("Show Next quote") ) parser.add_option( "--quotes-previous", action="store_true", dest="quotes_previous", help=_("Show Previous quote"), ) parser.add_option( "--quotes-fast-forward", action="store_true", dest="quotes_fast_forward", help=_("Show Next quote, skipping the forward history"), ) parser.add_option( "--quotes-toggle-pause", action="store_true", dest="quotes_toggle_pause", help=_("Toggle Quotes Pause/Resume state"), ) parser.add_option( "--quotes-save-favorite", action="store_true", dest="quotes_save_favorite", help=_("Save the current quote to Favorites"), ) parser.add_option( "--history", action="store_true", dest="history", help=_("Toggle History display") ) parser.add_option( "--downloads", action="store_true", dest="downloads", help=_("Toggle Recent Downloads display"), ) parser.add_option( "--preferences", "--show-preferences", action="store_true", dest="preferences", help=_("Show Preferences dialog"), ) parser.add_option( "--selector", "--show-selector", action="store_true", dest="selector", help=_( "Show manual wallpaper selector - the thumbnail bar filled with images from the active image sources" ), ) parser.add_option( "--set-option", action="append", dest="set_options", nargs=2, help=_( "Sets and applies an option. " "The option names are the same that are used in Variety's config file " "~/.config/variety/variety.conf. " "Multiple options can be set in a single command. " "Example: 'variety --set-option icon Dark --set-option clock_enabled True'. " "USE WITH CAUTION: You are changing the settings file directly in an unguarded way." ), ) options, args = parser.parse_args(arguments) if report_errors: if (options.next or options.fast_forward) and options.previous: parser.error(_("options --next/--fast-forward and --previous are mutually exclusive")) if options.trash and options.favorite: parser.error(_("options --trash and --favorite are mutually exclusive")) if options.pause and options.resume: parser.error(_("options --pause and --resume are mutually exclusive")) if (options.quotes_next or options.quotes_fast_forward) and options.quotes_previous: parser.error( _( "options --quotes-next/--quotes-fast-forward and --quotes-previous are mutually exclusive" ) ) return options, args variety-0.8.13/variety/VarietyWindow.py000066400000000000000000004001171475753071700201610ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012-2019, Peter Levi # Copyright (c) 2017-2019, James Lu # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import os import random import re import shlex import shutil import stat import subprocess import sys import threading import time import urllib.parse import webbrowser from typing import List from PIL import Image as PILImage from jumble.Jumble import Jumble from variety import indicator from variety.AboutVarietyDialog import AboutVarietyDialog from variety.DominantColors import DominantColors from variety.FlickrDownloader import FlickrDownloader from variety.ImageFetcher import ImageFetcher from variety.Options import Options from variety.plugins.downloaders.ConfigurableImageSource import ConfigurableImageSource from variety.plugins.downloaders.DefaultDownloader import SAFE_MODE_BLACKLIST from variety.plugins.downloaders.ImageSource import ImageSource from variety.plugins.downloaders.SimpleDownloader import SimpleDownloader from variety.plugins.IDisplayModesPlugin import DisplayMode, IDisplayModesPlugin from variety.plugins.IVarietyPlugin import IVarietyPlugin from variety.PreferencesVarietyDialog import DONATE_PAGE_INDEX, PreferencesVarietyDialog from variety.PrivacyNoticeDialog import PrivacyNoticeDialog from variety.profile import ( DEFAULT_PROFILE_PATH, get_autostart_file_path, get_desktop_file_name, get_profile_path, get_profile_short_name, get_profile_wm_class, is_default_profile, ) from variety.QuotesEngine import QuotesEngine from variety.QuoteWriter import QuoteWriter from variety.ThumbsManager import ThumbsManager from variety.Util import Util, _, debounce, on_gtk, throttle from variety.VarietyOptionParser import parse_options from variety.WelcomeDialog import WelcomeDialog from variety_lib import varietyconfig # fmt: off import gi # isort:skip gi.require_version("Notify", "0.7") from gi.repository import Gdk, Gio, GObject, Gtk, Notify # isort:skip Notify.init("Variety") # fmt: on random.seed() logger = logging.getLogger("variety") DL_FOLDER_FILE = ".variety_download_folder" DONATE_URL = "https://www.paypal.com/donate/?business=DHQUELMQRQW46&no_recurring=0&item_name=Variety+Wallpaper+Changer¤cy_code=EUR" OUTDATED_MSG = "This version of Variety is outdated and unsupported. Please upgrade. Quitting." class VarietyWindow(Gtk.Window): __gtype_name__ = "VarietyWindow" SERVERSIDE_OPTIONS_URL = "https://gist.githubusercontent.com/peterlevi/a7d1dbf3a4e76e15760a/raw/fab10d0ce5cfe66377e7c650be56edb497aabbd4/variety_server_options.json" # How many unseen_downloads max to for every downloader. MAX_UNSEEN_PER_DOWNLOADER = 10 @classmethod def get_instance(cls): return VarietyWindow.instance def __init__(self): VarietyWindow.instance = self def start(self, cmdoptions): self.running = True self.about = None self.preferences_dialog = None self.ind = None try: if Gio.SettingsSchemaSource.get_default().lookup("org.gnome.desktop.background", True): self.gsettings = Gio.Settings.new("org.gnome.desktop.background") else: self.gsettings = None except Exception: self.gsettings = None self.prepare_config_folder() self.dialogs = [] fr_file = os.path.join(self.config_folder, ".firstrun") first_run = not os.path.exists(fr_file) first_run_internet_enabled = None if first_run: # Make setup dialogs block so that privacy notice appears self.show_welcome_dialog() first_run_internet_enabled = self.show_privacy_dialog() self.thumbs_manager = ThumbsManager(self) self.quotes_engine = None self.quote = None self.quote_favorites_contents = "" self.clock_thread = None self.perform_upgrade() self.events = [] self.prepared = [] self.prepared_cleared = False self.prepared_lock = threading.Lock() self.register_clipboard() self.do_set_wp_lock = threading.Lock() self.auto_changed = True self.process_command(cmdoptions, initial_run=True) # load config self.options = None self.server_options = {} self.post_filter_filename = None logger.info(lambda: "Using data_path %s" % varietyconfig.get_data_path()) self.jumble = Jumble( [os.path.join(os.path.dirname(__file__), "plugins", "builtin"), self.plugins_folder] ) setattr(self.jumble, "parent", self) self.jumble.load() self.image_count = -1 self.image_colors_cache = {} self.load_downloader_plugins() self.create_downloaders_cache() self.reload_config(is_on_start=True, first_run_internet_enabled=first_run_internet_enabled) self.load_banned() self.load_last_change_time() self.update_indicator(auto_changed=False) self.start_threads() if first_run: self.first_run(fr_file) def _delayed(): self.create_preferences_dialog() for plugin in self.jumble.get_plugins(clazz=IVarietyPlugin): threading.Timer(0, plugin["plugin"].on_variety_start_complete).start() GObject.timeout_add(1000, _delayed) def on_mnu_about_activate(self, widget, data=None): """Display the about box for variety.""" if self.about is not None: logger.debug(lambda: "show existing about_dialog") self.about.set_keep_above(True) self.about.present() self.about.set_keep_above(False) self.about.present() else: logger.debug(lambda: "create new about dialog") self.about = AboutVarietyDialog() # pylint: disable=E1102 # Set the version on runtime. Gtk.AboutDialog.set_version(self.about, varietyconfig.get_version()) self.about.run() self.about.destroy() self.about = None def on_mnu_donate_activate(self, widget, data=None): self.preferences_dialog.ui.notebook.set_current_page(DONATE_PAGE_INDEX) self.on_mnu_preferences_activate() webbrowser.open_new_tab(DONATE_URL) def get_preferences_dialog(self): if not self.preferences_dialog: self.create_preferences_dialog() return self.preferences_dialog def create_preferences_dialog(self): if not self.preferences_dialog: logger.debug(lambda: "create new preferences_dialog") self.preferences_dialog = PreferencesVarietyDialog(parent=self) # pylint: disable=E1102 def _on_preferences_dialog_destroyed(widget, data=None): logger.debug(lambda: "on_preferences_dialog_destroyed") self.preferences_dialog = None self.preferences_dialog.connect("destroy", _on_preferences_dialog_destroyed) def _on_preferences_close_button(arg1, arg2): self.preferences_dialog.close() return True self.preferences_dialog.connect("delete_event", _on_preferences_close_button) def on_mnu_preferences_activate(self, widget=None, data=None): """Display the preferences window for variety.""" if self.preferences_dialog is not None: if self.preferences_dialog.get_visible(): logger.debug(lambda: "bring to front existing and visible preferences_dialog") self.preferences_dialog.set_keep_above(True) self.preferences_dialog.present() self.preferences_dialog.set_keep_above(False) else: logger.debug(lambda: "reload and show existing but non-visible preferences_dialog") self.preferences_dialog.reload() self.preferences_dialog.show() else: self.create_preferences_dialog() self.preferences_dialog.show() # destroy command moved into dialog to allow for a help button self.preferences_dialog.present() def prepare_config_folder(self): self.config_folder = get_profile_path() Util.makedirs(self.config_folder) Util.copy_with_replace( varietyconfig.get_data_file("config", "variety.conf"), os.path.join(self.config_folder, "variety_latest_default.conf"), {DEFAULT_PROFILE_PATH: get_profile_path(expanded=False)}, ) if not os.path.exists(os.path.join(self.config_folder, "variety.conf")): logger.info( lambda: "Missing config file, copying it from " + varietyconfig.get_data_file("config", "variety.conf") ) Util.copy_with_replace( varietyconfig.get_data_file("config", "variety.conf"), os.path.join(self.config_folder, "variety.conf"), {DEFAULT_PROFILE_PATH: get_profile_path(expanded=False)}, ) if not os.path.exists(os.path.join(self.config_folder, "ui.conf")): logger.info( lambda: "Missing ui.conf file, copying it from " + varietyconfig.get_data_file("config", "ui.conf") ) shutil.copy(varietyconfig.get_data_file("config", "ui.conf"), self.config_folder) self.plugins_folder = os.path.join(self.config_folder, "plugins") Util.makedirs(self.plugins_folder) self.scripts_folder = os.path.join(self.config_folder, "scripts") Util.makedirs(self.scripts_folder) if not os.path.exists(os.path.join(self.scripts_folder, "set_wallpaper")): logger.info( lambda: "Missing set_wallpaper file, copying it from " + varietyconfig.get_data_file("scripts", "set_wallpaper") ) Util.copy_with_replace( varietyconfig.get_data_file("scripts", "set_wallpaper"), os.path.join(self.scripts_folder, "set_wallpaper"), {DEFAULT_PROFILE_PATH.replace("~", "$HOME"): get_profile_path(expanded=True)}, ) if not os.path.exists(os.path.join(self.scripts_folder, "get_wallpaper")): logger.info( lambda: "Missing get_wallpaper file, copying it from " + varietyconfig.get_data_file("scripts", "get_wallpaper") ) Util.copy_with_replace( varietyconfig.get_data_file("scripts", "get_wallpaper"), os.path.join(self.scripts_folder, "get_wallpaper"), {DEFAULT_PROFILE_PATH.replace("~", "$HOME"): get_profile_path(expanded=True)}, ) # make all scripts executable: for f in os.listdir(self.scripts_folder): path = os.path.join(self.scripts_folder, f) os.chmod(path, os.stat(path).st_mode | stat.S_IEXEC) self.wallpaper_folder = os.path.join(self.config_folder, "wallpaper") Util.makedirs(self.wallpaper_folder) self.create_desktop_entry() def register_clipboard(self): def clipboard_changed(clipboard, event): try: if not self.options.clipboard_enabled: return text = clipboard.wait_for_text() logger.debug(lambda: "Clipboard: %s" % text) if not text: return valid = [ url for url in text.split("\n") if ImageFetcher.url_ok( url, self.options.clipboard_use_whitelist, self.options.clipboard_hosts ) ] if valid: logger.info(lambda: "Received clipboard URLs: " + str(valid)) self.process_urls(valid, verbose=False) except Exception: logger.exception(lambda: "Exception when processing clipboard:") self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) self.clipboard.connect("owner-change", clipboard_changed) def log_options(self): logger.info(lambda: "Loaded options:") for k, v in sorted(self.options.__dict__.items()): logger.info(lambda: "%s = %s" % (k, v)) def get_real_download_folder(self): subfolder = "Downloaded by Variety" dl = self.options.download_folder # If chosen folder is within Variety's config folder, or folder's name is "Downloaded by Variety", # or folder is missing or it is empty or it has already been used as a download folder, then use it: if ( Util.file_in(dl, self.config_folder) or dl.endswith("/%s" % subfolder) or dl.endswith("/%s/" % subfolder) or not os.path.exists(dl) or not os.listdir(dl) or os.path.exists(os.path.join(dl, DL_FOLDER_FILE)) ): return dl else: # In all other cases (i.e. it is an existing user folder with files in it), use a subfolder inside it return os.path.join(dl, subfolder) def prepare_download_folder(self): self.real_download_folder = self.get_real_download_folder() Util.makedirs(self.real_download_folder) dl_folder_file = os.path.join(self.real_download_folder, DL_FOLDER_FILE) if not os.path.exists(dl_folder_file): with open(dl_folder_file, "w") as f: f.write(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) def load_downloader_plugins(self): Options.IMAGE_SOURCES = [p["plugin"] for p in self.jumble.get_plugins(ImageSource)] Options.CONFIGURABLE_IMAGE_SOURCES = [ p for p in Options.IMAGE_SOURCES if isinstance(p, ConfigurableImageSource) ] Options.CONFIGURABLE_IMAGE_SOURCES_MAP = { s.get_source_type(): s for s in Options.CONFIGURABLE_IMAGE_SOURCES } Options.SIMPLE_DOWNLOADERS = [ p for p in Options.IMAGE_SOURCES if isinstance(p, SimpleDownloader) ] for image_source in Options.IMAGE_SOURCES: image_source.activate() image_source.set_variety(self) def reload_config(self, is_on_start=False, first_run_internet_enabled=None): self.previous_options = self.options self.options = Options() self.options.read() if first_run_internet_enabled is not None: self.options.internet_enabled = first_run_internet_enabled self.options.write() # Make sure to turn on or off the global Internet Killswitch Util.internet_enabled = self.options.internet_enabled if not self.options.internet_enabled: logging.warning("Internet access is disabled. Some features will not work.") if is_on_start: self.load_history() self.update_indicator_icon() self.prepare_download_folder() Util.makedirs(self.options.favorites_folder) Util.makedirs(self.options.fetched_folder) self.individual_images = [ os.path.expanduser(s[2]) for s in self.options.sources if s[0] and s[1] == Options.SourceType.IMAGE ] self.folders = [ os.path.expanduser(s[2]) for s in self.options.sources if s[0] and s[1] == Options.SourceType.FOLDER ] if Options.SourceType.FAVORITES in [s[1] for s in self.options.sources if s[0]]: self.folders.append(self.options.favorites_folder) if Options.SourceType.FETCHED in [s[1] for s in self.options.sources if s[0]]: self.folders.append(self.options.fetched_folder) self.downloaders = [] self.download_folder_size = None self.albums = [] if self.size_options_changed(): logger.info(lambda: "Size/landscape settings changed - purging downloaders cache") self.create_downloaders_cache() for s in self.options.sources: enabled, type, location = s if not enabled: continue # prepare a cache for albums to avoid walking those folders on every change if type in (Options.SourceType.ALBUM_FILENAME, Options.SourceType.ALBUM_DATE): images = Util.list_files(folders=(location,), filter_func=Util.is_image) if type == Options.SourceType.ALBUM_FILENAME: images = sorted(images) elif type == Options.SourceType.ALBUM_DATE: images = sorted(images, key=os.path.getmtime) else: raise Exception("Unsupported album type") if images: self.albums.append({"path": os.path.normpath(location), "images": images}) continue if type not in self.options.get_downloader_source_types(): continue if location in self.downloaders_cache[type]: self.downloaders.append(self.downloaders_cache[type][location]) else: try: logger.info( lambda: "Creating new downloader for type %s, location %s" % (type, location) ) dlr = self.create_downloader(type, location) self.downloaders_cache[type][location] = dlr self.downloaders.append(dlr) except Exception: logger.exception( lambda: "Could not create Downloader for type %s, location %s" % (type, location) ) for downloader in Options.SIMPLE_DOWNLOADERS: downloader.update_download_folder(self.real_download_folder) for downloader in self.downloaders: downloader.update_download_folder(self.real_download_folder) Util.makedirs(downloader.target_folder) self.folders.append(downloader.target_folder) self.filters = [f[2] for f in self.options.filters if f[0]] self.min_width = 0 self.min_height = 0 if self.options.min_size_enabled: self.min_width = Gdk.Screen.get_default().get_width() * self.options.min_size // 100 self.min_height = Gdk.Screen.get_default().get_height() * self.options.min_size // 100 self.log_options() # clean prepared - they are outdated if self.should_clear_prepared(): self.clear_prepared_queue() else: logger.info(lambda: "No need to clear prepared queue") self.start_clock_thread() if self.options.quotes_enabled: if not self.quotes_engine: self.quotes_engine = QuotesEngine(self) self.quotes_engine.start() else: if self.quotes_engine: self.quotes_engine.stop() if self.quotes_engine: self.reload_quote_favorites_contents() clear_prepared = ( self.previous_options is None or self.options.quotes_disabled_sources != self.previous_options.quotes_disabled_sources or self.options.quotes_tags != self.previous_options.quotes_tags or self.options.quotes_authors != self.previous_options.quotes_authors ) self.quotes_engine.on_options_updated(clear_prepared=clear_prepared) if self.previous_options and ( self.options.filters != self.previous_options.filters or self.options.quotes_enabled != self.previous_options.quotes_enabled or self.options.clock_enabled != self.previous_options.clock_enabled ): self.no_effects_on = None self.update_indicator(auto_changed=False) if self.previous_options is None or self.options.filters != self.previous_options.filters: threading.Timer(0.1, self.refresh_wallpaper).start() else: threading.Timer(0.1, self.refresh_texts).start() if self.events: for e in self.events: e.set() def clear_prepared_queue(self): self.filters_warning_shown = False logger.info(lambda: "Clearing prepared queue") with self.prepared_lock: self.prepared_cleared = True self.prepared = [] self.prepare_event.set() self.image_count = -1 def should_clear_prepared(self): return self.previous_options and ( [s for s in self.previous_options.sources if s[0]] != [s for s in self.options.sources if s[0]] or self.filtering_options_changed() ) def filtering_options_changed(self): if not self.previous_options: return False if self.size_options_changed(): return True if self.previous_options.safe_mode != self.options.safe_mode: return True if ( self.previous_options.desired_color_enabled != self.options.desired_color_enabled or self.previous_options.desired_color != self.options.desired_color ): return True if ( self.previous_options.lightness_enabled != self.options.lightness_enabled or self.previous_options.lightness_mode != self.options.lightness_mode ): return True if ( self.previous_options.min_rating_enabled != self.options.min_rating_enabled or self.previous_options.min_rating != self.options.min_rating ): return True if ( self.previous_options.name_regex_enabled != self.options.name_regex_enabled or self.previous_options.name_regex != self.options.name_regex ): return True return False def size_options_changed(self): return self.previous_options and ( self.previous_options.min_size_enabled != self.options.min_size_enabled or self.previous_options.min_size != self.options.min_size or self.previous_options.use_landscape_enabled != self.options.use_landscape_enabled ) def create_downloaders_cache(self): self.downloaders_cache = {} for type in Options.get_downloader_source_types(): self.downloaders_cache[type] = {} def create_downloader(self, type, location): if type == Options.SourceType.FLICKR: return FlickrDownloader(self, location) else: for dl in Options.SIMPLE_DOWNLOADERS: if dl.get_source_type() == type: return dl for source in Options.CONFIGURABLE_IMAGE_SOURCES: if source.get_source_type() == type: return source.create_downloader(location) raise Exception("Unknown downloader type") def get_folder_of_source(self, source): type = source[1] location = source[2] if type == Options.SourceType.IMAGE: return None elif type in Options.SourceType.LOCAL_PATH_TYPES: return location elif type == Options.SourceType.FAVORITES: return self.options.favorites_folder elif type == Options.SourceType.FETCHED: return self.options.fetched_folder else: dlr = self.create_downloader(type, location) dlr.update_download_folder(self.real_download_folder) return dlr.target_folder def delete_files_of_source(self, source): folder = self.get_folder_of_source(source) if Util.file_in(folder, self.real_download_folder): self.remove_folder_from_queues(folder) should_repaint = ( self.thumbs_manager.is_showing("history") or self.thumbs_manager.is_showing("downloads") or ( self.thumbs_manager.get_folders() is not None and folder in self.thumbs_manager.get_folders() ) ) if should_repaint: self.thumbs_manager.repaint() try: logger.info(lambda: "Deleting recursively folder " + folder) shutil.rmtree(folder) except Exception: logger.exception(lambda: "Could not delete download folder contents " + folder) if self.current and Util.file_in(self.current, folder): change_timer = threading.Timer(0, self.next_wallpaper) change_timer.start() def load_banned(self): self.banned = set() try: banned = os.path.join(self.config_folder, "banned.txt") with open(banned, encoding="utf8") as f: for line in f: self.banned.add(line.strip()) except Exception: logger.info(lambda: "Missing or invalid banned URLs list, no URLs will be banned") def start_clock_thread(self): if not self.clock_thread and self.options.clock_enabled: self.clock_event = threading.Event() self.events.append(self.clock_event) self.clock_thread = threading.Thread(target=self.clock_thread_method) self.clock_thread.daemon = True self.clock_thread.start() def start_threads(self): self.change_event = threading.Event() change_thread = threading.Thread(target=self.regular_change_thread) change_thread.daemon = True change_thread.start() self.prepare_event = threading.Event() prep_thread = threading.Thread(target=self.prepare_thread) prep_thread.daemon = True prep_thread.start() self.dl_event = threading.Event() dl_thread = threading.Thread(target=self.download_thread) dl_thread.daemon = True dl_thread.start() self.events.extend([self.change_event, self.prepare_event, self.dl_event]) server_options_thread = threading.Thread(target=self.server_options_thread) server_options_thread.daemon = True server_options_thread.start() def is_in_favorites(self, file): filename = os.path.basename(file) return os.path.exists(os.path.join(self.options.favorites_folder, filename)) def is_current_refreshable(self): return "--refreshable" in self.current def update_favorites_menuitems(self, holder, auto_changed, favs_op): if auto_changed: # delay enabling Move/Copy operations in this case - see comment below holder.copy_to_favorites.set_sensitive(False) holder.move_to_favorites.set_sensitive(False) else: holder.copy_to_favorites.set_sensitive(favs_op in ("copy", "both")) holder.move_to_favorites.set_sensitive(favs_op in ("move", "both")) if favs_op is None: holder.copy_to_favorites.set_visible(False) holder.move_to_favorites.set_visible(False) elif favs_op == "favorite": holder.copy_to_favorites.set_label(_("Already in Favorites")) holder.copy_to_favorites.set_visible(True) holder.move_to_favorites.set_visible(False) else: holder.copy_to_favorites.set_label(_("Copy to _Favorites")) holder.move_to_favorites.set_label(_("Move to _Favorites")) if favs_op == "copy": holder.copy_to_favorites.set_visible(True) holder.move_to_favorites.set_visible(False) elif favs_op == "move": holder.copy_to_favorites.set_visible(False) holder.move_to_favorites.set_visible(True) else: # both holder.move_to_favorites.set_label(_("Move to Favorites")) holder.copy_to_favorites.set_visible(True) holder.move_to_favorites.set_visible(True) def update_indicator(self, file=None, auto_changed=None): if not file: file = self.current if auto_changed is None: auto_changed = self.auto_changed logger.info(lambda: "Setting file info to: %s" % file) try: self.url = None self.image_url = None self.source_name = None label = os.path.dirname(file).replace("_", "__") if file else None info = Util.read_metadata(file) if file else None if info and "sourceURL" in info and "sourceName" in info: self.source_name = info["sourceName"] if "Fetched" in self.source_name: self.source_name = None label = _("Fetched: Show Origin") elif "noOriginPage" in info: label = _("Source: %s") % self.source_name else: label = _("View at %s") % self.source_name self.url = info["sourceURL"] if self.url.startswith("//"): self.url = "https:" + self.url if "imageURL" in info: self.image_url = info["imageURL"] if self.image_url.startswith("//"): self.image_url = self.url.split("//")[0] + self.image_url if label and len(label) > 50: label = label[:50] + "..." author = None if info and "author" in info and "authorURL" in info: author = info["author"] if len(author) > 50: author = author[:50] + "..." self.author_url = info["authorURL"] else: self.author_url = None if not self.ind: return deleteable = ( bool(file) and os.access(file, os.W_OK) and not self.is_current_refreshable() ) favs_op = self.determine_favorites_operation(file) image_source = self.get_source(file) downloaded = list( Util.list_files( files=[], folders=[self.real_download_folder], filter_func=Util.is_image, max_files=1, randomize=False, ) ) def _gtk_update(): rating_menu = None if deleteable: rating_menu = ThumbsManager.create_rating_menu(file, self) quote_not_fav = True if self.options.quotes_enabled and self.quote is not None: quote_not_fav = ( self.quote is not None and self.quote_favorites_contents.find(self.current_quote_to_text()) == -1 ) for i in range(3): # if only done once, the menu is not always updated for some reason self.ind.prev.set_sensitive(self.position < len(self.used) - 1) if getattr(self.ind, "prev_main", None): self.ind.prev_main.set_sensitive(self.position < len(self.used) - 1) self.ind.fast_forward.set_sensitive(self.position > 0) self.ind.file_label.set_visible(bool(file)) self.ind.file_label.set_sensitive(bool(file)) self.ind.file_label.set_label( os.path.basename(file).replace("_", "__") if file else _("Unknown") ) self.ind.focus.set_sensitive(image_source is not None) # delay enabling Trash if auto_changed self.ind.trash.set_visible(bool(file)) self.ind.trash.set_sensitive(deleteable and not auto_changed) self.update_favorites_menuitems(self.ind, auto_changed, favs_op) self.ind.show_origin.set_visible(bool(label)) self.ind.show_origin.set_sensitive(bool(info and "noOriginPage" not in info)) if label: self.ind.show_origin.set_label(label) if not author: self.ind.show_author.set_visible(False) self.ind.show_author.set_sensitive(False) else: self.ind.show_author.set_visible(True) self.ind.show_author.set_sensitive(True) self.ind.show_author.set_label(_("Author: %s") % author) self.ind.rating.set_sensitive(rating_menu is not None) if rating_menu: self.ind.rating.set_submenu(rating_menu) self.ind.history.handler_block(self.ind.history_handler_id) self.ind.history.set_active(self.thumbs_manager.is_showing("history")) self.ind.history.handler_unblock(self.ind.history_handler_id) self.ind.downloads.set_visible(len(self.downloaders) > 0) self.ind.downloads.set_sensitive(len(downloaded) > 0) self.ind.downloads.handler_block(self.ind.downloads_handler_id) self.ind.downloads.set_active(self.thumbs_manager.is_showing("downloads")) self.ind.downloads.handler_unblock(self.ind.downloads_handler_id) self.ind.selector.handler_block(self.ind.selector_handler_id) self.ind.selector.set_active(self.thumbs_manager.is_showing("selector")) self.ind.selector.handler_unblock(self.ind.selector_handler_id) self.ind.google_image.set_sensitive(self.image_url is not None) self.ind.pause_resume.set_label( _("Pause on current") if self.options.change_enabled else _("Resume regular changes") ) if self.options.quotes_enabled and self.quote is not None: self.ind.quotes.set_visible(True) self.ind.google_quote_author.set_visible( self.quote.get("author", None) is not None ) if "sourceName" in self.quote and "link" in self.quote: self.ind.view_quote.set_visible(True) self.ind.view_quote.set_label( _("View at %s") % self.quote["sourceName"] ) else: self.ind.view_quote.set_visible(False) if self.quotes_engine: self.ind.prev_quote.set_sensitive(self.quotes_engine.has_previous()) self.ind.quotes_pause_resume.set_label( _("Pause on current") if self.options.quotes_change_enabled else _("Resume regular changes") ) self.ind.quote_favorite.set_sensitive(quote_not_fav) self.ind.quote_favorite.set_label( _("Save to Favorites") if quote_not_fav else _("Already in Favorites") ) self.ind.quote_view_favs.set_sensitive( os.path.isfile(self.options.quotes_favorites_file) ) self.ind.quote_clipboard.set_sensitive(self.quote is not None) else: self.ind.quotes.set_visible(False) no_effects_visible = ( self.filters or self.options.quotes_enabled or self.options.clock_enabled ) self.ind.no_effects.set_visible(no_effects_visible) self.ind.no_effects.handler_block(self.ind.no_effects_handler_id) self.ind.no_effects.set_active(self.no_effects_on == file) self.ind.no_effects.handler_unblock(self.ind.no_effects_handler_id) Util.add_mainloop_task(_gtk_update) # delay enabling Move/Copy operations after automatic changes - protect from inadvertent clicks if auto_changed: def update_file_operations(): for i in range(5): self.ind.trash.set_sensitive(deleteable) self.ind.copy_to_favorites.set_sensitive(favs_op in ("copy", "both")) self.ind.move_to_favorites.set_sensitive(favs_op in ("move", "both")) GObject.timeout_add(2000, update_file_operations) except Exception: logger.exception(lambda: "Error updating file info") def regular_change_thread(self): logger.info(lambda: "regular_change thread running") if self.options.change_on_start: self.change_event.wait(5) # wait for prepare thread to prepare some images first self.auto_changed = True self.change_wallpaper() while self.running: try: while ( not self.options.change_enabled or (time.time() - self.last_change_time) < self.options.change_interval ): if not self.running: return now = time.time() wait_more = self.options.change_interval - max(0.0, now - self.last_change_time) if self.options.change_enabled: self.change_event.wait(max(0, wait_more)) else: logger.info(lambda: "regular_change: waiting till user resumes") self.change_event.wait() self.change_event.clear() if not self.running: return if not self.options.change_enabled: continue logger.info(lambda: "regular_change changes wallpaper") self.auto_changed = True self.last_change_time = time.time() self.change_wallpaper() except Exception: logger.exception(lambda: "Exception in regular_change_thread") def clock_thread_method(self): logger.info(lambda: "clock thread running") last_minute = -1 while self.running: try: while not self.options.clock_enabled: self.clock_event.wait() self.clock_event.clear() if not self.running: return if not self.options.clock_enabled: continue time.sleep(1) minute = int(time.strftime("%M", time.localtime())) if minute != last_minute: logger.info(lambda: "clock_thread updates wallpaper") self.auto_changed = False self.refresh_clock() last_minute = minute except Exception: logger.exception(lambda: "Exception in clock_thread") def find_images(self): self.prepared_cleared = False images = self.select_random_images(100 if not self.options.safe_mode else 30) found = set() for fuzziness in range(0, 5): if len(found) > 10 or len(found) >= len(images): break for img in images: if not self.running or self.prepared_cleared: # abandon this search return try: if not img in found and self.image_ok(img, fuzziness): # print "OK at fz %d: %s" % (fuzziness, img) found.add(img) if len(self.prepared) < 3 and not self.prepared_cleared: with self.prepared_lock: self.prepared.append(img) except Exception: logger.exception(lambda: "Excepion while testing image_ok on file " + img) with self.prepared_lock: if self.prepared_cleared: # abandon this search return self.prepared.extend(found) if not self.prepared and images: logger.info( lambda: "Prepared buffer still empty after search, appending some non-ok image" ) self.prepared.append(images[random.randint(0, len(images) - 1)]) # remove duplicates self.prepared = list(set(self.prepared)) random.shuffle(self.prepared) if len(images) < 3 and self.has_real_downloaders(): self.trigger_download() if ( len(found) <= 5 and len(images) >= max(20, 10 * len(found)) and found.issubset(set(self.used[:10])) ): logger.warning( lambda: "Too few images found: %d out of %d. " "Please check the settings in 'Filtering'." % (len(found), len(images)) ) if not hasattr(self, "filters_warning_shown") or not self.filters_warning_shown: self.filters_warning_shown = True self.show_notification( _("Filtering too strict?"), _( "Variety is finding too few images that match your image filtering " 'criteria. Please check if the settings in "Filtering" are correct.' ), ) def prepare_thread(self): logger.info(lambda: "Prepare thread running") while self.running: try: logger.info(lambda: "Prepared buffer contains %s images" % len(self.prepared)) if self.image_count < 0 or len(self.prepared) <= min(10, self.image_count // 2): logger.info(lambda: "Preparing some images") self.find_images() if not self.running: return logger.info( lambda: "After search prepared buffer contains %s images" % len(self.prepared) ) # trigger download after some interval to reduce resource usage while the wallpaper changes delay_dl_timer = threading.Timer(2, self.trigger_download) delay_dl_timer.daemon = True delay_dl_timer.start() except Exception: logger.exception(lambda: "Error in prepare thread:") self.prepare_event.wait() self.prepare_event.clear() def server_options_thread(self): time.sleep(20) attempts = 0 while self.running: if not self.options.internet_enabled: time.sleep(3600) continue try: attempts += 1 logger.info( lambda: "Fetching server options from %s" % VarietyWindow.SERVERSIDE_OPTIONS_URL ) self.server_options = Util.fetch_json(VarietyWindow.SERVERSIDE_OPTIONS_URL) logger.info(lambda: "Fetched server options: %s" % str(self.server_options)) if self.preferences_dialog: self.preferences_dialog.update_status_message() if varietyconfig.get_version() in self.server_options.get("outdated_versions", []): self.show_notification("Version unsupported", OUTDATED_MSG) self.on_quit() except Exception: logger.exception(lambda: "Could not fetch Variety serverside options") if attempts < 5: # the first several attempts may easily fail if Variety is run on startup, try again soon: time.sleep(30) continue time.sleep(3600 * 24) # Update once daily def has_real_downloaders(self): return sum(1 for d in self.downloaders if not d.is_refresher()) > 0 def _unseen_downloads(self, state): return [f for f in state.get("unseen_downloads", []) if os.path.exists(f)] def download_thread(self): while self.running: try: available_downloaders = self._available_downloaders() if not available_downloaders: self.dl_event.wait(180) self.dl_event.clear() continue # download from the downloader with the smallest unseen queue downloader = sorted( available_downloaders, key=lambda dl: len(self._unseen_downloads(dl.state)) )[0] self.download_one_from(downloader) # Also refresh the images for all refreshers that haven't downloaded recently - # these need to be updated regularly for dl in available_downloaders: if dl.is_refresher() and dl != downloader: dl.download_one() # give some breathing room between downloads time.sleep(1) except Exception: logger.exception(lambda: "Exception in download_thread:") def _available_downloaders(self): if not self.options.internet_enabled: return [] now = time.time() return [ dl for dl in self.downloaders if dl.state.get("last_download_failure", 0) < now - 60 and (not dl.is_refresher() or dl.state.get("last_download_success", 0) < now - 60) and len(self._unseen_downloads(dl.state)) <= VarietyWindow.MAX_UNSEEN_PER_DOWNLOADER ] def trigger_download(self): logger.info(lambda: "Triggering download thread to check if download needed and possible") if getattr(self, "dl_event"): self.dl_event.set() def register_downloaded_file(self, file): self.refresh_thumbs_downloads(file) if file.startswith(self.options.download_folder) and self.download_folder_size is not None: self.download_folder_size += os.path.getsize(file) # every once in a while, check the Downloaded folder against the allowed quota if random.random() < 0.05: self.purge_downloaded() def download_one_from(self, downloader): try: file = downloader.download_one() except: logger.exception(lambda: "Could not download wallpaper:") file = None if file: self.register_downloaded_file(file) downloader.state["last_download_success"] = time.time() if downloader.is_refresher() or self.image_ok(file, 0): # give priority to newly-downloaded images - unseen_downloads are later # used with priority over self.prepared logger.info(lambda: "Adding downloaded file %s to unseen_downloads" % file) with self.prepared_lock: unseen = set(downloader.state.get("unseen_downloads", [])) unseen.add(file) downloader.state["unseen_downloads"] = [f for f in unseen if os.path.exists(f)] else: # image is not ok, but still notify prepare thread that there is a new image - # it might be "desperate" self.prepare_event.set() else: # register as download failure for this downloader downloader.state["last_download_failure"] = time.time() downloader.save_state() def purge_downloaded(self): if not self.options.quota_enabled: return # Check if we need to compute the download folder size - if it is uninitialized # or also every now and then to make sure it is in line with actual filesystem state. # This is a fast-enough operation. if self.download_folder_size is None or random.random() < 0.05: self.download_folder_size = Util.get_folder_size(self.real_download_folder) logger.info( lambda: "Refreshed download folder size: {} mb".format( self.download_folder_size / (1024.0 * 1024.0) ) ) mb_quota = self.options.quota_size * 1024 * 1024 if self.download_folder_size > 0.95 * mb_quota: logger.info( lambda: "Purging oldest files from download folder {}, current size: {} mb".format( self.real_download_folder, int(self.download_folder_size / (1024.0 * 1024.0)) ) ) files = [] for dirpath, dirnames, filenames in os.walk(self.real_download_folder): for f in filenames: if Util.is_image(f) or f.endswith(".partial"): fp = os.path.join(dirpath, f) files.append((fp, os.path.getsize(fp), os.path.getctime(fp))) files = sorted(files, key=lambda x: x[2]) i = 0 while i < len(files) and self.download_folder_size > 0.80 * mb_quota: file = files[i][0] if file != self.current: try: logger.debug(lambda: "Deleting old file in downloaded: {}".format(file)) self.remove_from_queues(file) Util.safe_unlink(file) self.download_folder_size -= files[i][1] Util.safe_unlink(file + ".metadata.json") except Exception: logger.exception( lambda: "Could not delete some file while purging download folder: {}".format( file ) ) i += 1 self.prepare_event.set() class RefreshLevel: ALL = 0 FILTERS_AND_TEXTS = 1 TEXTS = 2 CLOCK_ONLY = 3 def set_wp_throttled(self, filename, refresh_level=RefreshLevel.ALL): if not filename: logger.warning(lambda: "set_wp_throttled: No wallpaper to set") return self.thumbs_manager.mark_active(file=filename, position=self.position) def _do_set_wp(): self.do_set_wp(filename, refresh_level) threading.Timer(0, _do_set_wp).start() def build_imagemagick_filter_cmd(self, filename, target_file): if not self.filters: return None filter = random.choice(self.filters).strip() if not filter: return None w, h = Util.get_primary_display_size() cmd = "convert %s -scale %dx%d^ " % (shlex.quote(filename), w, h) logger.info(lambda: "Applying filter: " + filter) cmd += filter + " " cmd += shlex.quote(target_file) cmd = cmd.replace("%FILEPATH%", shlex.quote(filename)) cmd = cmd.replace("%FILENAME%", shlex.quote(os.path.basename(filename))) logger.info(lambda: "ImageMagick filter cmd: " + cmd) return cmd.encode("utf-8") def build_imagemagick_clock_cmd(self, filename, target_file): if not (self.options.clock_enabled and self.options.clock_filter.strip()): return None w, h = Util.get_primary_display_size() cmd = "convert %s -scale %dx%d^ " % (shlex.quote(filename), w, h) hoffset, voffset = Util.compute_trimmed_offsets(Util.get_size(filename), (w, h)) clock_filter = self.options.clock_filter clock_filter = VarietyWindow.replace_clock_filter_offsets(clock_filter, hoffset, voffset) clock_filter = self.replace_clock_filter_fonts(clock_filter) clock_filter = time.strftime( clock_filter, time.localtime() ) # this should always be called last logger.info(lambda: "Applying clock filter: " + clock_filter) cmd += clock_filter cmd += " " cmd += shlex.quote(target_file) logger.info(lambda: "ImageMagick clock cmd: " + cmd) return cmd.encode("utf-8") def replace_clock_filter_fonts(self, clock_filter): clock_font_name, clock_font_size = Util.gtk_to_fcmatch_font(self.options.clock_font) date_font_name, date_font_size = Util.gtk_to_fcmatch_font(self.options.clock_date_font) clock_filter = clock_filter.replace("%CLOCK_FONT_NAME", clock_font_name) clock_filter = clock_filter.replace("%CLOCK_FONT_SIZE", clock_font_size) clock_filter = clock_filter.replace("%DATE_FONT_NAME", date_font_name) clock_filter = clock_filter.replace("%DATE_FONT_SIZE", date_font_size) return clock_filter @staticmethod def replace_clock_filter_offsets(filter, hoffset, voffset): def hrepl(m): return str(hoffset + int(m.group(1))) def vrepl(m): return str(voffset + int(m.group(1))) filter = re.sub(r"\[\%HOFFSET\+(\d+)\]", hrepl, filter) filter = re.sub(r"\[\%VOFFSET\+(\d+)\]", vrepl, filter) return filter def refresh_wallpaper(self): self.set_wp_throttled( self.current, refresh_level=VarietyWindow.RefreshLevel.FILTERS_AND_TEXTS ) def refresh_clock(self): self.set_wp_throttled(self.current, refresh_level=VarietyWindow.RefreshLevel.CLOCK_ONLY) def refresh_texts(self): self.set_wp_throttled(self.current, refresh_level=VarietyWindow.RefreshLevel.TEXTS) def write_filtered_wallpaper_origin(self, filename): if not filename: return try: with open( os.path.join(self.wallpaper_folder, "wallpaper.jpg.txt"), "w", encoding="utf8" ) as f: f.write(filename) except Exception: logger.exception(lambda: "Cannot write wallpaper.jpg.txt") def apply_filters(self, to_set, refresh_level): try: if self.filters: # don't run the filter command when the refresh level is clock or quotes only, # use the previous filtered image otherwise if ( refresh_level in [ VarietyWindow.RefreshLevel.ALL, VarietyWindow.RefreshLevel.FILTERS_AND_TEXTS, ] or not self.post_filter_filename ): self.post_filter_filename = to_set target_file = os.path.join( self.wallpaper_folder, "wallpaper-filter-%s.jpg" % Util.random_hash() ) cmd = self.build_imagemagick_filter_cmd(to_set, target_file) if cmd: result = os.system(cmd) if result == 0: # success to_set = target_file self.post_filter_filename = to_set else: logger.warning( lambda: "Could not execute filter convert command. " "Missing ImageMagick or bad filter defined? Resultcode: %d" % result ) else: to_set = self.post_filter_filename return to_set except Exception: logger.exception(lambda: "Could not apply filters:") return to_set def apply_auto_rotate(self, to_set): try: if self.options.wallpaper_auto_rotate: target_file = os.path.join( self.wallpaper_folder, "wallpaper-auto-rotated-%s.jpg" % Util.random_hash() ) cmd = "convert %s -auto-orient %s" % (shlex.quote(to_set), shlex.quote(target_file)) logger.info(lambda: "ImageMagick auto-rotate cmd: " + cmd) cmd = cmd.encode("utf-8") result = os.system(cmd) if result == 0: # success to_set = target_file else: logger.warning( lambda: "Could not execute auto-orient convert command. " "Missing ImageMagick? Resultcode: %d" % result ) return to_set except Exception: logger.exception(lambda: "Could not apply auto-orient:") return to_set def get_display_modes(self) -> List[DisplayMode]: if not hasattr(self, "display_modes_cache"): modes = [] for plugin in self.jumble.get_plugins(clazz=IDisplayModesPlugin): for m in plugin["plugin"].display_modes(): modes.append((m, plugin["plugin"].order())) modes.sort(key=lambda m: m[1]) self.display_modes_cache = [m[0] for m in modes] return getattr(self, "display_modes_cache") def apply_display_mode(self, to_set): try: mode = "os" modes = [ x for x in self.get_display_modes() if x.id == self.options.wallpaper_display_mode ] if modes: mode_data = modes[0].fn(to_set) if mode_data.fixed_image_path: return mode_data.fixed_image_path, mode_data.set_wallpaper_param elif not mode_data.imagemagick_cmd: return to_set, mode_data.set_wallpaper_param else: target_file = os.path.join( self.wallpaper_folder, "wallpaper-zoomed-%s.jpg" % Util.random_hash() ) cmd = "convert %s %s %s" % ( shlex.quote(to_set), mode_data.imagemagick_cmd, shlex.quote(target_file), ) logger.info(lambda: "ImageMagick display mode cmd: " + cmd) cmd = cmd.encode("utf-8") result = os.system(cmd) if result == 0: # success return target_file, mode else: logger.warning( lambda: "Could not execute auto-orient convert command. " "Missing ImageMagick? Resultcode: %d" % result ) return to_set, "os" return to_set, mode except Exception: logger.exception(lambda: "Could not apply display mode logic:") return to_set def apply_quote(self, to_set): try: if self.options.quotes_enabled and self.quote: quote_outfile = os.path.join( self.wallpaper_folder, "wallpaper-quote-%s.jpg" % Util.random_hash() ) QuoteWriter.write_quote( self.quote["quote"], self.quote.get("author", None), to_set, quote_outfile, self.options, ) to_set = quote_outfile return to_set except Exception: logger.exception(lambda: "Could not apply quote:") return to_set def apply_clock(self, to_set): try: if self.options.clock_enabled: target_file = os.path.join( self.wallpaper_folder, "wallpaper-clock-%s.jpg" % Util.random_hash() ) cmd = self.build_imagemagick_clock_cmd(to_set, target_file) result = os.system(cmd) if result == 0: # success to_set = target_file else: logger.warning( lambda: "Could not execute clock convert command. " "Missing ImageMagick or bad filter defined? Resultcode: %d" % result ) return to_set except Exception: logger.exception(lambda: "Could not apply clock:") return to_set def apply_copyto_operation(self, to_set): if self.options.copyto_enabled: folder = self.get_actual_copyto_folder() target_fname = "variety-copied-wallpaper-%s%s" % ( Util.random_hash(), os.path.splitext(to_set)[1], ) target_file = os.path.join(folder, target_fname) self.cleanup_old_wallpapers(folder, "variety-copied-wallpaper") try: shutil.copy(to_set, target_file) os.chmod( target_file, 0o644 ) # Read permissions for everyone, write - for the current user to_set = target_file except Exception: logger.exception( lambda: "Could not copy file %s to copyto folder %s. " "Using it from original locations, so LightDM might not be able to use it." % (to_set, folder) ) return to_set def get_actual_copyto_folder(self, option=None): option = option or self.options.copyto_folder if option == "Default": return ( Util.get_xdg_pictures_folder() if not Util.is_home_encrypted() else "/usr/share/backgrounds" ) else: return os.path.normpath(option) @throttle(seconds=1, trailing_call=True) def do_set_wp(self, filename, refresh_level=RefreshLevel.ALL): logger.info(lambda: "Calling do_set_wp with %s, time: %s" % (filename, time.time())) with self.do_set_wp_lock: try: if not os.access(filename, os.R_OK): logger.info( lambda: "Missing file or bad permissions, will not use it: " + filename ) return self.write_filtered_wallpaper_origin(filename) if filename != self.no_effects_on: self.no_effects_on = None should_apply_effects = True else: should_apply_effects = False to_set = filename to_set = self.apply_auto_rotate(to_set) if should_apply_effects: to_set = self.apply_filters(to_set, refresh_level) to_set, display_mode_param = self.apply_display_mode(to_set) if should_apply_effects: to_set = self.apply_quote(to_set) to_set = self.apply_clock(to_set) to_set = self.apply_copyto_operation(to_set) self.cleanup_old_wallpapers(self.wallpaper_folder, "wallpaper-", to_set) def _update_inidicator(): self.update_indicator(filename) Util.add_mainloop_task(_update_inidicator) self.set_desktop_wallpaper(to_set, filename, refresh_level, display_mode_param) self.current = filename if self.options.icon == "Current" and self.current: def _set_icon_to_current(): if self.ind: self.ind.set_icon(self.current) Util.add_mainloop_task(_set_icon_to_current) if refresh_level == VarietyWindow.RefreshLevel.ALL: self.last_change_time = time.time() self.save_last_change_time() self.save_history() except Exception: logger.exception(lambda: "Error while setting wallpaper") def select_random_images(self, count): all_images = list( Util.list_files(self.individual_images, self.folders, Util.is_image, max_files=10000) ) self.image_count = len(all_images) # add just the first image of each album to the selection, # otherwise albums will get an enormous part of the screentime, as they act as # "black holes" - once we start them, we stay there until done for album in self.albums: all_images.append(album["images"][0]) random.shuffle(all_images) return all_images[:count] def on_indicator_scroll(self, indicator, steps, direction): if direction in (Gdk.ScrollDirection.DOWN, Gdk.ScrollDirection.UP): self.recent_scroll_actions = getattr(self, "recent_scroll_actions", []) self.recent_scroll_actions = [ a for a in self.recent_scroll_actions if a[0] > time.time() - 0.3 ] self.recent_scroll_actions.append((time.time(), steps, direction)) count_up = sum( a[1] for a in self.recent_scroll_actions if a[2] == Gdk.ScrollDirection.UP ) count_down = sum( a[1] for a in self.recent_scroll_actions if a[2] == Gdk.ScrollDirection.DOWN ) self.on_indicator_scroll_throttled( Gdk.ScrollDirection.UP if count_up > count_down else Gdk.ScrollDirection.DOWN ) @debounce(seconds=0.3) def on_indicator_scroll_throttled(self, direction): if direction == Gdk.ScrollDirection.DOWN: self.next_wallpaper(widget=self) else: self.prev_wallpaper(widget=self) def prev_wallpaper(self, widget=None): self.auto_changed = widget is None if self.quotes_engine and self.options.quotes_enabled: self.quote = self.quotes_engine.prev_quote() if self.position >= len(self.used) - 1: return else: self.position += 1 self.set_wp_throttled(self.used[self.position]) def next_wallpaper(self, widget=None, bypass_history=False): self.auto_changed = widget is None if self.position > 0 and not bypass_history: if self.quotes_engine and self.options.quotes_enabled: self.quote = self.quotes_engine.next_quote() self.position -= 1 self.set_wp_throttled(self.used[self.position]) else: if bypass_history: self.position = 0 if self.quotes_engine and self.options.quotes_enabled: self.quotes_engine.bypass_history() self.change_wallpaper() def next_image_same_quote(self, widget=None): if self.position > 0: self.position -= 1 self.set_wp_throttled(self.used[self.position]) else: self.change_wallpaper(keep_quote=True) def move_to_history_position(self, position): if 0 <= position < len(self.used): self.auto_changed = False self.position = position self.set_wp_throttled(self.used[self.position]) else: logger.warning( lambda: "Invalid position passed to move_to_history_position, %d, used len is %d" % (position, len(self.used)) ) def show_notification(self, title, message="", icon=None, important=False): if not icon: icon = varietyconfig.get_data_file("media", "variety.svg") if not important: try: self.notification.update(title, message, icon) except AttributeError: self.notification = Notify.Notification.new(title, message, icon) self.notification.set_urgency(Notify.Urgency.LOW) self.notification.show() else: # use a separate notification that will not be updated with a non-important message notification = Notify.Notification.new(title, message, icon) notification.set_urgency(Notify.Urgency.NORMAL) notification.show() def _has_local_sources(self): return ( sum(1 for s in self.options.sources if s[0] and s[1] in Options.SourceType.LOCAL_TYPES) > 0 ) def change_wallpaper(self, widget=None, keep_quote=False): try: img = None # check if current is part of an album, and show next image in the album if self.current: for album in self.albums: if os.path.normpath(self.current).startswith(album["path"]): index = album["images"].index(self.current) if 0 <= index < len(album["images"]) - 1: img = album["images"][index + 1] break if not img: with self.prepared_lock: # with some big probability, use one of the unseen_downloads if random.random() < self.options.download_preference_ratio: enabled_unseen_downloads = self._enabled_unseen_downloads() if enabled_unseen_downloads: unseen = random.choice(list(enabled_unseen_downloads)) self.prepared.insert(0, unseen) for prep in self.prepared: if prep != self.current and os.access(prep, os.R_OK): img = prep try: self.prepared.remove(img) except ValueError: pass self.prepare_event.set() break if not img: logger.info(lambda: "No images yet in prepared buffer, using some random image") self.prepare_event.set() rnd_images = self.select_random_images(3) rnd_images = [ f for f in rnd_images if f != self.current or self.is_current_refreshable() ] img = rnd_images[0] if rnd_images else None if not img: logger.info(lambda: "No images found") if not self.auto_changed: if self.has_real_downloaders(): msg = _("Please add more image sources or wait for some downloads") else: msg = _("Please add more image sources") self.show_notification(_("No more wallpapers"), msg) return if self.quotes_engine and self.options.quotes_enabled and not keep_quote: self.quote = self.quotes_engine.change_quote() self.set_wallpaper(img, auto_changed=self.auto_changed) except Exception: logger.exception(lambda: "Could not change wallpaper") def _enabled_unseen_downloads(self): # collect the unseen_downloads from the currently enabled downloaders: enabled_unseen_downloads = set() for dl in self.downloaders: for file in self._unseen_downloads(dl.state): enabled_unseen_downloads.add(file) return enabled_unseen_downloads def _remove_from_unseen(self, file): for dl in self.downloaders: unseen = set(dl.state.get("unseen_downloads", [])) if file in unseen: unseen.remove(file) dl.state["unseen_downloads"] = [f for f in unseen if os.path.exists(f)] dl.save_state() # trigger download after some interval to reduce resource usage while # the wallpaper changes delay_dl_timer = threading.Timer(2, self.trigger_download) delay_dl_timer.daemon = True delay_dl_timer.start() def set_wallpaper(self, img, auto_changed=False): logger.info(lambda: "Calling set_wallpaper with " + img) if img == self.current and not self.is_current_refreshable(): return if os.access(img, os.R_OK): at_front = self.position == 0 self.used = self.used[self.position :] if len(self.used) == 0 or self.used[0] != img: self.used.insert(0, img) self.refresh_thumbs_history(img, at_front) self.position = 0 if len(self.used) > 1000: self.used = self.used[:1000] self._remove_from_unseen(img) self.auto_changed = auto_changed self.last_change_time = time.time() self.set_wp_throttled(img) # Unsplash API requires that we call their download endpoint # when setting the wallpaper, not when queueing it: meta = Util.read_metadata(img) if meta and "sourceType" in meta: for image_source in Options.IMAGE_SOURCES: if image_source.get_source_type() == meta["sourceType"]: def _do_hook(): image_source.on_image_set_as_wallpaper(img, meta) threading.Timer(0, _do_hook).start() else: logger.warning(lambda: "set_wallpaper called with unaccessible image " + img) def refresh_thumbs_history(self, added_image, at_front=False): if self.thumbs_manager.is_showing("history"): def _add(): if at_front: self.thumbs_manager.add_image(added_image) else: self.thumbs_manager.show(self.used, type="history") self.thumbs_manager.pin() add_timer = threading.Timer(0, _add) add_timer.start() def refresh_thumbs_downloads(self, added_image): self.update_indicator(auto_changed=False) should_show = added_image not in self.thumbs_manager.images and ( self.thumbs_manager.is_showing("downloads") or ( self.thumbs_manager.get_folders() is not None and sum( 1 for f in self.thumbs_manager.get_folders() if Util.file_in(added_image, f) ) > 0 ) ) if should_show: def _add(): self.thumbs_manager.add_image(added_image) add_timer = threading.Timer(0, _add) add_timer.start() def on_rating_changed(self, file): with self.prepared_lock: self.prepared = [f for f in self.prepared if f != file] self.prepare_event.set() self.update_indicator(auto_changed=False) def image_ok(self, img, fuzziness): try: if Util.is_animated_gif(img): return False if self.options.min_rating_enabled: rating = Util.get_rating(img) if rating is None or rating <= 0 or rating < self.options.min_rating: return False if self.options.name_regex_enabled: if re.fullmatch(self.options.name_regex, os.path.basename(img)) is None: return False if self.options.use_landscape_enabled or self.options.min_size_enabled: if img in self.image_colors_cache: width = self.image_colors_cache[img][3] height = self.image_colors_cache[img][4] else: width, height = Util.get_size(img) if not self.size_ok(width, height, fuzziness): return False if self.options.desired_color_enabled or self.options.lightness_enabled: if not img in self.image_colors_cache: dom = DominantColors(img, False) self.image_colors_cache[img] = dom.get_dominant_colors() colors = self.image_colors_cache[img] if self.options.lightness_enabled: lightness = colors[2] if self.options.lightness_mode == Options.LightnessMode.DARK: if lightness >= 75 + fuzziness * 6: return False elif self.options.lightness_mode == Options.LightnessMode.LIGHT: if lightness <= 180 - fuzziness * 6: return False else: logger.warning( lambda: "Unknown lightness mode: %d", self.options.lightness_mode ) if ( self.options.desired_color_enabled and self.options.desired_color and not DominantColors.contains_color( colors, self.options.desired_color, fuzziness + 2 ) ): return False if self.options.safe_mode: try: info = Util.read_metadata(img) if info.get("sfwRating", 100) < 100: return False blacklisted = ( set(k.lower() for k in info.get("keywords", [])) & SAFE_MODE_BLACKLIST ) if len(blacklisted) > 0: return False except Exception: pass return True except Exception: logger.warning(lambda: "Error in image_ok for file %s" % img) return False def size_ok(self, width, height, fuzziness=0): ok = True if self.options.min_size_enabled: ok = ok and width >= self.min_width - fuzziness * 100 ok = ok and height >= self.min_height - fuzziness * 70 if self.options.use_landscape_enabled: ok = ok and width > height return ok def open_folder(self, widget=None, file=None): if not file: file = self.current if file: subprocess.Popen(["xdg-open", os.path.dirname(file)]) def open_file(self, widget=None, file=None): if not file: file = self.current if file: subprocess.Popen(["xdg-open", os.path.realpath(file)]) def on_show_origin(self, widget=None): if self.url: logger.info(lambda: "Opening url: " + self.url) webbrowser.open_new_tab(self.url) else: self.open_folder() def on_show_author(self, widget=None): if hasattr(self, "author_url") and self.author_url: logger.info(lambda: "Opening url: " + self.author_url) webbrowser.open_new_tab(self.author_url) def get_source(self, file=None): if not file: file = self.current if not file: return None prioritized_sources = [] prioritized_sources.extend( s for s in self.options.sources if s[0] and s[1] == Options.SourceType.IMAGE ) prioritized_sources.extend( s for s in self.options.sources if s[0] and s[1] == Options.SourceType.FOLDER ) prioritized_sources.extend( s for s in self.options.sources if s[0] and s[1] in Options.get_downloader_source_types() ) prioritized_sources.extend( s for s in self.options.sources if s[0] and s[1] == Options.SourceType.FETCHED ) prioritized_sources.extend( s for s in self.options.sources if s[0] and s[1] == Options.SourceType.FAVORITES ) prioritized_sources.extend(s for s in self.options.sources if s not in prioritized_sources) if len(prioritized_sources) != len(self.options.sources): logger.error( lambda: "len(prioritized_sources) != len(self.options.sources): %d, %d, %s, %s" % ( len(prioritized_sources), len(self.options.sources), prioritized_sources, self.options.sources, ) ) file_normpath = os.path.normpath(file) for s in prioritized_sources: try: if s[1] == Options.SourceType.IMAGE: if os.path.normpath(s[2]) == file_normpath: return s elif file_normpath.startswith(Util.folderpath(self.get_folder_of_source(s))): return s except Exception: # probably exception while creating the downloader, ignore, continue searching pass return None def focus_in_preferences(self, widget=None, file=None): if not file: file = self.current source = self.get_source(file) if source is None: self.show_notification(_("Current wallpaper is not in the image sources")) else: self.on_mnu_preferences_activate() self.get_preferences_dialog().focus_source_and_image(source, file) def move_or_copy_file(self, file, to, to_name, operation): is_move = operation == shutil.move try: if file != to: operation(file, to) try: operation(file + ".metadata.json", to) except Exception: pass logger.info(lambda: ("Moved %s to %s" if is_move else "Copied %s to %s") % (file, to)) # self.show_notification(("Moved %s to %s" if is_move else "Copied %s to %s") % (os.path.basename(file), to_name)) return True except Exception as err: if str(err).find("already exists") > 0: if operation == shutil.move: try: os.unlink(file) # self.show_notification(op, op + " " + os.path.basename(file) + " to " + to_name) return True except Exception: logger.exception(lambda: "Cannot unlink " + file) else: return True logger.exception(lambda: "Could not move/copy to " + to) if is_move: msg = ( _( "Could not move to %s. You probably don't have permissions to move this file." ) % to ) else: msg = ( _( "Could not copy to %s. You probably don't have permissions to copy this file." ) % to ) dialog = Gtk.MessageDialog( self, Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, msg ) self.dialogs.append(dialog) dialog.set_title("Move failed" if is_move else "Copy failed") dialog.run() dialog.destroy() self.dialogs.remove(dialog) return False def move_to_trash(self, widget=None, file=None): try: if not file: file = self.current if not file: return if self.url: self.ban_url(self.url) if not os.access(file, os.W_OK): self.show_notification( _("Cannot delete"), _("You don't have permissions to delete %s to Trash.") % file, ) else: if self.current == file: self.next_wallpaper(widget) self.remove_from_queues(file) self.prepare_event.set() self.thumbs_manager.remove_image(file) def _go(): try: gio_file = Gio.File.new_for_path(file) ok = gio_file.trash() except: logger.exception("Gio.File.trash failed with exception") ok = False if not ok: logger.error("Gio.File.trash failed") self.show_notification( _("Cannot delete"), _("Deleting to trash failed, check variety.log for more information."), ) Util.add_mainloop_task(_go) except Exception: logger.exception(lambda: "Exception in move_to_trash") def ban_url(self, url): try: self.banned.add(url) with open(os.path.join(self.config_folder, "banned.txt"), "a", encoding="utf8") as f: f.write(url + "\n") except Exception: logger.exception(lambda: "Could not ban URL") def remove_from_queues(self, file): self.position = max( 0, self.position - sum(1 for f in self.used[: self.position] if f == file) ) self.used = [f for f in self.used if f != file] self._remove_from_unseen(file) with self.prepared_lock: self.prepared = [f for f in self.prepared if f != file] def remove_folder_from_queues(self, folder): self.position = max( 0, self.position - sum(1 for f in self.used[: self.position] if Util.file_in(f, folder)) ) self.used = [f for f in self.used if not Util.file_in(f, folder)] with self.prepared_lock: self.prepared = [f for f in self.prepared if not Util.file_in(f, folder)] def copy_to_favorites(self, widget=None, file=None): try: if not file: file = self.current if not file: return if os.access(file, os.R_OK) and not self.is_in_favorites(file): self.move_or_copy_file( file, self.options.favorites_folder, "favorites", shutil.copy ) self.update_indicator(auto_changed=False) self.report_image_favorited(file) except Exception: logger.exception(lambda: "Exception in copy_to_favorites") def move_to_favorites(self, widget=None, file=None): try: if not file: file = self.current if not file: return if os.access(file, os.R_OK) and not self.is_in_favorites(file): operation = shutil.move if os.access(file, os.W_OK) else shutil.copy ok = self.move_or_copy_file( file, self.options.favorites_folder, "favorites", operation ) if ok: new_file = os.path.join(self.options.favorites_folder, os.path.basename(file)) self.used = [(new_file if f == file else f) for f in self.used] with self.prepared_lock: self.prepared = [(new_file if f == file else f) for f in self.prepared] self.prepare_event.set() if self.current == file: self.current = new_file if self.no_effects_on == file: self.no_effects_on = new_file self.set_wp_throttled(new_file) self.report_image_favorited(new_file) except Exception: logger.exception(lambda: "Exception in move_to_favorites") def report_image_favorited(self, img): meta = Util.read_metadata(img) if meta and "sourceType" in meta: for image_source in Options.IMAGE_SOURCES: if image_source.get_source_type() == meta["sourceType"]: def _do_hook(): image_source.on_image_favorited(img, meta) threading.Timer(0, _do_hook).start() def determine_favorites_operation(self, file=None): if not file: file = self.current if not file: return None if self.is_in_favorites(file): return "favorite" if not os.access(file, os.W_OK): return "copy" file_normpath = os.path.normpath(file) for pair in self.options.favorites_operations: folder = pair[0] folder_lower = folder.lower().strip() if folder_lower == "downloaded": folder = self.real_download_folder elif folder_lower == "fetched": folder = self.options.fetched_folder elif folder_lower == "others": folder = "/" folder = Util.folderpath(folder) if file_normpath.startswith(folder): op = pair[1].lower().strip() return op if op in ("copy", "move", "both") else "copy" return "copy" @on_gtk def on_quit(self, widget=None): logger.info(lambda: "Quitting") if self.running: self.running = False logger.debug(lambda: "Trying to destroy all dialogs") for d in self.dialogs + [self.preferences_dialog, self.about]: logger.debug(lambda: "Trying to destroy dialog %s" % d) try: if d: d.destroy() except Exception: logger.exception(lambda: "Could not destroy dialog") for e in self.events: e.set() try: if self.quotes_engine: logger.debug(lambda: "Trying to stop quotes engine") self.quotes_engine.quit() except Exception: logger.exception(lambda: "Could not stop quotes engine") if self.options.clock_enabled or self.options.quotes_enabled: self.options.clock_enabled = False self.options.quotes_enabled = False if self.current: logger.debug(lambda: "Cleaning up clock & quotes") self.do_set_wp(self.current, VarietyWindow.RefreshLevel.TEXTS) Util.start_force_exit_thread(15) logger.debug(lambda: "OK, waiting for other loops to finish") logger.debug(lambda: "Remaining threads: ") for t in threading.enumerate(): logger.debug(lambda: "%s, %s" % (t.name, getattr(t, "_Thread__target", None))) Util.add_mainloop_task(Gtk.main_quit) @on_gtk def first_run(self, fr_file): if not self.running: return with open(fr_file, "w") as f: f.write(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) self.create_autostart_entry() self.on_mnu_preferences_activate() def write_current_version(self): current_version = varietyconfig.get_version() logger.info(lambda: "Writing current version %s to .version" % current_version) with open(os.path.join(self.config_folder, ".version"), "w") as f: f.write(current_version) def perform_upgrade(self): try: current_version = varietyconfig.get_version() if not os.path.exists(os.path.join(self.config_folder, ".firstrun")): # running for the first time last_version = current_version self.write_current_version() else: try: with open(os.path.join(self.config_folder, ".version")) as f: last_version = f.read().strip() except Exception: last_version = ( "0.4.12" # this is the last release that did not have the .version file ) logger.info( lambda: "Last run version was %s or earlier, current version is %s" % (last_version, current_version) ) if Util.compare_versions(last_version, "0.4.13") < 0: logger.info(lambda: "Performing upgrade to 0.4.13") try: # mark the current download folder as a valid download folder options = Options() options.read() logger.info( lambda: "Writing %s to current download folder %s" % (DL_FOLDER_FILE, options.download_folder) ) Util.makedirs(options.download_folder) dl_folder_file = os.path.join(options.download_folder, DL_FOLDER_FILE) if not os.path.exists(dl_folder_file): with open(dl_folder_file, "w") as f: f.write(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) except Exception: logger.exception( lambda: "Could not create %s in download folder" % DL_FOLDER_FILE ) if Util.compare_versions(last_version, "0.4.14") < 0: logger.info(lambda: "Performing upgrade to 0.4.14") # Current wallpaper is now stored in wallpaper subfolder, remove old artefacts: walltxt = os.path.join(self.config_folder, "wallpaper.jpg.txt") if os.path.exists(walltxt): try: logger.info(lambda: "Moving %s to %s" % (walltxt, self.wallpaper_folder)) shutil.move(walltxt, self.wallpaper_folder) except Exception: logger.exception(lambda: "Could not move wallpaper.jpg.txt") for suffix in ("filter", "clock", "quote"): file = os.path.join(self.config_folder, "wallpaper-%s.jpg" % suffix) if os.path.exists(file): logger.info(lambda: "Deleting unneeded file " + file) Util.safe_unlink(file) if Util.compare_versions(last_version, "0.8.0") < 0: logger.info(lambda: "Performing upgrade to 0.8.0") options = Options() options.read() for source in options.sources: source[2] = source[2].replace("alpha.wallhaven.cc", "wallhaven.cc") options.write() if Util.compare_versions(last_version, "0.8.2") < 0: logger.info(lambda: "Performing upgrade to 0.8.2") options = Options() options.read() if not "Urban Dictionary" in options.quotes_disabled_sources: options.quotes_disabled_sources.append("Urban Dictionary") options.write() if Util.compare_versions(last_version, "0.8.3") < 0: logger.info(lambda: "Performing upgrade to 0.8.3") options = Options() options.read() options.sources = [source for source in options.sources if source[1] != "earth"] options.write() # Perform on every upgrade to an newer version: if Util.compare_versions(last_version, current_version) < 0: self.write_current_version() # Upgrade set and get_wallpaper scripts def upgrade_script(script): try: script_file = os.path.join(self.scripts_folder, script) bundled_script_file = varietyconfig.get_data_file("scripts", script) logger.info( lambda: "Upgrading %s file, copying it from %s" % (script, bundled_script_file) ) if os.path.exists(script_file): backup_script_file = os.path.join( self.scripts_folder, script + "_before_" + varietyconfig.get_version(), ) logger.info( lambda: "Old script file is preserved as %s" % backup_script_file ) shutil.copy(script_file, backup_script_file) shutil.copy( varietyconfig.get_data_file("scripts", script), self.scripts_folder ) except Exception: logger.exception(lambda: "Could not upgrade script " + script) upgrade_script("set_wallpaper") upgrade_script("get_wallpaper") self.show_notification( _("Upgraded scripts"), _( "If you had customized scripts for Variety, " "please see Preferences -> Changelog" ), ) # Upgrade the autostart entry, if there is one if os.path.exists(get_autostart_file_path()): logger.info(lambda: "Updating Variety autostart desktop entry") self.create_autostart_entry() except Exception: logger.exception(lambda: "Error during version upgrade. Continuing.") def show_welcome_dialog(self): dialog = WelcomeDialog() def _on_continue(button): dialog.destroy() self.dialogs.remove(dialog) dialog.ui.continue_button.connect("clicked", _on_continue) self.dialogs.append(dialog) dialog.run() dialog.destroy() def show_privacy_dialog(self): dialog = PrivacyNoticeDialog() def _on_accept(*args): dialog.destroy() self.dialogs.remove(dialog) def _on_close(*args): # At this point we shouldn't have much to clean up yet! sys.exit(1) dialog.ui.accept_button.connect("clicked", _on_accept) dialog.ui.reject_button.connect("clicked", _on_close) dialog.connect("delete-event", _on_close) dialog.ui.accept_button.grab_focus() self.dialogs.append(dialog) dialog.run() return dialog.ui.internet_enabled.get_active() def edit_prefs_file(self, widget=None): dialog = Gtk.MessageDialog( self, Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, _( "I will open an editor with the config file and apply the changes after you save and close the editor." ), ) self.dialogs.append(dialog) dialog.set_title("Edit config file") dialog.run() dialog.destroy() self.dialogs.remove(dialog) subprocess.call(["gedit", os.path.join(self.config_folder, "variety.conf")]) self.reload_config() def on_pause_resume(self, widget=None, change_enabled=None): if change_enabled is None: self.options.change_enabled = not self.options.change_enabled else: self.options.change_enabled = change_enabled if self.preferences_dialog: self.preferences_dialog.ui.change_enabled.set_active(self.options.change_enabled) self.options.write() self.update_indicator(auto_changed=False) self.change_event.set() def process_command(self, arguments, initial_run): try: arguments = [str(arg) for arg in arguments] logger.info(lambda: "Received command: " + str(arguments)) options, args = parse_options(arguments, report_errors=False) if options.quit: self.on_quit() return if args: logger.info(lambda: "Treating free arguments as urls: " + str(args)) if not initial_run: self.process_urls(args) else: def _process_urls(): self.process_urls(args) GObject.timeout_add(5000, _process_urls) if options.set_options: try: Options.set_options(options.set_options) if not initial_run: self.reload_config() except Exception: logger.exception(lambda: "Could not read/write configuration:") def _process_command(): if not initial_run: if options.trash: self.move_to_trash() elif options.favorite: self.copy_to_favorites() elif options.movefavorite: self.move_to_favorites() if options.set_wallpaper: self.set_wallpaper(options.set_wallpaper) elif options.fast_forward: self.next_wallpaper(bypass_history=True) elif options.next: self.next_wallpaper() elif options.previous: self.prev_wallpaper() if options.pause: self.on_pause_resume(change_enabled=False) elif options.resume: self.on_pause_resume(change_enabled=True) elif options.toggle_pause: self.on_pause_resume() if options.toggle_no_effects: self.toggle_no_effects(not bool(self.no_effects_on)) if options.history: self.show_hide_history() if options.downloads: self.show_hide_downloads() if options.selector: self.show_hide_wallpaper_selector() if options.preferences: self.on_mnu_preferences_activate() if options.quotes_fast_forward: self.next_quote(bypass_history=True) elif options.quotes_next: self.next_quote() elif options.quotes_previous: self.prev_quote() if options.quotes_toggle_pause: self.on_quotes_pause_resume() if options.quotes_save_favorite: self.quote_save_to_favorites() GObject.timeout_add(3000 if initial_run else 1, _process_command) return self.current if options.show_current else "" except Exception: logger.exception(lambda: "Could not process passed command") @on_gtk def update_indicator_icon(self): if self.options.icon != "None": if self.ind is None: logger.info(lambda: "Creating indicator") self.ind, self.indicator, self.status_icon = indicator.new_application_indicator( self ) else: self.ind.set_visible(True) if self.options.icon == "Current": self.ind.set_icon(self.current) else: self.ind.set_icon(self.options.icon) else: if self.ind is not None: self.ind.set_visible(False) def process_urls(self, urls, verbose=True): def fetch(): try: Util.makedirs(self.options.fetched_folder) for url in urls: if not self.running: return if url.startswith(("variety://", "vrty://")): self.process_variety_url(url) continue is_local = os.path.exists(url) if is_local: if not (os.path.isfile(url) and Util.is_image(url)): self.show_notification(_("Not an image"), url) continue file = url local_name = os.path.basename(file) self.show_notification( _("Added to queue"), local_name + "\n" + _("Press Next to see it"), icon=file, ) else: file = ImageFetcher.fetch( url, self.options.fetched_folder, progress_reporter=self.show_notification, verbose=verbose, ) if file: self.show_notification( _("Fetched"), os.path.basename(file) + "\n" + _("Press Next to see it"), icon=file, ) if file: self.register_downloaded_file(file) with self.prepared_lock: logger.info( lambda: "Adding fetched file %s to used queue immediately after current file" % file ) try: if self.used[self.position] != file and ( self.position <= 0 or self.used[self.position - 1] != file ): at_front = self.position == 0 self.used.insert(self.position, file) self.position += 1 self.thumbs_manager.mark_active( file=self.used[self.position], position=self.position ) self.refresh_thumbs_history(file, at_front) except IndexError: self.used.insert(self.position, file) self.position += 1 except Exception: logger.exception(lambda: "Exception in process_urls") fetch_thread = threading.Thread(target=fetch) fetch_thread.daemon = True fetch_thread.start() def process_variety_url(self, url): try: logger.info(lambda: "Processing variety url %s" % url) # make the url urlparse-friendly: url = url.replace("variety://", "http://") url = url.replace("vrty://", "http://") parts = urllib.parse.urlparse(url) command = parts.netloc args = urllib.parse.parse_qs(parts.query) if command == "add-source": source_type = args["type"][0].lower() if not source_type in Options.get_all_supported_source_types(): self.show_notification( _("Unsupported source type"), _("Are you running the most recent version of Variety?"), ) return def _add(): newly_added = self.preferences_dialog.add_sources( source_type, [args["location"][0]] ) self.preferences_dialog.delayed_apply() if newly_added == 1: self.show_notification(_("New image source added")) else: self.show_notification(_("Image source already exists, enabling it")) Util.add_mainloop_task(_add) elif command == "set-wallpaper": image_url = args["image_url"][0] origin_url = args["origin_url"][0] source_type = args.get("source_type", [None])[0] source_location = args.get("source_location", [None])[0] source_name = args.get("source_name", [None])[0] extra_metadata = {} image = ImageFetcher.fetch( image_url, self.options.fetched_folder, origin_url=origin_url, source_type=source_type, source_location=source_location, source_name=source_name, extra_metadata=extra_metadata, progress_reporter=self.show_notification, verbose=True, ) if image: self.register_downloaded_file(image) self.show_notification( _("Fetched and applied"), os.path.basename(image), icon=image ) self.set_wallpaper(image, False) elif command == "test-variety-link": self.show_notification(_("It works!"), _("Yay, Variety links work. Great!")) else: self.show_notification( _("Unsupported command"), _("Are you running the most recent version of Variety?"), ) except: self.show_notification( _("Could not process the given variety:// URL"), _("Run with logging enabled to see details"), ) logger.exception(lambda: "Exception in process_variety_url") def get_desktop_wallpaper(self): try: script = self.options.get_wallpaper_script file = None if os.access(script, os.X_OK): logger.debug(lambda: "Running get_wallpaper script") try: output = subprocess.check_output(script).decode().strip() if output: file = output except subprocess.CalledProcessError: logger.exception(lambda: "Exception when calling get_wallpaper script") else: logger.warning( lambda: "get_wallpaper script is missing or not executable: " + script ) if not file and self.gsettings: file = self.gsettings.get_string("picture-uri") if not file: return None if file[0] == file[-1] == "'" or file[0] == file[-1] == '"': file = file[1:-1] file = file.replace("file://", "") return file except Exception: logger.exception(lambda: "Could not get current wallpaper") return None def cleanup_old_wallpapers(self, folder, prefix, new_wallpaper=None): try: current_wallpaper = self.get_desktop_wallpaper() for name in os.listdir(folder): file = os.path.join(folder, name) if ( file != current_wallpaper and file != new_wallpaper and file != self.post_filter_filename and name.startswith(prefix) and Util.is_image(name) ): logger.debug(lambda: "Removing old wallpaper %s" % file) Util.safe_unlink(file) except Exception: logger.exception(lambda: "Cannot remove all old wallpaper files from %s:" % folder) def set_desktop_wallpaper(self, wallpaper, original_file, refresh_level, display_mode): script = self.options.set_wallpaper_script if os.access(script, os.X_OK): auto = ( "manual" if not self.auto_changed else ("auto" if refresh_level == VarietyWindow.RefreshLevel.ALL else "refresh") ) logger.debug( lambda: "Running set_wallpaper script with parameters: %s, %s, %s, %s" % (wallpaper, auto, original_file, display_mode) ) try: subprocess.check_call( [script, wallpaper, auto, original_file, display_mode], timeout=10 ) except subprocess.TimeoutExpired: logger.error(lambda: "Timeout while running set_wallpaper script, killed") except subprocess.CalledProcessError as e: logger.exception( lambda: "Exception when calling set_wallpaper script: %d" % e.returncode ) else: logger.error(lambda: "set_wallpaper script is missing or not executable: " + script) if self.gsettings: self.gsettings.set_string("picture-uri", "file://" + wallpaper) self.gsettings.apply() def show_hide_history(self, widget=None): if self.thumbs_manager.is_showing("history"): self.thumbs_manager.hide(force=True) else: self.thumbs_manager.show(self.used, type="history") self.thumbs_manager.pin() self.update_indicator(auto_changed=False) def show_hide_downloads(self, widget=None): if self.thumbs_manager.is_showing("downloads"): self.thumbs_manager.hide(force=True) else: downloaded = list( Util.list_files( files=[], folders=[self.real_download_folder], filter_func=Util.is_image, randomize=False, ) ) downloaded = sorted(downloaded, key=lambda f: os.stat(f).st_mtime, reverse=True) self.thumbs_manager.show(downloaded, type="downloads") self.thumbs_manager.pin() self.update_indicator(auto_changed=False) def show_hide_wallpaper_selector(self, widget=None): pref_dialog = self.get_preferences_dialog() if self.thumbs_manager.is_showing("selector"): self.thumbs_manager.hide(force=True) else: rows = [r for r in pref_dialog.ui.sources.get_model() if r[0]] def _go(): pref_dialog.show_thumbs(rows, pin=True, thumbs_type="selector") threading.Timer(0, _go).start() def save_last_change_time(self): with open(os.path.join(self.config_folder, ".last_change_time"), "w") as f: f.write(str(self.last_change_time)) def load_last_change_time(self): now = time.time() self.last_change_time = now # take persisted last_change_time into consideration only if the change interval is more than 6 hours: # thus users who change often won't have the wallpaper changed practically on every start, # and users who change rarely will still have their wallpaper changed sometimes even if Variety or the computer # does not run all the time if self.options.change_interval >= 6 * 60 * 60: try: with open(os.path.join(self.config_folder, ".last_change_time")) as f: self.last_change_time = float(f.read().strip()) if self.last_change_time > now: logger.warning( lambda: "Persisted last_change_time after current time, setting to current time" ) self.last_change_time = now logger.info( lambda: "Change interval >= 6 hours, using persisted last_change_time " + str(self.last_change_time) ) logger.info( lambda: "Still to wait: %d seconds" % max(0, self.options.change_interval - (time.time() - self.last_change_time)) ) except Exception: logger.info(lambda: "Could not read last change time, setting it to current time") self.last_change_time = now else: logger.info( lambda: "Change interval < 6 hours, ignore persisted last_change_time, " "wait initially the whole interval: " + str(self.options.change_interval) ) def save_history(self): try: start = max(0, self.position - 100) # TODO do we want to remember forward history? end = min(self.position + 100, len(self.used)) to_save = self.used[start:end] with open(os.path.join(self.config_folder, "history.txt"), "w", encoding="utf8") as f: f.write("%d\n" % (self.position - start)) for file in to_save: f.write(file + "\n") except Exception: logger.exception(lambda: "Could not save history") def load_history(self): self.used = [] self.position = 0 self.no_effects_on = None try: with open(os.path.join(self.config_folder, "history.txt"), "r", encoding="utf8") as f: lines = list(f) self.position = int(lines[0].strip()) for i, line in enumerate(lines[1:]): if os.access(line.strip(), os.R_OK): self.used.append(line.strip()) elif i <= self.position: self.position = max(0, self.position - 1) except Exception: logger.warning(lambda: "Could not load history file, continuing without it, no worries") current = self.get_desktop_wallpaper() if current: if os.path.normpath(os.path.dirname(current)) == os.path.normpath( self.wallpaper_folder ) or os.path.basename(current).startswith("variety-copied-wallpaper-"): try: with open( os.path.join(self.wallpaper_folder, "wallpaper.jpg.txt"), encoding="utf8" ) as f: current = f.read().strip() except Exception: logger.exception(lambda: "Cannot read wallpaper.jpg.txt") self.current = current if self.current and ( self.position >= len(self.used) or current != self.used[self.position] ): self.used.insert(0, self.current) self.position = 0 if self.position < len(self.used): self.thumbs_manager.mark_active(file=self.used[self.position], position=self.position) def disable_quotes(self, widget=None): self.options.quotes_enabled = False self.quote = None if self.preferences_dialog: self.preferences_dialog.ui.quotes_enabled.set_active(False) self.options.write() self.update_indicator(auto_changed=False) if self.quotes_engine: self.quotes_engine.stop() def prev_quote(self, widget=None): if self.quotes_engine and self.options.quotes_enabled: self.quote = self.quotes_engine.prev_quote() self.update_indicator() self.refresh_texts() def next_quote(self, widget=None, bypass_history=False): if self.quotes_engine and self.options.quotes_enabled: self.quote = self.quotes_engine.next_quote(bypass_history) self.update_indicator() self.refresh_texts() def quote_copy_to_clipboard(self, widget=None): if self.quote: text = self.quote["quote"] + " - " + self.quote["author"] clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) clipboard.set_text(text, -1) clipboard.store() def reload_quote_favorites_contents(self): self.quote_favorites_contents = "" try: if os.path.isfile(self.options.quotes_favorites_file): with open(self.options.quotes_favorites_file, encoding="utf8") as f: self.quote_favorites_contents = f.read() except Exception: logger.exception( lambda: "Could not load favorite quotes file %s" % self.options.quotes_favorites_file ) self.quote_favorites_contents = "" def current_quote_to_text(self): return ( self.quote["quote"] + ("\n-- " + self.quote["author"] if self.quote["author"] else "") + "\n%\n" if self.quote else "" ) def quote_save_to_favorites(self, widget=None): if self.quote: try: self.reload_quote_favorites_contents() if self.quote_favorites_contents.find(self.current_quote_to_text()) == -1: with open(self.options.quotes_favorites_file, "a") as f: text = self.current_quote_to_text() f.write(text) self.reload_quote_favorites_contents() self.update_indicator() self.show_notification( "Saved", "Saved to %s" % self.options.quotes_favorites_file ) else: self.show_notification(_("Already in Favorites")) except Exception: logger.exception(lambda: "Could not save quote to favorites") self.show_notification( "Oops, something went wrong when trying to save the quote to the favorites file" ) def quote_view_favorites(self, widget=None): if os.path.isfile(self.options.quotes_favorites_file): subprocess.Popen(["xdg-open", self.options.quotes_favorites_file]) def on_quotes_pause_resume(self, widget=None, change_enabled=None): if change_enabled is None: self.options.quotes_change_enabled = not self.options.quotes_change_enabled else: self.options.quotes_change_enabled = change_enabled if self.preferences_dialog: self.preferences_dialog.ui.quotes_change_enabled.set_active( self.options.quotes_change_enabled ) self.options.write() self.update_indicator(auto_changed=False) if self.quotes_engine: self.quotes_engine.on_options_updated(False) def view_quote(self, widget=None): if self.quote and self.quote.get("link", None): webbrowser.open_new_tab(self.quote["link"]) def google_quote_text(self, widget=None): if self.quote and self.quote["quote"]: url = "https://google.com/search?q=" + urllib.parse.quote_plus( self.quote["quote"].encode("utf8") ) webbrowser.open_new_tab(url) def google_quote_author(self, widget=None): if self.quote and self.quote["author"]: url = "https://google.com/search?q=" + urllib.parse.quote_plus( self.quote["author"].encode("utf8") ) webbrowser.open_new_tab(url) def google_image_search(self, widget=None): if self.image_url: url = ( "https://www.google.com/searchbyimage?safe=off&image_url=" + urllib.parse.quote_plus(self.image_url.encode("utf8")) ) webbrowser.open_new_tab(url) def toggle_no_effects(self, no_effects): self.no_effects_on = self.current if no_effects else None self.refresh_wallpaper() def create_desktop_entry(self): """ Creates a profile-specific desktop entry in ~/.local/share/applications This ensures Variety's icon context menu is for the correct profile, and also that application's windows will be correctly grouped by profile. """ if is_default_profile(): return try: desktop_file_folder = os.path.expanduser("~/.local/share/applications") profile_name = get_profile_short_name() desktop_file_path = os.path.join(desktop_file_folder, get_desktop_file_name()) should_notify = not os.path.exists(desktop_file_path) Util.makedirs(desktop_file_folder) Util.copy_with_replace( varietyconfig.get_data_file("variety-profile.desktop.template"), desktop_file_path, { "{PROFILE_PATH}": get_profile_path(expanded=True), "{PROFILE_NAME}": (profile_name), "{VARIETY_PATH}": Util.get_exec_path(), "{WM_CLASS}": get_profile_wm_class(), }, ) if should_notify: self.show_notification( _("Variety: New desktop entry"), _( "We created a new desktop entry in ~/.local/share/applications " 'to run Variety with profile "{}". Find it in the application launcher.' ).format(profile_name), ) except Exception: logger.exception(lambda: "Could not create desktop entry for a run with --profile") def create_autostart_entry(self): try: autostart_file_path = get_autostart_file_path() Util.makedirs(os.path.dirname(autostart_file_path)) should_notify = not os.path.exists(autostart_file_path) Util.copy_with_replace( varietyconfig.get_data_file("variety-autostart.desktop.template"), autostart_file_path, { "{PROFILE_PATH}": get_profile_path(expanded=True), "{VARIETY_PATH}": Util.get_exec_path(), "{WM_CLASS}": get_profile_wm_class(), }, ) if should_notify: self.show_notification( _("Variety: Created autostart desktop entry"), _( "We created a new desktop entry in ~/.config/autostart. " "Variety should start automatically on next login." ), ) except Exception: logger.exception(lambda: "Error while creating autostart desktop entry") self.show_notification( _("Could not create autostart entry"), _( "An error occurred while creating the autostart desktop entry\n" "Please run from a terminal with the -v flag and try again." ), ) def on_start_slideshow(self, widget=None): def _go(): try: if self.options.slideshow_mode.lower() != "window": subprocess.call(["killall", "-9", "variety-slideshow"]) args = ["variety-slideshow"] args += ["--seconds", str(self.options.slideshow_seconds)] args += ["--fade", str(self.options.slideshow_fade)] args += ["--zoom", str(self.options.slideshow_zoom)] args += ["--pan", str(self.options.slideshow_pan)] if "," in self.options.slideshow_sort_order.lower(): sort = self.options.slideshow_sort_order.lower().split(",")[0] order = self.options.slideshow_sort_order.lower().split(",")[1] else: sort = self.options.slideshow_sort_order.lower() order = "asc" args += ["--sort", sort] args += ["--order", order] args += ["--mode", self.options.slideshow_mode.lower()] images = [] folders = [] if self.options.slideshow_sources_enabled: for source in self.options.sources: if source[0]: type = source[1] if type not in Options.get_all_supported_source_types(): continue location = source[2] if type == Options.SourceType.IMAGE: images.append(location) else: folder = self.get_folder_of_source(source) if folder: folders.append(folder) if self.options.slideshow_favorites_enabled: folders.append(self.options.favorites_folder) if self.options.slideshow_downloads_enabled: folders.append(self.options.download_folder) if self.options.slideshow_custom_enabled and os.path.isdir( self.options.slideshow_custom_folder ): folders.append(self.options.slideshow_custom_folder) if not images and not folders: folders.append(self.options.favorites_folder) if not list( Util.list_files( files=images, folders=folders, filter_func=Util.is_image, max_files=1, randomize=False, ) ): self.show_notification( _("No images"), _("There are no images in the slideshow folders") ) return args += images args += folders if self.options.slideshow_monitor.lower() != "all": try: args += ["--monitor", str(int(self.options.slideshow_monitor))] except: pass subprocess.Popen(args) else: screen = Gdk.Screen.get_default() for i in range(0, screen.get_n_monitors()): new_args = list(args) new_args += ["--monitor", str(i + 1)] subprocess.Popen(new_args) except: logger.exception("Could not start slideshow:") threading.Thread(target=_go).start() variety-0.8.13/variety/WelcomeDialog.py000066400000000000000000000035601475753071700200620ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE from gi.repository import Gtk # pylint: disable=E0611 from variety_lib.helpers import get_builder class WelcomeDialog(Gtk.Dialog): __gtype_name__ = "WelcomeDialog" def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated WelcomeDialog object. """ builder = get_builder("WelcomeDialog") new_object = builder.get_object("welcome_dialog") new_object.finish_initializing(builder) return new_object def finish_initializing(self, builder): """Called when we're finished initializing. finish_initalizing should be called after parsing the ui definition and creating a WelcomeDialog object with it in order to finish initializing the start of the new WelcomeDialog instance. """ # Get a reference to the builder and set up the signals. self.builder = builder self.ui = builder.get_ui(self) if __name__ == "__main__": dialog = WelcomeDialog() dialog.show() Gtk.main() variety-0.8.13/variety/__init__.py000066400000000000000000000201501475753071700171000ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012-2018, Peter Levi # Copyright (c) 2017-2018, James Lu # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import dbus, dbus.service, dbus.glib import logging import os import signal import sys import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GObject # pylint: disable=E0611 class SafeLogger(logging.Logger): """ Fixes UnicodeDecodeErrors errors in logging calls: Accepts lambda as well string messages. Catches errors when evaluating the passed lambda. """ def makeRecord(self, name, level, fn, lno, msg, *args, **kwargs): try: new_msg = msg if isinstance(msg, str) else msg() except: locale_info = "Unknown" try: locale_info = "Terminal encoding=%s, LANG=%s, LANGUAGE=%s" % ( sys.stdout.encoding, os.getenv("LANG"), os.getenv("LANGUAGE"), ) logging.getLogger("variety").exception( "Errors while logging. Locale info: %s" % locale_info ) # TODO gather and log more info here except: pass new_msg = "Errors while logging. Locale info: %s" % locale_info return super().makeRecord(name, level, fn, lno, new_msg, *args, **kwargs) logging.setLoggerClass(SafeLogger) # these must be after the setLoggerClass call, as they obtain the variety logger from variety import VarietyWindow, ThumbsManager, ThumbsWindow from variety.profile import set_profile_path, get_profile_path, is_default_profile, get_profile_id from variety.Util import Util, _, ModuleProfiler, safe_print # # Change default encoding from ascii to UTF8 - works OK on Linux and prevents various UnicodeEncodeErrors/UnicodeDecodeErrors # Still, generally considerd bad practice, may cause some deep hidden errors, as various Python stuff depends on it # reload(sys) # sys.setdefaultencoding('UTF8') def _get_dbus_key(): """ DBus key for Variety. Variety uses a different key per profile, so several instances can run simultaneously if running with different profiles. Command any instance from the terminal by passing explicitly the same --profile options as it was started with. :return: the dbus key """ if is_default_profile(): return "com.peterlevi.Variety" else: return "com.peterlevi.Variety_{}".format(get_profile_id()) DBUS_PATH = "/com/peterlevi/Variety" class VarietyService(dbus.service.Object): def __init__(self, variety_window): self.variety_window = variety_window bus_name = dbus.service.BusName(_get_dbus_key(), bus=dbus.SessionBus()) dbus.service.Object.__init__(self, bus_name, DBUS_PATH) @dbus.service.method(dbus_interface=_get_dbus_key(), in_signature="as", out_signature="s") def process_command(self, arguments): result = self.variety_window.process_command(arguments, initial_run=False) return "" if result is None else result VARIETY_WINDOW = None terminate = False def _sigint_handler(*args): global terminate terminate = True def _check_quit(): global terminate if not terminate: GObject.timeout_add(1000, _check_quit) return logging.getLogger("variety").info("Terminating signal received, quitting...") safe_print( _("Terminating signal received, quitting..."), "Terminating signal received, quitting...", file=sys.stderr, ) global VARIETY_WINDOW if VARIETY_WINDOW: VARIETY_WINDOW.on_quit() Util.start_force_exit_thread(10) def _set_up_logging(verbose): # add a handler to prevent basicConfig root = logging.getLogger() null_handler = logging.NullHandler() root.addHandler(null_handler) formatter = logging.Formatter("%(levelname)s: %(asctime)s: %(funcName)s() '%(message)s'") logger = logging.getLogger("variety") logger_sh = logging.StreamHandler() logger_sh.setFormatter(formatter) logger.addHandler(logger_sh) try: logger_file = logging.FileHandler(os.path.join(get_profile_path(), "variety.log"), "w") logger_file.setFormatter(formatter) logger.addHandler(logger_file) except Exception: logger.exception("Could not create file logger") lib_logger = logging.getLogger("variety_lib") lib_logger_sh = logging.StreamHandler() lib_logger_sh.setFormatter(formatter) lib_logger.addHandler(lib_logger_sh) logger.setLevel(logging.INFO) # Set the logging level to show debug messages. if verbose >= 2: logger.setLevel(logging.DEBUG) elif not verbose: # If we're not in verbose mode, only log these messages to file. This prevents # flooding syslog and/or ~/.xsession-errors depending on how variety was started: # (https://bugs.launchpad.net/variety/+bug/1685003) # XXX: We should /really/ make the internal debug logging use logging.debug, # this is really just a bandaid patch. logger_sh.setLevel(logging.WARNING) if verbose >= 3: lib_logger.setLevel(logging.DEBUG) def main(): # Ctrl-C signal.signal(signal.SIGINT, _sigint_handler) signal.signal(signal.SIGTERM, _sigint_handler) signal.signal(signal.SIGQUIT, _sigint_handler) arguments = sys.argv[1:] # validate arguments from variety import VarietyOptionParser options, args = VarietyOptionParser.parse_options(arguments) set_profile_path(options.profile) Util.makedirs(get_profile_path()) # ensure singleton per profile bus = dbus.SessionBus() dbus_key = _get_dbus_key() if bus.request_name(dbus_key) != dbus.bus.REQUEST_NAME_REPLY_PRIMARY_OWNER: if not arguments or (options.profile and len(arguments) <= 2): arguments = ["--preferences"] safe_print( _("Variety is already running. Sending the command to the running instance."), "Variety is already running. Sending the command to the running instance.", file=sys.stderr, ) method = bus.get_object(dbus_key, DBUS_PATH).get_dbus_method("process_command") result = method(arguments) if result: safe_print(result) return # set up logging # set_up_logging must be called after the DBus checks, only by one running instance, # or the log file can be corrupted _set_up_logging(options.verbose) logging.getLogger("variety").info(lambda: "Using profile folder {}".format(get_profile_path())) if options.verbose >= 3: profiler = ModuleProfiler() if options.verbose >= 5: # The main variety package pkgname = os.path.dirname(__file__) profiler.log_path(pkgname) if options.verbose >= 6: # Track variety_lib profiler.log_path(pkgname + "_lib") else: # Cherry-picked log items carried over from variety 0.6.x profiler.log_class(VarietyWindow.VarietyWindow) if options.verbose >= 4: profiler.log_class(ThumbsManager.ThumbsManager) profiler.log_class(ThumbsWindow.ThumbsWindow) profiler.start() # Run the application. window = VarietyWindow.VarietyWindow() global VARIETY_WINDOW VARIETY_WINDOW = window service = VarietyService(window) bus.call_on_disconnection(window.on_quit) window.start(arguments) GObject.timeout_add(2000, _check_quit) Gtk.main() variety-0.8.13/variety/display_modes.py000066400000000000000000000054221475753071700202020ustar00rootroot00000000000000from variety.Util import Util, _ def _os(filename): return "os", None def _zoom(filename): w, h = Util.get_primary_display_size() return "zoom", "-scale %dx%d^ " % (w, h) def _fill_with_black(filename): w, h = Util.get_primary_display_size() return ( "zoom", "-resize %dx%d\> -size %dx%d xc:black +swap -gravity center -composite" % (w, h, w, h), ) def _fill_with_blur(filename): w, h = Util.get_primary_display_size() return ( "zoom", "-resize %dx%d^ -gravity center -extent %dx%d -blur 0x10 -clone 0 -resize %dx%d -size %dx%d -gravity center -composite" % (w, h, w, h, w, h, w, h), ) DISPLAY_MODES = [ { "id": "os", "title": _("Controlled by OS settings, not by Variety. Fastest option."), "description": _( "Display mode is controlled by your OS Appearance settings and by what is " "specified in set_wallpaper script for your desktop environment. " ), "fn": _os, }, { "id": "zoom", "title": _("Zoom"), "description": _( "Image is zoomed in or out so that it fully fills your primary screen. " "Some parts of the image will be cut out if its resolution is different " "from the screen's. " ), "fn": _zoom, }, { "id": "fill-with-black", "title": _("Fill with black"), "description": _( "Image is zoomed in or out so that it fully fits within your primary screen. " "The rest of the screen is filled with black. " ), "fn": _fill_with_black, }, { "id": "fill-with-blur", "title": _("Fill with blur. Slow."), "description": _( "Image is zoomed in or out so that it fully fits within your primary screen. " "The rest of the screen is a filled with blurred version of the image. " ), "fn": _fill_with_blur, }, { "id": "smart-with-black", "title": _("Pick dynamically between Zoom and Fill with black"), "description": _( "Variety picks a good mode depending on image size. " "Images that are close to the screen proportions use 'Zoom'. " "Those that are vastly different use 'Fill with black'. " ), "fn": _fill_with_black, # TODO implement }, { "id": "smart-with-blur", "title": _("Pick dynamically between Zoom and Fill with blur. Slow."), "description": _( "Variety picks a good mode depending on image size. " "Images that are close to the screen proportions use 'Zoom'. " "Those that are vastly different use 'Fill with blur'. " ), "fn": _fill_with_blur, # TODO implement }, ] variety-0.8.13/variety/indicator.py000066400000000000000000000410731475753071700173240ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE """Code to add AppIndicator.""" import logging import os from gi.repository import Gtk # pylint: disable=E0611 from variety.Util import Util, _ from variety_lib import varietyconfig THEME_ICON_NAME = "variety-indicator" THEME_ICON_NAME_DARK = "variety-indicator-dark" THEME_ICON_NAME_NUM = "variety-indicator-num{}" try: import gi try: gi.require_version("AyatanaAppIndicator3", "0.1") from gi.repository import AyatanaAppIndicator3 as AppIndicator3 # pylint: disable=E0611 _indicator_backend = "AyatanaAppIndicator3" # Just a dummy value we use for logging except (ValueError, ImportError): gi.require_version("AppIndicator3", "0.1") from gi.repository import AppIndicator3 # pylint: disable=E0611 _indicator_backend = "AppIndicator3" use_appindicator = True except (ValueError, ImportError): _indicator_backend = "fallback tray" use_appindicator = False logger = logging.getLogger("variety") class Indicator: def __init__(self, window): self.parent = window self.create_menu(window) self.create_indicator(window) def create_menu(self, window): self.menu = Gtk.Menu() if not Util.is_unity(): self.next_main = Gtk.MenuItem(_("_Next")) self.next_main.set_use_underline(True) self.next_main.connect("activate", window.next_wallpaper) self.menu.append(self.next_main) self.prev_main = Gtk.MenuItem(_("_Previous")) self.prev_main.set_use_underline(True) self.prev_main.connect("activate", window.prev_wallpaper) self.menu.append(self.prev_main) self.menu.append(Gtk.SeparatorMenuItem.new()) self.file_label = Gtk.MenuItem(_("Current desktop wallpaper")) self.file_label.connect("activate", window.open_file) self.menu.append(self.file_label) self.show_origin = Gtk.MenuItem(_("Show origin")) self.show_origin.connect("activate", window.on_show_origin) self.show_origin.set_sensitive(False) self.menu.append(self.show_origin) self.show_author = Gtk.MenuItem("Show author") self.show_author.connect("activate", window.on_show_author) self.show_author.set_sensitive(False) self.show_author.set_visible(False) self.menu.append(self.show_author) self.copy_to_favorites = Gtk.MenuItem(_("Copy to _Favorites")) self.copy_to_favorites.set_use_underline(True) self.copy_to_favorites.connect("activate", window.copy_to_favorites) self.menu.append(self.copy_to_favorites) self.move_to_favorites = Gtk.MenuItem(_("Move to Favorites")) self.move_to_favorites.set_use_underline(True) self.move_to_favorites.connect("activate", window.move_to_favorites) self.move_to_favorites.set_visible(False) self.menu.append(self.move_to_favorites) self.trash = Gtk.MenuItem(_("Delete to _Trash")) self.trash.set_use_underline(True) self.trash.connect("activate", window.move_to_trash) self.menu.append(self.trash) self.menu.append(Gtk.SeparatorMenuItem.new()) self.image_menu = Gtk.Menu() self.next = Gtk.MenuItem(_("_Next")) self.next.set_use_underline(True) self.next.connect("activate", window.next_image_same_quote) self.image_menu.append(self.next) self.prev = Gtk.MenuItem(_("_Previous")) self.prev.set_use_underline(True) self.prev.connect("activate", window.prev_wallpaper) self.image_menu.append(self.prev) self.fast_forward = Gtk.MenuItem(_("_Next, skipping forward history")) self.fast_forward.set_use_underline(True) def _fast_forward(widget): window.next_wallpaper(widget, bypass_history=True) self.fast_forward.connect("activate", _fast_forward) self.image_menu.append(self.fast_forward) self.image_menu.append(Gtk.SeparatorMenuItem.new()) self.scroll_tip = Gtk.MenuItem(_("Tip: Scroll wheel over icon\nfor Next and Previous")) self.scroll_tip.set_sensitive(False) self.image_menu.append(self.scroll_tip) self.image_menu.append(Gtk.SeparatorMenuItem.new()) self.pause_resume = Gtk.MenuItem(_("Pause on current")) self.pause_resume.connect("activate", window.on_pause_resume) self.image_menu.append(self.pause_resume) self.image_item = Gtk.MenuItem(_("_Image")) self.image_item.set_use_underline(True) self.image_item.set_submenu(self.image_menu) self.menu.append(self.image_item) self.image_menu.append(Gtk.SeparatorMenuItem.new()) self.focus = Gtk.MenuItem(_("Where is it from?")) self.focus.connect("activate", window.focus_in_preferences) self.image_menu.append(self.focus) self.no_effects = Gtk.CheckMenuItem(_("Show without effects")) self.no_effects.set_active(False) self.no_effects.set_use_underline(True) def _toggle_no_effects(widget=None): window.toggle_no_effects(self.no_effects.get_active()) self.no_effects_handler_id = self.no_effects.connect("toggled", _toggle_no_effects) self.image_menu.append(self.no_effects) self.google_image = Gtk.MenuItem(_("Google Image Search")) self.google_image.connect("activate", window.google_image_search) self.image_menu.append(self.google_image) self.rating_separator = Gtk.SeparatorMenuItem.new() self.image_menu.append(self.rating_separator) self.rating = Gtk.MenuItem(_("Set EXIF Rating")) self.image_menu.append(self.rating) # self.image_item = Gtk.MenuItem(_("_Image")) # self.image_item.set_use_underline(True) # self.image_item.set_submenu(self.image_menu) # self.menu.append(self.image_item) # self.quotes_menu = Gtk.Menu() self.next_quote = Gtk.MenuItem(_("_Next")) self.next_quote.set_use_underline(True) self.next_quote.connect("activate", window.next_quote) self.quotes_menu.append(self.next_quote) self.prev_quote = Gtk.MenuItem(_("_Previous")) self.prev_quote.set_use_underline(True) self.prev_quote.connect("activate", window.prev_quote) self.quotes_menu.append(self.prev_quote) self.fast_forward_quote = Gtk.MenuItem(_("_Next, skipping forward history")) self.fast_forward_quote.set_use_underline(True) def _fast_forward_quote(widget): window.next_quote(widget, bypass_history=True) self.fast_forward_quote.connect("activate", _fast_forward_quote) self.quotes_menu.append(self.fast_forward_quote) self.quotes_menu.append(Gtk.SeparatorMenuItem.new()) self.quotes_pause_resume = Gtk.MenuItem(_("Pause on current")) self.quotes_pause_resume.connect("activate", window.on_quotes_pause_resume) self.quotes_menu.append(self.quotes_pause_resume) self.quotes_menu.append(Gtk.SeparatorMenuItem.new()) self.quote_favorite = Gtk.MenuItem(_("Save to Favorites")) self.quote_favorite.set_use_underline(True) self.quote_favorite.connect("activate", window.quote_save_to_favorites) self.quotes_menu.append(self.quote_favorite) self.quote_view_favs = Gtk.MenuItem(_("View Favorites...")) self.quote_view_favs.set_use_underline(True) self.quote_view_favs.connect("activate", window.quote_view_favorites) self.quotes_menu.append(self.quote_view_favs) self.quotes_menu.append(Gtk.SeparatorMenuItem.new()) self.quote_clipboard = Gtk.MenuItem(_("Copy to Clipboard")) self.quote_clipboard.set_use_underline(True) self.quote_clipboard.connect("activate", window.quote_copy_to_clipboard) self.quotes_menu.append(self.quote_clipboard) self.view_quote = Gtk.MenuItem() self.view_quote.set_use_underline(True) self.view_quote.connect("activate", window.view_quote) self.quotes_menu.append(self.view_quote) self.google_quote_text = Gtk.MenuItem(_("Google Quote")) self.google_quote_text.set_use_underline(True) self.google_quote_text.connect("activate", window.google_quote_text) self.quotes_menu.append(self.google_quote_text) self.google_quote_author = Gtk.MenuItem(_("Google Author")) self.google_quote_author.set_use_underline(True) self.google_quote_author.connect("activate", window.google_quote_author) self.quotes_menu.append(self.google_quote_author) self.quotes_menu.append(Gtk.SeparatorMenuItem.new()) self.quotes_preferences = Gtk.MenuItem(_("Preferences...")) self.quotes_preferences.set_use_underline(True) def _quotes_prefs(widget=None): window.preferences_dialog.ui.notebook.set_current_page(1) window.on_mnu_preferences_activate() self.quotes_preferences.connect("activate", _quotes_prefs) self.quotes_menu.append(self.quotes_preferences) self.quotes_disable = Gtk.MenuItem(_("Turn off")) self.quotes_disable.set_use_underline(True) self.quotes_disable.connect("activate", window.disable_quotes) self.quotes_menu.append(self.quotes_disable) self.quotes = Gtk.MenuItem(_("_Quote")) self.quotes.set_use_underline(True) self.quotes.set_submenu(self.quotes_menu) self.menu.append(self.quotes) self.menu.append(Gtk.SeparatorMenuItem.new()) self.history = Gtk.CheckMenuItem(_("_History")) self.history.set_active(False) self.history.set_use_underline(True) self.history_handler_id = self.history.connect("toggled", window.show_hide_history) self.menu.append(self.history) self.selector = Gtk.CheckMenuItem(_("_Wallpaper Selector")) self.selector.set_active(False) self.selector.set_use_underline(True) self.selector_handler_id = self.selector.connect( "toggled", window.show_hide_wallpaper_selector ) self.menu.append(self.selector) self.downloads = Gtk.CheckMenuItem(_("Recent _Downloads")) self.downloads.set_active(False) self.downloads.set_use_underline(True) self.downloads_handler_id = self.downloads.connect("toggled", window.show_hide_downloads) self.menu.append(self.downloads) if Util.check_variety_slideshow_present(): self.menu.append(Gtk.SeparatorMenuItem.new()) self.slideshow = Gtk.MenuItem(_("Start Slideshow")) self.slideshow.connect("activate", window.on_start_slideshow) self.menu.append(self.slideshow) else: logger.warning( "Variety Slideshow is not installed. This is an optional extension " "adding pan-and-zoom slideshows to Variety: see " "https://github.com/peterlevi/variety-slideshow for details" ) self.menu.append(Gtk.SeparatorMenuItem.new()) self.preferences = Gtk.MenuItem(_("Preferences...")) self.preferences.connect("activate", window.on_mnu_preferences_activate) self.menu.append(self.preferences) self.about = Gtk.MenuItem(_("About")) self.about.connect("activate", window.on_mnu_about_activate) self.menu.append(self.about) self.donate = Gtk.MenuItem(_("Donate")) self.donate.connect("activate", window.on_mnu_donate_activate) self.menu.append(self.donate) self.quit = Gtk.MenuItem(_("Quit")) self.quit.connect("activate", window.on_quit) self.menu.append(self.quit) self.menu.show_all() def create_indicator(self, window): logger.info("indicator backend: %s", _indicator_backend) self.indicator = None self.status_icon = None self.visible = True def right_click_event(icon, button, time): self.menu.popup(None, None, Gtk.StatusIcon.position_menu, self.status_icon, 0, time) def left_click_event(data): self.menu.popup( None, None, Gtk.StatusIcon.position_menu, self.status_icon, 0, Gtk.get_current_event_time(), ) def on_indicator_scroll_status_icon(status_icon, event): window.on_indicator_scroll(None, 1, event.direction) icon_path = varietyconfig.get_data_file("media", "variety-indicator.png") if use_appindicator: self.indicator = AppIndicator3.Indicator.new( "variety", "", AppIndicator3.IndicatorCategory.APPLICATION_STATUS ) self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE) self.indicator.set_icon(icon_path) self.indicator.connect("scroll-event", window.on_indicator_scroll) self.indicator.set_menu(self.menu) else: self.status_icon = Gtk.StatusIcon.new_from_file(icon_path) self.status_icon.set_visible(True) self.status_icon.connect("activate", left_click_event) self.status_icon.connect("popup-menu", right_click_event) self.status_icon.connect("scroll-event", on_indicator_scroll_status_icon) def set_visible(self, visible): self.visible = visible if visible: if self.indicator: logger.info(lambda: "Showing indicator icon") self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE) if self.status_icon: logger.info(lambda: "Showing status icon") self.status_icon.set_visible(True) else: if self.indicator: logger.info(lambda: "Hiding indicator icon") self.indicator.set_status(AppIndicator3.IndicatorStatus.PASSIVE) if self.status_icon: logger.info(lambda: "Hiding status icon") self.status_icon.set_visible(False) def set_icon(self, icon): def set_from_theme_icon(name): if self.indicator: logger.info(lambda: "Showing indicator icon %s from GTK theme" % name) self.indicator.set_icon(name) if self.status_icon: logger.info(lambda: "Showing status icon %s from GTK theme" % name) self.status_icon.set_from_icon_name(name) if icon == "Light": if Gtk.IconTheme.get_default().has_icon(THEME_ICON_NAME): set_from_theme_icon(THEME_ICON_NAME) return else: icon_path = varietyconfig.get_data_file("media", "variety-indicator.png") elif icon == "Dark": if Gtk.IconTheme.get_default().has_icon(THEME_ICON_NAME_DARK): set_from_theme_icon(THEME_ICON_NAME_DARK) return else: icon_path = varietyconfig.get_data_file("media", "variety-indicator-dark.png") elif icon in ["1", "2", "3", "4"]: if Gtk.IconTheme.get_default().has_icon(THEME_ICON_NAME_NUM.format(icon)): set_from_theme_icon(THEME_ICON_NAME_NUM.format(icon)) return else: icon_path = varietyconfig.get_data_file( "media", "variety-indicator-num{}.png".format(icon) ) elif icon and os.access(icon, os.R_OK) and Util.is_image(icon): icon_path = icon else: icon_path = varietyconfig.get_data_file("media", "variety-indicator.png") if self.indicator: logger.info(lambda: "Showing indicator icon image: " + icon_path) self.indicator.set_icon(icon_path) if self.status_icon: logger.info(lambda: "Showing status icon image: " + icon_path) self.status_icon.set_from_file(icon_path) def get_visible(self): return self.visible def new_application_indicator(window): ind = Indicator(window) return ind, ind.indicator, ind.status_icon variety-0.8.13/variety/plugins/000077500000000000000000000000001475753071700164525ustar00rootroot00000000000000variety-0.8.13/variety/plugins/IDisplayModesPlugin.py000066400000000000000000000064561475753071700227240ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import abc from typing import Callable, List, Optional from variety.Util import Util from .IVarietyPlugin import IVarietyPlugin class DisplayModeData: """ Contains the data for how to visualize a specific image. set_wallpaper_param - what do we send to the set_wallpaper script, affects OS background options imagemagick_cmd - optional, what command do we run over the image in order to resize it fixed_image_path - optional, if more complex logic needed, generate the image and give its path """ def __init__( self, set_wallpaper_param: str, imagemagick_cmd: Optional[str] = None, fixed_image_path: Optional[str] = None, ): self.set_wallpaper_param = set_wallpaper_param self.imagemagick_cmd = imagemagick_cmd self.fixed_image_path = fixed_image_path class DisplayMode: """ Implements a display mode. Needs a unique id, title to show in the combobox, description to show below the combo when selected, and callable that implements the logic. The callable takes a file path and returns a DisplayModeData object. """ def __init__(self, id: str, title: str, description: str, fn: Callable[[str], DisplayModeData]): self.id = id self.title = title self.description = description self.fn = fn class StaticDisplayMode(DisplayMode): """ A DisplayMode that does not care about the specific file, but implements a uses either a static ImageMagick command, or does no resizing at all and works simply via the set_wallpaper parameter. """ def __init__( self, id: str, title: str, description: str, set_wallpaper_param: str, imagemagick_cmd: Optional[str] = None, ): def fn(filename: str): w, h = Util.get_primary_display_size() if imagemagick_cmd: final_cmd = imagemagick_cmd.replace("%W", str(w)).replace("%H", str(h)) else: final_cmd = None return DisplayModeData( set_wallpaper_param=set_wallpaper_param, imagemagick_cmd=final_cmd ) super().__init__(id, title, description, fn) class IDisplayModesPlugin(IVarietyPlugin): @abc.abstractmethod def display_modes(self) -> List[DisplayMode]: """ Return a list of DisplayModes """ return [] def order(self): """ Display modes from IDisplayModesPlugins with lower order get listed before those with higher order """ return 100 variety-0.8.13/variety/plugins/IQuoteSource.py000066400000000000000000000043561475753071700214230ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE from .IVarietyPlugin import IVarietyPlugin class IQuoteSource(IVarietyPlugin): def needs_internet(self): """ Does this source fetch quotes from the internet? Sources like this will not be used when Variety is configured to not access the internet. :return: True or False """ return True def supports_search(self): """ False means that this plugins does not support searching by keyword or author (only get_random will ever be called) and this plugin will be used only if the user has not specified search criteria. True means get_for_keyword and get_for_author should also be implemented. :return: True or False """ return False def get_random(self): """ Returns some quotes. Individual quotes are hashes like the one below. Only quote should be non-null, the others can be None. """ return [ { "quote": "Quote", "author": "Author", "sourceName": "My Quote Site", "link": "http://example.com", } ] def get_for_keyword(self, keyword): """ Returns some quotes matching the given keyword. Returns [] if it cannot find matches. """ return [] def get_for_author(self, author): """ Returns some quotes matching the given author. Returns [] if it cannot find matches. """ return [] variety-0.8.13/variety/plugins/IVarietyPlugin.py000066400000000000000000000014771475753071700217500ustar00rootroot00000000000000import abc import os from jumble.IPlugin import IPlugin from variety.Util import Util class IVarietyPlugin(IPlugin, metaclass=abc.ABCMeta): """ Variety-specific plugin interface """ def activate(self): super(IVarietyPlugin, self).activate() self.config_folder = os.path.join( self.jumble.parent.config_folder, "pluginconfig/" + os.path.basename(self.folder) ) Util.makedirs(self.config_folder) def get_config_folder(self): """ :return: The config directory which the plugin can use to store config or cache files """ return self.config_folder def on_variety_start_complete(self): """ Called towards the end of VarietyWindow.start, when options are loaded and caches - created """ pass variety-0.8.13/variety/plugins/__init__.py000066400000000000000000000000001475753071700205510ustar00rootroot00000000000000variety-0.8.13/variety/plugins/builtin/000077500000000000000000000000001475753071700201205ustar00rootroot00000000000000variety-0.8.13/variety/plugins/builtin/__init__.py000066400000000000000000000000001475753071700222170ustar00rootroot00000000000000variety-0.8.13/variety/plugins/builtin/display_modes/000077500000000000000000000000001475753071700227545ustar00rootroot00000000000000variety-0.8.13/variety/plugins/builtin/display_modes/GnomeDisplayModesPlugin.py000066400000000000000000000022571475753071700300760ustar00rootroot00000000000000from typing import List from variety.plugins.IDisplayModesPlugin import DisplayMode, IDisplayModesPlugin, StaticDisplayMode from variety.Util import _ class GnomeDisplayModesPlugin(IDisplayModesPlugin): @classmethod def get_info(cls): return { "name": "GnomeDisplayModesPlugin", "description": "Display modes relying on the underlying desktop environment", "version": "1.0", "author": "Peter Levi", } def display_modes(self) -> List[DisplayMode]: modes = ["centered", "scaled", "stretched", "zoom", "spanned", "wallpaper"] return [ StaticDisplayMode( id="gnome-%s" % mode, title=_("[GNOME/Mate/Cinnamon] %s") % mode.capitalize(), description=_( "Variety will instruct the desktop environment to use this mode when " "calling set_wallpaper, and will not itself scale the image, unless needed " "by other options, e.g. clock. " ), set_wallpaper_param=mode, ) for mode in modes ] def order(self): return 3000 variety-0.8.13/variety/plugins/builtin/display_modes/LegacyDisplayModesPlugin.py000066400000000000000000000021371475753071700302320ustar00rootroot00000000000000from typing import List from variety.plugins.IDisplayModesPlugin import DisplayMode, IDisplayModesPlugin, StaticDisplayMode from variety.Util import _ class LegacyDisplayModesPlugin(IDisplayModesPlugin): @classmethod def get_info(cls): return { "name": "LegacyDisplayModesPlugin", "description": "Legacy display mode for compatibility with past Variety versions", "version": "1.0", "author": "Peter Levi", } def display_modes(self) -> List[DisplayMode]: return [ StaticDisplayMode( id="os", title=_("[Legacy] Controlled via OS settings, not by Variety. Fast."), description=_( "Display mode is controlled by your OS Appearance settings and by the logic " "for your desktop environment in ~/.config/variety/scripts/set_wallpaper. " "Provides compatibility with past Variety versions." ), set_wallpaper_param="os", ) ] def order(self): return 1000 variety-0.8.13/variety/plugins/builtin/display_modes/ResizingDisplayModesPlugin.py000066400000000000000000000114501475753071700306160ustar00rootroot00000000000000from typing import List from variety.plugins.IDisplayModesPlugin import ( DisplayMode, DisplayModeData, IDisplayModesPlugin, StaticDisplayMode, ) from variety.Util import Util, _ IMAGEMAGICK_ZOOM = "-scale %Wx%H^ " IMAGEMAGICK_FIT_WITH_BLACK = "-resize %Wx%H -size %Wx%H xc:black +swap -gravity center -composite" IMAGEMAGICK_FIT_WITH_BLUR = ( "-resize %Wx%H^ -gravity center -extent %Wx%H -scale 10% -blur 0x3 -resize 1000% -clone 0 " "-resize %Wx%H -size %Wx%H -gravity center -composite" ) IMAGEMAGICK_TILE = "-write mpr:x -delete -1 -size %Wx%H tile:mpr:x " def _smart_fn(filename): try: image_w, image_h = Util.get_size(filename) primary_w, primary_h = Util.get_primary_display_size(hidpi_scaled=True) total_w, total_h = Util.get_multimonitor_display_size() if image_w * image_h * 10 < primary_w * primary_h: # image way smaller than primary monitor, tile it cmd = IMAGEMAGICK_TILE.replace("%W", str(primary_w)).replace( "%H", str(primary_h) ) return DisplayModeData(set_wallpaper_param="zoom", imagemagick_cmd=cmd) else: image_ratio = image_w / image_h primary_ratio = primary_w / primary_h total_ratio = total_w / total_h if 2 * abs(image_ratio - primary_ratio) / (image_ratio + primary_ratio) < 0.2: # image ratio is close to primary screen ratio, zoom return DisplayModeData(set_wallpaper_param="zoom") elif 2 * abs(image_ratio - total_ratio) / (image_ratio + total_ratio) < 0.2: # image ratio is close to multimonitor total screen ratio, span it return DisplayModeData(set_wallpaper_param="spanned") else: # image ratio not close to screen ratio, fit with a blurred background cmd = IMAGEMAGICK_FIT_WITH_BLUR.replace("%W", str(primary_w)).replace( "%H", str(primary_h) ) return DisplayModeData(set_wallpaper_param="zoom", imagemagick_cmd=cmd) except: return DisplayModeData(set_wallpaper_param="zoom") class ResizingDisplayModesPlugin(IDisplayModesPlugin): @classmethod def get_info(cls): return { "name": "ResizingDisplayModesPlugin", "description": "Display modes that use image resizing within Variety", "version": "1.0", "author": "Peter Levi", } def display_modes(self) -> List[DisplayMode]: return [ DisplayMode( id="smart", title=_("Smart: Variety picks best mode based on image size. Recommended."), description=( "Variety uses the fast OS-provided Zoom mode for images that are close to " "screen proportions, uses 'Fit & pad with a blurred background' when the image " "proportions are significantly different - e.g. portraits on a horizontal " "screen, and uses a screen-covering tiling of the image if it is very small such that it would " "look bad resized." ), fn=_smart_fn, ), StaticDisplayMode( id="zoom", title=_("Zoom to fill screen"), description=_( "Image is zoomed in or out so that it fully fills your primary screen. " "Some parts of the image will be cut out if its resolution is different " "from the screen's. Slower than using native OS resizing options." ), set_wallpaper_param="zoom", imagemagick_cmd=IMAGEMAGICK_ZOOM, ), StaticDisplayMode( id="fill-with-black", title=_("Fit within screen, pad with black"), description=_( "Image is zoomed in or out so that it fully fits within your primary screen. " "The rest of the screen is filled with black. " "Slower than using native OS resizing options." ), set_wallpaper_param="zoom", imagemagick_cmd=IMAGEMAGICK_FIT_WITH_BLACK, ), StaticDisplayMode( id="fill-with-blur", title=_("Fit within screen, pad with a blurred background. Slower."), description=_( "Image is zoomed in or out so that it fully fits within your primary screen. " "The rest of the screen is a filled with blurred version of the image. " ), set_wallpaper_param="zoom", imagemagick_cmd=IMAGEMAGICK_FIT_WITH_BLUR, ), ] def order(self): return 2000 variety-0.8.13/variety/plugins/builtin/display_modes/__init__.py000066400000000000000000000000001475753071700250530ustar00rootroot00000000000000variety-0.8.13/variety/plugins/builtin/downloaders/000077500000000000000000000000001475753071700224415ustar00rootroot00000000000000variety-0.8.13/variety/plugins/builtin/downloaders/APODDownloader.py000066400000000000000000000056101475753071700255570ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random from variety.plugins.downloaders.SimpleDownloader import SimpleDownloader from variety.Util import Util, _ logger = logging.getLogger("variety") random.seed() class APODDownloader(SimpleDownloader): DESCRIPTION = _("NASA Astro Pic of the Day") ROOT_URL = "https://apod.nasa.gov/apod/" @classmethod def get_info(cls): return { "name": "APODDownloader", "description": APODDownloader.DESCRIPTION, "author": "Peter Levi", "version": "0.1", } def get_description(self): return APODDownloader.DESCRIPTION def get_source_type(self): return "apod" def get_source_name(self): return "NASA Astro Pic of the Day" def get_folder_name(self): return "nasa_apod" def get_source_location(self): return self.ROOT_URL def fill_queue(self): logger.info(lambda: "Filling APOD queue from Archive") s = Util.html_soup(self.ROOT_URL + "archivepix.html") urls = [ self.ROOT_URL + x["href"] for x in s.findAll("a") if x["href"].startswith("ap") and x["href"].endswith(".html") ] urls = urls[:730] # leave only last 2 years' pics urls = [url for url in urls if not self.is_in_banned(url)] queue = urls[:3] # always put the latest 3 first urls = urls[3:] random.shuffle(urls) # shuffle the rest queue.extend(urls) return queue def download_queue_item(self, queue_item): origin_url = queue_item logger.info(lambda: "APOD URL: " + origin_url) s = Util.html_soup(origin_url) img_url = None try: link = s.find("img").parent["href"] if link.startswith("image/"): img_url = self.ROOT_URL + link logger.info(lambda: "Image URL: " + img_url) except Exception: pass if img_url: return self.save_locally(origin_url, img_url, source_location=self.ROOT_URL) else: logger.info(lambda: "No image url found for this APOD URL") return None variety-0.8.13/variety/plugins/builtin/downloaders/ArtStationDownloader.py000066400000000000000000000043771475753071700271350ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random from variety.plugins.downloaders.DefaultDownloader import DefaultDownloader from variety.Util import Util logger = logging.getLogger("variety") class ArtStationDownloader(DefaultDownloader): def __init__(self, source, url): DefaultDownloader.__init__(self, source=source, config=url) def fill_queue(self): logger.info(lambda: "ArtStation URL: " + self.config) queue = [] # json_url = ArtStationDownloader.build_json_url(self.config) url = self.config s = Util.html_soup(url) author = s.find("channel").find("title").get_text().strip() author_url = s.find("channel").find("link").next.strip() items = s.findAll("item") for index, item in enumerate(items): try: extra_metadata = { "headline": item.find("title").get_text().strip(), "description": item.find("description").get_text().strip().replace("]]>", ""), "author": author, "authorURL": author_url, } src_url = item.find("guid").text + "#" + str(index) image_urls = [img["src"] for img in item.findAll("img")] for image_url in image_urls: queue.append((src_url, image_url, extra_metadata)) except Exception: logger.exception(lambda: "Could not process an item in the ArtStation rss result") random.shuffle(queue) return queue variety-0.8.13/variety/plugins/builtin/downloaders/ArtStationSource.py000066400000000000000000000072131475753071700262670ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random from variety.plugins.builtin.downloaders.ArtStationDownloader import ArtStationDownloader from variety.plugins.downloaders.ConfigurableImageSource import ConfigurableImageSource from variety.Util import _ random.seed() logger = logging.getLogger("variety") class ArtStationSource(ConfigurableImageSource): @classmethod def get_info(cls): return { "name": "ArtStationSource", "description": _("Configurable source for fetching images from ArtStation"), "author": "Denis Gordeev", "version": "0.1", } def get_source_type(self): return "artstation" def get_source_name(self): return "ArtStation" def get_ui_instruction(self): return _( "Enter the name of an artist or paste the full URL of their " "artstation page with .rss extenstion or without it. \n" "Example: You may specify simply 'leimin' or " "https://www.artstation.com/leimin\n" "Example: Or direct it to the RSS: " "https://www.artstation.com/leimin.rss" ) def get_ui_short_instruction(self): return _("URL or name of an artist: ") def get_ui_short_description(self): return _("Fetch images from a given artist") def validate(self, query): logger.info(lambda: "Validating ArtStation query " + query) if query.endswith("/"): query = query[:-1] if "artstation.com/artwork/" in query: logger.exception(lambda: "Error while validating URL, artwork url") return query, _("We cannot download individual artworks.") if "/" not in query: query = "https://www.artstation.com/%s" % query if not query.endswith(".rss"): query += ".rss" try: # normalize the URL to "https://artstation.com/artist" query = query.replace("http://", "https://") if not query.startswith("https://"): query = "https://" + query query = query.replace("//artstation.com", "//www.artstation.com") if "//www.artstation.com" not in query: return False, _("This does not seem to be a valid ArtStation URL") dl = ArtStationDownloader(self, query) queue = dl.fill_queue() return ( query, None if len(queue) > 0 else _("We could not find any image submissions there."), ) except Exception: logger.exception( lambda: "Error while validating URL, probably no image posts for this URL" ) return query, _("We could not find any image submissions there.") def create_downloader(self, config): return ArtStationDownloader(self, config) variety-0.8.13/variety/plugins/builtin/downloaders/BingDownloader.py000066400000000000000000000063051475753071700257150ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random from datetime import datetime from urllib.parse import parse_qs, urlparse from variety.plugins.downloaders.SimpleDownloader import SimpleDownloader from variety.Util import Util, _ logger = logging.getLogger("variety") random.seed() class BingDownloader(SimpleDownloader): DESCRIPTION = _("Bing Photo of the Day") BING_JSON_URL = ( "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=100&mkt=en-US" ) # n=100, but max 8 images are actually returned... Pity. @classmethod def get_info(cls): return { "name": "BingDownloader", "description": BingDownloader.DESCRIPTION, "author": "Peter Levi", "version": "0.1", } def get_source_type(self): return "bing" def get_description(self): return BingDownloader.DESCRIPTION def get_source_name(self): return "Bing" def get_source_location(self): return "https://www.bing.com/gallery/" def get_local_filename(self, url): return parse_qs(urlparse(url).query)["id"][0] def fill_queue(self): queue = [] s = Util.fetch_json(BingDownloader.BING_JSON_URL) for item in s["images"]: try: if not item["wp"]: # not marked as a wallpaper continue image_url = "https://www.bing.com" + item["urlbase"] + "_UHD.jpg" copyrightlink = item["copyrightlink"] if not "javascript:" in copyrightlink: src_url = copyrightlink else: filename = item["url"].split("/")[-1] name = filename[0 : filename.find("_EN")] src_url = "https://www.bing.com/gallery/#images/%s" % name try: date = datetime.strptime(item["startdate"], "%Y%m%d").strftime("%Y-%m-%d") except: date = item["startdate"] extra_metadata = { "sourceType": "bing", "sfwRating": 100, "headline": "Bing Photo of the Day, %s" % date, "description": item["copyright"], } queue.append((src_url, image_url, extra_metadata)) except: logger.exception(lambda: "Could not process an item in the Bing json result") random.shuffle(queue) return queue variety-0.8.13/variety/plugins/builtin/downloaders/EarthviewDownloader.py000066400000000000000000000057771475753071700270100ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random from variety.plugins.downloaders.ImageSource import Throttling from variety.plugins.downloaders.SimpleDownloader import SimpleDownloader from variety.Util import Util, _ # Credits: Formerly using the data prepared by limhenry @ https://github.com/limhenry/earthview DATA_URL = "https://new-images-preview-dot-earth-viewer.appspot.com/_api/photos.json" logger = logging.getLogger("variety") random.seed() class EarthviewDownloader(SimpleDownloader): DESCRIPTION = _("Google Earth View Wallpapers") ROOT_URL = "https://new-images-preview-dot-earth-viewer.appspot.com/" @classmethod def get_info(cls): return { "name": "EarthviewDownloader", "description": EarthviewDownloader.DESCRIPTION, "author": "Peter Levi", "version": "0.1", } def get_description(self): return EarthviewDownloader.DESCRIPTION def get_source_type(self): return "earthview" def get_source_name(self): return "Earth View" def get_source_location(self): return self.ROOT_URL def fill_queue(self): queue = Util.fetch_json(DATA_URL) random.shuffle(queue) return queue def get_default_throttling(self): # throttle this source, as otherwise maps "overpower" all other types of images # with Variety's default settings, and we have no other way to control source "weights" return Throttling(max_downloads_per_hour=20, max_queue_fills_per_hour=None) def download_queue_item(self, item): item = Util.fetch_json("https://new-images-preview-dot-earth-viewer.appspot.com/_api/" + item["slug"] + ".json") region = item["region"] filename = "{}{} (ID-{}).jpg".format( region + ", " if region and region != "-" else "", item["country"], item["id"] ) origin_url = EarthviewDownloader.ROOT_URL + str(item["slug"]) image_url = item["photoUrl"] if not image_url.startswith("http"): image_url = "https://" + image_url extra_metadata = {"description": item.get("name"), "author": item.get("attribution")} return self.save_locally( origin_url, image_url, local_filename=filename, extra_metadata=extra_metadata ) variety-0.8.13/variety/plugins/builtin/downloaders/MediaRSSDownloader.py000066400000000000000000000212711475753071700264440ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random import urllib.parse import xml.etree.ElementTree as ET from variety.plugins.downloaders.DefaultDownloader import DefaultDownloader from variety.Util import Util logger = logging.getLogger("variety") random.seed() MEDIA_NS = "{http://search.yahoo.com/mrss/}" VARIETY_NS = "{http://vrty.org/}" class MediaRSSDownloader(DefaultDownloader): def __init__(self, source, url): DefaultDownloader.__init__(self, source=source, config=url) @staticmethod def fetch(url): content = Util.fetch_bytes(url) return ET.fromstring(content) @staticmethod def is_valid_content(x): return ( x is not None and "url" in x.attrib and ( Util.is_image(x.attrib["url"]) or ("medium" in x.attrib and x.attrib["medium"].lower() == "image") or ("type" in x.attrib and x.attrib["type"].lower().startswith("image/")) ) ) @staticmethod def validate(url): logger.info(lambda: "Validating MediaRSS url " + url) try: if not url.startswith("http://") and not url.startswith("https://"): url = "https://" + url s = MediaRSSDownloader.fetch(url) walls = [ x.attrib["url"] for x in s.findall(".//{0}content".format(MEDIA_NS)) if MediaRSSDownloader.is_valid_content(x) ] return len(walls) > 0 except Exception: logger.exception(lambda: "Error while validating URL, probably not a MediaRSS feed") return False def download_queue_item(self, queue_item): origin_url, image_url, source_type, source_location, source_name, extra_metadata = ( queue_item ) parse = urllib.parse.urlparse(origin_url) host = parse.netloc if hasattr(parse, "netloc") else "origin" return self.save_locally( origin_url, image_url, source_type or "mediarss", source_location, source_name or host, extra_metadata=extra_metadata, ) def fill_queue(self): queue = [] logger.info(lambda: "MediaRSS URL: " + self.config) s = self.fetch(self.config) for item in s.findall(".//item"): try: origin_url = item.find("link").text group = item.find("{0}group".format(MEDIA_NS)) content = None width = -1 if group is not None: # find the largest image in the group for c in group.findall("{0}content".format(MEDIA_NS)): try: if MediaRSSDownloader.is_valid_content(c): if content is None: content = ( c ) # use the first one, in case we don't find any width info if "width" in c.attrib and int(c.attrib["width"]) > width: content = c width = int(c.attrib["width"]) except Exception: pass else: content = item.find("{0}content".format(MEDIA_NS)) if not MediaRSSDownloader.is_valid_content(content): continue source_name = None source_location = None source_type = None variety_source = item.find("{0}source".format(VARIETY_NS)) if variety_source is not None: source_name = variety_source.attrib.get("name", None) source_location = variety_source.attrib.get("location", None) source_type = variety_source.attrib.get("type", None) extra_metadata = {} try: extra_metadata["headline"] = item.find("{0}title".format(MEDIA_NS)).text except: try: extra_metadata["headline"] = item.find("title").text except: pass try: extra_metadata["description"] = item.find( "{0}description".format(MEDIA_NS) ).text except: pass try: author = item.find("{0}author".format(VARIETY_NS)) if author is not None: extra_metadata["author"] = author.attrib.get("name", None) extra_metadata["authorURL"] = author.attrib.get("url", None) else: extra_metadata["author"] = item.find("{0}credit".format(MEDIA_NS)).text except: pass try: sfw = item.find("{0}sfw_info".format(VARIETY_NS)) if sfw is not None: rating = int(sfw.attrib.get("rating", None)) extra_metadata["sfwRating"] = rating if self.is_safe_mode_enabled() and rating < 100: logger.info( lambda: "Skipping non-safe download from VRTY MediaRss feed. " "Is the source %s suitable for Safe mode?" % self.config ) continue except: pass try: extra_metadata["keywords"] = [ k.strip() for k in item.find("{0}keywords".format(MEDIA_NS)).text.split(",") ] except: pass self.process_content( queue, origin_url, content, source_type, source_location, source_name, extra_metadata, ) except Exception: logger.exception(lambda: "Could not process an item in the Media RSS feed") random.shuffle(queue) return queue def process_content( self, queue, origin_url, content, source_type=None, source_location=None, source_name=None, extra_metadata={}, ): try: logger.debug(lambda: "Checking origin_url " + origin_url) if self.is_in_banned(origin_url): logger.debug(lambda: "In banned, skipping") return image_file_url = content.attrib["url"] if self.is_in_downloaded(image_file_url): logger.debug(lambda: "Already in downloaded") return if self.is_in_favorites(image_file_url): logger.debug(lambda: "Already in favorites") return width = None height = None try: width = int(content.attrib["width"]) height = int(content.attrib["height"]) except Exception: pass if self.is_size_inadequate(width, height): logger.debug(lambda: "Small or non-landscape size/resolution") return logger.debug( lambda: "Appending to queue %s, %s, %s, %s, %s" % (origin_url, image_file_url, source_type, source_location, source_name) ) queue.append( ( origin_url, image_file_url, source_type, source_location, source_name, extra_metadata, ) ) except Exception: logger.exception(lambda: "Error parsing single MediaRSS image info:") variety-0.8.13/variety/plugins/builtin/downloaders/MediaRSSSource.py000066400000000000000000000054471475753071700256150ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random from variety.plugins.builtin.downloaders.MediaRSSDownloader import MediaRSSDownloader from variety.plugins.downloaders.ConfigurableImageSource import ConfigurableImageSource from variety.Util import _ logger = logging.getLogger("variety") random.seed() class MediaRSSSource(ConfigurableImageSource): @classmethod def get_info(cls): return { "name": "MediaRSSSource", "description": _("Configurable source for fetching images from MediaRSS feeds"), "author": "Peter Levi", "version": "0.1", } def get_source_name(self): return "MediaRSS" def get_source_type(self): return "mediarss" def get_ui_instruction(self): return _( "Please paste the URL of the Media RSS feed below. Please note that only Media RSS " "feeds are supported, not arbitrary RSS feeds. Media RSS feeds contain media:content " "tags linking directly to the actual image content. " "Some examples of sites that provide Media RSS feeds are: " "Picasa, " "deviantART, " "SmugMug, " "Flickr, " "InterfaceLIFT." ) def get_ui_short_instruction(self): return _("Paste the URL of the Media RSS feed here: ") def get_ui_short_description(self): return _("Fetch images from a MediaRSS feed") def validate(self, url): if not url.startswith("http://") and not url.startswith("https://"): url = "https://" + url valid = MediaRSSDownloader.validate(url) error = _( "This does not seem to be a valid Media RSS feed URL or there is no content there." ) return url, None if valid else error def create_downloader(self, config): return MediaRSSDownloader(self, config) variety-0.8.13/variety/plugins/builtin/downloaders/NationalGeographicDownloader.py000066400000000000000000000050611475753071700305720ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging from os.path import basename, splitext from variety.plugins.downloaders.SimpleDownloader import SimpleDownloader from variety.Util import Util, _ DATA_URL = "https://www.nationalgeographic.co.uk/page-data/photo-of-day/page-data.json" logger = logging.getLogger("variety") class NationalGeographicDownloader(SimpleDownloader): DESCRIPTION = _("National Geographic's photo of the day") ROOT_URL = "https://www.nationalgeographic.co.uk/photo-of-day" @classmethod def get_info(cls): return { "name": "NationalGeographicDownloader", "description": NationalGeographicDownloader.DESCRIPTION, "author": "Eric Rösch", "version": "0.1", } def get_description(self): return NationalGeographicDownloader.DESCRIPTION def get_source_type(self): return "natgeo" def get_source_name(self): return "National Geographic" def get_source_location(self): return self.ROOT_URL def fill_queue(self): queue = Util.fetch_json(DATA_URL) images = queue["result"]["pageContext"]["node"]["data"]["content"]["images"] return images def download_queue_item(self, item): url = item["entity"]["mediaImage"]["url"] origin_url = NationalGeographicDownloader.ROOT_URL + "?image=" + splitext(basename(url))[0] image_url = "https://static.nationalgeographic.co.uk" + url author = item["entity"]["credit"] extra_metadata = { "author": author, "authorURL": "http://google.com/search?sourceid=variety&q=" + author, "headline": item["entity"]["mediaImage"]["alt"], "description": item["entity"]["caption"][3:-6], } return self.save_locally(origin_url, image_url, extra_metadata=extra_metadata) variety-0.8.13/variety/plugins/builtin/downloaders/RedditDownloader.py000066400000000000000000000050321475753071700262450ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random import re import urllib.parse from variety.plugins.downloaders.DefaultDownloader import DefaultDownloader from variety.Util import Util logger = logging.getLogger("variety") class RedditDownloader(DefaultDownloader): def __init__(self, source, url): DefaultDownloader.__init__(self, source=source, config=url) @staticmethod def build_json_url(url): p = urllib.parse.urlparse(url) return ( p.scheme + "://" + p.netloc + p.path + ".json" + "?" + p.query + ("&" if p.query else "") + "limit=100" ) def fill_queue(self): logger.info(lambda: "Reddit URL: " + self.config) queue = [] json_url = RedditDownloader.build_json_url(self.config) s = Util.fetch_json(json_url) for item in s["data"]["children"]: try: data = item["data"] image_url = data["url"] if re.match(r"^http(s)?://imgur\.com/\w+$", image_url): image_url = image_url.replace("://", "://i.") + ".jpg" if image_url.lower().endswith((".jpg", ".jpeg", ".png")): src_url = "https://www.reddit.com" + data["permalink"] extra_metadata = {"sourceType": "reddit"} if data["over_18"]: extra_metadata["sfwRating"] = 0 if self.is_safe_mode_enabled(): continue queue.append((src_url, image_url, extra_metadata)) except Exception: logger.exception(lambda: "Could not process an item in the Reddit json result") random.shuffle(queue) return queue variety-0.8.13/variety/plugins/builtin/downloaders/RedditSource.py000066400000000000000000000066011475753071700254120ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random from variety.plugins.builtin.downloaders.RedditDownloader import RedditDownloader from variety.plugins.downloaders.ConfigurableImageSource import ConfigurableImageSource from variety.Util import _ random.seed() logger = logging.getLogger("variety") class RedditSource(ConfigurableImageSource): @classmethod def get_info(cls): return { "name": "RedditSource", "description": _("Configurable source for fetching images from Reddit"), "author": "Peter Levi", "version": "0.1", } def get_source_type(self): return "reddit" def get_source_name(self): return "Reddit" def get_ui_instruction(self): return _( "Enter the name of a subreddit or paste the full URL of a subreddit or a " "Reddit user. You may specify sort order and time " "period if you wish. Variety will use posts to direct images or to Imgur pages " "within the first 100 submissions returned by Reddit.\n\n" "Example: You may specify simply 'comics' or " "http://www.reddit.com/r/comics\n" "Example: Top posts from the month: " "http://www.reddit.com/r/comics/top/?sort=top&t=month" ) def get_ui_short_instruction(self): return _("URL or name of a subreddit: ") def get_ui_short_description(self): return _("Fetch images from a given subreddit or user") def validate(self, query): logger.info(lambda: "Validating Reddit query " + query) if not "/" in query: query = "https://www.reddit.com/r/%s" % query try: if not query.startswith("http://") and not query.startswith("https://"): query = "http://" + query if not "//reddit.com" in query and not "//www.reddit.com" in query: return False, _("This does not seem to be a valid Reddit URL") dl = RedditDownloader(self, query) queue = dl.fill_queue() return ( query, None if len(queue) > 0 else _("We could not find any image submissions there."), ) except Exception: logger.exception( lambda: "Error while validating URL, probably no image posts for this URL" ) return query, _("We could not find any image submissions there.") def create_downloader(self, config): return RedditDownloader(self, config) variety-0.8.13/variety/plugins/builtin/downloaders/UnsplashConfigurableSource.py000066400000000000000000000132431475753071700303150ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random from requests import HTTPError from variety.plugins.builtin.downloaders.UnsplashDownloader import UnsplashDownloader from variety.plugins.downloaders.ConfigurableImageSource import ConfigurableImageSource from variety.plugins.downloaders.DefaultDownloader import DefaultDownloader from variety.plugins.downloaders.ImageSource import Throttling from variety.Util import Util, _ logger = logging.getLogger("variety") random.seed() class UnsupportedConfig(Exception): pass class UnsplashConfigurableSource(ConfigurableImageSource): class UnsplashConfigurableDownloader(UnsplashDownloader): def __init__(self, source, config): DefaultDownloader.__init__(self, source, config) self.set_variety(source.get_variety()) def get_source_type(self): return self.source.get_source_type() def get_description(self): return self.config def get_folder_name(self): return super(DefaultDownloader, self).get_folder_name() def get_unsplash_api_url(self): self.config = self.config.replace("http://", "https://") params = {} if self.config.startswith("https://"): if self.config.startswith("https://unsplash.com/s/photos/"): query = self.config.replace("https://unsplash.com/s/photos/", "").split("/")[0] params["query"] = query elif self.config.startswith("https://unsplash.com/@"): username = self.config.replace("https://unsplash.com/@", "").split("/")[0] params["username"] = username elif self.config.startswith("https://unsplash.com/collections/"): collections = self.config.replace( "https://unsplash.com/collections/", "" ).split("/")[0] params["collections"] = collections elif self.config.startswith("https://unsplash.com/t/"): collections = self.config.replace("https://unsplash.com/t/", "").split("/")[0] params["topics"] = collections else: raise UnsupportedConfig() else: params["query"] = self.config return ( super().get_unsplash_api_url() + "&" + "&".join("{}={}".format(key, value) for key, value in params.items()) ) @classmethod def get_info(cls): return { "name": "UnsplashConfigurableSource", "description": _("Configurable source for fetching photos from Unsplash.com"), "author": "Peter Levi", "version": "0.1", } def get_source_type(self): return "unsplash-search" def validate(self, config): try: url = self.UnsplashConfigurableDownloader(self, config).get_unsplash_api_url() data = Util.fetch_json(url) valid = "errors" not in data return config, None if valid else _("No images found") except UnsupportedConfig: return config, _("We do not support this type of URL") except Exception as e: if isinstance(e, HTTPError) and e.response.status_code == 404: return config, _("No images found") else: return config, _("Oops, this didn't work. Is the remote service up?") def create_downloader(self, config): return self.UnsplashConfigurableDownloader(self, config) def get_ui_instruction(self): return _( "We use the Unsplash API to fetch random images " "that match the given search term or URL. The Unsplash API is rate-limited, so " "Variety fetches images from Unsplash sources as a reduced rate.\n" "\n" "Please specify either a search keyword, or the URL of a search result, user, " "collection or topic.\n" "Example: https://unsplash.com/collections/3863203/desktop-wallpapers\n" "Example: https://unsplash.com/@pawel_czerwinski\n" "Example: https://unsplash.com/t/wallpapers" ) def get_ui_short_instruction(self): return _("Search keyword or URL: ") def get_ui_short_description(self): return _("Fetch images from Unsplash.com for a given criteria") def get_source_name(self): return "Unsplash" def get_server_options_key(self): return "unsplash_v2" def get_default_throttling(self): return Throttling(max_downloads_per_hour=10, max_queue_fills_per_hour=1) def on_image_set_as_wallpaper(self, img, meta): return UnsplashDownloader().on_image_set_as_wallpaper(img, meta) variety-0.8.13/variety/plugins/builtin/downloaders/UnsplashDownloader.py000066400000000000000000000123161475753071700266320ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random import time from variety.plugins.downloaders.ImageSource import Throttling from variety.plugins.downloaders.SimpleDownloader import SimpleDownloader from variety.Util import Util, _ logger = logging.getLogger("variety") random.seed() class UnsplashDownloader(SimpleDownloader): DESCRIPTION = _("High-resolution photos from Unsplash.com") API_KEY = "37ee4be36ffd27e79decd4ef382d4949" HASH = ( b"AwBXAAFSUQtSAAUGBQQED11dBAdRDQMFVQwCVgAOBQwCDwMDDAYDBARTAgIGAVdVCQdRBQUCU1NV\n" b"DARSAQgBWA==\n" ) UTM_PARAMS = "?utm_source=Variety+Wallpaper+Changer&utm_medium=referral" rate_limiting_started_time = 0 @classmethod def get_info(cls): return { "name": "UnsplashDownloader", "description": UnsplashDownloader.DESCRIPTION, "author": "Peter Levi", "version": "0.1", } def get_source_type(self): return "unsplash" def get_description(self): return UnsplashDownloader.DESCRIPTION def get_source_name(self): return "Unsplash.com" def get_source_location(self): return "https://unsplash.com" def get_folder_name(self): return "Unsplash" def get_server_options_key(self): return "unsplash_v2" def get_default_throttling(self): return Throttling(max_downloads_per_hour=10, max_queue_fills_per_hour=1) def get_unsplash_api_url(self): return "https://api.unsplash.com/photos/random?count=30&client_id={}{}".format( Util.unxor(UnsplashDownloader.HASH, UnsplashDownloader.API_KEY), "&orientation=landscape" if self.get_variety().options.use_landscape_enabled else "", ) def fill_queue(self): if time.time() - UnsplashDownloader.rate_limiting_started_time < 3600: logger.info( lambda: "Unsplash queue empty, but rate limit reached, will try again later" ) return [] url = self.get_unsplash_api_url() logger.info(lambda: "Filling Unsplash queue from " + url) r = Util.request(url) if int(r.headers.get("X-Ratelimit-Remaining", 1000000)) < 1000: UnsplashDownloader.rate_limiting_started_time = time.time() queue = [] for item in r.json(): try: width = item["width"] height = item["height"] if self.is_size_inadequate(width, height): continue image_url = item["urls"]["full"] + "&w={}".format( max(1980, int(Util.get_primary_display_size()[0] * 1.2)) ) origin_url = item["links"]["html"] + UnsplashDownloader.UTM_PARAMS if "plus.unsplash.com/" in image_url: # exclude watermarked wallpapers continue extra_metadata = { "sourceType": "unsplash", "sfwRating": 100, "author": item["user"]["name"], "authorURL": item["user"]["links"]["html"] + UnsplashDownloader.UTM_PARAMS, "description": item.get("description", item.get("alt_description")), "keywords": [ cat for cat, approval in item.get("topic_submissions", {}).items() if approval.get("status") == "approved" ], "extraData": { "unsplashDownloadLocation": item["links"]["download_location"], "unsplashDownloadReported": False, }, } queue.append((origin_url, image_url, extra_metadata)) except: logger.exception(lambda: "Could not process an item from Unsplash") raise random.shuffle(queue) return queue def on_image_set_as_wallpaper(self, img, meta): extraData = meta.get("extraData", None) if not extraData: return download_loc = extraData.get("unsplashDownloadLocation") reported = extraData.get("unsplashDownloadReported") if download_loc and not reported: url = "{}?client_id={}".format( download_loc, Util.unxor(UnsplashDownloader.HASH, UnsplashDownloader.API_KEY) ) Util.fetch(url) meta["extraData"]["unsplashDownloadReported"] = True Util.write_metadata(img, meta) variety-0.8.13/variety/plugins/builtin/downloaders/WallhavenDownloader.py000066400000000000000000000150131475753071700267530ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random import urllib.parse import requests from variety.plugins.builtin.downloaders.WallhavenLegacyDownloader import WallhavenLegacyDownloader from variety.plugins.downloaders.DefaultDownloader import DefaultDownloader from variety.Util import Util, _ API_SEARCH = "https://wallhaven.cc/api/v1/search" API_SAFE_SEARCH_URL = ( "https://wallhaven.cc/api/v1/search?q=%s&categories=111&purity=100&sorting=favorites&order=desc" ) WEB_DOMAIN_SEARCH = "https://wallhaven.cc/search" WALLPAPER_INFO_URL = "https://wallhaven.cc/api/v1/w/%s" logger = logging.getLogger("variety") random.seed() class BadApiKeyException(Exception): pass class WallhavenDownloader(DefaultDownloader): def __init__(self, source, location, api_key): DefaultDownloader.__init__(self, source=source, config=location) self.api_key = api_key self.legacy_downloader = WallhavenLegacyDownloader(source, location) self.parse_location() def update_download_folder(self, global_download_folder): target_folder = super().update_download_folder(global_download_folder) self.legacy_downloader.target_folder = target_folder self.legacy_downloader.state = self.state return target_folder def parse_location(self): if not self.config.startswith(("http://", "https://")): # interpret location as keywords self.api_url = API_SAFE_SEARCH_URL % self.config else: # location is an URL, use it url = self.config.replace("http://", "https://") # Use Wallhaven API if url.startswith(API_SEARCH): self.api_url = url elif url.startswith(WEB_DOMAIN_SEARCH): self.api_url = url.replace(WEB_DOMAIN_SEARCH, API_SEARCH) elif url.startswith("https://wallhaven.cc/tag"): self.api_url = url.replace( "https://wallhaven.cc/tag/", "https://wallhaven.cc/api/v1/search?q=id:" ) else: # we'll fallback to WallhavenLegacyDownloader self.api_url = None # make sure we use the API key, if provided if self.api_url and self.api_key and "&apikey=" not in self.api_url: self.api_url += "&apikey=" + self.api_key def search(self, page=None): if not self.api_url: return self.legacy_downloader.search(page) url = self.api_url if page: url = url + ("&" if "?" in self.api_url else "?") + "page=" + str(page) logger.info(lambda: "Performing wallhaven search: url=%s" % url) response = Util.fetch_json(url) count = response["meta"]["total"] return response, count @staticmethod def validate(location, api_key): logger.info(lambda: "Validating Wallhaven location " + location) try: _, count = WallhavenDownloader(None, location, api_key).search() return count > 0 except requests.HTTPError as e: if api_key and e.response.status_code == 401: raise BadApiKeyException() except Exception: pass try: return WallhavenLegacyDownloader.validate(location) except: logger.exception(lambda: "Error while validating Wallhaven search") return False def download_queue_item(self, queue_item): if not self.api_url: return self.legacy_downloader.download_queue_item(queue_item) wallpaper_url = queue_item["url"] logger.info(lambda: "Wallpaper URL: " + wallpaper_url) src_url = queue_item["path"] logger.info(lambda: "Image src URL: " + src_url) extra_metadata = {} try: wallpaper_info = Util.fetch_json( WALLPAPER_INFO_URL % urllib.parse.quote(queue_item["id"]) ) extra_metadata["keywords"] = [tag["name"] for tag in wallpaper_info["data"]["tags"]] except: pass try: purity = queue_item["purity"] sfw_rating = {"sfw": 100, "sketchy": 50, "nsfw": 0}[purity] extra_metadata["sfwRating"] = sfw_rating if self.is_safe_mode_enabled() and sfw_rating < 100: logger.info( lambda: "Skipping non-safe download from Wallhaven. " "Is the source %s suitable for Safe mode?" % self.config ) return None except: pass return self.save_locally(wallpaper_url, src_url, extra_metadata=extra_metadata) def fill_queue(self): if not self.api_url: return self.legacy_downloader.fill_queue() queue = [] not_random = "sorting=random" not in self.api_url if not_random: s, count = self.search() pages = min(count, 1000) // int(s["meta"]["per_page"]) + 1 page = random.randint(1, pages) logger.info(lambda: "%s wallpapers in result, using page %s" % (count, page)) s, _ = self.search(page=page) else: s, _ = self.search() results = s["data"] for result in results: try: p = result["resolution"].split("x") width = p[0] height = p[1] if self.is_size_inadequate(width, height): continue except Exception: # missing or unparseable resolution - consider ok pass queue.append(result) random.shuffle(queue) if not_random and len(queue) >= 20: queue = queue[: len(queue) // 2] # only use randomly half the images from the page - # if we ever hit that same page again, we'll still have what to download return queue variety-0.8.13/variety/plugins/builtin/downloaders/WallhavenLegacyDownloader.py000066400000000000000000000124751475753071700301110ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random import urllib.parse from variety.plugins.downloaders.DefaultDownloader import DefaultDownloader from variety.Util import Util, _ SEARCH_URL = ( "https://wallhaven.cc/search?q=%s&categories=111&purity=100&sorting=favorites&order=desc" ) logger = logging.getLogger("variety") random.seed() class WallhavenLegacyDownloader(DefaultDownloader): def __init__(self, source, location): DefaultDownloader.__init__(self, source=source, config=location) self.parse_location() def parse_location(self): if self.config.startswith(("http://", "https://")): # location is an URL, use it self.url = self.config.replace("http://", "https://") else: # interpret location as keywords self.url = SEARCH_URL % urllib.parse.quote(self.config) def search(self, page=None): url = self.url if page: url = url + ("&" if "?" in self.url else "?") + "page=" + str(page) logger.info(lambda: "Performing wallhaven search: url=%s" % url) soup = Util.html_soup(url) result_count = None try: result_count = int( soup.find("header", {"class": "listing-header"}) .find("h1") .text.split()[0] .replace(",", "") ) except: pass return soup, result_count @staticmethod def validate(location): logger.info(lambda: "Validating Wallhaven location " + location) try: s, count = WallhavenLegacyDownloader(None, location).search() wall = s.find("figure", {"class": "thumb"}) if not wall: return False link = wall.find("a", {"class": "preview"}) return link is not None except Exception: logger.exception(lambda: "Error while validating wallhaven search") return False def download_queue_item(self, queue_item): wallpaper_url = queue_item logger.info(lambda: "Wallpaper URL: " + wallpaper_url) s = Util.html_soup(wallpaper_url) src_url = s.find("img", id="wallpaper")["src"] logger.info(lambda: "Image src URL: " + src_url) extra_metadata = {} try: extra_metadata["keywords"] = [ el.text.strip() for el in s.find_all("a", {"class": "tagname"}) ] except: pass try: purity = s.find("div", "sidebar-content").find("label", "purity").text.lower() sfw_rating = {"sfw": 100, "sketchy": 50, "nsfw": 0}[purity] extra_metadata["sfwRating"] = sfw_rating if self.is_safe_mode_enabled() and sfw_rating < 100: logger.info( lambda: "Skipping non-safe download from Wallhaven. " "Is the source %s suitable for Safe mode?" % self.config ) return None except: pass return self.save_locally(wallpaper_url, src_url, extra_metadata=extra_metadata) def fill_queue(self): queue = [] not_random = not "sorting=random" in self.url if not_random: s, count = self.search() if not count: count = 300 pages = min(count, 300) // 24 + 1 page = random.randint(1, pages) logger.info(lambda: "%s wallpapers in result, using page %s" % (count, page)) s, count = self.search(page=page) else: s, count = self.search() thumbs = s.find_all("figure", {"class": "thumb"}) for thumb in thumbs: try: p = list(map(int, thumb.find("span", {"class": "wall-res"}).contents[0].split("x"))) width = p[0] height = p[1] if self.is_size_inadequate(width, height): continue except Exception: # missing or unparseable resolution - consider ok pass try: link = thumb.find("a", {"class": "preview"})["href"] if self.is_in_banned(link): continue queue.append(link) except Exception: logger.debug(lambda: "Missing link for thumbnail") random.shuffle(queue) if not_random and len(queue) >= 20: queue = queue[: len(queue) // 2] # only use randomly half the images from the page - # if we ever hit that same page again, we'll still have what to download return queue variety-0.8.13/variety/plugins/builtin/downloaders/WallhavenSource.py000066400000000000000000000065041475753071700261220ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random from variety.plugins.builtin.downloaders.WallhavenDownloader import ( BadApiKeyException, WallhavenDownloader, ) from variety.plugins.downloaders.ConfigurableImageSource import ConfigurableImageSource from variety.plugins.downloaders.ImageSource import Throttling from variety.Util import _ logger = logging.getLogger("variety") random.seed() class WallhavenSource(ConfigurableImageSource): @classmethod def get_info(cls): return { "name": "WallhavenSource", "description": _("Configurable source for fetching images from Wallhaven.cc"), "author": "Peter Levi", "version": "0.1", } def get_source_name(self): return "Wallhaven.cc" def get_source_type(self): return "wallhaven" def get_default_throttling(self): return Throttling(max_downloads_per_hour=360, max_queue_fills_per_hour=40) def get_ui_instruction(self): return _( "Wallhaven.cc provides a variety of image search options. " "Below you can specify keywords to search for, or visit Wallhaven.cc, " "setup your search criteria there, ensure you like the results, and paste the full Wallhaven URL " "in the box.\n" "\n" "If you specify keywords, the most liked safe-for-work images that match all of the keywords will " "be used. \n" "\n" "If you specify a Wallhaven URL, please choose the sorting criteria carefully - Variety regularly " "requests images, but uses only images from the first several hundred returned. Random or Date will " "mean this image source will have a longer 'lifetime' till it is exhausted. Favorites will provide " "better images and Relevance will provide closer matches when searching for phrases or colors." ) def get_ui_short_instruction(self): return _("Enter keywords or paste URL here: ") def get_ui_short_description(self): return _("Fetch images from Wallhaven.cc for a given criteria") def validate(self, query, api_key=""): try: valid = WallhavenDownloader.validate(query, api_key=api_key) return query, None if valid else _("No images found") except BadApiKeyException: return query, _('Got "Unauthorized" response. Invalid API key?') def create_downloader(self, config): return WallhavenDownloader(self, config, self.variety.options.wallhaven_api_key) variety-0.8.13/variety/plugins/builtin/downloaders/__init__.py000066400000000000000000000000001475753071700245400ustar00rootroot00000000000000variety-0.8.13/variety/plugins/builtin/quotes/000077500000000000000000000000001475753071700214405ustar00rootroot00000000000000variety-0.8.13/variety/plugins/builtin/quotes/FortuneSource.py000066400000000000000000000036261475753071700246240ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2019, Dan Jones # Copyright (c) 2019, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE # # Based on gist: https://gist.github.com/goodevilgenius/3878ce0f3e232e3daf5c # import re import subprocess from locale import gettext as _ from variety.plugins.IQuoteSource import IQuoteSource ANSI_ESCAPE_RE = re.compile(r"(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]", flags=re.IGNORECASE) class FortuneSource(IQuoteSource): @classmethod def get_info(cls): return { "name": "UNIX fortune program", "description": _( "Displays quotes using the UNIX fortune program. " "You may want to install additional fortune packs, e.g. fortunes-bofh-excuses." ), "author": "Dan Jones", "version": "0.1", } def needs_internet(self): return False def get_random(self): fortune = subprocess.check_output(["fortune"]).decode().strip() fortune = ANSI_ESCAPE_RE.sub("", fortune) q = fortune.split("--") quote = q[0].strip() author = q[1].strip() if len(q) > 1 else None return [ {"quote": quote, "author": author, "sourceName": "UNIX fortune program", "link": None} ] variety-0.8.13/variety/plugins/builtin/quotes/GoodreadsSource.py000066400000000000000000000127741475753071700251150ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random import re from httplib2 import iri2uri from variety.plugins.IQuoteSource import IQuoteSource from variety.Util import Util, _ logger = logging.getLogger("variety") KEYWORDS = [ "love", "humor", "inspirational", "life", "funny", "writing", "death", "romance", "truth", "poetry", "religion", "god", "philosophy", "wisdom", "books", "happiness", "humour", "art", "faith", "politics", "reading", "science", "relationships", "war", "inspiration", "friendship", "women", "music", "success", "hope", "spirituality", "freedom", "fear", "beauty", "christianity", "history", "inspirational-quotes", "time", "marriage", "fantasy", "dreams", "sex", "nature", "education", "life-lessons", "change", "literature", "children", "pain", "fiction", "money", "people", "knowledge", "motivational", "family", "humanity", "peace", "reality", "kindlehighlight", "self-help", "men", "courage", "society", "creativity", "power", "humorous", "future", "food", "heart", "quotes", "work", "words", "memory", "leadership", "passion", "spiritual", "soul", "loss", "grief", "language", "psychology", "friends", "paranormal-romance", "learning", "imagination", "world", "magic", "sadness", "feminism", "depression", ] class GoodreadsSource(IQuoteSource): def __init__(self): super(IQuoteSource, self).__init__() @classmethod def get_info(cls): return { "name": "Goodreads", "description": _("Fetches quotes from Goodreads.com"), "author": "Peter Levi", "version": "0.1", } def supports_search(self): return True def get_random(self): return self.get_for_keyword(random.choice(KEYWORDS))[:4] def get_for_author(self, author): logger.info(lambda: "Fetching quotes from Goodreads for author=%s" % author) url = iri2uri("https://www.goodreads.com/quotes/search?utf8=\u2713&q=%s" % author) soup = Util.html_soup(url) page_links = list( Util.safe_map( int, [ pagelink.contents[0] for pagelink in soup.find_all(href=re.compile("quotes/search.*page=")) ], ) ) if page_links: page = random.randint(1, max(page_links)) url = iri2uri( "https://www.goodreads.com/quotes/search?utf8=\u2713&q=%s&page=%d" % (author, page) ) soup = Util.html_soup(url) return self.get_from_soup(url, soup) def get_for_keyword(self, keyword): logger.info(lambda: "Fetching quotes from Goodreads for keyword=%s" % keyword) url = iri2uri("https://www.goodreads.com/quotes/tag?utf8=\u2713&id=%s" % keyword) soup = Util.html_soup(url) page_links = list( Util.safe_map( int, [ pagelink.contents[0] for pagelink in soup.find_all(href=re.compile("quotes/tag.*page=")) ], ) ) if page_links: page = random.randint(1, max(page_links)) url = iri2uri( "https://www.goodreads.com/quotes/tag?utf8=\u2713&id=%s&page=%d" % (keyword, page) ) soup = Util.html_soup(url) return self.get_from_soup(url, soup) def get_from_soup(self, url, soup): logger.info(lambda: "Used Goodreads url %s" % url) quotes = [] for div in soup.find_all("div", {"class": "quoteText"}): logger.debug(lambda: "Parsing quote for div\n%s" % div) try: quote_text = ( "\n".join(div.find_all(text=True, recursive=False)).replace("―", "").strip() ) author = ( div.find("span", attrs={"class": "authorOrTitle"}).string.strip().strip(",") ) first_a = div.find("a") if first_a: link = "https://www.goodreads.com" + first_a["href"] else: link = None # No link given quotes.append( {"quote": quote_text, "author": author, "sourceName": "Goodreads", "link": link} ) except Exception: logger.exception(lambda: "Could not extract Goodreads quote") if not quotes: logger.warning(lambda: "Goodreads: no quotes found at %s" % url) return quotes variety-0.8.13/variety/plugins/builtin/quotes/LocalFilesSource.py000066400000000000000000000077041475753071700252200ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import os import re from variety.plugins.IQuoteSource import IQuoteSource from variety.profile import get_profile_path from variety.Util import _ logger = logging.getLogger("variety") class LocalFilesSource(IQuoteSource): def __init__(self): super(IQuoteSource, self).__init__() self.quotes = [] @classmethod def get_info(cls): return { "name": "Local text files", "description": _( "Displays quotes, defined in local text files.\n" "Put your own txt files in: {}pluginconfig/quotes/.\n" "The file format is:\n\nquote -- author\n.\nsecond quote -- another author\n.\netc...\n\n" "Example: http://rvelthuis.de/zips/quotes.txt" ).format(get_profile_path(expanded=False)), "author": "Peter Levi", "version": "0.1", } def needs_internet(self): return False def supports_search(self): return True def activate(self): if self.active: return super(LocalFilesSource, self).activate() self.quotes = [] # prefer files in the pluginconfig for f in os.listdir(self.get_config_folder()): if f.endswith(".txt"): self.load(os.path.join(self.get_config_folder(), f)) # use the defaults if nothing useful in pluginconfig if not self.quotes: for f in os.listdir(self.folder): if f.endswith(".txt"): self.load(os.path.join(self.folder, f)) def deactivate(self): self.quotes = [] def load(self, path): try: logger.info(lambda: "Loading quotes file %s" % path) with open(path, "r", encoding="utf-8", errors="ignore") as f: s = f.read() for q in re.split(r"(^\.$|^%$)", s, flags=re.MULTILINE): try: if q.strip() and len(q.strip()) > 5: parts = q.split("-- ") quote = parts[0] if quote[0] == quote[-1] == '"': quote = "\u201C%s\u201D" % quote[1:-1] author = parts[1].strip() if len(parts) > 1 else None self.quotes.append( { "quote": quote, "author": author, "sourceName": os.path.basename(path), } ) except Exception: logger.debug(lambda: "Could not process local quote %s" % q) except Exception: logger.exception(lambda: "Could not load quotes file %s" % path) def get_random(self): return self.quotes def get_for_author(self, author): return [ q for q in self.quotes if q["author"] and q["author"].lower().find(author.lower()) >= 0 ] def get_for_keyword(self, keyword): return self.get_for_author(keyword) + [ q for q in self.quotes if q["quote"].lower().find(keyword.lower()) >= 0 ] variety-0.8.13/variety/plugins/builtin/quotes/QuotationsPageSource.py000066400000000000000000000102221475753071700261330ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import logging import random import re import bs4 from httplib2 import iri2uri from variety.plugins.IQuoteSource import IQuoteSource from variety.Util import Util, _ logger = logging.getLogger("variety") class QuotationsPageSource(IQuoteSource): @classmethod def get_info(cls): return { "name": "TheQuotationsPage.com", "description": _("Fetches quotes from TheQuotationsPage.com"), "author": "Peter Levi", "version": "0.1", } def supports_search(self): return True def get_from_html(self, url, html): quotes = [] bs = bs4.BeautifulSoup(html, "lxml") fixmap = { "\u0091": "\u2018", "\u0092": "\u2019", "\u0093": "\u201C", "\u0094": "\u201D", "\u0085": "...", "\u0097": "\u2014", "\u0096": "-", } for item in bs.findAll("dt", "quote"): quote = None try: quote = item.find("a").contents[0] for k, v in fixmap.items(): quote = quote.replace(k, v) quote = "\u201C%s\u201D" % quote link = "http://www.quotationspage.com" + item.find("a")["href"] try: author = item.next_sibling.find("b").find("a").contents[0] except Exception: try: author = item.next_sibling.find("b").contents[0] except Exception: author = None quotes.append( { "quote": quote, "author": author, "sourceName": "TheQuotationsPage.com", "link": link, } ) except Exception: logger.warning(lambda: "Could not get or parse quote: %s" % quote) if not quotes: logger.warning(lambda: "QuotationsPage: no quotes found at %s" % url) return quotes def get_random(self): return self.get_for_search_url("http://www.quotationspage.com/random.php") def get_for_author(self, author): return self.get_for_search_url( iri2uri("http://www.quotationspage.com/search.php?Search=&Author=%s" % author) ) def get_for_keyword(self, keyword): return self.get_for_search_url( iri2uri("http://www.quotationspage.com/search.php?Search=%s&Author=" % keyword) ) def get_for_search_url(self, url): logger.info(lambda: "Fetching quotes from Goodreads for search url=%s" % url) html = Util.fetch(url) try: page = random.randint(1, int(re.findall(r"Page 1 of (\d+)", html)[0])) url += "&page=%d" % page html = Util.fetch(url) except Exception: pass # probably just one page logger.info(lambda: "Used QuotationsPage url %s" % url) r = r".*
(.*)
.*" if re.match(r, html, flags=re.M | re.S): html = re.sub(r, "\\1", html, flags=re.M | re.S) # without this BeautifulSoup gets confused by some scripts return self.get_from_html(url, html) if __name__ == "__main__": q = QuotationsPageSource() print(q.get_for_author("einstein")) print(q.get_for_keyword("funny")) print(q.get_random()) variety-0.8.13/variety/plugins/builtin/quotes/UrbanDictionarySource.py000066400000000000000000000040501475753071700262670ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2019, James Miller # Copyright (c) 2019, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE from locale import gettext as _ from variety.plugins.IQuoteSource import IQuoteSource from variety.Util import Util class UrbanDictionarySource(IQuoteSource): @classmethod def get_info(cls): return { "name": "Urban Dictionary", "description": _("Displays definitions from Urban Dictionary"), "author": "James Miller", "version": "0.1", } def get_random(self): dict_dict = Util.fetch_json("https://api.urbandictionary.com/v0/random") def _clean(s): return s.strip().replace("[", "").replace("]", "") result = [] for entry in dict_dict["list"]: word = entry["word"] definition = _clean(entry["definition"]) example = _clean(entry["example"]) quote = ( '"{}"'.format(word) + "\n\n" + definition + ("\n\nExample:\n{}".format(example) if example else "") ) result.append( { "quote": quote, "author": entry["author"], "sourceName": "Urban Dictionary", "link": entry["permalink"], } ) return result variety-0.8.13/variety/plugins/builtin/quotes/__init__.py000066400000000000000000000000001475753071700235370ustar00rootroot00000000000000variety-0.8.13/variety/plugins/builtin/quotes/quotes.txt000066400000000000000000007557521475753071700235460ustar00rootroot00000000000000Marge: Now, I know you haven't liked some of my past suggestions, like switching to the metric system -- Abe: The metric system is the tool of the devil! My car gets forty rods to the hogshead and that's the way I likes it. -- The Simpsons episode "A Star is Burns" . "Let's be very honest about what this is about. It's not about bashing Democrats, it's not about taxes, they have no idea what the Boston tea party was about, they don't know their history at all. This is about hating a black man in the White House. This is racism straight up." -- Janeane Garofalo . "If Barbie is so popular, why do you have to buy her friends?" -- Steven Wright . "We can repair anything. (Please knock hard on the door - the bell doesn't work.)" -- Sign on door of repair shop . "A verbal contract is not worth the paper it's written on." -- Samuel Goldwyn . "Facts are stupid things." -- Ronald Reagan, Former U.S. President . "I never comment on referees and I'm not going to break the habit of a lifetime for that prat." -- Ron Atkinson . "Solutions are not the answer." -- Richard Nixon, former U.S. President . "Reports are sketchy, but we have heard that in the first heart transplant operation in Belgium, both patient and donor are doing fine." -- Radio news announcer . "I knew I was an unwanted baby when I saw that my bath toys were a toaster and a radio." -- Joan Rivers . "I don't feel we did wrong in taking this great country away from them. There were great numbers of people who needed new land, and the Indians were selfishly trying to keep it for themselves." -- John Wayne, Actor . "Happiness is your dentist telling you it won't hurt and then having him catch his hand in the drill." -- Johnny Carson . "A dentist at work in his vocation always looks down in the mouth." -- George D. Prentice . "Every tooth in a man's head is more valuable than a diamond." -- Miguel de Cervantes, Don Quixote, 1605 . "If suffering brought wisdom, the dentists office would be full of luminous ideas." -- Mason Cooley . "You don't have to brush your teeth - just the ones you want to keep." -- Unknown . "Some tortures are physical And some are mental, But the one that is both Is dental." -- Ogden Nash . "Too many of today's children have straight teeth and crooked morals." -- Unknown high school principal . "The man with a toothache thinks everyone happy whose teeth are sound." -- George Bernard Shaw . "Dentist: a prestidigitator who, putting metal into your mouth, pulls coin out of your pocket." -- Ambrose Bierce . "I find that most men would rather have their bellies opened for five hundred dollars than have a tooth pulled for five." -- Martin H. Fischer . "For there was never yet philosopher That could endure the toothache patiently. -- William Shakespeare, Much Ado About Nothing . "We do have a zeal for laughter in most situations, give or take a dentist." -- Joseph Heller . "Even pearls are dark before the whiteness of his teeth." -- William R. Alger . "If a patient cannot clean his teeth, no dentist can clean them for him." -- Martin H. Fischer . "An aching tooth is better out than in. To lose a rotting member is a gain." -- Richard Baxter, Poetical Fragments . "My health plan doesn't cover dental, so I enrolled my teeth as 32 dependents, each needing a complete physical once a year." -- Robert Brault, www.robertbrault.com . "A man loses his illusions first, his teeth second, and his follies last." -- Helen Rowland . "There are two things in life that a sage must preserve at every sacrifice, the coats of his stomach and the enamel of his teeth. Some evils admit of consolations, but there are no comforters for dyspepsia and the toothache." -- Henry Lytton Bulwer . "You know, sometimes a man just can't satisfy all of a woman's desires. Which is why God invented dental floss." -- Author Unknown . "Adam and Eve had many advantages, but the principal one was that they escaped teething." -- Mark Twain . "The tongue is ever turning to the aching tooth." -- Thomas Fuller . "Some old women and men grow bitter with age; the more their teeth drop out, the more biting they get." -- George D. Prentice . "I had very good dentures once. Some magnificent gold work. It's the only form of jewelry a man can wear that women fully appreciate." -- Graham Greene . "I'm always amazed to hear of air crash victims so badly mutilated that they have to be identified by their dental records. What I can't understand is, if they don't know who you are, how do they know who your dentist is?" -- Paul Merton . "Tooth decay was a perennial national problem that meant a mouthful of silver for patients, and for dentists a pocketful of gold." -- Claudia Wallis . "Teeth extracted by the latest methodists." -- Hong Kong dental advertisement . "If it weren't for electricity we'd all be watching television by candlelight." -- George Gobel . "There is no housing shortage in Lincoln today - just a rumour that is put about by people who have nowhere to live." -- G.L. Murfin, Mayor of Lincoln . "You mean they've scheduled Yom Kippur opposite Charlie's Angels?" -- Fred Silverman, TV programmer, when told that Yom Kippur would fall on a Wednesday. . "Beyond its entertainment value, Baywatch has enriched and, in many cases, helped save lives. I'm looking forward to the opportunity to continue with a project which has has such a significance for so many." -- David Hasselhoff, Actor . "Many people would sooner die than think; in fact, they do so." -- Bertrand Russell . "Many a man will have the courage to die gallantly, but will not have the courage to say, or even to think, that the cause for which he is asked to die is an unworthy one." -- Bertrand Russell . "Liberty is the right to do what I like; license, the right to do what you like." -- Bertrand Russell . "It is preoccupation with possessions, more than anything else, that prevents us from living freely and nobly." -- Bertrand Russell . "In America everybody is of the opinion that he has no social superiors, since all men are equal, but he does not admit that he has no social inferiors, for, from the time of Jefferson onward, the doctrine that all men are equal applies only upwards, not downwards." -- Bertrand Russell . "If there were in the world today any large number of people who desired their own happiness more than they desired the unhappiness of others, we could have a paradise in a few years." -- Bertrand Russell . "I've made an odd discovery. Every time I talk to a savant I feel quite sure that happiness is no longer a possibility. Yet when I talk with my gardener, I'm convinced of the opposite." -- Bertrand Russell . "I think we ought always to entertain our opinions with some measure of doubt. I shouldn't wish people dogmatically to believe any philosophy, not even mine." -- Bertrand Russell . "I remain convinced that obstinate addiction to ordinary language in our private thoughts is one of the main obstacles to progress in philosophy." -- Bertrand Russell . "Freedom in general may be defined as the absence of obstacles to the realization of desires." -- Bertrand Russell . "Democracy is the process by which people choose the man who'll get the blame." -- Bertrand Russell . "A lot of these people who keep a gun at home for safety are the same ones who refuse to wear a seat belt." -- George Carlin . "New programmers are drawn to multithreading like moths to flame, with similar results." -- Tweet by Danny Thorpe . "Heck, I don't age in my mind - people around me just keep getting younger. :^)" -- Van Swofford in e.p.delphi.non-technical . "The clue train passed his station without stopping." -- John Simmons / outlaw programmer . "Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" -- Pete O'Hanlon . "Not only do you continue to babble nonsense, you can't even correctly remember the nonsense you babbled just minutes ago." -- Rob Graham . Acton's Law: Power tends to corrupt; absolute power corrupts absolutely. . Albrecht's Law: Social innovations tend to the level of minimum tolerable well-being. . Allen's (or Cann's) Axiom: When all else fails, read the instructions. . Boren's First Law: When in doubt, mumble. . Bo Diddeley's Observation On The Law: Always take a lawyer with you, and bring another lawyer to watch him. . Bove's Theorem: The remaining work to finish in order to reach your goal increases as the deadline approaches. . Bowie's Theorem: If an experiment works, you must be using the wrong equipment. . Brilliant's Observation On Modern Art: Not all our artists are playing a joke on the public. Some are genuinely mad. . Brilliant's Law Of Limited Ambition: If you can't learn how to do it well, learn how to enjoy doing it poorly. . Brook's Law: Adding manpower to a late software project makes it later. . Canada Bill Jones' Motto: It's morally wrong to allow naive end users to keep their money. . Cann's (or Allen's) Axiom: When all else fails, read the instructions. . Carlson's Consolation: Nothing is ever a complete failure; it can always serve as a bad example. . Clarke's Third Law: Any sufficiently advanced technology is indistinguishable from magic. . Cohn's Law: The more time you spend in reporting on what you are doing, the less time you have to do anything. Stability is achieved when you spend all your time reporting on the nothing you are doing. . Conway's Law: In any organization there will always be one person who knows what is going on. This person must be fired. . Law Of Continuity: Experiments should be reproducible. They should all fail in the same way. . Correspondence Corollary: An experiment may be considered a success if no more than half of your data must be discarded to obtain correspondence with your theory. . Cropp's Law: The amount of work done varies inversely with the amount of time spent in the office. . Cutler Webster's Law: There are two sides to every argument, unless a person is personally involved, in which case there is only one. . Deadline-Dan's Demo Demonstration: The higher the "higher-ups" are who've come to see your demo, the lower your chances are of giving a successful one. . Deadline-Dan's Demon: Every task takes twice as long as you think it will take. If you double the time you think it will take, it will actually take four times as long. . Demian's Observation: There is always one item on the screen menu that is mislabeled and should read "ABANDON HOPE ALL YE WHO ENTER HERE". . Denniston's Law: Virtue is its own punishment. . Dow's Law: In a hierarchical organization, the higher the level, the greater the confusion. . Dr. Caligari's Come-Back: A bad sector disk error occurs only after you've done several hours of work without performing a backup. . Estridge's Law: No matter how large and standardized the marketplace is, IBM can redefine it. . Finagle's Laws: 1. Once a job is fouled up, anything done to improve it makes it worse. 2. No matter what results are expected, someone is always willing to fake it. 3. No matter what the result, someone is always eager to misinterpret it. 4. No matter what occurs, someone believes it happened according to his pet theory. . Finagle's Rules: 1. To study an application best, understand it thoroughly before you start. 2. Always keep a record of data. It indicates you've been working. 3. Always draw your curves, then plot the reading. 4. In case of doubt, make it sound convincing. 5. Program results should always be reproducible. They should all fail in the same way. 6. Do not believe in miracles. Rely on them. . Finagle's Law Of Government Contracting: Dealing with the government is like kicking a 300-pound sponge. . Finagle's Law Of Military Superiority: The bigger they are The harder they hit. . Finster's Law: A closed mouth gathers no feet. . First Rule Of History: History doesn't repeat itself -- historians merely repeat each other. . Flo Capp's Observation: The next best thing to doing something smart is not doing something stupid. . Franklin's Rule: Blessed is the end user who expects nothing, for he/she will not be disappointed. . Gilb's Laws Of Unreliability: 1. At the source of every error which is blamed on the computer you will find at least two human errors, including the error of blaming it on the computer. 2. Any system which depends on human reliability is unreliable. 3. Undetectable errors are infinite in variety, in contrast to detectable errors, which by definition are limited. 4. Investment in reliability will increase until it exceeds the probable cost of errors, or until someone insists on getting some useful work done. . Ginsberg's Theorem: 1. You can't win. 2. You can't break even. 3. You can't even quit the game. . Glyme's Formula For Success: The secret of success is sincerity. Once you can fake that, you've got it made. . Goebel's Law Of Useless Difficulty: Just because it's hard Doesn't mean it's worth the effort. . Goebel's Second Law Of Useless Difficulty: The fastest way to get something done is to determine that it isn't worth doing. . Goebel's Law Of Computer Support: Troubleshooting a computer over the telephone is like having sex through a hole in a board fence. It can be done but it is neither EASY nor PLEASANT. . Goebel's Law Of Software Compatibility: A statement of absolute functional equivalence made in bold print followed by several pages of qualifications is fine. . Goebel's Theorem Of Software Schedules: Always multiply a software schedule by pi. This is because you think you're going in a straight line but always end up going full circle. . Goebel's Law Of Product Introductions: A future product release date does NOT say when a product will be introduced. All it says it that you don't have a chance in HELL of seeing it before that time. . Goebel's Observation On Utopia: If everyone believed in Peace they would immediately begin fighting over the best way to achieve it. . Goebel's Law Of Intellectual Obscurity: WHAT FUN IS IT TO BE AN EXPERT IF YOU MAKE YOURSELF EASY TO UNDERSTAND? . The Golden Rule Of Arts And Sciences: Whoever has the gold makes the rules. . Gold's Law: If the shoe fits, it's ugly. . Gordon's First Law: If a research project is not worth doing at all, it is not worth doing well. . Government's Law: There is an exception to all laws. . Green's Law Of Debate: Anything is possible if you don't know what you're talking about. . Gummidges's Law: The amount of expertise varies in inverse proportion to the number of statements understood by the general public. . Gumperson's Law: The probability of a given event occurring is inversely proportional to its desirability. . Hanlon's Razor: Never attribute to malice that which is adequately explained by stupidity. . Harp's Corollary To Estridge's Law: Your "IBM PC-compatible" computer grows more incompatible with every passing moment. . Harrison's Postulate: For every action, there is an equal and opposite criticism. . Heller's Law: The first myth of management is that it exists. . Hind's Law of Computer Programming: 1. Any given program, when running, is obsolete. 2. If a program is useful, it will have to be changed. 3. If a program is useless, it will have to be documented. 4. Any given program will expand to fill all available memory. 5. The value of a program is proportional to the weight of its output. 6. Program complexity grows until it exceeds the capability of the programmer who must maintain it. 7. Make it possible for programmers to write programs in English, and you will find that programmers cannot write in English. . Hoare's Law Of Large Programs: Inside every large program is a small program struggling to get out. . Hubbard's Law: Don't take life too seriously; you won't get out of it alive. . Jenkinson's Law: It won't work. . Johnson-Laird's Law: Toothache tends to start on Saturday night. . Larkinson's Law: All laws are basically false. . The Last One's Law Of Program Generators: A program generator creates programs that are more "buggy" than the program generator. . Lieberman's Law: Everybody lies; but it doesn't matter, since nobody listens. . Lynch's Law: When the going gets tough, everyone leaves. . Mason's First Law Of Synergism: The one day you'd sell you soul for something, souls are a glut. . May's Law: The quality of correlation is inverely proportional to the density of control. (The fewer the data points, the smoother the curves.) . Mencken's Law: There is always an easy answer to every human problem -- neat, plausible, and wrong. . Meskimen's Law: There's never time to do it right, but always time to do it over. . Muir's Law: When we try to pick out anything by itself, we find it hitched to everything else in the universe. . Murphy's Laws: 1. If anything can go wrong, it will (and at the worst possible moment). 2. Nothing is as easy as it looks. 3. Everything takes longer than you think it will. . Murphy's Fourth Law: If there is a possibility of several things going wrong, the one that will cause the most damage will be the one to go wrong. . Murphy's Law Of Thermodynamics: Things get worse under pressure. . Ninety-ninety Rule Of Project Schedules: The first ninety percent of the task takes ninety percent of the time, and the last ten percent takes the other ninety percent. . Nixon's Theorem: The man who can smile when things go wrong has thought of someone he can blame it on. . Nolan's Placebo: An ounce of image is worth a pound of performance. . Oliver's Law Of Location: No matter where you are, there you are. . O'Reilly's Law Of The Kitchen: Cleanliness is next to impossible. . Osborn's Law: Variables won't, constants aren't. . O'Toole's Commentary On Murphy's Law: Murphy was an optimist. . Parkinson's Law: Work expands to fill the time available for its completion. . Parkinson's Law, Modified: The components you have will expand to fill the available space. . Peer's Law: The solution to a problem changes the problem. . Peter's Principle: In every hierarchy, each employee tends to rise to the level of his incompetence. . The Law Of The Perversity Of Nature: You cannot determine beforehand which side of the bread to butter. . Pudder's Law: Anything that begins well will end badly. (Note: The converse of Pudder's law is not true.) . Rhode's Corollary To Hoare's Law: Inside every complex and unworkable program is a useful routine struggling to be free. . Robert E. Lee's Truce: Judgement comes from experience; experience comes from poor judgement. . Rudin's Law: In a crisis that forces a choice to be made among alternative courses of action, people tend to choose the worst possible course. . Rule Of Accuracy: When working toward the solution of a problem it always helps you to know the answer. . Ryan's Law: Make three correct guesses consecutively and you will establish yourself as an expert. . Sattinger's Law: It works better if you plug it in. . Sausage Principle: People who love sausage and respect the law should never watch either one being made. . Shaw's Principle: Build a system that even a fool can use, and only a fool will want to use it. . SNAFU Equations: 1. Given any problem containing N equations, there will be N+1 unknowns. 2. An object or bit of information most needed will be least available. 3. Any device requiring service or adjustment will be least accessible. 4. Interchangeable devices won't. 5. In any human endeavor, once you have exhausted all possibilities and fail, there will be one solution, simple and obvious, highly visible to everyone else. 6. Badness comes in waves. . Stewart's Law Of Retroaction: It is easier to get forgiveness than permission. . Thoreau's Theories Of Adaptation: 1. After months of training and you finally understand all of a program's commands, a revised version of the program arrives with an all-new command structure. 2. After designing a useful routine that gets around a familiar "bug" in the system, the system is revised, the "bug" taken away, and you're left with a useless routine. 3. Efforts in improving a program's "user friendliness" invariable lead to work in improving user's "computer literacy". 4. That's not a "bug", that's a feature! . Thyme's Law: Everything goes wrong at once. . The Law Of The Too Solid Goof: In any collection of data, the figures that are obviously correct beyond all need of checking contain the errors. Corollary 1: No one you ask for help will see the error either. Corollary 2: Any nagging intruder, who stops by with unsought advice, will spot it immediately. . Unnamed Law: If it happens, it must be possible. . Weiler's Law: Nothing is impossible for the man who doesn't have to do the work. . Weinberg's Corollary: An expert is a person who avoids the small errors while sweeping on to the grand fallacy. . Weinberg's Law: If builders built buildings the way programmers write programs, then the first woodpecker that came along would destroy civilization. . Whitehead's Law: The obvious answer is always overlooked. . Wilcox's Law: A pat on the back is only a few centimeters from a kick in the pants. . Wood's Axiom: As soon as a still-to-be-finished computer task becomes a life-or-death situation, the power fails. . Woodward's Law: A theory is better than its explanation. . Zymurgy's First Law Of Evolving System Dynamics: Once you open a can of worms, the only way to recan them is to use a larger can. . Laws Of Project Management: 1. No major project is ever installed on time, within budgets, with the staff that started it. Yours will not be the first. 2. Projects progress quickly until they become 90 percent complete, then they remain at 90 percent complete forever. 3. One advantage of fuzzy project objectives is that they let you avoid the embarrassment of estimating the corresponding costs. 4. When things are going well, something will go wrong. When things just can't get any worse, they will. When things appear to be going better you have overlooked something. 5. If project content is allowed to change freely, the rate of change will exceed the rate of progress. 6. No system is ever completely debugged. Attempts to debug a system inevitably introduce new bugs that are even harder to find. 7. A carelessly planned project will take three times longer to complete than expected; a carefully planned project will take only twice as long. 8. Project teams detest progress reporting because it vividly manifests their lack of progress. . "You can't rush good cooking, you can't rush babies out, and you can't rush software development". -- Unknown . "To eat well in England, you should have breakfast three times a day." -- W. Somerset Maugham, 1925 . "Maybe her popularity stems from the fact that watching her is sometimes like watching a train wreck." -- John McCain's daughter Meghan about Ann Coulter . "Do you ever wake up in the middle of the night and just think to yourself, 'I am just full of hot gas?'" -- David Letterman to Rush Limbaugh . "I told my wife that I had a living will: I do not wish to be fed liquids from a bottle and hooked to a machine. So she turned off the TV and threw away the beer." -- Bob Hipsley . "The only function of economic forecasting is to make astrology look respectable." -- John Kenneth Galbraith . "The government of the United States is in no sense founded on the Christian Religion." -- George Washington "I do not find in Christianity one redeeming feature." -- Thomas Jefferson "The Bible is not my book, nor Christianity my religion." -- Abraham Lincoln "A just government has no need for the clergy or the church." -- James Madison "I believe in an America where religious intolerance will someday end... where every man has the same right to attend or not attend the church of his choice." -- John F. Kennedy "We are a nation of Christians and Muslims, Jews and Hindus -- and nonbelievers." -- Barack Obama . "If you can't be a good example, then you'll just have to serve as a horrible warning." -- Catherine Aird . "And the users exclaimed with a laugh and a taunt: 'It's just what we asked for but not what we want.'" . "I really hate this damned machine I wish that they would sell it. It never does quite what I want But only what I tell it." . "If the lessons of history teach us anything it is that nobody learns the lessons that history teaches us." . "Real computer scientists despise the idea of actual hardware. Hardware has limitations, software doesn't. It's a real shame that Turing machines are so poor at I/O." . "Sufficiently advanced incompetence is indistinguishable from malice." . "The Six Phases of a Project:" o Enthusiasm o Disillusionment o Panic o Search for the Guilty o Punishment of the Innocent o Praise for non-participants" . "Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why." . "If there's one thing worse than a program that doesn't work when it should, it's a program that does work when it shouldn't." -- Bob Archer . "There's a fine line between being on the leading edge and being in the lunatic fringe." -- Frank Armstrong . "Once a new technology starts rolling, if you're not part of the steamroller, you're part of the road." -- Stewart Brand . "Einstein argued that there must be simplified explanations of nature, because God is not capricious or arbitrary. No such faith comforts the software engineer." -- Fred Brooks . "Good judgement comes from experience, and experience comes from bad judgement." -- Fred Brooks . "Plan to throw one away, you will anyhow." -- Fred Brooks . "...well over half of the time you spend working on a project (on the order of 70 percent) is spent thinking, and no tool, no matter how advanced, can think for you. Consequently, even if a tool did everything except the thinking for you -- if it wrote 100 percent of the code, wrote 100 percent of the documentation, did 100 percent of the testing, burned the CD-ROMs, put them in boxes, and mailed them to your customers -- the best you could hope for would be a 30 percent improvement in productivity. In order to do better than that, you have to change the way you think." -- Fred Brooks [paraphrased] as quoted from Allen Holub's http://www.javaworld.com/javaworld/jw-07-1999/jw-07-toolbox.html . "The act of focusing our mightiest intellectual resources on the elusive goal of goto-less programs has helped us get our minds off all those really tough and possibly unresolvable problems and issues with which today's professional programmer would otherwise have to grapple." -- John Brown . "The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time." -- Tom Cargill . "... the cost of adding a feature isn't just the time it takes to code it. The cost also includes the addition of an obstacle to future expansion. ... The trick is to pick the features that don't fight each other." -- John Carmack . "Trying to get into the details seems to be a religious issue -- nearly everybody is convinced that every style but their own is ugly and unreadable. Leave out the "but their own" and they're probably right..." -- Jerry Coffin on indentation . "The behavior of any bureaucratic organization can best be understood by assuming that it is controlled by a secret cabal of its enemies." -- Robert Conquest's Second Law of Politics . "C++ tries to guard against Murphy, not Machiavelli." -- Damian Conway . "Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations. (For example, if you have four groups working on a compiler, you'll get a 4-pass compiler)" -- Conway's Law . "Programmers are in a race with the Universe to create bigger and better idiot-proof programs, while the Universe is trying to create bigger and better idiots. So far the Universe is winning." -- Rich Cook . "It has been said that the great scientific disciplines are examples of giants standing on the shoulders of other giants. It has also been said that the software industry is an example of midgets standing on the toes of other midgets." -- Alan Cooper About Face . "Style distinguishes excellence from accomplishment." -- James Coplien . "Learning is not compulsory. Neither is survival." -- W. Edwards Deming . "To iterate is human, to recurse divine." -- L. Peter Deutsch . "Just because the standard provides a cliff in front of you, you are not necessarily required to jump off it." -- Norman Diamond . "A most important, but also most elusive, aspect of any tool is its influence on the habits of those who train themselves in its use. If the tool is a programming language this influence is, whether we like it or not, an influence on our thinking habits." -- Edsger Dijkstra . "It is practically impossible to teach good programming style to students that have had prior exposure to Basic; as potential programmers they are mentally mutilated beyond hope of regeneration." -- Edsger Dijkstra . "Simplicity is prerequisite for reliability" -- Edsger W. Dijkstra . "The competent programmer is fully aware of the strictly limited size of his own skull; therefore he approaches the programming task in full humility, and among other things he avoids clever tricks like the plague." -- Edsger Dijkstra . "Any code of your own that you haven't looked at for six or more months might as well have been written by someone else." -- Eagleson's law . "Do not worry about your difficulties in mathematics. I can assure you that mine are still greater." -- Albert Einstein . "Make everything as simple as possible, but not simpler." -- Albert Einstein . "Two things are infinite: the universe and human stupidity; and I'm not sure about the universe." -- Albert Einstein . "I have always found that plans are useless, but planning is indispensable." -- Dwight Eisenhower . "A foolish consistency is the hobgoblin of little minds, adored by little statesmen and philosophers and divines." -- Ralph Waldo Emerson . "For a sucessful technology, honesty must take precedence over public relations for nature cannot be fooled." -- Richard Feynman . "The first principle is that you must not fool yourself - and you are the easiest person to fool." -- Richard Feynman . "The inside of a computer is as dumb as hell but it goes like mad!" -- Richard Feynman . "You can know the name of a bird in all the languages of the world, but when you're finished, you'll know absolutely nothing whatever about the bird... So let's look at the bird and see what it's doing -- that's what counts. I learned very early the difference between knowing the name of something and knowing something." -- Richard Feynman . "One of the main causes of the fall of the Roman Empire was that, lacking zero, they had no way to indicate successful termination of their C programs." -- Robert Firth . "There is not now, nor has there ever been, nor will there ever be, any programming language in which it is the least bit difficult to write bad code." -- Flon's Law . "Comparing to another activity is useful if it helps you formulate questions, it's dangerous when you use it to justify answers." -- Martin Fowler . "Simplicity carried to the extreme becomes elegance." -- Jon Franklin . "If you want a girlfriend, avoid working in the computer games industry like the plague. If you work seven days a week, 15 hours a day for almost two years, with barely enough time for a pint, you have no time whatsoever for relationships. Plus computer-games makers are regarded as being about as hip and cool as abattoir workers." -- Toby Gard, creator of Lara Croft. . "Measuring programming progress by lines of code is like measuring aircraft building progress by weight." -- Bill Gates . "Good programmers use their brains, but good guidelines save us having to think out every case." -- Francis Glassborow . "Software obeys the law of gaseous expansion - it continues to grow until memory is completely filled." -- Larry Gleason . "An API that isn't comprehensible isn't usable." -- James Gosling . "How the teacher reacts when something goes wrong tells the class what's important." -- Bruce Hamilton . "Never attribute to malice that which is adequately explained by stupidity." -- Hanlon's razor . "The road to wisdom?" Well its plain and simple to express: Err and err and err again, but less and less and less." -- Piet Hein . "Moving parts in rubbing contact require lubrication to avoid excessive wear. Honorifics and formal politeness provide the lubrication where people rub together. Often the very young, the untraveled, the naive, the unsophisticated deplore these formalities as "empty," "meaningless," or "dishonest," and scorn to use them. No matter how "pure" their motives, they thereby throw sand into machinery that does not work too well at best." -- Robert A. Heinlein . "There are perhaps 5% of the population that simply *can't* think. There are another 5% who *can*, and *do*. The remaining 90% *can* think, but *don't*." -- Robert A. Heinlein . "The open secrets of good design practice include the importance of knowing what to keep whole, what to combine, what to separate, and what to throw away." -- Kevlin Henny . "We are apt to shut our eyes against a painful truth.... For my part, I am willing to know the whole truth; to know the worst; and to provide for it." -- Patrick Henry . "There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies." -- C.A.R. Hoare . "The unavoidable price of reliability is simplicity." -- C.A.R. Hoare . "The ability to simplify means to eliminate the unnecessary so that the necessary may speak." -- Hans Hoffmann . "It always takes longer than you expect, even when you take into account Hofstadter's Law." -- Hofstadter's Law . "It's not at all important to get it right the first time. It's vitally important to get it right the last time." -- Andrew Hunt and David Thomas . "Rules of Optimization:" Rule 1: Don't do it. Rule 2 (for experts only): Don't do it yet." -- M.A. Jackson . "Before software can be reusable it first has to be usable." -- Ralph Johnson . "First, solve the problem. Then, write the code." -- John Johnson . "It's so easy to become mesmerized by the immediacy of a result that you don't question its validity." -- Naomi Karten . "Most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other, with no structural integrity, but just done by brute force and thousands of slaves." -- Alan Kay . "Perl is another example of filling a tiny, short-term need, and then being a real problem in the longer term." -- Alan Kay . "We are faced with an insurmountable opportunity." -- W. Kelley . "As we said in the preface to the first edition, C 'wears well as one's experience with it grows.' With a decade more experience, we still feel that way." -- Brian Kernighan and Dennis Ritchie . "Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it." -- Brian W. Kernighan . "Trying to outsmart a compiler defeats much of the purpose of using one." -- Kernighan and Plauger, The Elements of Programming Style. . "A charlatan makes obscure what is clear; a thinker makes clear what is obscure." -- Hugh Kingsmill . "... the designer of a new system must not only be the implementor and the first large-scale user; the designer should also write the first user manual. ... If I had not participated fully in all these activities, literally hundreds of improvements would never have been made, because I would never have thought of them or perceived why they were important." -- Donald Knuth . "Any inaccuracies in this index may be explained by the fact that it has been sorted with the help of a computer." -- Donald Knuth Sorting and Searching . "Beware of bugs in the above code; I have only proved it correct, not tried it." -- Donald Knuth . "Computers are good at following instructions, but not at reading your mind." -- Donald Knuth . "Let us change our traditional attitude to the construction of programs. Instead of imagining that our main task is to instruct a computer what to do, let us concentrate rather on explaining to human beings what we want a computer to do." -- Donald Knuth . "TeX has found at least one bug in every Pascal compiler it's been run on, I think, and at least two in every C compiler." -- Donald Knuth . "The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it can be an aesthetic experience much like composing poetry or music." -- Donald Knuth . "These machines have no common sense; they have not yet learned to 'think', and they do exactly as they are told, no more and no less. This fact is the hardest concept to grasp when one first tries to use a computer." -- Donald Knuth . "You're bound to be unhappy if you optimize everything." -- Donald Knuth . "Programming can be fun, so can cryptography; however they should not be combined." -- Kreitzberg and Shneiderman . "The perfect project plan is possible if one first documents a list of all the unknowns." -- Bill Langley . "Without stress nothing would move." -- Bill Langley . "But in our enthusiasm, we could not resist a radical overhaul of the system, in which all of its major weaknesses have been exposed, analyzed, and replaced with new weaknesses." -- Bruce Leverett, Register Allocation in Optimizing Compilers . "There is nothing more difficult to carry out, nor more doubtful of success, nor more dangerous to handle, than to initiate a new order of things. For the reformer has enemies in all those who profit by the old order, and only lukewarm defenders in all those who would profit by the new..." -- Niccolo Macchiavelli, The Prince . "If you want a product with certain characteristics, you must ensure that the team has those characteristics before the product's development." -- Jim McCarthy and Michele McCarthy - Software for your Head . "You can't have great software without a great team, and most software teams behave like dysfunctional families." -- Jim McCarthy . "Good code is its own best documentation. As you're about to add a comment, ask yourself, 'How can I improve the code so that this comment isn't needed?' Improve the code and then document it to make it even clearer." -- Steve McConnell Code Complete . "It's hard enough to find an error in your code when you're looking for it; it's even harder when you've assumed your code is error-free." -- Steve McConnell Code Complete . "Testing by itself does not improve software quality. Test results are an indicator of quality, but in and of themselves, they don't improve it. Trying to improve software quality by increasing the amount of testing is like trying to lose weight by weighing yourself more often. What you eat before you step onto the scale determines how much you will weigh, and the software development techniques you use determine how many errors testing will find. If you want to lose weight, don't buy a new scale; change your diet. If you want to improve your software, don't test more; develop better." -- Steve McConnell Code Complete . "Incompetents invariably make trouble for people other than themselves." -- Larry McMurtry . "For every complex problem there is an answer that is clear, simple, and wrong." -- H L Mencken . "Haste is of the devil. Slowness is of God." -- H L Mencken . "Say what you will about the Ten Commandments, you must always come back to the pleasant fact that there are only ten of them." -- H. L. Mencken . "Correctness is clearly the prime quality. If a system does not do what it is supposed to do, then everything else about it matters little." -- Bertrand Meyer . "Incorrect documentation is often worse than no documentation." -- Bertrand Meyer . "A non-virtual function says, you have to do this and you must do it this way. A virtual function says you have to do this, but you don't have to do it this way. That's their fundamental difference." -- Scott Meyers . "Debugging a Direct3D application can be challenging." -- Microsoft's Direct3D Immediate Mode overview. . "Unformed people delight in the gaudy and in novelty. Cooked people delight in the ordinary." -- Erik Naggum . "Any fool can use a computer. Many do." -- Ted Nelson . "Anyone who considers arithmetical methods of producing random numbers is, of course, in a state of sin." -- John von Neumann . "There's no sense being exact about something if you don't even know what you're talking about." -- John von Neumann . "That's the thing about people who think they hate computers. What they really hate is lousy programmers." -- Larry Niven and Jerry Pournelle Oath of Fealty . "The truth does not change according to our ability to stomach it." -- Flannery O'Connor . "Elegance is not optional" -- Richard O'Keefe . "The best performance improvement is the transition from the nonworking state to the working state" -- John Ousterhout . "Complexity kills. It sucks the life out of developers, it makes products difficult to plan, build and test, it introduces security challenges and it causes end-user and administrator frustration." -- Ray Ozzie . "Good code is short, simple, and symmetrical - the challenge is figuring out how to get there." -- Sean Parent . "Alas, to wear the mantle of Galileo it is not enough that you be persecuted by an unkind establishment, you must also be right." -- Bob Park . "Copy and paste is a design error" -- David Parnas . "Every program has (at least) two purposes: the one for which it was written, and another for which it wasn't." -- Alan J. Perlis . "There are two ways to write error-free programs; only the third works." -- Alan J. Perlis . "When someone says, 'I want a programming language in which I need only say what I want done', give him a lollipop." -- Alan Perlis . "Some problems are so complex that you have to be highly intelligent and well informed just to be undecided about them." -- Laurence J. Peter . "The most amazing achievement of the computer software industry is its continuing cancellation of the steady and staggering gains made by the computer hardware industry." -- Henry Petroski . "Computers are useless. They can only give you answers." -- Pablo Picasso . "Technology is dominated by two types of people: Those who understand what they do not manage. Those who manage what they do not understand." -- Putt's Law . "Ugly programs are like ugly suspension bridges: they're much more liable to collapse than pretty ones, because the way humans (especially engineer-humans) perceive beauty is intimately related to our ability to process and understand complexity. A language that makes it hard to write elegant code makes it hard to write good code." -- Eric S. Raymond . "PHP is a minor evil perpetrated and created by incompetent amateurs, whereas Perl is a great and insidious evil, perpetrated by skilled but perverted professionals." -- Jon Ribbens . "UNIX is simple. It just takes a genius to understand its simplicity." -- Dennis Ritchie . "We only acknowledge small faults in order to make it appear that we are free from great ones." -- La Rochefoucauld . "Even if you're on the right track, you'll get run over if you just sit there." -- Will Rogers . "The trouble with the world is that the stupid are cocksure and the intelligent are full of doubt." -- Bertrand Russell . "A mathematician is a machine for turning coffee into theorems." -- Alfrd Rnyi (also attributed to Paul Erds) . "You know you've achieved perfection in design, not when you have nothing more to add, but when you have nothing more to take away." -- Antoine de Saint-Exupery, Wind, Sand and Stars . "Fashion is something barbarous, for it produces innovation without reason and imitation without benefit." -- George Santayana . "Those who cannot remember the past are condemned to repeat it." -- George Santayana . "If the code and the comments disagree, then both are probably wrong." -- attributed to Norm Schryer . "It is difficult to get a man to understand something when his salary depends on his not understanding it." -- Upton Sinclair . "When you start off by telling those who disagree with you that they are not merely in error but in sin, how much of a dialogue do you expect ?"" -- Thomas Sowell . "If you lie to the compiler, it will get its revenge." -- Henry Spencer . "Without requirements or design, programming is the art of adding bugs to an empty text file." -- Louis Srygley . "The primary duty of an exception handler is to get the error out of the lap of the programmer and into the surprised face of the user. Provided you keep this cardinal rule in mind, you can't go far wrong." -- Verity Stob . "We are tied down to a language which makes up in obscurity what it lacks in style." -- Tom Stoppard . "A notation is important for what it leaves out." -- Joseph Stoy . "An organisation that treats its programmers as morons will soon have programmers that are willing and able to act like morons only." -- Bjarne Stroustrup . "I did say something along the lines of 'C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows your whole leg off.'" -- Bjarne Stroustrup . "I have always wished that my computer would be as easy to use as my telephone. My wish has come true. I no longer know how to use my telephone." -- Bjarne Stroustrup . "The most important single aspect of software development is to be clear about what you are trying to build." -- Bjarne Stroustrup . "To many managers, getting rid of the arrogant, undisciplined, over-paid, technology-obsessed, improperly-dressed etc. programmers would appear to be a significant added benefit." -- Bjarne Stroustrup The C++ Programming Language 3e, section 24.2.4 . "Exceptions relieve the programmer of tedious writing boilerplate code -- without removing the semantics of said code -- and they allow the programmer to arrange the code so that error handling code is more separate from the main program logic." -- Herb Sutter . "A multithreaded file system is only a performance hack." -- Prof. Andrew S. Tanenbaum . "I've finally learned what "upward compatible" means. It means we get to keep all our old mistakes." -- Dennie van Tassel . "There are only two industries that refer to their customers as 'users'." -- Edward Tufte . "Lord, give us the wisdom to utter words that are gentle and tender, for tomorrow we may have to eat them." -- Rep. Morris Udall . "Simplicity is the ultimate sophistication." -- Leonardo da Vinci . "The best is the enemy of the good." -- Voltaire . "Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris." -- Larry Wall . "We all agree on the necessity of compromise. We just can't agree on when it's necessary to compromise." -- Larry Wall . "Power is the ability to control things, moral authority is the ability to change things" -- Jim Wallis . "When one is postulating correlations or causations extant in reality, one should always remember that the human brain is mainly a pattern recognition engine. And it is such a persistent pattern recognition engine that it often perceives patterns where none exist." -- Jeff Walther . "The pessimist complains about the wind; the optimist expects it to change; the realist adjusts the sails." -- William Arthur Ward . "They always say time changes things, but you actually have to change them yourself." -- Andy Warhol . "If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilisation." -- Gerald Weinberg . "Naturally we feel that mentally ill people are not what we are looking for when we hire programmers - although there is no empirical data to support or contradict that view... Is it appropriate to give tests for mental illness to anyone applying for any kind of job?" -- Weinberg The Psychology of Computer Programming . "As soon as we started programming, we found to our surprise that it wasn't as easy to get programs right as we had thought. Debugging had to be discovered. I can remember the exact instant when I realized that a large part of my life from then on was going to be spent in finding mistakes in my own programs." -- Maurice Wilkes discovers debugging, 1949 . "Increasingly, people seem to misinterpret complexity as sophistication, which is baffling - the incomprehensible should cause suspicion rather than admiration. Possibly this trend results from a mistaken belief that using a somewhat mysterious device confers an aura of power on the user." -- Niklaus Wirth . "More computing sins are committed in the name of efficiency (without necessarily achieving it) than for any other single reason - including blind stupidity." -- W.A. Wulf . "If you think your management doesn't know what it's doing or that your organisation turns out low-quality software crap that embarrasses you, then leave." -- Edward Yourdon Rise and Resurrection of the American Programmer . "The purpose of software engineering is to control complexity, not to create it." -- Dr. Pamela Zave . "Some people, when confronted with a problem, think 'I know, I'll use regular expressions.' Now they have two problems." -- Jamie Zawinski . "If you plan to throw one away, you will throw away two." -- Craig Zerouni . "Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it." -- Brian Kernighan . "The city's central computer told you? R2D2, you know better than to trust a strange computer!" -- C3PO . "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live." -- Martin Golding . "I don't care if it works on your machine! We are not shipping your machine!" -- Vidiu Platon . "If McDonalds were run like a software company, one out of every hundred Big Macs would give you food poisoning, and the response would be, 'We're sorry, here's a coupon for two more.'" -- Mark Minasi . "A computer lets you make more mistakes faster than any invention in human history - with the possible exceptions of handguns and tequila." -- Mitch Radcliffe . "The best thing about a boolean is even if you are wrong, you are only off by a bit." . "Mr. Madison, what you've just said is one of the most insanely idiotic things I have ever heard. At no point in your rambling, incoherent response were you even close to anything that could be considered a rational thought. Everyone in this room is now dumber for having listened to it. I award you no points, and may God have mercy on your soul." -- from movie Billy Madison . "There are, it has been said, two types of people in the world. There are those who, when presented with a glass that is exactly half full, say: this glass is half full. And then there are those who say: this glass is half empty. The world belongs, however, to those who can look at the glass and say: What's up with this glass? Excuse me? Excuse me? This is my glass? I don't think so. My glass was full! And it was a bigger glass!" -- Terry Pratchett, (The Truth) . 'What our ancestors would really be thinking, if they were alive today, is: "Why is it so dark in here?"' -- Terry Pratchett, (Pyramids) . "The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it." -- Terry Pratchett (Diggers) . 'That seems to point up a significant difference between Europeans and Americans. A European says: "I can't understand this, what's wrong with me?" An American says: "I can't understand this, what's wrong with him?"' -- Terry Pratchett . "Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry." -- Terry Pratchett (Thief of Time) . "Give a man a fire and he's warm for the day, but set fire to him and he's warm for the rest of his life." -- Terry Pratchett (Jingo) . "It is said that your life flashes before your eyes just before you die. That is true, it's called Life." -- Terry Pratchett (The Last Continent) . "If cats looked like frogs we'd realize what nasty, cruel little bastards they are. Style. That's what people remember." -- Terry Pratchett (Lords and Ladies) . "Stories of imagination tend to upset those without one." -- Terry Pratchett . "In ancient times cats were worshipped as gods; they have not forgotten this." -- Terry Pratchett . "It's not worth doing something unless someone, somewhere, would much rather you weren't doing it." -- Terry Pratchett . "Time is a drug. Too much of it kills you." -- Terry Pratchett (Small Gods) . "I'll be more enthusiastic about encouraging thinking outside the box when there's evidence of any thinking going on inside it." -- Terry Pratchett . "In the beginning there was nothing, which exploded." -- Terry Pratchett (Lords and Ladies) . "Wisdom comes from experience. Experience is often a result of lack of wisdom." -- Terry Pratchett . "No! Please! I'll tell you whatever you want to know!" the man yelled. "Really?" said Vimes. "What's the orbital velocity of the moon?" "What?" "Oh, you'd like something simpler?" -- Terry Pratchett (Night Watch) . "Real stupidity beats artificial intelligence every time." -- Terry Pratchett (Hogfather) . "Five exclamation marks, the sure sign of an insane mind." -- Terry Pratchett (Reaper Man) . "If you have enough book space, I don't want to talk to you." -- Terry Pratchett . "Coming back to where you started is not the same as never leaving." -- Terry Pratchett (A Hat Full of Sky) . "A good bookshop is just a genteel Black Hole that knows how to read." -- Terry Pratchett (Guards! Guards!) . "Just erotic. Nothing kinky. It's the difference between using a feather and using a chicken." -- Terry Pratchett (Eric) . "I meant," said Ipslore bitterly, "what is there in this world that truly makes living worthwhile?" Death thought about it. "Cats," he said eventually. "Cats are nice." -- Terry Pratchett (Sourcery) . "It would seem that you have no useful skill or talent whatsoever,' he said. 'Have you thought of going into teaching?" -- Terry Pratchett (Mort) . "I'd rather be a climbing ape than a falling angel." -- Terry Pratchett . "DON'T THINK OF IT AS DYING, said Death. JUST THINK OF IT AS LEAVING EARLY TO AVOID THE RUSH." -- Terry Pratchett (Good Omens) . "There is a rumour going around that I have found God. I think this is unlikely because I have enough difficulty finding my keys, and there is empirical evidence that they exist." -- Terry Pratchett . "The whole of life is just like watching a film. Only it's as though you always get in ten minutes after the big picture has started, and no-one will tell you the plot, so you have to work it out all yourself from the clues." -- Terry Pratchett (Moving Pictures) . "And what would humans be without love?" "Rare," said Death. -- Terry Pratchett (Sourcery) . "He'd been wrong, there was a light at the end of the tunnel, and it was a flamethrower." -- Terry Pratchett (Mort) . "His philosophy was a mixture of three famous schools -- the Cynics, the Stoics and the Epicureans -- and summed up all three of them in his famous phrase, 'You can't trust any bugger further than you can throw him, and there's nothing you can do about it, so let's have a drink.'" -- Terry Pratchett (Small Gods) . "If complete and utter chaos was lightning, then he'd be the sort to stand on a hilltop in a thunderstorm wearing wet copper armour and shouting 'All gods are bastards!'" -- Terry Pratchett (The Color of Magic) . "She was already learning that if you ignore the rules people will, half the time, quietly rewrite them so that they don't apply to you." -- Terry Pratchett (Equal Rites) . "This isn't life in the fast lane, it's life in the oncoming traffic." -- Terry Pratchett . "Fantasy is an exercise bicycle for the mind. It might not take you anywhere, but it tones up the muscles that can. Of course, I could be wrong." -- Terry Pratchett . "Always be wary of any helpful item that weighs less than its operating manual." -- Terry Pratchett (Jingo) . "Over the centuries, mankind has tried many ways of combating the forces of evil... prayer, fasting, good works and so on. Up until Doom, no one seemed to have thought about the double-barrel shotgun. Eat leaden death, demon..." -- Terry Pratchett . "Many people, meeting Aziraphale for the first time, formed three impressions: that he was English, that he was intelligent, and that he was gayer than a treeful of monkeys on nitrous oxide." -- Terry Pratchett (Good Omens) . "The presence of those seeking the truth is infinitely to be preferred to the presence of those who think they've found it." -- Terry Pratchett (Monstrous Regiment) . "Chaos is found in greatest abundance wherever order is being sought. It always defeats order, because it is better organized." -- Terry Pratchett (Interesting Times) . "The three rules of the Librarians of Time and Space are: 1) Silence; 2) Books must be returned by no later than the date shown; and 3) Do not interfere with the nature of causality." -- Terry Pratchett (Guards! Guards!) . "Studies have shown that an ant can carry one hundred times its own weight, but there is no known limit to the lifting power of the average tiny eighty-year-old Spanish peasant grandmother." -- Terry Pratchett (Reaper Man) . "We who think we are about to die will laugh at anything." -- Terry Pratchett (Night Watch) . "There are, it has been said, two types of people in the world. There are those who, when presented with a glass that is exactly half full, say: this glass is half full. And then there are those who say: this glass is half empty. The world belongs, however, to those who can look at the glass and say: What's up with this glass? Excuse me? Excuse me? This is my glass? I don't think so. My glass was full! And it was a bigger glass! Who's been pinching my beer? And at the other end of the bar the world is full of the other type of person, who has a broken glass, or a glass that has been carelessly knocked over (usually by one of the people calling for a larger glass) or who had no glass at all, because he was at the back of the crowd and had failed to catch the barman's eye. " -- Terry Pratchett (The Truth) . "Elves are wonderful. They provoke wonder. Elves are marvellous. They cause marvels. Elves are fantastic. They create fantasies. Elves are glamorous. They project glamour. Elves are enchanting. They weave enchantment. Elves are terrific. They beget terror. The thing about words is that meanings can twist just like a snake, and if you want to find snakes look for them behind words that have changed their meaning. No one ever said elves are nice. Elves are bad." -- Terry Pratchett (Lords and Ladies) . "I do note with interest that old women in my books become young women on the covers... this is discrimination against the chronologically gifted." --Terry Pratchett . "Albert grunted. 'Do you know what happens to lads who ask too many questions?' Mort thought for a moment. 'No,' he said eventually, 'what?' There was silence. Then Albert straightened up and said, 'Damned if I know. Probably they get answers, and serve 'em right.'" -- Terry Pratchett (Mort) . "It's still magic even if you know how it's done." -- Terry Pratchett (A Hat Full of Sky) . "If there was anything that depressed him more than his own cynicism, it was that quite often it still wasn't as cynical as real life." -- Terry Pratchett (Guards! Guards!) . "Insanity is catching." -- Terry Pratchett (Making Money) . "Gods prefer simple, vicious games, where you Do Not Achieve Transcendence but Go Straight To Oblivion; a key to the understanding of all religion is that a god's idea of amusement is Snakes and Ladders with greased rungs." -- Terry Pratchett (Wyrd Sisters) . "Getting an education was a bit like a communicable sexual disease. It made you unsuitable for a lot of jobs and then you had the urge to pass it on." -- Terry Pratchett (Hogfather) . "He'd noticed that sex bore some resemblance to cookery: it fascinated people, they sometimes bought books full of complicated recipes and interesting pictures, and sometimes when they were really hungry they created vast banquets in their imagination - but at the end of the day they'd settle quite happily for egg and chips. If it was well done and maybe had a slice of tomato." -- Terry Pratchett (The Fifth Elephant) . "The reason that the rich were so rich, Vimes reasoned, was because they managed to spend less money. Take boots, for example. He earned thirty-eight dollars a month plus allowances. A really good pair of leather boots cost fifty dollars. But an affordable pair of boots, which were sort of OK for a season or two and then leaked like hell when the cardboard gave out, cost about ten dollars. Those were the kind of boots Vimes always bought, and wore until the soles were so thin that he could tell where he was in Ankh-Morpork on a foggy night by the feel of the cobbles. But the thing was that good boots lasted for years and years. A man who could afford fifty dollars had a pair of boots that'd still be keeping his feet dry in ten years' time, while the poor man who could only afford cheap boots would have spent a hundred dollars on boots in the same time and would still have wet feet. This was the Captain Samuel Vimes 'Boots' theory of socioeconomic unfairness." -- Terry Pratchett (Men at Arms) . "Everything starts somewhere, though many physicists disagree. But people have always been dimly aware of the problem with the start of things. They wonder how the snowplough driver gets to work, or how the makers of dictionaries look up the spelling of words." -- Terry Pratchett (Hogfather) . "For animals, the entire universe has been neatly divided into things to (a) mate with, (b) eat, (c) run away from, and (d) rocks." -- Terry Pratchett (Equal Rites) . "My experience in Amsterdam is that cyclists ride where the hell they like and aim in a state of rage at all pedestrians while ringing their bell loudly, the concept of avoiding people being foreign to them. My dream holiday would be a) a ticket to Amsterdam b) immunity from prosecution and c) a baseball bat." -- Terry Pratchett . "There's a door." "Where does it go?" "It stays where it is, I think." -- Terry Pratchett (Eric) . "You don't elect politicians to commit crimes; you elect politicians to make your crimes legal." -- Matt Taibbi . "Is your argument that the Creator of the Universe was working under a deadline and His manager forced Him to rush inefficient designs into production?" -- John B. Breckenridge in bpot . "The role of the president of the United States is to support the decisions that are made by the people of Israel. It is not up to us to pick and choose from among the political parties." -- Former White House official Ann Lewis, representing Hillary Clinton. WaPo, Mar 18, 2008. . "If you have a procedure with 10 parameters, you probably missed some." -- Alan Perlis . ACHTUNG! ALLES LOOKENSPEEPERS! Das computermachine ist nicht fuer gefingerpoken und mittengrabben. Ist easy schnappen der springenwerk, blowenfusen und poppencorken mit spitzensparken. Ist nicht fuer gewerken bei das dumpkopfen. Das rubbernecken sichtseeren keepen das cotten-pickenen hans in das pockets muss; relaxen und watchen das blinkenlichten. -- from "THE JARGON FILE, VERSION 2.9.9, 01 APR 1992 . "Real Programmers never work from 9 to 5. If any real programmer is around at 9 a.m., it's because they were up all night." -- Some Computer Geek . "Usenet is like a herd of performing elephants with diarrhea -- massive, difficult to redirect, awe-inspiring, entertaining, and a source of mind-boggling amounts of excrement when you least expect it." -- Gene Spafford . "Hardware : The parts of a computer system that can be kicked." -- Jeff Pesis . "I have a spelling checker, It came with my PC; It plainly marks four my revue Mistakes I cannot sea. I've run this poem threw it, I'm sure your pleased too no, Its letter perfect in it's weigh, My checker tolled me sew." -- Janet Minor, "Spellbound" . "'Uncle Cosmo, why do they call this a word processor?' 'It's simple, Skyler. You've seen what food processors do to food, right?" -- MacNelley, in "Shoe" . "If it's there and you can see it - it's real. If it's not there and you can see it - it's virtual. If it's there and you can't see it - it's transparent. If it's not there and you can't see it - you erased it!" - Scott Hammer (an old IBM VM statement) . "Crossposting isn't inherently evil, in the same sense that necrophilia doesn't really hurt anybody. One wonders only whether it's appropriate to the occasion." -- Rick Gordon . "My suggestion for an Official Usenet Motto: "If you have nothing to say, then come on in, this is the place for you, tell us all about it!" -- Hevard Fosseng [quotation collector] . "The best way to accelerate a Macintosh is at 9.8 m/sec/sec." -- Marcus Dolengo . On the value of binary; the Bible says: "But let your communication be Yea, yea; nay, nay: for whatsoever is more than these cometh of evil." -- (Matthew 5:37) . "A distributed system is one in which the failure of a computer you didn't even know existed can render your own computer unusable." -- Leslie Lamport . "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live." -- John F. Woods . "To err is human - and to blame it on a computer is even more so." -- Robert Orben . "A computer once beat me at chess, but it was no match for me at kick boxing." -- Emo Philips . "If computers get too powerful, we can organize them into a committee - that will do them in." . "A computer makes it possible to do, in half an hour, tasks which were completely unnecessary to do before." . "The most overlooked advantage of owning a computer is that if they foul up there's no law against whacking them around a bit." -- Eric Porterfield . "A computer is like an Old Testament god, with a lot of rules and no mercy" -- Joseph Campbell . "Two men were examining the output of the new computer in their department. After an hour or so of analyzing the data, one of them remarked: 'Do you realize it would take 400 men at least 250 years to make a mistake this big ?'" . "Technology: No Place for Wimps!" -- Scott Adams . "I would much prefer a government run bureaucracy than a for profit bureaucracy. In the first I am at least a stakeholder. In the latter I'm simply a cost." -- digby in her blog. . "Horatio stops by to say really obvious things slowly." -- From IMDb Synopsis for "CSI: Miami - Won't Get Fueled Again" . "'Abstinence-only sex education' is a little like saying 'Just-hold-it potty training'." -- Roy Zimmerman . "I hate you, I despise you, I loathe you. Everything about you DISGUSTS me. Your ears, eyes, nose, mouth, tongue, legs, knees, stomach, ribs and bottom make me want to vomit up. You're repulsive, loathsome, grotesque and insupportable. I want to kill you, I want to twist your nipples off and throw them to the dogs. You low corrosive lump of faecal horror; you maniac bastardly turd; I would rather drink stale urine from Norman Fowler's arse-pit than remain one moment longer in your defiling company; you're filth, you're cack, you're the ooze of a burst boil; I abominate you, you towering mound of corrupted slime; your every utterance is like the slithering hiss of a fat maggot in the guts of a decomposing rat; your face is fowler than the unwiped ring of Satan's rectum." -- Stephen Fry, A Bit of Fry and Laurie . "If economists were held in the same regard as medical practitioners, our courts would be overwhelmed with malpractice suits" -- unknown . "If all the economists in the world were laid end-to-end, they would still not reach a conclusion." -- unknown "If all the girls from Vassar were laid end-to-end, I wouldn't be surprised." -- Dorothy Parker . "I suppose that it takes a $1000/hour lawyer to write contracts that a $250/hour lawyer cannot find holes in. -- John Herbster in b.p.d.non-technical . "The defense policy of the United States is based on a simple premise: The United States does not start fights. We will never be an aggressor." -- Ronald Reagan . "War is wretched beyond description, and only a fool or a fraud could sentimentalize its cruel reality." -- Senator John McCain . "Criticism in a time of war is essential to the maintenance of any kind of democratic government." -- Sen. Robert Taft, (R) Ohio . "We first fought... in the name of religion, then Communism, and now in the name of drugs and terrorism. Our excuses for global domination always change." -- Serj Tankian . "Democracy is not an incident that happens overnight, nor a gift that America can give to the world. It is a culture which needs peace to evolve." -- Shirin Ebadi, Nobel Peace Laureate of Iran . "A belligerent state permits itself every such misdeed, every such act of violence, as would disgrace the individual." -- Sigmund Freud . "Civilization began the first time an angry person cast a word instead of a rock." -- Sigmund Freud . "If you live long enough, you'll see that every victory turns into a defeat." -- Simone de Beauvoir . "The great error of nearly all studies of war... has been to consider war as an episode in foreign policies, when it is an act of interior politics..." -- Simone Weil . "Terrorism is the war of the poor, and war is the terrorism of the rich." -- Sir Peter Ustinov . "In modern war there is no such thing as victor and vanquished... There is only a loser, and the loser is mankind." -- U Thant, Burmese UN Secretary General . "If you kill one person you are a murderer. If you kill ten people you are a monster. If you kill ten thousand you are a national hero." -- Vassilis Epaminondou . "All murderers are punished unless they kill in large numbers and to the sound of trumpets." -- Voltaire . "So long as the deceit ran along quiet and monotonous, all of us let ourselves be deceived, abetting it unawares or maybe through cowardice..." -- William Faulkner . "The cry has been that when war is declared, all opposition should be hushed. A sentiment more unworthy of a free country could hardly be propagated." -- William Ellery Channing . "Necessity is the plea for every infringement of human freedom. It is the argument of tyrants; it is the creed of slaves." -- William Pitt . "You can no more win a war than you can win an earthquake." -- Jeanette Rankin . "So apparently Delphi now has both aristocrats [Counts, Cardinals] and dogs [Pointers, Setters] ... " -- Andrew Fiddian-Green in borland.public.delphi.nativeapi.win32 . "Conservative politics is about simple solutions to complex problems, which usually involve pinning all the blame on someone else. It doesn't matter whether they make any sense - they can be explained in several words, and sound best when yelled." -- Michael Warner in borland.public.off-topic . "I contend that we are both atheists. I just believe in one fewer god than you do. When you understand why you dismiss all the other possible gods, you will understand why I dismiss yours." -- Stephen Roberts . "Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius, and a lot of courage to move in the opposite direction." -- Albert Einstein . "Man is certainly stark mad: he cannot make a worm, yet he will make gods by the dozen." -- Michel de Montaigne . "Civil disobedience, that's not our problem. Our problem is that people are obedient all over the world in the face of poverty and starvation and stupidity, and war, and cruelty. Our problem is that people are obedient while the jails are full of petty thieves, and all the while the grand thieves are running the country. That's our problem." -- Howard Zinn . "Men will never be free until the last king is strangled with the entrails of the last priest." -- Denis Diderot . "We, on our side, are praying to Him to give us victory, because we believe we are right; but those on the other side pray to Him, too, for victory, believing they are right. What must He think of us?" -- Abraham Lincoln . "Invisible Pink Unicorns are beings of awesome mystical power. We know this because they manage to be invisible and pink at the same time. Like all religions, the Faith of the Invisible Pink Unicorns is based upon both logic and faith. We have faith that they are pink; we logically know that they are invisible because we can't see them." -- Steve Eley . "All great truths begin as blasphemies." -- George Bernard Shaw . "The injury we do and the one we suffer are not weighed in the same scale." -- Aesop . "Take only memories; leave nothing but footprints." -- Chief Seattle . "They made a wasteland and called it peace." -- Tacitus . "The law, in its majestic equality, forbids the rich, as well as the poor, to sleep under the bridges, to beg in the streets, and to steal bread." -- Anatole France . "The philosopher has never killed any priests, whereas the priest has killed a great many philosophers." -- Denis Diderot . "A terrorist is someone who has a bomb but can't afford an air force." -- William Blum . "What you do speaks so loud that I cannot hear what you say." -- Ralph Waldo Emerson . "A time will come when a politician who has willfully made war and promoted international dissension will be ... surer of the noose than a private homicide." -- H. G. Wells . "A man's ethical behavior should be based effectually on sympathy, education, and social ties and needs; no religious basis is necessary. Man would indeed be in a poor way if he had to be restrained by fear of punishment and hope of reward after death." -- Albert Einstein . "Disobedience, in the eyes of anyone who has read history, is man's original virtue. It is through disobedience that progress has been made, through disobedience and through rebellion." -- Oscar Wilde . "When you philosophically oppose an entire power elite, you cannot help but sound like a conspiracy theorist. Social power is by nature a conspiracy." -- Tom N . "Because I do it with one small ship, I am called a terrorist (pirate?). You do it with a whole fleet and are called an emperor." -- St. Augustine . "Insanity in individuals is something rare; but in groups, parties, nations, and epochs it is the rule." -- Nietzsche . "If you talk to God, you are praying. If God talks to you, you have schizophrenia." -- Thomas Szasz . "Every war when it comes, or before it comes, is represented not as a war but as an act of self-defense against a homicidal maniac." -- George Orwell . "It was, of course, a lie what you read about my religious convictions, a lie which is being systematically repeated. I do not believe in a personal god and I have never denied this but have expressed it clearly. If something is in me which can be called religious, then it is the unbounded admiration for the structure of the world so far as our science can reveal it." -- Albert Einstein . "You know your god is man-made when he hates all the same people you do." -- [Usenet] . "Disobedience is the true foundation of liberty. The obedient must be slaves." -- Henry David Thoreau . "One man's magic is another man's engineering. Supernatural is a null word." -- Robert Heinlein . "We must question the story logic of having an all-knowing all-powerful God, who creates faulty humans, and then blames them for his own mistakes." -- Gene Roddenberry . "The trouble with the world is that the stupid are cocksure and the intelligent are full of doubt." -- Bertrand Russell . "As with the Christian religion, the worst advertisement for Socialism is its adherents." -- George Orwell . "A conservative is a man who is too cowardly to fight and too fat to run." -- Elbert Hubbard . "Religion is what keeps the poor from murdering the rich." -- Napoleon . "Never be deceived that the rich will allow you to vote away their wealth." -- Lucy Parsons . "If child molestation is actually your concern, how come we don't see Bradley tanks knocking down Catholic churches?" -- Bill Hicks, 1993, referencing the Waco siege . "Do you see now that your self-righteousness was nothing more than breeding and years of privilege? You know, we are one nation under a god. Yes, you were right. An angry, crack slinging god who decorates with bullets and spent condoms, a blind god whose eyes are just like yours." -- Solipsist by Henry Rollins . "Religion, comprises a system of wishful illusions together with a disavowal of reality, such as we find in an isolated form nowhere else but in amentia, in a state of blissful hallucinatory confusion." -- Sigmund Freud . "The ink of the scholar is holier than the blood of the martyr." -- Prophet Muhammad . "Which is it, is man one of God's blunders or is God one of man's?" -- Nietzsche . "The compulsion to do good is an innate American trait. Only North Americans seem to believe that they always should, may, and actually can choose somebody with whom to share their blessings. Ultimately this attitude leads to bombing people into the acceptance of gifts." -- Ivan Illich . "... The biggest detractors of communism and socialism always seem to want to embrace the worst excesses of both." -- . "Kill a man, and you are an assassin. Kill millions of men, and you are a conqueror. Kill everyone, and you are a god." -- Jean Rostand . "Secular schools can never be tolerated because such schools have no religious instruction, and a general moral instruction without a religious foundation is built on air; consequently, all character training and religion must be derived from faith ... we need believing people." -- Adolf Hitler . "I never would have agreed to the formulation of the Central Intelligence Agency back in forty-seven, if I had known it would become the American Gestapo." -- Harry S Truman, 1961 . "Men are not punished for their sins, but by them." -- Elbert G Hubbard . "I like your Christ; I do not like your Christians. Your Christians are so unlike your Christ." -- Mohandas Gandhi . "Unless Americans come to realize that they are not stronger in the world because they have the bomb but weaker because of their vulnerability to atomic attack, they are not likely to conduct their policy, in a spirit that furthers the arrival at an understanding." -- Albert Einstein . "Patriotism is your conviction that this country is superior to all other countries because you were born in it." -- George Bernard Shaw . "The same people that wrote the bible thought the world was flat." -- Unknown - (disputed) . "If god created us in his image we have certainly returned the compliment." -- Voltaire . "Stopping terrorism is simple. Just quit screwing around with other people's countries and the terrorists will go home. But the government of the United States wants to go on screwing around with other people's countries, refuses to stop, indeed views it as Manifest Destiny for the United States Government to persist in screwing around with other people's countries, and views the inconvenience, increased tax burden, loss of civil liberties, and even deaths among the American people as just another cost of doing business." -- Michael Rivero . "Be happy while you're living, for you're a long time dead." -- Scottish proverb . "Work like you don't need the money. Love like you've never been hurt. Dance like nobody's watching." -- Satchel Paige . "Git yer guns, the liberal folks are gonna let the coloreds vote!" -- Unknown . "Be kind; everyone you meet is fighting a hard battle." -- Plato The enemy is anybody who's going to get you killed, no matter which side he is on." -- Joseph Heller . "It is forbidden to kill; therefore all murderers are punished unless they kill in large numbers and to the sound of trumpets." -- Voltaire . "Capitalism is the astounding belief that the most wickedest of men will do the most wickedest of things for the greatest good of everyone." -- John Maynard Keynes . "I distrust those people who know so well what God wants them to do because I notice it always coincides with their own desires." -- Susan B. Anthony . "If pigs could vote, the man with the slop bucket would be elected swineherd every time, no matter how much slaughtering he did on the side." -- Orson Scott Card . "It is poverty to decide that a child must die so that you may live as you wish." -- Mother Teresa . "I'm ineffably tired of pro-war ideologues moaning about how the anti-war folk are just 'complaining' without 'offering solutions' to global dilemmas. Peace doesn't need a freekin moral, ethical, economical, or political qualification; war does. Peace doesn't ravage, plunder, rape, or kill; war does. Peace does not need justification, war does." -- <|OnAir|> . "History is an account mostly false, of events mostly unimportant, which are brought about by rulers, mostly knaves, and soldiers, mostly fools." -- Ambrose Bierce . "The people who have really made history are the martyrs." -- Aleister Crowley . "Laurel and Hardy, that's John and Yoko. And we stand a better chance under that guise because all the serious people like Martin Luther King, Jr. and Kennedy and Gandhi got shot." -- John Lennon . "Does anybody know who Lee Harvey Oswald was? . . . And do you know how far away he was? . . . Two hundred and fifty feet. He was two hundred and fifty feet away and shooting at a moving target. He got off three shots with a bolt action rifle in six seconds, and got two hits, including a head shot. Do you know where those men learned to shoot like that? . . . In the Marines! Outstanding! Those individuals showed what one motivated marine and his rifle can do! And before you ladies leave my island, you will be able to do the same thing!" -- Full Metal Jacket . "I love talking about the Kennedy assassination. The reason I do is because I'm fascinated by it. I'm fascinated that our government could lie to us so blatantly, so obviously for so long, and we do absolutely nothing about it." -- Bill Hicks . "Men who believe absurdities will commit atrocities." -- Voltaire . "The nationalist not only does not disapprove of atrocities committed by his own side, but he has a remarkable capacity for not even hearing about them." -- George Orwell . "Our government has kept us in a perpetual state of fear, kept us in a continuous stampede of patriotic fervor, with the cry of grave national emergency. Always there has been some terrible evil at home or some monstrous foreign power that was going to gobble us up if we did not blindly rally behind it." -- General Douglas MacArthur . "Knowledge, idea, belief stands in the way of wisdom." -- J. Krishnamurthi . "If we'd been born where they were born and taught what they were taught, we would believe what they believe." -- A church sign in Northern Ireland . "My humble friend, we know not how to live this life which is so short yet seek one that never ends." -- Anatole France . "It makes no difference as to the name of the God, since love is the real God of all in the world." -- Apache . "We choose our joys and sorrows long before we experience them." -- Kahlil Gibran . "Statistically one hundred percent of the shots you don't take don't go in." -- Wayne Gretsky . "Christianity exceeds all other faiths in its power to deform and finally invert the mental process." -- Ida White . "God favors no group. Only religions do that." -- Bumper Sticker . "On the outskirts of every agony sits some observant fellow who points." -- Virginia Woolf . "The fascist state is the corporate state." -- Benito Mussolini . "Jehovah was not a moral god. He had all the vices and he lacked all the virtues. He generally carried out all his threats, but he never faithfully kept a promise." -- Robert G. Ingersoll . "Guns make us powerful; butter will only make us fat." -- Nazi Hermann Goering . "Life is like an overlong drama through which we sit being nagged by the vague memories of having read the reviews." -- John Updike . "Everyone likes to say Hitler did this and Hitler did that. But the truth is Hitler did very little. He was a world class asshole, but the evil actually done, from the death camps to World War Two, was all done by citizens who were afraid to question if what they were told by their government was the truth or not, and who because they did not want to admit to themselves that they were afraid to question the government, refused to see the truth behind the Reichstag Fire, refused to see the invasion by Poland was a staged fake, and followed Hitler into national disaster." -- Michael Rivero . "Each nation knowing it has the only true religion and the only sane system of government, each despising all the others, each an ass and not suspecting it." -- Mark Twain . "All men are created equal. They are endowed by their Creator with certain unalienable rights, among these are life, liberty and the pursuit of happiness." -- Ho Chi Minh, 1945, as the Democratic Republic of Vietnam was created . "If there has to be a blood bath, let's get it over with." --Ronald Reagan, Vietnam . "You will kill ten of our men, and we will kill one of yours, and in the end it will be you who tire of it." -- Ho Chi Minh . "I ain't got no quarrel with the Vietcong ... No Vietcong ever called me nigger." -- Muhammad Ali, stripped of boxing title, convicted of a felony for refusing to serve during the Vietnam War . "I can envision a small cottage somewhere, with a lot of writing paper, and a dog, and a fireplace and maybe enough money to give myself some Irish coffee now and then and entertain my two friends." -- Richard Van de Geer, letter, 1975, last American to die in Vietnam War, Time, 1985 . "If you are required to kill someone today, on the promise of a political leader that someone else shall live in peace tomorrow, believe me, you are not only a double murderer, you are a suicide, too." -- Katherine Anne Porter . "I spent thirty-three years in the marines, most of my time being a high-class muscle man for big business, for Wall Street and the bankers. In short, I was a racketeer for capitalism." -- General Smedley Butler, Marine . "Over breakfast coffee we read of 40,000 American dead in Vietnam. Instead of vomiting, we reach for the toast. Our morning rush through crowded streets is not to cry murder but to hit that trough before somebody else gobbles our share." -- Dalton Trumbo . "What difference does it make to the dead, the orphans, and the homeless, whether the mad destruction is wrought under the name of totalitarianism or the holy name of liberty and democracy?" -- Mohandas Gandhi . "It is not so much the suffering as the senselessness of it that is unendurable." -- Nietzsche . "I dream that someday the United States will be on the side of the peasants in some civil war. I dream that we will be the ones who will help the poor overthrow the rich, who will talk about land reform and education and health facilities for everyone, and that when the Red Cross or Amnesty International comes to count the bodies and take the testimony of women raped, that our side won't be the heavies." -- Richard Cohen . "Throughout the world, on any given day, a man, woman or child is likely to be displaced, tortured, killed or disappeared, at the hands of governments or armed political groups. More often than not, the United States shares the blame." -- Amnesty International, in its annual report on U.S. Military aid and human rights, 1996 . "I am tired of fighting, our chiefs are killed...it is cold and we have no blankets. The little children are freezing to death...hear me, my chiefs, I am tired: my heart is sick and sad. From where the sun now stands...I will fight no more forever..." -- Chief Joseph, before his tribe was slaughtered . "When great changes occur in history, when great principles are involved, as a rule the majority are wrong." -- Eugene V. Debs . "Usually when people are sad, they don't do anything. They just cry over their condition. But when they get angry, they bring about a change." -- Malcolm X . "If we could read the secret history of our enemies, we should find in each man's life sorrow and suffering enough to disarm all hostility." -- Henry Wadsworth Longfellow . "Where it is a duty to worship the sun, it is pretty sure to be a crime to examine the laws of heat." -- John Morley . "The Church says that the earth is flat, but I know that it is round, for I have seen its shadow on the moon, and I have more faith in a shadow than in the Church." -- Ferdinand Magellan - (disputed) . "A casual stroll through the lunatic asylum shows that faith does not prove anything." -- Nietzsche . "Humanity without religion is like a serial killer without a chainsaw." -- Unknown . "In all the disputes, which have excited Christians against each other, Rome has invariably decided in favor of that opinion which tended most towards the suppression of the human intellect and the annihilation of the reasoning powers." -- Voltaire . "Humanity has advanced, when it has advanced, not because it has been sober, responsible, and cautious, but because it has been playful, rebellious, and immature." -- Tom Robbins . "The most detestable wickedness, the most horrid cruelties, and the greatest miseries that have afflicted the human race have had their origin in this thing called revelation, or revealed religion." -- Thomas Paine . "I have seldom met an intelligent person whose views were not narrowed and distorted by religion." -- James Buchanan . "Fascism is capitalism in decay." -- Vladimir Ilyich Lenin . "Giving money and power to government is like giving whiskey and car keys to teenage boys." -- P. J. O'Rourke . "The police are not here to create disorder. They're here to preserve disorder." -- Ex-Chicago Mayor Daley during the 1968 riots . "We need a common enemy to unite us." -- Condoleezza Rice, March 2000 . "I don't know that atheists should be considered citizens, nor should they be considered patriots. This is one nation under God." -- President George Bush, August 27, 1988 . "Peace is over rated. Any slave can have peace. Just pick the cotton." -- TheSong . "Pain is certain, suffering is optional." -- Buddha . "When did I realize I was God? Well, I was praying and I suddenly realized I was talking to myself." -- Jack Gurney - "The Ruling Class" . "Could a being create the fifty billion galaxies, each with two hundred billion stars, then rejoice in the smell of burning goat flesh?" -- Ron Patterson . "The United States is in no sense founded upon the Christian doctrine." -- George Washington Administration Treaty . "In the end, we will remember not the words of our enemies, but the silence of our friends." -- Martin Luther King, Jr. . "You're not to be so blind with patriotism that you can't face reality. Wrong is wrong, no matter who does it or says it." -- Malcolm X . "The great nations have always acted like gangsters, and the small nations like prostitutes." -- Stanley Kubrick . "The Pope!?! How many divisions has he got?" -- Joseph Stalin . "Science has done more for the development of western civilization in one hundred years than Christianity did in eighteen hundred years." -- Jeff Burroughs . "It is my conviction that killing under the cloak of war is nothing but an act of murder." -- Albert Einstein . "Americans used to roar like lions for liberty; now we bleat like sheep for security." -- Norman Vincent Peale . "Probably no nation is rich enough to pay for both war and education." -- Braham Flexner . "It is part of the general pattern of misguided policy that our country is now geared to an arms economy which was bred in an artificially induced psychosis of war hysteria and nurtured upon an incessant propaganda of fear." -- General Douglas MacArthur . "Everybody's worried about stopping terrorism. Well, there's a really easy way; stop participating in it." -- Noam Chomsky . "Everyone laughs and cries in the same language." -- dreamslaughter . "When you give food to the poor, they call you a saint. When you ask why the poor have no food, they call you a communist." -- Archbishop Helder Camara . "I saw a human skull the other day. There was an inscription below it: 'Look long and hard at me, for I was once as you are and you will soon be as I am.'" -- Unknown . "I read about an Eskimo hunter who asked the local missionary priest, 'If I did not know about God and sin, would I go to hell?' 'No,' said the priest, 'not if you did not know.' 'Then why,' asked the Eskimo earnestly, 'did you tell me?'" -- Annie Dillard . "Missionaries are perfect nuisances and leave every place worse than they found it." -- Charles Dickens . "I am convinced that I am acting as the agent of our Creator. By fighting off the Jews, I am doing the Lord's work." -- Adolf Hitler . "What do the nationalists say about killers punishing murderers and thieves sentencing looters?" -- Kahlil Gibran . "The most heinous and the cruelest crimes of which history has record have been committed under the cover of religion or equally noble motives." -- Mohandas Gandhi . "Now, my good man, this is no time for making enemies." -- Voltaire, deathbed, when asked to renounce Satan . "Isn't it enough to see that a garden is beautiful without having to believe that there are fairies at the bottom of it too?" -- Douglas Adams . "I sometimes think that God in creating man somewhat overestimated his ability." -- Oscar Wilde . "If English was good enough for Jesus, it's good enough for them Mexicans." -- Texas politician, Spanish as a second language . "The first clergyman was the first rascal who met the first fool." -- Voltaire . "Democracy is four wolves and a lamb voting on what to have for lunch." -- Ambrose Bierce . "No one rules if no one obeys." -- . "Most of the things worth doing in the world had been declared impossible before they were done." -- Louis Brandeis . "The history of liberty is a history of resistance. The history of liberty is a history of limitations of governmental power, not the increase of it." -- Woodrow Wilson . "None are more hopelessly enslaved than those who falsely believe they are free." -- Johann Wolfgang von Goethe . "It does me no injury for my neighbor to say there are twenty gods, or no God. It neither picks my pocket nor breaks my leg." -- Thomas Jefferson . "All Bibles are man-made." -- Thomas Edison . "In nature, there are neither rewards nor punishments; there are consequences." -- Robert G. Ingersoll . "We always obeyed the law. Isn't that what you do in America? Even if you don't agree with a law personally, you still obey it. Otherwise life would be chaos." -- Gertrude Scholtz-Klink, explaining Nazi policy . "I hit him to get his attention. I shot him to calm him down. I killed him to reason with him." -- Henry Rollins . "Every gun that is made, every warship launched, every rocket fired signifies in the final sense, a theft from those who hunger and are not fed, those who are cold and are not clothed. This world in arms is not spending money alone. It is spending the sweat of its laborers, the genius of its scientists, the hopes of its children. This is not a way of life at all in any true sense. Under the clouds of war, it is humanity hanging on a cross of iron." -- Dwight D. Eisenhower . "I am strongly in favor of using poisoned gas against uncivilized tribes. The moral effect should be good and it would spread a lively terror." -- Winston Churchill commenting on the British use of poison gas against the Iraqis after World War I . "How good bad music and bad reasons sound when we march against an enemy!" -- Nietzsche . "The crimes of the U.S. throughout the world have been systematic, constant, clinical, remorseless, and fully documented but nobody cares to talk about them." -- Harold Pinter . "How long would authority ... exist, if not for the willingness of the mass to become soldiers, policemen, jailers, and hangmen." -- Emma Goldman . "You get what anyone gets; you get a lifetime." -- Death, Neil Gaiman Comic Sandman . "To be wronged is nothing unless you continue to remember it." -- Confucius . "The truth is that there is nothing noble in being superior to somebody else. The only real nobility is in being superior to your former self." -- Whitney Young . "If you ever drop your keys into a river of molten lava, let 'em go, because, man, they're gone." -- Jack Handey . "All our lauded technological progress, our very civilization, is like the axe in the hand of the pathological criminal." -- Albert Einstein . "We hang the petty thieves and appoint the great ones to public office." -- Aesop . "In the 1980s capitalism triumphed over communism. In the 1990s it triumphed over democracy." -- David Korten . "The corporation is a true Frankenstein's monster, an artificial person run amok, responsible only to its own soulless self." -- William Dugger . "Convictions are more dangerous foes of truth than lies." -- Nietzsche . "Hain't we got all the fools in town on our side? And ain't that a big enough majority in any town?" -- Mark Twain . "In matters of conscience, the law of majority has no place." -- Mohandas Gandhi . "Why tell me that a man is a fine speaker, if it is not the truth that he is speaking?" -- Thomas Carlyle . "I cannot imagine a God who rewards and punishes the objects of his creation, whose purposes are modeled after our own; a God, in short, who is but a reflection of human frailty. Neither can I believe that the individual survives the death of his body, although feeble souls harbor such thoughts through fear or ridiculous egotisms..." -- Albert Einstein, obituary . "In every country and every age, the priest has been hostile to liberty." -- Thomas Jefferson . "A celibate clergy is an especially good idea, because it tends to suppress any hereditary propensity toward fanaticism." -- Carl Sagan . "I am amazed how many people on this planet are happy and free and never even saw the US constitution." -- . "Authoritarian government required to speak, is silent. Representative government required to speak, lies with impunity." -- Napoleon . "There is always a certain meanness in the argument of conservatism, joined with a certain superiority in its fact." -- Ralph Waldo Emerson . "I have the greatest admiration for your propaganda. Propaganda in the West is carried out by experts who have had the best training in the world, in the field of advertising, and have mastered the techniques with exceptional proficiency. Yours are subtle and persuasive; ours are crude and obvious. I think that the fundamental difference between our worlds, with respect to propaganda, is quite simple. You tend to believe yours and we tend to disbelieve ours." -- A U.S. based Soviet correspondent . "When you are right you cannot be too radical; when you are wrong you cannot be too conservative." -- Martin Luther King, Jr. . "... The CIA has overthrown functioning democracies in over twenty countries." -- John Stockwell, former CIA official . "When you call yourself an Indian or a Muslim or a Christian or a European, or anything else, you are being violent. Do you see why it is violent? It is because you are separating yourself from the rest of mankind. When you separate yourself by belief, by nationality, by tradition, it breeds violence. So a man who is seeking to understand violence does not belong to any country, to any religion, to any political party or partial system; he is concerned with the total understanding of mankind." -- J. Krishnamurthi . "Like all dreamers, I mistook disenchantment for truth." -- Jean Paul Sartre . "If it were all so simple! If only there were evil people somewhere insidiously committing evil deeds, and it were necessary only to separate them from the rest of us and destroy them; but the line dividing good and evil cuts through the heart of every human being. And who is willing to destroy a piece of his own heart?" -- Aleksandr Solzhenitsyn . "If you speak the truth, have one foot in the stirrup." -- Turkish proverb . "... Somehow we find it hard to sell our values, namely that the rich should plunder the poor." -- John Foster Dulles . "To sin by silence when they should protest makes cowards of men." -- Abraham Lincoln . "Reality is that which, when you stop believing in it, doesn't go away." -- Philip K. Dick . "As a child I understood how to give; I have forgotten this grace since I became civilized." -- Ohiyesa, Sioux . "Under capitalism, man exploits man. Under communism, it's just the opposite." -- John Kenneth Galbraith . "The target suffered a terminal illness before a firing squad in Baghdad." -- CIA officer at US Senate hearing on 1963 overthrow of Iraqi Prime Minister Kassem . "Those who hate and fight must stop themselves; otherwise it is not stopped." -- Spock, Day of the Dove . "Can anything be stupider than that a man has the right to kill me because he lives on the other side of a river and his ruler has a quarrel with mine, though I have not quarreled with him?" -- Blaise Pascal . "I was asked to memorize what I did not understand; and, my memory being so good, it refused to be insulted in that manner." -- Aleister Crowley . "The greatest artists of this world are never puritans, and seldom even ordinarily respectable." -- H. L. Mencken . "It is hard to free fools from chains they revere." -- Voltaire . "There is no real wealth but the labor of man. Where the mountains are of gold and the valleys of silver, the world would not be one grain of corn the richer; not one comfort would be added to the human race." -- Percy B. Shelley . "Foreign aid is when the poor people of a rich country give money to the rich people of a poor country." -- Gary Hart, BC Comic Strip . "I don't really miss God, but I sure miss Santa Claus!" -- Courtney Love . "Distrust all in whom the impulse to punish is powerful." -- Nietzsche . "Man is the religious animal. He is the only religious animal. He is the only animal that has the True Religion, several of them. He is the only animal that loves his neighbor as himself and cuts his throat, if his theology isn't straight. He has made a graveyard of the globe in trying his honest best to smooth his brother's path to happiness and heaven." -- Mark Twain . "The keenest sorrow is to recognize ourselves as the sole cause of all our adversities." -- Sophocles . "The truth is more important than the facts." -- Frank Lloyd Wright . "Every great advance in natural knowledge has involved the absolute rejection of authority." -- Thomas Huxley . "The world is divided into people who think they are right." -- Unknown . "Faith is belief without evidence in what is told by one who speaks without knowledge, of things without parallel." -- Ambrose Bierce . "My opinions may have changed, but not the fact that I am right." -- Ashleigh Brilliant . "Never forget that everything Hitler did in Germany was legal." -- Martin Luther King, Jr. . "Pity the warrior that kills all his foe." -- Star Trek . "Patriotism is the last refuge of a scoundrel." -- Samuel Johnson, English lexicographer, to which Ambrose Bierce replied: 'I beg to submit that it is the first.' . "Every day people are straying away from the church and going back to God." -- Lenny Bruce . "A tyrant is always stirring up some war or other, in order that the people may require a leader." -- Plato . "War is an instrument entirely insufficient toward redressing wrong; and multiplies, instead of indemnifying losses." -- Thomas Jefferson . "I do not feel obliged to believe that the same God who has endowed us with sense, reason, and intellect has intended us to forgo their use." -- Galileo Galilei . "The wise man will love; all others will desire." -- Afranius . "Christianity makes suffering contagious." -- Nietzsche . "May your fondest wish be granted." -- Traditional Chinese curse . "Truth is stranger than fiction, but it is because fiction is obliged to stick to possibilities; truth isn't." -- Mark Twain . "The exact contrary of what is generally believed is often the truth." -- Jean de la Bruyre . "Life is too short to waste in critical peep or cynic bark, quarrel or reprimand: It will soon be dark." -- Ralph Waldo Emerson . "Why of course the people don't want war. Why should some poor slob on a farm want to risk his life in a war when the best he can get out of it is to come back to his farm in one piece? Naturally, the common people don't want war; neither in Russia, nor in England, nor for that matter in Germany. That is understood. But after all, it is the leaders of the country who determine the policy, and it is always a simple matter to drag the people along, whether it is a democracy, or a fascist dictatorship, or a parliament, or a communist dictatorship... Voice or no voice, the people can always be brought to the bidding of the leaders. That is easy. All you have to do is to tell them they are being attacked, and denounce the pacifists for lack of patriotism and exposing the country to danger." -- Nazi Hermann Goering . "Believe those who are seeking the truth; doubt those who find it." -- Andre Gide . "That's not a lie, it's a terminological inexactitude." -- Alexander Haig . "If one acknowledges a group or a nation willing to commit atrocities, then one must also acknowledges the existence of a nation willing to commit atrocities to blame on the first nation." -- Michael Rivero . "He who fights with monsters might take care lest he thereby become a monster. For if you gaze for long into an abyss, the abyss gazes also into you." -- Nietzsche . "It is better to be feared than loved, if you cannot be both." -- Niccolo Machiavelli . "Whenever I hear anyone arguing for slavery, I feel a strong impulse to see it tried on him personally." -- Abraham Lincoln . "I prayed for twenty years but received no answer until I prayed with my legs." -- Frederick Douglass, escaped slave . "So far as I can remember, there is not one word in the Gospels in praise of intelligence." -- Bertrand Russel . "When encountering a new philosophy or religion, do not convert, but rather assimilate." -- Shawn Mikula . "You need only reflect that one of the best ways to get yourself a reputation as a dangerous citizen these days is to go about repeating the very phrases which our founding fathers used in the great struggle for independence." -- Attributed to Charles Austin Beard . "At the risk of seeming ridiculous, let me say that the true revolutionary is guided by great feelings of love. It is impossible to think of a genuine revolutionary lacking this quality." -- Ernesto 'Che' Guevara . "The only thing necessary for the triumph of evil is for good men to do nothing." -- Edmund Burke . "The citizen who sees his society's democratic clothes being worn out and does not cry it out, is not a patriot, but a traitor." -- Mark Twain . "The Christian resolution to find the world ugly and bad has made the world ugly and bad." -- Nietzsche . "The multitude of books is a great evil. There is no limit to this fever for writing." -- Martin Luther . "If the doctor told me I had only six minutes to live, I'd type a little faster." -- Isaac Asimov . "The modern conservative is engaged in one man's oldest exercises in moral philosophy; that is the search for a superior moral justification for selfishness." -- John K. Galbraith . "Conservatives are not necessarily stupid, but most stupid people are conservatives." -- John Stuart Mill . "I have examined all of the known superstitions of the world and I do not find in our superstitions of Christianity one redeeming feature. They are all founded on fables and mythology. Christianity has made one-half the world fools and the other half hypocrites." -- Thomas Jefferson . "It may be that our role on this planet is not to worship God, but to create him." -- Arthur C. Clarke . "In order to learn, one must change one's mind." -- Orson Scott Card . "Every anarchist is a baffled dictator." -- Benito Mussolini . "Everyone's values are defined by what they will tolerate when it is done to others." -- William Greider . "Patriotism is the virtue of the vicious." -- Oscar Wilde . "Do not do an immoral thing for moral reasons." -- Thomas Hardy . "If fifty million people believe a foolish thing, it is still a foolish thing." -- Anatole France . "There must be more to life than having everything." -- Maurice Sendak . "Knowledge comes, but wisdom lingers." -- Alfred, Lord Tennyson . "He who knows nothing is closer to the truth than he whose mind is filled with falsehoods and errors." -- Thomas Jefferson . "I had a lover's quarrel with the world." -- Robert Frost . "Written laws are like spider's webs; they will catch, it is true, the weak and poor, but would be torn in pieces by the rich and powerful." -- Anacharsis . "Computers are useless. They can only give you answers." -- Pablo Picasso . "You simply cannot hang a millionaire in America." -- Bourke Cockran . "We must be willing to let go of the life we have planned, so as to have the life that is waiting for us." -- Joseph Campbell . "When the president does it that means it is not illegal." -- Richard Nixon . "War is hell and all that, but it has a good deal to recommend it. It wipes out all the small nuisances of peacetime." -- Ian Hay . "Patriotism is the willingness to kill and be killed for trivial reasons." -- Bertrand Russell . "All propaganda must be so popular and on such an intellectual level, that even the most stupid of those toward whom it is directed will understand it ... Through clever and constant application of propaganda, people can be made to see paradise as hell, and also the other way around, to consider the most wretched sort of life as paradise." -- Adolf Hitler . "If there was a god, he wouldn't let a guy walk right up and shoot you in the face now would he? That's right, now you get the picture. Truth burns doesn't it?" -- Henry Rollins . "This country, with its institutions, belongs to the people who inhabit it. Whenever they shall grow weary of the existing government, they can exercise their constitutional right of amending it, or exercise their revolutionary right to overthrow it." -- Abraham Lincoln . "If you believe in the existence of fairies at the bottom of the garden you are deemed fit for the bin. If you believe in parthenogenesis, ascension, transubstantiation and all the rest of it, you are deemed fit to govern the country." -- Jonathan Meades . "Gentlemen, you can't fight in here! This is the War Room!" -- Dr. Strangelove . "I know of no crime that has not been defended by the church, in one form or other. The church is not a pioneer; it accepts a new truth, last of all, and only when denial has become useless." -- Robert G. Ingersoll . "In general the art of government consists in taking as much money as possible from one class of citizens to give to the other." -- Voltaire . "A nation is a society united by a delusion about its ancestry and by common hatred of its neighbors." -- William R. Inge . "Cast aside those who liken godliness to whimsy and who try to combine their greed for wealth with their desire for a happy afterlife." -- Kahlil Gibran . "If we do not like the world the way it is, then it is because we are not okay the way we are." -- deeshan . "Your every decision conspires to make this moment happen." -- Christi Philpott . "Yes, my friends, I too am prepared to die for a cause, but there is no cause for which I am prepared to kill." --Mohandas Gandhi . "Experience is a hard teacher because she gives the test first, the lesson afterwards." --Vernon Saunders Law . "It is your business, when the wall next door catches fire." -- Horace . "Once you have seen certain things, you can't un-see them, and seeing nothing is as political an act as seeing something." -- Arundhati Roy . "Translate 'Allah'." -- Bumper Sticker . "Science is always discovering odd scraps of magical wisdom and making a tremendous fuss about its cleverness." -- Aleister Crowley . "They said I was the greatest pitcher they ever saw; I couldn't understand why they couldn't give me no justice." -- Satchel Paige . "A conservative government is an organized hypocrisy." -- Benjamin Disraeli . "In a time of universal deceit, telling the truth is a revolutionary act." -- George Orwell . "Think my friends! You adulate a stone as Vishnu but you cannot see God in a fellow man." -- Sankaracharya . "The total absence of humor in the Bible is one of the most singular things in all literature." -- Alfred North Whitehead . "All I know is that I am not a Marxist." -- Karl Marx . "There is enough for man's need but not for man's greed." --Mohandas Gandhi . "Before you speak, ask yourself is it kind, is it necessary, is it true, does it improve on the silence?" -- Shirdi Sai Bab . "Everything of importance has been said before by somebody who did not discover it." -- Alfred North Whitehead . "The good Christian should beware of mathematicians and all those who make empty prophecies. The danger already exists that mathematicians have made a covenant with the devil to darken the spirit and confine man in the bonds of Hell." --Saint Augustine . "I object to violence because when it appears to do good, the good is only temporary; the evil it does is permanent." -- Mohandas Gandhi . "Truth is for the minority." -- Baltasar Gracin . "The color of the skin makes no difference. What is good and just for one is good and just for the other. And the Great Spirit made all men brothers." -- White Shield, Arikara . "The reasonable man adjusts himself to the world, the unreasonable one persists in trying to adapt the world to himself; therefore all progress depends on the unreasonable man." -- George Bernard Shaw . "I did not know how to say goodbye. It was harder still, when I refused to say it." -- Native American saying . "Never was anything great achieved without danger." -- Niccolo Machiavelli . "Those who see and feel beyond illusion have acquired a far greater gift than could ever be derived from studying scripture and philosophy books, for these were meant only to guide the blind." -- Shawn Mikula . "If you understand everything, you must be misinformed." -- Japanese Proverb . "Theology is never any help; it is searching in a dark cellar at midnight for a black cat that isn't there. Theologians can persuade themselves of anything." -- Robert Heinlein . "This monkey mythology of Darwin is the cause of permissiveness, promiscuity, prophylactics, perversions, pregnancies, abortions, porno-therapy, pollution, poisoning and proliferation of crimes of all types." -- Judge Braswell Dean . "There was a time when I believed in the story and the scheme of salvation, so far as I could understand it, just as I believed there was a Devil. Suddenly the light broke through to me and I saw a silly story, and each generation nowadays swallows it with greater difficulty. Why do people go on pretending about this Christianity?" -- H. G. Wells . "The state has not the right to leave every man free to profess and embrace whatever religion he may desire." -- Pope Pius IX . "Government is actually the worst failure of civilized man. There has never been a really good one, and even those that are most tolerable are arbitrary, cruel, grasping and unintelligent." -- H. L. Mencken . "It's not what you don't know that hurts you. It's what you know that just isn't so." -- Satchel Paige . "We've got to pause and ask ourselves, how much clean air do we need?" -- Lee Iacocca . "It has become appallingly obvious that our technology has exceeded our humanity." -- Albert Einstein . "The difference between our decadence and the Russians' is that while theirs is brutal, ours is apathetic." -- James Thurber . "I do not read advertisements. I would spend all of my time wanting things." -- Franz Kafka . "Don't join the book burners." -- Dwight D. Eisenhower . "To date, despite the efforts of millions of true believers to support this myth, there is no more evidence for the Judeo-Christian god than any of the gods on Mount Olympus." -- Joseph Daleiden . "You find as you look around the world that every single bit of progress in humane feeling, every improvement in the criminal law, every step toward the diminution of war, every step toward better treatment of the colored races, or every mitigation of slavery, every moral progress that there has been in the world, has been consistently opposed by the organized churches of the world. I say quite deliberately that the Christian religion, as organized in its churches, has been and still is the principal enemy of moral progress in the world." -- Bertrand Russell . "Free from desire, you realize the mystery. Caught in desire, you see only the manifestations." -- Tao Te Ching . "if you keep doing what you've always done, you'll keep getting what you've always gotten." -- Jim Rohn . "Few people are capable of expressing with equanimity opinions which differ from the prejudices of their social environment. Most people are even incapable of forming such opinions." -- Albert Einstein . "Everything should be made as simple as possible, but not simpler." -- Albert Einstein . "Our scientific power has outrun our spiritual power. We have guided missiles and misguided men." -- Martin Luther King, Jr. . "We could have saved the Earth but we were too damned cheap." -- Kurt Vonnegut . "Either God wants to abolish evil, and cannot; or he can, but does not want to. If he wants to, but cannot, he is impotent. If he can, but does not want to, he is wicked. If, as they say, God can abolish evil, and God really wants to do it, why is there evil in the world?" -- Epicurus . "Irrationally held truths may be more harmful than reasoned errors." -- Thomas Huxley . "It is a government of the people by the people for the people no longer; it is a government of corporations by corporations for corporations." -- Rutherford B. Hayes . "In all affairs, it's a healthy thing now and then to hang a question mark on the things you have long taken for granted." -- Bertrand Russell . "Religion is not merely the opium of the masses; it's the cyanide." -- Tom Robbins . "Nothing overshadows truth so much as authority." -- Leon Battista Alberti . "In Christianity, neither morality nor religion comes into contact with reality at any point." -- Nietzsche . "A language is a dialect with an army and a navy." -- Max Weinreich . "It is dangerous to be right in matters on which the established authorities are wrong." -- Voltaire . "Beware of the man whose god is in the skies." -- George Bernard Shaw . "Almost all absurdity of conduct arises from the imitation of those whom we cannot resemble." -- Samuel Johnson . "Turn over the pages of history and read the damning record of the church's opposition to every advance in every field of science." -- Upton Sinclair . "Don't try to teach a pig to sing, it can't be done and it only ticks off the pig." -- Robert Heinlein . "Form no covetous desire, so that the demon of greediness may not deceive thee, and the treasure of the world may not be tasteless to thee." -- Zoroaster . "The more laws and order are made prominent, the more thieves and robbers there will be." -- Lao Tsu . "People with virtue must speak out; People who speak are not all virtuous." -- Confucius . "One death is a tragedy. A million deaths is a statistic." -- Josef Stalin . "Prohibition goes beyond reason in that it attempts to control a man's appetite through legislation. A prohibition law strikes a blow at the very principles this country was founded upon." -- Abraham Lincoln . "When liberty is taken away by force it can be restored by force. When it is relinquished voluntarily by default, it can never be recovered." -- Dorothy Thompson . "Problems cannot be solved at the same level of awareness that created them." -- Albert Einstein . "We can often do more for other men by trying to correct our own faults than by trying to correct theirs." -- Francois Fenelon . "News is what someone wants to suppress. Everything else is advertising." -- Ex-NBC news president Rubin Frank . "When women are depressed they either eat or go shopping. Men invade another country." -- Elayne Boosler . "To use the term blind faith, is to use an adjective needlessly." -- Julian Ruck . "The establishment of Christianity arrested the normal development of the physical sciences for over fifteen hundred years." -- Andrew Dickson White . "It is right noble to fight with wickedness and wrong; the mistake is in supposing that spiritual evil can be overcome by physical means." -- Lydia Maria Child . "Nothing except a battle lost can be half as melancholy as a battle won." -- Duke of Wellington . "All warfare is based on deception." -- Sun tzu . "Nothing brings people together more, than mutual hatred." -- Henry Rollins . "Just as a picture is drawn by an artist, surroundings are created by the activities of the mind." -- Buddha . "The best way to make children good is to make them happy." -- Oscar Wilde . "The minority, the ruling class at present, has the schools and press, usually the Church as well under its thumb. This enables it to organize and sway the emotions of the masses, and make its tool of them." -- Albert Einstein . "All civilization has from time to time become a thin crust over a volcano of revolution." -- Havelock Ellis . "Outside of the killings, Washington has one of the lowest crime rates in the country." -- Marion Barry, former mayor Washington D.C. . "When I told the people of Northern Ireland that I was an atheist, a woman in the audience stood up and said, 'Yes, but is it the God of the Catholics or the God of the Protestants in whom you don't believe?'" -- Quentin Crisp . "Whatever the natural cause, sin is the true cause of all earthquakes." -- John Wesley . "Anyone who has two shirts when someone has none is not a Christian." -- Lenny Bruce . "Generosity is not giving me that which I need more than you do, but it is giving me that which you need more than I do." -- Kahlil Gibran . "You exist only in what you do." -- Federico Fellini . "All truth passes through three stages. First, it is ridiculed. Second, it is violently opposed. Third, it is accepted as being self-evident." -- Arthur Schopenhauer . "Kindness is more important than wisdom, and the recognition of this is the beginning of wisdom." -- Theodore Isaac Rubin . "You can't say civilizations don't advance, because they kill you in a new way in each war." -- Will Rogers . "In order to be an immaculate member of a flock of sheep, one must above all be a sheep oneself." -- Albert Einstein . "The church tries to save sinners, but science seeks to stop their manufacture." -- Elbert Hubbard . "I can't embrace a male god who has persecuted female sexuality throughout the ages; and that persecution still goes on today, all over the world." -- Amanda Donohoe . "Any fool can make a rule, and any fool will mind it." -- Henry David Thoreau . "Pontius Pilate was the first great censor, and Jesus Christ the first great victim of censorship." -- Ben Lindsay . "We are what we think. All that we are arises with our thoughts. With our thoughts, we make the world." -- Buddha . "I thought dying for your country was the worst thing that could happen to you. I think killing for your country can be a lot worse; because that's the memory that haunts." -- Bob Kerry told to The New York Times . "It is lamentable, that to be a good patriot one must become the enemy of the rest of mankind." -- Voltaire . "Contraction of theological influence has at once been the best measure, and the essential condition of intellectual advance." -- William H. Lecky . "Isn't killing people in the name of God a pretty good definition of insanity?" -- Arthur C. Clarke . "Talent hits a target no one else can hit; Genius hits a target no one else can see." -- Arthur Schopenhauer . "Oh Mortal Man, is there nothing you cannot be made to believe?" -- Adam Weishaupt, Co-founder New World Order . "There are three truths: my truth, your truth, and the truth." -- Chinese proverb . "People only see what they are prepared to see." -- Ralph Waldo Emerson . "Lying is done with words and also with silence." -- Adrienne Rich . "If a man would follow, today, the teachings of the Old Testament, he would be a criminal. If he would follow strictly the teachings of the New, he would be insane." -- Robert G. Ingersoll . "The man who accumulates, whether money or knowledge, can never be free." -- J. Krishnamurthi . "There is a tragic clash between truth and the world. Pure undistorted truth burns up the world." -- Nikolay Berdyayev . "Just drive down that road, until you get blown up." -- General George Patton, reconnaissance troops . "If I could find a way to get [Saddam Hussein] out of there, even putting a contract out on him, ... ahh ... if the CIA still did that sort of thing, . . . ahh . . . assuming it ever did . . . . . . . I would be for it." -- Richard Nixon . "I never advocated war except as a means of peace." -- Ulysses S. Grant . "If you pray for rain long enough, it eventually does fall. If you pray for floodwaters to abate, they eventually do. The same happens in the absence of prayers." -- Steve Allen . "Spiritual maturity is a lifelong process of replacing lies with truth." -- Kurt Bruner . "I was under medication when I made the decision to burn the tapes." -- Richard Nixon . "Freedom is not something that anybody can be given, freedom is something people take." -- James Baldwin . "The public is wonderfully tolerant. It forgives everything except genius." -- Oscar Wilde . "Intellectuals solve problems; geniuses prevent them." -- Albert Einstein . "Acceptance without proof is the fundamental characteristic of Western religion, rejection without proof is the fundamental characteristic of Western science." -- Gary Zukav . "How can you make a revolution without executions?" -- Lenin on hearing that the death penalty had been abolished by the Soviet . "True and false are attributes of speech, not of things. And where speech is not, there is neither truth nor falsehood." -- Thomas Hobbes . "Do you love your Creator? Love your fellow beings first." -- Prophet Muhammad . "Laws are silent in time of war." -- Cicero . "I shall be an autocrat: that's my trade. And the good Lord will forgive me: that's his." -- Empress Catherine the Great . "Man was born free, and everywhere he is in chains." -- Rousseau . "Never go to sleep when your meat is on the fire." -- Pueblo . "A treatise upon human nature: It is not contrary to reason to prefer the destruction of the whole world to the scratching of my finger." -- David Hume . "You can't step twice into the same river." -- Heraclitus . "You should never wear your best trousers when you go out to fight for freedom and liberty." -- Henrik Ibsen . "Necessity never made a good bargain." -- Ben Franklin . "You shall find out how salt is the taste of another man's bread, and how hard is the way up and down another man's stairs." -- Dante . "You'll never have a quiet world till you knock the patriotism out of the human race." -- George Bernard Shaw . "This is very true; for my words are my own, and my actions are my ministers." -- Charles II . "Sometimes a scream is better than a thesis." -- Ralph Waldo Emerson . "Politics is war without bloodshed while war is politics with bloodshed." -- Mao Tse Tung When a stupid man is doing something he is ashamed of, he always declares that it is his duty." -- George Bernard Shaw . "There are very few monsters who warrant the fear we have of them." -- Andre Gide . "Whoever controls the media, the images, controls the culture." -- Allen Ginsberg . "Listen or your tongue will keep you deaf." -- Native American saying . "One-tenth of the folks run the world. One-tenth watch them run it, and the other eighty percent don't know what the hell's going on." -- Jake Simmons . "An empty stomach is not a good political advisor." -- Albert Einstein . "Religion is the end of love and honesty, the beginning of confusion; faith is a colorful hope or fear, the origin of folly." -- Tao Te Ching . "Why do we kill people who are killing people to show that killing people is wrong?" -- Holly Near . "If you give me six lines written by the hand of the most honest of men, I will find something in them which will hang him." -- Cardinal Richelieu . "Only a fool tests the depth of the water with both feet." -- African proverb . "Democracy is the recurrent suspicion that more than half of the people are right more than half of the time." -- Elwyn B. White . "The more I study religions the more I am convinced that man never worshipped anything but himself." -- Sir R. F. Burton . "We are ensnared by the wisdom of the serpent; we are set free by the foolishness of God." -- Saint Augustine . "We live in our desires rather than in our achievements." -- George Moore . "Wherever there is great property, there is great inequality, for one very rich man; there must be at least five hundred poor." -- Adam Smith . "When a government lasts a long while, it deteriorates by insensible degrees. Republics end through luxury, monarchies through poverty." -- Montesquieu . "The cardinal doctrine of a fanatic's creed is that his enemies are the enemies of God." -- Andrew Dickson White . "Society in every state is a blessing, but government, even in its best stage, is but a necessary evil; in its worst stage, an intolerable one." -- Thomas Paine . "The supreme art of war is to subdue the enemy without fighting." -- Sun tzu . "A foolish consistency is the hobgoblin of little minds, adored by little statesmen and philosophers and divines." -- Ralph Waldo Emerson . "Truthful words are not beautiful; beautiful words are not truthful. Good words are not persuasive; persuasive words are not good." -- Lao tzu . "Oh, how bitter a thing is to look through another man's eye." -- William Shakespeare . "Know all and you will pardon all." -- Thomas Kempis . "I am sufficiently proud of my knowing something to be modest about my not knowing everything." -- Vladimir Nabokov . "All natural institutions of churches, whether Jewish, Christian, or Turkish, appear to me no other than human inventions, set up to terrify and enslave mankind, and monopolize power and profit." -- Thomas Paine . "They that die by famine die by inches." -- Matthew Henry . "In law a man is guilty when he violates the rights of another. In ethics he is guilty if he only thinks of doing so." -- Immanuel Kant . "There is no sport in hate when all the rage is on one side." -- Percy B. Shelley . "Except as its clown and jester, society does not encourage individuality, and the State abhors it." -- Bernard Berenson . "Everywhere is walking distance if you have the time." -- Steven Wright . "You must ask your neighbor if you shall live in peace." -- John Clark . "It is true that liberty, so precious, must be rationed." -- Nikolai Lenin . "It would now be technically possible to unify the world, abolish war and poverty altogether, if men desired their own happiness more than the misery of their enemies." -- Bertrand Russel . "Most men lead lives of quiet desperation and go to the grave with the song still in them." -- Henry David Thoreau . "I refuse to be labeled immoral merely because I am godless." -- Peter Walker . "Art is dangerous. It is one of the attractions: when it ceases to be dangerous, you don't want it." -- Duke Ellington . "Suppose you were an idiot, and suppose you were a member of congress; but I repeat myself." -- Mark Twain . "Know thy enemy and know thy self and you will win a hundred battles." -- Sun tzu . "Life is like a game of cards. The hand that is dealt you represents determinism; the way you play it is free will." -- Jawaharlal Nehru . "The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true." -- James Branch Cabell . "Peace is only possible if men cease to place their happiness in the possession of things which cannot be shared." -- Julien Benda . "It may be necessary temporarily to accept a lesser evil, but one must never label a necessary evil as good." -- Margaret Mead . "Silence is one of the hardest arguments to refute." -- Josh Billings . "You can't wake a person who is pretending to be asleep." -- Native Proverb . "I have often regretted my speech, never my silence." -- Xenocrates . "Never does nature say one thing and wisdom another." -- Juvenal . "He who will not reason is a bigot; he who cannot is a fool; and he who dares not is a slave." -- William Drummond . "The quickest way of ending a war is to lose it." -- George Orwell . "Truth always lags behind, limping along on the arm of Time." -- Baltasar Gracin . "Nothing unites the English like war. Nothing divides them like Picasso." -- Hugh Mills . "...as hollow as the o in god..." -- Marilyn Manson . "War: first, one hopes to win; then one expects the enemy to lose; then, one is satisfied that he too is suffering; in the end, one is surprised that everyone has lost." -- Karl Kraus . "It is better to be generous than just. It is sometimes better to sympathize instead of trying to understand." -- Pierre Lecompte de Nouy . "The more you own, the more it owns you." -- Henry Rollins . "Money often costs too much." -- Ralph Waldo Emerson . "It is hard, I submit, to loathe bloodshed, including war, more than I do, but it is still harder to exceed my loathing of the very nature of totalitarian states in which massacre is only an administrative detail." -- Vladimir Nabokov . "Nothing is more surprising than the easiness with which the many are governed by the few." -- David Hume . "And the little screaming fact that sounds through all history: repression works only to strengthen and knit the repressed." -- John Steinbeck . "We are condemned to kill time: thus we die bit by bit." -- Octavio Paz . "Do not seek to follow in the footsteps of the wise. Seek what they sought." -- Basho . "By trying we can easily learn to endure adversity; another man's, I mean." -- Mark Twain . "Give to every other human being every right you claim for yourself." -- Robert G. Ingersoll . "Don't say you don't have enough time. You have exactly the same number of hours per day that were given to Helen Keller, Pasteur, Michelangelo, Mother Teresa, Leonardo da Vinci, Thomas Jefferson, and Albert Einstein." -- H. Jackson Brown . "While the word is yet unspoken, you are master of it; when once it is spoken, it is master of you." -- Arab proverb . "Twenty years from now you will be more disappointed by the things that you didn't do than by the ones you did do." -- Samuel Clemens . "Ignorance is always afraid of change." -- Jawaharlal Nehru . "Before we blame, we should first see if we can excuse." -- G. C. Lichtenberg . "Don't speak unless you can improve on the silence." -- Spanish proverb . "I would have made a good pope." -- Richard Nixon . "In politics, stupidity is not a handicap." -- Napoleon . "The purpose of law is to prevent the strong from always having their way." -- Ovid . "Time is a great teacher, but unfortunately it kills all its pupils." -- Hector Berlioz . "A man who is afraid will do anything." -- Jawaharlal Nehru . "Heresy is a cradle; orthodoxy a coffin." -- Robert G. Ingersoll . "Each of us is confined to a world of our own making." -- Shawn Mikula . "Democracy used to be a good thing, but now it has gotten into the wrong hands." -- Jessie Helms . "If a person is to get to the meaning of life, he must learn to like the facts about himself, ugly as they may seem to his sentimental vanity, before he can learn the truth behind the facts. And the truth is never ugly." -- Eugene O'Neill . "No one has ever had an idea in a dress suit." -- Sir Frederick G. Banting . "Without censorship, things can get terribly confused in the public mind." -- General William Westmoreland . "Strange is our situation here upon Earth." -- Albert Einstein . "Until the infallibility of human judgment shall have been proved to me, I shall persist in demanding the abolition of the death penalty." -- Marquis de Lafayette . "If you don't know where you're going, any road will get you there." -- Ancient Chinese Proverb . "Opportunities multiply as they are seized." -- Sun tzu . "Real knowledge is to know the extent of one's ignorance." -- Confucius . "As far as the laws of mathematics refer to reality, they are not certain, and as far as they are certain, they do not refer to reality." -- Albert Einstein . "One's mind, once stretched by a new idea, never regains its original dimensions." -- Oliver Wendell Holmes . "It is not easy to find happiness in ourselves; it is not possible to find it elsewhere." -- Agnes Repplier . "Being deeply loved by someone gives you strength; loving someone deeply gives you courage." -- Lao tzu . "The world is too dangerous to live in, not because of the people who do evil, but because of the people who sit and let it happen." -- Albert Einstein . "Beliefs are what divide people. Doubt unites them." -- Peter Ustinov . "Wisdom is knowing what to do next. Virtue is doing it." -- David Starr Jordan . "The liar's punishment is not in the least that he is not believed, but that he cannot believe anyone else." -- George Bernard Shaw . "Whatever you do will be insignificant, but it is very important that you do it." -- Mohandas Gandhi . "You can't have everything. Where would you put it?" -- Steven Wright . "The way to find what the mainstream will do tomorrow is to associate with the lunatic fringe today." -- Jean-Louis Gassee . "A jury consists of twelve persons chosen to decide who has the better lawyer." -- Robert Frost . "Our job is to give people not what they want, but what we decide they ought to have." -- Richard Salent, Former President CBS News . "You can pretend to be serious; you can't pretend to be witty." -- Sacha Guitry . "Two attitudes are all that is needed; do not harm anything, say and do things that make others happy." -- dreamslaughter . "In spite of everything I still believe that people are really good at heart." -- Anne Frank, holocaust victim . "Why is propaganda so much more successful when it stirs up hatred than when it tries to stir up friendly feeling?" -- Bertrand Russell . "Nature does not hurry, yet everything is accomplished." -- Lao tzu . "The illegal we do immediately. The unconstitutional takes a bit longer." -- Henry Kissinger . "The victor will never be asked if he told the truth." -- Adolf Hitler . "What sane person could live in this world and not be crazy?" -- Ursula K. LeGuin . "Never express yourself more clearly than you think." -- Neils Bohr . "Modern morality and manners suppress all natural instincts, keep people ignorant of the facts of nature and make them fighting drunk on bogey tales." -- Aleister Crowley . "The right things to do are those that keep our violence in abeyance; the wrong things are those that bring it to the fore." -- Robert J. Sawyer . "When you are content to be simply yourself and don't compare or compete, everybody will respect you." -- Lao tzu . "What is the use of a house if you haven't got a tolerable planet to put it on?" -- Henry David Thoreau . "I consider Christian theology to be one of the greatest disasters of the human race." -- Alfred North Whitehead . "Most people drive thru life with the parking brake on." -- Lance Bradley . "Truth is living, it is not static, and the mind that would discover truth must also be living, not burdened with knowledge or experience." -- J. Krishnamurthi . "If everyone demanded peace instead of another television set, then there'd be peace." -- John Lennon . "The biggest conspiracy of all is the claim that there are no conspiracies!" -- Michael Rivero . "The death of dogma is the birth of morality." -- Immanuel Kant . "Can you sympathize with an exploding star?" -- Shawn Mikula . "The revolution is a dictatorship of the exploited against the exploiters." -- Fidel Castro . "Whoever imagines himself a favorite with God holds others in contempt." -- Robert G. Ingersoll . "Simplicity is the ultimate sophistication." -- Leonardo da Vinci . "All religions are founded on the fear of the many and the cleverness of the few." -- Stendhal . "Today it is fashionable to talk about the poor. Unfortunately, it is not fashionable to talk with them." -- Mother Teresa . "No man's knowledge here can go beyond his experience." -- John A. Locke . "Life's under no obligation to give us what we expect." -- Margaret Mitchell . "The history of war is the history of powerful individuals willing to sacrifice thousands upon thousands of other people's lives for personal gains." -- Michael Rivero . "Being with a woman all night never hurt no professional baseball player. It's staying up all night looking for a woman that does him in." -- Casey Stengel . "The religion of the future will be a cosmic religion, the religion which based on experience, which refuses dogma." -- Albert Einstein . "Would you like to liberate yourself from the lower realms of life? Would you like to save the world from the degradation and destruction it seems destined for? Then step away from shallow mass movements and quietly go to work on your own self-awareness." -- Lao tzu . "It is curious that physical courage should be so common in the world and moral courage so rare." -- Mark Twain . "Do not mind anything that anyone tells you about anyone else. Judge everyone and everything for yourself." -- Henry James . "When a thing has been said and said well, have no scruple. Take it and copy it." -- Anatole France . "The secret of happiness is to admire without desiring." -- F. H. Bradley . "To travel is to discover that everyone is wrong about other countries." -- Aldous Huxley . "Pray: To ask the laws of the universe to be annulled on behalf of a single petitioner confessedly unworthy." -- Ambrose Bierce . "The greatest deception men suffer is from their own opinions." -- Leonardo da Vinci . "Even if truth destroys the whole universe, still it is truth; stand by it." -- Swami Vivekananda . "The actions of men are the best interpreters of their thoughts." --John Locke . "Christians are supposed not merely to endure change, nor even to profit by it, but to cause it." -- Harry Emerson Fosdick . "Every man is guilty of all the good he didn't do." -- Voltaire . "Put your hand on a hot stove for a minute, and it seems like an hour. Sit with a pretty girl for an hour, and it seems like a minute. That's relativity." -- Albert Einstein . "If you would be a real seeker after truth, it is necessary that at least once in your life you doubt, as far as possible, all things." -- Rene Descartes . "Time wounds all heels." -- Jane Ace . "Beware of all enterprises that require new clothes." -- Henry David Thoreau . "Manifest plainness, embrace simplicity, reduce selfishness, have few desires." -- Lao tzu . "When a man says he approves of something in principle, it means he hasn't the slightest intention of carrying it out in practice." -- Otto von Bismarck . "A man's character is his fate." -- Heraclitus . "Quarrels would not last long if only one side was wrong." -- Francois Duc de la Rochefoucauld . "Philosophers have merely interpreted the world. The point is to change it." -- Karl Marx . "I am not a communist and neither is the revolutionary movement." -- Fidel Castro . "When a nation's young men are conservative, its funeral bell is already rung." -- Henry Ward Beecher . "Science is the great antidote to the poison of enthusiasm and superstition." -- Adam Smith . "The Brush Dance is a Yurok healing ritual where being true to yourself means give your best to a person in need. Being true to yourself is the one and only Yurok Indian Law." -- Brush Dance Journal . "Happiness is an imaginary condition, formerly attributed by the living to the dead, now usually attributed by adults to children, and by children to adults." -- Thomas Szasz . "Never explain, your friends do not need it and your enemies will not believe you anyway." -- Elbert Hubbard . "The pious pretense that evil does not exist only makes it vague, enormous and menacing." -- Aleister Crowley . "Once all struggle is grasped, miracles are possible." -- Mao Tse Tung . "Everybody sooner or later, sits down to a banquet of consequences." -- Robert Louis Stevenson . "We will be known by the tracks we leave behind." -- Dakota proverb . "If a scholar aspires to the Way but is ashamed of bad clothes and bad food, he isn't ready to join the discussion yet." -- Confucius . "Earth provides enough to satisfy every man's need, but not every man's greed." --Mohandas Gandhi . "...so long as the media are in corporate hands, the task of social change will be vastly more difficult, if not impossible." -- Robert McChesney . "It is wrong always, everywhere, and for anyone, to believe anything upon insufficient evidence." -- William Kingdon Clifford . "I do not believe that any type of religion should ever be introduced into the public schools of the United States." -- Thomas Edison . "The radical invents the views. When he has worn them out, the conservative adopts them." -- Mark Twain . "Monarchy degenerates into tyranny, aristocracy into oligarchy, and democracy into savage violence and chaos." -- Polybius . "Never interrupt your enemy when he is making a mistake." -- Napoleon . "When the water starts boiling it is foolish to turn off the heat." -- Nelson Mandela . "The spirit of resistance to government is so valuable on certain occasions that I wish it to be always kept alive." -- Thomas Jefferson . "If we continue to develop our technology without wisdom or prudence, our servant may prove to be our executioner." -- General Omar N. Bradley . "The rights of women are sacred. See that women are maintained in the rights attributed to them." -- Prophet Muhammed . "Try not to become a man of success but rather to become a man of value." -- Albert Einstein . "When you meet a worthy person, focus on reaching his level. When you meet an unworthy person, take a good look inside yourself." -- Confucius . "If one were to take the bible seriously one would go mad. But to take the bible seriously, one must be already mad." -- Aleister Crowley . "All my humor is based upon destruction and despair. If the whole world were tranquil, without disease and violence, I'd be standing on the breadline right in back of J. Edgar Hoover." -- Lenny Bruce . "If I can't dance, I don't want to be part of your revolution." -- Emma Goldman . "It is not what we do, but also what we do not do, for which we are accountable." -- Moliere . "Religion is excellent stuff for keeping common people quiet." -- Napoleon . "Living is change; Growth is optional." -- Juan Wa Chang . "Religion is an insult to human dignity. With or without it, you'd have good people doing good things and evil people doing bad things, but for good people to do bad things, it takes religion." -- Steven Weinberg . "It is difficult to produce a television documentary that is both incisive and probing when every twelve minutes one is interrupted by twelve dancing rabbits singing about toilet paper." -- Rod Serling . "You have not converted a man because you have silenced him." -- John Morley . "We have a political system that awards office to the most ruthless, cunning, and selfish of mortals, then act surprised when those willing to do anything to win power are equally willing to do anything with it." -- Michael Rivero . "Use what talent you possess: the woods would be very silent if no birds sang except those that sang best." -- Henry Van Dyke . "The hardest years in life are those between ten and seventy." -- Helen Hayes, age 83 . "Everything has been figured out, except how to live." -- Jean Paul Sartre . "The vast majority of mankind is trapped within perceptual prisons." -- Shawn Mikula . "What difference does it make how much you have? What you do not have amounts to much more." -- Seneca . "America ... just a nation of two hundred million used car salesmen with all the money we need to buy guns and no qualms about killing anybody else in the world who tries to make us uncomfortable." -- Hunter S. Thompson . "The government of the United States does not, in its policies, express the decency of its people." -- Jerry Fresia . "Grasshopper, look beyond the game, as you look beneath the surface of the pool to see its depths." -- Master Po . "Write injuries in sand, kindnesses in marble." -- French proverb . "Kindness is a mark of faith, and whoever has not kindness has not faith." -- Prophet Muhammad . "It is not impossible to govern Italians. It is merely useless." -- Benito Mussolini . "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former." -- Albert Einstein . "Every revolution evaporates and leaves behind it only the slime of bureaucracy." -- Franz Kafka . "Always remember you are a totally unique individual; just like everyone else." -- Unknown . "Mythology is what we call someone else's religion." -- Joseph Campbell . "Christian is a VERB not a noun." -- Meria Heller . "Someday man will imprison the power of the sun, release atomic power, and harness the rise and fall of the tides. I am proud of the fact that I never invented weapons to kill." -- Thomas Edison . "Beware the man of one book." -- Saint Thomas Aquinas . "If we don't believe in freedom of expression for people we despise, we don't believe in it at all." -- Noam Chomsky . "The only thing we never get enough of is love; and the only thing we never give enough of is love." -- Henry Miller . "The United States is not nearly so concerned that its acts be kept secret from its intended victims as it is that the American people not know of them." -- Ramsey Clark . "Nothing exists except atoms and empty space; everything else is opinion." -- Democritus . "Cancel the kitchen scraps for lepers and orphans! No more merciful beheadings! And call off Christmas!" -- The Sheriff of Nottingham . "The god of the cannibals will be a cannibal, of the crusaders, a crusader, and of the merchants a merchant." -- Ralph Waldo Emerson . "The degree of one's emotion varies inversely with one's knowledge of the facts. The less you know, the hotter you get." -- Bertrand Russel . "Knowing others is intelligence; knowing yourself is true wisdom. Mastering others is strength; mastering yourself is true power." -- Lao Tzu . "The believer is happy; the doubter is wise." -- Hungarian Proverb . "I complained that I had no shoes until I met a man who had no feet." -- Persian proverb . "Rules of Optimization: Rule 1: Don't do it. Rule 2 (for experts only): Don't do it yet." -- M.A. Jackson . "More computing sins are committed in the name of efficiency (without necessarily achieving it) than for any other single reason - including blind stupidity." -- W.A. Wulf . "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil." -- Donald Knuth . "> > > Goodbye to all! Thanks for years of great fun and good > > > business! > > Suicide or MS C++? > Is there a difference? Suicide hurts only once..." -- Conversation on borland.public.delphi.non-technical . "May God grant me the grace to one day know the truth. Until then, may he spare me the company of those who've already found it." -- unknown . Fundamentalists: believe 2+2=5 because It Is Written. Somewhere. They have a lot of trouble on their tax returns. "Moderate" believers: live their lives on the basis that 2+2=4. But go regularly to church to be told that 2+2 once made 5, or will one day make 5, or in a very real and spiritual sense, should make 5. "Moderate" atheists: know that 2+2=4 but think it impolite to say so too loudly as people who think 2+2=5 might be offended. "Militant" atheists: "Oh for pity's sake. HERE. Two pebbles. Two more pebbles. FOUR pebbles. What is WRONG with you people?" . "If you try and take a cat apart to see how it works, the first thing you have in your hands is a non-working cat." -- Douglas Adams . "Finagle's Law of Dynamic Negatives: Anything that can go wrong, will -- at the worst possible moment." . "O'Toole's Corollary of Finagle's Law: The perversity of the Universe tends towards a maximum." . "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law." . "Many journalists have fallen for the conspiracy theory of government. I do assure you that they would produce more accurate work if they adhered to the cock-up theory." -- Sir Bernard Ingham . "Misunderstandings and neglect create more confusion in this world than trickery and malice. At any rate, the last two are certainly much less frequent." -- Goethe, "Werther" . "Genius may have its limitations, but stupidity is not thus handicapped." -- Elbert Hubbard . "Hanlon's Razor: Never attribute to malice that which can be adequately explained by stupidity." . "Asswhole = a complete ass" -- John McTaggart in bpot . "Free speech is the right to yell "Theater!" in a crowded fire..." -- Abbie Hoffman . "A bird in the hand makes it hard to blow your nose." . "Don't drive me crazy -- it's within walking distance." . "The early worm deserves the bird." . "We need either less corruption or more chance to participate in it." . "They laughed when I said I'd be a comedian. They aren't laughing now." . "There are many kinds of people in the world. Are you one of them?" . "We totally deny the allegations, and we are trying to identify the allegators." . "When you've seen one non-sequitur, the price of tea in China." . "Nine out of ten doctors agree that one out of ten doctors is an idiot." . "Save the whales! Collect the whole set!" . "TV is called a medium because it is neither rare nor well done." . "Gentleman: Knows how to play the bagpipes, but doesn't." . "Courage: Two cannibals having oral sex." . "Emulate your heros, but don't carry it too far. Especially if they are dead." . "Every journalist has a novel in him, which is an excellent place for it." . "Experience is what you get when you were expecting something else." . "Familiarity breeds children." . "If it wasn't for muscle spasms, I wouldn't get any exercise at all." . "I have seen the future and it is just like the present, only longer." -- Albran . "I could not possibly fail to disagree with you less." . "If all the world's managers were laid end to end, it would be an improvement." . "Let him who takes the Plunge remember to return it by Tuesday." . "Smoking is one of the leading causes of statistics." -- Fletcher Knebel . "My last cow just died, so I won't need your bull anymore." . "Radioactive cats have 18 half-lives." . "People who think they know everything greatly annoy those of us who do." . "If it wasn't for lawyers, we wouldn't need them." . "My opinions might have changed, but not the fact that I am right." . "Love: The warm feeling you get towards someone who meets your neurotic needs." . "Don't sweat the petty things, just pet the sweaty things." . "A closed mouth gathers no foot." . "Despite the high cost of living, it remains popular." . "A good pun is its own reword." . "All things are possible, except skiing through a revolving door." . "Democracy is where you can say what you think even if you don't think." . "Cole's Law: Thinly sliced cabbage." . "An effective way to deal with predators is to taste terrible." . "All rights left. All lefts reserved. All reserves removed. All removes right." . "You never really learn to swear until you learn to drive." . "Machine. Unexpectedly, I'd invented a time." -- Alan Moore . "If Tyranny and Oppression come to this land, it will be in the guise of fighting a foreign enemy." -- James Madison . "In Germany they first came for the Communists, and I didn't speak up because I wasn't a Communist. Then they came for the Jews, and I didn't speak up because I wasn't a Jew. Then they came for the trade unionists, and I didn't speak up because I wasn't a trade unionist. Then they came for the Catholics, and I didn't speak up because I was a Protestant. Then they came for me - and by that time no one was left to speak up." -- Pastor Martin Niemller . "The problem with people who have no vices is that generally you can be pretty sure they're going to have some pretty annoying virtues." -- Elizabeth Taylor . "Talk sense to a fool and he calls you foolish." -- Euripides . "Invading Iraq after 9/11 was like invading Mexico after Pearl Harbor." -- Richard Clarke . "I've never seen anyone change his mind because of the power of a superior argument or the acquisition of new facts. But I've seen plenty of people change behavior to avoid being mocked." -- Scott Adams . "The years of peak mental activity are undoubtedly between the ages of four and eighteen. At four we know all the questions, at eighteen all the answers." -- unknown . "I'm fed up to the ears with old men dreaming up wars for young men to die in." -- George McGovern . "The music business is a cruel and shallow money trench, a long plastic hallway where thieves and pimps run free, and good men die like dogs. There's also a negative side". -- Hunter S. Thompson . "What a cruel thing is war: to separate and destroy families and friends, and mar the purest joys and happiness God has granted us in this world; to fill our hearts with hatred instead of love for our neighbors, and to devastate the fair face of this beautiful world." -- Robert E. Lee, letter to his wife, 1864 . "Pardon him, Theodotus; he is a barbarian, and thinks that the customs of his tribe and island are the laws of nature." -- George Bernard Shaw . "The competent programmer is fully aware of the limited size of his own skull. He therefore approaches his task with full humility, and avoids clever tricks like the plague." -- Edsger W. Dijkstra, EWD340 . "Ignorance simplifies ANY problem." -- R. Lucke . "The chain reaction of evil -- wars producing more wars -- must be broken, or we shall be plunged into the dark abyss of annihilation." -- Martin Luther King, Jr. . "Before the war is ended, the war party assumes the divine right to denounce and silence all opposition to war as unpatriotic and cowardly." -- Senator Robert M. La Follette . "After every 'victory' you have more enemies." -- Jeanette Winterson . "Our children are not born to hate, they are raised to hate." -- Thomas della Peruta . "The shepherd always tries to persuade the sheep that their interests and his own are the same." -- Marie Beyle . "I hate those men who would send into war youth to fight and die for them; the pride and cowardice of those old men, making their wars that boys must die." -- Mary Roberts Rinehart . "Guard against the impostures of pretended patriotism." -- George Washington . "The de facto role of the US armed forces will be to keep the world safe for our economy and open to our cultural assault." -- Major Ralph Peters, US Military . "Patriotism means to stand by the country. It does not mean to stand by the president or any other public official..." -- Theodore Roosevelt . "The worst crimes were dared by a few, willed by more and tolerated by all." -- Tacitus . "Military glory -- that attractive rainbow, that rises in showers of blood -- that serpent's eye, that charms to destroy..." -- Abraham Lincoln . "Only a free and unrestrained press can effectively expose deception in government." -- Hugo Black, Supreme Court Justice . "War is fear cloaked in courage." -- General William Westmoreland . "Because I do it with one small ship, I am called a terrorist. You do it with a whole fleet and are called an emperor." -- A pirate, from St. Augustine's "City of God" . "What is morally wrong can never be advantageous, even when it enables you to make some gain that you believe to be to your advantage." -- Marcus Tullius Cicero . "Everybody's worried about stopping terrorism. Well, there's a really easy way: stop participating in it." -- Noam Chomsky . "It is far easier to make war than peace." -- Georges Clemenceau . "The belief in the possibility of a short decisive war appears to be one of the most ancient and dangerous of human illusions." -- Robert Lynd . "Of all the enemies to public liberty, war is perhaps the most to be dreaded because it comprises and develops the germ of every other." -- James Madison . "War doesn't make boys men, it makes men dead." -- Ken Gillespie . "Every nation has its war party. It is not the party of democracy. It is the party of autocracy. It seeks to dominate absolutely." -- Senator Robert M. La Follette . "It is the job of thinking people not to be on the side of the executioners." -- Albert Camus . "Paramount among the responsibilities of a free press is the duty to prevent any part of the government from deceiving the people." -- Hugo Black, Supreme Court Justice . "Liberty and democracy become unholy when their hands are dyed red with innocent blood." -- Mahatma Gandhi . "Peace is constructed, not fought for." -- Brent Davis . "In this war - as in others - I am less interested in honoring the dead than in preventing the dead." -- Butler Shaffer . "It is only those who have neither fired a shot nor heard the shrieks and groans of the wounded who cry aloud for blood... War is hell." -- General William Tecumseh Sherman . "It is dangerous to be right when the government is wrong." -- Voltaire . "The worst barbarity of war is that it forces men collectively to commit acts against which individually they would revolt with their whole being." -- Ellen Key . "Some men, in order to prevent the supposed intentions of their adversaries, have committed the most enormous cruelties." -- Clearchus, in Xenophon . "[War] might be avoidable were more emphasis placed on the training to social interest, less on the attainment of egotistical grandeur." -- Lydia Sicher . "Look at you in war. There has never been a just one, never an honorable one, on the part of the instigator of the war." -- Mark Twain . "Everything secret degenerates, even the administration of justice." -- Lord Acton . "Military justice is to justice what military music is to music." -- Groucho Marx . "Violence is the last refuge of the incompetent." -- Issac Asimov . "A state of war only serves as an excuse for domestic tyranny." -- Aleksandr Solzhenitsyn . "War is not the continuation of politics with different means, it is the greatest mass-crime perpetrated on the community of man." -- Alfred Adler . "We will not learn how to live together in peace by killing each other's children." -- Jimmy Carter . "The dangerous patriot ... is a defender of militarism and its ideals of war and glory." -- Colonel James A. Donovan, Marine Corps . "To jaw-jaw is always better than to war-war." -- Winston Churchill . "Man has no right to kill his brother. It is no excuse that he does so in uniform: he only adds the infamy of servitude to the crime of murder." -- Percy Bysshe Shelley . "Is it not a strange blindness on our part to teach publicly the techniques of warfare and to reward with medals those who prove to be the most adroit killers?" -- Marquis de Sade . "The cry has been that when war is declared, all opposition should be hushed. A sentiment more unworthy of a free country could hardly be propagated." -- William Ellery Channing . "Our government has kept us in a perpetual state of fear - kept us in a continuous stampede of patriotic fervor - with the cry of grave national emergency." -- General Douglas MacArthur . "The internet is not something you just dump something on. It's not a truck. It's a series of tubes!" -- Sen. Ted Stevens, chairman of the United States Senate Committee on Commerce, Science and Transportation . "Elegance is not a dispensable luxury but a factor that decides between success and failure." -- Edsger Dijkstra . "It's wonderful to be here in the great state of Chicago." -- Dan Quayle . "If Al Gore invented the Internet, I invented spell check." -- Dan Quayle . "My current job sucks so hard, black holes are going green with envy." -- Liz Kimber, in borland.*.*.*.delphi.win32 . "I was playing poker the other night... with Tarot cards. I got a full house and 4 people died." -- Steven Wright . "'Everything you say is boring and incomprehensible', she said, 'but that alone doesn't make it true.'" -- Franz Kafka . "Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration." -- Stan Kelly-Bootle . "If electricity comes from electrons, does that mean that morality comes from morons?" -- Unknown . "The company doesn't tell me what to say, and I don't tell them where to stick it." -- Unknown . "The only way to combat criminals is by not voting for them." -- Dayton Allen . "A camel is a horse designed by a committee" -- Unknown . "I'm not under the alkafluence of inkahol that some thinkle peep I am. It's just the drunker I sit here the longer I get." -- Unknown . "Sex is like air. It's only a big deal if you can't get any." -- Unknown . AMAZING BUT TRUE ... There is so much sand in Northern Africa that if it were spread out it would completely cover the Sahara Desert. . "Support your local Search and Rescue unit -- get lost." -- Unknown . "A great many people think they are thinking when they are merely rearranging their prejudices." -- William James . "The whole problem with the world is that fools and fanatics are always so certain of themselves, but wiser people so full of doubts." -- Bertrand Russell . "The bureaucracy is expanding to meet the needs of an expanding bureaucracy." -- Unknown . "I took a course in speed reading and was able to read War and Peace in twenty minutes. It's about Russia." -- Woody Allen . "Jesus may love you, but I think you're garbage wrapped in skin." -- Michael O'Donohugh . "Ah, you know the type. They like to blame it all on the Jews or the Blacks, 'cause if they couldn't, they'd have to wake up to the fact that life's one big, scary, glorious, complex and ultimately unfathomable crapshoot -- and the only reason THEY can't seem to keep up is they're a bunch of misfits and losers." -- An analysis of Neo-Nazis, from "The Badger" comic . "Subtlety is the art of saying what you think and getting out of the way before it is understood." -- Unknown . "Tact is the ability to tell a man he has an open mind when he has a hole in his head." -- Unknown . "The study of non-linear physics is like the study of non-elephant biology." -- Unknown . "I do not have a body, I am a body." -- Unknown . "If people are good only because they fear punishment, and hope for reward, then we are a sorry lot indeed." -- Albert Einstein . "A radioactive cat has eighteen half-lives." -- Unknown . "Clothes make the man. Naked people have little or no influence on society." -- Mark Twain . "I doubt, therefore I might be." -- Unknown . "If you believe in telekinesis, raise my hand." -- Unknown . "Light thinks it travels faster than anything but it is wrong. No matter how fast light travels, it finds the darkness has always got there first, and is waiting for it." -- Terry Pratchett (Reaper Man) . "If you take something apart and put it back together again enough times, you will eventually have enough parts left over to build a second one." -- The law of inanimate reproduction . "I have spoken many a word, therefore, it is fact." -- Eric the Verbose . "Puritanism: The haunting fear that someone, somewhere, may be happy." -- H. L. Mencken . "Roses are #FF0000 Violets are #0000FF All my base are belong to you!" -- Geek Valentine T-shirt at ThinkGeek . "As nightfall does not come at once, neither does oppression. In both instances, there is a twilight when everything remains unchanged. And it is in such twilight that we all must be most aware of change in the air - however slight - lest we become unwitting victims of the darkness." -- Supreme Court Justice William O. Douglas . "The surest way to corrupt a youth is to instruct him to hold in higher esteem those who think alike than those who think differently" -- Friedrich Nietzsche . "Conservatives are not necessarily stupid, but most stupid people are conservatives" -- John Stuart Mill . "Throughout American history, the government has said we're in an unprecedented crisis and that we must live without civil liberties until the crisis is over. It's a hoax." -- Yale Kamisar, 1990. . "Quoting Coulter is kind of like quoting Joe McCarthy; no doubt it does well when you're pandering to a group of like-minded hate mongerers, but it earns you a well-deserved reputation as a vicious, mean-spirited airhead and intellectual lightweight in more analytical and dispassionate circles." -- Mark Vaughan in borland.public.off-topic . "Under conditions of competition, standards are set by the morally least reputable agent." -- philosopher/economist John Stuart Mill . "A terrorist is someone who has a bomb, but doesn't have an air force." -- William Blum . "You cannot depend on your eyes when your imagination is out of focus." -- Mark Twain . "Once you've written TBicycle, you never forget how." -- Oliver Townshend in b.p.d.n-t. . "When the rich think about the poor, they have poor ideas." -- Evita Peron . "Any fool can criticize, condemn, and complain - and most fools do." -- Dale Carnegie . "Real punks help little old ladies across the street because it shocks more people than if they spit on the sidewalk." -- Unknown . "If you can read this you're not aiming in the right direction." -- Toilet-ceiling graffiti . "Getting an education was a bit like a communicable sexual disease. It made you unsuitable for a lot of jobs and then you had the urge to pass it on." -- Terry Pratchett, Hogfather . "To understand a man you should walk a mile in his shoes. If what he says still bothers you that's ok because you'll be a mile away from him and you'll have his shoes." -- Unknown . "I'm trying to see things from your point of view but I can't get my head that far up my ass." --- Unknown . "Early to rise, Early to bed, Makes a man healthy but socially dead." -- The Warner Brothers (Animaniacs) . "I hope life isn't a big joke ... because I don't get it." -- Unknown . "I'd stop eating chocolate, but I'm no quitter." -- Unknown . "I'm so poor I can't even pay attention." -- Unknown . "It's dangerous to underestimate the intelligence of a customer who grew a business that's successful enough to require a large and complex set of software" -- Grady Booch . "A physicist is an atom's way of knowing about atoms." -- George Wald . "It's the liberal bias. The press is liberally biased to the right." -- Ken de Camargo . "83.7% of all statistics are made up" - Stephen Wright . "That is the saving grace of humor, if you fail no one is laughing at you." -- A. Whitney Brown . "Humor is the only test of gravity, and gravity of humor; for a subject which will not bear raillery is suspicious, and a jest which will not bear serious examination is false wit." -- Aristotle (384 BC-322 BC) . "All I need to make a comedy is a park, a policeman and a pretty girl." -- Charlie Chaplin (1889-1977), in My Autobiography (1964) . "Total absence of humor renders life impossible." -- Colette (1873-1954), Chance Acquaintances, 1952 . "Humor is always based on a modicum of truth. Have you ever heard a joke about a father-in-law?" -- Dick Clark . "A sense of humor is part of the art of leadership, of getting along with people, of getting things done." -- Dwight D. Eisenhower (1890-1969) . "Analyzing humor is like dissecting a frog. Few people are interested and the frog dies of it." -- E. B. White (1899-1985) . "Humor is by far the most significant activity of the human brain." -- Edward De Bono . "The world is a tragedy to those who feel, but a comedy to those who think." -- Horace Walpole (1717-1797) . "If there's one thing I know it's God does love a good joke." -- Hugh Elliott, Standing Room Only weblog, 05-01-04 . "The only rules comedy can tolerate are those of taste, and the only limitations those of libel." -- James Thurber (1894-1961) . "The wit makes fun of other persons; the satirist makes fun of the world; the humorist makes fun of himself." -- James Thurber (1894-1961), in Edward R. Murrow television interview . "Where humor is concerned there are no standards - no one can say what is good or bad, although you can be sure that everyone will." -- John Kenneth Galbraith (1908-2006) . "One doesn't have a sense of humor. It has you." -- Larry Gelbart . "Humor is the great thing, the saving thing. The minute it crops up, all our irritations and resentments slip away and a sunny spirit takes their place." -- Mark Twain (1835-1910) . "Humor is a rubber sword - it allows you to make a point without drawing blood." -- Mary Hirsch . "Humor is just another defense against the universe." -- Mel Brooks (1926- ) . "Comedy is simply a funny way of being serious." -- Peter Ustinov (1921-2004) . "Comedy is nothing more than tragedy deferred." -- Pico Iyer, Time . "Wit makes its own welcome and levels all distinctions." -- Ralph Waldo Emerson (1803-1882) . "Defining and analyzing humor is a pastime of humorless people." -- Robert Benchley (1889 - 1945) . "Humor is also a way of saying something serious." -- T. S. Eliot (1888 - 1965) . "There's no trick to being a humorist when you have the whole government working for you." -- Will Rogers (1879-1935) . "Politicians are like diapers. They should be changed often, and for the same reason." -- Anonymous . "Small minds run in the same gutter." -- Alfred E. Neuman . "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning." -- Rich Cook. . "Computer dating is fine, if you're a computer." -- Rita May Brown. . "All sorts of computer errors are now turning up. You'd be surprised to know the number of doctors who claim they are treating pregnant men." -- Isaac Asimov. . "To err is human, but to really foul things up you need a computer." -- Paul Ehrlich. . "The trouble with the Internet is that it's replacing masturbation as a leisure activity." -- Patrick Murray. . "Beware of computer programmers that carry screwdrivers." -- Leonard Brandwein. . "UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie. . "The perfect computer has been developed. You just feed in your problems and they never come out again." -- Al Goodman. . "The most overlooked advantage of owning a computer is that if they foul up there's no law against whacking them around a bit." -- Eric Porterfield. . "Computers make it easier to do a lot of things, but most of the things they make it easier to do don't need to be done." -- Andy Rooney. . "Computer Science is no more about computers than astronomy is about telescopes" -- Edsger W. Dijkstra. . "The great thing about a computer notebook is that no matter how much you stuff into it, it doesn't get bigger or heavier." -- Bill Gates. . "Not even computers will replace committees, because committees buy computers." -- Unknown . "I do not fear computers. I fear the lack of them." -- Isaac Asimov. . "Computers can figure out all kinds of problems, except the things in the world that just don't add up." -- James Magary. . "In all large corporations, there is a pervasive fear that someone, somewhere is having fun with a computer on company time. Networks help alleviate that fear." -- John C. Dvorak. . "Imagine if every Thursday your shoes exploded if you tied them the usual way. This happens to us all the time with computers, and nobody thinks of complaining." -- Jeff Raskin. . "If computers get too powerful, we can organize them into a committee -- that will do them in." -- Bradley's Bromide. . "The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents." -- Nathaniel Borenstein. . "To err is human -- and to blame it on a computer is even more so." -- Robert Orben. . "If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside." -- Robert X. Cringely. . "If you put tomfoolery into a computer, nothing comes out of it but tomfoolery. But this tomfoolery, having passed through a very expensive machine, is somehow enobled and no-one dares criticize it." -- Pierre Gallois. . "Descended from the apes? Let us hope that it is not true. But if it is, let us pray that it may not become generally known." -- FA Montagu. . "I am an expert of electricity. My father occupied the chair of applied electricity at the state prison." -- WC Fields. . "My advice to you is get married: if you find a good wife you'll be happy; if not, you'll become a philosopher." -- Socrates. . "An intellectual is someone who has found something more interesting than sex." -- Edgar Wallace. . "You ask me if I keep a notebook to record my great ideas. I've only ever had one." -- Albert Einstein. . "Only one man ever understood me, and he didn't understand me." -- GW Hegel. . "Chaos Theory is a new theory invented by scientists panicked by the thought that the public were beginning to understand the old ones." -- Mike Barfield. . "The secret of creativity is knowing how to hide your sources." -- Albert Einstein. . "Louis Pasteur's theory of germs is ridiculous fiction." -- Pierre Pachet, Professor of Physiology at Toulouse, 1872 . "The wireless music box has no imaginable commercial value. Who would pay for a message sent to nobody in particular?" -- David Sarnoff's associates in response to his urging for investment in the radio in the 1920s. . "Researchers have discovered that chocolate produces some of the same reactions in the brain as marijuana. The researchers also discovered other similarities between the two but can't remember what they are." -- Matt Lauer on NBC's Today Show. . "If it weren't for electricity we'd all be watching television by candlelight." -- George Gobel. . "USA Today has come out with a new survey: Apparently three out of four people make up 75 percent of the population." -- David Letterman. . "In ancient times they had no statistics so they had to fall back on lies." -- Stephen Leacock. . "Ketchup left overnight on dinner plates has a longer half-life than radioactive waste." -- Wes Smith. . "Biologically speaking, if something bites you it's more likely to be female." -- Desmond Morris. . "When I die I'm going to leave my body to science fiction." -- Steven Wright. . "Inanimate objects can be classified scientifically into three major categories; those that don't work, those that break down and those that get lost." -- Russell Baker. . "Heaven is an American salary, a Chinese cook, an English house, and a Japanese wife. Hell is defined as having a Chinese salary, an English cook, a Japanese house, and an American wife." -- James H. Kabbler III. . "When his life was ruined, his family killed, his farm destroyed, Job knelt down on the ground and yelled up to the heavens, 'Why god? Why me?' and the thundering voice of God answered, 'There's just something about you that pisses me off.'" -- Stephen King. . "How can I believe in God when just last week I got my tongue caught in the roller of an electric typewriter?" -- Woody Allen. . "If there is no God, who pops up the next Kleenex?" -- Art Hoppe. . "My mother said to me, "If you are a soldier, you will become a general. If you are a monk, you will become the Pope." Instead, I was a painter, and became Picasso." -- Pablo Picasso. . "I was thrown out of college for cheating on the metaphysics exam; I looked into the soul of the boy next to me." -- Woody Allen. . "A good sermon should be like a woman's skirt: short enough to arouse interest but long enough to cover the essentials." -- Ronald Knox. . "Not only is there no God, but you try getting a plumber at weekends." -- Woody Allen. . "As God once said, and I think rightly..." -- Margaret Thatcher. . "Hearing nuns' confessions is like being stoned to death with popcorn." -- Fulton Sheen. . "If there is no Hell, a good many preachers are obtaining money under false pretences." -- William Sunday. . "I admire the Pope. I have a lot of respect for anyone who can tour without an album." -- Rita Rudner. . "Thank God I'm an atheist." -- Luis Bunuel. . "The Bible was a consolation to a fellow alone in the old cell. The lovely thin paper with a bit of matress stuffing in it, if you could get a match, was as good a smoke as I ever tasted." -- Brendan Behan. . "In the begining there was nothing and God said 'Let there be light', and there was still nothing but everybody could see it." -- Dave Thomas. . "Sailors ought never to go to church. They ought to go to hell, where it is much more comfortable." -- HG Wells. . "If absolute power corrupts absolutely, where does that leave God?" -- George Deacon. . "I don't believe in the after life, although I am bringing a change of underwear." -- Woody Allen. . "When I was a kid I used to pray every night for a new bicycle. Then I realised that the Lord doesn't work that way so I stole one and asked Him to forgive me." -- Emo Philips. . "When I told the people of Northern Ireland that I was an atheist, a woman in the audience stood up and said, 'Yes, but is it the God of the Catholics or the God of the Protestants in whom you don't believe?" -- Quentin Crisp. . "When I am dead, I hope it may be said: 'His sins were scarlet but his books were read." -- Hillaire Belloc. . "Sometimes I lie awake at night, and I ask, 'Where have I gone wrong?' Then a voice says to me, 'This is going to take more than one night.'" -- Charlie Brown. . "Maybe there is no actual place called hell. Maybe hell is just having to listen to our grandparents breathe through their noses when they're eating sandwiches." -- Jim Carrey. . "When did I realize I was God? Well, I was praying and I suddenly realized I was talking to myself." -- Peter O'Toole. . "They say such nice things about people at their funerals that it makes me sad that I'm going to miss mine by just a few days." -- Garrison Kielor. . "It was God who made me so beautiful. If I weren't, then I'd be a teacher." -- Linda Evangelista. . "The secret of a good sermon is to have a good beginning and a good ending, then having the two as close together as possible." -- George Burns. . "I would have made a good Pope." -- Richard Nixon. . "I was raised in the Jewish tradition, taught never to marry a Gentile woman, shave on a Saturday night and, most especially, never to shave a Gentile woman on a Saturday night." -- Woody Allen. . "God is love, but get it in writing." -- Gypsy Rose Lee. . "I don't pray because I don't want to bore God." -- Orson Welles. . "As the poet said, 'Only God can make a tree,' probably because it's so hard to figure out how to get the bark on." -- Woody Allen. . "I have four children which is not bad considering I'm not a Catholic." -- Peter Ustinov. . "I hear Glenn Hoddle has found God. That must have been one hell of a pass." -- Bob Davies. . "And God said, 'Let there be light' and there was light, but the Electricity Board said He would have to wait until Thursday to be connected." -- Spike Milligan. . "No mention of God. They keep Him up their sleeves for as long as they can, vicars do. They know it puts people off." -- Alan Bennett. . "I'm Jewish. I don't work out. If God had wanted us to bend over, He would have put diamonds on the floor." -- Joan Rivers. . "There is a charm about the forbidden that makes it unspeakably diserable." -- Mark Twain. . "Always go to other people's funerals, otherwise they won't come to yours." -- Yogi Berra. . "Death is a low chemical trick played on everybody except sequoia trees." -- JJ Furnas. . "Dying is a very dull, dreary affair. And my advice to you is to have nothing whatever to do with it." -- W. Somerset Maugham. . "Early to rise and early to bed. Makes a male healthy, wealthy and dead." -- James Thurber. . "Everybody wants to go to heaven, but nobody wants to die." -- Joe Louis. . "He had decided to live forever or die in the attempt." -- Joseph Heller. . "I am ready to meet my Maker. Whether my Maker is prepared for the great ordeal of meeting me is another matter." -- Winston Churchill. . "Death is one of the few things that can be done as easily lying down. The difference between sex and death is that with death you can do it alone and no one is going to make fun of you." -- Woody Allen. . "All our knowledge merely helps us to die a more painful death than animals that know nothing." -- Maurice Maeterlinck. . "A single death is a tragedy, a million deaths is a statistic." -- Joseph Stalin. . "Eternal nothingness is fine if you happen to be dressed for it." -- Woody Allen. . "Everything is drive-through. In California, they even have a burial service called Jump-In-The-Box." -- Wil Shriner. . "In this world, nothing is certain but death and taxes." -- Benjamin Franklin. . "The fear of death is the most unjustified of all fears, for there's no risk of accident for someone who's dead." -- Albert Einstein. . "I wouldn't mind dying - it's the business of having to stay dead that scares the shit out of me." -- R. Geis. . "It's impossible to experience one's death objectively and still carry a tune." -- Woody Allen. . "For if he like a madman lived, At least he like a wise one died." -- Cervantes. . "Death does not concern us, because as long as we exist, death is not here. And when it does come, we no longer exist." -- Epicurus. . "Am I lightheaded because I'm not dead or because I'm still alive?" -- Heidi Sandige. . "A low voter turnout is an indication of fewer people going to the polls." -- George W. Bush . "I was raised in the West. The west of Texas. It's pretty close to California. In more ways than Washington, D.C., is close to California." -- George W. Bush . "Rarely is the question asked: Is our children learning?" -- George W. Bush . "What I am against is quotas. I am against hard quotas, quotas they basically delineate based upon whatever. However they delineate, quotas, I think, vulcanize society. So I don't know how that fits into what everybody else is saying, their relative positions, but that's my position." -- George W. Bush . "It's clearly a budget. It's got a lot of numbers in it." -- George W. Bush . "One word sums up probably the responsibility of any Governor, and that one word is 'to be prepared'." -- George W. Bush . "If you're sick and tired of the politics of cynicism and polls and principles, come and join this campaign." -- George W. Bush . "We must all hear the universal call to like your neighbor like you like to be liked yourself." -- George W. Bush . "The most important job is not to be Governor, or First Lady in my case." -- George W. Bush . "If people can judge me on the company I keep, they would judge me with keeping really good company with Laura." -- George W. Bush . "You'll notice that Nancy Reagan never drinks water when Ronnie speaks." -- Robin Williams. . "I'm not going to have some reporters pawing through our papers. We are the president." -- Hillary Clinton. . "A committee is a group of people who individually can do nothing but together can decide that nothing can be done." -- Fred Allen. . "Richard Nixon is a no good, lying bastard. He can lie out of both sides of his mouth at the same time, and if he ever caught himself telling the truth, he'd lie just to keep his hand in." -- Harry S. Truman. . "Behind every successful man is a woman, behind her is his wife." -- Groucho Marx . "Marry me and I'll never look at another horse!" -- Groucho Marx . "A woman is an occasional pleasure but a cigar is always a smoke." -- Groucho Marx . "Outside of a dog, a book is man's best friend. Inside of a dog, it's too dark to read." -- Groucho Marx . "Why was I with her? She reminds me of you. In fact, she reminds me more of you than you do!" -- Groucho Marx . "Women should be obscene and not heard." -- Groucho Marx . "Either he's dead or my watch has stopped." -- Groucho Marx . "I don't care to belong to a club that accepts people like me as members." -- Groucho Marx . "I must confess, I was born at a very early age." -- Groucho Marx . "I have had a perfectly wonderful evening, but this wasn't it." -- Groucho Marx . "Room service? Send up a larger room." -- Groucho Marx . "I never forget a face, but in your case I'll be glad to make an exception." -- Groucho Marx . "A man's only as old as the woman he feels." -- Groucho Marx . "One morning I shot a bear in my pajamas. How it got into my pajamas I'll never know." -- Groucho Marx . "If I held you any closer I would be on the other side of you." -- Groucho Marx . "I was married by a judge. I should have asked for a jury." -- Groucho Marx . "Who are you going to believe, me or your own eyes?" -- Groucho Marx . "Quote me as saying I was mis-quoted." -- Groucho Marx . "A child of five could understand this. Fetch me a child of five." -- Groucho Marx . "Those are my principles. If you don't like them I have others." -- Groucho Marx . "Police arrested two kids yesterday, one was drinking battery acid, the other was eating fireworks. They charged one and let the other one off." -- Tommy Cooper . "A blind bloke walks into a shop with a guide dog. He picks the Dog up and starts swinging it around his head. Alarmed, a shop assistant calls out: 'Can I help, sir?' 'No thanks,' says the blind bloke. 'Just looking.'" -- Tommy Cooper . "It's strange, isn't it. You stand in the middle of a library and go 'aaaaagghhhh' and everyone just stares at you. But you do the same thing on an aeroplane, and everyone joins in." -- Tommy Cooper . "So I was getting into my car, and this bloke says to me "Can you give me a lift?" I said "Sure, you look great, the world's your oyster, go for it.'" -- Tommy Cooper . "You know, somebody actually complimented me on my driving today. They left a little note on the windscreen, it said 'Parking Fine.'" -- Tommy Cooper . "So I went to the dentist. He said "Say Aaah." I said "Why?" He said "My dog's died.'" -- Tommy Cooper . "So I rang up a local building firm, I said 'I want a skip outside my house.' He said 'I'm not stopping you.'" -- Tommy Cooper . "So I was in my car, and I was driving along, and my boss rang up and he said 'You've been promoted'. And I swerved. And then he rang up a second time and said 'You've been promoted again'. And I swerved again. He rang up a third time and said 'You're managing director.' And I went into a tree. And a policeman came up and said 'What happened to you?' And I Said 'I careered off the road.'" -- Tommy Cooper . "Don't knock masturbation, it's sex with someone I love ." -- Woody Allen, From 'Annie Hall' 1977. . "A fast word about oral contraception. I asked a girl to go to bed with me, she said 'no'." -- Woody Allen . "It's not that I'm afraid to die, I just don't want to be there when it happens." -- Woody Allen, From 'Death' 1975. . "There are worse things in life than death. Have you ever spent an evening with an insurance salesman?" -- Woody Allen . "Money is better than poverty, if only for financial reasons." -- Woody Allen, From 'Without Feathers' 1976. . "I failed to make the chess team because of my height." -- Woody Allen . "I believe that sex is a beautiful thing between two people. Between five, it's fantastic." -- Woody Allen . "Love is the answer - but while you're waiting for the answer sex raises some pretty good questions." -- Woody Allen . "I'm very proud of my gold pocket watch. My grandfather, on his deathbed, sold me this watch." -- Woody Allen . "I'm always amazed to hear of air crash victims so badly mutilated that they have to be identified by their dental records. What I can't understand is, if they don't know who you are, how do they know who your dentist is?" -- Paul Merton. . "The Stones, I love the Stones. I watch them whenever I can. Fred, Barney..." -- Steven Wright. . "First you forget names, then you forget faces. Next you forget to pull your zipper up and finally, you forget to pull it down." -- George Burns. . "The pen is mightier than the sword, and considerably easier to write with." -- Marty Feldman. . "We had gay burglars the other night. They broke in and rearranged the furniture." -- Robin Williams. . "If toast always lands butter-side down, and cats always land on their feet, what happens if you strap toast on the back of a cat and drop it?" -- Steven Wright. . "I'm desperately trying to figure out why kamikaze pilots wore helmets." -- Dave Edison. . "Did you ever walk in a room and forget why you walked in? I think that's how dogs spend their lives." -- Sue Murphy. . "A sure cure for seasickness is to sit under a tree." -- Spike Milligan. . "Why don't they make the whole plane out of that black box stuff." -- Steven Wright. . "I once heard two ladies going on and on about the pains of childbirth and how men don't seem to know what real pain is. I asked if either of them ever got themselves caught in a zipper." -- Emo Philips. . "My neighbour asked if he could use my lawnmower and I told him of course he could, so long as he didn't take it out of my garden." -- Eric Morecambe. . "You're about as useful as a one-legged man at an arse kicking contest." -- Rowan Atkinson. . "He managed to stupid himself right into the White House." -- Charles Appel about George W. Bush . "Reality is that which, when you stop believing in it, doesn't go away." -- Philip K. Dick. . "Believe those who are seeking the truth. Doubt those who find it." -- Andr Gide . "Just because bulldozers are used to build highways doesn't mean bulldozers are the best way to travel on a highway." -- Danny Thorpe in borland.public.delphi.non-technical . "Write a wise word and your name will live forever." -- Anonymous . "To the Honourable Member opposite I say, when he goes home tonight, may his mother run out from under the porch and bark at him" -- John G. Diefenbaker . "Sterling's Corollary to Clarke's Law: Any sufficiently advanced garbage is indistinguishable from magic." . "Minsky's Second Law: Don't just do something. Stand there." -- Marvin Minsky . "Devlin's First Law - Buyer beware: in the hands of a charlatan, mathematics can be used to make a vacuous argument look impressive. Devlin's Second Law - So can PowerPoint." -- Keith Devlin . "Gigerenzer's Law of Indispensable Ignorance: The world cannot function without partially ignorant people." -- Gerd Gigerenzer . "Lohr's Law: The future is merely the past with a twist - and better tools." -- Steve Lohr . "Raymond's Law of Software: Given a sufficiently large number of eyeballs, all bugs are shallow." -- Eric S. Raymond . "Barabsi's Law of Programming: Program development ends when the program does what you expect it to do - whether it is correct or not." -- Albert-Lszl Barabsi . "Anyone who starts a sentence, 'With all due respect ...' is about to insult you." -- unknown . "The only one listening to both sides of an argument is the neighbor in the next apartment" -- unknown . "Cholesterol is your natural defence against excessive circulation of blood, which can carry venoms, poisons and other toxins around your body." -- Michael Warner, in bpot . "Mit der Dummheit kmpfen Gtter selbst vergebens" "Against stupidity the (very) gods themselves contend in vain" -- Friedrich von Schiller . "There Ought to be Limits to Freedom!" -- George W. Bush, commenting on gwbush.com (05/21/1999) . "We are Dyslexia of Borg. Fusistance is retile. Your ass will be laminated." -- unknown . ICTOARTCYAODHTIOTSSIWRTNCAHICGAWI, Acronym: "I Can't Think Of Anything Reasonable To Counter Your Argument Or Don't Have The Least Inkling Of The Subject So I Will Resort To Name Calling And Hope I Can Get Away With It." -- Ken de Camargo, borland.public.off-topic . "I don't approve of political jokes... I've seen too many of them get elected." -- unknown . "I plan to live forever. So far so good." -- Rob C. Claffie in borland.public.off-topic . "Millions long for immortality who do not know what to do with themselves on a rainy Sunday afternoon." -- Susan Ertz . "If the United Nations once admits that international disputes can be settled by using force, then we will have destroyed the foundation of the organization and our best hope of establishing a world order." -- Dwight D. Eisenhower . "When you hear hoofbeats, think of horses, not zebras." -- Old saying . "Sex is like a Chinese dinner. It isn't over until everyone gets their cookies." -- from the movie "Outside Providence" . "A picture is worth a thousand words (which is why it takes a thousand times longer to load...)" -- Eric Tilton, Composing Good HTML . "1001 words say more than one picture" -- Chinese proverb . "There is no idea so simple and powerful that you can't get zillions of people to misunderstand it." -- Alan Kay . "The purpose of computing is not numbers but insight." -- Richard Hamming . "They have computers, and they may have other weapons of mass destruction." -- Janet Reno, Us Attorney General, 02-27-98 . "Absence of evidence is not evidence of absence." -- Source Unknown . "Imagine if every Thursday your shoes exploded if you tied them the usual way. This happens to us all the time with computers, and nobody thinks of complaining." -- Jeff Raskin . "Programming is like sex: one mistake and you have to support it for the rest of your life." -- Michael Sinz . "Linux is like living in a teepee. No Windows, no Gates, Apache in house." -- Usenet signature . "DOS Computers manufactured by companies such as IBM, Compaq, Tandy, and millions of others are by far the most popular, with about 70 million machines in use worldwide. Macintosh fans, on the other hand, may note that cockroaches are far more numerous than humans, and that numbers alone do not denote a higher life form." -- New York Times, November 26, 1991 . "Politics is the art of looking for trouble, finding it everywhere, diagnosing it incorrectly, and applying the wrong remedies." -- Groucho Marx . "Momma always said life was like a box of chocolates. You never know what you're gonna get." -- Forest Gump . "I invented the term Object-Oriented, and I can tell you I did not have C++ in mind." -- Alan Kay . "Reality is merely an illusion, albeit a very persistent one." -- Albert Einstein . "Never test for an error condition you don't know how to handle." -- Steinbach's Guideline for Systems Programmers. . "Science is what people understand well enough to explain to a computer. All else is art." -- Donald Knuth . "Beware of bugs in the above code; I have only proven it correct, not tried it." -- Donald E. Knuth. . "Object-oriented programming is an exceptionally bad idea which could only have originated in California." -- Edsger Dijkstra . "Object-oriented programming is a style of programming designed to teach students about stacks." -- Edsger Dijkstra . "Programming is one of the most difficult branches of applied mathematics; the poorer mathematicians had better remain pure mathematicians." -- Edsger Dijkstra . "The use of anthropomorphic terminology when dealing with computing systems is a symptom of professional immaturity." -- Edsger Dijkstra . "About the use of language: it is impossible to sharpen a pencil with a blunt axe. It is equally vain to try to do it with ten blunt axes instead." -- Edsger W. Dijkstra . "If FORTRAN has been called an infantile disorder, then PL/I must be classified as a fatal disease." -- Edsger Dijkstra . "Testing proves the presence, not the absence, of bugs." -- Edsger Dijkstra . "The question of whether a computer can think is no more interesting than the question of whether a submarine can swim." -- Edsger Dijkstra . "It is practically imposible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration." -- Edsger Dijkstra . "The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offense." -- Edsger Dijkstra . Bible, Dijkstra 5:15 "and the clueless shall spend their time reinventing the wheel while the elite merely use the Wordstar key mappings" -- Ed Mulroy . "Why did God create dentists? -- In his infinite love, he thought it would be charitable to His creatures to let them see what Hell is like, during their lives." -- PhR . Customer: "I'm running Windows '95." Tech: "Yes." Customer: "My computer isn't working now." Tech: "Yes, you said that." . "If we knew what it was we were doing, it would not be called research, would it?" -- Albert Einstein . "A [pseudo]random number generator is much like sex: when it's good it's wonderful, and when it's bad it's still pretty good." -- G. Marsaglia . "A model is done when nothing else can be taken out." -- Dyson . "Real life is that big, high-res, high-color screen saver behind all the windows." -- anonymous . "We've all heard that a million monkeys banging on a million typewriters will eventually reproduce the entire works of Shakespeare. Now, thanks to the Internet, we know this is not true." -- Robert Wilensky . "Not everything that can be counted counts, and not everything that counts can be counted." -- Albert Einstein . "Physics is not a religion. If it were, we'd have a much easier time raising money." -- Leon Lenderman . "Java, the best argument for Smalltalk since C++." -- unknown . "Computers are useless; they can only give you answers." -- Pablo Picasso . "Life would be so much easier if we could just see the source code." -- unknown . "Deliver yesterday, code today, think tomorrow." -- unknown . "Having the source code is the difference between buying a house and renting an apartment." -- Behlendorf . "C++: an octopus made by nailing extra legs onto a dog" -- unknown . "C combines all the power of assembly language with the ease of use of assembly language" -- trad . "God is real unless declared integer" -- david . "Java: the elegant simplicity of C++ and the blazing speed of Smalltalk." -- Roland Turner . "Quotation confesses inferiority." -- Ralph Waldo Emerson . "A mind all logic is like a knife all blade. It makes the hand bleed that uses it." -- Rabindranath Tagore . "Sometimes, the best answer is a more interesting question" -- Terry Pratchett . "Before C++ we had to code all of our bugs by hand; now we inherit them." -- unknown . "Incrementing C by 1 is not enough to make a good object-oriented language." -- M. Sakkinen . "Science is like sex: sometimes something useful comes out, but that is not the reason we are doing it" -- Richard Feynman . "Man is the best computer we can put aboard a spacecraft... and the only one that can be mass produced with unskilled labor." -- Wernher von Braun . "Computer /nm./: a device designed to speed and automate errors." -- From the Jargon File. . "RAM /abr./: Rarely Adequate Memory." -- From the Jargon File . "A printer consists of three main parts: the case, the jammed paper tray and the blinking red light" -- unknown . "Real Programmers always confuse Christmas and Halloween because Oct31 == Dec25 !" -- Andrew Rutherford . "2 + 2 = 5, for extremely large values of 2." -- unknown . "ASCII stupid question, get a stupid ANSI !" -- unknown . "Multitasking /adj./ 3 PCs and a chair with wheels !" -- unknown . "Pascal /n./ A programming language named after a man who would turn over in his grave if he knew about it." -- From the Jargon File . "If it wasn't for C, we'd be writing programs in BASI, PASAL, and OBOL." -- unknown . "I have yet to meet a C compiler that is more friendly and easier to use than eating soup with a knife." -- unknown . "... one of the main causes of the fall of the Roman Empire was that, lacking zero, they had no way to indicate successful termination of their C programs." -- Robert Firth . "Do you program in Assembly ?" she asked. "NOP," he said. . "Smith & Wesson - the original point and click interface." . "We should leave our minds open, but not so open that our brains fall out." -- Alan Ross Anderson . "The difference between what the most and the least learned people know is inexpressibly trivial in relation to that which is unknown." -- Albert Einstein . "Statistics is like a bikini. What they reveal is suggestive. What they conceal is vital." -- Arthur Koestler . "A hen is only an egg's way of making another egg." -- Samuel Butler . "It is a miracle that curiosity survives formal education." -- Albert Einstein . "Gravity cannot be held responsible for people falling in love." -- Albert Einstein . "Common sense is the collection of prejudices acquired by age eighteen." -- Albert Einstein . "The secret to creativity is knowing how to hide your sources." -- Albert Einstein . "Intellectuals solve problems; geniuses prevent them." -- Albert Einstein . "Put your hand on a hot stove for a minute, and it seems like an hour. Sit with a pretty girl for an hour, and it seems like a minute. THAT'S relativity." -- Albert Einstein? . "To iterate is human, to recurse divine." -- L. Peter Deutsch . "Premature optimization is the root of all evil." -- Donald Knuth . "UNIX is simple. It just takes a genius to understand its simplicity."-- Dennis Ritchie . "If you give a man a fish, he will eat for today. If you teach him to fish, he'll understand why some people think golf is exciting." -- P.G. Wodehouse . "I'd give my right arm to be ambidextrous." -- Brian Kernighan . "I know that there are people in this world who do not love their fellow human beings, and I hate people like that." -- Tom Lehrer . "Yes, I'm fat, but you're ugly and I can go on a diet." -- bumper sticker . "I want to die in my sleep like my grandfather... not screaming and yelling like the passengers in his car..." -- bumper sticker . "Time is the best teacher; Unfortunately it kills all its students!" -- bumper sticker . "Diplomacy is the art of saying 'Nice doggie!'... 'til you can find a rock." -- bumper sticker . "Ever stop to think, and forget to start again?" -- bumper sticker . "If you need more than five lines to prove something, then you are on the wrong track" -- Edgser W. Dijkstra's mother [ibid, p. 55] . "If you think it's simple, then you have misunderstood the problem." -- Bjarne Stroustrup [lecture at Temple U., 11/25/97] . "True. When your hammer is C++, everything begins to look like a thumb." -- Steve Haflich, in comp.lang.c++ . "I have made this letter longer than usual because I lack the time to make it shorter." -- Blaise Pascal . The "abort()" function is now called "choice()." -- from the "Politically Correct UNIX System VI Release notes" . "We don't make mistakes, we just have happy little accidents." -- Bob Ross, "The Joy of Painting" . "Modern capitalism is not about free markets, it is about building sufficient mass that the market gravitationally collapses around you."-- Alisdair Meredith . "If quantum physics doesn't confuse you then you don't understand it." -- Niels Bohr . "If the brain were so simple we could understand it, we would be so simple we couldn't." -- Lyall Watson . "Moral indignation is jealousy with a halo." -- H. G. Wells (1866-1946) . "Glory is fleeting, but obscurity is forever." -- Napoleon Bonaparte (1769-1821) . "Victory goes to the player who makes the next-to-last mistake." -- Chessmaster Savielly Grigorievitch Tartakower (1887-1956) . "Don't be so humble - you are not that great." -- Golda Meir (1898-1978) to a visiting diplomat . "His ignorance is encyclopedic" -- Abba Eban (1915-2002) . "If a man does his best, what else is there?" -- General George S. Patton (1885-1945) . "I can write better than anybody who can write faster, and I can write faster than anybody who can write better." -- A. J. Liebling (1904-1963) . "People demand freedom of speech to make up for the freedom of thought which they avoid." -- Soren Aabye Kierkegaard (1813-1855) . "Give me chastity and continence, but not yet." -- Saint Augustine (354-430) . "Not everything that can be counted counts, and not everything that counts can be counted." -- Albert Einstein (1879-1955) . "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former." -- Albert Einstein (1879-1955) . "A lie gets halfway around the world before the truth has a chance to get its pants on." -- Sir Winston Churchill (1874-1965) . "I do not feel obliged to believe that the same God who has endowed us with sense, reason, and intellect has intended us to forgo their use." -- Galileo Galilei . "The artist is nothing without the gift, but the gift is nothing without work." -- Emile Zola (1840-1902) . "This book fills a much-needed gap." -- Moses Hadas (1900-1966) in a review . "The full use of your powers along lines of excellence." -- definition of "happiness" by John F. Kennedy (1917-1963) . "I'm living so far beyond my income that we may almost be said to be living apart." -- e e cummings (1894-1962) . "Give me a museum and I'll fill it." -- Pablo Picasso (1881-1973) . "Assassins!" -- Arturo Toscanini (1867-1957) to his orchestra . "I'll moider da bum." -- Heavyweight boxer Tony Galento, when asked what he thought of William Shakespeare . "In theory, there is no difference between theory and practice. But, in practice, there is." -- Jan L.A. van de Snepscheut . "I find that the harder I work, the more luck I seem to have." -- Thomas Jefferson (1743-1826) . "Each problem that I solved became a rule which served afterwards to solve other problems." -- Rene Descartes (1596-1650), "Discours de la Methode" . "In the End, we will remember not the words of our enemies, but the silence of our friends." -- Martin Luther King Jr. (1929-1968) . "Whether you think that you can, or that you can't, you are usually right." -- Henry Ford (1863-1947) . "Do, or do not. There is no 'try'." -- Yoda ('The Empire Strikes Back') . "The only way to get rid of a temptation is to yield to it." -- Oscar Wilde (1854-1900) . "Don't stay in bed, unless you can make money in bed." -- George Burns (1896-1996) . "I don't know why we are here, but I'm pretty sure that it is not in order to enjoy ourselves." -- Ludwig Wittgenstein (1889-1951) . "The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offense." -- Edsger Dijkstra . "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg." -- Bjarne Stroustrup . "A mathematician is a device for turning coffee into theorems." -- Paul Erdos . "The only difference between me and a madman is that I'm not mad." -- Salvador Dali (1904-1989) . "If you can't get rid of the skeleton in your closet, you'd best teach it to dance." -- George Bernard Shaw (1856-1950) . "But at my back I always hear Time's winged chariot hurrying near." -- Andrew Marvell (1621-1678) . "Good people do not need laws to tell them to act responsibly, while bad people will find a way around the laws." -- Plato (427-347 B.C.) . "The power of accurate observation is frequently called cynicism by those who don't have it." -- George Bernard Shaw (1856-1950) . "Whenever I climb I am followed by a dog called 'Ego'." - Friedrich Nietzsche (1844-1900) . "We have art to save ourselves from the truth." - Friedrich Nietzsche (1844-1900) . "Never interrupt your enemy when he is making a mistake." - Napoleon Bonaparte (1769-1821) . "I think 'Hail to the Chief' has a nice ring to it." -- John F. Kennedy (1917-1963) when asked what is his favorite song . "Human history becomes more and more a race between education and catastrophe." -- H. G. Wells (1866-1946) . "Talent does what it can; genius does what it must." - Edward George Bulwer-Lytton (1803-1873) . "The difference between 'involvement' and 'commitment' is like an eggs-and-ham breakfast: the chicken was 'involved' - the pig was 'committed'." -- unknown . "If you are going through hell, keep going." - Sir Winston Churchill (1874-1965) . "I'm all in favor of keeping dangerous weapons out of the hands of fools. Let's start with typewriters." -- Frank Lloyd Wright (1868-1959) . "Some cause happiness wherever they go; others, whenever they go." -- Oscar Wilde (1854-1900) . "God is a comedian playing to an audience too afraid to laugh." -- Voltaire (1694-1778) . "He is one of those people who would be enormously improved by death." -- H. H. Munro (Saki) (1870-1916) . "I am ready to meet my Maker. Whether my Maker is prepared for the great ordeal of meeting me is another matter." -- Sir Winston Churchill (1874-1965) . "I shall not waste my days in trying to prolong them." -- Ian L. Fleming (1908-1964) . "If you can count your money, you don't have a billion dollars." -- J. Paul Getty (1892-1976) . "Facts are the enemy of truth." -- Don Quixote - "Man of La Mancha" . "When you do the common things in life in an uncommon way, you will command the attention of the world." -- George Washington Carver (1864-1943) . "How wrong it is for a woman to expect the man to build the world she wants, rather than to create it herself." -- Anais Nin (1903-1977) . "I have not failed. I've just found 10,000 ways that won't work." -- Thomas Alva Edison (1847-1931) . "I begin by taking. I shall find scholars later to demonstrate my perfect right." -- Frederick (II) the Great . "Maybe this world is another planet's Hell." -- Aldous Huxley (1894-1963) . "Blessed is the man, who having nothing to say, abstains from giving wordy evidence of the fact." -- George Eliot (1819-1880) . "Once you eliminate the impossible, whatever remains, no matter how improbable, must be the truth." -- Sherlock Holmes (by Sir Arthur Conan Doyle, 1859-1930) . "Black holes are where God divided by zero." - Steven Wright . "I've had a wonderful time, but this wasn't it." -- Groucho Marx (1895-1977) . "It's kind of fun to do the impossible." - Walt Disney (1901-1966) . "We didn't lose the game; we just ran out of time." - Vince Lombardi . "The optimist proclaims that we live in the best of all possible worlds, and the pessimist fears this is true." -- James Branch Cabell . "A friendship founded on business is better than a business founded on friendship." -- John D. Rockefeller (1874-1960) . "All are lunatics, but he who can analyze his delusion is called a philosopher." -- Ambrose Bierce (1842-1914) . "You can only find truth with logic if you have already found truth without it." -- Gilbert Keith Chesterton (1874-1936) . "An inconvenience is only an adventure wrongly considered; an adventure is an inconvenience rightly considered." -- Gilbert Keith Chesterton (1874-1936) . "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco . "Be nice to people on your way up because you meet them on your way down." -- Jimmy Durante . "The true measure of a man is how he treats someone who can do him absolutely no good." -- Samuel Johnson (1709-1784) . "A people that values its privileges above its principles soon loses both." -- Dwight D. Eisenhower (1890-1969), Inaugural Address, January 20, 1953 . "The significant problems we face cannot be solved at the same level of thinking we were at when we created them." -- Albert Einstein (1879-1955) . "Basically, I no longer work for anything but the sensation I have while working." -- Albert Giacometti (sculptor) . "All truth passes through three stages. First, it is ridiculed. Second, it is violently opposed. Third, it is accepted as being self-evident." -- Arthur Schopenhauer (1788-1860) . "Many a man's reputation would not know his character if they met on the street." -- Elbert Hubbard (1856-1915) . "There is more stupidity than hydrogen in the universe, and it has a longer shelf life." -- Frank Zappa . "Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away." -- Antoine de Saint Exupry . "Life is pleasant. Death is peaceful. It's the transition that's troublesome." -- Isaac Asimov . "If you want to make an apple pie from scratch, you must first create the universe." -- Carl Sagan . "It is much more comfortable to be mad and know it, than to be sane and have one's doubts." -- G. B. Burgin . "Once is happenstance. Twice is coincidence. Three times is enemy action." -- Auric Goldfinger, in "Goldfinger" by Ian L. Fleming (1908-1964) . "To love oneself is the beginning of a lifelong romance" -- Oscar Wilde (1854-1900) . "Knowledge speaks, but wisdom listens." -- Jimi Hendrix . "A clever man commits no minor blunders." -- Goethe (1749-1832) . "Argue for your limitations, and sure enough they're yours." -- Richard Bach . "A witty saying proves nothing." -- Voltaire (1694-1778) . "Education is a progressive discovery of our own ignorance." -- Will Durant . "I have often regretted my speech, never my silence." -- Xenocrates (396-314 B.C.) . "It was the experience of mystery -- even if mixed with fear -- that engendered religion." -- Albert Einstein (1879-1955) . "If everything seems under control, you're just not going fast enough." -- Mario Andretti . "I do not consider it an insult, but rather a compliment to be called an agnostic. I do not pretend to know where many ignorant men are sure -- that is all that agnosticism means." -- Clarence Darrow, Scopes trial, 1925. . "Obstacles are those frightful things you see when you take your eyes off your goal." -- Henry Ford (1863-1947) . "I'll sleep when I'm dead." -- Warren Zevon . "There are people in the world so hungry, that God cannot appear to them except in the form of bread." -- Mahatma Gandhi (1869-1948) . "If you gaze long into an abyss, the abyss will gaze back into you." -- Friedrich Nietzsche (1844-1900) . "The instinct of nearly all societies is to lock up anybody who is truly free. First, society begins by trying to beat you up. If this fails, they try to poison you. If this fails too, the finish by loading honors on your head." -- Jean Cocteau (1889-1963) . "Everyone is a genius at least once a year; a real genius has his original ideas closer together." -- Georg Lichtenberg (1742-1799) . "Success usually comes to those who are too busy to be looking for it" -- Henry David Thoreau (1817-1862) . "While we are postponing, life speeds by." -- Seneca (3BC - 65AD) . "Where are we going, and why am I in this handbasket?" -- Bumper Sticker . "God, please save me from your followers!" -- Bumper Sticker . "Fill what's empty, empty what's full, and scratch where it itches." -- the Duchess of Windsor, when asked what is the secret of a long and happy life . "First they ignore you, then they laugh at you, then they fight you, then you win." -- Mahatma Gandhi (1869-1948) . "Luck is the residue of design." -- Branch Rickey - former owner of the Brooklyn Dodger Baseball Team . "Tragedy is when I cut my finger. Comedy is when you walk into an open sewer and die." -- Mel Brooks . "Most people would sooner die than think; in fact, they do so." -- Bertrand Russell (1872-1970) . "Wit is educated insolence." -- Aristotle (384-322 B.C.) . "My advice to you is get married: if you find a good wife you'll be happy; if not, you'll become a philosopher." -- Socrates (470-399 B.C.) . "Egotist: a person more interested in himself than in me." -- Ambrose Bierce (1842-1914) . "A narcissist is someone better looking than you are." - Gore Vidal . "Wise men make proverbs, but fools repeat them." - Samuel Palmer (1805-80) . "It has become appallingly obvious that our technology has exceeded our humanity." -- Albert Einstein (1879-1955) . "The secret of success is to know something nobody else knows." -- Aristotle Onassis (1906-1975) . "Sometimes when reading Goethe I have the paralyzing suspicion that he is trying to be funny." -- Guy Davenport . "When you have to kill a man, it costs nothing to be polite." -- Sir Winston Churchill (1874-1965) . "Any man who is under 30, and is not a liberal, has not heart; and any man who is over 30, and is not a conservative, has no brains." -- Sir Winston Churchill (1874-1965) . "The opposite of a correct statement is a false statement. The opposite of a profound truth may well be another profound truth." -- Niels Bohr (1885-1962) . "We all agree that your theory is crazy, but is it crazy enough?" -- Niels Bohr (1885-1962) . "When I am working on a problem I never think about beauty. I only think about how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -- Buckminster Fuller (1895-1983) . "In science one tries to tell people, in such a way as to be understood by everyone, something that no one ever knew before. But in poetry, it's the exact opposite." -- Paul Dirac (1902-1984) . "I would have made a good Pope." -- Richard M. Nixon (1913-1994) . "In any contest between power and patience, bet on patience." -- W.B. Prescott . "Anyone who considers arithmetical methods of producing random digits is, of course, in a state of sin." -- John von Neumann (1903-1957) . "The mistakes are all waiting to be made." -- chessmaster Savielly Grigorievitch Tartakower (1887-1956) on the game's opening position . "It is unbecoming for young men to utter maxims." -- Aristotle (384-322 B.C.) . "Grove giveth and Gates taketh away." -- Bob Metcalfe (inventor of Ethernet) on the trend of hardware speedups not being able to keep up with software demands . "Reality is merely an illusion, albeit a very persistent one." -- Albert Einstein (1879-1955) . "One of the symptoms of an approaching nervous breakdown is the belief that one's work is terribly important." -- Bertrand Russell (1872-1970) . "A little inaccuracy sometimes saves a ton of explanation." -- H. H. Munro (Saki) (1870-1916) . "There are two ways of constructing a software design; one way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult." -- C. A. R. Hoare . "Make everything as simple as possible, but not simpler." -- Albert Einstein (1879-1955) . "What do you take me for, an idiot?" -- General Charles de Gaulle (1890-1970), when a journalist asked him if he was happy . "I heard someone tried the monkeys-on-typewriters bit trying for the plays of W. Shakespeare, but all they got was the collected works of Francis Bacon." -- Bill Hirst . "Three o'clock is always too late or too early for anything you want to do." -- Jean-Paul Sartre (1905-1980) . "A doctor can bury his mistakes but an architect can only advise his clients to plant vines." -- Frank Lloyd Wright (1868-1959) . "It is dangerous to be sincere unless you are also stupid." - George Bernard Shaw (1856-1950) . "If you haven't got anything nice to say about anybody, come sit next to me." -- Alice Roosevelt Longworth (1884-1980) . "A man can't be too careful in the choice of his enemies." -- Oscar Wilde (1854-1900) . "Forgive your enemies, but never forget their names." -- John F. Kennedy (1917-1963) . "Logic is in the eye of the logician." -- Gloria Steinem . "No one can earn a million dollars honestly." -- William Jennings Bryan (1860-1925) . "Everything has been figured out, except how to live." -- Jean-Paul Sartre (1905-1980) . "Well-timed silence hath more eloquence than speech." - Martin Fraquhar Tupper . "Thank you for sending me a copy of your book - I'll waste no time reading it." -- Moses Hadas (1900-1966) . "From the moment I picked your book up until I laid it down I was convulsed with laughter. Some day I intend reading it." -- Groucho Marx (1895-1977) . "It is better to have a permanent income than to be fascinating." -- Oscar Wilde (1854-1900) . "When ideas fail, words come in very handy." -- Goethe (1749-1832) . "In the end, everything is a gag." -- Charlie Chaplin (1889-1977) . "The nice thing about egotists is that they don't talk about other people." -- Lucille S. Harper . "You got to be careful if you don't know where you're going, because you might not get there." -- Yogi Berra . "I love Mickey Mouse more than any woman I have ever known." -- Walt Disney (1901-1966) . "He who hesitates is a damned fool." -- Mae West (1892-1980) . "Good teaching is one-fourth preparation and three-fourths theater." -- Gail Godwin . "University politics are vicious precisely because the stakes are so small." -- Henry Kissinger (1923-) . "The graveyards are full of indispensable men." -- Charles de Gaulle (1890-1970) . "You can pretend to be serious; you can't pretend to be witty." -- Sacha Guitry (1885-1957) . "Behind every great fortune there is a crime." -- Honore de Balzac (1799-1850) . "If women didn't exist, all the money in the world would have no meaning." -- Aristotle Onassis (1906-1975) . "I am not young enough to know everything." -- Oscar Wilde (1854-1900) . "The object of war is not to die for your country but to make the other bastard die for his." -- General George Patton (1885-1945) . "Sometimes a scream is better than a thesis." -- Ralph Waldo Emerson (1803-1882) . "There is no sincerer love than the love of food." -- George Bernard Shaw (1856-1950) . "I don't even butter my bread; I consider that cooking." -- Katherine Cebrian . "I have an existential map; it has 'you are here' written all over it." -- Steven Wright . "Mr. Wagner has beautiful moments but bad quarters of an hour." - Gioacchino Rossini (1792-1868) . "Manuscript: something submitted in haste and returned at leisure." -- Oliver Herford (1863-1935) . "I have read your book and much like it." -- Moses Hadas (1900-1966) . "The covers of this book are too far apart." -- Ambrose Bierce (1842-1914) . "Everywhere I go I'm asked if I think the university stifles writers. My opinion is that they don't stifle enough of them." -- Flannery O'Connor (1925-1964) . "Too many pieces of music finish too long after the end." -- Igor Stravinsky (1882-1971) . "Anything that is too stupid to be spoken is sung." -- Voltaire (1694-1778) . "When choosing between two evils, I always like to try the one I've never tried before." -- Mae West (1892-1980) . "I don't know anything about music. In my line you don't have to." -- Elvis Presley (1935-1977) . "No Sane man will dance." -- Cicero (106-43 B.C.) . "Hell is a half-filled auditorium." -- Robert Frost (1874-1963) . "Show me a sane man and I will cure him for you." -- Carl Gustav Jung (1875-1961) . "Vote early and vote often." -- Al Capone (1899-1947) . "If I were two-faced, would I be wearing this one?" -- Abraham Lincoln (1809-1865) . "Few things are harder to put up with than a good example." - Mark Twain (1835-1910) . "Hell is other people." -- Jean-Paul Sartre (1905-1980) . "I am become death, shatterer of worlds." -- Robert J. Oppenheimer (1904-1967) (citing from the Bhagavad Gita, after witnessing the world's first nuclear explosion) . "Happiness is good health and a bad memory." -- Ingrid Bergman (1917-1982) . "Friends may come and go, but enemies accumulate." -- Thomas Jones . "You can get more with a kind word and a gun than you can with a kind word alone." -- Al Capone (1899-1947) . "The gods too are fond of a joke." -- Aristotle (384-322 B.C.) . "Distrust any enterprise that requires new clothes." -- Henry David Thoreau (1817-1862) . "The difference between pornography and erotica is lighting." -- Gloria Leonard . "It is time I stepped aside for a less experienced and less able man." -- Professor Scott Elledge on his retirement from Cornell . "Every day I get up and look through the Forbes list of the richest people in America. If I'm not there, I go to work." -- Robert Orben . "The cynics are right nine times out of ten." -- Henry Louis Mencken (1880-1956) . "There are some experiences in life which should not be demanded twice from any man, and one of them is listening to the Brahms Requiem." -- George Bernard Shaw (1856-1950) . "Attention to health is life's greatest hindrance." -- Plato (427-347 B.C.) . "Plato was a bore." -- Friedrich Nietzsche (1844-1900) . "Nietzsche was stupid and abnormal." -- Leo Tolstoy (1828-1910) . "I'm not going to get into the ring with Tolstoy." -- Ernest Hemingway (1899-1961) . "Hemingway was a jerk." -- Harold Robbins . "Men are not disturbed by things, but the view they take of things." -- Epictetus (55-135 A.D.) "What about things like bullets?" -- Herb Kimmel, Behavioralist, Professor of Psychology, upon hearing the above quote (1981) . "How can I lose to such an idiot?" -- A shout from chessmaster Aaron Nimzovich (1886-1935) . "I don't feel good." -- The last words of Luther Burbank (1849-1926) . "Nothing is wrong with California that a rise in the ocean level wouldn't cure." -- Ross MacDonald (1915-1983) . "Men have become the tools of their tools." -- Henry David Thoreau (1817-1862) . "I have never let my schooling interfere with my education." -- Mark Twain (1835-1910) . "It is now possible for a flight attendant to get a pilot pregnant." -- Richard J. Ferris, president of United Airlines . "I never miss a chance to have sex or appear on television." -- Gore Vidal . "I don't want to achieve immortality through my work; I want to achieve immortality through not dying." -- Woody Allen (1935-) . "Men and nations behave wisely once they have exhausted all the other alternatives." -- Abba Eban (1915-2002) . "To sit alone with my conscience will be judgment enough for me." -- Charles William Stubbs . "Sanity is a madness put to good uses." -- George Santayana (1863-1952) . "Imitation is the sincerest form of television." -- Fred Allen (1894-1956) . "Always do right- this will gratify some and astonish the rest." -- Mark Twain (1835-1910) . "In America, anybody can be president. That's one of the risks you take." -- Adlai Stevenson (1900-1965) . "Copy from one, it's plagiarism; copy from two, it's research." -- Wilson Mizner (1876-1933) . "Why don't you write books people can read?" -- Nora Joyce to her husband James (1882-1941) . "Some editors are failed writers, but so are most writers." -- T. S. Eliot (1888-1965) . "Criticism is prejudice made plausible." -- Henry Louis Mencken (1880-1956) . "It is better to be quotable than to be honest." -- Tom Stoppard . "Being on the tightrope is living; everything else is waiting." -- Karl Wallenda . "Opportunities multiply as they are seized." -- Sun Tzu . "A scholar who cherishes the love of comfort is not fit to be deemed a scholar." -- Lao-Tzu (570?-490? BC) . "The best way to predict the future is to invent it." -- Alan Kay . "Never mistake motion for action." -- Ernest Hemingway (1899-1961) . "Hell is paved with good samaritans." -- William M. Holden . "The longer I live the more I see that I am never wrong about anything, and that all the pains that I have so humbly taken to verify my notions have only wasted my time." -- George Bernard Shaw (1856-1950) . "Silence is argument carried out by other means." -- Ernesto "Che" Guevara (1928-1967) . "Well done is better than well said." -- Benjamin Franklin (1706-1790) . "The average person thinks he isn't." -- Father Larry Lorenzoni . "Heav'n hath no rage like love to hatred turn'd, Nor Hell a fury, like a woman scorn'd." -- William Congreve (1670-1729) . "A husband is what is left of the lover after the nerve has been extracted." -- Helen Rowland (1876-1950) . "Learning is what most adults will do for a living in the 21st century." -- Perelman . "The man who goes alone can start today; but he who travels with another must wait till that other is ready." -- Henry David Thoreau (1817-1862) . "There is a country in Europe where multiple-choice tests are illegal." -- Sigfried Hulzer . "Ask her to wait a moment - I am almost done." -- Carl Friedrich Gauss (1777-1855), while working, when informed that his wife is dying . "A pessimist sees the difficulty in every opportunity; an optimist sees the opportunity in every difficulty." -- Sir Winston Churchill (1874-1965) . "I think there is a world market for maybe five computers." -- Thomas Watson (1874-1956), Chairman of IBM, 1943 . "I think it would be a good idea." -- Mahatma Gandhi (1869-1948), when asked what he thought of Western civilization . "The only thing necessary for the triumph of evil is for good men to do nothing." -- Edmund Burke (1729-1797) . "I'm not a member of any organized political party, I'm a Democrat!" -- Will Rogers (1879-1935) . "If Stupidity got us into this mess, then why can't it get us out?" -- Will Rogers (1879-1935) . "The backbone of surprise is fusing speed with secrecy." -- Von Clausewitz (1780-1831) . "Democracy does not guarantee equality of conditions - it only guarantees equality of opportunity." -- Irving Kristol . "There is no reason anyone would want a computer in their home." -- Ken Olson, president, chairman and founder of Digital Equipment Corp., 1977 . "640K ought to be enough for anybody." -- Bill Gates (1955-), in 1981 . "The concept is interesting and well-formed, but in order to earn better than a 'C', the idea must be feasible." -- A Yale University management professor in response to student Fred Smith's paper proposing reliable overnight delivery service (Smith went on to found Federal Express Corp.) . "Who the hell wants to hear actors talk?" -- H.M. Warner (1881-1958), founder of Warner Brothers, in 1927 . "We don't like their sound, and guitar music is on the way out." -- Decca Recording Co. rejecting the Beatles, 1962 . "Everything that can be invented has been invented." -- Charles H. Duell, Commissioner, U.S. Office of Patents, 1899 . "Denial ain't just a river in Egypt." -- Mark Twain (1835-1910) . "A pint of sweat, saves a gallon of blood." -- General George S. Patton (1885-1945) . "After I'm dead I'd rather have people ask why I have no monument than why I have one." -- Cato the Elder (234-149 BC, AKA Marcus Porcius Cato) . "He can compress the most words into the smallest idea of any man I know." -- Abraham Lincoln (1809-1865) . "Don't let it end like this. Tell them I said something." -- last words of Pancho Villa (1877-1923) . "The right to swing my fist ends where the other man's nose begins." -- Oliver Wendell Holmes (1841-1935) . "The difference between fiction and reality? Fiction has to make sense." -- Tom Clancy . "It's not the size of the dog in the fight, it's the size of the fight in the dog." -- Mark Twain (1835-1910) . "It is better to be feared than loved, if you cannot be both." -- Niccolo Machiavelli (1469-1527), "The Prince" . "Whatever is begun in anger ends in shame." -- Benjamin Franklin (1706-1790) . "The President has kept all of the promises he intended to keep." -- Clinton aide George Stephanopolous speaking on Larry King Live . "We're going to turn this team around 360 degrees." -- Jason Kidd, upon his drafting to the Dallas Mavericks . "Half this game is ninety percent mental." -- Yogi Berra . "There is only one nature - the division into science and engineering is a human imposition, not a natural one. Indeed, the division is a human failure; it reflects our limited capacity to comprehend the whole." -- Bill Wulf . "There's many a bestseller that could have been prevented by a good teacher." -- Flannery O'Connor (1925-1964) . "He has all the virtues I dislike and none of the vices I admire." -- Sir Winston Churchill (1874-1965) . "I criticize by creation - not by finding fault." -- Cicero (106-43 B.C.) . "Love is friendship set on fire." -- Jeremy Taylor . "God gave men both a penis and a brain, but unfortunately not enough blood supply to run both at the same time." -- Robin Williams, commenting on the Clinton/Lewinsky affair . "My occupation now, I suppose, is jail inmate." -- Unibomber Theodore Kaczynski, when asked in court what his current profession was . "Woman was God's second mistake." -- Friedrich Nietzsche (1844-1900) . "This isn't right, this isn't even wrong." -- Wolfgang Pauli (1900-1958), upon reading a young physicist's paper . "For centuries, theologians have been explaining the unknowable in terms of the-not-worth-knowing." -- Henry Louis Mencken (1880-1956) . "Pray, v.: To ask that the laws of the universe be annulled on behalf of a single petitioner confessedly unworthy." -- Ambrose Bierce (1842-1914) . "Every normal man must be tempted at times to spit upon his hands, hoist the black flag, and begin slitting throats." -- Henry Louis Mencken (1880-1956) . "Now, now my good man, this is no time for making enemies." -- Voltaire (1694-1778) on his deathbed in response to a priest asking that he renounce Satan. . "Fill the unforgiving minute with sixty seconds worth of distance run." -- Rudyard Kipling (1865-1936) . "He would make a lovely corpse." -- Charles Dickens (1812-1870) . "I've just learned about his illness. Let's hope it's nothing trivial." -- Irvin S. Cobb . "I worship the quicksand he walks in." -- Art Buchwald . "Wagner's music is better than it sounds." -- Mark Twain (1835-1910) . "A poem is never finished, only abandoned." -- Paul Valery (1871-1945) . "We are not retreating - we are advancing in another Direction." -- General Douglas MacArthur (1880-1964) . "If you were plowing a field, which would you rather use? Two strong oxen or 1024 chickens?" -- Seymour Cray (1925-1996), father of supercomputing . "#3 pencils and quadrille pads." -- Seymoure Cray (1925-1996) when asked what CAD tools he used to design the Cray I supercomputer; he also recommended using the back side of the pages so that the lines were not so dominant. . "I just bought a Mac to help me design the next Cray." -- Seymoure Cray (1925-1996) when was informed that Apple Inc. had recently bought a Cray supercomputer to help them design the next Mac. . "Your Highness, I have no need of this hypothesis." -- Pierre Laplace (1749-1827), to Napoleon on why his works on celestial mechanics make no mention of God. . "I choose a block of marble and chop off whatever I don't need." -- Francois-Auguste Rodin (1840-1917), when asked how he managed to make his remarkable statues . "The man who does not read good books has no advantage over the man who cannot read them." -- Mark Twain (1835-1910) . "The truth is more important than the facts." -- Frank Lloyd Wright (1868-1959) . "Research is what I'm doing when I don't know what I'm doing." -- Wernher Von Braun (1912-1977) . "There are only two tragedies in life: one is not getting what one wants, and the other is getting it." -- Oscar Wilde (1854-1900) . "There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle." -- Albert Einstein (1879-1955) . "Be tolerant of the human race. Your whole family belongs to it -- and some of your spouse's family too." -- Anonymous. . "Mother-in-law = A woman who destroys her son-in-law's peace of mind by giving him a piece of hers." -- Anonymous. . "Why do grandparents and grandchildren get along so well? They have the same enemy -- the mother." -- Claudette Colbert. . "The first half of our life is ruined by our parents and the second half by our children." -- Clarence Darrow. . "Honolulu, it's got everything. Sand for the children, sun for the wife, and sharks for the wife's mother." -- Ken Dodd. . "A coward is a hero with a wife, kids, and a mortgage." -- Marvin Kitman. . "A man can't get rich if he takes proper care of his family." - Navaho saying. . "Giving birth is like taking your lower lip and forcing it over your head." - Carol Burnett. . "You have to stay in shape. My grandmother, she started walking five miles a day when she was 60. She's 97 today and we don't know where she is!" -- Ellen DeGeneres. . "I'm not into working out. My philosophy: No pain, no pain." -- Carol Leifer. . "You have a cough? Go home tonight, eat a whole box of Ex-Lax -- tomorrow you'll be afraid to cough." -- Pearl Williams. . "Now comes the mystery" -- Henry Ward Beecher, dying words, March 8, 1887 . "I don't feel good." -- Luther Burbank, dying words . "The nourishment is palatable" -- Emily Dickinson, dying words . "Dieu me pardonnera. C'est son mtier." Translation: God forgive me. It's his job. -- Heinrich Heine, dying words. . "Go on, get out. Last words are for fools who haven't said enough." -- Karl Marx, dying words to his housekeeper. . "Why yes -- a bulletproof vest." -- James Rodges, murderer, on his final request before the firing squad. . "They couldn't hit an elephant at this dist--" -- John B. Sedwick, general, dying words, 1864 . "I still live." -- Daniel Webster, dying words . "Go away...I'm alright." -- H.G.Wells, dying words . "Friends applaud, the Comedy is over." -- Ludwig von Beethoven, dying words . "Ah well, then I suppose I shall have to die beyond my means." -- Oscar Wilde, dying words . "I agree with the reforms, but I want nothing to change" -- Ion Luca Caragiale, Romanian playwriter, 1880 . "Far too many development shops are run by fools who succeed despite their many failings." -- Brion L. Webster . "Never raise your hands to your kids. It leaves your groin unprotected." -- Red Button . "I'm in shape. Round is a shape." -- George Carlin . "Do illiterate people get the full effect of alphabet soup?" -- John Mendoza . "I've always wanted to be somebody, but I should have been more specific." -- George Carlin . "Ever notice when you blow in a dog's face he gets mad at you, but when you take him in a car he sticks his head out the window?" -- George Carlin . "Ever notice that anyone going slower than you is an idiot, but anyone going faster is a maniac?" -- George Carlin . "I have six locks on my door, all in a row. When I go out, I lock every other one. I figure no matter how long somebody stands there picking the locks, they are always locking three of them." -- George Carlin . "One out of every three Americans is suffering from some form of mental illness. Think of two of your best friends. If they are OK, then it must be you." -- George Carlin . "They show you how detergents take out bloodstains. I think if you've got a T-shirt with bloodstains all over it, maybe your laundry isn't your biggest problem." -- George Carlin . "Ask people why they have deer heads on their walls and they tell you it's because they're such beautiful animals. I think my wife is beautiful, but I only have photographs of her on the wall." -- George Carlin . "A lady came up to me on the street, pointed at my suede jacket and said, 'Don't you know a cow was murdered for that jacket?' I said 'I didn't know there were any witnesses. Now I'll have to kill you too'." -- George Carlin . "Future historians will be able to study at the Jimmy Carter Library, the Gerald Ford Library, the Ronald Reagan Library, and the Bill Clinton Adult Bookstore." -- George Carlin . "Benny Goodman plays the clarinet. I play music." -- Artie Shaw . "If you were my husband, I'd give you poison." -- Lady Astor to Churchill "If you were my wife, I'd take it." -- Curchill to Lady Astor . "Sir, you will either die of the pox or on the gallows." -- The Earl Of Sandwich to John Wilkes "That depends, sir, On whether I embrace your mistress or your principles" -- John Wilkes to the Earl of Sandwich . "He had delusions of adequacy." -- Walter Kerr . "He has all the virtues I dislike and none of the vices I admire." -- Winston Churchill . "A modest little person, with much to be modest about." -- Winston Churchill . "I have never killed a man, but I have read many obituaries with great pleasure." -- Clarence Darrow . "He has never been known to use a word that might send a reader to the dictionary." -- William Faulkner about Ernest Hemingway "Poor Faulkner. Does he really think big emotions come from big words?" -- Ernest Hemingway about William Faulkner . "Thank you for sending me a copy of your book; I'll waste no time reading it." -- Moses Hadas . "He can compress the most words into the smallest idea of any man I know." -- Abraham Lincoln . "I didn't attend the funeral, but I sent a nice letter saying I approved of it." -- Mark Twain . "He has no enemies, but is intensely disliked by his friends." -- Oscar Wilde . "I am enclosing two tickets to the first night of my new play; bring a friend... if you have one." -- George Bernard Shaw to Winston Churchill "Cannot possibly attend first night, will attend second... if there is one." - Winston Churchill, in response. . "I feel so miserable without you; it's almost like having you here." -- Stephen Bishop . "He is a self-made man and worships his creator." -- John Bright . "I've just learned about his illness. Let's hope it's nothing trivial." -- Irvin S. Cobb . "He is not only dull himself, he is the cause of dullness in others." -- Samuel Johnson . "He is simply a shiver looking for a spine to run up." -- Paul Keating . "There's nothing wrong with you that reincarnation won't cure." -- Jack E. Leonard . "He has the attention span of a lightning bolt." -- Robert Redford . "They never open their mouths without subtracting from the sum of human knowledge." -- Thomas Brackett Reed . "In order to avoid being called a flirt, she always yielded easily." -- Charles, Count Talleyrand . "He loves nature in spite of what it did to him." -- Forrest Tucker . "Why do you sit there looking like an envelope without any address on it?" -- Mark Twain . "His mother should have thrown him away and kept the stork." -- Mae West . "Some cause happiness wherever they go; others, whenever they go." -- Oscar Wilde . "He uses statistics as a drunken man uses lamp-posts... for support rather than illumination." -- Andrew Lang (1844-1912) . "He has Van Gogh's ear for music." -- Billy Wilder . Lady Astor: "Mr. Churchill, you're drunk!" Winston Churchill: "Yes, and you, Madam, are ugly. But tomorrow, I shall be sober." . "I liked your opera. I think I will set it to music." -- Beethoven to a fellow composer . "I must say Bernard Shaw is greatly improved by music." -- T.S. Elliot referring to 'My Fair Lady' . "The best time I ever had with Joan Crawford was when I pushed her down the stairs in 'Whatever Happened to Baby Jane?'" -- Bette Davis . "Why am I so good at playing bitches? I think it's because I'm not a bitch. Maybe that's why Miss Crawford always plays ladies." -- Bette Davis . "Two things should be cut - the second act and the child's throat." -- Noel Coward on a dull play with an annoying child star . "There are two ways of disliking poetry; one way is to dislike it, the other is to read Pope." -- Oscar Wilde on Alexander Pope . "This is not a novel to be tossed aside lightly. It should be thrown with great force." -- Book review by Dorothy Parker . "That's not writing; That's typing." -- Truman Capote on Jack Kerouac . "[A book by Henry James] is like a church lit but without a congregation to distract you, with every light and line focused on the high altar. And on the altar, very reverently placed, intensely there, is a dead kitten, an eggshell, a bit of string." -- H.G. Wells on Henry James . "His book is much harder to read than it must have been to write." -- Christopher Hitchens about Bob Woodwars's new book, 'State of Denial' . "Let's not bring age into this discussion. I will not let my opponent's youth and inexperience become an issue." -- Ronald Reagan on Walter Mondale . "Properly read, the Bible is the most potent force for atheism ever conceived." -- Isaac Asimov variety-0.8.13/variety/plugins/downloaders/000077500000000000000000000000001475753071700207735ustar00rootroot00000000000000variety-0.8.13/variety/plugins/downloaders/ConfigurableImageSource.py000066400000000000000000000051631475753071700260760ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import abc from variety.plugins.downloaders.ImageSource import ImageSource class ConfigurableImageSource(ImageSource, metaclass=abc.ABCMeta): """ Implements configurable/searchable image sources. """ @abc.abstractmethod def validate(self, config): """ Given a source config, validates whether images can be fetched for this config. As part of the validation, performs config normalization and initial lookup calls and returns a "final" config that will be persisted. Returns a tuple (config_to_persist, error_message) If error_message is None, the config is considered valid and a source is added. If error_message is not None, it is shown as an error in UI and a new source is not added. Example valid: return formatted(query), None Example invalid: return query, _('Not a proper XYZ query') @:param config the search query, URL or other config string for the new source @:return tuple (config_to_persist, error_message_or_none) """ pass @abc.abstractmethod def create_downloader(self, config): """ Creates a Downloader for the given config :param config: the downloader config :return: a Downloader object """ pass @abc.abstractmethod def get_ui_instruction(self): """ Long instruction to show in the "Add..." dialog :return: long instruction """ pass @abc.abstractmethod def get_ui_short_instruction(self): """ Short instructiton to show in the "Add..." dialog in front of the input field :return: short instruction """ pass @abc.abstractmethod def get_ui_short_description(self): """ Source description to show in the "Add..." menu popup :return: short description """ pass variety-0.8.13/variety/plugins/downloaders/DefaultDownloader.py000066400000000000000000000233241475753071700247540ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import abc import collections import logging import os from variety.plugins.downloaders.Downloader import Downloader from variety.Util import Util logger = logging.getLogger("variety") QueueItem = collections.namedtuple("QueueItem", ["origin_url", "image_url", "extra_metadata"]) SAFE_MODE_BLACKLIST = { # Sample of Wallhaven and Flickr tags that cover most not-fully-safe images "woman", "women", "model", "models", "boob", "boobs", "tit", "tits", "lingerie", "bikini", "bikini model", "sexy", "bra", "bras", "panties", "face", "faces", "legs", "feet", "pussy", "ass", "asses", "topless", "long hair", "lesbians", "cleavage", "brunette", "brunettes", "redhead", "redheads", "blonde", "blondes", "high heels", "miniskirt", "stockings", "anime girls", "in bed", "kneeling", "girl", "girls", "nude", "naked", "people", "fuck", "sex", } class DefaultDownloader(Downloader, metaclass=abc.ABCMeta): def __init__(self, source, config=None): super().__init__(source, config) self.queue = [] @abc.abstractmethod def fill_queue(self): """ Subclasses should implement this method. It should return one or more QueueItems. This serves as a cache so that downloaders can prepare multiple items for downloading using fewer API/scrape calls. The size of the queue should be a compromise between making fewer API calls and keeping some variety in the consecutive downloads. :return: a list with one or more QueueItems """ pass def download_queue_item(self, queue_item): """ Unpacks the queue item (as populated by fill_queue) into arguments to pass to save_locally, and calls it. By default this assumes QueueItems are returned, but subclasses may choose a different represetnation for the queue items, and may also want to perform additional actions before calling save_locally (e.g. additional data fetching and parsing). Override if some work needs to be done on every queue item before it can be downloaded. :param queue_item: the queue item, as populated into the queue by fill_queue :return whatever the call to save_locally returns i.e. either the local file path in case of success, or None otherwise """ origin_url, image_url, extra_metadata = queue_item return self.save_locally(origin_url, image_url, extra_metadata=extra_metadata) def download_one(self): """ Provides a default implementation which relies on fill_queue, and takes the image source throttling into account. :return: path to the newly downloaded file, or None if the download attempt ws unsuccessful """ if self.target_folder is None: raise Exception("update_download_folder was not called before downloading") name = self.get_source_name() max_downloads_per_hour, max_queue_fills_per_hour = self.source.get_throttling() if not self.source.is_download_allowed(): logger.info( lambda: "%s: max_downloads_per_hour of %d reached, skip this attempt" % (name, max_downloads_per_hour) ) return None logger.info(lambda: "%s: Downloading an image, config: %s" % (name, self.config)) logger.info(lambda: "%s: Queue size: %d" % (name, len(self.queue))) if not self.queue: if not self.source.is_fill_queue_allowed(): logger.info( lambda: "%s: Queue empty, but max_queue_fills_per_hour of %d reached, " "will try again later" % (name, max_queue_fills_per_hour) ) return None self.source.register_fill_queue() logger.info(lambda: "%s: Filling queue" % name) items = self.fill_queue() for item in items: self.queue.append(item) if not self.queue: logger.info(lambda: "%s: Queue still empty after fill request" % name) return None else: logger.info(lambda: "%s: Queue populated with %d URLs" % (name, len(self.queue))) self.source.register_download() queue_item = self.queue.pop() return self.download_queue_item(queue_item) def is_in_downloaded(self, image_url): return os.path.exists(self._local_filepath(url=image_url)) def is_in_banned(self, origin_url): return self.get_variety() and origin_url in self.get_variety().banned def is_safe_mode_enabled(self): return self.get_variety() and self.get_variety().options.safe_mode def is_unsafe(self, extra_metadata): if self.is_safe_mode_enabled() and "keywords" in extra_metadata: blacklisted = set(k.lower() for k in extra_metadata["keywords"]) & SAFE_MODE_BLACKLIST return (True, blacklisted) if len(blacklisted) > 0 else (False, []) return False, [] def is_size_inadequate(self, width, height): return self.get_variety() and not self.get_variety().size_ok(width, height) def is_in_favorites(self, url): return self.get_variety() and os.path.exists( os.path.join(self.get_variety().options.favorites_folder, Util.get_local_name(url)) ) def save_locally( self, origin_url, image_url, source_type=None, source_location=None, source_name=None, force_download=False, extra_metadata=None, local_filename=None, request_headers=None, request_kwargs=None, ): source_type = source_type or self.get_source_type() source_name = source_name or self.get_source_name() source_location = source_location or self.get_source_location() or self.get_description() if not force_download and self.is_in_banned(origin_url): logger.info(lambda: "URL " + origin_url + " is banned, skip downloading") return None try: os.makedirs(self.target_folder) except Exception: pass if origin_url.startswith("//"): origin_url = "https:" + origin_url if image_url.startswith("//"): image_url = origin_url.split("//")[0] + image_url # we will download the contents to a ".partial" file, then rename it to the proper name if not local_filename: local_filename = self.get_local_filename(url=image_url) local_filepath = self._local_filepath(local_filename=local_filename) local_filepath_partial = local_filepath + ".partial" logger.info(lambda: "Origin URL: " + origin_url) logger.info(lambda: "Image URL: " + image_url) logger.info(lambda: "Local path: " + local_filepath) if not force_download and os.path.exists(local_filepath): logger.info(lambda: "File already exists, skip downloading") return None is_unsafe, blacklisted = self.is_unsafe(extra_metadata or {}) if is_unsafe: logger.info( lambda: "Skipping non-safe download %s due to blacklisted keywords (%s). " "Is the source %s:%s suitable for Safe mode?" % (origin_url, str(blacklisted), source_type, source_location) ) return None try: r = Util.request( image_url, stream=True, headers=request_headers, **(request_kwargs or {}) ) with open(local_filepath_partial, "wb") as f: Util.request_write_to(r, f) except Exception as e: logger.info( lambda: "Download failed from image URL: %s (source location: %s) " % (image_url, source_location) ) Util.safe_unlink(local_filepath_partial) raise e if not Util.is_image(local_filepath_partial, check_contents=True): logger.info(lambda: "Downloaded data was not an image, image URL might be outdated") Util.safe_unlink(local_filepath_partial) return None metadata = { "sourceType": source_type, "sourceName": source_name, "sourceLocation": source_location, "sourceURL": origin_url, "imageURL": image_url, } metadata.update(extra_metadata or {}) Util.write_metadata(local_filepath_partial, metadata) # rename the file to its final intended filename try: # make sure if an external metadata file was created, to rename it first os.rename(local_filepath_partial + ".metadata.json", local_filepath + ".metadata.json") except Exception: pass # file rename is an atomic operation, so we should never end up with partial downloads os.rename(local_filepath_partial, local_filepath) logger.info(lambda: "Download complete") return local_filepath variety-0.8.13/variety/plugins/downloaders/Downloader.py000066400000000000000000000166531475753071700234560ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import abc import json import os from variety.Util import Util class Downloader(abc.ABC): def __init__(self, source, config=None): """ Create a downloader for an image source :param source: the image source this downloader is associated with :param config: optional, see get_config() """ super().__init__() self.source = source self.config = config self.target_folder = None # initialized post construction by update_download_folder self.state = None def get_variety(self): """ :return: the VarietyWindow instance, if set in the source, else None """ return self.source.get_variety() def update_download_folder(self, global_download_folder): """ Called after initialization, once the VarietyWindow instance is filled in, sets the target folder according to the current options. Also called if downloads folder is changed in settings. :param global_download_folder the "global" download folder as set in Variety's preferences Our target_folder will be a subfolder to that one, named depending on what get_folder_name() returns. :return the target_folder for this particular downloader """ filename = self.get_folder_name() if len(filename) + len(global_download_folder) > 160: filename = filename[: (150 - len(global_download_folder))] + Util.md5(filename)[:10] self.target_folder = os.path.join(global_download_folder, filename) self._load_state() return self.target_folder def _load_state(self): try: with open(os.path.join(self.target_folder, "state.json")) as f: self.state = json.load(f) except Exception: self.state = {} def save_state(self): """ Persists the state as json inside the downloader's target folder. state is a dict that is used internally by Variety, but the downloaders can also use it keeping any sort of state is necessary for the downloader. """ if self.target_folder is None: raise Exception("update_download_folder was not called before save_state") with open(os.path.join(self.target_folder, "state.json"), "w") as f: json.dump(self.state, f) def get_local_filename(self, url): """ Returns the local file name under which to save a remote image (at URL url). By default this is Util.get_local_name(url), but subclasses can override. :param url: the URL of the image :return: the full local path, under the current target_folder """ return Util.get_local_name(url) def _local_filepath(self, url=None, local_filename=None): """ Returns the local file path where to save a remote image (at URL url). By default this is os.path.join(self.target_folder, self.get_local_filename(url)). Subclasses are discouraged from overriding this method, override get_local_filename() instead so that downloaded files are kept under the downloader's target_folder. :param url: the URL of the image :param local_filename: what local filename to use instead of extracting it from the URL. Pass None to use self.get_local_filename(url) :return: the full local path, under the current target_folder """ if url is None and local_filename is None: raise ValueError("One of url or local_filename must be specified") if self.target_folder is None: raise Exception("update_download_folder was not called before downloading") filename = local_filename if local_filename else self.get_local_filename(url) return os.path.join(self.target_folder, filename) def get_source(self): """ Returns the IImageSource associated with this downloader :return: IImageSource """ return self.source def get_source_type(self): """ :return: the image source's source type """ return self.source.get_source_type() def get_source_name(self): """ :return: the image source's source name """ return self.source.get_source_name() def get_source_location(self): """ What to save as sourceLocation in the images' metadata. By default this is this downloader's config string. Override in SimpleDownloaders to return a non-null string. :return: the source location to be saved in images """ return self.get_config() def get_description(self): """ User-friendly description of this downloader to show in UI (in the list of sources). E.g. "Downloads random images from site X", or "Images from Flickr user XXX" :return: description """ return self.config def get_config(self): """ Returns the config string used to create this downloader, e.g. a search keyword, or URL :return: the config string, will be None for non-configurable sources """ return self.config def get_identifier(self): return self.target_folder def get_folder_name(self): """ How should the folder be named where images from this source are downloaded to :return: folder name (just name, not full path) """ if self.config: return self.get_source_type() + "_" + Util.convert_to_filename(self.config) else: return self.get_source_name() def get_refresh_interval_seconds(self): """ Refresher downloaders can download one and the same image URL on a regular basis. Returning a positive integer here instructs Variety to initiate regular downloads and wallpaper changes when using this downloader. Images downloaded by refreshers MUST contain the string "--refreshable" in the name - this is the way Variety will know these images can be set as wallpaper again and again. :return: False by defualt, override to return True when implementing refreshers :return: None, or a positive number of seconds """ return None def is_refresher(self): """ Checks if this is a "refresher" plugin, i.e. refresh_interval_seconds is not None """ return self.get_refresh_interval_seconds() is not None @abc.abstractmethod def download_one(self): """ Downloads a single image. DefaultDownloader provides a reference implementation and most plugins should inherit DefaultDownloader instead of implementing this method. :return: the downloaded file path, or None """ pass variety-0.8.13/variety/plugins/downloaders/ImageSource.py000066400000000000000000000162701475753071700235560ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import abc import collections import logging import time from datetime import timedelta from variety.plugins.IVarietyPlugin import IVarietyPlugin logger = logging.getLogger("variety") Throttling = collections.namedtuple( "Throttling", ["max_downloads_per_hour", "max_queue_fills_per_hour"] ) class ImageSource(IVarietyPlugin, metaclass=abc.ABCMeta): def __init__(self): super().__init__() self._last_download_times = [] self._last_queue_fill_times = [] self.variety = None def set_variety(self, variety): """ Sets the VarietyWindow instance. This is called after Jumble creates the instance, before it is actually used. :param variety: the instance of VarietyWindow """ self.variety = variety def get_variety(self): """ Returns the VarietyWindow instance, if set via set_variety(), or None. This is available before the source is actually used. :return the instance of VarietyWindow """ return self.variety @abc.abstractmethod def get_source_type(self): """ Returns a key for this source that will be used to identify it in configuration files, and will be saved in image metadata under Xmp.variety.sourceType. Variety will use this source type to find which plugin can handle a particular saved image source configuration, so this should not collide between different image source plugins. :return: source type, e.g. "flickr", "unsplash", etc. """ pass def get_source_name(self): """ Returns the value that will go into Xmp.variety.sourceName in image metadata. This will also be shown in UI. This could be the name of the service that is used to fetch images, e.g. Flickr. Default implementation is to return source_type, with uppercase first letter. :return: source name, e.g. "Flickr", "Unsplash", etc. """ source_type = self.get_source_type() return source_type[0].upper() + source_type[1:] def needs_internet(self): """ Does this configurable image source need internet in order to fetch new images? :return: True or False """ return True def on_image_set_as_wallpaper(self, img, meta): """ Called when a wallpaper downloaded from this source was used as a wallpaper. This can be used to call back the image provider for stats purposes. :param img path to the image file :param meta image metadata """ pass def on_image_favorited(self, img, meta): """ Called when a wallpaper downloaded from this source was copied or moved to favorites. This can be used to call back the image provider for stats purposes. :param img path to the image file :param meta image metadata """ pass def get_default_throttling(self): """ Throttling serves to avoid overloading servers when multiple Variety users use the source simultaneously. It is normally controlled via a remote config, but defaults should be provided for the cases when the remote config is not set or cannot be fetched. All downloaders for the same source are throttled together. :return: a Throttling namedtuple """ return Throttling(max_downloads_per_hour=None, max_queue_fills_per_hour=None) def get_server_options_key(self): """ Key under the the server-side throttling options where the configs for this source reside. By default it is the same as the source type. :return: key in remote server options for this source, e.g. "unsplash_v2" """ return self.get_source_type() def get_server_options(self): """ Returns the server options for this source. The default implementation reads from get_variety().server_options, i.e. it uses Variety's central serverside options, but you could override this method to read from elsewhere. :return: remotely-configured options for this image source """ return self.get_variety().server_options[self.get_server_options_key()] def get_throttling(self): """ Returns the actual throttling, taking remote configuration into account (if available) """ defaults = self.get_default_throttling() max_downloads_per_hour, max_queue_fills_per_hour = defaults name = self.get_source_name() try: logger.info(lambda: "{}: parsing serverside options".format(name)) options = self.get_server_options() logger.info( lambda: "{} serverside options: {}".format(self.get_source_name(), str(options)) ) except Exception: logger.info( lambda: "Could not parse {} serverside options, using defaults {}, {}".format( name, max_downloads_per_hour, max_queue_fills_per_hour ) ) return defaults try: max_downloads_per_hour = int(options["max_downloads_per_hour"]) except Exception: pass try: max_queue_fills_per_hour = int(options["max_queue_fills_per_hour"]) except Exception: pass return Throttling(max_downloads_per_hour, max_queue_fills_per_hour) def _count_last_hour_downloads(self): now = time.time() self._last_download_times = [t for t in self._last_download_times if now - t < 3600] return len(self._last_download_times) def is_download_allowed(self): max_downloads_per_hour, _ = self.get_throttling() return ( max_downloads_per_hour is None or self._count_last_hour_downloads() < max_downloads_per_hour ) def register_download(self): self._last_download_times.append(time.time()) def _count_last_hour_queue_fills(self): now = time.time() self._last_queue_fill_times = [t for t in self._last_queue_fill_times if now - t < 3600] return len(self._last_queue_fill_times) def is_fill_queue_allowed(self): _, max_queue_fills_per_hour = self.get_throttling() return ( max_queue_fills_per_hour is None or self._count_last_hour_queue_fills() < max_queue_fills_per_hour ) def register_fill_queue(self): self._last_queue_fill_times.append(time.time()) variety-0.8.13/variety/plugins/downloaders/SimpleDownloader.py000066400000000000000000000024221475753071700246150ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE import abc from variety.plugins.downloaders.DefaultDownloader import DefaultDownloader from variety.plugins.downloaders.ImageSource import ImageSource class SimpleDownloader(ImageSource, DefaultDownloader, metaclass=abc.ABCMeta): """ Base class for non-configurable "singleton" downloaders, where the same object instance serves as both the ImageSource and the Downloader. """ def __init__(self): ImageSource.__init__(self) DefaultDownloader.__init__(self, source=self) self.queue = [] variety-0.8.13/variety/plugins/downloaders/__init__.py000066400000000000000000000000001475753071700230720ustar00rootroot00000000000000variety-0.8.13/variety/profile.py000066400000000000000000000032401475753071700170020ustar00rootroot00000000000000import os from variety.Util import Util DEFAULT_PROFILE_PATH = "~/.config/variety/" __profile_path = DEFAULT_PROFILE_PATH def set_profile_path(profile_path): if not profile_path: profile_path = DEFAULT_PROFILE_PATH # if just a name is passed instead of a full path, put it under ~/.config/variety-profiles if not "/" in profile_path: profile_path = "~/.config/variety-profiles/{}".format(profile_path) # make sure profile path has a trailing slash if not profile_path.endswith("/"): profile_path += "/" global __profile_path __profile_path = profile_path def get_profile_path(expanded=True): global __profile_path return os.path.expanduser(__profile_path) if expanded else __profile_path def get_profile_short_name(): return os.path.basename(get_profile_path()[:-1]) def get_profile_wm_class(): return "Variety" + ("" if is_default_profile() else " (Profile: {})".format(get_profile_path())) def is_default_profile(): """ Are we using the default profile or a custom profile? """ return os.path.normpath(get_profile_path()) == os.path.normpath( os.path.expanduser(DEFAULT_PROFILE_PATH) ) def get_profile_id(): """ Returns a dbus-and-filename-friendly identificator of the profile path """ return Util.md5(os.path.normpath(get_profile_path()))[:10] def get_desktop_file_name(): if is_default_profile(): return "variety.desktop" else: return "variety-{}-{}.desktop".format(get_profile_short_name(), get_profile_id()) def get_autostart_file_path(): return os.path.join(os.path.expanduser("~/.config/autostart"), get_desktop_file_name()) variety-0.8.13/variety_lib/000077500000000000000000000000001475753071700156175ustar00rootroot00000000000000variety-0.8.13/variety_lib/AboutDialog.py000066400000000000000000000037601475753071700203710ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE from gi.repository import Gtk # pylint: disable=E0611 from variety.profile import get_profile_wm_class from .helpers import get_builder class AboutDialog(Gtk.AboutDialog): __gtype_name__ = "AboutDialog" def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated AboutDialog object. """ builder = get_builder("AboutVarietyDialog") new_object = builder.get_object("about_variety_dialog") new_object.finish_initializing(builder) return new_object def finish_initializing(self, builder): """Called while initializing this instance in __new__ finish_initalizing should be called after parsing the ui definition and creating a AboutDialog object with it in order to finish initializing the start of the new AboutVarietyDialog instance. Put your initialization code in here and leave __init__ undefined. """ # Get a reference to the builder and set up the signals. self.builder = builder self.ui = builder.get_ui(self) self.set_wmclass(get_profile_wm_class(), get_profile_wm_class()) variety-0.8.13/variety_lib/Builder.py000066400000000000000000000263261475753071700175700ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE """Enhances builder connections, provides object to access glade objects""" import functools import inspect import logging from xml.etree.cElementTree import ElementTree import gi gi.require_version('Gtk', '3.0') from gi.repository import GObject, Gtk # pylint: disable=E0611 logger = logging.getLogger("variety_lib") # this module is big so uses some conventional prefixes and postfixes # *s list, except self.widgets is a dictionary # *_dict dictionary # *name string # ele_* element in a ElementTree # pylint: disable=R0904 # the many public methods is a feature of Gtk.Builder class Builder(Gtk.Builder): """ extra features connects glade defined handler to default_handler if necessary auto connects widget to handler with matching name or alias auto connects several widgets to a handler via multiple aliases allow handlers to lookup widget name logs every connection made, and any on_* not made """ def __init__(self): Gtk.Builder.__init__(self) self.widgets = {} self.glade_handler_dict = {} self.connections = [] self._reverse_widget_dict = {} # pylint: disable=R0201 # this is a method so that a subclass of Builder can redefine it def default_handler(self, handler_name, filename, *args, **kwargs): """helps the apprentice guru glade defined handlers that do not exist come here instead. An apprentice guru might wonder which signal does what he wants, now he can define any likely candidates in glade and notice which ones get triggered when he plays with the project. this method does not appear in Gtk.Builder""" logger.debug( """tried to call non-existent function:%s() expected in %s args:%s kwargs:%s""", handler_name, filename, args, kwargs, ) # pylint: enable=R0201 def get_name(self, widget): """ allows a handler to get the name (id) of a widget this method does not appear in Gtk.Builder""" return self._reverse_widget_dict.get(widget) def add_from_file(self, filename): """parses xml file and stores wanted details""" Gtk.Builder.add_from_file(self, filename) # extract data for the extra interfaces tree = ElementTree() tree.parse(filename) ele_widgets = tree.iter("object") for ele_widget in ele_widgets: name = ele_widget.attrib.get("id") if not name: continue widget = self.get_object(name) # populate indexes - a dictionary of widgets self.widgets[name] = widget # populate a reversed dictionary self._reverse_widget_dict[widget] = name # populate connections list ele_signals = ele_widget.findall("signal") connections = [ (name, ele_signal.attrib["name"], ele_signal.attrib["handler"]) for ele_signal in ele_signals ] if connections: self.connections.extend(connections) ele_signals = tree.iter("signal") for ele_signal in ele_signals: self.glade_handler_dict.update({ele_signal.attrib["handler"]: None}) def connect_signals(self, callback_obj): """connect the handlers defined in glade reports successful and failed connections and logs call to missing handlers""" filename = inspect.getfile(callback_obj.__class__) callback_handler_dict = dict_from_callback_obj(callback_obj) connection_dict = {} connection_dict.update(self.glade_handler_dict) connection_dict.update(callback_handler_dict) for item in connection_dict.items(): if item[1] is None: # the handler is missing so reroute to default_handler handler = functools.partial(self.default_handler, item[0], filename) connection_dict[item[0]] = handler # replace the run time warning logger.warn("expected handler '%s' in %s", item[0], filename) # connect glade define handlers Gtk.Builder.connect_signals(self, connection_dict) # let's tell the user how we applied the glade design for connection in self.connections: widget_name, signal_name, handler_name = connection logger.debug( "connect builder by design '%s', '%s', '%s'", widget_name, signal_name, handler_name ) def get_ui(self, callback_obj=None, by_name=True): """Creates the ui object with widgets as attributes connects signals by 2 methods this method does not appear in Gtk.Builder""" result = UiFactory(self.widgets) # Hook up any signals the user defined in glade if callback_obj is not None: # connect glade define handlers self.connect_signals(callback_obj) if by_name: auto_connect_by_name(callback_obj, self) return result # pylint: disable=R0903 # this class deliberately does not provide any public interfaces # apart from the glade widgets class UiFactory: """ provides an object with attributes as glade widgets""" def __init__(self, widget_dict): self._widget_dict = widget_dict for (widget_name, widget) in widget_dict.items(): setattr(self, widget_name, widget) # Mangle any non-usable names (like with spaces or dashes) # into pythonic ones cannot_message = """cannot bind ui.%s, name already exists consider using a pythonic name instead of design name '%s'""" consider_message = """consider using a pythonic name instead of design name '%s'""" for (widget_name, widget) in widget_dict.items(): pyname = make_pyname(widget_name) if pyname != widget_name: if hasattr(self, pyname): logger.debug(cannot_message, pyname, widget_name) else: logger.debug(consider_message, widget_name) setattr(self, pyname, widget) def __iter__(self): """Implements iteration, i.e. 'for o in self' """ return self._widget_dict.values() def __getitem__(self, name): """Provides access as dictionary where name might be non-pythonic""" return self._widget_dict[name] # pylint: enable=R0903 def make_pyname(name): """ mangles non-pythonic names into pythonic ones""" pyname = "" for character in name: if character.isalpha() or character == "_" or (pyname and character.isdigit()): pyname += character else: pyname += "_" return pyname # Until bug https://bugzilla.gnome.org/show_bug.cgi?id=652127 is fixed, we # need to reimplement inspect.getmembers. GObject introspection doesn't # play nice with it. def getmembers(obj, check): members = [] for k in dir(obj): try: attr = getattr(obj, k) except: continue if check(attr): members.append((k, attr)) members.sort() return members def dict_from_callback_obj(callback_obj): """a dictionary interface to callback_obj""" methods = getmembers(callback_obj, inspect.ismethod) aliased_methods = [x[1] for x in methods if hasattr(x[1], "aliases")] # a method may have several aliases # ~ @alias('on_btn_foo_clicked') # ~ @alias('on_tool_foo_activate') # ~ on_menu_foo_activate(): # ~ pass alias_groups = [(x.aliases, x) for x in aliased_methods] aliases = [] for item in alias_groups: for alias in item[0]: aliases.append((alias, item[1])) dict_methods = dict(methods) dict_aliases = dict(aliases) results = {} results.update(dict_methods) results.update(dict_aliases) return results def auto_connect_by_name(callback_obj, builder): """finds handlers like on__ and connects them i.e. find widget,signal pair in builder and call widget.connect(signal, on__)""" callback_handler_dict = dict_from_callback_obj(callback_obj) for item in builder.widgets.items(): (widget_name, widget) = item signal_ids = [] try: widget_type = type(widget) while widget_type: signal_ids.extend(GObject.signal_list_ids(widget_type)) widget_type = GObject.type_parent(widget_type) except RuntimeError: # pylint wants a specific error pass signal_names = [GObject.signal_name(sid) for sid in signal_ids] # Now, automatically find any the user didn't specify in glade for sig in signal_names: # using convention suggested by glade sig = sig.replace("-", "_") handler_names = ["on_%s_%s" % (widget_name, sig)] # Using the convention that the top level window is not # specified in the handler name. That is use # on_destroy() instead of on_windowname_destroy() if widget is callback_obj: handler_names.append("on_%s" % sig) do_connect(item, sig, handler_names, callback_handler_dict, builder.connections) log_unconnected_functions(callback_handler_dict, builder.connections) def do_connect(item, signal_name, handler_names, callback_handler_dict, connections): """connect this signal to an unused handler""" widget_name, widget = item for handler_name in handler_names: target = handler_name in list(callback_handler_dict.keys()) connection = (widget_name, signal_name, handler_name) duplicate = connection in connections if target and not duplicate: widget.connect(signal_name, callback_handler_dict[handler_name]) connections.append(connection) logger.debug( "connect builder by name '%s','%s', '%s'", widget_name, signal_name, handler_name ) def log_unconnected_functions(callback_handler_dict, connections): """log functions like on_* that we could not connect""" connected_functions = [x[2] for x in connections] handler_names = list(callback_handler_dict.keys()) unconnected = [x for x in handler_names if x.startswith("on_")] for handler_name in connected_functions: try: unconnected.remove(handler_name) except ValueError: pass for handler_name in unconnected: logger.debug("Not connected to builder '%s'", handler_name) variety-0.8.13/variety_lib/PreferencesDialog.py000066400000000000000000000045751475753071700215650ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE """this dialog adjusts values in gsettings """ import logging from gi.repository import Gtk # pylint: disable=E0611 from .helpers import get_builder, get_help_uri, show_uri logger = logging.getLogger("variety_lib") class PreferencesDialog(Gtk.Dialog): __gtype_name__ = "PreferencesDialog" def __new__(cls, parent): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated PreferencesDialog object. """ builder = get_builder("PreferencesVarietyDialog") new_object = builder.get_object("preferences_variety_dialog") new_object.finish_initializing(builder, parent) return new_object def finish_initializing(self, builder, parent): """Called while initializing this instance in __new__ finish_initalizing should be called after parsing the ui definition and creating a PreferencesDialog object with it in order to finish initializing the start of the new PerferencesVarietyDialog instance. Put your initialization code in here and leave __init__ undefined. """ # Get a reference to the builder and set up the signals. self.parent = parent self.builder = builder self.ui = builder.get_ui(self, True) # code for other initialization actions should be added here def on_btn_close_clicked(self, widget, data=None): self.hide() self.on_destroy() def on_btn_help_clicked(self, widget, data=None): show_uri(self, "ghelp:%s" % get_help_uri("preferences")) variety-0.8.13/variety_lib/__init__.py000066400000000000000000000015761475753071700177410ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE """facade - makes variety_lib package easy to refactor while keeping its api constant""" from .varietyconfig import get_version variety-0.8.13/variety_lib/helpers.py000066400000000000000000000053571475753071700176450ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE """Helpers for an Ubuntu application.""" import logging import os from .Builder import Builder from .varietyconfig import get_data_file def get_builder(builder_file_name): """Return a fully-instantiated Gtk.Builder instance from specified ui file :param builder_file_name: The name of the builder file, without extension. Assumed to be in the 'ui' directory under the data path. """ # Look for the ui file that describes the user interface. ui_filename = get_data_file("ui", "%s.ui" % (builder_file_name,)) if not os.path.exists(ui_filename): ui_filename = None builder = Builder() builder.set_translation_domain("variety") builder.add_from_file(ui_filename) return builder # Owais Lone : To get quick access to icons and stuff. def get_media_file(media_file_name): media_filename = get_data_file("media", "%s" % (media_file_name,)) if not os.path.exists(media_filename): media_filename = None return "file:///" + media_filename def get_help_uri(page=None): # help_uri from source tree - default language here = os.path.dirname(__file__) help_uri = os.path.abspath(os.path.join(here, "..", "help", "C")) if not os.path.exists(help_uri): # installed so use gnome help tree - user's language help_uri = "variety" # unspecified page is the index.page if page is not None: help_uri = "%s#%s" % (help_uri, page) return help_uri def show_uri(parent, link): from gi.repository import Gtk # pylint: disable=E0611 screen = parent.get_screen() Gtk.show_uri(screen, link, Gtk.get_current_event_time()) def alias(alternative_function_name): """see http://www.drdobbs.com/web-development/184406073#l9""" def decorator(function): """attach alternative_function_name(s) to function""" if not hasattr(function, "aliases"): function.aliases = [] function.aliases.append(alternative_function_name) return function return decorator variety-0.8.13/variety_lib/varietyconfig.py000066400000000000000000000041401475753071700210410ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- ### BEGIN LICENSE # Copyright (c) 2012, Peter Levi # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE __all__ = ["project_path_not_found", "get_data_file", "get_data_path"] try: from .variety_build_settings import __variety_data_directory__ except ImportError: # Variety's data directory. This is set by setup.py for permanent installations, but defaults to ../data # for easy development / running from source. __variety_data_directory__ = "../data" __license__ = "GPL-3" __version__ = "0.8.13" import os class project_path_not_found(Exception): """Raised when we can't find the project directory.""" def get_data_file(*path_segments): """Get the full path to a data file. Returns the path to a file underneath the data directory (as defined by `get_data_path`). Equivalent to os.path.join(get_data_path(), *path_segments). """ return os.path.join(get_data_path(), *path_segments) def get_data_path(): """Retrieve variety data path This path is by default /../data/ in trunk and /usr/share/variety in an installed version but this path is specified at installation time. """ # Get pathname absolute or relative. path = os.path.join(os.path.dirname(__file__), __variety_data_directory__) abs_data_path = os.path.abspath(path) if not os.path.exists(abs_data_path): raise project_path_not_found return abs_data_path def get_version(): return __version__