variety/0000775000000000000000000000000012657457215007447 5ustar variety/bin/0000775000000000000000000000000012655733065010215 5ustar variety/bin/variety0000755000000000000000000000314012641772700011614 0ustar #!/usr/bin/python2 # -*- 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 import os # 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 variety.main() variety/MANIFEST0000664000000000000000000001251712647466422010605 0ustar # file GENERATED by distutils, do NOT edit .quickly AUTHORS COPYING MANIFEST Variety.iml setup.py variety.desktop.in .idea/.name .idea/ant.xml .idea/compiler.xml .idea/encodings.xml .idea/misc.xml .idea/modules.xml .idea/other.xml .idea/testrunner.xml .idea/uiDesigner.xml .idea/vcs.xml .idea/workspace.xml .idea/copyright/profiles_settings.xml .idea/inspectionProfiles/Project_Default.xml .idea/inspectionProfiles/profiles_settings.xml .idea/scopes/scope_settings.xml bin/variety data/config/filters.txt data/config/sources.txt data/config/ui.conf data/config/variety.conf data/icons/22x22/apps/variety-indicator-dark.png data/icons/22x22/apps/variety-indicator.png data/icons/scalable/apps/variety.svg data/media/tray-screenshot.png data/media/variety-indicator-dark.png data/media/variety-indicator-dark.svg data/media/variety-indicator.png data/media/variety-indicator.svg data/media/variety-small.svg data/media/variety-very-small.svg data/media/variety.svg data/media/variety128.png data/media/variety14.png data/media/variety16.png data/media/variety16a.png data/media/variety24.png data/media/variety256.png data/media/variety32.png data/media/variety48.png data/media/variety64.png data/media/vrty-cloud.png data/media/vrty-login.png data/media/vrty-users.png data/media/wallpaper-kde.jpg data/panoramio/panoramio.html data/panoramio/panoramio.js data/panoramio/style.css data/panoramio/underscore-min.js data/plugins/__init__.py data/plugins/quotes/GoodreadsSource.py data/plugins/quotes/LocalFilesSource.py data/plugins/quotes/QuotationsPageSource.py data/plugins/quotes/QuotesDaddySource.py data/plugins/quotes/__init__.py data/plugins/quotes/quotes.txt data/scripts/get_wallpaper data/scripts/set_wallpaper data/ui/AboutVarietyDialog.ui data/ui/AddFlickrDialog.ui data/ui/AddMediaRssDialog.ui data/ui/AddPanoramioDialog.ui data/ui/AddRedditDialog.ui data/ui/AddWallbaseDialog.ui data/ui/AddWallhavenDialog.ui data/ui/AddWallpapersNetCategoryDialog.ui data/ui/EditFavoriteOperationsDialog.ui data/ui/FacebookFirstRunDialog.ui data/ui/FacebookPublishDialog.ui data/ui/LoginOrRegisterDialog.ui data/ui/PreferencesVarietyDialog.ui data/ui/SmartFeaturesConfirmationDialog.ui data/ui/SmartFeaturesNoticeDialog.ui data/ui/SmartRegisterDialog.ui data/ui/WelcomeDialog.ui data/ui/WelcomeDialog.ui.~1~ data/ui/about_variety_dialog.xml data/ui/add_flickr_dialog.xml data/ui/add_media_rss_dialog.xml data/ui/add_panoramio_dialog.xml data/ui/add_reddit_dialog.xml data/ui/add_wallbase_dialog.xml data/ui/add_wallhaven_dialog.xml data/ui/add_wallpapers_net_category_dialog.xml data/ui/changes.txt data/ui/edit_favorite_operations_dialog.xml data/ui/facebook_first_run_dialog.xml data/ui/facebook_publish_dialog.xml data/ui/login_or_register_dialog.xml data/ui/preferences_variety_dialog.xml data/ui/smart_features_confirmation_dialog.xml data/ui/smart_features_notice_dialog.xml data/ui/smart_register_dialog.xml data/ui/welcome_dialog.xml debian/changelog debian/compat debian/control debian/copyright debian/rules help/C/index.page help/C/preferences.page help/C/topic1.page help/C/figures/icon.png jumble/IPlugin.py jumble/Jumble.py jumble/__init__.py po/bg.po po/de.po po/es.po po/fr.po po/ja.po po/ko.po po/pl.po po/ru.po po/uk.po po/variety.pot po/zh_CN.po tests/TestBingDownloader.py tests/TestDownloader.py tests/TestFlickrDownloader.py tests/TestGoodreadsSource.py tests/TestImageFetcher.py tests/TestJumble.py tests/TestMediaRssDownloader.py tests/TestQuotationsPageSource.py tests/TestQuotesDaddySource.py tests/TestRedditDownloader.py tests/TestUnsplashDownloader.py tests/TestUtil.py tests/TestVarietyWindow.py tests/__init__.py tests/fake_image.jpg tests/test.jpg tests/test.jpg.metadata.json tests/test.svg tests/test.svg.metadata.json tests/test_lint.py variety/APODDownloader.py variety/AboutVarietyDialog.py variety/AbstractAddByQueryDialog.py variety/AddFlickrDialog.py variety/AddMediaRssDialog.py variety/AddPanoramioDialog.py variety/AddRedditDialog.py variety/AddWallbaseDialog.py variety/AddWallhavenDialog.py variety/AddWallpapersNetCategoryDialog.py variety/AttrDict.py variety/AvgColor.py variety/BingDownloader.py variety/CalibrateDominantColors.py variety/DesktopprDownloader.py variety/DominantColors.py variety/Downloader.py variety/EarthDownloader.py variety/EditFavoriteOperationsDialog.py variety/FacebookFirstRunDialog.py variety/FacebookHelper.py variety/FacebookPublishDialog.py variety/FlickrDownloader.py variety/FolderChooser.py variety/ImageFetcher.py variety/LoginOrRegisterDialog.py variety/MediaRssDownloader.py variety/Options.py variety/PanoramioDownloader.py variety/PreferencesVarietyDialog.py variety/QuoteWriter.py variety/QuotesEngine.py variety/RedditDownloader.py variety/Smart.py variety/SmartFeaturesConfirmationDialog.py variety/SmartFeaturesNoticeDialog.py variety/SmartRegisterDialog.py variety/Texts.py variety/ThumbsManager.py variety/ThumbsWindow.py variety/UnsplashDownloader.py variety/Util.py variety/VarietyOptionParser.py variety/VarietyWindow.py variety/WallbaseDownloader.py variety/WallhavenDownloader.py variety/WallpapersNetDownloader.py variety/WelcomeDialog.py variety/__init__.py variety/convert-metadata.py variety/indicator.py variety/plugins/IQuoteSource.py variety/plugins/IVarietyPlugin.py variety/plugins/__init__.py variety_lib/AboutDialog.py variety_lib/Builder.py variety_lib/PreferencesDialog.py variety_lib/__init__.py variety_lib/helpers.py variety_lib/varietyconfig.py variety/COPYING0000644000000000000000000010451312641771551010477 0ustar 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/.bzrignore0000664000000000000000000000002412641771331011434 0ustar .idea/workspace.xml variety/help/0000775000000000000000000000000012641771331010366 5ustar variety/help/C/0000775000000000000000000000000012641771331010550 5ustar variety/help/C/preferences.page0000664000000000000000000000064112641771331013710 0ustar Your Name Your E-mail 2010 Optional short description of Preferences for contents page Preferences

This is the preferences page.

variety/help/C/figures/0000775000000000000000000000000012641771331012214 5ustar variety/help/C/figures/icon.png0000664000000000000000000000123512641771331013653 0ustar PNG  IHDR(-SMPLTEUm$ m$r#r"v!sqt#r t!s s t s t!r s r st!t t t s s s s s s s ss ss s t s s s s ss s t!t"u#v$w&w'x)z*}12;c4J vs/i/>/Q -o~IENDB`variety/help/C/topic1.page0000664000000000000000000000070212641771331012604 0ustar Your Name Your E-mail 2010 Optional short description of Topic 1 for contents page Topic 1

This is an example topic page. It's main function is to describe one topic.

variety/help/C/index.page0000664000000000000000000000236512641771331012523 0ustar Variety The Variety help. Your Name Your E-mail 2010

Creative Commons Attribution-Share Alike 3.0 Unported License

<!-- This shows on the page in title font --> <!-- the icon only shows when installed --> <media type="image" mime="image/png" src="figures/icon.png">[icon]</media> <app>Variety</app> Help

This is an example guide page. It's main function is to link together the help topics.

Contents

Your script or application looks better if it has help files similar to other applications in ubuntu.

Some people think that help files are only for apps that are difficult to use.

variety/Variety.iml0000664000000000000000000000073612641771331011572 0ustar variety/.idea/0000775000000000000000000000000012657457206010427 5ustar variety/.idea/ant.xml0000664000000000000000000000010012641771331011711 0ustar variety/.idea/copyright/0000775000000000000000000000000012641771331012426 5ustar variety/.idea/copyright/profiles_settings.xml0000664000000000000000000000015712641771331016716 0ustar variety/.idea/testrunner.xml0000664000000000000000000000037012641771331013351 0ustar variety/.idea/misc.xml0000664000000000000000000000131012641771331012066 0ustar http://www.w3.org/1999/xhtml variety/.idea/compiler.xml0000664000000000000000000000137312641771331012756 0ustar variety/.idea/encodings.xml0000664000000000000000000000033412647465234013121 0ustar variety/.idea/other.xml0000664000000000000000000000030612641771331012260 0ustar variety/.idea/.name0000664000000000000000000000000712641771331011334 0ustar varietyvariety/.idea/scopes/0000775000000000000000000000000012641771331011712 5ustar variety/.idea/scopes/scope_settings.xml0000664000000000000000000000021312641771331015461 0ustar variety/.idea/modules.xml0000664000000000000000000000040012641771331012602 0ustar variety/.idea/inspectionProfiles/0000775000000000000000000000000012641771331014275 5ustar variety/.idea/inspectionProfiles/profiles_settings.xml0000664000000000000000000000035312641771331020563 0ustar variety/.idea/inspectionProfiles/Project_Default.xml0000664000000000000000000000077112641771331020076 0ustar variety/.idea/vcs.xml0000664000000000000000000000025412641771331011734 0ustar variety/.idea/workspace.xml0000664000000000000000000011470212657457206013154 0ustar true 1453222547798 variety/.idea/uiDesigner.xml0000664000000000000000000002113212641771331013235 0ustar variety/setup.py0000664000000000000000000000642312655724127011163 0ustar #!/usr/bin/env python # -*- 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 ###################### DO NOT TOUCH THIS (HEAD TO THE SECOND PART) ###################### import os import sys import glob try: import DistUtilsExtra.auto except ImportError: print >> sys.stderr, 'To build variety you need https://launchpad.net/python-distutils-extra' sys.exit(1) assert DistUtilsExtra.auto.__version__ >= '2.18', 'needs DistUtilsExtra.auto >= 2.18' def update_config(values = {}): oldvalues = {} try: fin = file('variety_lib/varietyconfig.py', 'r') fout = file(fin.name + '.new', 'w') for line in fin: fields = line.split(' = ') # Separate variable from value if fields[0] in values: oldvalues[fields[0]] = fields[1].strip() line = "%s = %s\n" % (fields[0], values[fields[0]]) fout.write(line) fout.flush() fout.close() fin.close() os.rename(fout.name, fin.name) except (OSError, IOError), e: print ("ERROR: Can't find variety_lib/varietyconfig.py") sys.exit(1) return oldvalues class InstallAndUpdateDataDirectory(DistUtilsExtra.auto.install_auto): def run(self): values = {'__variety_data_directory__': "'%s'" % (self.prefix + '/share/variety/'), '__version__': "'%s'" % self.distribution.get_version()} previous_values = update_config(values) DistUtilsExtra.auto.install_auto.run(self) update_config(previous_values) ################################################################################## ###################### YOU SHOULD MODIFY ONLY WHAT IS BELOW ###################### ################################################################################## DistUtilsExtra.auto.setup( name='variety', version='0.6.0', license='GPL-3', author='Peter Levi', author_email='peterlevi@peterlevi.com', description='Wallpaper changer, downloader and manager', long_description= "Variety changes the desktop wallpaper regularly, using local " "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" "" "Variety can fetch wallpapers from Flickr, Wallbase.cc, Wallpapers.net, " "NASA Astronomy Picture of the Day, Desktoppr.co. Media RSS feeds from Picasa, " "deviantART or any other place are also supported.", url='https://launchpad.net/variety', cmdclass={'install': InstallAndUpdateDataDirectory} ) variety/jumble/0000775000000000000000000000000012657457236010730 5ustar variety/jumble/__init__.py0000664000000000000000000000000012641771331013013 0ustar variety/jumble/Jumble.py0000664000000000000000000001017412641771331012507 0ustar # -*- 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 imp import logging import inspect 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] info = imp.find_module(name, [location]) try: logger.info(lambda: "Jumble loading module in %s from %s" % (name, path)) yield imp.load_module(name, *info), path except Exception: logging.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: logging.exception("Jumble: not a plugin class: %s" % str(cls)) continue if not info: logging.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: logging.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/jumble/IPlugin.py0000664000000000000000000000533012641771331012636 0ustar # -*- 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 class IPlugin(object): """ The most simple interface to be inherited when creating a plugin. """ @classmethod 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 URL" # optional } """ return {} 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/variety/0000775000000000000000000000000012657457236011135 5ustar variety/variety/UnsplashDownloader.py0000664000000000000000000001063612655665020015317 0ustar # -*- 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 import os import random import logging import time from variety import Downloader from variety.Util import Util logger = logging.getLogger('variety') random.seed() class UnsplashDownloader(Downloader.Downloader): last_download_time = 0 rate_limiting_started_time = 0 CLIENT_ID = '072e5048dfcb73a8d9ad59fcf402471518ff8df725df462b0c4fa665f466515a' def __init__(self, parent): super(UnsplashDownloader, self).__init__(parent, "unsplash", "Unsplash.com", "https://unsplash.com") self.last_fill_time = 0 self.queue = [] def convert_to_filename(self, url): return "Unsplash" def download_one(self): min_download_interval, min_fill_queue_interval = self.parse_server_options("unsplash", 0, 0) if time.time() - UnsplashDownloader.last_download_time < min_download_interval: logger.info(lambda: "Minimal interval between Unsplash downloads is %d, skip this attempt" % min_download_interval) return None logger.info(lambda: "Downloading an image from Unsplash") logger.info(lambda: "Queue size: %d" % len(self.queue)) if not self.queue: if time.time() - UnsplashDownloader.rate_limiting_started_time < 3600: logger.info(lambda: "Unsplash queue empty, but rate limit reached, will try again later") return None if time.time() - self.last_fill_time < min_fill_queue_interval: logger.info(lambda: "Unsplash queue empty, but minimal interval between fill attempts is %d, " "will try again later" % min_fill_queue_interval) return None self.last_fill_time = time.time() self.fill_queue() if not self.queue: logger.info(lambda: "Unsplash queue still empty after fill request") return None UnsplashDownloader.last_download_time = time.time() origin_url, image_url, extra_metadata, filename = self.queue.pop() return self.save_locally(origin_url, image_url, extra_metadata=extra_metadata, local_filename=filename) def fill_queue(self): page = random.randint(1, 250) url = 'https://api.unsplash.com/photos/?page=%d&per_page=30&client_id=%s' % (page, UnsplashDownloader.CLIENT_ID) logger.info(lambda: "Filling Unsplash queue from " + url) response = Util.urlopen(url) if int(response.headers['X-Ratelimit-Remaining']) < 100: UnsplashDownloader.rate_limiting_started_time = time.time() data = json.loads(response.read()) for item in data: try: width = item['width'] height = item['height'] if self.parent and not self.parent.size_ok(width, height): continue image_url = item['links']['download'] origin_url = item['links']['html'] filename = os.path.join(self.target_folder, Util.sanitize_filename(image_url.split('/')[-2] + '.jpg')) extra_metadata = { 'sourceType': 'unsplash', 'sfwRating': 100, 'author': item['user']['name'], 'authorURL': item['user']['links']['html'], 'keywords': [cat['title'].lower().strip() for cat in item['categories']] } self.queue.append((origin_url, image_url, extra_metadata, filename)) except: logger.exception(lambda: "Could not process an item from Unsplash") raise random.shuffle(self.queue) logger.info(lambda: "Unsplash populated with %d URLs" % len(self.queue))variety/variety/WallhavenDownloader.py0000664000000000000000000001434112641771550015441 0ustar # -*- 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 import random import logging import time from variety import Downloader from variety.Util import Util logger = logging.getLogger('variety') random.seed() class WallhavenDownloader(Downloader.Downloader): last_download_time = 0 def __init__(self, parent, location): super(WallhavenDownloader, self).__init__(parent, "wallhaven", "Wallhaven.cc", location) self.parse_location() self.last_fill_time = 0 self.queue = [] def convert_to_filename(self, url): return "wallhaven_" + super(WallhavenDownloader, self).convert_to_filename(url) def parse_location(self): if self.location.startswith(('http://', 'https://')): # location is an URL, use it self.url = self.location else: # interpret location as keywords self.url = "http://alpha.wallhaven.cc/search?q=%s&categories=111&purity=100&sorting=favorites&order=desc" % urllib.quote(self.location) 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]) except: pass return soup, result_count @staticmethod def validate(location): logger.info(lambda: "Validating Wallhaven location " + location) try: s, count = WallhavenDownloader(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_one(self): min_download_interval, min_fill_queue_interval = self.parse_server_options("wallhaven", 0, 0) if time.time() - WallhavenDownloader.last_download_time < min_download_interval: logger.info(lambda: "Minimal interval between Wallhaven downloads is %d, skip this attempt" % min_download_interval) return None logger.info(lambda: "Downloading an image from Wallhaven.cc, " + self.location) logger.info(lambda: "Queue size: %d" % len(self.queue)) if not self.queue: if time.time() - self.last_fill_time < min_fill_queue_interval: logger.info(lambda: "Wallhaven queue empty, but minimal interval between fill attempts is %d, " "will try again later" % min_fill_queue_interval) return None self.fill_queue() if not self.queue: logger.info(lambda: "Wallhaven queue still empty after fill request") return None WallhavenDownloader.last_download_time = time.time() wallpaper_url = self.queue.pop() 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() extra_metadata['sfwRating'] = {'sfw': 100, 'sketchy': 50, 'nsfw': 0}[purity] except: pass return self.save_locally(wallpaper_url, src_url, extra_metadata=extra_metadata) def fill_queue(self): self.last_fill_time = time.time() logger.info(lambda: "Filling wallhaven queue: " + self.location) 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 = map(int, thumb.find('span', {'class': 'wall-res'}).contents[0].split('x')) width = p[0] height = p[1] if self.parent and not self.parent.size_ok(width, height): continue except Exception: # missing or unparseable resolution - consider ok pass try: link = thumb.find('a', {'class': 'preview'})["href"] if self.parent and link in self.parent.banned: continue self.queue.append(link) except Exception: logger.debug(lambda: "Missing link for thumbnail") random.shuffle(self.queue) if not_random and len(self.queue) >= 20: self.queue = self.queue[:len(self.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 logger.info(lambda: "Wallhaven queue populated with %d URLs" % len(self.queue)) variety/variety/SmartFeaturesNoticeDialog.py0000664000000000000000000000436312641772700016551 0ustar # -*- 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 import gettext from gettext import gettext as _ gettext.textdomain('variety') class SmartFeaturesNoticeDialog(Gtk.Dialog): __gtype_name__ = "SmartFeaturesNoticeDialog" def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated SmartFeaturesNoticeDialog object. """ builder = get_builder('SmartFeaturesNoticeDialog') new_object = builder.get_object('smart_features_notice_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 SmartFeaturesNoticeDialog object with it in order to finish initializing the start of the new SmartFeaturesNoticeDialog 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 if __name__ == "__main__": dialog = SmartFeaturesNoticeDialog() dialog.show() Gtk.main() variety/variety/AddPanoramioDialog.py0000664000000000000000000000777712641771550015176 0ustar # -*- 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 import logging from gi.repository import Gtk, WebKit, GObject # pylint: disable=E0611 from variety.Options import Options from variety_lib.helpers import get_builder from variety import _, _u from variety_lib import varietyconfig logger = logging.getLogger('variety') class AddPanoramioDialog(Gtk.Dialog): __gtype_name__ = "AddPanoramioDialog" def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated AddPanoramioDialog object. """ builder = get_builder('AddPanoramioDialog') new_object = builder.get_object('add_panoramio_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 AddPanoramioDialog object with it in order to finish initializing the start of the new AddPanoramioDialog 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 self.load_map() def set_edited_row(self, edited_row): self.edited_row = edited_row js = "setLocation('" + edited_row[2] + "')" self.js(js) def path2url(self, path): import urllib return 'file://' + urllib.pathname2url(path) def js(self, command): logger.debug(lambda: 'Panoramio: js(%s)' % command) if hasattr(self, "web_view_loaded"): GObject.idle_add(lambda: self.web_view.execute_script(command)) else: GObject.timeout_add(100, lambda: self.js(command)) def on_js_action(self, action, argument): if action == 'location': location = argument self.parent.on_add_dialog_okay(Options.SourceType.PANORAMIO, location, self.edited_row) self.destroy() def load_map(self): with open(varietyconfig.get_data_file('panoramio/panoramio.html')) as f: html = f.read() self.web_view = WebKit.WebView() def nav(wv, command): if command: logger.info(lambda: 'Received command: ' + command) command = command[command.index('|') + 1:] index = command.index(':') action = command[:index] argument = command[index + 1:] self.on_js_action(action, argument) self.web_view.connect("status-bar-text-changed", nav) def _loaded(wv, data): self.web_view_loaded = True self.web_view.connect('document-load-finished', _loaded) self.web_view.load_string(html, "text/html", "UTF-8", self.path2url(varietyconfig.get_data_path()) + '/panoramio/') self.web_view.set_visible(True) self.ui.scrolledwindow.add(self.web_view) def on_btn_ok_clicked(self, widget, data=None): self.js('reportLocation()') def on_btn_cancel_clicked(self, widget, data=None): self.destroy() if __name__ == "__main__": dialog = AddPanoramioDialog() dialog.show() Gtk.main() variety/variety/BingDownloader.py0000664000000000000000000000600512641771550014375 0ustar # -*- 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 datetime import datetime import random import urlparse import logging import re from variety import Downloader from variety.Util import Util logger = logging.getLogger('variety') random.seed() class BingDownloader(Downloader.Downloader): BING_JSON_URL = "http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=100&mkt=en-US" # n=100, but max 8 images are actually returned... Pity. def __init__(self, parent): super(BingDownloader, self).__init__(parent, "bing", "Bing", "https://www.bing.com/gallery/") self.queue = [] def convert_to_filename(self, url): return "Bing" def download_one(self): logger.info(lambda: "Downloading an image from Bing") logger.info(lambda: "Queue size: %d" % len(self.queue)) if not self.queue: self.fill_queue() if not self.queue: logger.info(lambda: "Bing queue empty after fill") return None origin_url, image_url, extra_metadata = self.queue.pop() return self.save_locally(origin_url, image_url, extra_metadata=extra_metadata) def fill_queue(self): logger.info(lambda: "Filling Bing queue from " + self.location) s = Util.fetch_json(BingDownloader.BING_JSON_URL) for item in s['images']: try: image_url = 'https://www.bing.com' + item['url'] 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'], } self.queue.append((src_url, image_url, extra_metadata)) except: logger.exception(lambda: "Could not process an item in the Bing json result") random.shuffle(self.queue) logger.info(lambda: "Bing queue populated with %d URLs" % len(self.queue))variety/variety/WelcomeDialog.py0000664000000000000000000000362012641771550014212 0ustar # -*- 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 from variety import _, _u 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/variety/DominantColors.py0000664000000000000000000001075212641771550014436 0ustar # -*- 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 PIL import Image, ImageFilter import sys 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 xrange(0, self.resized.size[0]): for y in xrange(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 xrange(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 xrange(0, self.resized.size[0], 2): for y in xrange(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 = map(lambda c: (counts[c], (sums[c][0] // counts[c], sums[c][1] // counts[c], sums[c][2] // counts[c])), colors) else: colors = map(lambda c: (sums[c][0] // counts[c], sums[c][1] // counts[c], sums[c][2] // counts[c]), 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/variety/RedditDownloader.py0000664000000000000000000000713012641771550014731 0ustar # -*- 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 random import urlparse import logging import re from variety import Downloader from variety.Util import Util logger = logging.getLogger('variety') random.seed() class RedditDownloader(Downloader.Downloader): def __init__(self, parent, url): super(RedditDownloader, self).__init__(parent, "reddit", "Reddit", url) self.queue = [] def convert_to_filename(self, url): return "reddit_" + super(RedditDownloader, self).convert_to_filename(url) @staticmethod def build_json_url(url): p = urlparse.urlparse(url) return p.scheme + '://' + p.netloc + p.path + '.json' + '?' + p.query + ('&' if p.query else '') + 'limit=100' @staticmethod def validate(url): logger.info(lambda: "Validating Reddit url " + url) try: if not url.startswith("http://") and not url.startswith("https://"): url = "http://" + url if not '//reddit.com' in url and not '//www.reddit.com' in url: return False dl = RedditDownloader(None, url) dl.fill_queue() return len(dl.queue) > 0 except Exception: logger.exception(lambda: "Error while validating URL, probably no image posts for this URL") return False def download_one(self): logger.info(lambda: "Downloading an image from Reddit, " + self.location) logger.info(lambda: "Queue size: %d" % len(self.queue)) if not self.queue: self.fill_queue() if not self.queue: logger.info(lambda: "Reddit queue empty after fill") return None origin_url, image_url, extra_metadata = self.queue.pop() return self.save_locally(origin_url, image_url, extra_metadata=extra_metadata) def fill_queue(self): logger.info(lambda: "Reddit URL: " + self.location) json_url = RedditDownloader.build_json_url(self.location) 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 = 'http://www.reddit.com' + data['permalink'] extra_metadata = {'sourceType': 'reddit'} if data['over_18']: extra_metadata['sfwRating'] = 0 self.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(self.queue) logger.info(lambda: "Reddit queue populated with %d URLs" % len(self.queue))variety/variety/indicator.py0000664000000000000000000003750012652624506013457 0ustar # -*- 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.""" from gi.repository import Gtk # pylint: disable=E0611 import os import threading from variety.Util import Util THEME_ICON_NAME = "variety-indicator" THEME_ICON_NAME_DARK = "variety-indicator-dark" try: from gi.repository import AppIndicator3 # pylint: disable=E0611 use_appindicator = True except ImportError: use_appindicator = False from variety_lib import varietyconfig from variety import _, _u import logging logger = logging.getLogger('variety') class Indicator: def __init__(self, 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_wallpaper) 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.image_menu.append(Gtk.SeparatorMenuItem.new()) self.publish_fb = Gtk.MenuItem(_("Share on Facebook")) self.publish_fb.connect("activate", window.publish_on_facebook) self.image_menu.append(self.publish_fb) 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.quote_fb = Gtk.MenuItem(_("Share on Facebook")) self.quote_fb.set_use_underline(True) self.quote_fb.connect("activate", window.publish_quote_on_facebook) self.quotes_menu.append(self.quote_fb) 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) try: from varietyslideshow import varietyslideshow except: logger.warning('Variety Slideshow is not installed. ' 'Install it with "sudo apt-get install variety-slideshow", ' 'read more here: http://peterlevi.com/variety/slideshow/') else: 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) 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.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): self.indicator = None self.status_icon = None self.visible = True def pos(menu, icon): return Gtk.StatusIcon.position_menu(self.menu, icon) def right_click_event(icon, button, time): self.menu.popup(None, None, pos, self.status_icon, 0, time) def left_click_event(data): self.menu.popup(None, None, pos, 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 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/variety/convert-metadata.py0000664000000000000000000000154512641771550014741 0ustar from Util import Util import sys import os if len(sys.argv) < 2: print "Usage: python convert-metadata.py " sys.exit(1) dir = sys.argv[1] for f in Util.list_files(files=(), folders=(dir,), filter_func=Util.is_image, max_files=1000000, randomize=False): try: if os.path.exists(f + ".txt"): info = Util.read_metadata(f) if info: print "Converting " + f if Util.write_metadata(f, info): print "OK. Deleting " + f + ".txt" os.unlink(f + ".txt") else: print "Writing metadata failed, leaving txt in peace" except Exception, e: print "Oops: " + str(e) variety/variety/FacebookFirstRunDialog.py0000664000000000000000000000456612641771550016037 0ustar # -*- 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 from variety import _, _u class FacebookFirstRunDialog(Gtk.Dialog): __gtype_name__ = "FacebookFirstRunDialog" def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated FacebookFirstRunDialog object. """ builder = get_builder('FacebookFirstRunDialog') new_object = builder.get_object('facebook_first_run_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 FacebookFirstRunDialog object with it in order to finish initializing the start of the new FacebookFirstRunDialog 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 if __name__ == "__main__": dialog = FacebookFirstRunDialog() dialog.show() Gtk.main() variety/variety/Downloader.py0000664000000000000000000001246112641771550013600 0ustar # -*- 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 string import re import logging from variety.Util import Util logger = logging.getLogger('variety') class Downloader(object): def __init__(self, parent, source_type, name, location, is_refresher=False): self.parent = parent self.source_type = source_type self.name = name self.location = location self.is_refresher = is_refresher def update_download_folder(self): filename = self.convert_to_filename(self.location) l = len(self.parent.real_download_folder) if len(filename) + l > 160: filename = filename[:(150 - l)] + Util.md5(filename)[:10] self.target_folder = os.path.join(self.parent.real_download_folder, filename) def convert_to_filename(self, 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) def get_local_filename(self, url): return os.path.join(self.target_folder, Util.get_local_name(url)) def is_in_downloaded(self, url): return os.path.exists(self.get_local_filename(url)) def is_in_favorites(self, url): return self.parent and os.path.exists(os.path.join(self.parent.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={}, local_filename=None): if not source_type: source_type = self.source_type if not source_name: source_name = self.name if not source_location: source_location = self.location if not force_download and self.parent and origin_url in self.parent.banned: logger.info(lambda: "URL " + origin_url + " is banned, skip downloading") return None try: os.makedirs(self.target_folder) except Exception: pass if not local_filename: local_filename = self.get_local_filename(image_url) logger.info(lambda: "Origin URL: " + origin_url) logger.info(lambda: "Image URL: " + image_url) logger.info(lambda: "Local name: " + local_filename) if not force_download and os.path.exists(local_filename): logger.info(lambda: "File already exists, skip downloading") return None try: data = Util.fetch(image_url) with open(local_filename, 'wb') as f: f.write(data) except Exception, e: logger.info(lambda: "Download failed from image URL: %s (source location: %s) " % (image_url, self.location)) raise e if not Util.is_image(local_filename, check_contents=True): logger.info(lambda: "Downloaded data was not an image, image URL might be outdated") os.unlink(local_filename) return None metadata = { "sourceType": source_type, "sourceName": source_name, "sourceLocation": source_location, "sourceURL": origin_url, "imageURL": image_url } metadata.update(extra_metadata) Util.write_metadata(local_filename, metadata) logger.info(lambda: "Download complete") return local_filename def parse_server_options(self, key, default_min_download_interval, default_min_fill_queue_interval): min_download_interval = default_min_download_interval min_fill_queue_interval = default_min_fill_queue_interval try: logger.info(lambda: "%s: parsing serverside options" % self.name) options = self.parent.server_options[key] logger.info(lambda: "%s serverside options: %s" % (self.name, str(options))) except Exception: logger.exception(lambda: "Could not parse %s serverside options, using defaults %d, %d" % ( self.name, min_download_interval, min_fill_queue_interval)) return min_download_interval, min_fill_queue_interval try: min_download_interval = int(options["min_download_interval"]) except Exception: logger.exception(lambda: "Bad or missing min_download_interval") try: min_fill_queue_interval = int(options["min_fill_queue_interval"]) except Exception: logger.exception(lambda: "Bad or missing min_fill_queue_interval") return min_download_interval, min_fill_queue_interval variety/variety/FlickrDownloader.py0000664000000000000000000002634112641771550014735 0ustar # -*- 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 import random import logging import time from variety import Downloader from variety.Util import Util logger = logging.getLogger('variety') random.seed() API_KEY = "0553a848c09bcfd21d3a984d9408c04e" class FlickrDownloader(Downloader.Downloader): last_download_time = 0 def __init__(self, parent, location): super(FlickrDownloader, self).__init__(parent, "flickr", "Flickr", location) self.parse_location() self.queue = [] self.last_fill_time = 0 def convert_to_filename(self, url): return "flickr_" + super(FlickrDownloader, self).convert_to_filename(url) def parse_location(self): s = self.location.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" % ( API_KEY, urllib.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, 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" % ( API_KEY, urllib.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, 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" % 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 download_one(self): min_download_interval, min_fill_queue_interval = self.parse_server_options("flickr", 60, 600) if time.time() - FlickrDownloader.last_download_time < min_download_interval: logger.info(lambda: "Minimal interval between Flickr downloads is %d, skip this attempt" % min_download_interval) return None logger.info(lambda: "Downloading an image from Flickr, " + self.location) logger.info(lambda: "Queue size: %d" % len(self.queue)) if not self.queue: if time.time() - self.last_fill_time < min_fill_queue_interval: logger.info(lambda: "Flickr queue empty, but minimal interval between fill attempts is %d, will try again later" % min_fill_queue_interval) return None self.fill_queue() if not self.queue: logger.info(lambda: "Flickr queue empty after fill - too restrictive search parameters or image size preference?") return None FlickrDownloader.last_download_time = time.time() urls = self.queue.pop() logger.info(lambda: "Photo URL: " + urls[0]) return self.save_locally(urls[0], urls[1], extra_metadata=urls[2]) def fill_queue(self): self.last_fill_time = time.time() logger.info(lambda: "Filling Flickr download queue: " + self.location) call = "https://api.flickr.com/services/rest/?method=flickr.photos.search" \ "&api_key=%s&per_page=500&tag_mode=all&format=json&nojsoncallback=1" % 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 self.queue) size_suffixes = ["o", "k", "h", "l"] for s in size_suffixes: self.process_photos_in_response(resp, s, used) if len(self.queue) > 20: break random.shuffle(self.queue) if len(self.queue) >= 20: self.queue = self.queue[:len(self.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 logger.info(lambda: "Flickr queue populated with %d URLs" % len(self.queue)) def process_photos_in_response(self, resp, size_suffix, used): logger.info(lambda: "Queue size is %d, populating with images for size suffix %s" % (len(self.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.parent and photo_url in self.parent.banned: 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.parent and not self.parent.size_ok(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(' '), 'description': ph['description']['_content'] } except: extra_metadata = {} logger.debug(lambda: "Appending to queue %s, %s" % (photo_url, image_file_url)) self.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' % \ (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' % \ (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/variety/plugins/0000775000000000000000000000000012657457236012616 5ustar variety/variety/plugins/__init__.py0000664000000000000000000000000012641771550014704 0ustar variety/variety/plugins/IQuoteSource.py0000664000000000000000000000370412641771550015552 0ustar # -*- 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 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/variety/plugins/IVarietyPlugin.py0000664000000000000000000000111212641771550016065 0ustar import os from jumble.IPlugin import IPlugin from variety.Util import Util class IVarietyPlugin(IPlugin): """ 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 variety/variety/AddFlickrDialog.py0000664000000000000000000001370412641771550014446 0ustar # -*- 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, Gdk # pylint: disable=E0611 from variety.FlickrDownloader import FlickrDownloader from variety.Options import Options from variety_lib.helpers import get_builder from variety import _, _u import logging import threading import urllib 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.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 params["user"].startswith("http://"): params["user"] = "http://" + params["user"] self.ui.user_url.set_text(params["user"]) if "group" in params: if not params["group"].startswith("http://"): params["group"] = "http://" + 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() def show_spinner(self): try: Gdk.threads_enter() 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("") finally: Gdk.threads_leave() def ok_thread(self): search = "" if len(self.ui.tags.get_text().strip()): search += "tags:" + ','.join([urllib.quote_plus(t.strip()) for t in self.ui.tags.get_text().split(',')]) + ";" if len(self.ui.text.get_text().strip()): search += "text:" + urllib.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") try: Gdk.threads_enter() 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() finally: Gdk.threads_leave() 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/variety/Smart.py0000664000000000000000000007542612641771550012602 0ustar # -*- 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 GObject, Gdk, Gtk import hashlib from urllib2 import HTTPError import io import webbrowser from variety.Util import Util, throttle from variety.Options import Options from variety.SmartFeaturesNoticeDialog import SmartFeaturesNoticeDialog from variety.SmartRegisterDialog import SmartRegisterDialog from variety.AttrDict import AttrDict from variety.ImageFetcher import ImageFetcher from variety import _, _u import os import logging import random import json import base64 import threading import time import sys random.seed() logger = logging.getLogger('variety') class Smart: SITE_URL = 'http://localhost:4000' if '--debug-smart' in sys.argv else 'https://vrty.org' API_URL = SITE_URL + '/api' META_KEYS_MAP = { 'sourceURL': 'origin_url', 'imageURL': 'image_url', 'sourceType': 'source_type', 'sourceLocation': 'source_location', 'sourceName': 'source_name', 'authorURL': 'author_url', 'sfwRating': 'sfw_rating', } def __init__(self, parent): self.parent = parent self.user = None self.load_user_lock = threading.Lock() try: self.load_user(create_if_missing=False) except: logger.exception(lambda: "Smart: Cound not load user during init") def reload(self): if not self.is_smart_enabled(): self._reset_sync() return try: if self.smart_settings_changed(): self.load_user(create_if_missing=False, force_reload=True) self.sync() elif self.parent.previous_options.sources != self.parent.options.sources: self.sync_sources(in_thread=True) except: logger.exception(lambda: "Smart: Exception in reload:") def get_profile_url(self): if self.user: return "%s/login/%s?authkey=%s" % (Smart.SITE_URL, self.user["id"], self.user.get('authkey', '')) else: return None def get_register_url(self, source): if self.user: return '%s/user/%s/register?authkey=%s&source=%s' % (Smart.SITE_URL, self.user['id'], self.user['authkey'], source) else: return '%s/register?source=%s' % (Smart.SITE_URL, source) def smart_settings_changed(self): return self.parent.previous_options is None or \ self.parent.previous_options.smart_enabled != self.parent.options.smart_enabled or \ self.parent.previous_options.sync_enabled != self.parent.options.sync_enabled or \ self.parent.previous_options.favorites_folder != self.parent.options.favorites_folder def load_user(self, create_if_missing=True, force_reload=False): with self.load_user_lock: if not self.user or force_reload: self.user = None try: with io.open(os.path.join(self.parent.config_folder, 'smart_user.json'), encoding='utf8') as f: data = f.read() try: self.user = AttrDict(json.loads(data)) except: logger.exception(lambda: "Smart: Could not json-parse smart_user.json. Broken file? " "Please report this error to peterlevi@peterlevi.com. Thanks.") self.parent.show_notification(_("Your smart_user.json config file appears broken. " "You may have to login again to VRTY.ORG.")) raise IOError("Could not json-parse smart_user.json") if self.parent.preferences_dialog: self.parent.preferences_dialog.on_smart_user_updated() logger.info(lambda: 'smart: Loaded smart user: %s' % self.user["id"]) except IOError: if create_if_missing: logger.info(lambda: 'smart: Missing smart_user.json, creating new smart user') self.new_user() def new_user(self): try: logger.info(lambda: 'smart: Creating new smart user') self._reset_sync() self.user = Util.fetch_json(Smart.API_URL + '/newuser') self.save_user() if self.parent.preferences_dialog: GObject.idle_add(self.parent.preferences_dialog.on_smart_user_updated) logger.info(lambda: 'smart: Created smart user: %s' % self.user["id"]) except: logging.error('smart: Error creating new smart user') raise def save_user(self): with io.open(os.path.join(self.parent.config_folder, 'smart_user.json'), 'w', encoding='utf8') as f: f.write(json.dumps(self.user, indent=4, ensure_ascii=False, encoding='utf8')) def set_user(self, user): logger.info(lambda: 'smart: Setting new smart user') # keep machine-dependent settings from current user if self.user: for key in ("machine_id", "machine_label"): if key in self.user: user[key] = self.user[key] self.user = user if self.parent.preferences_dialog: GObject.idle_add(self.parent.preferences_dialog.on_smart_user_updated) with open(os.path.join(self.parent.config_folder, 'smart_user.json'), 'w') as f: json.dump(self.user, f, ensure_ascii=False, indent=2) logger.info(lambda: 'smart: Updated smart user: %s' % self.user["id"]) self.sync() def report_trash(self, origin_url): if not self.is_smart_enabled(): return try: self.load_user() user = self.user logger.info(lambda: "smart: Reporting %s as trash" % origin_url) try: url = Smart.API_URL + '/upload/' + user['id'] + '/trash' result = Util.fetch(url, {'image': json.dumps({'origin_url': origin_url}), 'authkey': user['authkey']}) logger.info(lambda: "smart: Reported, server returned: %s" % result) return except HTTPError, e: self.handle_user_http_error(e) except Exception: logger.exception(lambda: "smart: Could not report %s as trash" % url) def report_file(self, filename, mark, async=True, upload_full_image=False, needs_reupload=False): if not self.is_smart_enabled(): return def _go(): self._do_report_file(filename, mark, upload_full_image=upload_full_image, needs_reupload=needs_reupload) _go() if not async else threading.Timer(0, _go).start() def handle_user_http_error(self, e): logger.error(lambda: "smart: Server returned %d, potential reason - server failure?" % e.code) if e.code in (403, 404): self.parent.show_notification( _('Your VRTY.ORG credentials are probably outdated. Please login again.')) Util.add_mainloop_task(self.parent.preferences_dialog.on_btn_login_register_clicked) raise e @staticmethod def fix_origin_url(origin_url): if origin_url and '//picasaweb.google.com' in origin_url and '?' in origin_url: origin_url = origin_url[:origin_url.rindex('?')] return origin_url @staticmethod def fill_missing_meta_info(filename, meta): try: if 'imageURL' not in meta: image_url = Util.guess_image_url(meta) if image_url: meta['imageURL'] = image_url Util.write_metadata(filename, meta) if 'sourceType' not in meta: source_type = Util.guess_source_type(meta) if source_type: meta['sourceType'] = source_type Util.write_metadata(filename, meta) if 'headline' not in meta: origin_url = meta['sourceURL'] if 'flickr.com' in origin_url: from variety.FlickrDownloader import FlickrDownloader extra_meta = FlickrDownloader.get_extra_metadata(origin_url) meta.update(extra_meta) Util.write_metadata(filename, meta) except: logger.exception(lambda: 'Could not fill missing meta-info') def _do_report_file(self, filename, mark, attempt=1, upload_full_image=False, needs_reupload=False): if not self.is_smart_enabled(): return try: self.load_user() user = self.user meta = Util.read_metadata(filename) if not meta or not "sourceURL" in meta: return # we only smart-report images coming from Variety online sources, not local images origin_url = Smart.fix_origin_url(meta['sourceURL']) if not (upload_full_image or needs_reupload): # Attempt quick-markging using just the computed image ID - will only succeed if the image already exists on the server try: logger.info(lambda: "smart: Quick-reporting %s as '%s'" % (filename, mark)) imageid = self.get_image_id(origin_url) report_url = Smart.API_URL + '/mark/%s/%s/+%s' % (user['id'], imageid, mark) result = Util.fetch(report_url, {'authkey': user['authkey']}) logger.info(lambda: "smart: Quick-reported, server returned: %s" % result) if 'needs_reupload' in result: logger.info(lambda: "smart: Server requested full image data, " "performing full report") else: return except: logger.info(lambda: "smart: Image unknown to server, performing full report") width, height = Util.get_size(filename) Smart.fill_missing_meta_info(filename, meta) image_url = meta.get('imageURL', None) image = { 'thumbnail': base64.b64encode(Util.get_thumbnail_data(filename, 1024, 1024)), 'width': width, 'height': height, 'filename': os.path.basename(filename), 'origin_url': origin_url, 'image_url': image_url, } for key, value in meta.items(): server_key = Smart.META_KEYS_MAP.get(key, key) if not server_key in image: image[server_key] = value logger.info(lambda: "smart: Reporting %s as '%s'" % (filename, mark)) # check for dead links and upload full image in that case (happens with old favorites): if upload_full_image or (mark == 'favorite' and Util.is_dead_or_not_image(image_url)): if upload_full_image: logger.info(lambda: 'smart: Including full image in upload per server request') else: logger.info(lambda: 'smart: Including full image in upload as image link seems dead: %s, sourceURL: %s' % (image_url, origin_url)) with open(filename, 'r') as f: image['full_image'] = base64.b64encode(f.read()) report_url = Smart.API_URL + '/upload/%s/%s' % (user['id'], mark) try: result = Util.fetch(report_url, {'image': json.dumps(image), 'authkey': user['authkey']}) logger.info(lambda: "smart: Reported, server returned: %s" % result) return except HTTPError, e: self.handle_user_http_error(e) if attempt == 1: self._do_report_file(filename, mark, attempt + 1) else: logger.exception(lambda: "smart: Could not report %s as '%s, server error code %s'" % (filename, mark, e.code)) except Exception: logger.exception(lambda: "smart: Could not report %s as '%s'" % (filename, mark)) def show_notice_dialog(self): # Show Smart Variety notice dialog = SmartFeaturesNoticeDialog() def _done(): self.parent.options.smart_notice_shown = True self.parent.options.write() self.parent.reload_config() dialog.destroy() self.parent.dialogs.remove(dialog) def _on_ok(button): self.parent.options.smart_enabled = dialog.ui.smart_enabled.get_active() if self.parent.options.smart_enabled: for s in self.parent.options.sources: if s[1] in (Options.SourceType.RECOMMENDED,): s[0] = True _done() def _on_no(*args): self.parent.options.smart_enabled = False _done() dialog.ui.btn_ok.connect("clicked", _on_ok) dialog.ui.btn_no.connect("clicked", _on_no) dialog.connect("delete-event", _on_no) self.parent.dialogs.append(dialog) dialog.run() def show_register_dialog(self): self.load_user(create_if_missing=False) if self.is_registered(): self.parent.options.smart_register_shown = True self.parent.options.write() return self.register_dialog = SmartRegisterDialog() def _register_link(*args): self.register_dialog.ui.register_error.set_visible(False) self.register_dialog.ui.register_spinner.set_visible(True) self.register_dialog.ui.register_spinner.start() def _register(): error = False try: self.load_user(create_if_missing=True) webbrowser.open_new_tab(self.get_register_url('variety_register_dialog')) except IOError: error = True finally: def _stop_spinner(): self.register_dialog.ui.register_spinner.set_visible(False) self.register_dialog.ui.register_spinner.stop() self.register_dialog.ui.register_error.set_visible(error) self.register_dialog.ui.register_message.set_visible(not error) GObject.idle_add(_stop_spinner) threading.Timer(0, _register).start() self.register_dialog.ui.btn_register.connect('activate-link', _register_link) self.parent.dialogs.append(self.register_dialog) self.register_dialog.run() result = self.register_dialog.result try: self.parent.dialogs.remove(self.register_dialog) except: pass self.register_dialog.destroy() self.register_dialog = None if not self.parent.running: return self.parent.options.smart_register_shown = True self.parent.options.write() if result == 'login': self.parent.preferences_dialog.on_btn_login_register_clicked() def load_syncdb(self): logger.debug(lambda: "sync: Loading syncdb") syncdb_file = os.path.join(self.parent.config_folder, 'syncdb.json') try: with io.open(syncdb_file, encoding='utf8') as f: data = f.read() syncdb = AttrDict(json.loads(data)) except: syncdb = AttrDict(version=1, local={}, remote={}) return syncdb @throttle(seconds=5, trailing_call=True) def write_syncdb(self, syncdb): syncdb_file = os.path.join(self.parent.config_folder, 'syncdb.json') with io.open(syncdb_file, "w", encoding='utf8') as f: f.write(json.dumps(syncdb.asdict(), indent=4, ensure_ascii=False, encoding='utf8')) @staticmethod def get_image_id(url): return base64.urlsafe_b64encode(hashlib.md5(url).digest())[:10].replace('-', 'a').replace('_', 'b').lower() def is_smart_enabled(self): return self.parent.options.smart_notice_shown and self.parent.options.smart_enabled def is_registered(self): return self.user is not None and self.user.get("username") is not None def is_sync_enabled(self): return self.is_smart_enabled() and self.is_registered() and self.parent.options.sync_enabled def sync_sources(self, in_thread=False): if not self.is_smart_enabled(): return def _run(): try: logger.info(lambda: "sync: Syncing image sources") try: self.load_user(create_if_missing=True) except: logger.exception(lambda: "sync: Could not load or create smart user") return sources = [{'enabled': s[0], 'type': Options.type_to_str(s[1]), 'location': s[2]} for s in self.parent.options.sources if s[1] in Options.SourceType.dl_types] data = {'sources': sources, 'machine_type': Util.get_os_name()} if "machine_id" in self.user: data["machine_id"] = self.user["machine_id"] try: sync_url = '%s/user/%s/sync-sources?authkey=%s' % (Smart.API_URL, self.user["id"], self.user["authkey"]) server_data = AttrDict(Util.fetch_json(sync_url, {'data': json.dumps(data)})) self.user["machine_id"] = server_data["machine_id"] self.user["machine_label"] = server_data["machine_label"] self.save_user() except HTTPError, e: self.handle_user_http_error(e) raise except: logger.exception(lambda: "smart: Could not sync sources") if in_thread: sync_sources_thread = threading.Thread(target=_run) sync_sources_thread.daemon = True sync_sources_thread.start() else: _run() def _reset_sync(self): self.sync_hash = Util.random_hash() # stop current sync if running self.last_synced = 0 def sync(self): if not self.is_smart_enabled(): return self._reset_sync() current_sync_hash = self.sync_hash def _run(): logger.info(lambda: 'sync: Started, hash %s' % current_sync_hash) try: self.load_user(create_if_missing=True) except: logger.exception(lambda: "sync: Could not load or create smart user") return self.sync_sources(in_thread=False) try: logger.info(lambda: "sync: Fetching serverside data") try: sync_url = '%s/user/%s/sync?authkey=%s' % (Smart.API_URL, self.user["id"], self.user["authkey"]) server_data = AttrDict(Util.fetch_json(sync_url)) throttle_interval = int(server_data.throttle_interval) if server_data.throttle_interval else 1 except HTTPError, e: self.handle_user_http_error(e) raise syncdb = self.load_syncdb() # First upload local favorites that need uploading: logger.info(lambda: "sync: Uploading local favorites to server") files = os.listdir(self.parent.options.favorites_folder) files = [os.path.join(self.parent.options.favorites_folder, f) for f in files] files = filter(lambda f: os.path.isfile(f) and Util.is_image(f), files) files.sort(key=os.path.getmtime) for path in files: try: if not self.is_smart_enabled() or current_sync_hash != self.sync_hash: return name = os.path.basename(path) if path in syncdb.local: info = syncdb.local[path] else: info = {} meta = Util.read_metadata(path) source_url = Smart.fix_origin_url(None if meta is None else meta.get("sourceURL", None)) if source_url: info["sourceURL"] = source_url syncdb.local[path] = info self.write_syncdb(syncdb) if not "sourceURL" in info: continue imageid = self.get_image_id(info["sourceURL"]) if not "success" in syncdb.remote[imageid]: syncdb.remote[imageid] = {"success": True} self.write_syncdb(syncdb) if imageid in server_data["ignore"]: logger.warning(lambda: 'sync: Skipping upload of %s as it is has been deleted from your profile. ' 'To undo this visit: %s' % (name, Smart.SITE_URL + '/image/' + imageid)) continue if not imageid in server_data["favorite"]: logger.info(lambda: "sync: Smart-reporting existing favorite %s" % path) self.report_file(path, "favorite", async=False) time.sleep(throttle_interval) elif "upload_full_image" in server_data["favorite"][imageid]: logger.info(lambda: "sync: Uploading full image for existing favorite %s" % path) self.report_file(path, "favorite", async=False, upload_full_image=True) time.sleep(throttle_interval) elif "needs_reupload" in server_data["favorite"][imageid]: logger.info(lambda: "sync: Server requested reupload of existing favorite %s" % path) self.report_file(path, "favorite", async=False, needs_reupload=True) time.sleep(throttle_interval) except: logger.exception(lambda: "sync: Could not process file %s" % name) # Upload locally trashed URLs logger.info(lambda: "sync: Uploading local banned URLs to server") for url in self.parent.banned: if not self.is_smart_enabled() or current_sync_hash != self.sync_hash: return imageid = self.get_image_id(url) if not imageid in server_data["trash"]: self.report_trash(url) time.sleep(throttle_interval) # Perform server to local downloading only if Sync is enabled if self.is_sync_enabled(): # Append locally missing trashed URLs to banned list local_trash = map(self.get_image_id, self.parent.banned) for imageid in server_data["trash"]: if not self.is_sync_enabled() or current_sync_hash != self.sync_hash: return if not imageid in local_trash: image_data = Util.fetch_json(Smart.API_URL + '/image/' + imageid) self.parent.ban_url(image_data["origin_url"]) time.sleep(throttle_interval) # Download locally-missing favorites from the server to_sync = [] for imageid in server_data["favorite"]: if imageid in server_data["ignore"]: logger.warning(lambda: 'sync: Skipping download of %s as it is has been deleted from your profile. ' 'To undo this visit: %s' % (imageid, Smart.SITE_URL + '/image/' + imageid)) continue if imageid in server_data["trash"]: # do not download favorites that have later been trashed logger.info(lambda: 'sync: Skipping download of %s as it is also in trash. ' % imageid) continue if imageid in syncdb.remote: if 'success' in syncdb.remote[imageid]: continue # we have this image locally if syncdb.remote[imageid].get('error', 0) >= 3: continue # we have tried and got error for this image 3 or more times, leave it alone to_sync.append(imageid) if to_sync: self.parent.show_notification( _("Sync"), (_("Fetching %d images") % len(to_sync)) if len(to_sync) != 1 else _("Fetching 1 image")) for imageid in to_sync: if not self.is_sync_enabled() or current_sync_hash != self.sync_hash: return try: logger.info(lambda: "sync: Downloading locally-missing favorite image %s" % imageid) image_data = Util.fetch_json(Smart.API_URL + '/image/' + imageid) prefer_source_id = server_data["favorite"][imageid].get("source", None) source = image_data.get("sources", {}).get(prefer_source_id, None) image_url, origin_url, source_type, source_location, source_name, extra_metadata = \ Smart.extract_fetch_data(image_data) path = ImageFetcher.fetch(image_url, self.parent.options.favorites_folder, origin_url=origin_url, source_type=source[0] if source else source_type, source_location=source[1] if source else source_location, source_name=source[2] if source else source_name, extra_metadata=extra_metadata, verbose=False) if not path: raise Exception("Fetch failed") self.parent.register_downloaded_file(path) syncdb.remote[imageid] = {"success": True} syncdb.local[path] = {'sourceURL': image_data["origin_url"]} except: logger.exception(lambda: "sync: Could not fetch favorite image %s" % imageid) syncdb.remote[imageid] = syncdb.remote[imageid] or {} syncdb.remote[imageid].setdefault("error", 0) syncdb.remote[imageid]["error"] += 1 finally: if not self.is_smart_enabled() or current_sync_hash != self.sync_hash: return self.write_syncdb(syncdb) time.sleep(throttle_interval) if to_sync: self.parent.show_notification(_("Sync"), _("Finished")) self.last_synced = time.time() except: logger.exception(lambda: 'sync: Error') finally: self.syncing = False sync_thread = threading.Thread(target=_run) sync_thread.daemon = True sync_thread.start() def sync_if_its_time(self): if not self.is_smart_enabled(): return last_synced = getattr(self, 'last_synced', 0) if time.time() - last_synced > 6 * 60 * 3600: self.sync() def process_login_request(self, userid, username, authkey): def _do_login(): self.parent.show_notification(_('Logged in as %s') % username) self.set_user({'id': userid, 'authkey': authkey, 'username': username}) self.parent.preferences_dialog.close_login_register_dialog() if hasattr(self, "register_dialog") and self.register_dialog: def _close(): self.register_dialog.result = 'logged' self.register_dialog.response(Gtk.ResponseType.OK) GObject.idle_add(_close) if self.user is None or self.user['authkey'] != authkey: def _go(): dialog = Gtk.MessageDialog(self.parent.preferences_dialog, Gtk.DialogFlags.MODAL, Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL) dialog.set_markup(_('Do you want to login to VRTY.ORG as %s?') % username) dialog.set_title(_('VRTY.ORG login confirmation')) dialog.set_default_response(Gtk.ResponseType.OK) response = dialog.run() dialog.destroy() if response == Gtk.ResponseType.OK: _do_login() Util.add_mainloop_task(_go) else: _do_login() @staticmethod def extract_fetch_data(json_image_data): image = AttrDict(json_image_data) origin_url = image.origin_url image_url, source_type, source_location, source_name, extra_metadata = None, None, None, None, {} if image.download_url: image_url = image.download_url if image.sources: source = image.sources.values()[0] source_type = source[0] source_location = source[1] source_name = image.origin_name or source[2] if image.author and image.author_url: extra_metadata['author'] = image.author extra_metadata['authorURL'] = image.author_url if image.keywords and isinstance(image.keywords, list): extra_metadata['keywords'] = image.keywords if image.headline: extra_metadata['headline'] = image.headline if image.description: extra_metadata['description'] = image.description if "sfw_rating" in image and image.sfw_rating is not None: extra_metadata['sfwRating'] = image.sfw_rating return image_url, origin_url, source_type, source_location, source_name, extra_metadatavariety/variety/ThumbsManager.py0000664000000000000000000003610512641771550014240 0ustar # -*- 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, Gdk, GdkPixbuf, GObject from configobj import ConfigObj import os import threading import logging import webbrowser from variety.Util import Util from variety.ThumbsWindow import ThumbsWindow from variety_lib import varietyconfig from variety import _, _u 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 = dict((v, k) for (k,v) in POSITIONS.items()) SIZES = [x*30 for x in xrange(2, 11)] class Options(): def __init__(self): self.position = ThumbsWindow.BOTTOM self.breadth = 120 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) 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) 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(gdk_thread=True, 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 xrange(5, 0, -1): item = Gtk.CheckMenuItem(u"\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(gdk_thread=True, keep_settings=True) if self.images: self.show(self.images, gdk_thread=True, 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 pin(self, widget=None): self.pinned = True def on_click(self, thumbs_window, file, widget, event): file = _u(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(a, b, event=event): 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, gdk_thread=False, screen=None, type=None, folders=None): with self.show_thumbs_lock: self.type = type self.images = images self.screen = screen self.folders = folders try: if self.thumbs_window: try: if not gdk_thread: Gdk.threads_enter() self.thumbs_window.destroy() self.thumbs_window = None finally: if not gdk_thread: Gdk.threads_leave() if len(self.images) > 0: self.initialize_thumbs_window(gdk_thread=gdk_thread) except Exception: logger.exception(lambda: "Could not create thumbs window:") def initialize_thumbs_window(self, gdk_thread=False): try: if not gdk_thread: Gdk.threads_enter() options = self.load_options() 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(gdk_thread=True, 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) finally: if not gdk_thread: Gdk.threads_leave() def load_options(self): options = ThumbsManager.Options() options.position = ThumbsWindow.BOTTOM options.breadth = 120 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") except Exception: logger.exception(lambda: "Could not read ui.conf") 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.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, gdk_thread=False, 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: try: try: if not gdk_thread: Gdk.threads_enter() self.thumbs_window.destroy() self.thumbs_window = None self.parent.update_indicator(is_gtk_thread=True, auto_changed=False) finally: if not gdk_thread: Gdk.threads_leave() except Exception: pass def remove_image(self, file, gdk_thread=True): 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, gdk_thread) def add_image(self, file, gdk_thread=True): self.images.insert(0, file) if not self.thumbs_window: self.initialize_thumbs_window(gdk_thread=gdk_thread) else: self.thumbs_window.add_image(file, gdk_thread, at_front=True) def is_showing(self, type): return self.type == type def get_folders(self): return self.folders variety/variety/CalibrateDominantColors.py0000664000000000000000000000171312641771550016242 0ustar import 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 xrange(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/variety/LoginOrRegisterDialog.py0000664000000000000000000001026112641772700015672 0ustar # -*- 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, GObject # pylint: disable=E0611 import logging import threading import urllib2 from variety.Util import Util from variety.Smart import Smart from variety_lib.helpers import get_builder import gettext from gettext import gettext as _ gettext.textdomain('variety') logger = logging.getLogger('variety') class LoginOrRegisterDialog(Gtk.Dialog): __gtype_name__ = "LoginOrRegisterDialog" def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated LoginOrRegisterDialog object. """ builder = get_builder('LoginOrRegisterDialog') new_object = builder.get_object('login_or_register_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 LoginOrRegisterDialog object with it in order to finish initializing the start of the new LoginOrRegisterDialog instance. """ # Get a reference to the builder and set up the signals. self.builder = builder self.smart = None self.ui = builder.get_ui(self) def set_smart(self, smart): self.smart = smart self.ui.password_link.set_uri('%s/password-recovery' % Smart.SITE_URL) if not self.smart.user or 'username' in self.smart.user: self.ui.register_link.set_uri('%s/register' % Smart.SITE_URL) else: self.ui.register_link.set_uri(self.smart.get_register_url('variety_login_dialog')) def show_login_error(self, msg): def _go(): self.ui.login_error.set_text(msg) self.ui.login_error.set_visible(True) self.ui.login_spinner.set_visible(False) self.ui.login_spinner.stop() GObject.idle_add(_go) def ajax(self, url, data, error_msg_handler): try: return Util.fetch_json(url, data) except urllib2.HTTPError, e: logger.exception(lambda: 'HTTPError for ' + url) error_msg_handler(_('Oops, server returned error (%s)') % e.code) raise except urllib2.URLError: logger.exception(lambda: 'Connection error for ' + url) error_msg_handler(_('Could not connect to server')) raise def on_btn_cancel_clicked(self, widget=None): self.response(Gtk.ResponseType.CANCEL) def on_btn_login_clicked(self, widget=None): self.ui.login_error.set_visible(False) self.ui.login_spinner.set_visible(True) self.ui.login_spinner.start() def _go(): result = self.ajax(Smart.API_URL + '/login', {'username': self.ui.login_username.get_text(), 'password': self.ui.login_password.get_text()}, self.show_login_error) def _update(): if 'error' in result: self.show_login_error(_(result['error'])) else: self.smart.set_user(result) self.destroy() GObject.idle_add(_update) threading.Timer(0, _go).start() if __name__ == "__main__": dialog = LoginOrRegisterDialog() dialog.show() Gtk.main() variety/variety/QuoteWriter.py0000664000000000000000000001267012641771550013776 0ustar # -*- 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 cairo from PIL import Image from gi.repository import Gdk, Pango, PangoCairo, GdkPixbuf, GObject from variety.Util import Util import threading class QuoteWriter: @staticmethod def write_quote(quote, author, infile, outfile, options=None): done_event = threading.Event() w, h = Util.get_scaled_size(infile) exception = [None] def go(): try: 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, e: exception[0] = e finally: done_event.set() GObject.idle_add(go) done_event.wait() if exception[0]: raise exception[0] @staticmethod def load_cairo_surface(filename, w, h): 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): size = surface.get_width(), surface.get_height() image = Image.frombuffer('RGBA', size, surface.get_data(), 'raw', 'BGRA', 0, 1) image.save(filename, quality=100) @staticmethod def write_quote_on_surface(surface, quote, author=None, options=None, margin=30): qcontext = cairo.Context(surface) acontext = cairo.Context(surface) iw = surface.get_width() ih = surface.get_height() sw = Gdk.Screen.get_default().get_width() sh = Gdk.Screen.get_default().get_height() 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 "Bitstream Charter 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.jpg") variety/variety/SmartRegisterDialog.py0000664000000000000000000000440712641772700015414 0ustar # -*- 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 import gettext from gettext import gettext as _ gettext.textdomain('variety') class SmartRegisterDialog(Gtk.Dialog): __gtype_name__ = "SmartRegisterDialog" def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated SmartRegisterDialog object. """ builder = get_builder('SmartRegisterDialog') new_object = builder.get_object('smart_register_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 SmartRegisterDialog object with it in order to finish initializing the start of the new SmartRegisterDialog instance. """ # Get a reference to the builder and set up the signals. self.builder = builder self.ui = builder.get_ui(self) self.result = "anonymous" def on_anonymous_clicked(self, widget): self.result = "anonymous" self.response(Gtk.ResponseType.CANCEL) def on_login_clicked(self, widget): self.result = "login" self.response(Gtk.ResponseType.OK) if __name__ == "__main__": dialog = SmartRegisterDialog() dialog.show() Gtk.main() variety/variety/AbstractAddByQueryDialog.py0000664000000000000000000000643712641771550016325 0ustar # -*- 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, Gdk # pylint: disable=E0611 import threading 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): try: Gdk.threads_enter() 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("") finally: Gdk.threads_leave() query = self.ui.query.get_text().strip() final_query, invalid_msg = self.validate(query) try: Gdk.threads_enter() 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() finally: Gdk.threads_leave() variety/variety/ThumbsWindow.py0000664000000000000000000003770212641771550014141 0ustar # -*- 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, Gdk, GdkPixbuf, GObject import threading import os import time import logging 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.running = True self.set_decorated(False) self.set_accept_focus(False) self.screen = screen if screen else Gdk.Screen.get_default() self.screen_width = self.screen.get_width() self.screen_height = self.screen.get_height() self.position = position self.breadth = int(breadth * (1 if self.is_horizontal() else float(self.screen_width) / self.screen_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 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 def start(self, images): self.images = images 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 _thumbs_thread(self): logger.debug(lambda: "Starting thumb thread %s, %d" % (str(self), time.time())) try: self.total_width = 0 shown = False for i, file in enumerate(self.images): if not self.running: try: Gdk.threads_enter() self.destroy() finally: Gdk.threads_leave() return if not shown: try: Gdk.threads_enter() self.set_default_size(10, 10) logger.debug(lambda: "Showing thumb window %s, %d" % (str(self), time.time())) self.show_all() if self.position == ThumbsWindow.BOTTOM: self.move(self.screen_width // 2, self.screen_height - self.breadth) elif self.position == ThumbsWindow.TOP: self.move(self.screen_width // 2, 0) elif self.position == ThumbsWindow.LEFT: self.move(0, self.screen_height // 2) elif self.position == ThumbsWindow.RIGHT: self.move(self.screen_width - self.screen_height, self.screen_height // 2) else: raise Exception("Unsupported thumbs position: " + str(self.position)) shown = True finally: Gdk.threads_leave() self.add_image(file, gdk_thread=False, at_front=False) # we must yield from time to time, or GTK/cairo errors abound still_visible = self.total_width < (self.screen_width if self.is_horizontal() else self.screen_height) time.sleep(0.02 if still_visible else 0.02) self.image_count = i except Exception: logger.exception(lambda: "Error while creating thumbs:") def add_image(self, file, gdk_thread=False, 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 try: if not gdk_thread: Gdk.threads_enter() 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_from_icon_name("folder", Gtk.IconSize.MENU) 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() finally: if not gdk_thread: Gdk.threads_leave() if file == self.active_file or position == self.active_position: self.mark_active(self.active_file, self.active_position) def update_size(self): if self.total_width < (self.screen_width if self.is_horizontal() else self.screen_height) + 1000: if self.position == ThumbsWindow.BOTTOM: self.move(max(0, (self.screen_width - self.total_width) // 2), self.screen_height - self.breadth) self.scroll.set_min_content_width(min(self.total_width, self.screen_width)) elif self.position == ThumbsWindow.TOP: self.move(max(0, (self.screen_width - self.total_width) // 2), 0) self.scroll.set_min_content_width(min(self.total_width, self.screen_width)) elif self.position == ThumbsWindow.LEFT: self.move(0, max(0, (self.screen_height - self.total_width) // 2)) self.scroll.set_min_content_height(min(self.total_width, self.screen_height)) elif self.position == ThumbsWindow.RIGHT: self.move(self.screen_width - self.breadth, max(0, (self.screen_height - self.total_width) // 2)) self.scroll.set_min_content_height(min(self.total_width, self.screen_height)) # TODO this method is buggy when width < screen and scrollbar not shown - a blank space remains def remove_image(self, image, gdk_thread=True): try: if not gdk_thread: Gdk.threads_enter() 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] finally: if not gdk_thread: Gdk.threads_leave() 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.screen_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] try: Gdk.threads_enter() 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) except Exception: pass finally: Gdk.threads_leave() 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) GObject.threads_init() Gdk.threads_init() Gdk.threads_enter() print "gtk main" Gtk.main() Gdk.threads_leave() variety/variety/AddMediaRssDialog.py0000664000000000000000000000356312641771550014745 0ustar # -*- 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.AbstractAddByQueryDialog import AbstractAddByQueryDialog from variety.MediaRssDownloader import MediaRssDownloader from variety.Options import Options from variety_lib.helpers import get_builder from variety import _ class AddMediaRssDialog(AbstractAddByQueryDialog): __gtype_name__ = "AddMediaRssDialog" def __new__(cls): builder = get_builder('AddMediaRssDialog') new_object = builder.get_object('add_media_rss_dialog') new_object.finish_initializing(builder) return new_object def validate(self, url): if not url.startswith("http://") and not url.startswith("https://"): url = "http://" + url valid = MediaRssDownloader.validate(url) return url, None if valid else _("This does not seem to be a valid Media RSS feed URL or there is no content there.") def commit(self, final_url): self.parent.on_add_dialog_okay(Options.SourceType.MEDIA_RSS, final_url, self.edited_row) if __name__ == "__main__": dialog = AddMediaRssDialog() dialog.show() Gtk.main() variety/variety/EditFavoriteOperationsDialog.py0000664000000000000000000000506512641771550017255 0ustar # -*- 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 from variety import _, _u 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/variety/WallbaseDownloader.py0000664000000000000000000001541212641771550015252 0ustar # -*- 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 import random import logging import time from variety import Downloader from variety.Util import Util logger = logging.getLogger('variety') random.seed() class WallbaseDownloader(Downloader.Downloader): last_download_time = 0 def __init__(self, parent, location): super(WallbaseDownloader, self).__init__(parent, "wallbase", "Wallbase.cc", location) self.parse_location() self.last_fill_time = 0 self.queue = [] def convert_to_filename(self, url): return "wallbase_" + super(WallbaseDownloader, self).convert_to_filename(url) def parse_location(self): if self.location.startswith(('http://', 'https://')): # location is an URL, use it self.url = self.location return elif 'type:' not in self.location: # interpret location as keywords self.url = "http://wallbase.cc/search?q=%s§ion=wallpapers&order_mode=desc&order=favs&purity=100&board=213" % urllib.quote(self.location) return # else the lcoation is in the old format, parse it: s = self.location.split(';') params = {} for x in s: if len(x) and x.find(':') > 0: k, v = x.split(':') params[k.lower()] = v prefer_favs = params.get("order") == "favs" m = {"thpp": 60} if "nsfw" in params: m["purity"] = params["nsfw"] if "board" in params: m["board"] = params["board"] self.url = "http://wallbase.cc/search" if params["type"] == "text": m["q"] = params["query"] elif params["type"] == "color": m["color"] = params["color"] if prefer_favs: m["order"] = "favs" else: m["order"] = "random" data = urllib.urlencode(m) self.url = self.url + "?" + data def search(self, start_from=None): url = self.url + ("&" if "?" in self.url else "?") + "thpp=60" if self.parent and self.parent.options.min_size_enabled and not "res=" in url: url += "&res_opt=gteq&res=%dx%d" % (max(100, self.parent.min_width), max(100, self.parent.min_height)) if start_from: url = url.replace('?', '/%d?' % start_from, 1) logger.info(lambda: "Performing wallbase search: url=%s" % url) return Util.html_soup(url) @staticmethod def validate(location): logger.info(lambda: "Validating Wallbase location " + location) try: s = WallbaseDownloader(None, location).search() wall = s.find("div", "thumbnail") if not wall: return False link = wall.find("img", "file") return link is not None except Exception: logger.exception(lambda: "Error while validating wallbase search") return False def download_one(self): min_download_interval, min_fill_queue_interval = self.parse_server_options("wallbase", 0, 0) if time.time() - WallbaseDownloader.last_download_time < min_download_interval: logger.info(lambda: "Minimal interval between Wallbase downloads is %d, skip this attempt" % min_download_interval) return None logger.info(lambda: "Downloading an image from Wallbase.cc, " + self.location) logger.info(lambda: "Queue size: %d" % len(self.queue)) if not self.queue: if time.time() - self.last_fill_time < min_fill_queue_interval: logger.info(lambda: "Wallbase queue empty, but minimal interval between fill attempts is %d, " "will try again later" % min_fill_queue_interval) return None self.fill_queue() if not self.queue: logger.info(lambda: "Wallbase queue still empty after fill request") return None WallbaseDownloader.last_download_time = time.time() wallpaper_url = self.queue.pop() logger.info(lambda: "Wallpaper URL: " + wallpaper_url) s = Util.html_soup(wallpaper_url) src_url = s.find('img', 'wall')['src'] logger.info(lambda: "Image src URL: " + src_url) return self.save_locally(wallpaper_url, src_url) def fill_queue(self): self.last_fill_time = time.time() logger.info(lambda: "Filling wallbase queue: " + self.location) start_from = None not_random = not "order=random" in self.url if not_random: start_from = random.randint(0, 300 - 60) s = self.search(start_from=start_from) else: s = self.search() thumbs = s.find_all('div', 'thumbnail') if start_from and not thumbs: # oops, no results - probably too few matches, use the first page of results logger.info(lambda: "Nothing found when using start index %d, rerun with no start index" % start_from) s = self.search() thumbs = s.find_all('div', 'thumbnail') for thumb in thumbs: try: p = map(int, thumb.find('span', 'reso').contents[0].split('x')) width = p[0] height = p[1] if self.parent and not self.parent.size_ok(width, height): continue except Exception: # missing or unparseable resolution - consider ok pass try: link = thumb.find('a', target='_blank')["href"] if self.parent and link in self.parent.banned: continue self.queue.append(link) except Exception: logger.debug(lambda: "Missing link for thumbnail") random.shuffle(self.queue) if not_random and len(self.queue) >= 20: self.queue = self.queue[:len(self.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 logger.info(lambda: "Wallbase queue populated with %d URLs" % len(self.queue)) variety/variety/SmartFeaturesConfirmationDialog.py0000664000000000000000000000412612641772700017755 0ustar # -*- 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 import gettext from gettext import gettext as _ gettext.textdomain('variety') class SmartFeaturesConfirmationDialog(Gtk.Dialog): __gtype_name__ = "SmartFeaturesConfirmationDialog" def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated SmartFeaturesConfirmationDialog object. """ builder = get_builder('SmartFeaturesConfirmationDialog') new_object = builder.get_object('smart_features_confirmation_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 SmartFeaturesConfirmationDialog object with it in order to finish initializing the start of the new SmartFeaturesConfirmationDialog 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 = SmartFeaturesConfirmationDialog() dialog.show() Gtk.main() variety/variety/__init__.py0000664000000000000000000001675712641772700013253 0ustar # -*- 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 gettext import logging gettext.textdomain('variety') import os import sys def _u(s): if s is None: return s if isinstance(s, unicode): return s else: return unicode(s, 'utf8') def _str(s): if s is None: return s if isinstance(s, unicode): return s.encode('utf8') else: return str(s) def _(text): # Use "from locale import gettext" if we are deploying to /opt/extras # Use "from gettext import gettext" when using standard Debian deployment from gettext import gettext as _ return _u(_(text)) def safe_print(text, ascii_text=None): """ 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) 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 class SafeLogger(logging.Logger): """ Fixes UnicodeDecodeErrors errors in logging calls: Accepts lambda instead of string messages. Catches errors when evaluatiating the passed lambda. """ def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None): try: new_msg = msg if isinstance(msg, basestring) else msg() except: locale_info = 'Unknown' try: import os 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(SafeLogger, self).makeRecord(name, level, fn, lno, new_msg, args, exc_info, func, extra) logging.setLoggerClass(SafeLogger) # # 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') import signal import dbus, dbus.service, dbus.glib import logging from gi.repository import Gtk, Gdk, GObject # pylint: disable=E0611 from variety import VarietyWindow from variety import ThumbsManager from variety import ThumbsWindow from variety.Util import Util from variety_lib import set_up_logging DBUS_KEY = 'com.peterlevi.Variety' 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(DBUS_KEY, bus = dbus.SessionBus()) dbus.service.Object.__init__(self, bus_name, DBUS_PATH) @dbus.service.method(dbus_interface=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...") global VARIETY_WINDOW if VARIETY_WINDOW: GObject.idle_add(VARIETY_WINDOW.on_quit) Util.start_force_exit_thread(10) def monkeypatch_ssl(): """ HTTPS connections may fail on Ubuntu 12.04 to servers with disabled SSL with this error: URLError: . This monkeypatching routine fixes the issue by forcing it to use TLSv1 instead of SSL. Solution copied from http://askubuntu.com/questions/116020/python-https-requests-urllib2-to-some-sites-fail-on-ubuntu-12-04-without-proxy """ import functools import ssl old_init = ssl.SSLSocket.__init__ @functools.wraps(old_init) def ubuntu_openssl_bug_965371(self, *args, **kwargs): kwargs['ssl_version'] = ssl.PROTOCOL_TLSv1 old_init(self, *args, **kwargs) ssl.SSLSocket.__init__ = ubuntu_openssl_bug_965371 def main(): # Ctrl-C signal.signal(signal.SIGINT, sigint_handler) signal.signal(signal.SIGTERM, sigint_handler) signal.signal(signal.SIGQUIT, sigint_handler) Util.makedirs(os.path.expanduser(u"~/.config/variety/")) arguments = map(_u, sys.argv[1:]) # validate arguments and set up logging options, args = VarietyWindow.VarietyWindow.parse_options(arguments) set_up_logging(options) monkeypatch_ssl() if options.verbose > 2: Util.log_all(VarietyWindow.VarietyWindow) if options.verbose > 3: Util.log_all(ThumbsManager.ThumbsManager) Util.log_all(ThumbsWindow.ThumbsWindow) bus = dbus.SessionBus() # ensure singleton if bus.request_name(DBUS_KEY) != dbus.bus.REQUEST_NAME_REPLY_PRIMARY_OWNER: if not arguments: 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.") method = bus.get_object(DBUS_KEY, DBUS_PATH).get_dbus_method("process_command") result = method(arguments) if result: safe_print(result) return # 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) GObject.threads_init() Gdk.threads_init() Gdk.threads_enter() Gtk.main() Gdk.threads_leave() variety/variety/QuotesEngine.py0000664000000000000000000002617712641772700014117 0ustar # -*- 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 random import time from variety.plugins.IQuoteSource import IQuoteSource import logging import threading logger = logging.getLogger('variety') from variety import _, _u 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( map(lambda k: ("keyword", k), keywords) + map(lambda a: ("author", a), authors)) plugins = list(self.plugins) if not plugins: self.parent.show_notification(_("No quote plugins"), _("There are no quote plugins installed")) raise Exception("No quote plugins") if keywords or authors: plugins = [p for p in self.plugins if p["plugin"].supports_search()] if not plugins: self.parent.show_notification( _("No suitable quote plugins"), _("You have no quote plugins which support searching by keywords and authors")) 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") for q in quotes: if len(q["quote"]) < 250: 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(cached.values()) del cached[quote["quote"]] if not cached: del cached return quote variety/variety/VarietyWindow.py0000664000000000000000000036201412652624506014317 0ustar # -*- 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 io from variety import _, _u import subprocess import urllib from variety.VarietyOptionParser import VarietyOptionParser from variety.FacebookHelper import FacebookHelper from jumble.Jumble import Jumble from gi.repository import Gtk, Gdk, GdkPixbuf, GObject, Gio, Notify # pylint: disable=E0611 Notify.init("Variety") from variety_lib import varietyconfig import os import stat import shutil import threading import time import logging import random import re import urlparse import webbrowser random.seed() logger = logging.getLogger('variety') from variety.AboutVarietyDialog import AboutVarietyDialog from variety.WelcomeDialog import WelcomeDialog from variety.PreferencesVarietyDialog import PreferencesVarietyDialog from variety.FacebookFirstRunDialog import FacebookFirstRunDialog from variety.FacebookPublishDialog import FacebookPublishDialog from variety.DominantColors import DominantColors from variety.WallpapersNetDownloader import WallpapersNetDownloader from variety.WallbaseDownloader import WallbaseDownloader from variety.WallhavenDownloader import WallhavenDownloader from variety.RedditDownloader import RedditDownloader from variety.BingDownloader import BingDownloader from variety.UnsplashDownloader import UnsplashDownloader from variety.PanoramioDownloader import PanoramioDownloader from variety.DesktopprDownloader import DesktopprDownloader from variety.APODDownloader import APODDownloader from variety.FlickrDownloader import FlickrDownloader from variety.MediaRssDownloader import MediaRssDownloader from variety.EarthDownloader import EarthDownloader, EARTH_ORIGIN_URL from variety.Options import Options from variety.ImageFetcher import ImageFetcher from variety.Util import Util, throttle, debounce from variety.ThumbsManager import ThumbsManager from variety.QuotesEngine import QuotesEngine from variety.QuoteWriter import QuoteWriter from variety.Smart import Smart from variety import indicator DL_FOLDER_FILE = ".variety_download_folder" class VarietyWindow(Gtk.Window): __gtype_name__ = "VarietyWindow" SERVERSIDE_OPTIONS_URL = "http://tiny.cc/variety-options-051" OUTDATED_SET_WP_SCRIPTS = { "b8ff9cb65e3bb7375c4e2a6e9611c7f8", "3729d3e1f57aa1159988ba2c8f929389", "feafa658d9686ecfabdbcf236c32fd0f", "83d8ebeec3676474bdd90c55417e8640", "1562cb289319aa39ac1b37a8ee4c0103", "6c54123e87e98b15d87f0341d3e36fc5", "3f9fcc524bfee8fb146d1901613d3181", "40db8163e22fbe8a505bfd1280190f0d", # 0.4.14, 0.4.15 "59a037428784caeb0834a8dd7897a88b", # 0.4.16, 0.4.17 "e4510e39fd6829ef550e128a1a4a036b", # 0.4.18 "d8d6a6c407a3d02ee242e9ce9ceaf293", # 0.4.19 "fdb69a2b16c62594c0fc12318ec58023", # 0.4.20 "236fa00c42af82904eaaecf2d460d21f", # 0.5.5 } OUTDATED_GET_WP_SCRIPTS = { "d8df22bf24baa87d5231e31027e79ee5", "822aee143c6b3f1166e5d0a9c637dd16", # 0.4.16, 0.4.17 "367f629e2f24ad8040e46226b18fdc81", # 0.4.18, 0.4.19 } def __init__(self): pass 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.thumbs_manager = ThumbsManager(self) self.quotes_engine = None self.quote = None self.quote_favorites_contents = '' self.clock_thread = None self.prepare_config_folder() self.perform_upgrade() self.events = [] self.create_downloaders_cache() self.prepared = [] self.prepared_cleared = False self.prepared_lock = threading.Lock() self.prepared_from_downloads = [] self.downloaded = [] 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.load_banned() self.load_history() self.post_filter_filename = None if self.position < len(self.used): self.thumbs_manager.mark_active(file=self.used[self.position], position=self.position) self.jumble = Jumble([os.path.join(varietyconfig.get_data_path(), "plugins"), self.plugins_folder]) setattr(self.jumble, "parent", self) self.jumble.load() self.image_count = -1 self.image_colors_cache = {} self.smart = Smart(self) self.reload_config() self.load_last_change_time() self.update_indicator(auto_changed=False) self.start_threads() prepare_earth_timer = threading.Timer(0, self.prepare_earth_downloader) prepare_earth_timer.start() self.dialogs = [] self.first_run() def _delayed(): self.create_preferences_dialog() self.smart.reload() 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 self.about.run() self.about.destroy() self.about = None 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) self.preferences_dialog.present() 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 def prepare_config_folder(self): self.config_folder = os.path.expanduser(u"~/.config/variety") Util.makedirs(self.config_folder) shutil.copy(varietyconfig.get_data_file("config", "variety.conf"), os.path.join(self.config_folder, "variety_latest_default.conf")) 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")) shutil.copy(varietyconfig.get_data_file("config", "variety.conf"), self.config_folder) 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")) shutil.copy(varietyconfig.get_data_file("scripts", "set_wallpaper"), self.scripts_folder) 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")) shutil.copy(varietyconfig.get_data_file("scripts", "get_wallpaper"), self.scripts_folder) # 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) # TODO: Sort of hacky to have filter-related code here, they should be more isolated pencil_tile_filename = os.path.join(self.config_folder, "pencil_tile.png") if not os.path.exists(pencil_tile_filename): def _generate_pencil_tile(): logger.info(lambda: "Missing pencil_tile.png file, generating it " + varietyconfig.get_data_file("media", "pencil_tile.png")) try: os.system( "convert -size 1000x1000 xc: +noise Random -virtual-pixel tile " "-motion-blur 0x20+135 -charcoal 2 -resize 50%% \"%s\"" % pencil_tile_filename.encode('utf8')) except Exception: logger.exception(lambda: "Could not generate pencil_tile.png") threading.Timer(0, _generate_pencil_tile).start() 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)) # pprint(self.options.__dict__, indent=0) 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() if self.preferences_dialog: GObject.idle_add(self.preferences_dialog.update_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 reload_config(self): self.previous_options = self.options self.options = Options() self.options.read() GObject.idle_add(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 = -1 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 if type not in Options.SourceType.dl_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 %d, 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 %d, location %s" % (type, location)) for downloader in self.downloaders: downloader.update_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.filters_warning_shown = False logger.info(lambda: "Clearing prepared queue") with self.prepared_lock: self.prepared_cleared = True self.prepared = [] self.prepared_from_downloads = [] self.prepare_event.set() self.image_count = -1 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 def _update_indicator(): self.update_indicator(auto_changed=False) GObject.idle_add(_update_indicator) 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.preferences_dialog: self.smart.reload() if self.events: for e in self.events: e.set() 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.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 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.SourceType.dl_types: self.downloaders_cache[type] = {} def create_downloader(self, type, location): if type == Options.SourceType.DESKTOPPR: return DesktopprDownloader(self) elif type == Options.SourceType.APOD: return APODDownloader(self) elif type == Options.SourceType.EARTH: return EarthDownloader(self) elif type == Options.SourceType.WN: return WallpapersNetDownloader(self, location) elif type == Options.SourceType.FLICKR: return FlickrDownloader(self, location) elif type == Options.SourceType.WALLBASE: return WallbaseDownloader(self, location) elif type == Options.SourceType.WALLHAVEN: return WallhavenDownloader(self, location) elif type == Options.SourceType.REDDIT: return RedditDownloader(self, location) elif type == Options.SourceType.BING: return BingDownloader(self) elif type == Options.SourceType.UNSPLASH: return UnsplashDownloader(self) elif type == Options.SourceType.MEDIA_RSS: return MediaRssDownloader(self, location) elif type == Options.SourceType.PANORAMIO: return PanoramioDownloader(self, location) elif type == Options.SourceType.RECOMMENDED: if self.smart.user: return MediaRssDownloader(self, '%s/user/%s/recommended/rss' % (Smart.SITE_URL, self.smart.user["id"])) else: raise Exception('No Smart user yet, not a problem') elif type == Options.SourceType.LATEST: return MediaRssDownloader(self, Smart.SITE_URL + '/rss') else: 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 if type == Options.SourceType.FOLDER: 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() 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: with io.open(os.path.join(self.config_folder, "banned.txt"), 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): #TODO this is a hacky check, but works while EarthDownloader is the only refreshing downloader return self.url == EARTH_ORIGIN_URL 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 is "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, is_gtk_thread=True, 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") else: label = _("View at %s") % self.source_name self.url = info["sourceURL"] if "imageURL" in info: self.image_url = info["imageURL"] 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) if not is_gtk_thread: Gdk.threads_enter() try: 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 xrange(5): # 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(True) 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(self.options.download_enabled) self.ind.downloads.set_sensitive(len(self.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.publish_fb.set_sensitive(self.url is not None) 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) finally: if not is_gtk_thread: Gdk.threads_leave() # delay enabling Move/Copy operations after automatic changes - protect from inadvertent clicks if auto_changed: def update_file_operations(): for i in xrange(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, (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) found = set() for fuzziness in xrange(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" % (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")) 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)) 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: 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() 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 download_thread(self): self.last_dl_time = time.time() while self.running: try: while not self.options.download_enabled or \ (time.time() - self.last_dl_time) < self.options.download_interval: if not self.running: return now = time.time() wait_more = self.options.download_interval - max(0, (now - self.last_dl_time)) if self.options.download_enabled: self.dl_event.wait(max(0, wait_more)) else: self.dl_event.wait() self.dl_event.clear() if not self.running: return if not self.options.download_enabled: continue self.last_dl_time = time.time() if self.downloaders: self.purge_downloaded() # download from a random downloader (gives equal chance to all) downloader = self.downloaders[random.randint(0, len(self.downloaders) - 1)] self.download_one_from(downloader) # Also refresh the images for all the refreshers - these need to be updated regularly for dl in self.downloaders: if dl.is_refresher and dl != downloader: dl.download_one() except Exception: logger.exception(lambda: "Could not download wallpaper:") def trigger_download(self): if self.downloaders: logger.info(lambda: "Triggering one download") self.last_dl_time = 0 self.dl_event.set() def prepare_earth_downloader(self): dl = EarthDownloader(self) dl.update_download_folder() if not os.path.exists(dl.target_folder): dl.download_one() def register_downloaded_file(self, file): if not self.downloaded or self.downloaded[0] != file: self.downloaded.insert(0, file) self.downloaded = self.downloaded[:100] self.refresh_thumbs_downloads(file) if file.startswith(self.options.download_folder): self.download_folder_size += os.path.getsize(file) def download_one_from(self, downloader): file = downloader.download_one() if file: self.register_downloaded_file(file) if downloader.is_refresher or self.image_ok(file, 0): # give priority to newly-downloaded images - prepared_from_downloads are later prepended to self.prepared logger.info(lambda: "Adding downloaded file %s to prepared_from_downloads queue" % file) with self.prepared_lock: self.prepared_from_downloads.append(file) else: # image is not ok, but still notify prepare thread that there is a new image - it might be "desperate" self.prepare_event.set() def purge_downloaded(self): if not self.options.quota_enabled: return if self.download_folder_size <= 0 or random.randint(0, 20) == 0: self.download_folder_size = self.get_folder_size(self.real_download_folder) logger.info(lambda: "Refreshed download folder size: %d mb", 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 %s, current size: %d mb" % (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): 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: " + file) self.remove_from_queues(file) os.unlink(file) self.download_folder_size -= files[i][1] try: os.unlink(file + '.metadata.json') except Exception: pass try: os.unlink(file + '.txt') except Exception: pass except Exception: logger.exception(lambda: "Could not delete some file while purging download folder: " + file) i += 1 self.prepare_event.set() @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) total_size += os.path.getsize(fp) return total_size 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 = Gdk.Screen.get_default().get_width() h = Gdk.Screen.get_default().get_height() cmd = 'convert "%s" -scale %dx%d^ ' % (filename, w, h) logger.info(lambda: "Applying filter: " + filter) cmd += filter + ' ' cmd = cmd + ' "' + target_file + '"' cmd = cmd.replace("%FILEPATH%", filename) cmd = cmd.replace("%FILENAME%", 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 = Gdk.Screen.get_default().get_width() h = Gdk.Screen.get_default().get_height() cmd = 'convert "%s" -scale %dx%d^ ' % (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) # Note: time.strftime does not support Unicode format, so the encode/decode cycle clock_filter = time.strftime(clock_filter.encode('utf8'), time.localtime()).decode('utf8') # this should always be called last logger.info(lambda: "Applying clock filter: " + clock_filter) cmd += clock_filter + u' "' + 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 io.open(os.path.join(self.wallpaper_folder, "wallpaper.jpg.txt"), "w", encoding='utf8') as f: f.write(_u(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_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_file = os.path.join(folder, "variety-copied-wallpaper-%s.jpg" % Util.random_hash()) 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) to_set = filename if filename != self.no_effects_on: self.no_effects_on = None to_set = self.apply_filters(to_set, refresh_level) 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) self.update_indicator(filename, is_gtk_thread=False) self.set_desktop_wallpaper(to_set, filename, refresh_level) 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) GObject.idle_add(_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 list_images(self): return Util.list_files(self.individual_images, self.folders, Util.is_image, max_files=10000) def select_random_images(self, count): all_images = list(self.list_images()) self.image_count = len(all_images) random.shuffle(all_images) return all_images[:count] def on_indicator_scroll(self, indicator, steps, direction): self.on_indicator_scroll_throttled(indicator, steps, direction) @debounce(seconds=0.3) def on_indicator_scroll_throttled(self, indicator, steps, direction): if direction == Gdk.ScrollDirection.SMOOTH: return wheel_direction_forward = direction in [Gdk.ScrollDirection.DOWN, Gdk.ScrollDirection.LEFT] if wheel_direction_forward: 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 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 change_wallpaper(self, widget=None): try: img = None with self.prepared_lock: # prepend the prepared_from_downloads queue and clear it: random.shuffle(self.prepared_from_downloads) self.prepared[0:0] = self.prepared_from_downloads self.prepared_from_downloads = [] for prep in self.prepared: if prep != self.current and os.access(prep, os.R_OK): img = prep self.prepared.remove(img) 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: 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 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.auto_changed = auto_changed self.last_change_time = time.time() self.set_wp_throttled(img) 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, gdk_thread=False) else: self.thumbs_manager.show(self.used[:100], gdk_thread=False, type="history") self.thumbs_manager.pin() add_timer = threading.Timer(0, _add) add_timer.start() def refresh_thumbs_downloads(self, added_image): def _update_indicator(): self.update_indicator(auto_changed=False) GObject.idle_add(_update_indicator) should_show = 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, gdk_thread=False) 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 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 not self.options.desired_color_enabled and not self.options.lightness_enabled: if not self.options.use_landscape_enabled and not self.options.min_size_enabled: return True else: if img in self.image_colors_cache: width = self.image_colors_cache[img][3] height = self.image_colors_cache[img][4] else: dom = DominantColors(img) width = dom.get_width() height = dom.get_height() return self.size_ok(width, height, fuzziness) else: 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] ok = self.size_ok(colors[3], colors[4], fuzziness) if self.options.lightness_enabled: lightness = colors[2] if self.options.lightness_mode == Options.LightnessMode.DARK: ok = ok and lightness < 75 + fuzziness * 6 elif self.options.lightness_mode == Options.LightnessMode.LIGHT: ok = ok and lightness > 180 - fuzziness * 6 else: logger.warning(lambda: "Unknown lightness mode: %d", self.options.lightness_mode) if self.options.desired_color_enabled and self.options.desired_color: ok = ok and DominantColors.contains_color(colors, self.options.desired_color, fuzziness + 2) return ok except Exception: logger.exception(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.call(["xdg-open", os.path.dirname(file)]) def open_file(self, widget=None, file=None): if not file: file = self.current if file: subprocess.call(["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.SourceType.dl_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 try: operation(file + '.txt', 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(): self.smart.report_file(file, 'trash', async=False) command = 'gvfs-trash "%s" || trash-put "%s" || kfmclient move "%s" trash:/' % (file, file, file) logger.info(lambda: "Running trash command %s" % command) result = os.system(command.encode('utf8')) if result != 0: logger.error(lambda: "Trash resulted in error code %d" % result) self.show_notification( _("Cannot delete"), _("Probably there is no utility for moving to Trash?\nPlease install trash-cli or gvfs-bin or konquerer.")) threading.Timer(0, _go).start() except Exception: logger.exception(lambda: "Exception in move_to_trash") def ban_url(self, url): try: self.banned.add(url) with io.open(os.path.join(self.config_folder, "banned.txt"), "a", encoding='utf8') as f: f.write(_u(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.downloaded = [f for f in self.downloaded if f != 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)] self.downloaded = [f for f in self.downloaded 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.smart.report_file(file, 'favorite', async=True) 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] self.downloaded = [(new_file if f == file else f) for f in self.downloaded] 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.smart.report_file(new_file, 'favorite', async=True) except Exception: logger.exception(lambda: "Exception in move_to_favorites") 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" def on_quit(self, widget=None): logger.info(lambda: "Quitting") if self.running: self.running = False for d in self.dialogs + [self.preferences_dialog, self.about]: 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: 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: GObject.idle_add(lambda: self.do_set_wp(self.current, VarietyWindow.RefreshLevel.TEXTS)) Util.start_force_exit_thread(15) GObject.idle_add(Gtk.main_quit) def show_usage_stats_notice(self): if not self.options.stats_notice_shown and self.options.stats_enabled: self.options.stats_notice_shown = True self.options.write() self.show_notification( _('Anonymous usage statistics'), _('Variety collects anonymous usage statistics. \n' 'These help us make it better and are not shared with anyone. \n' 'To read more or turn them off, go to "Sync and social"')) def first_run(self): def _go(): fr_file = os.path.join(self.config_folder, ".firstrun") first_run = not os.path.exists(fr_file) if first_run: self.show_welcome_dialog() if not self.running: return if not self.options.smart_notice_shown: self.smart.show_notice_dialog() if not self.running: return if first_run: with open(fr_file, "w") as f: f.write(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) if self.options.smart_enabled and not self.options.smart_register_shown: self.smart.show_register_dialog() if not self.running: return if first_run: self.create_autostart_entry() self.on_mnu_preferences_activate() else: self.show_usage_stats_notice() self.smart.sync() Util.add_mainloop_task(_go) 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) try: if os.path.exists(file): logger.info(lambda: "Deleting unneeded file " + file) os.unlink(file) except Exception: logger.warning(lambda: "Could not delete %s, no worries" % file) # 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, outdated_md5): try: script_file = os.path.join(self.scripts_folder, script) if not os.path.exists(script_file) or Util.md5file(script_file) in outdated_md5: logger.info(lambda: "Outdated %s file, copying it from %s" % (script, varietyconfig.get_data_file("scripts", script))) 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", VarietyWindow.OUTDATED_SET_WP_SCRIPTS) upgrade_script("get_wallpaper", VarietyWindow.OUTDATED_GET_WP_SCRIPTS) # Upgrade the autostart entry, if there is one if os.path.exists(os.path.expanduser(u"~/.config/autostart/variety.desktop")): 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() if os.environ.get('KDE_FULL_SESSION') == 'true': logger.info(lambda: "KDE detected") kde_wp_folder = os.path.join(Util.get_xdg_pictures_folder(), "variety-wallpaper") Util.makedirs(kde_wp_folder) shutil.copy(varietyconfig.get_data_file("media", "wallpaper-kde.jpg"), kde_wp_folder) dialog.ui.kde_warning.set_visible(True) 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 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", "~/.config/variety/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() @staticmethod 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 /some/local/image.jpg --next""") parser = VarietyOptionParser(usage=usage, version="%%prog %s" % varietyconfig.get_version(), report_errors=report_errors) parser.add_option( "-v", "--verbose", action="count", dest="verbose", default=1, help=_("Show logging messages (-vv shows even finer debugging messages, -vvv debugs variety_lib too)")) parser.add_option( "-q", "--quit", action="store_true", dest="quit", help=_("Make the running instance quit")) parser.add_option( "--get", "--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( "-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( "--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.")) parser.add_option( "--debug-smart", action="store_true", dest="debug_smart", help="Debug VRTY.ORG and sync functionality by using local server") 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 def process_command(self, arguments, initial_run): try: arguments = [unicode(arg) for arg in arguments] logger.info(lambda: "Received command: " + str(arguments)) options, args = self.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.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.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") 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 = urlparse.urlparse(url) command = parts.netloc args = urlparse.parse_qs(parts.query) if command == 'facebook-auth': if hasattr(self, 'facebook_helper') and self.facebook_helper: fragments = urlparse.parse_qs(parts.fragment) args.update(fragments) self.facebook_helper.on_facebook_auth(args) elif command == 'add-source': source_type = args['type'][0].lower() if not source_type in Options.SourceType.str_to_type: 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(Options.str_to_type(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')) GObject.idle_add(_add) elif command == 'set-wallpaper': if "id" in args: image_data = Util.fetch_json(Smart.API_URL + '/image/' + args["id"][0]) image_url, origin_url, source_type, source_location, source_name, extra_metadata = \ Smart.extract_fetch_data(image_data) else: 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 == 'smart-login': userid = args["id"][0] username = args["username"][0] authkey = args["authkey"][0] self.smart.process_login_request(userid, username, authkey) 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 = os.path.join(self.scripts_folder, "get_wallpaper") file = None if os.access(script, os.X_OK): logger.debug(lambda: "Running get_wallpaper script") try: output = subprocess.check_output(script).strip() if output: file = _u(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 name.endswith(".jpg"): logger.debug(lambda: "Removing old wallpaper %s" % file) os.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): script = os.path.join(self.scripts_folder, "set_wallpaper") 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" % (wallpaper, auto, original_file)) try: subprocess.check_call(["timeout", "--kill-after=5", "10", script, wallpaper, auto, original_file]) except subprocess.CalledProcessError, e: if e.returncode == 124: logger.error(lambda: "Timeout while running set_wallpaper script, killed") 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(gdk_thread=True, force=True) else: self.thumbs_manager.show(self.used[:100], gdk_thread=True, 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(gdk_thread=True, force=True) else: self.thumbs_manager.show(self.downloaded[:100], gdk_thread=True, 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(gdk_thread=True, 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 io.open(os.path.join(self.config_folder, "history.txt"), "w", encoding='utf8') as f: f.write(u"%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 io.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 io.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 def publish_on_facebook(self, widget): if not self.url: logger.warning(lambda: "publish_on_facebook called with no current URL") return file = self.current if not file: return link = self.url picture = self.image_url caption = None quote_text = self.get_quote_text_for_publishing() if self.source_name: caption = self.source_name + ", via Variety Wallpaper Changer" else: caption = "Via Variety Wallpaper Changer" logger.info(lambda: "Publish on FB requested with params %s, %s, %s" % (link, picture, caption)) message = self.options.facebook_message if message == u'': message = quote_text if self.options.facebook_show_dialog: publish_dialog = FacebookPublishDialog() pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(file, 200, 100) publish_dialog.ui.image.set_from_pixbuf(pixbuf) buf = publish_dialog.ui.message.get_buffer() def _text_changed(widget=None): text = buf.get_text(buf.get_start_iter(), buf.get_end_iter(), False).strip() if self.quote and text == quote_text: publish_dialog.ui.fill_quote.set_sensitive(False) publish_dialog.ui.hide_dialog.set_label(_('Do not ask anymore, always use the current quote')) else: publish_dialog.ui.fill_quote.set_sensitive(bool(quote_text)) publish_dialog.ui.hide_dialog.set_label(_('Do not ask anymore, always use the text above')) buf.connect("changed", _text_changed) buf.set_text(message) publish_dialog.ui.fill_quote.set_visible(bool(quote_text)) def _fill_quote(widget=None): buf.set_text(quote_text) publish_dialog.ui.fill_quote.connect("clicked", _fill_quote) self.dialogs.append(publish_dialog) response = publish_dialog.run() publish_dialog.destroy() try: self.dialogs.remove(publish_dialog) except: pass if not self.running or response != Gtk.ResponseType.OK: return message = _u(buf.get_text(buf.get_start_iter(), buf.get_end_iter(), False)).strip() self.options.facebook_message = u'' if message == _u(quote_text) else message self.options.facebook_show_dialog = not publish_dialog.ui.hide_dialog.get_active() self.options.write() if self.facebook_firstrun(): return def do_publish(): self.facebook_helper = FacebookHelper(self, token_file=os.path.join(self.config_folder, ".fbtoken")) def on_success(fb, action, data): self.show_notification(_("Published"), _("You may open your Facebook feed to see the post"), icon=file) self.facebook_helper = None def on_failure(fb, action, data): self.show_notification(_("Could not publish"), str(data), icon=file) self.facebook_helper = None self.facebook_helper.publish( message=message, link=link, picture=picture, caption=caption, on_success=on_success, on_failure=on_failure) GObject.idle_add(do_publish) def get_quote_text_for_publishing(self): if not self.quote: return '' author = ("\n-- " + self.quote["author"]) if self.quote.get("author", None) else "" text = (self.quote["quote"] + author).strip().encode('utf8') return text def publish_quote_on_facebook(self, widget): if not self.quote: logger.warning(lambda: "publish_quote_on_facebook called with no current quote") return if self.facebook_firstrun(): return def do_publish(): self.facebook_helper = FacebookHelper(self, token_file=os.path.join(self.config_folder, ".fbtoken")) def on_success(fb, action, data): self.show_notification(_("Published"), _("You may open your Facebook feed to see the post")) self.facebook_helper = None def on_failure(fb, action, data): self.show_notification(_("Could not publish"), str(data)) self.facebook_helper = None text = self.get_quote_text_for_publishing() self.facebook_helper.publish(message=text, caption="Via Variety Wallpaper Changer", on_success=on_success, on_failure=on_failure) GObject.idle_add(do_publish) 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 facebook_firstrun(self): def _cleanup(): if hasattr(self, "facebook_dialog") and self.facebook_dialog: self.facebook_dialog.destroy() try: self.dialogs.remove(self.facebook_dialog) except Exception: pass self.facebook_dialog = None first_run_file = os.path.join(self.config_folder, ".fbfirstrun") if not os.path.exists(first_run_file): if hasattr(self, "facebook_dialog") and self.facebook_dialog: self.facebook_dialog.present() return True else: self.facebook_dialog = FacebookFirstRunDialog() self.dialogs.append(self.facebook_dialog) response = self.facebook_dialog.run() if not self.running or response != Gtk.ResponseType.OK: _cleanup() return True with open(first_run_file, "w") as f: f.write(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) _cleanup() return False def prev_quote(self, widget=None): if self.quotes_engine and self.options.quotes_enabled: self.quote = self.quotes_engine.prev_quote() GObject.idle_add(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) GObject.idle_add(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 io.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.encode('utf-8')) 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.call(["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 = "http://google.com/search?q=" + urllib.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 = "http://google.com/search?q=" + urllib.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.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_autostart_entry(self): try: logger.info(lambda: "Creating autostart entry") content = ( "[Desktop Entry]\n" "Name=Variety\n" "Comment=Variety Wallpaper Changer\n" "Icon=variety\n" "Exec=variety\n" "Terminal=false\n" "Type=Application\n" "X-GNOME-Autostart-Delay=20\n" ) Util.makedirs(os.path.expanduser(u"~/.config/autostart/")) path = os.path.expanduser(u"~/.config/autostart/variety.desktop") with open(path, "w") as f: f.write(content) except: 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] 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/variety/Util.py0000664000000000000000000006003112641771550012413 0ustar # -*- 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 bs4 from functools import wraps import hashlib import io import json import re import os import random import logging import string import threading import time import pyexiv2 import urllib import urllib2 from urlparse import urlparse from DominantColors import DominantColors from gi.repository import Gdk, Pango, GdkPixbuf, GLib import inspect import subprocess import platform from variety import _u, _str VARIETY_INFO = "Downloaded by Variety wallpaper changer, http://peterlevi.com/variety" USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Ubuntu/12.04 Chromium/25.0.1364.172 Chrome/25.0.1364.172 Safari/537.22" SOURCE_NAME_TO_TYPE = { 'wallbase.cc': 'wallbase', 'wallhaven.cc': 'wallhaven', 'wallpapers.net': 'wn', 'desktoppr.co': 'desktoppr', 'nasa astro pic of the day': 'apod', 'opentopia.com': 'earth', 'fetched': 'fetched', 'recommended by variety': 'recommended', 'flickr': 'flickr', 'media rss': 'mediarss', } random.seed() logger = logging.getLogger('variety') class LogMethodCalls(object): def __init__(self, func, level): self.level = level self.func = func def __get__(self, obj, cls=None): def logcall(*func_args, **func_kwargs): logger.log(self.level, (cls.__name__ if cls else '')+ ": " + self.func.func_name + '(' + ', '.join(map(_str, func_args)) + ((', %s' % func_kwargs) if func_kwargs else '') + ')') if inspect.isfunction(self.func) or inspect.isclass(self.func.im_self): ret = self.func(*func_args, **func_kwargs) else: ret = self.func(obj, *func_args, **func_kwargs) return ret for attr in "__module__", "__name__", "__doc__": setattr(logcall, attr, getattr(self.func, attr)) return logcall class HeadRequest(urllib2.Request): def get_method(self): return "HEAD" 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): @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 class Util: @staticmethod def log_all(cls, level=logging.DEBUG): if logger.isEnabledFor(level): for name, meth in inspect.getmembers(cls): if inspect.ismethod(meth) or inspect.isfunction(meth): setattr(cls, name, LogMethodCalls(meth, level)) return cls @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): 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.unquote_plus(filename) filename = Util.sanitize_filename(filename) if len(filename) > 200: filename = filename[:190] + filename[-10:] 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 not check_contents: return filename.lower().endswith(('.jpg', '.jpeg', '.gif', '.png', '.tiff', '.svg', '.bmp')) else: format, image_width, image_height = GdkPixbuf.Pixbuf.get_file_info(filename) return bool(format) @staticmethod def list_files(files=(), folders=(), filter_func=(lambda f: True), max_files=10000, randomize=True): count = 0 for filepath in files: 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: if os.path.isdir(folder): try: for root, subFolders, files in os.walk(folder): if randomize: random.shuffle(files) random.shuffle(subFolders) for filename in files: if filter_func(filename): count += 1 if count > max_files: logger.info(lambda: "More than %d files in the folders, stop listing" % max_files) return yield os.path.join(root, filename) except Exception: logger.exception(lambda: "Cold 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: pyexiv2.xmp.register_namespace("https://launchpad.net/variety/", "variety") except KeyError: pass try: m = pyexiv2.ImageMetadata(filename) m.read() m["Xmp.variety.info"] = VARIETY_INFO for k, v in 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': m['Xmp.dc.description'] = v m['Exif.Image.ImageDescription'] = v elif k == 'keywords': if isinstance(v, list): m['Iptc.Application2.Keywords'] = v m['Xmp.dc.subject'] = v elif k == 'sfwRating': m["Xmp.variety." + k] = str(v) else: m["Xmp.variety." + k] = v m.write() return True except Exception: # could not write metadata inside file, use json txt instead try: with io.open(filename + '.metadata.json', 'w', encoding='utf8') as f: f.write(json.dumps(info, indent=4, ensure_ascii=False, encoding='utf8')) return True except Exception, e: logger.exception(lambda: "Could not write metadata for file " + filename) return False @staticmethod def read_metadata(filename): try: pyexiv2.xmp.register_namespace("https://launchpad.net/variety/", "variety") except KeyError: pass try: m = pyexiv2.ImageMetadata(filename) m.read() info = {} keys = ["sourceName", "sourceLocation", "sourceURL", "sourceType", "imageURL", "author", "authorURL"] for k in keys: if "Xmp.variety." + k in m: info[k] = _u(m["Xmp.variety." + k].value) try: info['sfwRating'] = int(m['Xmp.variety.sfwRating'].value) except: pass try: info['author'] = _u(m['Xmp.dc.creator'].value[0]) except: pass try: info['headline'] = _u(m['Iptc.Application2.Headline'].value[0]) except: pass try: info['description'] = _u(m['Xmp.dc.description'].value.values()[0]) except: try: info['description'] = _u(m['Exif.Image.ImageDescription'].value) except: pass try: info['keywords'] = map(_u, m['Iptc.Application2.Keywords'].value) except: try: info['keywords'] = map(_u, m['Xmp.dc.subject'].value) except: pass return info except Exception, e: # could not read metadata inside file, try reading json metadata instead try: with io.open(filename + '.metadata.json', encoding='utf8') as f: return json.loads(f.read()) except Exception: # could not read json metadata, use txt instead # TODO: legacy support. Remove after some time has passed. try: with io.open(filename + ".txt", encoding='utf8') as f: lines = list(f) info = {} if len(lines) > 2 and lines[0].strip() == "INFO:": info["sourceName"] = lines[1].strip().replace("Downloaded from ", "") # TODO remove later on info["sourceURL"] = lines[2].strip() if len(lines) > 3 and len(lines[3].strip()) > 0: info["sourceLocation"] = lines[3].strip() if len(lines) > 4 and len(lines[4].strip()) > 0: info["imageURL"] = lines[4].strip() if len(lines) > 5 and len(lines[5].strip()) > 0: info["sourceType"] = lines[5].strip() if Util.write_metadata(filename, info): logger.warning(lambda: "Replacing txt image metadata with json-based: %s" % filename) os.unlink(filename + ".txt") return info else: return None 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 = pyexiv2.ImageMetadata(filename) m.read() if rating is None: for key in ["Xmp.xmp.Rating", "Exif.Image.Rating", "Exif.Image.RatingPercent"]: if key in m: del m[key] 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"] m.write() @staticmethod def get_rating(filename): m = pyexiv2.ImageMetadata(filename) m.read() rating = None if "Xmp.xmp.Rating" in m: rating = m["Xmp.xmp.Rating"].value elif "Exif.Image.Rating" in m: rating = m["Exif.Image.Rating"].value elif "Exif.Image.RatingPercent" in m: rating = m["Exif.Image.RatingPercent"].value // 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 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 urlopen(url, data=None, head_request=False): if url.startswith('//'): url = 'http:' + url request = urllib2.Request(url) if not head_request else HeadRequest(url) request.add_header('User-Agent', USER_AGENT) request.add_header('Cache-Control', 'max-age=0') return urllib2.urlopen(request, data=urllib.urlencode(data) if data else None, timeout=20) @staticmethod def fetch(url, data=None): return Util.urlopen(url, data).read() @staticmethod def fetch_json(url, data=None): return json.loads(Util.fetch(url, data)) @staticmethod def html_soup(url, data=None): return bs4.BeautifulSoup(Util.urlopen(url, data).read()) @staticmethod def xml_soup(url, data=None): return bs4.BeautifulSoup(Util.urlopen(url, data).read(), "xml") @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 = Gdk.Screen.get_default().get_width(), Gdk.Screen.get_default().get_height() 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 get_scale_to_screen_ratio(image): """Computes the ratio by 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 = Gdk.Screen.get_default().get_width(), Gdk.Screen.get_default().get_height() 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 int(float(screen_w) / iw) else: #image is "wider" than the screen ratio - need to offset horizontally return int(float(screen_h) / ih) @staticmethod def gtk_to_fcmatch_font(gtk_font_name): fd = Pango.FontDescription(gtk_font_name) family = _u(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): def _score(v): a = map(int, v.split('.')) while len(a) < 3: a.append(0) return a[0] * 10**6 + a[1] * 10**3 + a[2] s1 = _score(v1) s2 = _score(v2) return -1 if s1 < s2 else (0 if s1 == s2 else 1) @staticmethod def md5(s): return hashlib.md5(s).hexdigest() @staticmethod def md5file(file): with open(file) as f: return Util.md5(f.read()) @staticmethod def random_hash(): try: return os.urandom(16).encode('hex') except Exception: return ''.join(random.choice(string.hexdigits) for n in xrange(32)) @staticmethod def get_file_icon_name(path): try: from gi.repository import Gio 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(u'~/Pictures') @staticmethod def superuser_exec(*command_args): logger.warning(lambda: "Executing as superuser: %s" % _str(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: u = Util.urlopen(url, head_request=True) return u.info().get("content-type", "").startswith("image/") except: return False @staticmethod def is_dead_or_not_image(url): if not url: return True try: host = 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: u = Util.urlopen(url, head_request=True) return not u.info().get("content-type", "").startswith("image/") except urllib2.HTTPError, e: if e.code in (403, 404): return True return False except ValueError: # not a valid URL return True except: return False @staticmethod def guess_image_url(meta): if 'imageURL' in meta: return meta['imageURL'] try: origin_url = meta['sourceURL'] if "flickr.com" in origin_url: from variety.FlickrDownloader import FlickrDownloader return FlickrDownloader.get_image_url(origin_url) elif Util.is_image(origin_url) and Util.is_alive_and_image(origin_url): return origin_url return None except: return None @staticmethod def guess_source_type(meta): try: if 'sourceType' in meta: return meta['sourceType'] elif 'sourceName' in meta: source_name = meta['sourceName'].lower() if source_name in SOURCE_NAME_TO_TYPE: return SOURCE_NAME_TO_TYPE[source_name] else: source_location = meta.get('sourceLocation', '').lower() if source_location.startswith(('http://' + source_name, 'https://' + source_name)) \ or 'backend.deviantart.com' in source_location \ or 'rss' in source_location \ or '/feed' in source_location: return 'mediarss' return None except: return None @staticmethod def get_os_name(): return ' '.join(platform.linux_distribution()[0:2]) # 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' variety/variety/AddWallbaseDialog.py0000664000000000000000000000335312641771550014765 0ustar # -*- 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.AbstractAddByQueryDialog import AbstractAddByQueryDialog from variety.Options import Options from variety.WallbaseDownloader import WallbaseDownloader from variety_lib.helpers import get_builder from variety import _ class AddWallbaseDialog(AbstractAddByQueryDialog): __gtype_name__ = "AddWallbaseDialog" def __new__(cls): builder = get_builder('AddWallbaseDialog') new_object = builder.get_object('add_wallbase_dialog') new_object.finish_initializing(builder) return new_object def validate(self, query): valid = WallbaseDownloader.validate(query) return query, None if valid else _("No images found") def commit(self, final_query): if len(final_query): self.parent.on_add_dialog_okay(Options.SourceType.WALLBASE, final_query, self.edited_row) if __name__ == "__main__": dialog = AddWallbaseDialog() dialog.show() Gtk.main() variety/variety/APODDownloader.py0000664000000000000000000000657212641771550014252 0ustar # -*- 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 bs4 import BeautifulSoup import random import logging from variety import Downloader, _str from variety.Util import Util logger = logging.getLogger('variety') random.seed() class APODDownloader(Downloader.Downloader): def __init__(self, parent): super(APODDownloader, self).__init__(parent, "apod", "NASA Astro Pic of the Day", "nasa_apod") self.queue = [] self.root = "http://apod.nasa.gov/apod/" @staticmethod def fetch(url, xml = False): content = Util.fetch(url) return BeautifulSoup(content, "xml") if xml else BeautifulSoup(content) def download_one(self): logger.info(lambda: "Downloading an image from NASA's Astro Pic of the Day, " + self.location) logger.info(lambda: "Queue size: %d" % len(self.queue)) if not self.queue: self.fill_queue() if not self.queue: logger.info(lambda: "APOD Queue still empty after fill request - probably nothing more to download") return None url = self.queue.pop() logger.info(lambda: "APOD URL: " + url) s = self.fetch(url) img_url = None try: link = s.find("img").parent["href"] if link.startswith("image/"): img_url = self.root + link logger.info(lambda: "Image URL: " + img_url) except Exception: pass if img_url: return self.save_locally(url, img_url) else: logger.info(lambda: "No image url found for this APOD URL") return None def fill_queue(self): logger.info(lambda: "Filling APOD queue from Archive") s = self.fetch("http://apod.nasa.gov/apod/archivepix.html") urls = [self.root + 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 = [x for x in urls if x not in self.parent.banned] self.queue.extend(urls[:3]) # always append the latest 3 urls = urls[3:] random.shuffle(urls) self.queue.extend(urls[:10]) self.queue = list(reversed(self.queue)) logger.info(lambda: "APOD queue populated with %d URLs" % len(self.queue)) def fill_queue_from_rss(self): logger.info(lambda: "Filling APOD queue from RSS") s = self.fetch(self.location, xml=True) urls = [_str(x.find("link").contents[0]) for x in s.findAll("item")] urls = [x for x in urls if x not in self.parent.banned] self.queue.extend(urls) logger.info(lambda: "APOD queue populated with %d URLs" % len(self.queue))variety/variety/AddWallpapersNetCategoryDialog.py0000664000000000000000000000360712641771550017514 0ustar # -*- 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.AbstractAddByQueryDialog import AbstractAddByQueryDialog from variety.Options import Options from variety_lib.helpers import get_builder from variety.WallpapersNetDownloader import WallpapersNetDownloader from variety import _ class AddWallpapersNetCategoryDialog(AbstractAddByQueryDialog): __gtype_name__ = "AddWallpapersNetCategoryDialog" def __new__(cls): builder = get_builder('AddWallpapersNetCategoryDialog') new_object = builder.get_object('add_wallpapers_net_category_dialog') new_object.finish_initializing(builder) return new_object def validate(self, url): if not url.startswith("http://"): url = "http://" + url valid = WallpapersNetDownloader.validate(url) return url, None if valid else _("Could not find wallpapers there. Please check the URL.") def commit(self, url): if url: self.parent.on_add_dialog_okay(Options.SourceType.WN, url, self.edited_row) if __name__ == "__main__": dialog = AddWallpapersNetCategoryDialog() dialog.show() Gtk.main() variety/variety/VarietyOptionParser.py0000664000000000000000000000327512641771550015476 0ustar # -*- 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 import safe_print 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: encoding = self._get_encoding(file) file.write(self.format_help().encode(encoding, "replace")) def error(self, msg): if self.report_errors: optparse.OptionParser.error(self, msg) else: raise ValueError(msg) variety/variety/AddRedditDialog.py0000664000000000000000000000416712641771550014452 0ustar # -*- 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.RedditDownloader import RedditDownloader from variety.AbstractAddByQueryDialog import AbstractAddByQueryDialog from variety.Options import Options from variety_lib.helpers import get_builder from variety import _ class AddRedditDialog(AbstractAddByQueryDialog): __gtype_name__ = "AddRedditDialog" def __new__(cls): builder = get_builder('AddRedditDialog') new_object = builder.get_object('add_reddit_dialog') new_object.finish_initializing(builder) return new_object def validate(self, query): if not '/' in query: query = 'http://www.reddit.com/r/%s' % query else: 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 query, False, _("This does not seem to be a valid Reddit URL") valid = RedditDownloader.validate(query) return query, None if valid else _("We could not find any image submissions there.") def commit(self, final_url): if final_url: self.parent.on_add_dialog_okay(Options.SourceType.REDDIT, final_url, self.edited_row) if __name__ == "__main__": dialog = AddRedditDialog() dialog.show() Gtk.main() variety/variety/FacebookHelper.py0000664000000000000000000002020112641771551014343 0ustar # -*- 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 # # FacebookHelper is roughly based upon this work: https://github.com/vrruiz/FacebookAuthBrowser # #Copyright (c) 2011, Víctor R. Ruiz #All rights reserved. # #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. import json import urllib import urlparse import pycurl import StringIO import logging import webbrowser from variety import _ from variety.Util import Util logger = logging.getLogger('variety') AUTH_URL = 'https://www.facebook.com/dialog/oauth?client_id=%s&redirect_uri=%s&response_type=token&scope=%s' AUTH_REDIRECT_URL = 'https://vrty.org/facebook-auth?hash=%s' PUBLISH_URL = "https://graph.facebook.com/me/feed" class FacebookHelper: """ Creates a web browser using GTK+ and WebKit to authorize a desktop application in Facebook. It uses OAuth 2.0. Requires the Facebook's Application ID. The token is then saved to token_file. """ def __init__(self, parent, token_file, app_key='368780939859975', scope='publish_actions'): """ Constructor. Creates the GTK+ app and adds the WebKit widget @param app_key Application key ID (Public). @param scope A string list of permissions to ask for. More at http://developers.facebook.com/docs/reference/api/permissions/ """ self.parent = parent self.app_key = app_key self.token_file = token_file self.scope = scope self.load_token() def authorize(self, on_success=None, on_failure=None): logger.info(lambda: "Authorizing for Facebook") self.token = '' self.token_expire = '' self.on_success = on_success self.on_failure = on_failure self.hash = Util.random_hash()[:4] # Loads the Facebook OAuth page auth_url = AUTH_URL % ( urllib.quote(self.app_key), urllib.quote(AUTH_REDIRECT_URL % self.hash), urllib.quote(self.scope)) webbrowser.open(auth_url) def on_facebook_auth(self, params): try: if self.hash != params["hash"][0]: return # user has reloaded an old redirect page, ignore it self.token = params['access_token'][0] self.token_expire = params['expires_in'][0] # Should be equal to 0, don't expire # Save token to file with open(self.token_file, 'w') as token_file: token_file.write(self.token) token_file.close() if self.on_success: self.parent.show_notification(_("Authorization successful"), _("Publishing...")) self.on_success(self, self.token) except Exception: logger.exception(lambda: "Facebook auth failed") if self.on_failure: self.on_failure(self, "authorize", _("Authorization failed")) def load_token(self): logger.info(lambda: "Loading token from file") try: with open(self.token_file, 'r') as token_file: self.token = token_file.read().strip() except Exception: self.token = None def publish(self, message=None, link=None, picture=None, caption=None, description=None, on_success=None, on_failure=None, attempts=0): message = message.encode('utf8') if type(message) == unicode else message link = link.encode('utf8') if type(link) == unicode else link def republish(action=None, token=None): self.publish(message=message, link=link, picture=picture, caption=caption, description=description, on_success=on_success, on_failure=on_failure, attempts=attempts + 1) logger.info(lambda: "Publishing to Faceboook, attempt %d" % attempts) if not self.token: logger.info(lambda: "No auth token, loading from file") self.load_token() if not self.token: logger.info(lambda: "Still no token, trying to authorize") self.authorize(on_success=republish, on_failure=on_failure) return # now we certainly have some token, but it may be expired or invalid m = {} if message: m["message"] = message if link: m["link"] = link if picture: m["picture"] = picture if caption: m["caption"] = caption if description: m["description"] = description logger.info(lambda: "Publish properties: " + str(m)) m["access_token"] = self.token try: content = FacebookHelper.post(PUBLISH_URL, m) except pycurl.error, e: on_failure(self, "publish", str(e)) return response = json.loads(content) logger.info(lambda: "Response: %s" % content) if "error" in response: logger.warning(lambda: "Could not publish to Facebook, error message %s" % response["error"]["message"]) code = response["error"].get("code", -1) if attempts < 2 and code in [190, 200]: # 190 is invalid token, 200 means no permission to publish logger.info(lambda: "Code %d, trying to reauthorize" % code) self.authorize(on_success=republish, on_failure=on_failure) return else: # Facebook would sometimes return an error on the first try, but succeed on the next, # so retry a couple of times if attempts < 3: logger.info(lambda: "Retrying to publish") republish() else: on_failure(self, "publish", "Facebook message:\n%s" % response["error"]["message"]) else: if on_success: on_success(self, "publish", content) @staticmethod def post(url, post_data, timeout=10): c = pycurl.Curl() c.setopt(pycurl.CONNECTTIMEOUT, timeout) c.setopt(pycurl.TIMEOUT, timeout) c.setopt(pycurl.URL, url) c.setopt(pycurl.POST, 1) c.setopt(pycurl.POSTFIELDS, urllib.urlencode(post_data)) b = StringIO.StringIO() c.setopt(pycurl.WRITEFUNCTION, b.write) c.perform() c.close() return b.getvalue() variety/variety/FacebookPublishDialog.py0000664000000000000000000000460112641771551015660 0ustar # -*- 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 from variety import _, _u class FacebookPublishDialog(Gtk.Dialog): __gtype_name__ = "FacebookPublishDialog" def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated FacebookPublishDialog object. """ builder = get_builder('FacebookPublishDialog') new_object = builder.get_object('facebook_publish_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 FacebookPublishDialog object with it in order to finish initializing the start of the new FacebookPublishDialog 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(). """ self.destroy() 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 = FacebookPublishDialog() dialog.show() Gtk.main() variety/variety/ImageFetcher.py0000664000000000000000000001402212641771551014021 0ustar # -*- 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 logging from urllib2 import HTTPError import urlparse from variety.Util import Util from PIL import Image from variety import _, _u logger = logging.getLogger('variety') class ImageFetcher: @staticmethod def url_ok(url, use_whitelist, hosts_whitelist): try: p = urlparse.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')) # 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={}, 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 u = Util.urlopen(url) info = u.info() if not "content-type" in info: logger.info(lambda: "Unknown content-type for url " + url) if verbose: progress_reporter(_("Not an image"), url) return None ct = info["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(url) if "content-disposition" in info: cd = info["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) local_name = os.path.basename(filename) logger.info(lambda: "Fetching to " + filename) if not reported: reported = True progress_reporter(_("Fetching"), url) data = u.read() with open(filename, 'wb') as f: f.write(data) try: img = Image.open(filename) except Exception: progress_reporter(_("Not an image"), url) os.unlink(filename) 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) os.unlink(filename) 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) Util.write_metadata(filename, metadata) logger.info(lambda: "Fetched %s to %s." % (url, filename)) return filename except Exception, e: logger.exception(lambda: "Fetch failed for URL " + url) if reported: if isinstance(e, HTTPError) and e.code in (403, 404): progress_reporter( _("Sorry, got %s error...") % str(e.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/variety/WallpapersNetDownloader.py0000664000000000000000000001304412641771551016301 0ustar # -*- 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 random import re import logging import time from lxml import etree import StringIO from variety import Downloader from variety.Util import Util logger = logging.getLogger('variety') random.seed() class WallpapersNetDownloader(Downloader.Downloader): last_download_time = 0 def __init__(self, parent, category_url): super(WallpapersNetDownloader, self).__init__(parent, "wn", "Wallpapers.net", category_url) self.host = "http://wallpapers.net/" self.last_fill_time = 0 self.queue = [] @staticmethod def fetch_and_parse(url): html = Util.fetch(url) return etree.parse(StringIO.StringIO(html), etree.HTMLParser()) @staticmethod def validate(url): logger.info(lambda: "Validating WN url " + url) try: if not url.startswith("http://"): url = "http://" + url if not url.lower().startswith("http://www.wallpapers.net") and not url.lower().startswith("http://wallpapers.net"): return False tree = WallpapersNetDownloader.fetch_and_parse(url) walls = list(tree.findall('//**/div[@class="screen"]/div[@class="title"]/a')) return len(walls) > 0 except Exception: logger.exception(lambda: "Error while validating URL, proabably bad URL") return False def download_one(self): min_download_interval, min_fill_queue_interval = self.parse_server_options("wallpapers.net", 0, 0) if time.time() - WallpapersNetDownloader.last_download_time < min_download_interval: logger.info(lambda: "Minimal interval between Wallpapers.net downloads is %d, skip this attempt" % min_download_interval) return None logger.info(lambda: "Downloading an image from Wallpapers.net, " + self.location) logger.info(lambda: "Queue size: %d" % len(self.queue)) if not self.queue: if time.time() - self.last_fill_time < min_fill_queue_interval: logger.info(lambda: "Wallpapers.net queue empty, but minimal interval between fill attempts is %d, " "will try again later" % min_fill_queue_interval) return None self.fill_queue() if not self.queue: logger.info(lambda: "WN Queue still empty after fill request - probably wrong URL?") return None WallpapersNetDownloader.last_download_time = time.time() wallpaper_url = self.queue.pop() logger.info(lambda: "Wallpaper URL: " + wallpaper_url) tree = WallpapersNetDownloader.fetch_and_parse(wallpaper_url) resolution_links = [a.get("href") for a in tree.findall('**/table/tr/td/a') if a.get('href').endswith(('.jpg', '.jpeg'))] max_res_link = max(resolution_links, key=lambda a: re.search('(\d+)x(\d+)\.', a).group(1)) src_url = self.host + max_res_link logger.info(lambda: "Image src URL: " + src_url) extra_metadata = {} try: extra_metadata['headline'] = tree.findall('//h1')[0].text.replace('HD Wallpaper', '') except: pass try: extra_metadata['keywords'] = [x[1:].lower() for x in map( lambda a: str(a.text), tree.findall('//div[@class="right"]//table//a')) if x.startswith('#')] except: pass return self.save_locally(wallpaper_url, src_url, extra_metadata=extra_metadata) def fill_queue(self): self.last_fill_time = time.time() logger.info(lambda: "Category URL: " + self.location) tree = WallpapersNetDownloader.fetch_and_parse(self.location) mp = 0 urls = [url.get('href') for url in tree.findall('**/div[@class="pagination"]/a') if url.get('href').find('_p') > 0] if urls: for h in urls: page = (re.search(r'_p(\d+)$', h)).group(1) mp = max(mp, int(page)) page = random.randint(1, mp) h = urls[0] page_url = self.host + re.sub(r'_p\d+$', '_p%d' % page, h) logger.info(lambda: "Page URL: " + page_url) tree = WallpapersNetDownloader.fetch_and_parse(page_url) else: logger.info(lambda: "Single page in category") walls = [self.host + a.get('href') for a in tree.findall('//**/div[@class="screen"]/div[@class="title"]/a')] walls = [x for x in walls if x not in self.parent.banned] self.queue.extend(walls) random.shuffle(self.queue) if len(self.queue) >= 8: self.queue = self.queue[:len(self.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 logger.info(lambda: "WN queue populated with %d URLs" % len(self.queue))variety/variety/AvgColor.py0000664000000000000000000000367012641771551013221 0ustar # -*- 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 # iterate through each pixel in an image and # determine the average rgb color # you will need to install the PIL module from PIL import Image class AvgColor(object): ''' loop through each pixel and average rgb ''' def __init__(self, imageName): self.pic = Image.open(imageName) self.pic = self.pic.resize((20, 20)) # load image data self.imgData = self.pic.load() def getAvg(self): r, g, b = 0, 0, 0 count = 0 for x in xrange(0, self.pic.size[0], 1): for y in xrange(0, self.pic.size[1], 1): clrs = self.imgData[x, y] try: r += clrs[0] g += clrs[1] b += clrs[2] count += 1 except TypeError: r += clrs g += clrs b += clrs count += 1 # calculate averages return (r / count), (g / count), (b / count) if __name__ == '__main__': # assumes you have a test.jpg in the working directory! pc = AvgColor('test.jpg') print "(red, green, blue, total_pixel_count)" print pc.getAvg() variety/variety/PreferencesVarietyDialog.py0000664000000000000000000016377612652624506016447 0ustar # -*- 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. from gi.repository import Gtk, Gdk, GObject, GdkPixbuf # pylint: disable=E0611 import io import stat import threading import subprocess from variety.Util import Util from variety import Texts from variety.plugins.IQuoteSource import IQuoteSource from variety_lib import varietyconfig from variety_lib.varietyconfig import get_data_file from variety.FolderChooser import FolderChooser from variety.Options import Options from variety.AddWallpapersNetCategoryDialog import AddWallpapersNetCategoryDialog from variety.AddFlickrDialog import AddFlickrDialog from variety.AddWallbaseDialog import AddWallbaseDialog from variety.AddMediaRssDialog import AddMediaRssDialog from variety.AddRedditDialog import AddRedditDialog from variety.AddPanoramioDialog import AddPanoramioDialog from variety.EditFavoriteOperationsDialog import EditFavoriteOperationsDialog from variety.SmartFeaturesConfirmationDialog import SmartFeaturesConfirmationDialog from variety.LoginOrRegisterDialog import LoginOrRegisterDialog from variety.AddWallhavenDialog import AddWallhavenDialog from variety import _, _u import os import logging import random random.seed() logger = logging.getLogger('variety') from variety_lib.PreferencesDialog import PreferencesDialog UNREMOVEABLE_TYPES = [ Options.SourceType.FAVORITES, Options.SourceType.FETCHED, Options.SourceType.DESKTOPPR, Options.SourceType.BING, Options.SourceType.UNSPLASH, Options.SourceType.APOD, Options.SourceType.EARTH, Options.SourceType.RECOMMENDED, Options.SourceType.LATEST, ] EDITABLE_TYPES = [ Options.SourceType.WN, Options.SourceType.WALLBASE, Options.SourceType.FLICKR, Options.SourceType.MEDIA_RSS, Options.SourceType.PANORAMIO, Options.SourceType.WALLHAVEN, Options.SourceType.REDDIT, ] 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.dl_chooser = FolderChooser(self.ui.download_folder_chooser, self.on_downloaded_changed) 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) try: from varietyslideshow import varietyslideshow except: self.ui.notebook.remove_page(2) 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) def set_status_message(self, msg): def _update_ui(): self.ui.status_message.set_visible(msg) self.ui.status_message.set_markup(msg) GObject.idle_add(_update_ui) 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(os.path.expanduser(u"~/.config/autostart/variety.desktop"))) 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.download_enabled.set_active(self.options.download_enabled) self.set_download_interval(self.options.download_interval) self.dl_chooser.set_folder(os.path.expanduser(self.options.download_folder)) self.update_real_download_folder() self.ui.quota_enabled.set_active(self.options.quota_enabled) self.ui.quota_size.set_text(str(self.options.quota_size)) self.fav_chooser.set_folder(os.path.expanduser(self.options.favorites_folder)) 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 == "Current": self.ui.icon.set_active(2) elif self.options.icon == "None": self.ui.icon.set_active(4) else: self.ui.icon.set_active(3) 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.smart_enabled.set_active(self.options.smart_enabled) self.ui.sync_enabled.set_active(self.options.sync_enabled) self.ui.stats_enabled.set_active(self.options.stats_enabled) self.ui.facebook_show_dialog.set_active(self.options.facebook_show_dialog) 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.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.ui.sources.get_model().clear() for s in self.options.sources: self.ui.sources.get_model().append(self.source_to_model_row(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: 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) 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(Texts.TIPS)) try: with io.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_smart_user_updated() self.on_change_enabled_toggled() self.on_download_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_copyto_enabled_toggled() self.on_quotes_change_enabled_toggled() self.on_icon_changed() self.on_favorites_operations_changed() self.update_clipboard_state() self.build_add_button_menu() 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(): GObject.idle_add(_finish_loading) timer = threading.Timer(1, _idle_finish_loading) timer.start() def on_add_button_clicked(self, widget=None): def position(x, y): 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 self.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(x, y): 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): self.add_menu = Gtk.Menu() items = [ (_("Images"), self.on_add_images_clicked), (_("Folders"), self.on_add_folders_clicked), '-', (_("Flickr"), self.on_add_flickr_clicked), (_("Wallhaven.cc"), self.on_add_wallhaven_clicked), # (_("Wallbase.cc"), self.on_add_wallbase_clicked), (_("Panoramio"), self.on_add_panoramio_clicked), (_("Wallpapers.net"), self.on_add_wn_clicked), (_("Reddit"), self.on_add_reddit_clicked), (_("Media RSS"), self.on_add_mediarss_clicked), ] for x in items: if x == '-': item = Gtk.SeparatorMenuItem.new() else: item = Gtk.MenuItem() item.set_label(x[0]) item.connect("activate", x[1]) self.add_menu.append(item) self.add_menu.show_all() def build_remove_button_menu(self): model, rows = self.ui.sources.get_selection().get_selected_rows() has_downloaders = False for row in rows: type = Options.str_to_type(model[row][1]) if type in Options.SourceType.dl_types and type not in UNREMOVEABLE_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 the Earth downloader: if row[0] and row[1] == Options.type_to_str(Options.SourceType.EARTH): updated = False if not self.ui.change_enabled.get_active(): self.ui.change_enabled.set_active(True) updated = True if self.get_change_interval() > 30 * 60: self.set_change_interval(30 * 60) updated = True if not self.ui.download_enabled.get_active(): self.ui.download_enabled.set_active(True) updated = True if self.get_download_interval() > 30 * 60: self.set_download_interval(30 * 60) updated = True if updated: self.parent.show_notification( _("World Sunlight Map enabled"), _("Using the World Sunlight Map requires both downloading and changing " "enabled at intervals of 30 minutes or less. Settings were adjusted automatically.")) # special case when enabling the Recommended or Latest downloader: elif row[0] and row[1] in (Options.type_to_str(Options.SourceType.RECOMMENDED),) and \ not self.parent.options.smart_enabled: row[0] = False self.dialog = SmartFeaturesConfirmationDialog() def _on_ok(button): self.parent.options.smart_enabled = self.dialog.ui.smart_enabled.get_active() self.parent.options.write() self.ui.smart_enabled.set_active(self.parent.options.smart_enabled) if self.parent.options.smart_enabled: row[0] = True self.dialog.ui.btn_ok.connect("clicked", _on_ok) self.dialog.run() self.dialog.destroy() self.dialog = None 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_download_interval(self, seconds): self.set_time(seconds, self.ui.download_interval_text, self.ui.download_interval_time_unit, times=(60, 60 * 60, 24 * 60 * 60)) 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_download_interval(self): return self.read_time( self.ui.download_interval_text, self.ui.download_interval_time_unit, 60, self.options.download_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", "gif", "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): chooser = Gtk.FileChooserDialog(_("Add Folders - Only add the root folders, subfolders are searched recursively"), 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(Options.SourceType.FOLDER, 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] == Options.type_to_str(type): if type == Options.SourceType.FOLDER: existing[os.path.normpath(_u(r[2]))] = r, i else: existing[self.model_row_to_source(r)[2]] = r, i newly_added = 0 for f in locations: if type == Options.SourceType.FOLDER or type == Options.SourceType.IMAGE: f = os.path.normpath(f) elif type in UNREMOVEABLE_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 = Options.str_to_type(model[row][1]) if type in Options.SourceType.dl_types and type not in UNREMOVEABLE_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 Options.str_to_type(model[row][1]) not in UNREMOVEABLE_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_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 = Options.str_to_type(edited_row[1]) if type == Options.SourceType.IMAGE or type == Options.SourceType.FOLDER: subprocess.call(["xdg-open", os.path.realpath(_u(edited_row[2]))]) elif type == Options.SourceType.FAVORITES: subprocess.call(["xdg-open", self.parent.options.favorites_folder]) elif type == Options.SourceType.FETCHED: subprocess.call(["xdg-open", self.parent.options.fetched_folder]) elif type in EDITABLE_TYPES: if type == Options.SourceType.WN: self.dialog = AddWallpapersNetCategoryDialog() elif type == Options.SourceType.FLICKR: self.dialog = AddFlickrDialog() elif type == Options.SourceType.WALLBASE: self.dialog = AddWallbaseDialog() elif type == Options.SourceType.WALLHAVEN: self.dialog = AddWallhavenDialog() elif type == Options.SourceType.REDDIT: self.dialog = AddRedditDialog() elif type == Options.SourceType.MEDIA_RSS: self.dialog = AddMediaRssDialog() elif type == Options.SourceType.PANORAMIO: self.dialog = AddPanoramioDialog() self.dialog.set_edited_row(edited_row) self.show_dialog(self.dialog) 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) 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...")) if len(rows) == 1: source = model[rows[0]] type = Options.str_to_type(source[1]) if type == Options.SourceType.IMAGE: self.ui.edit_source.set_sensitive(True) self.ui.edit_source.set_label(_("View Image")) elif type in [Options.SourceType.FOLDER, Options.SourceType.FAVORITES, Options.SourceType.FETCHED]: self.ui.edit_source.set_sensitive(True) self.ui.edit_source.set_label(_("Open Folder")) elif type in EDITABLE_TYPES: self.ui.edit_source.set_sensitive(True) self.ui.edit_source.set_label(_("Edit...")) def timer_func(): self.show_thumbs(list(model[row] for row in rows)) 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 Options.str_to_type(model[row][1]) in UNREMOVEABLE_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], Options.str_to_type(row[1]), Texts.SOURCES[row[1]][0] if row[1] in Texts.SOURCES else _u(row[2])] def source_to_model_row(self, s): srctype = Options.type_to_str(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(gdk_thread=False, force=True) images = [] folders = [] image_count = 0 for row in source_rows: if not row: continue type = Options.str_to_type(row[1]) if type == Options.SourceType.IMAGE: image_count += 1 images.append(_u(row[2])) else: folder = self.parent.get_folder_of_source(self.model_row_to_source(row)) image_count += sum(1 for f in Util.list_files(folders=(folder,), filter_func=Util.is_image, max_files=1, randomize=False)) folders.append(folder) if image_count > -1: folder_images = list(Util.list_files(folders=folders, filter_func=Util.is_image, max_files=1000)) random.shuffle(folder_images) to_show = images + folder_images[:100] 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, gdk_thread=False, screen=self.get_screen(), folders=folders, type=thumbs_type) if pin: self.parent.thumbs_manager.pin() if thumbs_type: self.parent.update_indicator(is_gtk_thread=False, auto_changed=False) except Exception: logger.exception(lambda: "Could not create thumbs window:") def on_add_wn_clicked(self, widget=None): self.show_dialog(AddWallpapersNetCategoryDialog()) def on_add_mediarss_clicked(self, widget=None): self.show_dialog(AddMediaRssDialog()) def on_add_reddit_clicked(self, widget=None): self.show_dialog(AddRedditDialog()) def on_add_flickr_clicked(self, widget=None): self.show_dialog(AddFlickrDialog()) def on_add_wallbase_clicked(self, widget=None): self.show_dialog(AddWallbaseDialog()) def on_add_wallhaven_clicked(self, widget=None): self.show_dialog(AddWallhavenDialog()) def on_add_panoramio_clicked(self, widget=None): self.show_dialog(AddPanoramioDialog()) 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_downloaded.set_label("") self.ui.error_favorites.set_label("") self.ui.error_fetched.set_label("") self.hide() self.parent.trigger_download() self.on_destroy() self.parent.show_usage_stats_notice() 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): 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.download_enabled = self.ui.download_enabled.get_active() self.options.download_interval = self.get_download_interval() self.options.quota_enabled = self.ui.quota_enabled.get_active() try: self.options.quota_size = int(self.ui.quota_size.get_text()) if self.options.quota_size < 50: self.options.quota_size = 50 except Exception: logger.exception(lambda: "Could not understand quota size") if os.access(self.dl_chooser.get_folder(), os.W_OK): self.options.download_folder = self.dl_chooser.get_folder() 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)) 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(_u(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 = "Current" elif self.ui.icon.get_active() == 4: self.options.icon = "None" elif self.ui.icon.get_active() == 3: file = _u(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.smart_enabled = self.ui.smart_enabled.get_active() if self.ui.sync_enabled.get_sensitive(): self.options.sync_enabled = self.ui.sync_enabled.get_active() self.options.stats_enabled = self.ui.stats_enabled.get_active() self.options.facebook_show_dialog = self.ui.facebook_show_dialog.get_active() 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.clock_enabled = self.ui.clock_enabled.get_active() self.options.clock_font = _u(self.ui.clock_font.get_font_name()) self.options.clock_date_font = _u(self.ui.clock_date_font.get_font_name()) self.options.quotes_enabled = self.ui.quotes_enabled.get_active() self.options.quotes_font = _u(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 = _u(self.ui.quotes_tags.get_text()) self.options.quotes_authors = _u(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 = os.path.expanduser(u"~/.config/autostart/variety.desktop") if not self.ui.autostart.get_active(): try: if os.path.exists(file): logger.info(lambda: "Removing autostart entry") os.unlink(file) except Exception: logger.exception(lambda: "Could not remove autostart entry variety.desktop") 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_download_enabled_toggled(self, widget = None): active = self.ui.download_enabled.get_active() self.ui.download_interval_text.set_sensitive(active) self.ui.download_interval_time_unit.set_sensitive(active) self.ui.download_folder_chooser.set_sensitive(active) self.ui.quota_enabled.set_sensitive(active) self.ui.quota_size.set_sensitive(active) self.on_quota_enabled_toggled() def on_quota_enabled_toggled(self, widget = None): active = self.ui.download_enabled.get_active() and self.ui.quota_enabled.get_active() self.ui.quota_size.set_sensitive(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_lightness_enabled_toggled(self, widget = None): self.ui.lightness.set_sensitive(self.ui.lightness_enabled.get_active()) def on_smart_enabled_toggled(self, widget=None): self.on_smart_user_updated() if not self.ui.smart_enabled.get_active(): for s in self.parent.options.sources: if s[1] in (Options.SourceType.RECOMMENDED,) and s[0]: self.parent.show_notification(_("Recommended images source disabled")) s[0] = False self.parent.options.write() for i, r in enumerate(self.ui.sources.get_model()): if Options.str_to_type(r[1]) in (Options.SourceType.RECOMMENDED,): r[0] = False elif not self.parent.smart.user: def _f(): self.parent.smart.load_user(create_if_missing=True) threading.Timer(0, _f).start() def on_destroy(self, widget = None): if hasattr(self, "dialog") and self.dialog: try: self.dialog.destroy() except Exception: pass for chooser in (self.dl_chooser, self.fav_chooser, self.fetched_chooser): try: chooser.destroy() except Exception: pass self.parent.thumbs_manager.hide(gdk_thread=True, force=False) def on_downloaded_changed(self, widget=None): self.delayed_apply() if not os.access(self.dl_chooser.get_folder(), os.W_OK): self.ui.error_downloaded.set_label(_("No write permissions")) else: self.ui.error_downloaded.set_label("") if not self.loading and self.ui.quota_enabled.get_active(): self.ui.quota_enabled.set_active(False) self.parent.show_notification( _("Limit disabled"), _("Changing the download folder automatically turns off the size limit to prevent from accidental data loss"), important=True) def update_real_download_folder(self): if not Util.same_file_paths(self.parent.options.download_folder, self.parent.real_download_folder): self.ui.real_download_folder.set_visible(True) self.ui.real_download_folder.set_text(_("Actual download folder: %s ") % self.parent.real_download_folder) 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 = _u(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() == 3) 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_login_register_clicked(self, widget=None): if hasattr(self, 'dialog') and self.dialog and isinstance(self.dialog, LoginOrRegisterDialog): return login_dialog = LoginOrRegisterDialog() login_dialog.set_smart(self.parent.smart) self.show_dialog(login_dialog) def close_login_register_dialog(self): if hasattr(self, "dialog") and self.dialog and isinstance(self.dialog, LoginOrRegisterDialog): def _close(): self.dialog.destroy() self.dialog = None GObject.idle_add(_close) def on_smart_user_updated(self, create_user_attempts=0): self.update_status_message() sync_allowed = self.ui.smart_enabled.get_active() and self.parent.smart.is_registered() self.ui.sync_enabled.set_sensitive(sync_allowed) self.ui.sync_login_note.set_visible(not sync_allowed) if not sync_allowed: self.ui.sync_enabled.set_active(False) else: self.ui.sync_enabled.set_active(self.options.sync_enabled) if self.parent.smart.user: self.ui.box_smart_connecting.set_visible(False) self.ui.box_smart_user.set_visible(True) username = self.parent.smart.user.get("username") self.ui.smart_username.set_markup(_('Logged in as: ') + '%s' % ( self.parent.smart.get_profile_url(), username or _('Anonymous'))) self.ui.btn_login_register.set_label(_('Login or register') if not bool(username) else _('Switch user')) self.ui.smart_register_note.set_visible(not bool(username)) else: if not self.ui.smart_enabled.get_active(): self.ui.box_smart_connecting.set_visible(False) self.ui.box_smart_user.set_visible(False) elif create_user_attempts == 0: def _create_user(): def _start(): self.ui.smart_spinner.set_visible(True) self.ui.smart_spinner.start() self.ui.smart_connect_error.set_visible(False) self.ui.box_smart_connecting.set_visible(True) GObject.idle_add(_start) try: self.parent.smart.load_user(create_if_missing=True) self.on_smart_user_updated(create_user_attempts + 1) except IOError: def _fail(): self.ui.smart_spinner.set_visible(False) self.ui.smart_connect_error.set_visible(True) GObject.idle_add(_fail) finally: def _stop(): self.ui.smart_spinner.set_visible(False) GObject.idle_add(_stop) threading.Timer(0, _create_user).start() 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/variety/Texts.py0000664000000000000000000001114412641771551012607 0ustar # -*- 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 import _, _u FILTERS = { "Keep original": _("Keep original"), "Grayscale": _("Grayscale"), "Heavy blur": _("Heavy blur"), "Soft blur": _("Soft blur"), "Oil painting": _("Oil painting"), "Pencil sketch": _("Pencil sketch"), "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")), "earth": ("World Sunlight Map - live wallpaper from Die.net", _("World Sunlight Map - live wallpaper from Die.net")), "bing": ("Bing Photo of the Day", _("Bing Photo of the Day")), "unsplash": ("High-resolution photos from Unsplash.com", _("High-resolution photos from Unsplash.com")), } TIPS = [ _("If you use KDE, you need to perform some actions before Variety will work. Please read here: http://peterlevi.com/variety/2014/05/variety-and-kde/"), _("You can change the wallpaper back and forth by scrolling the mouse wheel on top of the indicator icon."), _("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 ~/.config/variety/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 \"Manual 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 ~/.config/variety/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."), _("To enable desktop notifications when the wallpaper changes, uncomment the two lines at the bottom of ~/.config/variety/scripts/set_wallpaper."), _("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."), _("When you choose to save quotes to Favorites, these are by default saved to ~/.config/variety/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/variety/EarthDownloader.py0000664000000000000000000000360612641771551014566 0ustar # -*- 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 subprocess logger = logging.getLogger('variety') from variety import Downloader EARTH_IMAGE_URL = "http://static.die.net/earth/mercator/1600.jpg" EARTH_ORIGIN_URL = "http://www.die.net/earth/" EARTH_FILENAME = "earth.jpg" class EarthDownloader(Downloader.Downloader): def __init__(self, parent): super(EarthDownloader, self).__init__( parent, "earth", "Die.net", EARTH_ORIGIN_URL, is_refresher=True) def convert_to_filename(self, url): return "Earth" def download_one(self): logger.info(lambda: "Downloading world sunlight map from " + EARTH_ORIGIN_URL) downloaded = self.save_locally(self.location, EARTH_IMAGE_URL, force_download=True, extra_metadata={'headline': 'World Sunlight Map'}) cropped = os.path.join(self.target_folder, EARTH_FILENAME) subprocess.call(["convert", downloaded, "-gravity", "north", "-crop", "100%x95%", cropped]) for f in os.listdir(self.target_folder): if f != EARTH_FILENAME and f.lower().endswith(".jpg"): os.unlink(os.path.join(self.target_folder, f)) return cropped variety/variety/PanoramioDownloader.py0000664000000000000000000001153212641771551015445 0ustar # -*- 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 urllib import json import random import logging import time from variety import Downloader from variety.Util import Util from variety_lib import varietyconfig logger = logging.getLogger('variety') random.seed() class PanoramioDownloader(Downloader.Downloader): API_URL = "http://www.panoramio.com/map/get_panoramas.php?set=public&from=%d&to=%d&minx=%s&miny=%s&maxx=%s&maxy=%s&size=original" last_download_time = 0 def __init__(self, parent, location): super(PanoramioDownloader, self).__init__(parent, "panoramio", "Panoramio", location) self.parse_location() self.last_fill_time = 0 self.queue = [] def convert_to_filename(self, url): return "panoramio_" + super(PanoramioDownloader, self).convert_to_filename(url) def parse_location(self): data = json.loads(self.location) self.minx = data['minx'] self.miny = data['miny'] self.maxx = data['maxx'] self.maxy = data['maxy'] def search(self, _from, _to): url = PanoramioDownloader.API_URL % (_from, _to, self.minx, self.miny, self.maxx, self.maxy) logger.info(lambda: "Performing Panoramio API call: url=%s" % url) return Util.fetch_json(url) def download_one(self): min_download_interval, min_fill_queue_interval = self.parse_server_options("panoramio", 0, 0) if time.time() - PanoramioDownloader.last_download_time < min_download_interval: logger.info(lambda: "Minimal interval between Panoramio downloads is %d, skip this attempt" % min_download_interval) return None logger.info(lambda: "Downloading an image from Panoramio, " + self.location) logger.info(lambda: "Queue size: %d" % len(self.queue)) if not self.queue: if time.time() - self.last_fill_time < min_fill_queue_interval: logger.info(lambda: "Panoramio queue empty, but minimal interval between fill attempts is %d, " "will try again later" % min_fill_queue_interval) return None self.fill_queue() if not self.queue: logger.info(lambda: "Panoramio queue still empty after fill request") return None PanoramioDownloader.last_download_time = time.time() photo = self.queue.pop() image = self.save_locally(photo["photo_url"], photo["photo_file_url"], extra_metadata={"author": photo["owner_name"], "authorURL": photo["owner_url"], "headline": photo["photo_title"]}) # Uncomment to overlay Panoramio logo: # logo = os.path.join(varietyconfig.get_data_path(), 'panoramio/logo.png') # logo_command = u"mogrify -gravity SouthEast -draw 'image Over 70,70 0,0 \"%s\"' \"%s\"" % (logo, image) # os.system(logo_command.encode('utf8')) return image def fill_queue(self): self.last_fill_time = time.time() logger.info(lambda: "Filling Panoramio queue: " + self.location) total_count = int(self.search(0, 0)["count"]) _from = random.randint(0, max(0, total_count - 100)) _to = min(_from + 100, total_count) data = self.search(_from, _to) for photo in data["photos"]: try: width = int(photo["width"]) height = int(photo["height"]) if self.parent and not self.parent.size_ok(width, height): continue if self.parent and photo["photo_url"] in self.parent.banned: continue except Exception: # consider ok pass self.queue.append(photo) random.shuffle(self.queue) if len(self.queue) >= 20: self.queue = self.queue[:len(self.queue)//2] # only use randomly half the images - if we ever hit the same page again, we'll still have what to download logger.info(lambda: "Panoramio queue populated with %d URLs" % len(self.queue)) variety/variety/Options.py0000664000000000000000000007265512657177764013166 0ustar # -*- 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 io import os import hashlib from configobj import ConfigObj from configobj import DuplicateError from variety.Util import Util from variety_lib import varietyconfig import logging from variety import _str logger = logging.getLogger('variety') TRUTH_VALUES = ["enabled", "1", "true", "on", "yes"] class Options: OUTDATED_HASHES = {'clock_filter': ['dca6bd2dfa2b8c4e2db8801e39208f7f']} class SourceType: IMAGE = 1 FOLDER = 2 FAVORITES = 3 FETCHED = 4 WN = 5 DESKTOPPR = 6 FLICKR = 7 APOD = 8 WALLBASE = 9 MEDIA_RSS = 10 EARTH = 11 PANORAMIO = 12 WALLHAVEN = 13 REDDIT = 14 BING = 15 UNSPLASH = 16 RECOMMENDED = 19 LATEST = 20 type_to_str = { FAVORITES: "favorites", FETCHED: "fetched", IMAGE: "image", FOLDER: "folder", WN: "wn", DESKTOPPR: "desktoppr", FLICKR: "flickr", APOD: "apod", WALLBASE: "wallbase", MEDIA_RSS: "mediarss", EARTH: "earth", PANORAMIO: "panoramio", WALLHAVEN: "wallhaven", REDDIT: "reddit", BING: "bing", UNSPLASH: "unsplash", RECOMMENDED: "recommended", LATEST: "latest", } str_to_type = dict((v,k) for k, v in type_to_str.items()) dl_types = [WN, DESKTOPPR, FLICKR, APOD, WALLBASE, MEDIA_RSS, EARTH, PANORAMIO, WALLHAVEN, REDDIT, BING, UNSPLASH, RECOMMENDED, LATEST] class LightnessMode: DARK = 0 LIGHT = 1 def __init__(self): self.configfile = os.path.expanduser(u"~/.config/variety/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.download_enabled = config["download_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.download_interval = int(config["download_interval"]) if self.download_interval < 60: self.download_interval = 60 except Exception: pass try: self.download_folder = os.path.expanduser(config["download_folder"]) except Exception: pass try: self.quota_enabled = config["quota_enabled"].lower() in TRUTH_VALUES except Exception: pass try: self.quota_size = int(config["quota_size"]) if self.quota_size < 50: self.quota_size = 50 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.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", "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 = 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.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.facebook_show_dialog = config["facebook_show_dialog"].lower() in TRUTH_VALUES except Exception: pass try: self.facebook_message = config["facebook_message"].strip() 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 = 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 = 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 = 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_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: self.slideshow_custom_folder = os.path.expanduser( config["slideshow_custom_folder"] or Util.get_xdg_pictures_folder()) 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 if "sources" in config: self.sources = [] sources = config["sources"] for v in sources.values(): try: self.sources.append(Options.parse_source(v)) except Exception: logger.exception(lambda: "Cannot parse source: " + v) self.parse_autosources() for s in self.sources: if s[1] in (Options.SourceType.RECOMMENDED,) and not self.smart_enabled: s[0] = False 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(_str(config[key])).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 io.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 io.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()) if not s[1].lower() in [f[1].lower() for f in self.filters]: 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, (Options.str_to_type(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 str_to_type(s): s = s.lower() if s in Options.SourceType.str_to_type: return Options.SourceType.str_to_type[s] else: raise Exception("Unknown source type") @staticmethod def type_to_str(stype): return Options.SourceType.type_to_str[stype] def set_defaults(self): self.change_enabled = True self.change_on_start = False self.change_interval = 300 self.download_enabled = True self.download_interval = 600 self.download_folder = os.path.expanduser(u"~/.config/variety/Downloaded") self.quota_enabled = True self.quota_size = 500 self.favorites_folder = os.path.expanduser(u"~/.config/variety/Favorites") self.favorites_operations = [["Downloaded", "Copy"], ["Fetched", "Move"], ["Others", "Copy"]] self.fetched_folder = os.path.expanduser(u"~/.config/variety/Fetched") self.clipboard_enabled = False self.clipboard_use_whitelist = True self.clipboard_hosts = "alpha.wallhaven.cc,wallbase.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.smart_notice_shown = False self.smart_register_shown = False self.stats_notice_shown = False self.smart_enabled = True self.sync_enabled = True self.stats_enabled = True self.facebook_show_dialog = True self.facebook_message = "" self.copyto_enabled = False self.copyto_folder = "Default" self.clock_enabled = False self.clock_font = "Ubuntu Condensed, 70" self.clock_date_font = "Ubuntu Condensed, 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 = "Bitstream Charter 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_favorites_file = os.path.expanduser(u"~/.config/variety/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.DESKTOPPR, "Random wallpapers from Desktoppr.co"], [True, Options.SourceType.BING, "Bing Photo of the Day"], [True, Options.SourceType.UNSPLASH, "High-resolution photos from Unsplash.com"], [False, Options.SourceType.APOD, "NASA's Astronomy Picture of the Day"], [True, Options.SourceType.WN, "http://wallpapers.net/nature-desktop-wallpapers.html"], [True, Options.SourceType.FLICKR, "user:www.flickr.com/photos/peter-levi/;user_id:93647178@N00;"], [True, Options.SourceType.WALLHAVEN, "nature"], ] 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, "Pencil sketch", """-colorspace gray \( +clone -tile ~/.config/variety/pencil_tile.png -draw "color 0,0 reset" +clone +swap -compose color_dodge -composite \) -fx 'u*.2+v*.8'"""], [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["download_enabled"] = str(self.download_enabled) config["download_interval"] = str(self.download_interval) config["download_folder"] = Util.collapseuser(self.download_folder) config["quota_enabled"] = str(self.quota_enabled) config["quota_size"] = str(self.quota_size) config["favorites_folder"] = Util.collapseuser(self.favorites_folder) config["favorites_operations"] = ';'.join(':'.join(x) for x in self.favorites_operations) 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["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["facebook_show_dialog"] = str(self.facebook_show_dialog) config["facebook_message"] = self.facebook_message 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_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(Options.type_to_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/variety/AttrDict.py0000664000000000000000000000454112641771551013221 0ustar # -*- 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 collections import defaultdict import json 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 = map(AttrDict.converted, v) return tuple(r) if isinstance(v, tuple) else r else: return v def merge(self, arg): if hasattr(arg, 'iteritems'): self.merge(arg.iteritems()) 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__ if __name__ == "__main__": a = AttrDict({'a': {'b':1}}) assert not bool(a.deep.inside) assert bool(a.a) assert a.a.b == 1 a.l.k = 3 assert a.l.k == 3 a.f.g.h = 2 assert a.f.g.h == 2 a["x"]["y"]["z"] = 1 assert a["x"]["y"]["z"] == 1 b = AttrDict(x=1, y=2) assert not bool(b.deep.inside) assert b.x == 1 assert b.y == 2 b.c = {'z': 3} assert b.c.z == 3 assert not bool(b.c.dredrefre) variety/variety/FolderChooser.py0000664000000000000000000000642712641772700014243 0ustar # -*- 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 from gi.repository import Gtk from variety.Util import Util from variety import _, _u import logging 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(_u(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/variety/DesktopprDownloader.py0000664000000000000000000000326612641771551015500 0ustar # -*- 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 import logging from variety import Downloader from variety.Util import Util logger = logging.getLogger('variety') class DesktopprDownloader(Downloader.Downloader): def __init__(self, parent): super(DesktopprDownloader, self).__init__( parent, "desktoppr", "Desktoppr.co", "https://api.desktoppr.co/1/wallpapers/random") def convert_to_filename(self, url): return "Desktoppr" def download_one(self): logger.info(lambda: "Downloading a random image from desktoppr.co") content = Util.fetch(self.location) response = json.loads(content) if response["response"]["review_state"] != "safe": logger.info(lambda: "Non-safe image returned by Desktoppr, skipping") return None origin_url = response["response"]["url"] image_url = response["response"]["image"]["url"] return self.save_locally(origin_url, image_url) variety/variety/AboutVarietyDialog.py0000664000000000000000000000244212641771551015237 0ustar # -*- 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 import _, _u import logging logger = logging.getLogger('variety') from variety_lib.AboutDialog import AboutDialog # 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/variety/AddWallhavenDialog.py0000664000000000000000000000336412641771551015157 0ustar # -*- 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.AbstractAddByQueryDialog import AbstractAddByQueryDialog from variety.Options import Options from variety.WallhavenDownloader import WallhavenDownloader from variety_lib.helpers import get_builder from variety import _ class AddWallhavenDialog(AbstractAddByQueryDialog): __gtype_name__ = "AddWallhavenDialog" def __new__(cls): builder = get_builder('AddWallhavenDialog') new_object = builder.get_object('add_wallhaven_dialog') new_object.finish_initializing(builder) return new_object def validate(self, query): valid = WallhavenDownloader.validate(query) return query, None if valid else _("No images found") def commit(self, final_query): if len(final_query): self.parent.on_add_dialog_okay(Options.SourceType.WALLHAVEN, final_query, self.edited_row) if __name__ == "__main__": dialog = AddWallhavenDialog() dialog.show() Gtk.main() variety/variety/MediaRssDownloader.py0000664000000000000000000002112312641771551015224 0ustar # -*- 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 random import urlparse import xml.etree.ElementTree as ET import logging from variety import Downloader 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(Downloader.Downloader): def __init__(self, parent, url): super(MediaRssDownloader, self).__init__(parent, "mediarss", "Media RSS", url) self.queue = [] def convert_to_filename(self, url): return "mediarss_" + super(MediaRssDownloader, self).convert_to_filename(url) @staticmethod def fetch(url): content = Util.fetch(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 = "http://" + 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_one(self): logger.info(lambda: "Downloading an image from MediaRSS, " + self.location) logger.info(lambda: "Queue size: %d" % len(self.queue)) if not self.queue: self.fill_queue() if not self.queue: logger.info(lambda: "MediaRSS queue empty after fill") return None origin_url, image_url, source_type, source_location, source_name, extra_metadata = self.queue.pop() parse = urlparse.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) @staticmethod def picasa_hack(feed_url): """ Picasa hack - by default Picasa's RSS feeds link to low-resolution images. Add special parameter to request the full-resolution instead:""" if feed_url.find("://picasaweb.") > 0: logger.info(lambda: "Picasa hack to get full resolution images: add imgmax=d to the feed URL") feed_url = feed_url.replace("&imgmax=", "&imgmax_disabled=") feed_url += "&imgmax=d" logger.info(lambda: "Final Picasa feed URL: " + feed_url) return feed_url def fill_queue(self): logger.info(lambda: "MediaRSS URL: " + self.location) feed_url = self.location feed_url = MediaRssDownloader.picasa_hack(feed_url) s = self.fetch(feed_url) # try: # self.channel_title = s.find("channel/title").text # except Exception: # self.channel_title = "origin" # 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: extra_metadata['keywords'] = map(lambda k: k.strip(), item.find("{0}keywords".format(MEDIA_NS)).text.split(',')) except: pass self.process_content(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(self.queue) logger.info(lambda: "MediaRSS queue populated with %d URLs" % len(self.queue)) def process_content(self, 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.parent and origin_url in self.parent.banned: 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.parent and width and height and not self.parent.size_ok(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)) self.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/po/0000775000000000000000000000000012657457236010070 5ustar variety/po/ja.po0000644000000000000000000025017012655724346011022 0ustar # Japanese translation for variety # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the variety package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: variety\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-01-29 10:57+0200\n" "PO-Revision-Date: 2015-08-10 14:48+0000\n" "Last-Translator: ub \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-02-07 20:28+0000\n" "X-Generator: Launchpad (build 17908)\n" #: ../data/plugins/quotes/GoodreadsSource.py:49 msgid "Fetches quotes from Goodreads.com" msgstr "Goodreads.comから名言を取り込みます" #: ../data/ui/LoginOrRegisterDialog.ui.h:1 msgid "Login to VRTY.ORG" msgstr "VRTY.ORG にログイン" #: ../data/ui/LoginOrRegisterDialog.ui.h:2 msgid "Username: " msgstr "ユーザー名: " #: ../data/ui/LoginOrRegisterDialog.ui.h:3 msgid "Password: " msgstr "パスワード: " #: ../data/ui/LoginOrRegisterDialog.ui.h:4 msgid "No account? Register here" msgstr "アカウントを持っていませんか? ここで登録できます" #: ../data/ui/LoginOrRegisterDialog.ui.h:5 msgid "Forgot your password?" msgstr "パスワードを忘れましたか?" #: ../data/ui/LoginOrRegisterDialog.ui.h:6 msgid "" "Tip: You can also login to VRTY.ORG in a " "browser and click the link \"Trigger Variety " "login\" in your profile." msgstr "" "Tip: ブラウザでも VRTY.ORG にログインできます。あなたのプロファイルの " "\"Trigger Variety login\" をクリックしてください。" #: ../data/ui/LoginOrRegisterDialog.ui.h:7 msgid "Login" msgstr "ログイン" #: ../variety/LoginOrRegisterDialog.py:80 #, python-format msgid "Oops, server returned error (%s)" msgstr "Oops,サーバーがエラーを返しました (%s)" #: ../variety/LoginOrRegisterDialog.py:85 msgid "Could not connect to server" msgstr "サーバーへ接続できません" #: ../variety/AddWallhavenDialog.py:38 ../variety/AddWallbaseDialog.py:38 #: ../variety/AddFlickrDialog.py:138 msgid "No images found" msgstr "画像が見つかりません" #: ../data/ui/AddPanoramioDialog.ui.h:1 msgid "Variety - add Panoramio image source" msgstr "Variety - Panoramio を追加" #. (_("Wallbase.cc"), self.on_add_wallbase_clicked), #: ../data/ui/AddPanoramioDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:388 msgid "Panoramio" msgstr "Panoramio" #: ../data/ui/AddPanoramioDialog.ui.h:3 msgid "Please zoom over your area of interest." msgstr "興味のあるエリアをズームしてください。" #: ../variety/FolderChooser.py:65 msgid "Choose a folder" msgstr "フォルダーを選択" #: ../variety/FolderChooser.py:66 ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Cancel" msgstr "キャンセル" #: ../variety/FolderChooser.py:66 msgid "OK" msgstr "OK" #: ../data/ui/AddWallhavenDialog.ui.h:1 msgid "Variety - add Wallhaven.cc image source" msgstr "Variety - Wallhaven.ccを画像ソースに追加" #: ../data/ui/AddWallhavenDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:386 msgid "Wallhaven.cc" msgstr "Wallhaven.cc" #: ../data/ui/AddWallhavenDialog.ui.h:3 msgid "" "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." msgstr "" #: ../data/ui/AddWallhavenDialog.ui.h:8 ../data/ui/AddWallbaseDialog.ui.h:9 msgid "Enter keywords or paste URL here: " msgstr "キーワードを入力またはURLをペースト: " #: ../data/ui/AddWallhavenDialog.ui.h:9 ../data/ui/AddFlickrDialog.ui.h:16 #: ../data/ui/AddWallbaseDialog.ui.h:10 msgid "Just a moment to check this search" msgstr "しばらくお待ち下さい" #: ../data/ui/AddWallhavenDialog.ui.h:10 ../data/ui/AddFlickrDialog.ui.h:17 #: ../data/ui/AddRedditDialog.ui.h:9 ../data/ui/AddMediaRssDialog.ui.h:6 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:10 #: ../data/ui/AddWallbaseDialog.ui.h:11 msgid " " msgstr " " #: ../variety/QuotesEngine.py:232 msgid "No quote plugins" msgstr "名言プラグインがありません" #: ../variety/QuotesEngine.py:232 msgid "There are no quote plugins installed" msgstr "名言プラグインがインストールされていません" #: ../variety/QuotesEngine.py:238 msgid "No suitable quote plugins" msgstr "適切な名言プラグインがありません" #: ../variety/QuotesEngine.py:239 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "キーワードと作者で検索できる名言プラグインがありません" #: ../variety/QuotesEngine.py:251 msgid "Could not fetch quotes" msgstr "名言を取り込めません" #: ../variety/QuotesEngine.py:252 msgid "Quotes services may be down, we will continue trying" msgstr "取り込みを続けますがおそらく名言サービスがダウンしています" #: ../variety/QuotesEngine.py:255 msgid "Could not find quotes" msgstr "名言が見つかりません" #: ../variety/QuotesEngine.py:256 msgid "Maybe you are searching for something very obscure?" msgstr "見つけにくい指定になっていませんか?" #: ../variety/Texts.py:20 msgid "Keep original" msgstr "オリジナル画像" #: ../variety/Texts.py:21 msgid "Grayscale" msgstr "モノクロ" #: ../variety/Texts.py:22 msgid "Heavy blur" msgstr "ヘビーブラー(ぼかし)" #: ../variety/Texts.py:23 msgid "Soft blur" msgstr "ソフトブラー(ぼかし)" #: ../variety/Texts.py:24 msgid "Oil painting" msgstr "油絵" #: ../variety/Texts.py:25 msgid "Pencil sketch" 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:37 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:38 msgid "Random wallpapers from Desktoppr.co" msgstr "Desktoppr.coからランダムに" #: ../variety/Texts.py:39 msgid "NASA's Astronomy Picture of the Day" msgstr "NASAの今日の天文写真" #: ../variety/Texts.py:41 msgid "World Sunlight Map - live wallpaper from Die.net" msgstr "" #: ../variety/Texts.py:42 msgid "Bing Photo of the Day" msgstr "" #: ../variety/Texts.py:43 msgid "High-resolution photos from Unsplash.com" msgstr "" #: ../variety/Texts.py:47 msgid "" "If you use KDE, you need to perform some actions before Variety will work. " "Please read here: http://peterlevi.com/variety/2014/05/variety-and-kde/" msgstr "" "KDEでVarietyを使うにはいくつかの操作が必要です。これを読んでください:http://peterlevi.com/variety/2014/05/" "variety-and-kde/" #: ../variety/Texts.py:48 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "インジケータのアイコン上でマウスホイールをスクロールすると壁紙が変わります。" #: ../variety/Texts.py:49 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 " "~/.config/variety/scripts. There are examples there for various desktop " "environments." msgstr "" "壁紙変更と共にカスタムコマンドを実行したり別のデスクトップ環境を使うときには ~/.config/variety/scripts " "を編集してください。そこには様々なデスクトップ環境の参考例があります。" #: ../variety/Texts.py:50 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:51 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:52 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:53 msgid "" "Adding your own custom filters is quite easy: open " "~/.config/variety/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 "" "カスタムフィルターの追加は簡単です:~/.config/variety/variety.conf " "を開いて編集します。それぞれのフィルターはImageMagickのconvertに渡されるオプションです。" #: ../variety/Texts.py:54 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:55 msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of ~/.config/variety/scripts/set_wallpaper." msgstr "" "壁紙の変更をデスクトップで通知するには ~/.config/variety/scripts/set_wallpaper の最後の2行のコメントを外します。" #: ../variety/Texts.py:56 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:57 msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "~/.config/variety/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 "" "名言をお気に入りに保存する時デフォルトでは ~/.config/variety/favorite_quotes.txt に保存されます。このファイルは " "Variety の名言ローカルファイルと互換性があります。~/.config/variety/pluginconfig/quotes/ " "にコピーして名言のソースのローカルファイルを有効にすれば表示されます。このファイルはUnixのfortuneとも互換性があります。" #: ../variety/PreferencesVarietyDialog.py:259 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:382 #: ../variety/PreferencesVarietyDialog.py:551 #: ../data/ui/PreferencesVarietyDialog.ui.h:11 msgid "Images" msgstr "画像" #: ../variety/PreferencesVarietyDialog.py:383 msgid "Folders" msgstr "フォルダー" #: ../variety/PreferencesVarietyDialog.py:385 #: ../data/ui/AddFlickrDialog.ui.h:2 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:389 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:2 msgid "Wallpapers.net" msgstr "Wallpapers.net" #: ../variety/PreferencesVarietyDialog.py:390 #: ../data/ui/AddRedditDialog.ui.h:2 msgid "Reddit" msgstr "Reddit" #: ../variety/PreferencesVarietyDialog.py:391 #: ../data/ui/AddMediaRssDialog.ui.h:2 msgid "Media RSS" msgstr "メディアRSS" #: ../variety/PreferencesVarietyDialog.py:416 msgid "Remove the source, keep the files" msgstr "ファイルを残して場所を削除" #: ../variety/PreferencesVarietyDialog.py:417 msgid "Remove the sources, keep the files" msgstr "ファイルを残して場所を削除" #: ../variety/PreferencesVarietyDialog.py:424 msgid "Remove the source and delete the downloaded files" msgstr "場所とダウンロードした画像も削除" #: ../variety/PreferencesVarietyDialog.py:425 msgid "Remove the sources and delete the downloaded files" msgstr "場所とダウンロードした画像も削除" #: ../variety/PreferencesVarietyDialog.py:458 msgid "World Sunlight Map enabled" msgstr "World Sunlight Map有効" #: ../variety/PreferencesVarietyDialog.py:459 msgid "" "Using the World Sunlight Map requires both downloading and changing enabled " "at intervals of 30 minutes or less. Settings were adjusted automatically." msgstr "World Sunlight Mapではダウンロードと30分以内の壁紙変更が必要です。設定は自動的に調整されます。" #: ../variety/PreferencesVarietyDialog.py:544 msgid "Add Images" msgstr "画像を追加" #: ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Add" msgstr "追加" #: ../variety/PreferencesVarietyDialog.py:567 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "フォルダーを追加 - サブフォルダーも調べます" #: ../variety/PreferencesVarietyDialog.py:703 #: ../variety/PreferencesVarietyDialog.py:716 #: ../data/ui/PreferencesVarietyDialog.ui.h:168 msgid "Edit..." msgstr "編集..." #: ../variety/PreferencesVarietyDialog.py:710 msgid "View Image" msgstr "画像を表示" #: ../variety/PreferencesVarietyDialog.py:713 msgid "Open Folder" msgstr "フォルダーを開く" #: ../variety/PreferencesVarietyDialog.py:1092 msgid "Recommended images source disabled" msgstr "おすすめの画像ソース無効" #: ../variety/PreferencesVarietyDialog.py:1120 #: ../variety/PreferencesVarietyDialog.py:1139 #: ../variety/PreferencesVarietyDialog.py:1147 msgid "No write permissions" msgstr "書き込み権限がありません" #: ../variety/PreferencesVarietyDialog.py:1127 msgid "Limit disabled" msgstr "制限を無効にしました" #: ../variety/PreferencesVarietyDialog.py:1128 msgid "" "Changing the download folder automatically turns off the size limit to " "prevent from accidental data loss" msgstr "データ保護のためダウンロード・フォルダーのサイズ制限を解除します" #: ../variety/PreferencesVarietyDialog.py:1134 #, python-format msgid "Actual download folder: %s " msgstr "現在のダウンロード・フォルダー: %s " #: ../variety/PreferencesVarietyDialog.py:1214 msgid "Could not adjust permissions" msgstr "パーミッションを変更できません" #: ../variety/PreferencesVarietyDialog.py:1215 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "次のコマンドを試してください:\n" "sudo chmod %s \"%s\"" #: ../variety/PreferencesVarietyDialog.py:1247 msgid "Logged in as: " msgstr "現在のログイン: " #: ../variety/PreferencesVarietyDialog.py:1249 msgid "Anonymous" msgstr "アノニマス" #: ../variety/PreferencesVarietyDialog.py:1250 #: ../data/ui/PreferencesVarietyDialog.ui.h:109 msgid "Login or register" msgstr "ログインまたは登録" #: ../variety/PreferencesVarietyDialog.py:1250 msgid "Switch user" msgstr "ユーザーを切り替え" #: ../data/ui/AddFlickrDialog.ui.h:1 msgid "Variety - add Flickr as an image source" msgstr "Variety - Flickrを画像の場所に追加" #: ../data/ui/AddFlickrDialog.ui.h:3 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.h:4 #: ../data/ui/PreferencesVarietyDialog.ui.h:58 msgid "Tags: " msgstr "タグ: " #: ../data/ui/AddFlickrDialog.ui.h:5 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.h:7 msgid "User: " msgstr "ユーザー: " #: ../data/ui/AddFlickrDialog.ui.h:8 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.h:10 msgid "Group: " msgstr "グループ: " #: ../data/ui/AddFlickrDialog.ui.h:11 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/group" "s/wallpapers/" msgstr "" "グループURLを入れて下さい。\n" "例: http://www.flickr.com/group" "s/wallpapers/" #: ../data/ui/AddFlickrDialog.ui.h:13 msgid "Text:" msgstr "文字:" #: ../data/ui/AddFlickrDialog.ui.h:14 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by " "prepending them with -.\n" "Example: apple -pie" msgstr "" "写真のタイトル、説明、タグを検索します。検索から除外するには - を使います。\n" "例: apple -pie" #: ../variety/AddMediaRssDialog.py:40 msgid "" "This does not seem to be a valid Media RSS feed URL or there is no content " "there." msgstr "無効なメディアRSSのURLかコンテンツがありません" #: ../variety/VarietyWindow.py:630 ../variety/VarietyWindow.py:772 #: ../variety/VarietyWindow.py:2650 msgid "Already in Favorites" msgstr "お気に入りに入っています" #: ../variety/VarietyWindow.py:634 ../variety/ThumbsManager.py:144 #: ../variety/indicator.py:76 msgid "Copy to _Favorites" msgstr "お気に入りにコピー(_F)" #: ../variety/VarietyWindow.py:635 ../variety/ThumbsManager.py:151 msgid "Move to _Favorites" msgstr "お気に入りに移動(_F)" #. both #: ../variety/VarietyWindow.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:165 ../variety/indicator.py:81 msgid "Move to Favorites" msgstr "お気に入りに移動" #: ../variety/VarietyWindow.py:665 ../variety/ThumbsManager.py:119 msgid "Fetched: Show Origin" msgstr "元の画像をブラウザーで表示" #: ../variety/VarietyWindow.py:667 ../variety/VarietyWindow.py:762 #: ../variety/ThumbsManager.py:121 #, python-format msgid "View at %s" msgstr "壁紙の場所: %s" #: ../variety/VarietyWindow.py:711 msgid "Unknown" msgstr "不明" #: ../variety/VarietyWindow.py:732 #, python-format msgid "Author: %s" msgstr "作者: %s" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 #: ../variety/indicator.py:120 ../variety/indicator.py:185 msgid "Pause on current" msgstr "現在の表示で停止" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 msgid "Resume regular changes" msgstr "自動更新スタート" #: ../variety/VarietyWindow.py:772 ../variety/indicator.py:191 msgid "Save to Favorites" msgstr "お気に入りに保存" #: ../variety/VarietyWindow.py:904 msgid "Filtering too strict?" msgstr "フィルターが厳しいようです" #: ../variety/VarietyWindow.py:905 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "基準に合う画像が少なすぎます" #: ../variety/VarietyWindow.py:1377 msgid "Please add more image sources or wait for some downloads" msgstr "画像の場所をさらに追加するかしばらくお待ち下さい" #: ../variety/VarietyWindow.py:1379 msgid "Please add more image sources" msgstr "さらに画像の場所を追加して下さい" #: ../variety/VarietyWindow.py:1380 msgid "No more wallpapers" msgstr "壁紙が少なすぎます" #: ../variety/VarietyWindow.py:1566 msgid "Current wallpaper is not in the image sources" msgstr "現在の壁紙は画像の場所にありません" #: ../variety/VarietyWindow.py:1601 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "%s に移動する権限がありません。" #: ../variety/VarietyWindow.py:1603 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "%s にコピーする権限がありません。" #: ../variety/VarietyWindow.py:1623 ../variety/VarietyWindow.py:1643 msgid "Cannot delete" msgstr "削除できません" #: ../variety/VarietyWindow.py:1624 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "%s をゴミ箱に移動する権限がありません。" #: ../variety/VarietyWindow.py:1644 msgid "" "Probably there is no utility for moving to Trash?\n" "Please install trash-cli or gvfs-bin or konquerer." msgstr "" "ゴミ箱に移動するユーティリティーはありますか?\n" "trash-cliやgvfs-binやkonquererが必要です。" #: ../variety/VarietyWindow.py:1776 msgid "Anonymous usage statistics" msgstr "匿名での使用統計" #: ../variety/VarietyWindow.py:1777 msgid "" "Variety collects anonymous usage statistics. \n" "These help us make it better and are not shared with anyone. \n" "To read more or turn them off, go to \"Sync and social\"" msgstr "" "Variety は匿名で使用統計を集めます。 \n" "これは改良の助けになり、誰とも共有しません。 \n" "詳しくは \"同期とソーシャル\" にあります。" #: ../variety/VarietyWindow.py:1920 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:1945 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 /some/local/image.jpg --next" msgstr "" "%prog [options] [files or urls]\n" "\n" "ファイルを指定するとVarietyのキューに追加します。\n" "URLを指定するとフェッチ・フォルダーに取り込んでキューに追加します。\n" "\n" "指定した壁紙をセットします: %prog /some/local/image.jpg --next" #: ../variety/VarietyWindow.py:1955 msgid "" "Show logging messages (-vv shows even finer debugging messages, -vvv debugs " "variety_lib too)" msgstr "メッセージを表示 (-vv はさらに詳しく表示、-vvv debugs variety_libも同様)" #: ../variety/VarietyWindow.py:1959 msgid "Make the running instance quit" msgstr "実行中の動作を終了" #: ../variety/VarietyWindow.py:1963 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "現在の壁紙の場所を表示します。起動中のみ使用可能。" #: ../variety/VarietyWindow.py:1967 msgid "Show Next wallpaper" msgstr "次の壁紙を表示" #: ../variety/VarietyWindow.py:1971 msgid "Show Previous wallpaper" msgstr "前の壁紙を表示" #: ../variety/VarietyWindow.py:1975 msgid "Show Next wallpaper, skipping the forward history" msgstr "履歴を前方にスキップして壁紙を表示" #: ../variety/VarietyWindow.py:1979 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "現在の壁紙をゴミ箱に移動。起動中のみ使用可能。" #: ../variety/VarietyWindow.py:1983 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "現在の壁紙をお気に入りにコピー。起動中のみ使用可能。" #: ../variety/VarietyWindow.py:1987 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "現在の壁紙をお気に入りに移動。起動中のみ使用可能。" #: ../variety/VarietyWindow.py:1991 msgid "Pause on current image" msgstr "現在の壁紙で停止" #: ../variety/VarietyWindow.py:1995 msgid "Resume regular image changes" msgstr "壁紙自動更新スタート" #: ../variety/VarietyWindow.py:1999 msgid "Toggle Pause/Resume state" msgstr "一時停止/スタートの切り替え" #: ../variety/VarietyWindow.py:2003 msgid "Show Next quote" msgstr "次の名言を表示" #: ../variety/VarietyWindow.py:2007 msgid "Show Previous quote" msgstr "前の名言を表示" #: ../variety/VarietyWindow.py:2011 msgid "Show Next quote, skipping the forward history" msgstr "履歴を前方にスキップして名言を表示" #: ../variety/VarietyWindow.py:2015 msgid "Toggle Quotes Pause/Resume state" msgstr "名言の一時停止/スタートの切り替え" #: ../variety/VarietyWindow.py:2019 msgid "Save the current quote to Favorites" msgstr "現在表示されている名言をお気に入りに保存" #: ../variety/VarietyWindow.py:2023 msgid "Toggle History display" msgstr "履歴表示の切り替え" #: ../variety/VarietyWindow.py:2027 msgid "Toggle Recent Downloads display" msgstr "最近のダウンロード表示の切り替え" #: ../variety/VarietyWindow.py:2031 msgid "Show Preferences dialog" msgstr "設定ダイアログの表示" #: ../variety/VarietyWindow.py:2035 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "有効になっている画像を手動で選ぶためのサムネイル・バーを表示" #: ../variety/VarietyWindow.py:2039 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/VarietyWindow.py:2053 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "オプション --next/--fast-forwardと --previousは同時に使えません" #: ../variety/VarietyWindow.py:2056 msgid "options --trash and --favorite are mutually exclusive" msgstr "オプション --trashと --favoriteは同時に使えません" #: ../variety/VarietyWindow.py:2059 msgid "options --pause and --resume are mutually exclusive" msgstr "オプション --pauseと --resumeは同時に使えません" #: ../variety/VarietyWindow.py:2062 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "オプション --quotes-next/--quotes-fast-forwardと --quotes-previousは同時に使えません" #: ../variety/VarietyWindow.py:2179 ../variety/ImageFetcher.py:60 #: ../variety/ImageFetcher.py:71 ../variety/ImageFetcher.py:78 #: ../variety/ImageFetcher.py:112 msgid "Not an image" msgstr "画像ではありません" #: ../variety/VarietyWindow.py:2184 msgid "Added to queue" msgstr "キューに追加します" #: ../variety/VarietyWindow.py:2185 ../variety/VarietyWindow.py:2191 msgid "Press Next to see it" msgstr "次へを押してください" #: ../variety/VarietyWindow.py:2191 msgid "Fetched" msgstr "取り込みました" #: ../variety/VarietyWindow.py:2237 msgid "Unsupported source type" msgstr "サポートしていない種類のソースです" #: ../variety/VarietyWindow.py:2238 ../variety/VarietyWindow.py:2286 msgid "Are you running the most recent version of Variety?" msgstr "Varietyの最新バージョンを使っていますか?" #: ../variety/VarietyWindow.py:2244 msgid "New image source added" msgstr "新しい画像ソースの追加" #: ../variety/VarietyWindow.py:2246 msgid "Image source already exists, enabling it" msgstr "画像ソースはすでにありますので有効にします" #: ../variety/VarietyWindow.py:2272 msgid "Fetched and applied" msgstr "" #: ../variety/VarietyWindow.py:2282 msgid "It works!" msgstr "It works!" #: ../variety/VarietyWindow.py:2282 msgid "Yay, Variety links work. Great!" msgstr "イェー、Varietyのリンクが動きました。Great!" #: ../variety/VarietyWindow.py:2286 msgid "Unsupported command" msgstr "サポートしていないコマンドです" #: ../variety/VarietyWindow.py:2288 msgid "Could not process the given variety:// URL" msgstr "" #: ../variety/VarietyWindow.py:2289 msgid "Run with logging enabled to see details" msgstr "" #: ../variety/VarietyWindow.py:2488 msgid "Do not ask anymore, always use the current quote" msgstr "次回から尋ねないで常に現在の名言を使います" #: ../variety/VarietyWindow.py:2491 ../data/ui/FacebookPublishDialog.ui.h:5 msgid "Do not ask anymore, always use the text above" msgstr "次回から尋ねずに常にこの文字を使う" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "Published" msgstr "公開しました" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "You may open your Facebook feed to see the post" msgstr "Facebookを開いて投稿を見る" #: ../variety/VarietyWindow.py:2526 ../variety/VarietyWindow.py:2555 msgid "Could not publish" msgstr "公開できません" #: ../variety/VarietyWindow.py:2718 msgid "Could not create autostart entry" msgstr "自動起動に設定できません" #: ../variety/VarietyWindow.py:2719 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:2769 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:2769 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/FacebookFirstRunDialog.ui.h:1 msgid "Variety - Facebook Sharing" msgstr "Variety - Facebookで共有" #: ../data/ui/FacebookFirstRunDialog.ui.h:2 #: ../data/ui/PreferencesVarietyDialog.ui.h:169 msgid "Facebook Sharing" msgstr "Facebookで共有" #: ../data/ui/FacebookFirstRunDialog.ui.h:3 msgid "" "You are sharing on Facebook for the first time. Sharing from Variety is " "available for images that come from online sources and for quotes. It works " "this way: \n" "\n" "1. Login to Facebook\n" "Facebook will open in your default browser. You will be prompted to login if " "you are not already logged in. \n" "\n" "2. Authorize Variety to publish to your " "feed.\n" "You will be asked to allow Variety to publish to your feed on your behalf. " "Variety will only use this permission to publish those images and quotes " "that you tell it to, nothing else.\n" "\n" "3. Configure browser to open variety:// links " "with Variety or xdg-open\n" "Then you will be redirected to a page with instructions to associate " "\"variety://\" links with Variety in your browser. Please follow these " "instructions to complete the setup. You have to do this only once.\n" "\n" "No passwords or login information is kept locally, just an OAuth Facebook " "token that will be valid for a couple of weeks. After its validity expires " "you will be asked to login again." msgstr "" #: ../variety/AddWallpapersNetCategoryDialog.py:40 msgid "Could not find wallpapers there. Please check the URL." msgstr "壁紙がありません。URLを確認して下さい。" #: ../data/ui/WelcomeDialog.ui.h:1 msgid "Welcome to Variety!" msgstr "Varietyにようこそ!" #: ../data/ui/WelcomeDialog.ui.h:2 ../data/ui/SmartFeaturesNoticeDialog.ui.h:3 msgid "Continue" msgstr "次へ" #: ../data/ui/WelcomeDialog.ui.h:3 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.h:4 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.h:5 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "次の画面であなたの設定をセットしてください。" #: ../data/ui/WelcomeDialog.ui.h:6 msgid "KDE Users - Important, please read:" msgstr "KDEユーザーへ 重要:" #: ../data/ui/WelcomeDialog.ui.h:7 msgid "" "You appear to be running KDE. In KDE 4 it is impossible to set the wallpaper " "from inside a program - there is no API for this. To make Variety work, please read " "and follow the instructions here." msgstr "" "あなたは KDEを使っています。 KDE 4 ではプログラムで壁紙を変えることはできません -このための API が無いからです。 Variety " "を動かすには, ここを読んでください。" #: ../data/ui/AddRedditDialog.ui.h:1 msgid "Variety - add Reddit feed" msgstr "Variety - Redditフィードを追加" #: ../data/ui/AddRedditDialog.ui.h:3 msgid "" "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" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:7 msgid "URL or name of a subreddit: " msgstr "URL または subreddit名: " #: ../data/ui/AddRedditDialog.ui.h:8 msgid "Just a moment to check what's there" msgstr "チェックしています" #: ../data/ui/AddMediaRssDialog.ui.h:1 msgid "Variety - add Media RSS feed" msgstr "Variety - メディアRSSフィードを追加" #: ../data/ui/AddMediaRssDialog.ui.h:3 msgid "" "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." msgstr "" "メディアRSSフィードのURLをここにペーストします。メディアRSSのみサポートしています。RSSとは違います。メディアRSSは実際の画像の内容につながっ" "ているタグを含みます。このようなメディアRSSフィードを行なっているサイトは: Picasa, deviantART, SmugMug, Flickr, InterfaceLIFT." #: ../data/ui/AddMediaRssDialog.ui.h:4 msgid "Paste the URL of the Media RSS feed here: " msgstr "メディアRSSのURLをペースト: " #: ../data/ui/AddMediaRssDialog.ui.h:5 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:9 msgid "Just a moment to check what's at that URL" msgstr "URLをチェック中" #: ../variety/AddRedditDialog.py:43 msgid "This does not seem to be a valid Reddit URL" msgstr "有効な RedditのURLでないようです" #: ../variety/AddRedditDialog.py:46 msgid "We could not find any image submissions there." msgstr "" #: ../variety/Smart.py:111 msgid "" "Your smart_user.json config file appears broken. You may have to login again " "to VRTY.ORG." msgstr "設定ファイル smart_user.json が壊れています。 VRTY.ORG に再度ログインしてください。" #: ../variety/Smart.py:195 msgid "Your VRTY.ORG credentials are probably outdated. Please login again." msgstr "" #: ../variety/Smart.py:597 ../variety/Smart.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:111 msgid "Sync" msgstr "同期" #: ../variety/Smart.py:598 #, python-format msgid "Fetching %d images" msgstr "\"%d 画像をフェチ" #: ../variety/Smart.py:598 msgid "Fetching 1 image" msgstr "1 画像をフェチ" #: ../variety/Smart.py:643 msgid "Finished" msgstr "終わりました" #: ../variety/Smart.py:664 #, python-format msgid "Logged in as %s" msgstr "%s でログイン" #: ../variety/Smart.py:676 #, python-format msgid "" "Do you want to login to VRTY.ORG as %s?" msgstr "VRTY.ORG に %s でログインしますか?" #: ../variety/Smart.py:677 msgid "VRTY.ORG login confirmation" msgstr "" #: ../data/plugins/quotes/QuotationsPageSource.py:35 msgid "Fetches quotes from TheQuotationsPage.com" msgstr "TheQuotationsPage.comから名言を取り込みます" #: ../variety/__init__.py:143 msgid "Terminating signal received, quitting..." msgstr "終了シグナルを受け取りました。終了します..." #: ../variety/__init__.py:198 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Varietyはすでに起動しています。そちらにコマンドを送ります。" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:1 msgid "VRTY.ORG integration" msgstr "VRTY.ORG 統合" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:2 msgid "This feature requires VRTY.ORG integration" msgstr "この機能は VRTY.ORG 統合が必要です" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:3 msgid "Enable VRTY.ORG integration" msgstr "VRTY.ORG 統合有効" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:4 msgid "" "For this feature Variety needs permission to collect data about the images " "you like or dislike and the online sources you have enabled.\n" "\n" "Collected data is anonymous by default and covers only images which Variety " "downloaded, never images you already had in your local folders that might be " "private.\n" "\n" "This data helps us provide better images for everyone and fuels VRTY.ORG - a valuable resource for all users " "of Variety." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:1 msgid "Variety - VRTY.ORG" msgstr "Variety - VRTY.ORG" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:2 msgid "No, thanks" msgstr "(゚⊿゚)イラネ" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:4 msgid "" "Introducing VRTY.ORG! Wanna take part?" msgstr "" "紹介 VRTY.ORG! 参加しますか?" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:5 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to find and add new image sources to Variety, and to follow other users' " "favorites." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:6 msgid "" "Participation takes no effort - your profile will be built automatically, as " "you like or dislike images downloaded by Variety. Your profile will not be " "shared with third parties, unless you opt-in to make it public. Read more details about the " "service and the privacy policy here." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:7 msgid "" "Participation is required for some features of Variety such as synchronization of favorites between computers." msgstr "" "Variety の お気に入りを他のコンピュータと同期する " "などの機能を使うには参加する必要があります。" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:8 #: ../data/ui/PreferencesVarietyDialog.ui.h:105 msgid "Participate in VRTY.ORG" msgstr "VRTY.ORG に参加" #: ../data/plugins/quotes/QuotesDaddySource.py:31 msgid "" "Fetches quotes from QuotesDaddy's daily quotes RSS feed.\n" "Does not support searching by tags or authors." msgstr "" "QuotesDaddyの今日の一言のRSSフィードを取り込みます。\n" "タグや作者の指定はできません。" #: ../data/ui/AboutVarietyDialog.ui.h:1 msgid "Copyright (c) 2012, Peter Levi " msgstr "Copyright (c) 2012, Peter Levi " #: ../data/ui/AboutVarietyDialog.ui.h:2 msgid "About Variety" msgstr "Varietyについて" #: ../data/ui/AboutVarietyDialog.ui.h:3 msgid "An automatic wallpaper changer, downloader and manager." msgstr "壁紙のダウンロードと管理ができる壁紙自動チェンジャー" #: ../data/ui/AboutVarietyDialog.ui.h:4 msgid "http://peterlevi.com/variety" msgstr "http://peterlevi.com/variety" #: ../data/ui/AboutVarietyDialog.ui.h:5 msgid "" "# Copyright (c) 2012, Peter Levi \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, Peter Levi \n" "# このプログラムはフリーソフトウェアです: Free Software Foundationの\n" "# GNU General Public License version 3により再配布や変更ができます。\n" "# \n" "# このプログラムが役に立つことを願って配布しますが、\n" "# いかなる保証もありません。\n" "# 詳しくはGNU General Public Licenseにあります。\n" "# \n" "# プログラムと同時にGNU General Public Licenseを受け取るべきですが\n" "# もしなければ にあります。\n" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:1 msgid "Variety - add Wallpapers.net category" msgstr "Variety - Wallpapers.net categoryを追加" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:3 msgid "" "Please visit wallpapers.net and choose " "a category with wallpapers, then paste its URL below. A category is " "anything on the site that has one or more pages with wallpapers on them. " "Here are some examples:\n" "\n" "All wallpapers: http://www.wallpapers.net/\n" "Specific resolution: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" msgstr "" "ここを訪問してt wallpapers.net " "壁紙のカテゴリーを選んでください、そしてそのURLを下にペーストしてください。1ページ以上あるものにしてください。これはサンプルです:\n" "\n" "すべての壁紙: http://www.wallpapers.net/\n" "解像度を指定: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:8 msgid "Paste URL here: " msgstr "URLをここにペースト: " #: ../data/ui/PreferencesVarietyDialog.ui.h:1 msgid "seconds" msgstr "秒" #: ../data/ui/PreferencesVarietyDialog.ui.h:2 msgid "minutes" msgstr "分" #: ../data/ui/PreferencesVarietyDialog.ui.h:3 msgid "hours" msgstr "時間" #: ../data/ui/PreferencesVarietyDialog.ui.h:4 msgid "days" msgstr "日" #: ../data/ui/PreferencesVarietyDialog.ui.h:5 msgid "Variety Preferences" msgstr "Varietyの設定" #: ../data/ui/PreferencesVarietyDialog.ui.h:6 msgid "General" msgstr "一般" #: ../data/ui/PreferencesVarietyDialog.ui.h:7 msgid "Start Variety when the computer starts" msgstr "自動起動" #: ../data/ui/PreferencesVarietyDialog.ui.h:8 msgid "Change wallpaper every " msgstr "壁紙更新 " #: ../data/ui/PreferencesVarietyDialog.ui.h:9 msgid "Minimum interval is 5 seconds" msgstr "最小インターバルは5秒" #: ../data/ui/PreferencesVarietyDialog.ui.h:10 msgid "Change wallpaper on start" msgstr "起動時に壁紙を変更" #: ../data/ui/PreferencesVarietyDialog.ui.h:12 msgid "Enabled" msgstr "有効" #: ../data/ui/PreferencesVarietyDialog.ui.h:13 msgid "Type" msgstr "種類" #: ../data/ui/PreferencesVarietyDialog.ui.h:14 msgid "Location" msgstr "場所" #: ../data/ui/PreferencesVarietyDialog.ui.h:15 msgid "_Add..." msgstr "追加(_A)..." #: ../data/ui/PreferencesVarietyDialog.ui.h:16 msgid "Add images, folders or online image sources" msgstr "画像を追加します" #: ../data/ui/PreferencesVarietyDialog.ui.h:17 msgid "_Edit..." msgstr "編集(_E)..." #: ../data/ui/PreferencesVarietyDialog.ui.h:18 msgid "Edit the selected source" msgstr "画像の場所の編集" #: ../data/ui/PreferencesVarietyDialog.ui.h:19 msgid "_Remove..." msgstr "削除(_R)..." #: ../data/ui/PreferencesVarietyDialog.ui.h:20 msgid "Remove selected image sources" msgstr "画像の場所の削除" #: ../data/ui/PreferencesVarietyDialog.ui.h:21 msgid "_Use" msgstr "選択(_U)" #: ../data/ui/PreferencesVarietyDialog.ui.h:22 msgid "Enable the selected sources and disable all others" msgstr "選択した場所を有効にして他を無効にします" #: ../data/ui/PreferencesVarietyDialog.ui.h:23 msgid "Download a wallpaper every " msgstr "壁紙をダウンロードする間隔 " #: ../data/ui/PreferencesVarietyDialog.ui.h:24 msgid "Minimum interval is one minute" msgstr "最小インターバルは1分" #: ../data/ui/PreferencesVarietyDialog.ui.h:25 msgid "to " msgstr "フォルダー " #: ../data/ui/PreferencesVarietyDialog.ui.h:26 msgid "Actual download folder " msgstr "ダウンロード・フォルダーの選択 " #: ../data/ui/PreferencesVarietyDialog.ui.h:27 msgid "" "Caution: do NOT use this option if you use a custom download folder with " "valuable files in it. Variety will maintain the limit regardless of what is " "in the download folder." msgstr "注意:大切なファイルがあるフォルダーにはこのオプションを使用しないでください。制限が適用されるとファイルが消えます。" #: ../data/ui/PreferencesVarietyDialog.ui.h:28 msgid "Limit download folder to " msgstr "ダウンロード・フォルダーの上限 " #: ../data/ui/PreferencesVarietyDialog.ui.h:29 msgid "Minimum size is 50 MB" msgstr "最小サイズは50MB" #: ../data/ui/PreferencesVarietyDialog.ui.h:30 msgid "MB by deleting oldest files when necessary" msgstr "MB /古いファイルから削除します" #: ../data/ui/PreferencesVarietyDialog.ui.h:31 msgid "Favorites" msgstr "お気に入りの壁紙" #: ../data/ui/PreferencesVarietyDialog.ui.h:32 msgid "Copy favorite wallpapers to " msgstr "お気に入りのコピー先 " #: ../data/ui/PreferencesVarietyDialog.ui.h:33 msgid "Filters" msgstr "フィルター" #: ../data/ui/PreferencesVarietyDialog.ui.h:34 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "壁紙にランダムにこのフィルターを適用します(素晴らしいImageMagicに感謝)" #: ../data/ui/PreferencesVarietyDialog.ui.h:35 msgid "Quotes" msgstr "名言" #: ../data/ui/PreferencesVarietyDialog.ui.h:36 msgid "Show random wise quotes on the desktop" msgstr "名言をランダムに表示" #: ../data/ui/PreferencesVarietyDialog.ui.h:37 msgid "Text color: " msgstr "文字の色: " #: ../data/ui/PreferencesVarietyDialog.ui.h:38 msgid "Text font: " msgstr "文字のフォント: " #: ../data/ui/PreferencesVarietyDialog.ui.h:39 msgid "Backdrop color: " msgstr "背景色: " #: ../data/ui/PreferencesVarietyDialog.ui.h:40 msgid "Backdrop opacity: " msgstr "背景色の透過度: " #: ../data/ui/PreferencesVarietyDialog.ui.h:41 msgid " Transparent" msgstr " 透明" #: ../data/ui/PreferencesVarietyDialog.ui.h:42 msgid "Opaque" msgstr "不透明" #: ../data/ui/PreferencesVarietyDialog.ui.h:43 msgid "Draw a text shadow" msgstr "文字に影をつける" #: ../data/ui/PreferencesVarietyDialog.ui.h:44 msgid "Appearance" msgstr "外観" #: ../data/ui/PreferencesVarietyDialog.ui.h:45 msgid "Quotes area width: " msgstr "表示エリアの幅: " #: ../data/ui/PreferencesVarietyDialog.ui.h:46 msgid "Narrow " msgstr "狭い " #: ../data/ui/PreferencesVarietyDialog.ui.h:47 msgid "Wide" msgstr "広い" #: ../data/ui/PreferencesVarietyDialog.ui.h:48 msgid "Horizontal position: " msgstr "水平位置: " #: ../data/ui/PreferencesVarietyDialog.ui.h:49 msgid "Left " msgstr "左 " #: ../data/ui/PreferencesVarietyDialog.ui.h:50 ../variety/ThumbsManager.py:44 msgid "Right" msgstr "右" #: ../data/ui/PreferencesVarietyDialog.ui.h:51 msgid "Vertical position: " msgstr "垂直位置: " #: ../data/ui/PreferencesVarietyDialog.ui.h:52 msgid "Top " msgstr "上 " #: ../data/ui/PreferencesVarietyDialog.ui.h:53 ../variety/ThumbsManager.py:41 msgid "Bottom" msgstr "下" #: ../data/ui/PreferencesVarietyDialog.ui.h:54 msgid "Placement" msgstr "表示場所" #: ../data/ui/PreferencesVarietyDialog.ui.h:55 msgid "Show quotes from these sources: " msgstr "名言のソース: " #: ../data/ui/PreferencesVarietyDialog.ui.h:56 msgid "" "More " "plugins" msgstr "" "More " "plugins" #: ../data/ui/PreferencesVarietyDialog.ui.h:57 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "これらのタグと作者を表示します。空の場合はランダムに選びます。" #: ../data/ui/PreferencesVarietyDialog.ui.h:59 msgid "Example: funny, inspirational" msgstr "例: funny, inspirational" #: ../data/ui/PreferencesVarietyDialog.ui.h:60 msgid "Example: Albert Einstein, Voltaire" msgstr "例: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui.h:61 msgid "Authors: " msgstr "作者: " #: ../data/ui/PreferencesVarietyDialog.ui.h:62 msgid "Sources and filtering" msgstr "名言のソースとフィルター" #: ../data/ui/PreferencesVarietyDialog.ui.h:63 msgid "Change quote every " msgstr "名言の更新間隔 " #: ../data/ui/PreferencesVarietyDialog.ui.h:64 msgid "Minimum interval is 10 seconds" msgstr "最小インターバルは10秒" #: ../data/ui/PreferencesVarietyDialog.ui.h:65 msgid "Regular change" msgstr "定期的に更新" #: ../data/ui/PreferencesVarietyDialog.ui.h:66 msgid "Clock" msgstr "時計" #: ../data/ui/PreferencesVarietyDialog.ui.h:67 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "素敵なデジタル時計を表示します" #: ../data/ui/PreferencesVarietyDialog.ui.h:68 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.h:69 msgid "Clock font: " msgstr "時計のフォント: " #: ../data/ui/PreferencesVarietyDialog.ui.h:70 msgid "Date font: " msgstr "日付のフォント: " #: ../data/ui/PreferencesVarietyDialog.ui.h:71 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "動かない場合は FAQ " "時計の設定は configuring-the-clockRead." #: ../data/ui/PreferencesVarietyDialog.ui.h:72 msgid "Effects" msgstr "エフェクト" #: ../data/ui/PreferencesVarietyDialog.ui.h:73 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:74 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:75 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:76 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:77 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:78 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:79 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:80 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:81 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:82 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:83 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:84 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:85 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:86 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:87 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:88 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:89 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:90 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:91 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:92 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:93 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:94 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:95 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:96 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:97 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:98 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:99 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:100 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:101 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:102 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:103 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:104 msgid "VRTY.ORG" msgstr "VRTY.ORG" #: ../data/ui/PreferencesVarietyDialog.ui.h:106 msgid "VRTY.ORG is in beta and will take some time to mature" msgstr "VRTY.ORG はベータ版であり成熟するには少し時間がかかります" #: ../data/ui/PreferencesVarietyDialog.ui.h:107 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to add new image sources to Variety, and to follow other users' favorites. " "It is fueled by the favorite images of all participating users." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:108 msgid "" "Could not create user - no connection to VRTY.ORG. We will try again later." msgstr "VRTY.ORG に繋がらないためユーザーを作成できませんでした。後で再度トライしてください。" #: ../data/ui/PreferencesVarietyDialog.ui.h:110 msgid "" "Registration enables cool features like synchronization of favorite images " "and sources between computers and personalized recommendations." msgstr "登録するとコンピュータ間でのお気に入りの同期やソースの同期、個人的なおすすめなどクールな機能が使えます。" #: ../data/ui/PreferencesVarietyDialog.ui.h:112 msgid "Synchronize favorite images between computers" msgstr "コンピューター間でお気に入りを同期" #: ../data/ui/PreferencesVarietyDialog.ui.h:113 msgid "Requires VRTY.ORG enabled and logged in." msgstr "VRTY.ORG を有効にしてログインが必要です。" #: ../data/ui/PreferencesVarietyDialog.ui.h:114 msgid "" "Your favorite images from other computers will be automatically downloaded " "to this computer. You need to be logged in with the same VRTY.ORG user " "everywhere. Sync will not delete any images." msgstr "" "別のコンピュータにあるお気に入りの壁紙はこのコンピュータに自動的にダウンロードされます。同じユーザー名で VRTY.ORG " "にログインする必要があります。同期ではどの画像も消しません。" #: ../data/ui/PreferencesVarietyDialog.ui.h:115 msgid "Privacy policy" msgstr "プライバシーポリシー" #: ../data/ui/PreferencesVarietyDialog.ui.h:116 msgid "" "Variety sends data only for images it downloaded, never for images you " "already had in your local folders that might be private, and Sync does not " "work for such images. Collected data is not shared with third parties, " "unless you opt-in to make your profile public. Read more details about the " "service and the privacy policy here." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:117 msgid "Usage statistics" msgstr "使用統計" #: ../data/ui/PreferencesVarietyDialog.ui.h:118 msgid "Help make Variety better by sending anonymous usage statistics" msgstr "匿名で使用統計を送信してVarietyの改良に貢献する" #: ../data/ui/PreferencesVarietyDialog.ui.h:119 msgid "" "These stats help us improve Variety by understanding how users interact with " "it. They also include general info about your OS version and monitor setup. " "Collected data is not shared with anyone." msgstr "" "これらの統計はユーザーの興味を理解しVarietyを改良する助けになります。これにはOSのバージョンやモニターの設定などの一般的な情報も含みます。集めたデ" "ータは誰とも共有しません。" #: ../data/ui/PreferencesVarietyDialog.ui.h:120 msgid "Sync and social" msgstr "同期とソーシャル" #: ../data/ui/PreferencesVarietyDialog.ui.h:121 msgid "Fetch folder" msgstr "フェッチ・フォルダー" #: ../data/ui/PreferencesVarietyDialog.ui.h:122 msgid "Save manually downloaded wallpapers to " msgstr "下記操作での壁紙の保存先 " #: ../data/ui/PreferencesVarietyDialog.ui.h:123 msgid "Drag and drop" msgstr "ドラッグ&ドロップ" #: ../data/ui/PreferencesVarietyDialog.ui.h:124 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" "Varietyのアイコンに画像のURLやファイルをドロップするとフェッチ・\n" "フォルダーに保存されます。次へを押すとデスクトップに表示されます。\n" "アイコンを常に表示するにはランチャーに登録します。" #: ../data/ui/PreferencesVarietyDialog.ui.h:126 msgid "Clipboard monitoring" msgstr "クリップボード・モニター" #: ../data/ui/PreferencesVarietyDialog.ui.h:127 msgid "Monitor clipboard for image URLs and fetch them" msgstr "クリップボードを監視して画像のURLを取り込む" #: ../data/ui/PreferencesVarietyDialog.ui.h:128 msgid "But fetch only when the URL host is one of these:" msgstr "取り込むURLを指定する:" #: ../data/ui/PreferencesVarietyDialog.ui.h:129 msgid "Manual downloading" msgstr "手動ダウンロード" #: ../data/ui/PreferencesVarietyDialog.ui.h:130 msgid "When possible use images that:" msgstr "使用する画像:" #: ../data/ui/PreferencesVarietyDialog.ui.h:131 ../variety/ThumbsManager.py:98 msgid "Size" msgstr "画像のサイズ" #: ../data/ui/PreferencesVarietyDialog.ui.h:132 msgid "Have landscape orientation" msgstr "横方向の画像" #: ../data/ui/PreferencesVarietyDialog.ui.h:133 msgid "Are big at least " msgstr "少なくともスクリーン解像度の " #: ../data/ui/PreferencesVarietyDialog.ui.h:134 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui.h:135 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui.h:136 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui.h:138 #, no-c-format msgid "% of the screen resolution" msgstr "% 以上" #: ../data/ui/PreferencesVarietyDialog.ui.h:139 msgid "Color" msgstr "色" #: ../data/ui/PreferencesVarietyDialog.ui.h:140 msgid "Are dark or light:" msgstr "画像の明るさ:" #: ../data/ui/PreferencesVarietyDialog.ui.h:141 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "暗い" #: ../data/ui/PreferencesVarietyDialog.ui.h:142 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "明るい" #: ../data/ui/PreferencesVarietyDialog.ui.h:143 msgid "Contain this color: " msgstr "この色を含む: " #: ../data/ui/PreferencesVarietyDialog.ui.h:144 msgid "(Takes effect after some initial searching)" msgstr "(イニシャルサーチ後に有効)" #: ../data/ui/PreferencesVarietyDialog.ui.h:145 msgid "Rating" msgstr "評価" #: ../data/ui/PreferencesVarietyDialog.ui.h:146 msgid "Have EXIF rating at least " msgstr "少なくともEXIFの評価が " #: ../data/ui/PreferencesVarietyDialog.ui.h:147 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui.h:148 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui.h:149 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui.h:150 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui.h:151 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui.h:152 msgid "Color and size" msgstr "画像の指定" #: ../data/ui/PreferencesVarietyDialog.ui.h:153 msgid "Indicator Icon" msgstr "インジケーターアイコン" #: ../data/ui/PreferencesVarietyDialog.ui.h:154 msgid "Indicator icon:" msgstr "インジケーターアイコン:" #: ../data/ui/PreferencesVarietyDialog.ui.h:155 msgctxt "Icon option" msgid "Light" msgstr "明るいアイコン" #: ../data/ui/PreferencesVarietyDialog.ui.h:156 msgctxt "Icon option" msgid "Dark" msgstr "暗いアイコン" #: ../data/ui/PreferencesVarietyDialog.ui.h:157 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "壁紙" #: ../data/ui/PreferencesVarietyDialog.ui.h:158 msgctxt "Icon option" msgid "Custom image..." msgstr "カスタム画像..." #: ../data/ui/PreferencesVarietyDialog.ui.h:159 msgctxt "Icon option" msgid "None" msgstr "なし" #: ../data/ui/PreferencesVarietyDialog.ui.h:160 msgid "Select an icon" msgstr "アイコンを選択" #: ../data/ui/PreferencesVarietyDialog.ui.h:161 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 "" "アイコンなしを選んだらコマンドラインかランチャーのクイックリストで操作します。\n" "\"variety --help\"で利用できるコマンドが表示されます。" #: ../data/ui/PreferencesVarietyDialog.ui.h:162 msgid "Favorites Operations" msgstr "お気に入りの動作" #: ../data/ui/PreferencesVarietyDialog.ui.h:163 msgid "Favorites operations to show in main menu:" msgstr "メイン・メニューに表示するお気に入りの動作:" #: ../data/ui/PreferencesVarietyDialog.ui.h:164 msgid "Copy to Favorites" msgstr "お気に入りにコピー" #: ../data/ui/PreferencesVarietyDialog.ui.h:166 msgid "Both Copy and Move" msgstr "コピーと移動" #: ../data/ui/PreferencesVarietyDialog.ui.h:167 msgid "Depends on folder..." msgstr "フォルダーに依存する..." #: ../data/ui/PreferencesVarietyDialog.ui.h:170 msgid "Display dialog to customize the Facebook post before publishing" msgstr "Facebookで公開前にカスタマイズするダイアログを開く" #: ../data/ui/PreferencesVarietyDialog.ui.h:171 msgid "Login Screen Support" msgstr "ログイン画面" #: ../data/ui/PreferencesVarietyDialog.ui.h:172 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "ログイン画面にVarietyの壁紙を使う" #: ../data/ui/PreferencesVarietyDialog.ui.h:173 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が読めるパーミッションにします。このオプションで壁紙を公開フォルダーにコピーし" "ます。そしてすべてに読み取り権限を与えます。ホームが暗号化されていなければデフォルトで " "~/ピクチャと/usr/share/backgroundsを使います。マルチユーザー環境では注意してください。" #: ../data/ui/PreferencesVarietyDialog.ui.h:174 msgid "Copy wallpaper image files to this folder: " msgstr "壁紙をコピーするフォルダー: " #: ../data/ui/PreferencesVarietyDialog.ui.h:175 msgid "Reset to default" msgstr "初期値に戻す" #: ../data/ui/PreferencesVarietyDialog.ui.h:176 msgid "Still doesn't work?" msgstr "まだ動きませんか?" #: ../data/ui/PreferencesVarietyDialog.ui.h:177 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "ホームが暗号化されているようです。その中のフォルダーは使えません。" #: ../data/ui/PreferencesVarietyDialog.ui.h:178 msgid "You don't have write permissions for this folder." msgstr "このフォルダーへの書き込み権限がありません。" #: ../data/ui/PreferencesVarietyDialog.ui.h:179 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "このフォルダーをLightDMが読む権限がありません。" #: ../data/ui/PreferencesVarietyDialog.ui.h:180 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "Varietyがパーミッションを調整するにはsuperuser特権を与える必要があります。" #: ../data/ui/PreferencesVarietyDialog.ui.h:181 msgid "Customize" msgstr "高度な設定" #: ../data/ui/PreferencesVarietyDialog.ui.h:182 msgid "Tips and tricks" msgstr "ヒント" #: ../data/ui/PreferencesVarietyDialog.ui.h:183 msgid "Recent changes" msgstr "更新履歴" #: ../data/ui/PreferencesVarietyDialog.ui.h:184 msgid "Visit website" msgstr "ウェブサイト" #: ../data/ui/PreferencesVarietyDialog.ui.h:185 msgid "Report a bug or request a feature" msgstr "バグ報告と要望" #: ../data/ui/PreferencesVarietyDialog.ui.h:186 msgid "Send feedback" msgstr "作者に連絡" #: ../data/ui/PreferencesVarietyDialog.ui.h:187 msgid "Donate to Variety" msgstr "寄付" #: ../data/ui/PreferencesVarietyDialog.ui.h:188 msgid "Donate via PayPal" msgstr "PayPalで寄付" #: ../data/ui/PreferencesVarietyDialog.ui.h:189 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" "Peter Levi" #: ../data/ui/PreferencesVarietyDialog.ui.h:193 msgid "" "For Bitcoin and other payment methods please go to Variety's website." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:194 msgid "Donate" msgstr "寄付" #: ../variety/FacebookHelper.py:116 msgid "Authorization successful" msgstr "認証に成功しました" #: ../variety/FacebookHelper.py:116 msgid "Publishing..." msgstr "公開中..." #: ../variety/FacebookHelper.py:121 msgid "Authorization failed" msgstr "認証に失敗しました" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "上" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "左" #: ../variety/ThumbsManager.py:94 msgid "Position" msgstr "サムネイルの位置" #: ../variety/ThumbsManager.py:109 msgid "Show Containing Folder" msgstr "画像のあるフォルダーを表示" #: ../variety/ThumbsManager.py:136 ../variety/indicator.py:156 msgid "Set EXIF Rating" msgstr "EXIFの評価をセット" #: ../variety/ThumbsManager.py:160 ../variety/indicator.py:87 msgid "Delete to _Trash" msgstr "ゴミ箱に移動(_T)" #: ../variety/ThumbsManager.py:167 ../variety/indicator.py:131 msgid "Where is it from?" msgstr "画像のある場所は?" #: ../variety/ThumbsManager.py:178 msgid "Close" msgstr "閉じる" #: ../variety/ThumbsManager.py:198 msgid "Could not set EXIF rating" msgstr "EXIFの評価をセットできません" #: ../variety/ThumbsManager.py:217 msgid "Unrated" msgstr "評価なし" #: ../variety/ThumbsManager.py:224 msgid "Rejected" msgstr "拒否" #: ../variety/ThumbsManager.py:324 msgid "Variety History" msgstr "Variety 履歴" #: ../variety/ThumbsManager.py:326 msgid "Variety Recent Downloads" msgstr "Variety 最近のダウンロード" #: ../variety/ThumbsManager.py:328 msgid "Variety Images" msgstr "Variety 画像" #: ../data/ui/AddWallbaseDialog.ui.h:1 msgid "Variety - add Wallbase.cc image source" msgstr "Variety - Wallbase.ccを画像の場所に追加" #: ../data/ui/AddWallbaseDialog.ui.h:2 msgid "Wallbase.cc" msgstr "Wallbase.cc" #: ../data/ui/AddWallbaseDialog.ui.h:3 msgid "" "Wallbase.cc is permanently down. Use Wallhaven.cc instead. Support for " "Wallbase.cc will be dropped completely in a future release, please remove or " "update your existing Wallbase sources." msgstr "" "Wallbase.ccは永久にダウンします。かわりに Wallhaven.cc " "を使ってください。将来のリリースではWallbase.ccのサポートは完全に無くします。Wallbaseは削除するか変更してください。" #: ../data/ui/AddWallbaseDialog.ui.h:4 msgid "" "Wallbase.cc provides a variety of image " "search options. Below you can specify keywords to search for, or visit Wallbase.cc, setup your search criteria " "there, ensure you like the results, and paste the full Wallbase URL in the " "box.\n" "\n" "If you specify keywords, the most liked safe-for-work images that match any " "of the keywords will be used. \n" "\n" "If you specify a Wallbase 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." msgstr "" "Wallbase.cc " "は様々な画像検索オプションがあります。キーワードを指定するか Wallbase.cc " "を訪問して検索の条件を設定します。結果を確認したらそのURLを下のボックスにペーストします。\n" "\n" "キーワードを指定したらキーワードにマッチした職場向け(safe-for-work)の画像を表示します。\n" "\n" "WallbaseのURLを指定したら慎重にソート条件を選んでください。 - " "Varietyは画像を定期的に取り込みますが最初に取り込んだ数百の画像を使います。Random や Date は適していません。Favorites " "は良い画像が見つかります。また Relevance はフレーズや色で検索する時に有効です。" #: ../data/ui/FacebookPublishDialog.ui.h:1 msgid "Variety - Publish to Facebook" msgstr "Variety - Facebookで公開" #: ../data/ui/FacebookPublishDialog.ui.h:2 ../variety/indicator.py:149 #: ../variety/indicator.py:223 msgid "Share on Facebook" msgstr "Facebookで共有" #: ../data/ui/FacebookPublishDialog.ui.h:3 msgid "" "Publish a link to the current wallpaper on Facebook. Include this text along " "with the link (or just leave empty):" msgstr "この壁紙をFacebookで公開します。説明も入れられます。(空でもかまいません):" #: ../data/ui/FacebookPublishDialog.ui.h:4 msgid "Use current quote" msgstr "現在の名言を使う" #: ../data/ui/SmartRegisterDialog.ui.h:1 msgid "Variety - VRTY.ORG registration" msgstr "Variety - VRTY.ORG の登録" #: ../data/ui/SmartRegisterDialog.ui.h:2 msgid "Would you like to register?" msgstr "登録しますか?" #: ../data/ui/SmartRegisterDialog.ui.h:3 msgid "" "You may participate in VRTY.ORG " "anonymously, but registration enables some very nice features, such as synchronization of favorites between computers and " "personalized recommendations. It also ensures " "you will not lose your profile and favorite wallpapers if you reinstall your " "OS." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:4 msgid "Registration is very easy and does not require any personal data." msgstr "登録は簡単で個人情報は必要ありません。" #: ../data/ui/SmartRegisterDialog.ui.h:5 msgid "" "If you choose to participate anonymously, you can register later from the " "\"Sync and social\" page in Preferences." msgstr "匿名で参加しても後から設定の \"同期とソーシャル\" から登録できます。" #: ../data/ui/SmartRegisterDialog.ui.h:6 msgid "" "Oops, we could not connect to VRTY.ORG. Server might be down. Please wait a " "couple of minutes and try again or choose \"Participate anonymously\" and register later " "from the \"Sync and social\" page in " "Preferences." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:7 msgid "" "Please continue the registration and follow the instructions in the browser " "tab we opened." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:8 msgid "I will participate anonymously" msgstr "匿名で参加" #: ../data/ui/SmartRegisterDialog.ui.h:9 msgid "I'm registered, let me login" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:10 msgid "Register here" msgstr "ここで登録" #: ../variety.desktop.in.h:1 msgid "Variety" msgstr "Variety" #: ../variety.desktop.in.h:2 msgid "Variety Wallpaper Changer" msgstr "Variety壁紙チェンジャー" #: ../variety.desktop.in.h:3 msgid "Next" msgstr "次の壁紙" #: ../variety.desktop.in.h:4 msgid "Previous" msgstr "前の壁紙" #: ../variety.desktop.in.h:5 msgid "Pause / Resume" msgstr "一時停止/スタート" #: ../variety.desktop.in.h:6 msgid "History" msgstr "履歴" #: ../variety.desktop.in.h:7 msgid "Preferences" msgstr "設定" #: ../data/plugins/quotes/LocalFilesSource.py:34 msgid "" "Displays quotes, defined in local text files.\n" "Put your own txt files in: ~/.config/variety/pluginconfig/quotes/.\n" "The file format is:\n" "\n" "quote -- author\n" ".\n" "second quote -- another author\n" ".\n" "etc...\n" "\n" "Example: http://rvelthuis.de/zips/quotes.txt" msgstr "" "ローカル・テキストファイルの名言を表示します。\n" "~/.config/variety/pluginconfig/quotes/ に xxx.txt ファイルを置きます。\n" "ファイルのフォーマットは:\n" "\n" "名言 -- 作者\n" ".\n" "次の名言 -- 別の作者\n" ".\n" "etc...\n" "\n" "例: http://rvelthuis.de/zips/quotes.txt" #: ../variety/indicator.py:49 ../variety/indicator.py:96 #: ../variety/indicator.py:166 msgid "_Next" msgstr "次へ(_N)" #: ../variety/indicator.py:54 ../variety/indicator.py:101 #: ../variety/indicator.py:171 msgid "_Previous" msgstr "前へ(_P)" #: ../variety/indicator.py:61 msgid "Current desktop wallpaper" msgstr "現在の壁紙の場所" #: ../variety/indicator.py:65 msgid "Show origin" msgstr "取得元を表示" #: ../variety/indicator.py:106 ../variety/indicator.py:176 msgid "_Next, skipping forward history" msgstr "履歴を前方にスキップ" #: ../variety/indicator.py:114 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "アイコン上でスクロール\n" "すると壁紙を変更します" #: ../variety/indicator.py:124 msgid "_Image" msgstr "画像(_I)" #: ../variety/indicator.py:135 msgid "Show without effects" msgstr "エフェクトなしで表示" #: ../variety/indicator.py:143 msgid "Google Image Search" msgstr "Google イメージ検索" #: ../variety/indicator.py:196 msgid "View Favorites..." msgstr "お気に入りを表示..." #: ../variety/indicator.py:203 msgid "Copy to Clipboard" msgstr "クリップボードへコピー" #: ../variety/indicator.py:213 msgid "Google Quote" msgstr "Googleで名言を検索" #: ../variety/indicator.py:218 msgid "Google Author" msgstr "Googleで作者を検索" #: ../variety/indicator.py:230 ../variety/indicator.py:284 msgid "Preferences..." msgstr "設定..." #: ../variety/indicator.py:238 msgid "Turn off" msgstr "非表示" #: ../variety/indicator.py:244 msgid "_Quote" msgstr "名言(_Q)" #: ../variety/indicator.py:251 msgid "_History" msgstr "履歴(_H)" #: ../variety/indicator.py:257 msgid "_Wallpaper Selector" msgstr "壁紙選択サムネイル(_W)" #: ../variety/indicator.py:263 msgid "Recent _Downloads" msgstr "最近のダウンロード(_D)" #: ../variety/indicator.py:278 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:288 msgid "About" msgstr "情報" #: ../variety/indicator.py:292 msgid "Quit" msgstr "終了" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:1 msgid "Copy to Favorites vs. Move to Favorites" msgstr "お気に入り動作メニューの設定" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:2 msgid "Reset to Default" msgstr "初期値に戻す" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:3 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.h:4 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,またはパスを指定します。\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" #: ../variety/ImageFetcher.py:56 ../variety/ImageFetcher.py:103 msgid "Fetching" msgstr "取り込み中" #. too small - delete and do not use #: ../variety/ImageFetcher.py:118 msgid "Image too small, ignoring it" msgstr "画像が小さすぎます" #: ../variety/ImageFetcher.py:140 #, python-format msgid "Sorry, got %s error..." msgstr "残念ですが %s エラーです..." #: ../variety/ImageFetcher.py:141 msgid "This means the link is no longer valid" msgstr "このリンクは、もはや無効です" #: ../variety/ImageFetcher.py:144 msgid "Fetch failed for some reason" msgstr "画像の取り込みに失敗しました" #: ../variety/ImageFetcher.py:145 msgid "" "To get more information, please run Variety from terminal with -v option and " "retry the action" msgstr "詳しい情報を得るために端末で-vオプションをつけてVarietyを起動してもう一度操作して下さい" variety/po/de.po0000644000000000000000000024461512655724350011022 0ustar # German translation for variety # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the variety package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: variety\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-01-29 10:57+0200\n" "PO-Revision-Date: 2016-01-13 23:56+0000\n" "Last-Translator: Tobias Bannert \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-02-07 20:28+0000\n" "X-Generator: Launchpad (build 17908)\n" #: ../data/plugins/quotes/GoodreadsSource.py:49 msgid "Fetches quotes from Goodreads.com" msgstr "Zitatabruf von Goodreads.com" #: ../data/ui/LoginOrRegisterDialog.ui.h:1 msgid "Login to VRTY.ORG" msgstr "Anmelden bei VRTY.ORG" #: ../data/ui/LoginOrRegisterDialog.ui.h:2 msgid "Username: " msgstr "Benutzername: " #: ../data/ui/LoginOrRegisterDialog.ui.h:3 msgid "Password: " msgstr "Passwort: " #: ../data/ui/LoginOrRegisterDialog.ui.h:4 msgid "No account? Register here" msgstr "Kein Konto? Hier registrieren!" #: ../data/ui/LoginOrRegisterDialog.ui.h:5 msgid "Forgot your password?" msgstr "Passwort vergessen?" #: ../data/ui/LoginOrRegisterDialog.ui.h:6 msgid "" "Tip: You can also login to VRTY.ORG in a " "browser and click the link \"Trigger Variety " "login\" in your profile." msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:7 msgid "Login" msgstr "Anmelden" #: ../variety/LoginOrRegisterDialog.py:80 #, python-format msgid "Oops, server returned error (%s)" msgstr "Huch, der Server hat einen Fehler zurückgegeben (%s)" #: ../variety/LoginOrRegisterDialog.py:85 msgid "Could not connect to server" msgstr "Zum Server konnte nicht verbunden werden" #: ../variety/AddWallhavenDialog.py:38 ../variety/AddWallbaseDialog.py:38 #: ../variety/AddFlickrDialog.py:138 msgid "No images found" msgstr "Kein Bild gefunden" #: ../data/ui/AddPanoramioDialog.ui.h:1 msgid "Variety - add Panoramio image source" msgstr "Variety - Panoramio als Bildquelle hinzufügen" #. (_("Wallbase.cc"), self.on_add_wallbase_clicked), #: ../data/ui/AddPanoramioDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:388 msgid "Panoramio" msgstr "Panoramio" #: ../data/ui/AddPanoramioDialog.ui.h:3 msgid "Please zoom over your area of interest." msgstr "Bitte gewünschten Bereich vergrößern." #: ../variety/FolderChooser.py:65 msgid "Choose a folder" msgstr "Ordner wählen" #: ../variety/FolderChooser.py:66 ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Cancel" msgstr "Abbrechen" #: ../variety/FolderChooser.py:66 msgid "OK" msgstr "OK" #: ../data/ui/AddWallhavenDialog.ui.h:1 msgid "Variety - add Wallhaven.cc image source" msgstr "Variety - Wallhaven.cc-Bildquelle hinzufügen" #: ../data/ui/AddWallhavenDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:386 msgid "Wallhaven.cc" msgstr "Wallhaven.cc" #: ../data/ui/AddWallhavenDialog.ui.h:3 msgid "" "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." msgstr "" #: ../data/ui/AddWallhavenDialog.ui.h:8 ../data/ui/AddWallbaseDialog.ui.h:9 msgid "Enter keywords or paste URL here: " msgstr "Stichwort eingeben oder Adresse einfügen: " #: ../data/ui/AddWallhavenDialog.ui.h:9 ../data/ui/AddFlickrDialog.ui.h:16 #: ../data/ui/AddWallbaseDialog.ui.h:10 msgid "Just a moment to check this search" msgstr "Suche benötigt einen Moment" #: ../data/ui/AddWallhavenDialog.ui.h:10 ../data/ui/AddFlickrDialog.ui.h:17 #: ../data/ui/AddRedditDialog.ui.h:9 ../data/ui/AddMediaRssDialog.ui.h:6 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:10 #: ../data/ui/AddWallbaseDialog.ui.h:11 msgid " " msgstr " " #: ../variety/QuotesEngine.py:232 msgid "No quote plugins" msgstr "Keine Zitaterweiterungen" #: ../variety/QuotesEngine.py:232 msgid "There are no quote plugins installed" msgstr "Es sind keine Zitaterweiterungen installiert" #: ../variety/QuotesEngine.py:238 msgid "No suitable quote plugins" msgstr "Keine brauchbaren Zitaterweiterungen" #: ../variety/QuotesEngine.py:239 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:251 msgid "Could not fetch quotes" msgstr "Zitate konnten nicht abgerufen werden" #: ../variety/QuotesEngine.py:252 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:255 msgid "Could not find quotes" msgstr "Konnte keine Zitate finden" #: ../variety/QuotesEngine.py:256 msgid "Maybe you are searching for something very obscure?" msgstr "Möglicherweise suchen Sie nach etwas unklarem?" #: ../variety/Texts.py:20 msgid "Keep original" msgstr "Original beibehalten" #: ../variety/Texts.py:21 msgid "Grayscale" msgstr "Graustufen" #: ../variety/Texts.py:22 msgid "Heavy blur" msgstr "Sehr verschwommen" #: ../variety/Texts.py:23 msgid "Soft blur" msgstr "Leicht verschwommen" #: ../variety/Texts.py:24 msgid "Oil painting" msgstr "Ölgemälde" #: ../variety/Texts.py:25 msgid "Pencil sketch" msgstr "Bleistiftskizze" #: ../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 "" #: ../variety/Texts.py:37 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:38 msgid "Random wallpapers from Desktoppr.co" msgstr "Zufällige Hintergrundbilder von Desktoppr.co" #: ../variety/Texts.py:39 msgid "NASA's Astronomy Picture of the Day" msgstr "NASAs Astronomiebild des Tages" #: ../variety/Texts.py:41 msgid "World Sunlight Map - live wallpaper from Die.net" msgstr "" #: ../variety/Texts.py:42 msgid "Bing Photo of the Day" msgstr "Bing-Foto des Tages" #: ../variety/Texts.py:43 msgid "High-resolution photos from Unsplash.com" msgstr "" #: ../variety/Texts.py:47 msgid "" "If you use KDE, you need to perform some actions before Variety will work. " "Please read here: http://peterlevi.com/variety/2014/05/variety-and-kde/" msgstr "" "Falls Sie KDE nutzen, sind einige Handgriffe nötig, bevor Variety " "funktioniert. Bitte lesen Sie: http://peterlevi.com/variety/2014/05/variety-" "and-kde/" #: ../variety/Texts.py:48 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:49 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 " "~/.config/variety/scripts. There are examples there for various desktop " "environments." msgstr "" "Falls Sie möchten, dass ein benutzerdefinierter Befehl ausgeführt wird, wenn " "das Hintergrundbild wechselt oder Sie eine alternative Arbeitsumgebung " "benutzen, dann bearbeiten Sie bitte die Skripts in " "~/.config/variety/scripts. Dort befinden sich Beispiele für unterschiedliche " "Arbeitsumgebungen." #: ../variety/Texts.py:50 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:51 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:52 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:53 msgid "" "Adding your own custom filters is quite easy: open " "~/.config/variety/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 "" "Eigene Filter hinzuzufügen ist einfach: ~/.config/variety/variety.conf in " "einer Textbearbeitung öffnen und die vorhandenen Filter als Vorlage " "benutzen. Jeder Filter ist bloß eine Zeile von Optionen, die an ImageMagicks " "Konvertierungsbefehl übergeben werden." #: ../variety/Texts.py:54 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:55 msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of ~/.config/variety/scripts/set_wallpaper." msgstr "" "Um Benachrichtungen beim Hintergrundbildwechsel zu aktivieren müssen die " "zwei Zeilen am Ende von ~/.config/variety/scripts/set_wallpaper " "auskommentiert werden." #: ../variety/Texts.py:56 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:57 msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "~/.config/variety/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 "" "Falls Zitate zu den Favoriten hinzugefügt werden, werden diese standardmäßig " "unter ~/.config/variety/favorite_quotes.txt gespeichert. Diese Datei ist " "kompatibel zu Varietys Quelle für Zitate aus lokalen Dateien. Die Datei ist " "ebenfalls kompatibel mit den Unix-Glückskeks-Hilfsmitteln." #: ../variety/PreferencesVarietyDialog.py:259 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:382 #: ../variety/PreferencesVarietyDialog.py:551 #: ../data/ui/PreferencesVarietyDialog.ui.h:11 msgid "Images" msgstr "Bilder" #: ../variety/PreferencesVarietyDialog.py:383 msgid "Folders" msgstr "Ordner" #: ../variety/PreferencesVarietyDialog.py:385 #: ../data/ui/AddFlickrDialog.ui.h:2 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:389 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:2 msgid "Wallpapers.net" msgstr "Wallpapers.net" #: ../variety/PreferencesVarietyDialog.py:390 #: ../data/ui/AddRedditDialog.ui.h:2 msgid "Reddit" msgstr "Reddit" #: ../variety/PreferencesVarietyDialog.py:391 #: ../data/ui/AddMediaRssDialog.ui.h:2 msgid "Media RSS" msgstr "Medien-RSS" #: ../variety/PreferencesVarietyDialog.py:416 msgid "Remove the source, keep the files" msgstr "Quelle entfernen, Dateien behalten" #: ../variety/PreferencesVarietyDialog.py:417 msgid "Remove the sources, keep the files" msgstr "Quellen entfernen, Dateien behalten" #: ../variety/PreferencesVarietyDialog.py:424 msgid "Remove the source and delete the downloaded files" msgstr "Quelle entfernen und heruntergeladene Dateien löschen" #: ../variety/PreferencesVarietyDialog.py:425 msgid "Remove the sources and delete the downloaded files" msgstr "Quellen entfernen und heruntergeladene Dateien löschen" #: ../variety/PreferencesVarietyDialog.py:458 msgid "World Sunlight Map enabled" msgstr "Sonnenlichtweltkarte aktiviert" #: ../variety/PreferencesVarietyDialog.py:459 msgid "" "Using the World Sunlight Map requires both downloading and changing enabled " "at intervals of 30 minutes or less. Settings were adjusted automatically." msgstr "" "Die Nutzung der Sonnenlichtweltkarte erfordert sowohl das Herunterladen, als " "auch das Aktivieren von 30-minütigen oder kürzeren Intervallen. Die " "Einstellungen werden automatisch angepasst." #: ../variety/PreferencesVarietyDialog.py:544 msgid "Add Images" msgstr "Bilder hinzufügen" #: ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Add" msgstr "Hinzufügen" #: ../variety/PreferencesVarietyDialog.py:567 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:703 #: ../variety/PreferencesVarietyDialog.py:716 #: ../data/ui/PreferencesVarietyDialog.ui.h:168 msgid "Edit..." msgstr "Bearbeiten …" #: ../variety/PreferencesVarietyDialog.py:710 msgid "View Image" msgstr "Bild anzeigen" #: ../variety/PreferencesVarietyDialog.py:713 msgid "Open Folder" msgstr "Ordner öffnen" #: ../variety/PreferencesVarietyDialog.py:1092 msgid "Recommended images source disabled" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1120 #: ../variety/PreferencesVarietyDialog.py:1139 #: ../variety/PreferencesVarietyDialog.py:1147 msgid "No write permissions" msgstr "Keine Schreibberechtigung" #: ../variety/PreferencesVarietyDialog.py:1127 msgid "Limit disabled" msgstr "Begrenzung aufgehoben" #: ../variety/PreferencesVarietyDialog.py:1128 msgid "" "Changing the download folder automatically turns off the size limit to " "prevent from accidental data loss" msgstr "" "Beim Ändern des Ordners, für das Herunterladen, wird das Speicherlimit " "automatisch aufgehoben, um unbeabsichtigten Datenverlust zu vermeiden." #: ../variety/PreferencesVarietyDialog.py:1134 #, python-format msgid "Actual download folder: %s " msgstr "Aktueller Ordner für das Herunterladen: %s " #: ../variety/PreferencesVarietyDialog.py:1214 msgid "Could not adjust permissions" msgstr "Berechtigungen konnten nicht angepasst werden" #: ../variety/PreferencesVarietyDialog.py:1215 #, 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/PreferencesVarietyDialog.py:1247 msgid "Logged in as: " msgstr "Angemeldet als: " #: ../variety/PreferencesVarietyDialog.py:1249 msgid "Anonymous" msgstr "Anonym" #: ../variety/PreferencesVarietyDialog.py:1250 #: ../data/ui/PreferencesVarietyDialog.ui.h:109 msgid "Login or register" msgstr "Anmeleden oder Registrieren" #: ../variety/PreferencesVarietyDialog.py:1250 msgid "Switch user" msgstr "Benutzer wechseln" #: ../data/ui/AddFlickrDialog.ui.h:1 msgid "Variety - add Flickr as an image source" msgstr "Variety - Flickr als Bildquelle hinzufügen" #: ../data/ui/AddFlickrDialog.ui.h:3 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.h:4 #: ../data/ui/PreferencesVarietyDialog.ui.h:58 msgid "Tags: " msgstr "Schlagworte: " #: ../data/ui/AddFlickrDialog.ui.h:5 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.h:7 msgid "User: " msgstr "Benutzer: " #: ../data/ui/AddFlickrDialog.ui.h:8 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.h:10 msgid "Group: " msgstr "Gruppe: " #: ../data/ui/AddFlickrDialog.ui.h:11 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/group" "s/wallpapers/" msgstr "" "Bitte die Gruppenadresse eingeben. \n" "z. B.: http://www.flickr.com/group" "s/wallpapers/" #: ../data/ui/AddFlickrDialog.ui.h:13 msgid "Text:" msgstr "Text:" #: ../data/ui/AddFlickrDialog.ui.h:14 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" #: ../variety/AddMediaRssDialog.py:40 msgid "" "This does not seem to be a valid Media RSS feed URL or there is no content " "there." msgstr "" "Dieses scheint keine gültige Media-RSS-Feed-Adresse zu sein oder es gibt " "dort keinen Inhalt." #: ../variety/VarietyWindow.py:630 ../variety/VarietyWindow.py:772 #: ../variety/VarietyWindow.py:2650 msgid "Already in Favorites" msgstr "Bereits in den Favoriten enthalten" #: ../variety/VarietyWindow.py:634 ../variety/ThumbsManager.py:144 #: ../variety/indicator.py:76 msgid "Copy to _Favorites" msgstr "Zu _Favoriten kopieren" #: ../variety/VarietyWindow.py:635 ../variety/ThumbsManager.py:151 msgid "Move to _Favorites" msgstr "Zu _Favoriten verschieben" #. both #: ../variety/VarietyWindow.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:165 ../variety/indicator.py:81 msgid "Move to Favorites" msgstr "Zu Favoriten verschieben" #: ../variety/VarietyWindow.py:665 ../variety/ThumbsManager.py:119 msgid "Fetched: Show Origin" msgstr "Abgerufen: Herkunft anzeigen" #: ../variety/VarietyWindow.py:667 ../variety/VarietyWindow.py:762 #: ../variety/ThumbsManager.py:121 #, python-format msgid "View at %s" msgstr "Auf %s anzeigen" #: ../variety/VarietyWindow.py:711 msgid "Unknown" msgstr "Unbekannt" #: ../variety/VarietyWindow.py:732 #, python-format msgid "Author: %s" msgstr "Autor: %s" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 #: ../variety/indicator.py:120 ../variety/indicator.py:185 msgid "Pause on current" msgstr "Beim Aktuellen anhalten" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 msgid "Resume regular changes" msgstr "" #: ../variety/VarietyWindow.py:772 ../variety/indicator.py:191 msgid "Save to Favorites" msgstr "Unter Favoriten speichern" #: ../variety/VarietyWindow.py:904 msgid "Filtering too strict?" msgstr "Filterung zu streng?" #: ../variety/VarietyWindow.py:905 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:1377 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:1379 msgid "Please add more image sources" msgstr "Bitte zusätzliche Bildquellen hinzufügen" #: ../variety/VarietyWindow.py:1380 msgid "No more wallpapers" msgstr "Keine weiteren Hintergrundbilder" #: ../variety/VarietyWindow.py:1566 msgid "Current wallpaper is not in the image sources" msgstr "Aktuelles Hintergrundbild ist nicht in den Bildquellen enthalten" #: ../variety/VarietyWindow.py:1601 #, 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:1603 #, 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:1623 ../variety/VarietyWindow.py:1643 msgid "Cannot delete" msgstr "Konnte nicht gelöscht werden" #: ../variety/VarietyWindow.py:1624 #, 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:1644 msgid "" "Probably there is no utility for moving to Trash?\n" "Please install trash-cli or gvfs-bin or konquerer." msgstr "" "Fehlt möglicherweise ein Werkzeug zum Verschieben in den Papierkorb?\n" "Bitte trash-cli, gvfs-bin oder konquerer installieren." #: ../variety/VarietyWindow.py:1776 msgid "Anonymous usage statistics" msgstr "Anonyme Nutzungsstatistiken" #: ../variety/VarietyWindow.py:1777 msgid "" "Variety collects anonymous usage statistics. \n" "These help us make it better and are not shared with anyone. \n" "To read more or turn them off, go to \"Sync and social\"" msgstr "" #: ../variety/VarietyWindow.py:1920 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:1945 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 /some/local/image.jpg --next" msgstr "" "%prog [Optionen] [Dateien oder Adressen]\n" "\n" "Lokale Dateien werden zur Variety-Warteschlange hinzugefügt.\n" "Internetadressen werden in den Abrufordner heruntergeladen und zur Variety-" "Warteschlange hinzugefügt.\n" "\n" "Um ein bestimmtes Hintergrundbild festzulegen: %prog /some/local/image.jpg --" "next" #: ../variety/VarietyWindow.py:1955 msgid "" "Show logging messages (-vv shows even finer debugging messages, -vvv debugs " "variety_lib too)" msgstr "" "Protokoll anzeigen (-vv zeigt mehr Details, -vvv berücksichtigt auch " "variety_lib)" #: ../variety/VarietyWindow.py:1959 msgid "Make the running instance quit" msgstr "Laufende Programminstanz beenden" #: ../variety/VarietyWindow.py:1963 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/VarietyWindow.py:1967 msgid "Show Next wallpaper" msgstr "Nächstes Hintergrundbild anzeigen" #: ../variety/VarietyWindow.py:1971 msgid "Show Previous wallpaper" msgstr "Vorheriges Hintergrundbild anzeigen" #: ../variety/VarietyWindow.py:1975 msgid "Show Next wallpaper, skipping the forward history" msgstr "Nächstes Hintergrundbild anzeigen, Verlauf vorwärts überspringen" #: ../variety/VarietyWindow.py:1979 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/VarietyWindow.py:1983 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/VarietyWindow.py:1987 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/VarietyWindow.py:1991 msgid "Pause on current image" msgstr "Beim aktuellen Bild anhalten" #: ../variety/VarietyWindow.py:1995 msgid "Resume regular image changes" msgstr "" #: ../variety/VarietyWindow.py:1999 msgid "Toggle Pause/Resume state" msgstr "Zwischen Pause/Weiter umschalten" #: ../variety/VarietyWindow.py:2003 msgid "Show Next quote" msgstr "Nächstes Zitat anzeigen" #: ../variety/VarietyWindow.py:2007 msgid "Show Previous quote" msgstr "Vorheriges Zitat anzeigen" #: ../variety/VarietyWindow.py:2011 msgid "Show Next quote, skipping the forward history" msgstr "Nächstes Zitat anzeigen, Verlauf vorwärts überspringen" #: ../variety/VarietyWindow.py:2015 msgid "Toggle Quotes Pause/Resume state" msgstr "Zitatedurchlauf pausieren/fortsetzen" #: ../variety/VarietyWindow.py:2019 msgid "Save the current quote to Favorites" msgstr "Aktuelles Zitat unter Favoriten speichern" #: ../variety/VarietyWindow.py:2023 msgid "Toggle History display" msgstr "Verlaufsanzeige ein-/ausschalten" #: ../variety/VarietyWindow.py:2027 msgid "Toggle Recent Downloads display" msgstr "Letztes Heruntergeladenes anzeigen/ausblenden" #: ../variety/VarietyWindow.py:2031 msgid "Show Preferences dialog" msgstr "Einstellungen anzeigen" #: ../variety/VarietyWindow.py:2035 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/VarietyWindow.py:2039 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/VarietyWindow.py:2053 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "" "Die Optionen --next, --fast-forward und --previous schließen sich " "gegenseitig aus." #: ../variety/VarietyWindow.py:2056 msgid "options --trash and --favorite are mutually exclusive" msgstr "Die Optionen --trash und --favorite schließen sich gegenseitig aus" #: ../variety/VarietyWindow.py:2059 msgid "options --pause and --resume are mutually exclusive" msgstr "Die Optionen --pause und --resume schließen sich gegenseitig aus" #: ../variety/VarietyWindow.py:2062 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:2179 ../variety/ImageFetcher.py:60 #: ../variety/ImageFetcher.py:71 ../variety/ImageFetcher.py:78 #: ../variety/ImageFetcher.py:112 msgid "Not an image" msgstr "Kein Bild" #: ../variety/VarietyWindow.py:2184 msgid "Added to queue" msgstr "Zur Warteschlange hinzugefügt" #: ../variety/VarietyWindow.py:2185 ../variety/VarietyWindow.py:2191 msgid "Press Next to see it" msgstr "Weiter klicken zum Anschauen" #: ../variety/VarietyWindow.py:2191 msgid "Fetched" msgstr "Abgerufen" #: ../variety/VarietyWindow.py:2237 msgid "Unsupported source type" msgstr "Nicht unterstützter Quelltyp" #: ../variety/VarietyWindow.py:2238 ../variety/VarietyWindow.py:2286 msgid "Are you running the most recent version of Variety?" msgstr "Wird die aktuellste Version von Variety genutzt?" #: ../variety/VarietyWindow.py:2244 msgid "New image source added" msgstr "Neue Bildquelle hinzugefügt" #: ../variety/VarietyWindow.py:2246 msgid "Image source already exists, enabling it" msgstr "Diese Bildquelle ist bereits vorhanden und wird aktiviert." #: ../variety/VarietyWindow.py:2272 msgid "Fetched and applied" msgstr "Abgerufen und angewendet" #: ../variety/VarietyWindow.py:2282 msgid "It works!" msgstr "Es funktioniert!" #: ../variety/VarietyWindow.py:2282 msgid "Yay, Variety links work. Great!" msgstr "" #: ../variety/VarietyWindow.py:2286 msgid "Unsupported command" msgstr "Nicht unterstützter Befehl" #: ../variety/VarietyWindow.py:2288 msgid "Could not process the given variety:// URL" msgstr "Die Adresse »variety://« konnte nicht verarbeitet werden" #: ../variety/VarietyWindow.py:2289 msgid "Run with logging enabled to see details" msgstr "" #: ../variety/VarietyWindow.py:2488 msgid "Do not ask anymore, always use the current quote" msgstr "Nicht mehr nachfragen und immer das aktuelle Zitat verwenden" #: ../variety/VarietyWindow.py:2491 ../data/ui/FacebookPublishDialog.ui.h:5 msgid "Do not ask anymore, always use the text above" msgstr "Nicht mehr nachfragen, immer den oben stehenden Text benutzen" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "Published" msgstr "Veröffentlicht" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "You may open your Facebook feed to see the post" msgstr "Sie können Facebook öffnen, um die Nachricht zu sehen" #: ../variety/VarietyWindow.py:2526 ../variety/VarietyWindow.py:2555 msgid "Could not publish" msgstr "Konnte nicht veröffentlicht werden" #: ../variety/VarietyWindow.py:2718 msgid "Could not create autostart entry" msgstr "Autostarteintrag konnte nicht erstellt werden" #: ../variety/VarietyWindow.py:2719 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:2769 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:2769 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/FacebookFirstRunDialog.ui.h:1 msgid "Variety - Facebook Sharing" msgstr "Variety - Facebook-Freigabe" #: ../data/ui/FacebookFirstRunDialog.ui.h:2 #: ../data/ui/PreferencesVarietyDialog.ui.h:169 msgid "Facebook Sharing" msgstr "Facebook-Freigabe" #: ../data/ui/FacebookFirstRunDialog.ui.h:3 msgid "" "You are sharing on Facebook for the first time. Sharing from Variety is " "available for images that come from online sources and for quotes. It works " "this way: \n" "\n" "1. Login to Facebook\n" "Facebook will open in your default browser. You will be prompted to login if " "you are not already logged in. \n" "\n" "2. Authorize Variety to publish to your " "feed.\n" "You will be asked to allow Variety to publish to your feed on your behalf. " "Variety will only use this permission to publish those images and quotes " "that you tell it to, nothing else.\n" "\n" "3. Configure browser to open variety:// links " "with Variety or xdg-open\n" "Then you will be redirected to a page with instructions to associate " "\"variety://\" links with Variety in your browser. Please follow these " "instructions to complete the setup. You have to do this only once.\n" "\n" "No passwords or login information is kept locally, just an OAuth Facebook " "token that will be valid for a couple of weeks. After its validity expires " "you will be asked to login again." msgstr "" #: ../variety/AddWallpapersNetCategoryDialog.py:40 msgid "Could not find wallpapers there. Please check the URL." msgstr "" "Es konnten keine Hintergrundbilder gefunden werden. Bitte überprüfen Sie die " "Adresse." #: ../data/ui/WelcomeDialog.ui.h:1 msgid "Welcome to Variety!" msgstr "Willkommen zu Variety" #: ../data/ui/WelcomeDialog.ui.h:2 ../data/ui/SmartFeaturesNoticeDialog.ui.h:3 msgid "Continue" msgstr "Fortsetzen" #: ../data/ui/WelcomeDialog.ui.h:3 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.h:4 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.h:5 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." #: ../data/ui/WelcomeDialog.ui.h:6 msgid "KDE Users - Important, please read:" msgstr "KDE-Benutzer - Wichtig, bitte lesen:" #: ../data/ui/WelcomeDialog.ui.h:7 msgid "" "You appear to be running KDE. In KDE 4 it is impossible to set the wallpaper " "from inside a program - there is no API for this. To make Variety work, please read " "and follow the instructions here." msgstr "" #: ../data/ui/AddRedditDialog.ui.h:1 msgid "Variety - add Reddit feed" msgstr "Variety - Reddit-Feed hinzufügen" #: ../data/ui/AddRedditDialog.ui.h:3 msgid "" "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" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:7 msgid "URL or name of a subreddit: " msgstr "Adresse oder Name eines Subreddit: " #: ../data/ui/AddRedditDialog.ui.h:8 msgid "Just a moment to check what's there" msgstr "" #: ../data/ui/AddMediaRssDialog.ui.h:1 msgid "Variety - add Media RSS feed" msgstr "Variety - Media-RSS-Feed hinzufügen" #: ../data/ui/AddMediaRssDialog.ui.h:3 msgid "" "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." msgstr "" "Bitte die Adresse des Medien-RRS-Feeds unten einfügen. Bitte beachten Sie, " "dass nur Medien-RRS-Feeds unterstützt werden, nicht beliebige RRS-Feeds. " "Medien-RRS-Feeds enthalten media:Inhaltschlagworte, die direkt zu dem " "Bildinhalt führen. Einige Beispielseiten, die Medien-RRS-Feeds anbieten, " "sind Picasa, DeviantArt, SmugMug, Flickr und interfacelift." #: ../data/ui/AddMediaRssDialog.ui.h:4 msgid "Paste the URL of the Media RSS feed here: " msgstr "Adresse des Media-RSS-Feeds hier einfügen: " #: ../data/ui/AddMediaRssDialog.ui.h:5 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:9 msgid "Just a moment to check what's at that URL" msgstr "Bitte einen Moment Geduld. Adresse wird geprüft." #: ../variety/AddRedditDialog.py:43 msgid "This does not seem to be a valid Reddit URL" msgstr "Das scheint keine gültige Reddit-Adresse zu sein" #: ../variety/AddRedditDialog.py:46 msgid "We could not find any image submissions there." msgstr "" #: ../variety/Smart.py:111 msgid "" "Your smart_user.json config file appears broken. You may have to login again " "to VRTY.ORG." msgstr "" "Ihre smart_user.json-Konfigurationsdatei scheint fehlerhaft zu sein. Sie " "müssen sich möglicherweise erneut bei VRTY.ORG anmelden." #: ../variety/Smart.py:195 msgid "Your VRTY.ORG credentials are probably outdated. Please login again." msgstr "" "Ihre VRTY.ORG-Zugangsdaten sind möglicherweise veraltet. Bitte nochmal " "anmelden." #: ../variety/Smart.py:597 ../variety/Smart.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:111 msgid "Sync" msgstr "Synchronisierung" #: ../variety/Smart.py:598 #, python-format msgid "Fetching %d images" msgstr "%d Bilder werden abgerufen" #: ../variety/Smart.py:598 msgid "Fetching 1 image" msgstr "1 Bild wird abgerufen" #: ../variety/Smart.py:643 msgid "Finished" msgstr "Fertiggestellt" #: ../variety/Smart.py:664 #, python-format msgid "Logged in as %s" msgstr "Angemeldet als %s" #: ../variety/Smart.py:676 #, python-format msgid "" "Do you want to login to VRTY.ORG as %s?" msgstr "" "Möchten Sie sich bei VRTY.ORG als %s " "anmelden?" #: ../variety/Smart.py:677 msgid "VRTY.ORG login confirmation" msgstr "VRTY.ORG-Anmeldebestätigung" #: ../data/plugins/quotes/QuotationsPageSource.py:35 msgid "Fetches quotes from TheQuotationsPage.com" msgstr "Zitatabruf von TheQuotationsPage.com" #: ../variety/__init__.py:143 msgid "Terminating signal received, quitting..." msgstr "Abbruchsignal empfangen, wird beendet …" #: ../variety/__init__.py:198 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Variety läuft bereits. Befehl wird an die laufende Instanz gesendet." #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:1 msgid "VRTY.ORG integration" msgstr "VRTY.ORG-Einbindung" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:2 msgid "This feature requires VRTY.ORG integration" msgstr "Diese Funktion benötigt die Einbindung von VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:3 msgid "Enable VRTY.ORG integration" msgstr "VRTY.ORG-Einbindung aktivieren" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:4 msgid "" "For this feature Variety needs permission to collect data about the images " "you like or dislike and the online sources you have enabled.\n" "\n" "Collected data is anonymous by default and covers only images which Variety " "downloaded, never images you already had in your local folders that might be " "private.\n" "\n" "This data helps us provide better images for everyone and fuels VRTY.ORG - a valuable resource for all users " "of Variety." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:1 msgid "Variety - VRTY.ORG" msgstr "Variety - VRTY.ORG" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:2 msgid "No, thanks" msgstr "Nein Danke" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:4 msgid "" "Introducing VRTY.ORG! Wanna take part?" msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:5 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to find and add new image sources to Variety, and to follow other users' " "favorites." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:6 msgid "" "Participation takes no effort - your profile will be built automatically, as " "you like or dislike images downloaded by Variety. Your profile will not be " "shared with third parties, unless you opt-in to make it public. Read more details about the " "service and the privacy policy here." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:7 msgid "" "Participation is required for some features of Variety such as synchronization of favorites between computers." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:8 #: ../data/ui/PreferencesVarietyDialog.ui.h:105 msgid "Participate in VRTY.ORG" msgstr "In VRTY.ORG teilnehmen" #: ../data/plugins/quotes/QuotesDaddySource.py:31 msgid "" "Fetches quotes from QuotesDaddy's daily quotes RSS feed.\n" "Does not support searching by tags or authors." msgstr "" "Zitate von QuotesDaddys täglichem Zitate-RSS feed werden abgerufen.\n" "Suche nach Schlagworten oder Autoren wird nicht unterstützt." #: ../data/ui/AboutVarietyDialog.ui.h:1 msgid "Copyright (c) 2012, Peter Levi " msgstr "Urheberrecht (c) 2012, Peter Levi " #: ../data/ui/AboutVarietyDialog.ui.h:2 msgid "About Variety" msgstr "Über Variety" #: ../data/ui/AboutVarietyDialog.ui.h:3 msgid "An automatic wallpaper changer, downloader and manager." msgstr "" "Anwendung zum automatischen Wechseln, Herunterladen und Verwalten von " "Hintergrundbildern." #: ../data/ui/AboutVarietyDialog.ui.h:4 msgid "http://peterlevi.com/variety" msgstr "http://peterlevi.com/variety" #: ../data/ui/AboutVarietyDialog.ui.h:5 msgid "" "# Copyright (c) 2012, Peter Levi \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/AddWallpapersNetCategoryDialog.ui.h:1 msgid "Variety - add Wallpapers.net category" msgstr "Variety - Wallpapers.net-Kategorie hinzufügen" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:3 msgid "" "Please visit wallpapers.net and choose " "a category with wallpapers, then paste its URL below. A category is " "anything on the site that has one or more pages with wallpapers on them. " "Here are some examples:\n" "\n" "All wallpapers: http://www.wallpapers.net/\n" "Specific resolution: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" msgstr "" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:8 msgid "Paste URL here: " msgstr "Adresse (URL) hier einfügen: " #: ../data/ui/PreferencesVarietyDialog.ui.h:1 msgid "seconds" msgstr "Sekunden" #: ../data/ui/PreferencesVarietyDialog.ui.h:2 msgid "minutes" msgstr "Minuten" #: ../data/ui/PreferencesVarietyDialog.ui.h:3 msgid "hours" msgstr "Stunden" #: ../data/ui/PreferencesVarietyDialog.ui.h:4 msgid "days" msgstr "Tage" #: ../data/ui/PreferencesVarietyDialog.ui.h:5 msgid "Variety Preferences" msgstr "Variety-Einstellungen" #: ../data/ui/PreferencesVarietyDialog.ui.h:6 msgid "General" msgstr "Allgemein" #: ../data/ui/PreferencesVarietyDialog.ui.h:7 msgid "Start Variety when the computer starts" msgstr "Variety mit dem Rechner starten" #: ../data/ui/PreferencesVarietyDialog.ui.h:8 msgid "Change wallpaper every " msgstr "Wechsel des Hintergrundbildes alle " #: ../data/ui/PreferencesVarietyDialog.ui.h:9 msgid "Minimum interval is 5 seconds" msgstr "Kürzeste Zeitspanne beträgt fünf Sekunden" #: ../data/ui/PreferencesVarietyDialog.ui.h:10 msgid "Change wallpaper on start" msgstr "Hintergrundbild beim Start wechseln" #: ../data/ui/PreferencesVarietyDialog.ui.h:12 msgid "Enabled" msgstr "Aktiviert" #: ../data/ui/PreferencesVarietyDialog.ui.h:13 msgid "Type" msgstr "Typ" #: ../data/ui/PreferencesVarietyDialog.ui.h:14 msgid "Location" msgstr "Standort" #: ../data/ui/PreferencesVarietyDialog.ui.h:15 msgid "_Add..." msgstr "_Hinzufügen …" #: ../data/ui/PreferencesVarietyDialog.ui.h:16 msgid "Add images, folders or online image sources" msgstr "Bilder, Ordner oder Internetbildquellen hinzufügen" #: ../data/ui/PreferencesVarietyDialog.ui.h:17 msgid "_Edit..." msgstr "_Bearbeiten …" #: ../data/ui/PreferencesVarietyDialog.ui.h:18 msgid "Edit the selected source" msgstr "Gewählte Quelle bearbeiten" #: ../data/ui/PreferencesVarietyDialog.ui.h:19 msgid "_Remove..." msgstr "_Entfernen …" #: ../data/ui/PreferencesVarietyDialog.ui.h:20 msgid "Remove selected image sources" msgstr "Gewählte Quelle entfernen" #: ../data/ui/PreferencesVarietyDialog.ui.h:21 msgid "_Use" msgstr "_Benutzen" #: ../data/ui/PreferencesVarietyDialog.ui.h:22 msgid "Enable the selected sources and disable all others" msgstr "Gewählte Quellen aktivieren und alle anderen deaktivieren" #: ../data/ui/PreferencesVarietyDialog.ui.h:23 msgid "Download a wallpaper every " msgstr "Ein Hintergrundbild herunterladen alle " #: ../data/ui/PreferencesVarietyDialog.ui.h:24 msgid "Minimum interval is one minute" msgstr "Kürzeste Zeitspanne beträgt eine Minute" #: ../data/ui/PreferencesVarietyDialog.ui.h:25 msgid "to " msgstr "nach " #: ../data/ui/PreferencesVarietyDialog.ui.h:26 msgid "Actual download folder " msgstr "Aktueller Ordner für das Herunterladen " #: ../data/ui/PreferencesVarietyDialog.ui.h:27 msgid "" "Caution: do NOT use this option if you use a custom download folder with " "valuable files in it. Variety will maintain the limit regardless of what is " "in the download folder." msgstr "" "Achtung: Nutzen Sie diese Option NICHT, wenn ein eigenes " "Herunterladverzeichnis mit wichtigen Dateien darin verwendet wird. Variety " "wird das eigene Speicherlimit ohne Rücksicht auf die enthaltenen Dateien " "durchsetzen." #: ../data/ui/PreferencesVarietyDialog.ui.h:28 msgid "Limit download folder to " msgstr "Ordner für das Herunterladen begrenzen auf " #: ../data/ui/PreferencesVarietyDialog.ui.h:29 msgid "Minimum size is 50 MB" msgstr "Mindestgröße sind 50 MB" #: ../data/ui/PreferencesVarietyDialog.ui.h:30 msgid "MB by deleting oldest files when necessary" msgstr "MB, wobei ältere Dateien bei Bedarf gelöscht werden" #: ../data/ui/PreferencesVarietyDialog.ui.h:31 msgid "Favorites" msgstr "Favoriten" #: ../data/ui/PreferencesVarietyDialog.ui.h:32 msgid "Copy favorite wallpapers to " msgstr "Die Lieblingshintergrundbilder kopieren nach " #: ../data/ui/PreferencesVarietyDialog.ui.h:33 msgid "Filters" msgstr "Filter" #: ../data/ui/PreferencesVarietyDialog.ui.h:34 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.h:35 msgid "Quotes" msgstr "Zitate" #: ../data/ui/PreferencesVarietyDialog.ui.h:36 msgid "Show random wise quotes on the desktop" msgstr "Zitate auf dem Schreibtisch nach dem Zufallsprinzip anzeigen" #: ../data/ui/PreferencesVarietyDialog.ui.h:37 msgid "Text color: " msgstr "Textfarbe: " #: ../data/ui/PreferencesVarietyDialog.ui.h:38 msgid "Text font: " msgstr "Schriftart: " #: ../data/ui/PreferencesVarietyDialog.ui.h:39 msgid "Backdrop color: " msgstr "Hintergrundfarbe: " #: ../data/ui/PreferencesVarietyDialog.ui.h:40 msgid "Backdrop opacity: " msgstr "Hintergrunddeckkraft: " #: ../data/ui/PreferencesVarietyDialog.ui.h:41 msgid " Transparent" msgstr " Transparent" #: ../data/ui/PreferencesVarietyDialog.ui.h:42 msgid "Opaque" msgstr "Deckend" #: ../data/ui/PreferencesVarietyDialog.ui.h:43 msgid "Draw a text shadow" msgstr "Textschatten anzeigen" #: ../data/ui/PreferencesVarietyDialog.ui.h:44 msgid "Appearance" msgstr "Erscheinungsbild" #: ../data/ui/PreferencesVarietyDialog.ui.h:45 msgid "Quotes area width: " msgstr "Breite des Zitatbereichs: " #: ../data/ui/PreferencesVarietyDialog.ui.h:46 msgid "Narrow " msgstr "Schmal " #: ../data/ui/PreferencesVarietyDialog.ui.h:47 msgid "Wide" msgstr "Breit" #: ../data/ui/PreferencesVarietyDialog.ui.h:48 msgid "Horizontal position: " msgstr "Horizontale Position: " #: ../data/ui/PreferencesVarietyDialog.ui.h:49 msgid "Left " msgstr "Links " #: ../data/ui/PreferencesVarietyDialog.ui.h:50 ../variety/ThumbsManager.py:44 msgid "Right" msgstr "Rechts" #: ../data/ui/PreferencesVarietyDialog.ui.h:51 msgid "Vertical position: " msgstr "Senkrechte Position: " #: ../data/ui/PreferencesVarietyDialog.ui.h:52 msgid "Top " msgstr "Oben " #: ../data/ui/PreferencesVarietyDialog.ui.h:53 ../variety/ThumbsManager.py:41 msgid "Bottom" msgstr "Unten" #: ../data/ui/PreferencesVarietyDialog.ui.h:54 msgid "Placement" msgstr "Platzierung" #: ../data/ui/PreferencesVarietyDialog.ui.h:55 msgid "Show quotes from these sources: " msgstr "Zitate von diesen Quellen anzeigen: " #: ../data/ui/PreferencesVarietyDialog.ui.h:56 msgid "" "More " "plugins" msgstr "" "Mehr " "Erweiterungen" #: ../data/ui/PreferencesVarietyDialog.ui.h:57 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.h:59 msgid "Example: funny, inspirational" msgstr "Beispiel: lustig, inspirierend" #: ../data/ui/PreferencesVarietyDialog.ui.h:60 msgid "Example: Albert Einstein, Voltaire" msgstr "Beispiel: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui.h:61 msgid "Authors: " msgstr "Autoren: " #: ../data/ui/PreferencesVarietyDialog.ui.h:62 msgid "Sources and filtering" msgstr "Quellen und Filter" #: ../data/ui/PreferencesVarietyDialog.ui.h:63 msgid "Change quote every " msgstr "Zitatwechsel alle " #: ../data/ui/PreferencesVarietyDialog.ui.h:64 msgid "Minimum interval is 10 seconds" msgstr "Kürzeste Zeitspanne beträgt zehn Sekunden" #: ../data/ui/PreferencesVarietyDialog.ui.h:65 msgid "Regular change" msgstr "Regelmäßiger Wechsel" #: ../data/ui/PreferencesVarietyDialog.ui.h:66 msgid "Clock" msgstr "Uhr" #: ../data/ui/PreferencesVarietyDialog.ui.h:67 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.h:68 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.h:69 msgid "Clock font: " msgstr "Uhrschriftart: " #: ../data/ui/PreferencesVarietyDialog.ui.h:70 msgid "Date font: " msgstr "Datumsschriftart: " #: ../data/ui/PreferencesVarietyDialog.ui.h:71 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.h:72 msgid "Effects" msgstr "Effekte" #: ../data/ui/PreferencesVarietyDialog.ui.h:73 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:74 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:75 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:76 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:77 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:78 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:79 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:80 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:81 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:82 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:83 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:84 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:85 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:86 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:87 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:88 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:89 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:90 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:91 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:92 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:93 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:94 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:95 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:96 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:97 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:98 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:99 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:100 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:101 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:102 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:103 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:104 msgid "VRTY.ORG" msgstr "VRTY.ORG" #: ../data/ui/PreferencesVarietyDialog.ui.h:106 msgid "VRTY.ORG is in beta and will take some time to mature" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:107 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to add new image sources to Variety, and to follow other users' favorites. " "It is fueled by the favorite images of all participating users." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:108 msgid "" "Could not create user - no connection to VRTY.ORG. We will try again later." msgstr "" "Benutzer konnte nicht erstellt werden – keine Verbindung zu VRTY.ORG. Wir " "werden es später erneut versuchen." #: ../data/ui/PreferencesVarietyDialog.ui.h:110 msgid "" "Registration enables cool features like synchronization of favorite images " "and sources between computers and personalized recommendations." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:112 msgid "Synchronize favorite images between computers" msgstr "Lieblingsbilder zwischen mehreren Rechnern synchronisieren" #: ../data/ui/PreferencesVarietyDialog.ui.h:113 msgid "Requires VRTY.ORG enabled and logged in." msgstr "VRTY.ORG wird benötigt, aktiviert und angemeldet." #: ../data/ui/PreferencesVarietyDialog.ui.h:114 msgid "" "Your favorite images from other computers will be automatically downloaded " "to this computer. You need to be logged in with the same VRTY.ORG user " "everywhere. Sync will not delete any images." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:115 msgid "Privacy policy" msgstr "Datenschutzerklärung" #: ../data/ui/PreferencesVarietyDialog.ui.h:116 msgid "" "Variety sends data only for images it downloaded, never for images you " "already had in your local folders that might be private, and Sync does not " "work for such images. Collected data is not shared with third parties, " "unless you opt-in to make your profile public. Read more details about the " "service and the privacy policy here." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:117 msgid "Usage statistics" msgstr "Nutzungsstatistiken" #: ../data/ui/PreferencesVarietyDialog.ui.h:118 msgid "Help make Variety better by sending anonymous usage statistics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:119 msgid "" "These stats help us improve Variety by understanding how users interact with " "it. They also include general info about your OS version and monitor setup. " "Collected data is not shared with anyone." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:120 msgid "Sync and social" msgstr "Synchronisierung und Sozial" #: ../data/ui/PreferencesVarietyDialog.ui.h:121 msgid "Fetch folder" msgstr "Abrufordner" #: ../data/ui/PreferencesVarietyDialog.ui.h:122 msgid "Save manually downloaded wallpapers to " msgstr "Manuell heruntergeladene Hintergrundbilder speichern unter " #: ../data/ui/PreferencesVarietyDialog.ui.h:123 msgid "Drag and drop" msgstr "Ziehen und Ablegen" #: ../data/ui/PreferencesVarietyDialog.ui.h:124 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.h:126 msgid "Clipboard monitoring" msgstr "Überwachung der Zwischenablage" #: ../data/ui/PreferencesVarietyDialog.ui.h:127 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Zwischenablage auf Bildadressen überwachen und diese abrufen" #: ../data/ui/PreferencesVarietyDialog.ui.h:128 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.h:129 msgid "Manual downloading" msgstr "Manuelles Herunterladen" #: ../data/ui/PreferencesVarietyDialog.ui.h:130 msgid "When possible use images that:" msgstr "Möglichst Bilder benutzten, auf die Folgendes zutrifft:" #: ../data/ui/PreferencesVarietyDialog.ui.h:131 ../variety/ThumbsManager.py:98 msgid "Size" msgstr "Größe" #: ../data/ui/PreferencesVarietyDialog.ui.h:132 msgid "Have landscape orientation" msgstr "Sind im Querformat" #: ../data/ui/PreferencesVarietyDialog.ui.h:133 msgid "Are big at least " msgstr "Mindestgröße ist " #: ../data/ui/PreferencesVarietyDialog.ui.h:134 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui.h:135 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui.h:136 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui.h:138 #, no-c-format msgid "% of the screen resolution" msgstr "% der Bildschirmauflösung" #: ../data/ui/PreferencesVarietyDialog.ui.h:139 msgid "Color" msgstr "Farbe" #: ../data/ui/PreferencesVarietyDialog.ui.h:140 msgid "Are dark or light:" msgstr "Sind dunkel oder hell:" #: ../data/ui/PreferencesVarietyDialog.ui.h:141 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Dunkel" #: ../data/ui/PreferencesVarietyDialog.ui.h:142 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Hell" #: ../data/ui/PreferencesVarietyDialog.ui.h:143 msgid "Contain this color: " msgstr "Enhalten diese Farbe: " #: ../data/ui/PreferencesVarietyDialog.ui.h:144 msgid "(Takes effect after some initial searching)" msgstr "(Wirkt sich nach einigen anfänglichen Suchen aus)" #: ../data/ui/PreferencesVarietyDialog.ui.h:145 msgid "Rating" msgstr "Bewertung" #: ../data/ui/PreferencesVarietyDialog.ui.h:146 msgid "Have EXIF rating at least " msgstr "Haben mindestens die Exif-Bewertung " #: ../data/ui/PreferencesVarietyDialog.ui.h:147 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui.h:148 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui.h:149 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui.h:150 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui.h:151 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui.h:152 msgid "Color and size" msgstr "Farbe und Größe" #: ../data/ui/PreferencesVarietyDialog.ui.h:153 msgid "Indicator Icon" msgstr "Anzeigensymbol" #: ../data/ui/PreferencesVarietyDialog.ui.h:154 msgid "Indicator icon:" msgstr "Anzeigensymbol:" #: ../data/ui/PreferencesVarietyDialog.ui.h:155 msgctxt "Icon option" msgid "Light" msgstr "Hell" #: ../data/ui/PreferencesVarietyDialog.ui.h:156 msgctxt "Icon option" msgid "Dark" msgstr "Dunkel" #: ../data/ui/PreferencesVarietyDialog.ui.h:157 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Aktuelles Hintergrundbild verwenden" #: ../data/ui/PreferencesVarietyDialog.ui.h:158 msgctxt "Icon option" msgid "Custom image..." msgstr "Benutzerdefiniertes Bild …" #: ../data/ui/PreferencesVarietyDialog.ui.h:159 msgctxt "Icon option" msgid "None" msgstr "Keins" #: ../data/ui/PreferencesVarietyDialog.ui.h:160 msgid "Select an icon" msgstr "Symbol auswählen" #: ../data/ui/PreferencesVarietyDialog.ui.h:161 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.h:162 msgid "Favorites Operations" msgstr "Favoritenoperationen" #: ../data/ui/PreferencesVarietyDialog.ui.h:163 msgid "Favorites operations to show in main menu:" msgstr "Favoritenoperationen, welche im Hauptmenü angezeigt werden sollen:" #: ../data/ui/PreferencesVarietyDialog.ui.h:164 msgid "Copy to Favorites" msgstr "Zu Favoriten kopieren" #: ../data/ui/PreferencesVarietyDialog.ui.h:166 msgid "Both Copy and Move" msgstr "Sowohl Kopieren, als auch Verschieben" #: ../data/ui/PreferencesVarietyDialog.ui.h:167 msgid "Depends on folder..." msgstr "Abhängig vom Ordner …" #: ../data/ui/PreferencesVarietyDialog.ui.h:170 msgid "Display dialog to customize the Facebook post before publishing" msgstr "" "Dialog zum Anpassen des Facebook-Beitrages, vor dem Veröffentlichen anzeigen" #: ../data/ui/PreferencesVarietyDialog.ui.h:171 msgid "Login Screen Support" msgstr "Unterstützung für das Anmeldefenster" #: ../data/ui/PreferencesVarietyDialog.ui.h:172 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.h:173 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.h:174 msgid "Copy wallpaper image files to this folder: " msgstr "Hintergrundbilder in diesen Ordner kopieren: " #: ../data/ui/PreferencesVarietyDialog.ui.h:175 msgid "Reset to default" msgstr "Auf Vorgabe zurücksetzen" #: ../data/ui/PreferencesVarietyDialog.ui.h:176 msgid "Still doesn't work?" msgstr "Funktioniert immer noch nicht?" #: ../data/ui/PreferencesVarietyDialog.ui.h:177 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.h:178 msgid "You don't have write permissions for this folder." msgstr "Keine Zugriffsrechte für diesen Ordner." #: ../data/ui/PreferencesVarietyDialog.ui.h:179 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.h:180 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.h:181 msgid "Customize" msgstr "Anpassen" #: ../data/ui/PreferencesVarietyDialog.ui.h:182 msgid "Tips and tricks" msgstr "Tipps und Tricks" #: ../data/ui/PreferencesVarietyDialog.ui.h:183 msgid "Recent changes" msgstr "Letzte Änderungen" #: ../data/ui/PreferencesVarietyDialog.ui.h:184 msgid "Visit website" msgstr "Internetseite besuchen" #: ../data/ui/PreferencesVarietyDialog.ui.h:185 msgid "Report a bug or request a feature" msgstr "Fehler melden oder neue Funktionen vorschlagen" #: ../data/ui/PreferencesVarietyDialog.ui.h:186 msgid "Send feedback" msgstr "Rückmeldung senden" #: ../data/ui/PreferencesVarietyDialog.ui.h:187 msgid "Donate to Variety" msgstr "Für Variety spenden" #: ../data/ui/PreferencesVarietyDialog.ui.h:188 msgid "Donate via PayPal" msgstr "Über PayPal spenden" #: ../data/ui/PreferencesVarietyDialog.ui.h:189 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.h:193 msgid "" "For Bitcoin and other payment methods please go to Variety's website." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:194 msgid "Donate" msgstr "Spenden" #: ../variety/FacebookHelper.py:116 msgid "Authorization successful" msgstr "Legitimierung erfolgreich" #: ../variety/FacebookHelper.py:116 msgid "Publishing..." msgstr "Veröffentlichung läuft …" #: ../variety/FacebookHelper.py:121 msgid "Authorization failed" msgstr "Legitimierung fehlgeschlagen" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Oben" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Links" #: ../variety/ThumbsManager.py:94 msgid "Position" msgstr "Position" #: ../variety/ThumbsManager.py:109 msgid "Show Containing Folder" msgstr "Zielordner anzeigen" #: ../variety/ThumbsManager.py:136 ../variety/indicator.py:156 msgid "Set EXIF Rating" msgstr "Exif-Bewertung eingeben" #: ../variety/ThumbsManager.py:160 ../variety/indicator.py:87 msgid "Delete to _Trash" msgstr "In _Papierkorb verschieben" #: ../variety/ThumbsManager.py:167 ../variety/indicator.py:131 msgid "Where is it from?" msgstr "Woher stammt das Bild?" #: ../variety/ThumbsManager.py:178 msgid "Close" msgstr "Schließen" #: ../variety/ThumbsManager.py:198 msgid "Could not set EXIF rating" msgstr "Exif-Bewertung konnte nicht eingegeben werden" #: ../variety/ThumbsManager.py:217 msgid "Unrated" msgstr "Nicht bewertet" #: ../variety/ThumbsManager.py:224 msgid "Rejected" msgstr "Abgewiesen" #: ../variety/ThumbsManager.py:324 msgid "Variety History" msgstr "Variety-Verlauf" #: ../variety/ThumbsManager.py:326 msgid "Variety Recent Downloads" msgstr "Variety: Kürzlich heruntergeladen" #: ../variety/ThumbsManager.py:328 msgid "Variety Images" msgstr "Variety-Bilder" #: ../data/ui/AddWallbaseDialog.ui.h:1 msgid "Variety - add Wallbase.cc image source" msgstr "Variety - Wallbase.cc als Bildquelle hinzufügen" #: ../data/ui/AddWallbaseDialog.ui.h:2 msgid "Wallbase.cc" msgstr "Wallbase.cc" #: ../data/ui/AddWallbaseDialog.ui.h:3 msgid "" "Wallbase.cc is permanently down. Use Wallhaven.cc instead. Support for " "Wallbase.cc will be dropped completely in a future release, please remove or " "update your existing Wallbase sources." msgstr "" #: ../data/ui/AddWallbaseDialog.ui.h:4 msgid "" "Wallbase.cc provides a variety of image " "search options. Below you can specify keywords to search for, or visit Wallbase.cc, setup your search criteria " "there, ensure you like the results, and paste the full Wallbase URL in the " "box.\n" "\n" "If you specify keywords, the most liked safe-for-work images that match any " "of the keywords will be used. \n" "\n" "If you specify a Wallbase 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." msgstr "" "Wallbase.cc bietet verschiedene " "Suchoptionen für Bilder. Unten können Sie Schlüsselwörter zum Suchen " "eingeben oder Wallbase.cc besuchen, Ihre " "Suchkriterien dort einstellen und wenn Ihnen die Ergebnisse gefallen, " "kopieren Sie die Adresse (URL) in das Eingabefeld.\n" "\n" "Falls Sie Schlüsselwörter angeben, werden die beliebtesten »passenden für " "den Arbeitsplatz« Bilder genutzt, die auf die Schlüsselwörter zutreffen.\n" "\n" "Falls Sie eine Wallbase-Adresse eingeben, wählen Sie bitte die Suchkriterien " "sorgfältig aus - Variety fordert regelmäßig Bilder an, aber nutzt nur die " "ersten Hundert Ergebnisse. Zufall oder Datum sorgen dafür, dass die Quelle " "eine längere Lebensdauer hat, bevor sie unbrauchbar wird. Favoriten bieten " "bessere Bilder und die Relevanz wird bessere Ergebnisse liefern, wenn nach " "Phrasen oder Farben gesucht wird." #: ../data/ui/FacebookPublishDialog.ui.h:1 msgid "Variety - Publish to Facebook" msgstr "Variety - auf Facebook veröffentlichen" #: ../data/ui/FacebookPublishDialog.ui.h:2 ../variety/indicator.py:149 #: ../variety/indicator.py:223 msgid "Share on Facebook" msgstr "Auf Facebook teilen" #: ../data/ui/FacebookPublishDialog.ui.h:3 msgid "" "Publish a link to the current wallpaper on Facebook. Include this text along " "with the link (or just leave empty):" msgstr "" "Veröffentlicht einen Link zum aktuellen Hintergrundbild auf Facebook. Hängt " "diesen Text an den Link an (oder einfach leer lassen):" #: ../data/ui/FacebookPublishDialog.ui.h:4 msgid "Use current quote" msgstr "Aktuelles Zitat nutzen" #: ../data/ui/SmartRegisterDialog.ui.h:1 msgid "Variety - VRTY.ORG registration" msgstr "Variety - VRTY.ORG-Registrierung" #: ../data/ui/SmartRegisterDialog.ui.h:2 msgid "Would you like to register?" msgstr "Möchten Sie sich registrieren?" #: ../data/ui/SmartRegisterDialog.ui.h:3 msgid "" "You may participate in VRTY.ORG " "anonymously, but registration enables some very nice features, such as synchronization of favorites between computers and " "personalized recommendations. It also ensures " "you will not lose your profile and favorite wallpapers if you reinstall your " "OS." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:4 msgid "Registration is very easy and does not require any personal data." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:5 msgid "" "If you choose to participate anonymously, you can register later from the " "\"Sync and social\" page in Preferences." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:6 msgid "" "Oops, we could not connect to VRTY.ORG. Server might be down. Please wait a " "couple of minutes and try again or choose \"Participate anonymously\" and register later " "from the \"Sync and social\" page in " "Preferences." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:7 msgid "" "Please continue the registration and follow the instructions in the browser " "tab we opened." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:8 msgid "I will participate anonymously" msgstr "Ich will anonym teilnehmen" #: ../data/ui/SmartRegisterDialog.ui.h:9 msgid "I'm registered, let me login" msgstr "Ich bin registriert, bitte anmelden" #: ../data/ui/SmartRegisterDialog.ui.h:10 msgid "Register here" msgstr "Hier registrieren" #: ../variety.desktop.in.h:1 msgid "Variety" msgstr "Variety" #: ../variety.desktop.in.h:2 msgid "Variety Wallpaper Changer" msgstr "Variety-Hintergrundbildwechsler" #: ../variety.desktop.in.h:3 msgid "Next" msgstr "Weiter" #: ../variety.desktop.in.h:4 msgid "Previous" msgstr "Zurück" #: ../variety.desktop.in.h:5 msgid "Pause / Resume" msgstr "Pause / Weiter" #: ../variety.desktop.in.h:6 msgid "History" msgstr "Verlauf" #: ../variety.desktop.in.h:7 msgid "Preferences" msgstr "Einstellungen" #: ../data/plugins/quotes/LocalFilesSource.py:34 msgid "" "Displays quotes, defined in local text files.\n" "Put your own txt files in: ~/.config/variety/pluginconfig/quotes/.\n" "The file format is:\n" "\n" "quote -- author\n" ".\n" "second quote -- another author\n" ".\n" "etc...\n" "\n" "Example: http://rvelthuis.de/zips/quotes.txt" msgstr "" "Zeigt Zitate aus lokalen Textdateien.\n" "Legen Sie ihre eigenen txt-Dateien in ~/.config/variety/pluginconfig/quotes/ " "ab.\n" "Das Format ist:\n" "\n" "Zitat -- Autor\n" ".\n" "Zweites Zitat -- Zweiter Autor\n" ".\n" "usw.\n" "\n" "Beispiel: http://rvelthuis.de/zips/quotes.txt" #: ../variety/indicator.py:49 ../variety/indicator.py:96 #: ../variety/indicator.py:166 msgid "_Next" msgstr "_Nächstes" #: ../variety/indicator.py:54 ../variety/indicator.py:101 #: ../variety/indicator.py:171 msgid "_Previous" msgstr "_Vorheriges" #: ../variety/indicator.py:61 msgid "Current desktop wallpaper" msgstr "Aktuelles Hintergrundbild" #: ../variety/indicator.py:65 msgid "Show origin" msgstr "Ursprung anzeigen" #: ../variety/indicator.py:106 ../variety/indicator.py:176 msgid "_Next, skipping forward history" msgstr "" #: ../variety/indicator.py:114 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:124 msgid "_Image" msgstr "_Bild" #: ../variety/indicator.py:135 msgid "Show without effects" msgstr "Ohne Effekte anzeigen" #: ../variety/indicator.py:143 msgid "Google Image Search" msgstr "Google-Bildersuche" #: ../variety/indicator.py:196 msgid "View Favorites..." msgstr "Favoriten anzeigen …" #: ../variety/indicator.py:203 msgid "Copy to Clipboard" msgstr "In die Zwischenablage kopieren" #: ../variety/indicator.py:213 msgid "Google Quote" msgstr "Google-Zitate" #: ../variety/indicator.py:218 msgid "Google Author" msgstr "Google-Autor" #: ../variety/indicator.py:230 ../variety/indicator.py:284 msgid "Preferences..." msgstr "Einstellungen …" #: ../variety/indicator.py:238 msgid "Turn off" msgstr "Ausschalten" #: ../variety/indicator.py:244 msgid "_Quote" msgstr "" #: ../variety/indicator.py:251 msgid "_History" msgstr "_Verlauf" #: ../variety/indicator.py:257 msgid "_Wallpaper Selector" msgstr "_Hintergrundbildauswahl" #: ../variety/indicator.py:263 msgid "Recent _Downloads" msgstr "_Kürzlich heruntergeladen" #: ../variety/indicator.py:278 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:288 msgid "About" msgstr "Über" #: ../variety/indicator.py:292 msgid "Quit" msgstr "Beenden" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:1 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Zu Favoriten kopieren oder zu Favoriten verschieben" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:2 msgid "Reset to Default" msgstr "Vorgaben wiederherstellen" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:3 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.h:4 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" #: ../variety/ImageFetcher.py:56 ../variety/ImageFetcher.py:103 msgid "Fetching" msgstr "Wird abgerufen" #. too small - delete and do not use #: ../variety/ImageFetcher.py:118 msgid "Image too small, ignoring it" msgstr "Bild zu klein, wird ignoriert." #: ../variety/ImageFetcher.py:140 #, python-format msgid "Sorry, got %s error..." msgstr "" #: ../variety/ImageFetcher.py:141 msgid "This means the link is no longer valid" msgstr "Das bedeutet, dass die Verknüpfung nicht mehr gültig ist" #: ../variety/ImageFetcher.py:144 msgid "Fetch failed for some reason" msgstr "Der Abruf versagte aus irgendeinem Grund" #: ../variety/ImageFetcher.py:145 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/po/fr.po0000644000000000000000000026273512655724350011044 0ustar # French translation for variety # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the variety package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: variety\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-01-29 10:57+0200\n" "PO-Revision-Date: 2015-11-20 19:48+0000\n" "Last-Translator: Bruno Veilleux \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-02-07 20:28+0000\n" "X-Generator: Launchpad (build 17908)\n" #: ../data/plugins/quotes/GoodreadsSource.py:49 msgid "Fetches quotes from Goodreads.com" msgstr "Récupère les citations depuis Goodreads.com" #: ../data/ui/LoginOrRegisterDialog.ui.h:1 msgid "Login to VRTY.ORG" msgstr "Connexion à VRTY.ORG" #: ../data/ui/LoginOrRegisterDialog.ui.h:2 msgid "Username: " msgstr "Nom d'utilisateur : " #: ../data/ui/LoginOrRegisterDialog.ui.h:3 msgid "Password: " msgstr "Mot de passe : " #: ../data/ui/LoginOrRegisterDialog.ui.h:4 msgid "No account? Register here" msgstr "Pas de compte ? Inscrivez-vous ici." #: ../data/ui/LoginOrRegisterDialog.ui.h:5 msgid "Forgot your password?" msgstr "Mot de passe oublié ?" #: ../data/ui/LoginOrRegisterDialog.ui.h:6 msgid "" "Tip: You can also login to VRTY.ORG in a " "browser and click the link \"Trigger Variety " "login\" in your profile." msgstr "" "Astuce : Vous pouvez également vous connecter à VRTY.ORG dans un navigateur et cliquer sur le " "lien « Trigger Variety login » (activer la " "connexion dans Variety) dans votre profil." #: ../data/ui/LoginOrRegisterDialog.ui.h:7 msgid "Login" msgstr "Connexion" #: ../variety/LoginOrRegisterDialog.py:80 #, python-format msgid "Oops, server returned error (%s)" msgstr "Oups ! Le serveur a renvoyé une erreur (%s)" #: ../variety/LoginOrRegisterDialog.py:85 msgid "Could not connect to server" msgstr "Impossible de se connecter au serveur" #: ../variety/AddWallhavenDialog.py:38 ../variety/AddWallbaseDialog.py:38 #: ../variety/AddFlickrDialog.py:138 msgid "No images found" msgstr "Aucune image trouvée" #: ../data/ui/AddPanoramioDialog.ui.h:1 msgid "Variety - add Panoramio image source" msgstr "Variety - ajouter Panoramio comme source d'images" #. (_("Wallbase.cc"), self.on_add_wallbase_clicked), #: ../data/ui/AddPanoramioDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:388 msgid "Panoramio" msgstr "Panoramio" #: ../data/ui/AddPanoramioDialog.ui.h:3 msgid "Please zoom over your area of interest." msgstr "Veuillez zoomer sur la zone qui vous intéresse." #: ../variety/FolderChooser.py:65 msgid "Choose a folder" msgstr "Choisir un dossier" #: ../variety/FolderChooser.py:66 ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Cancel" msgstr "Annuler" #: ../variety/FolderChooser.py:66 msgid "OK" msgstr "OK" #: ../data/ui/AddWallhavenDialog.ui.h:1 msgid "Variety - add Wallhaven.cc image source" msgstr "Variety - ajouter Wallhaven.cc comme source d'images" #: ../data/ui/AddWallhavenDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:386 msgid "Wallhaven.cc" msgstr "Wallhaven.cc" #: ../data/ui/AddWallhavenDialog.ui.h:3 msgid "" "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." msgstr "" "Wallhaven.cc fournit de nombreuses " "options de recherche d'images. Vous pouvez définir les mots-clés à " "rechercher ci-dessous ou visiter Wallhaven.cc, y configurer vos critères de " "recherche, vous assurer que les résultats vous conviennent et copier l'URL " "Wallhaven complète dans la zone de saisie.\n" "\n" "Si vous spécifiez des mots-clés, les images politiquement correctes les plus " "appréciées qui répondent à tous les mots-clés seront utilisées. \n" "\n" "Si vous spécifiez une URL Wallhaven, choisissez attentivement les critères " "de recherche. Variety recherche régulièrement des images, mais utilise " "uniquement des résultats parmi les premières centaines. Aléatoire ou Date " "signifiera que cette source d'images aura une « durée de vie » plus longue " "avant d'être épuisée. Favoris fournira de meilleures images et Pertinence " "fournira des résultats plus précis lors des recherches à base de phrases ou " "de couleurs." #: ../data/ui/AddWallhavenDialog.ui.h:8 ../data/ui/AddWallbaseDialog.ui.h:9 msgid "Enter keywords or paste URL here: " msgstr "Saisissez des mots-clés ou copiez l'URL ici : " #: ../data/ui/AddWallhavenDialog.ui.h:9 ../data/ui/AddFlickrDialog.ui.h:16 #: ../data/ui/AddWallbaseDialog.ui.h:10 msgid "Just a moment to check this search" msgstr "Juste un moment pour vérifier cette recherche" #: ../data/ui/AddWallhavenDialog.ui.h:10 ../data/ui/AddFlickrDialog.ui.h:17 #: ../data/ui/AddRedditDialog.ui.h:9 ../data/ui/AddMediaRssDialog.ui.h:6 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:10 #: ../data/ui/AddWallbaseDialog.ui.h:11 msgid " " msgstr " " #: ../variety/QuotesEngine.py:232 msgid "No quote plugins" msgstr "Aucun greffon de citations" #: ../variety/QuotesEngine.py:232 msgid "There are no quote plugins installed" msgstr "Il n'y a pas de greffon de citations installé" #: ../variety/QuotesEngine.py:238 msgid "No suitable quote plugins" msgstr "Pas de greffon de citations approprié" #: ../variety/QuotesEngine.py:239 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:251 msgid "Could not fetch quotes" msgstr "Impossible de récupérer des citations" #: ../variety/QuotesEngine.py:252 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:255 msgid "Could not find quotes" msgstr "Impossible de trouver des citations" #: ../variety/QuotesEngine.py:256 msgid "Maybe you are searching for something very obscure?" msgstr "Vous cherchez peut-être quelque chose de trop précis ?" #: ../variety/Texts.py:20 msgid "Keep original" msgstr "Conserver l'original" #: ../variety/Texts.py:21 msgid "Grayscale" msgstr "Niveaux de gris" #: ../variety/Texts.py:22 msgid "Heavy blur" msgstr "Flou intense" #: ../variety/Texts.py:23 msgid "Soft blur" msgstr "Flou léger" #: ../variety/Texts.py:24 msgid "Oil painting" msgstr "Peinture à l’huile" #: ../variety/Texts.py:25 msgid "Pencil sketch" msgstr "Dessin au crayon" #: ../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:37 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:38 msgid "Random wallpapers from Desktoppr.co" msgstr "Fonds d'écran aléatoires provenant de Desktoppr.co" #: ../variety/Texts.py:39 msgid "NASA's Astronomy Picture of the Day" msgstr "Image astronomique du jour de la NASA" #: ../variety/Texts.py:41 msgid "World Sunlight Map - live wallpaper from Die.net" msgstr "Carte d'ensoleillement du monde - fond d'écran dynamique de Die.net" #: ../variety/Texts.py:42 msgid "Bing Photo of the Day" msgstr "Photo du jour de Bing" #: ../variety/Texts.py:43 msgid "High-resolution photos from Unsplash.com" msgstr "Photos haute résolution de Unsplash.com" #: ../variety/Texts.py:47 msgid "" "If you use KDE, you need to perform some actions before Variety will work. " "Please read here: http://peterlevi.com/variety/2014/05/variety-and-kde/" msgstr "" "Si vous utilisez KDE, vous devez effectuer certaines actions avant que " "Variety ne puisse fonctionner. Veuillez lire (en anglais) : " "http://peterlevi.com/variety/2014/05/variety-and-kde/" #: ../variety/Texts.py:48 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:49 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 " "~/.config/variety/scripts. There are examples there for various desktop " "environments." msgstr "" "Si vous souhaitez lancer des commandes personnalisées à chaque changement de " "fond d'écran, ou si vous utilisez un environnement de bureau alternatif, " "veuillez modifier les scripts dans ~/.config/variety/scripts. Vous y " "trouverez des exemples pour différents environnements de bureau." #: ../variety/Texts.py:50 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:51 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:52 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:53 msgid "" "Adding your own custom filters is quite easy: open " "~/.config/variety/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 "" "Ajouter vos propres filtres personnalisés est très simple : ouvrez " "~/.config/variety/variety.conf dans un éditeur de texte et utilisez les " "filtres existants comme exemples. Chaque filtre n'est qu'une ligne d'options " "à envoyer à la commande de conversion d'ImageMagick." #: ../variety/Texts.py:54 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:55 msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of ~/.config/variety/scripts/set_wallpaper." msgstr "" "Pour activer les notifications sur le bureau lorsque le fond d'écran change, " "décommentez les deux lignes à la fin de " "~/.config/variety/scripts/set_wallpaper." #: ../variety/Texts.py:56 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:57 msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "~/.config/variety/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 "" "Si vous choisissez de sauvegarder des citations dans vos Favoris, celles-ci " "sont sauvegardées par défaut dans ~/.config/variety/favorite_quotes.txt. Ce " "fichier est compatible avec les fichiers locaux de sources de citations. Si " "vous souhaitez l'utiliser, copiez-le vers " "~/.config/variety/pluginconfig/quotes/ et activez la source de citations " "« Fichiers locaux ». Le fichier est également compatible avec l'utilitaire " "« fortune » de Unix." #: ../variety/PreferencesVarietyDialog.py:259 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:382 #: ../variety/PreferencesVarietyDialog.py:551 #: ../data/ui/PreferencesVarietyDialog.ui.h:11 msgid "Images" msgstr "Images" #: ../variety/PreferencesVarietyDialog.py:383 msgid "Folders" msgstr "Dossiers" #: ../variety/PreferencesVarietyDialog.py:385 #: ../data/ui/AddFlickrDialog.ui.h:2 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:389 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:2 msgid "Wallpapers.net" msgstr "Wallpapers.net" #: ../variety/PreferencesVarietyDialog.py:390 #: ../data/ui/AddRedditDialog.ui.h:2 msgid "Reddit" msgstr "Reddit" #: ../variety/PreferencesVarietyDialog.py:391 #: ../data/ui/AddMediaRssDialog.ui.h:2 msgid "Media RSS" msgstr "Média RSS" #: ../variety/PreferencesVarietyDialog.py:416 msgid "Remove the source, keep the files" msgstr "Supprimer la source, garder les fichiers" #: ../variety/PreferencesVarietyDialog.py:417 msgid "Remove the sources, keep the files" msgstr "Supprimer les sources, garder les fichiers" #: ../variety/PreferencesVarietyDialog.py:424 msgid "Remove the source and delete the downloaded files" msgstr "Supprimer la source et supprimer les fichiers téléchargés" #: ../variety/PreferencesVarietyDialog.py:425 msgid "Remove the sources and delete the downloaded files" msgstr "Supprimer les sources et supprimer les fichiers téléchargés" #: ../variety/PreferencesVarietyDialog.py:458 msgid "World Sunlight Map enabled" msgstr "Carte d'ensoleillement du monde activée" #: ../variety/PreferencesVarietyDialog.py:459 msgid "" "Using the World Sunlight Map requires both downloading and changing enabled " "at intervals of 30 minutes or less. Settings were adjusted automatically." msgstr "" "L'utilisation de la carte d'ensoleillement du monde nécessite l'activation " "du téléchargement et du changement à un intervalle de 30 minutes ou moins. " "Les réglages ont été ajustés automatiquement." #: ../variety/PreferencesVarietyDialog.py:544 msgid "Add Images" msgstr "Ajouter des images" #: ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Add" msgstr "Ajouter" #: ../variety/PreferencesVarietyDialog.py:567 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:703 #: ../variety/PreferencesVarietyDialog.py:716 #: ../data/ui/PreferencesVarietyDialog.ui.h:168 msgid "Edit..." msgstr "Modifier..." #: ../variety/PreferencesVarietyDialog.py:710 msgid "View Image" msgstr "Afficher l'image" #: ../variety/PreferencesVarietyDialog.py:713 msgid "Open Folder" msgstr "Ouvrir le dossier" #: ../variety/PreferencesVarietyDialog.py:1092 msgid "Recommended images source disabled" msgstr "Source d'images recommandée désactivée" #: ../variety/PreferencesVarietyDialog.py:1120 #: ../variety/PreferencesVarietyDialog.py:1139 #: ../variety/PreferencesVarietyDialog.py:1147 msgid "No write permissions" msgstr "Pas de droits d'écriture" #: ../variety/PreferencesVarietyDialog.py:1127 msgid "Limit disabled" msgstr "Limite désactivée" #: ../variety/PreferencesVarietyDialog.py:1128 msgid "" "Changing the download folder automatically turns off the size limit to " "prevent from accidental data loss" msgstr "" "Changer le dossier de téléchargement désactive automatiquement la limite de " "taille afin de prévenir une perte accidentelle de données." #: ../variety/PreferencesVarietyDialog.py:1134 #, python-format msgid "Actual download folder: %s " msgstr "Dossier de téléchargement actuel : %s " #: ../variety/PreferencesVarietyDialog.py:1214 msgid "Could not adjust permissions" msgstr "Impossible de régler les permissions" #: ../variety/PreferencesVarietyDialog.py:1215 #, 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/PreferencesVarietyDialog.py:1247 msgid "Logged in as: " msgstr "Connecté(e) en tant que : " #: ../variety/PreferencesVarietyDialog.py:1249 msgid "Anonymous" msgstr "Anonyme" #: ../variety/PreferencesVarietyDialog.py:1250 #: ../data/ui/PreferencesVarietyDialog.ui.h:109 msgid "Login or register" msgstr "Connexion ou inscription" #: ../variety/PreferencesVarietyDialog.py:1250 msgid "Switch user" msgstr "Changer d'utilisateur" #: ../data/ui/AddFlickrDialog.ui.h:1 msgid "Variety - add Flickr as an image source" msgstr "Variety - ajouter Flickr comme source d'images" #: ../data/ui/AddFlickrDialog.ui.h:3 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.h:4 #: ../data/ui/PreferencesVarietyDialog.ui.h:58 msgid "Tags: " msgstr "Tags : " #: ../data/ui/AddFlickrDialog.ui.h:5 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.h:7 msgid "User: " msgstr "Utilisateur : " #: ../data/ui/AddFlickrDialog.ui.h:8 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.h:10 msgid "Group: " msgstr "Groupe : " #: ../data/ui/AddFlickrDialog.ui.h:11 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/group" "s/wallpapers/" msgstr "" "Veuillez écrire l'URL du groupe.\n" "Exemple : http://www.flickr.com/group" "s/wallpapers/" #: ../data/ui/AddFlickrDialog.ui.h:13 msgid "Text:" msgstr "Texte :" #: ../data/ui/AddFlickrDialog.ui.h:14 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" #: ../variety/AddMediaRssDialog.py:40 msgid "" "This does not seem to be a valid Media RSS feed URL or there is no content " "there." msgstr "" "Ceci ne semble pas être une URL de flux Média RSS valide, ou alors il ne " "contient rien." #: ../variety/VarietyWindow.py:630 ../variety/VarietyWindow.py:772 #: ../variety/VarietyWindow.py:2650 msgid "Already in Favorites" msgstr "Déjà dans Favoris" #: ../variety/VarietyWindow.py:634 ../variety/ThumbsManager.py:144 #: ../variety/indicator.py:76 msgid "Copy to _Favorites" msgstr "Copier vers _Favoris" #: ../variety/VarietyWindow.py:635 ../variety/ThumbsManager.py:151 msgid "Move to _Favorites" msgstr "Déplacer vers _Favoris" #. both #: ../variety/VarietyWindow.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:165 ../variety/indicator.py:81 msgid "Move to Favorites" msgstr "Déplacer vers Favoris" #: ../variety/VarietyWindow.py:665 ../variety/ThumbsManager.py:119 msgid "Fetched: Show Origin" msgstr "Récupéré : montrer l'origine" #: ../variety/VarietyWindow.py:667 ../variety/VarietyWindow.py:762 #: ../variety/ThumbsManager.py:121 #, python-format msgid "View at %s" msgstr "Vue à %s" #: ../variety/VarietyWindow.py:711 msgid "Unknown" msgstr "Inconnu" #: ../variety/VarietyWindow.py:732 #, python-format msgid "Author: %s" msgstr "Auteur : %s" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 #: ../variety/indicator.py:120 ../variety/indicator.py:185 msgid "Pause on current" msgstr "Pause sur l'image actuelle" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 msgid "Resume regular changes" msgstr "" #: ../variety/VarietyWindow.py:772 ../variety/indicator.py:191 msgid "Save to Favorites" msgstr "Sauvegarder dans les Favoris" #: ../variety/VarietyWindow.py:904 msgid "Filtering too strict?" msgstr "Filtrage trop strict ?" #: ../variety/VarietyWindow.py:905 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:1377 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:1379 msgid "Please add more image sources" msgstr "Veuillez ajouter plus de sources d'images" #: ../variety/VarietyWindow.py:1380 msgid "No more wallpapers" msgstr "Plus d'autre fond d'écran" #: ../variety/VarietyWindow.py:1566 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:1601 #, 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:1603 #, 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:1623 ../variety/VarietyWindow.py:1643 msgid "Cannot delete" msgstr "Suppression impossible" #: ../variety/VarietyWindow.py:1624 #, 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:1644 msgid "" "Probably there is no utility for moving to Trash?\n" "Please install trash-cli or gvfs-bin or konquerer." msgstr "" "Il n'y a peut-être pas d'utilitaire pour mettre à la Corbeille ?\n" "Veuillez installer trash-cli, gvfs-bin ou konquerer." #: ../variety/VarietyWindow.py:1776 msgid "Anonymous usage statistics" msgstr "Statistiques anonymes d'utilisation" #: ../variety/VarietyWindow.py:1777 msgid "" "Variety collects anonymous usage statistics. \n" "These help us make it better and are not shared with anyone. \n" "To read more or turn them off, go to \"Sync and social\"" msgstr "" "Variety récupère des statistiques d'usage anonymes. \n" "Elles nous aident à améliorer le logiciel et ne sont partagées avec aucun " "tiers. \n" "Pour en savoir plus ou les désactiver, voir « Synchronisation et social »." #: ../variety/VarietyWindow.py:1920 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:1945 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 /some/local/image.jpg --next" msgstr "" "%prog [options] [fichiers ou URL]\n" "\n" "Passer des noms de fichiers locaux les ajoutera à la file d'attente de " "Variety.\n" "Passer des URL distantes fera télécharger les images dans le dossier " "Récupéré et les placera dans la file d'attente de Variety.\n" "\n" "Pour choisir un fond d'écran spécifique : %prog /une/image/locale.jpg --next" #: ../variety/VarietyWindow.py:1955 msgid "" "Show logging messages (-vv shows even finer debugging messages, -vvv debugs " "variety_lib too)" msgstr "" "Afficher les messages de connexion (-vv affiche même les messages de " "débogage les plus fins, -vvv débogue également variety_lib)" #: ../variety/VarietyWindow.py:1959 msgid "Make the running instance quit" msgstr "Quitter l'instance en cours" #: ../variety/VarietyWindow.py:1963 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/VarietyWindow.py:1967 msgid "Show Next wallpaper" msgstr "Montrer le fond d'écran suivant" #: ../variety/VarietyWindow.py:1971 msgid "Show Previous wallpaper" msgstr "Montrer le fond d'écran précédent" #: ../variety/VarietyWindow.py:1975 msgid "Show Next wallpaper, skipping the forward history" msgstr "Montrer le fond d'écran suivant, en ignorant la file d'attente" #: ../variety/VarietyWindow.py:1979 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/VarietyWindow.py:1983 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/VarietyWindow.py:1987 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/VarietyWindow.py:1991 msgid "Pause on current image" msgstr "Pause sur l'image actuelle" #: ../variety/VarietyWindow.py:1995 msgid "Resume regular image changes" msgstr "" #: ../variety/VarietyWindow.py:1999 msgid "Toggle Pause/Resume state" msgstr "Basculer entre les modes Pause/Reprendre" #: ../variety/VarietyWindow.py:2003 msgid "Show Next quote" msgstr "Montrer la citation suivante" #: ../variety/VarietyWindow.py:2007 msgid "Show Previous quote" msgstr "Montrer la citation précédente" #: ../variety/VarietyWindow.py:2011 msgid "Show Next quote, skipping the forward history" msgstr "Montrer la citation suivante, en ignorant la file d'attente" #: ../variety/VarietyWindow.py:2015 msgid "Toggle Quotes Pause/Resume state" msgstr "Basculer entre les modes Pause/Reprendre pour les citations" #: ../variety/VarietyWindow.py:2019 msgid "Save the current quote to Favorites" msgstr "Enregistrer la citation actuelle dans les Favoris" #: ../variety/VarietyWindow.py:2023 msgid "Toggle History display" msgstr "Afficher/masquer l'historique" #: ../variety/VarietyWindow.py:2027 msgid "Toggle Recent Downloads display" msgstr "Afficher/masquer les téléchargements récents" #: ../variety/VarietyWindow.py:2031 msgid "Show Preferences dialog" msgstr "Afficher la fenêtre Préférences" #: ../variety/VarietyWindow.py:2035 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/VarietyWindow.py:2039 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/VarietyWindow.py:2053 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "" "les options --next, --fast-forward et --previous s'excluent mutuellement" #: ../variety/VarietyWindow.py:2056 msgid "options --trash and --favorite are mutually exclusive" msgstr "les options --trash et --favorite s'excluent mutuellement" #: ../variety/VarietyWindow.py:2059 msgid "options --pause and --resume are mutually exclusive" msgstr "les options --pause et --resume s'excluent mutuellement" #: ../variety/VarietyWindow.py:2062 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:2179 ../variety/ImageFetcher.py:60 #: ../variety/ImageFetcher.py:71 ../variety/ImageFetcher.py:78 #: ../variety/ImageFetcher.py:112 msgid "Not an image" msgstr "Ceci n'est pas une image" #: ../variety/VarietyWindow.py:2184 msgid "Added to queue" msgstr "Ajouté à la file d'attente" #: ../variety/VarietyWindow.py:2185 ../variety/VarietyWindow.py:2191 msgid "Press Next to see it" msgstr "Cliquez sur Suivant pour le voir" #: ../variety/VarietyWindow.py:2191 msgid "Fetched" msgstr "Récupéré" #: ../variety/VarietyWindow.py:2237 msgid "Unsupported source type" msgstr "Type de source non pris en charge" #: ../variety/VarietyWindow.py:2238 ../variety/VarietyWindow.py:2286 msgid "Are you running the most recent version of Variety?" msgstr "Utilisez-vous la version la plus récente de Variety ?" #: ../variety/VarietyWindow.py:2244 msgid "New image source added" msgstr "Nouvelle source d'images ajoutée" #: ../variety/VarietyWindow.py:2246 msgid "Image source already exists, enabling it" msgstr "" #: ../variety/VarietyWindow.py:2272 msgid "Fetched and applied" msgstr "Récupérée et appliquée" #: ../variety/VarietyWindow.py:2282 msgid "It works!" msgstr "Ça fonctionne !" #: ../variety/VarietyWindow.py:2282 msgid "Yay, Variety links work. Great!" msgstr "Les liens Variety fonctionnent. Super !" #: ../variety/VarietyWindow.py:2286 msgid "Unsupported command" msgstr "Commande non prise en charge" #: ../variety/VarietyWindow.py:2288 msgid "Could not process the given variety:// URL" msgstr "Impossible de traiter l'URL variety:// demandée" #: ../variety/VarietyWindow.py:2289 msgid "Run with logging enabled to see details" msgstr "Exécuter en activant les rapports pour voir les détails" #: ../variety/VarietyWindow.py:2488 msgid "Do not ask anymore, always use the current quote" msgstr "Ne plus demander, toujours utiliser la citation actuelle" #: ../variety/VarietyWindow.py:2491 ../data/ui/FacebookPublishDialog.ui.h:5 msgid "Do not ask anymore, always use the text above" msgstr "Ne plus demander, toujours utiliser le texte ci-dessus" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "Published" msgstr "Publié" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "You may open your Facebook feed to see the post" msgstr "" "Vous pouvez ouvrir votre fil d’actualité Facebook pour voir la publication" #: ../variety/VarietyWindow.py:2526 ../variety/VarietyWindow.py:2555 msgid "Could not publish" msgstr "Publication impossible" #: ../variety/VarietyWindow.py:2718 msgid "Could not create autostart entry" msgstr "" #: ../variety/VarietyWindow.py:2719 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:2769 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:2769 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/FacebookFirstRunDialog.ui.h:1 msgid "Variety - Facebook Sharing" msgstr "Variety - Partage sur Facebook" #: ../data/ui/FacebookFirstRunDialog.ui.h:2 #: ../data/ui/PreferencesVarietyDialog.ui.h:169 msgid "Facebook Sharing" msgstr "Partage sur Facebook" #: ../data/ui/FacebookFirstRunDialog.ui.h:3 msgid "" "You are sharing on Facebook for the first time. Sharing from Variety is " "available for images that come from online sources and for quotes. It works " "this way: \n" "\n" "1. Login to Facebook\n" "Facebook will open in your default browser. You will be prompted to login if " "you are not already logged in. \n" "\n" "2. Authorize Variety to publish to your " "feed.\n" "You will be asked to allow Variety to publish to your feed on your behalf. " "Variety will only use this permission to publish those images and quotes " "that you tell it to, nothing else.\n" "\n" "3. Configure browser to open variety:// links " "with Variety or xdg-open\n" "Then you will be redirected to a page with instructions to associate " "\"variety://\" links with Variety in your browser. Please follow these " "instructions to complete the setup. You have to do this only once.\n" "\n" "No passwords or login information is kept locally, just an OAuth Facebook " "token that will be valid for a couple of weeks. After its validity expires " "you will be asked to login again." msgstr "" "Vous partagez sur Facebook pour la première fois. Le partage à partir de " "Variety est disponible pour les images obtenues depuis des sources en ligne " "et les citations. Voici comment faire : \n" "\n" "1. Connectez-vous à Facebook\n" "Facebook s'ouvrira dans votre navigateur par défaut. Vous devrez vous " "connecter si ce n'est déjà fait. \n" "\n" "2. Autorisez Variety à publier sur votre fil " "d'activité.\n" "Facebook vous demandera d'autoriser Variety à publier sur votre fil en votre " "nom. Variety utilisera uniquement cette autorisation pour publier les images " "et citations que vous choisissez, et rien d'autre.\n" "\n" "3. Configurez votre navigateur pour ouvrir les " "liens variety:// avec Variety ou xdg-open\n" "Vous serez alors redirigé(e) vers une page contenant des instructions pour " "associer les liens « variety:// » à Variety dans votre navigateur. Veuillez " "suivre ces instructions pour terminer la configuration. Vous n'aurez à faire " "ceci qu'une seule fois.\n" "\n" "Aucun mot de passe et aucune information de connexion ne sont conservés " "localement, seul un jeton Facebook OAuth est conservé et valide pour " "quelques semaines. Une fois expiré, Facebook vous demandera de vous " "connecter à nouveau." #: ../variety/AddWallpapersNetCategoryDialog.py:40 msgid "Could not find wallpapers there. Please check the URL." msgstr "Aucun fond d'écran trouvé. Veuillez vérifier l'URL." #: ../data/ui/WelcomeDialog.ui.h:1 msgid "Welcome to Variety!" msgstr "Bienvenue sur Variety !" #: ../data/ui/WelcomeDialog.ui.h:2 ../data/ui/SmartFeaturesNoticeDialog.ui.h:3 msgid "Continue" msgstr "Continuer" #: ../data/ui/WelcomeDialog.ui.h:3 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.h:4 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.h:5 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." #: ../data/ui/WelcomeDialog.ui.h:6 msgid "KDE Users - Important, please read:" msgstr "Utilisateurs KDE - Important, veuillez lire :" #: ../data/ui/WelcomeDialog.ui.h:7 msgid "" "You appear to be running KDE. In KDE 4 it is impossible to set the wallpaper " "from inside a program - there is no API for this. To make Variety work, please read " "and follow the instructions here." msgstr "" "Il semble que vous utilisez KDE. Avec KDE 4, il est impossible de définir le " "fond d'écran à partir d'un programme - aucune API ne le permet. Pour faire " "fonctionner Variety, veuillez lire et suivre les instructions ici (en anglais)." #: ../data/ui/AddRedditDialog.ui.h:1 msgid "Variety - add Reddit feed" msgstr "Variety - ajouter un flux Reddit" #: ../data/ui/AddRedditDialog.ui.h:3 msgid "" "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" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:7 msgid "URL or name of a subreddit: " msgstr "URL ou nom d'un subreddit : " #: ../data/ui/AddRedditDialog.ui.h:8 msgid "Just a moment to check what's there" msgstr "Juste un moment pour vérifier ce qui s'y trouve" #: ../data/ui/AddMediaRssDialog.ui.h:1 msgid "Variety - add Media RSS feed" msgstr "Variety - ajouter un flux Média RSS" #: ../data/ui/AddMediaRssDialog.ui.h:3 msgid "" "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." msgstr "" "Vous pouvez coller l'URL du flux Média RSS ci-dessous. Notez que seuls les " "flux Média RSS sont pris en charge, pas les flux RSS arbitraires. Les flux " "Média RSS contiennent des balises media:content pointant directement sur le " "contenu réel de l'image. Voici des exemples de sites qui fournissent des " "flux Média RSS : Picasa, deviantART, SmugMug, Flickr, InterfaceLIFT." #: ../data/ui/AddMediaRssDialog.ui.h:4 msgid "Paste the URL of the Media RSS feed here: " msgstr "Coller l'URL du flux Média RSS ici : " #: ../data/ui/AddMediaRssDialog.ui.h:5 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:9 msgid "Just a moment to check what's at that URL" msgstr "Juste un moment pour vérifier le contenu de cette URL" #: ../variety/AddRedditDialog.py:43 msgid "This does not seem to be a valid Reddit URL" msgstr "Ceci ne semble pas être une URL Reddit valide" #: ../variety/AddRedditDialog.py:46 msgid "We could not find any image submissions there." msgstr "" #: ../variety/Smart.py:111 msgid "" "Your smart_user.json config file appears broken. You may have to login again " "to VRTY.ORG." msgstr "" "Votre fichier de configuration smart_user.json semble défectueux. Vous " "devrez peut-être vous reconnecter à VRTY.ORG." #: ../variety/Smart.py:195 msgid "Your VRTY.ORG credentials are probably outdated. Please login again." msgstr "" "Vos authentifiants VRTY.ORG ont probablement expirés. Veuillez vous " "reconnecter." #: ../variety/Smart.py:597 ../variety/Smart.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:111 msgid "Sync" msgstr "Synchroniser" #: ../variety/Smart.py:598 #, python-format msgid "Fetching %d images" msgstr "Récupération de %d images" #: ../variety/Smart.py:598 msgid "Fetching 1 image" msgstr "Récupération de 1 image" #: ../variety/Smart.py:643 msgid "Finished" msgstr "Terminé" #: ../variety/Smart.py:664 #, python-format msgid "Logged in as %s" msgstr "Connecté(e) en tant que %s" #: ../variety/Smart.py:676 #, python-format msgid "" "Do you want to login to VRTY.ORG as %s?" msgstr "" "Désirez-vous vous connecter à VRTY.ORG en tant que %s ?" #: ../variety/Smart.py:677 msgid "VRTY.ORG login confirmation" msgstr "Confirmation de connexion à VRTY.ORG" #: ../data/plugins/quotes/QuotationsPageSource.py:35 msgid "Fetches quotes from TheQuotationsPage.com" msgstr "Récupère des citations depuis TheQuotationsPage.com" #: ../variety/__init__.py:143 msgid "Terminating signal received, quitting..." msgstr "Signal d'arrêt reçu. Arrêt en cours…" #: ../variety/__init__.py:198 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." #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:1 msgid "VRTY.ORG integration" msgstr "Intégration à VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:2 msgid "This feature requires VRTY.ORG integration" msgstr "Cette fonctionnalité nécessite l'intégration à VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:3 msgid "Enable VRTY.ORG integration" msgstr "Activer l'intégration à VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:4 msgid "" "For this feature Variety needs permission to collect data about the images " "you like or dislike and the online sources you have enabled.\n" "\n" "Collected data is anonymous by default and covers only images which Variety " "downloaded, never images you already had in your local folders that might be " "private.\n" "\n" "This data helps us provide better images for everyone and fuels VRTY.ORG - a valuable resource for all users " "of Variety." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:1 msgid "Variety - VRTY.ORG" msgstr "Variety - VRTY.ORG" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:2 msgid "No, thanks" msgstr "Non merci" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:4 msgid "" "Introducing VRTY.ORG! Wanna take part?" msgstr "" "Découvrez VRTY.ORG ! Vous voulez participer ?" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:5 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to find and add new image sources to Variety, and to follow other users' " "favorites." msgstr "" "VRTY.ORG connecte les utilisateurs de " "Variety ayant des goûts semblables et leur offre des façons pratiques de " "modifier leur fond d'écran, de trouver et d'ajouter de nouvelles sources " "d'images à Variety et de suivre les images favorites d'autres utilisateurs." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:6 msgid "" "Participation takes no effort - your profile will be built automatically, as " "you like or dislike images downloaded by Variety. Your profile will not be " "shared with third parties, unless you opt-in to make it public. Read more details about the " "service and the privacy policy here." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:7 msgid "" "Participation is required for some features of Variety such as synchronization of favorites between computers." msgstr "" "La participation est requise pour certaines fonctionnalités de Variety " "telles que la synchronisation des favoris entre " "ordinateurs." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:8 #: ../data/ui/PreferencesVarietyDialog.ui.h:105 msgid "Participate in VRTY.ORG" msgstr "Participer à VRTY.ORG" #: ../data/plugins/quotes/QuotesDaddySource.py:31 msgid "" "Fetches quotes from QuotesDaddy's daily quotes RSS feed.\n" "Does not support searching by tags or authors." msgstr "" "Récupère les citations depuis le flux RSS des citations quotidiennes de " "QuotesDaddy.\n" "Ne prend pas en charge la recherche par tags ou auteurs." #: ../data/ui/AboutVarietyDialog.ui.h:1 msgid "Copyright (c) 2012, Peter Levi " msgstr "Copyright (c) 2012, Peter Levi " #: ../data/ui/AboutVarietyDialog.ui.h:2 msgid "About Variety" msgstr "À propos de Variety" #: ../data/ui/AboutVarietyDialog.ui.h:3 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.h:4 msgid "http://peterlevi.com/variety" msgstr "http://peterlevi.com/variety" #: ../data/ui/AboutVarietyDialog.ui.h:5 msgid "" "# Copyright (c) 2012, Peter Levi \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, Peter Levi \n" "# Ce programme est un logiciel libre ; vous pouvez le redistribuer ou le \n" "# modifier suivant les termes de la « GNU General Public License » version 3 " "telle que \n" "# publiée par la Free Software Foundation.\n" "# \n" "# Ce programme est distribué dans l’espoir qu’il vous sera utile, mais SANS\n" "# AUCUNE GARANTIE : sans même la garantie implicite de COMMERCIALISABILITÉ\n" "# ni d’ADÉQUATION À UN OBJECTIF PARTICULIER. Consultez la Licence Générale\n" "# Publique GNU pour plus de détails.\n" "# \n" "# Vous devriez avoir reçu une copie de la Licence Générale Publique GNU " "avec\n" "# ce programme ; si ce n’est pas le cas, consultez :\n" "# .\n" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:1 msgid "Variety - add Wallpapers.net category" msgstr "Variety - ajouter la catégorie de Wallpapers.net" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:3 msgid "" "Please visit wallpapers.net and choose " "a category with wallpapers, then paste its URL below. A category is " "anything on the site that has one or more pages with wallpapers on them. " "Here are some examples:\n" "\n" "All wallpapers: http://www.wallpapers.net/\n" "Specific resolution: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" msgstr "" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:8 msgid "Paste URL here: " msgstr "Coller l'URL ici : " #: ../data/ui/PreferencesVarietyDialog.ui.h:1 msgid "seconds" msgstr "secondes" #: ../data/ui/PreferencesVarietyDialog.ui.h:2 msgid "minutes" msgstr "minutes" #: ../data/ui/PreferencesVarietyDialog.ui.h:3 msgid "hours" msgstr "heures" #: ../data/ui/PreferencesVarietyDialog.ui.h:4 msgid "days" msgstr "jours" #: ../data/ui/PreferencesVarietyDialog.ui.h:5 msgid "Variety Preferences" msgstr "Préférences de Variety" #: ../data/ui/PreferencesVarietyDialog.ui.h:6 msgid "General" msgstr "Général" #: ../data/ui/PreferencesVarietyDialog.ui.h:7 msgid "Start Variety when the computer starts" msgstr "Lancer Variety au démarrage" #: ../data/ui/PreferencesVarietyDialog.ui.h:8 msgid "Change wallpaper every " msgstr "Changer le fond d'écran toutes les " #: ../data/ui/PreferencesVarietyDialog.ui.h:9 msgid "Minimum interval is 5 seconds" msgstr "L'intervalle minimal est de 5 secondes" #: ../data/ui/PreferencesVarietyDialog.ui.h:10 msgid "Change wallpaper on start" msgstr "Changer le fond d'écran au démarrage" #: ../data/ui/PreferencesVarietyDialog.ui.h:12 msgid "Enabled" msgstr "Activé" #: ../data/ui/PreferencesVarietyDialog.ui.h:13 msgid "Type" msgstr "Type" #: ../data/ui/PreferencesVarietyDialog.ui.h:14 msgid "Location" msgstr "Emplacement" #: ../data/ui/PreferencesVarietyDialog.ui.h:15 msgid "_Add..." msgstr "_Ajouter…" #: ../data/ui/PreferencesVarietyDialog.ui.h:16 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.h:17 msgid "_Edit..." msgstr "_Modifier…" #: ../data/ui/PreferencesVarietyDialog.ui.h:18 msgid "Edit the selected source" msgstr "Modifier la source sélectionnée" #: ../data/ui/PreferencesVarietyDialog.ui.h:19 msgid "_Remove..." msgstr "_Supprimer…" #: ../data/ui/PreferencesVarietyDialog.ui.h:20 msgid "Remove selected image sources" msgstr "Supprimer les sources d'images sélectionnées" #: ../data/ui/PreferencesVarietyDialog.ui.h:21 msgid "_Use" msgstr "_Utiliser" #: ../data/ui/PreferencesVarietyDialog.ui.h:22 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.h:23 msgid "Download a wallpaper every " msgstr "Télécharger un fond d'écran toutes les " #: ../data/ui/PreferencesVarietyDialog.ui.h:24 msgid "Minimum interval is one minute" msgstr "L'intervalle minimum est une minute" #: ../data/ui/PreferencesVarietyDialog.ui.h:25 msgid "to " msgstr "vers " #: ../data/ui/PreferencesVarietyDialog.ui.h:26 msgid "Actual download folder " msgstr "Dossier de téléchargement actuel " #: ../data/ui/PreferencesVarietyDialog.ui.h:27 msgid "" "Caution: do NOT use this option if you use a custom download folder with " "valuable files in it. Variety will maintain the limit regardless of what is " "in the download folder." msgstr "" "Attention : N'utilisez PAS cette option si vous utilisez un dossier de " "téléchargement personnalisé contenant des fichiers importants. Variety " "respectera la limite quel que soit le contenu du dossier." #: ../data/ui/PreferencesVarietyDialog.ui.h:28 msgid "Limit download folder to " msgstr "Limiter le dossier de téléchargement à " #: ../data/ui/PreferencesVarietyDialog.ui.h:29 msgid "Minimum size is 50 MB" msgstr "La taille minimale est de 50 Mo" #: ../data/ui/PreferencesVarietyDialog.ui.h:30 msgid "MB by deleting oldest files when necessary" msgstr "Mo en supprimant les fichiers les plus vieux si nécessaire" #: ../data/ui/PreferencesVarietyDialog.ui.h:31 msgid "Favorites" msgstr "Favoris" #: ../data/ui/PreferencesVarietyDialog.ui.h:32 msgid "Copy favorite wallpapers to " msgstr "Copier les fonds d'écran favoris vers " #: ../data/ui/PreferencesVarietyDialog.ui.h:33 msgid "Filters" msgstr "Filtres" #: ../data/ui/PreferencesVarietyDialog.ui.h:34 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.h:35 msgid "Quotes" msgstr "Citations" #: ../data/ui/PreferencesVarietyDialog.ui.h:36 msgid "Show random wise quotes on the desktop" msgstr "Afficher aléatoirement de sages citations sur le bureau" #: ../data/ui/PreferencesVarietyDialog.ui.h:37 msgid "Text color: " msgstr "Couleur du texte : " #: ../data/ui/PreferencesVarietyDialog.ui.h:38 msgid "Text font: " msgstr "Police du texte : " #: ../data/ui/PreferencesVarietyDialog.ui.h:39 msgid "Backdrop color: " msgstr "Couleur du fond : " #: ../data/ui/PreferencesVarietyDialog.ui.h:40 msgid "Backdrop opacity: " msgstr "Opacité du fond : " #: ../data/ui/PreferencesVarietyDialog.ui.h:41 msgid " Transparent" msgstr " Transparent" #: ../data/ui/PreferencesVarietyDialog.ui.h:42 msgid "Opaque" msgstr "Opaque" #: ../data/ui/PreferencesVarietyDialog.ui.h:43 msgid "Draw a text shadow" msgstr "Dessiner une ombre pour le texte" #: ../data/ui/PreferencesVarietyDialog.ui.h:44 msgid "Appearance" msgstr "Apparence" #: ../data/ui/PreferencesVarietyDialog.ui.h:45 msgid "Quotes area width: " msgstr "Largeur de la surface des citations : " #: ../data/ui/PreferencesVarietyDialog.ui.h:46 msgid "Narrow " msgstr "Étroite " #: ../data/ui/PreferencesVarietyDialog.ui.h:47 msgid "Wide" msgstr "Large" #: ../data/ui/PreferencesVarietyDialog.ui.h:48 msgid "Horizontal position: " msgstr "Position horizontale : " #: ../data/ui/PreferencesVarietyDialog.ui.h:49 msgid "Left " msgstr "Gauche " #: ../data/ui/PreferencesVarietyDialog.ui.h:50 ../variety/ThumbsManager.py:44 msgid "Right" msgstr "Droite" #: ../data/ui/PreferencesVarietyDialog.ui.h:51 msgid "Vertical position: " msgstr "Position verticale : " #: ../data/ui/PreferencesVarietyDialog.ui.h:52 msgid "Top " msgstr "Haut " #: ../data/ui/PreferencesVarietyDialog.ui.h:53 ../variety/ThumbsManager.py:41 msgid "Bottom" msgstr "Bas" #: ../data/ui/PreferencesVarietyDialog.ui.h:54 msgid "Placement" msgstr "Positionnement" #: ../data/ui/PreferencesVarietyDialog.ui.h:55 msgid "Show quotes from these sources: " msgstr "Afficher des citations de ces sources : " #: ../data/ui/PreferencesVarietyDialog.ui.h:56 msgid "" "More " "plugins" msgstr "" "Plus de " "greffons" #: ../data/ui/PreferencesVarietyDialog.ui.h:57 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.h:59 msgid "Example: funny, inspirational" msgstr "Exemple : drôle, inspirant" #: ../data/ui/PreferencesVarietyDialog.ui.h:60 msgid "Example: Albert Einstein, Voltaire" msgstr "Exemple : Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui.h:61 msgid "Authors: " msgstr "Auteurs : " #: ../data/ui/PreferencesVarietyDialog.ui.h:62 msgid "Sources and filtering" msgstr "Sources et filtrage" #: ../data/ui/PreferencesVarietyDialog.ui.h:63 msgid "Change quote every " msgstr "Changer la citation toutes les " #: ../data/ui/PreferencesVarietyDialog.ui.h:64 msgid "Minimum interval is 10 seconds" msgstr "L'intervalle minimal est de 10 secondes" #: ../data/ui/PreferencesVarietyDialog.ui.h:65 msgid "Regular change" msgstr "Changement régulier" #: ../data/ui/PreferencesVarietyDialog.ui.h:66 msgid "Clock" msgstr "Horloge" #: ../data/ui/PreferencesVarietyDialog.ui.h:67 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.h:68 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.h:69 msgid "Clock font: " msgstr "Police de l'horloge : " #: ../data/ui/PreferencesVarietyDialog.ui.h:70 msgid "Date font: " msgstr "Police de la date : " #: ../data/ui/PreferencesVarietyDialog.ui.h:71 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.h:72 msgid "Effects" msgstr "Effets" #: ../data/ui/PreferencesVarietyDialog.ui.h:73 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:74 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:75 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:76 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:77 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:78 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:79 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:80 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:81 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:82 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:83 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:84 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:85 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:86 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:87 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:88 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:89 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:90 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:91 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:92 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:93 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:94 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:95 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:96 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:97 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:98 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:99 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:100 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:101 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:102 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:103 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:104 msgid "VRTY.ORG" msgstr "VRTY.ORG" #: ../data/ui/PreferencesVarietyDialog.ui.h:106 msgid "VRTY.ORG is in beta and will take some time to mature" msgstr "" "VRTY.ORG est en bêta et aura besoin d'un certain temps pour arriver à terme" #: ../data/ui/PreferencesVarietyDialog.ui.h:107 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to add new image sources to Variety, and to follow other users' favorites. " "It is fueled by the favorite images of all participating users." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:108 msgid "" "Could not create user - no connection to VRTY.ORG. We will try again later." msgstr "" "Impossible de créer l'utilisateur, aucune connexion à VRTY.ORG. Nous " "réessaierons plus tard." #: ../data/ui/PreferencesVarietyDialog.ui.h:110 msgid "" "Registration enables cool features like synchronization of favorite images " "and sources between computers and personalized recommendations." msgstr "" "L'inscription permet des fonctionnalités intéressantes comme la " "synchronisation de vos images favorites et de vos sources entre vos " "ordinateurs et les recommandations personnalisées." #: ../data/ui/PreferencesVarietyDialog.ui.h:112 msgid "Synchronize favorite images between computers" msgstr "Synchroniser les images favorites entre les ordinateurs" #: ../data/ui/PreferencesVarietyDialog.ui.h:113 msgid "Requires VRTY.ORG enabled and logged in." msgstr "Nécessite l'activation et la connexion à VRTY.ORG." #: ../data/ui/PreferencesVarietyDialog.ui.h:114 msgid "" "Your favorite images from other computers will be automatically downloaded " "to this computer. You need to be logged in with the same VRTY.ORG user " "everywhere. Sync will not delete any images." msgstr "" "Vos images favorites sur d'autres ordinateurs seront automatiquement " "téléchargées sur cet ordinateur. Vous devez être connecté(e) au même compte " "VRTY.ORG sur chaque ordinateur. La synchronisation ne supprime aucune image." #: ../data/ui/PreferencesVarietyDialog.ui.h:115 msgid "Privacy policy" msgstr "Politique de confidentialité" #: ../data/ui/PreferencesVarietyDialog.ui.h:116 msgid "" "Variety sends data only for images it downloaded, never for images you " "already had in your local folders that might be private, and Sync does not " "work for such images. Collected data is not shared with third parties, " "unless you opt-in to make your profile public. Read more details about the " "service and the privacy policy here." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:117 msgid "Usage statistics" msgstr "Statistiques d'utilisation" #: ../data/ui/PreferencesVarietyDialog.ui.h:118 msgid "Help make Variety better by sending anonymous usage statistics" msgstr "" "Aidez à améliorer Variety en envoyant des statistiques anonymes d'utilisation" #: ../data/ui/PreferencesVarietyDialog.ui.h:119 msgid "" "These stats help us improve Variety by understanding how users interact with " "it. They also include general info about your OS version and monitor setup. " "Collected data is not shared with anyone." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:120 msgid "Sync and social" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:121 msgid "Fetch folder" msgstr "Dossier de téléchargement" #: ../data/ui/PreferencesVarietyDialog.ui.h:122 msgid "Save manually downloaded wallpapers to " msgstr "Sauvegarder les fonds d'écran téléchargés manuellement vers " #: ../data/ui/PreferencesVarietyDialog.ui.h:123 msgid "Drag and drop" msgstr "Glisser-déposer" #: ../data/ui/PreferencesVarietyDialog.ui.h:124 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.h:126 msgid "Clipboard monitoring" msgstr "Gestionnaire de presse-papiers" #: ../data/ui/PreferencesVarietyDialog.ui.h:127 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.h:128 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.h:129 msgid "Manual downloading" msgstr "Téléchargement manuel" #: ../data/ui/PreferencesVarietyDialog.ui.h:130 msgid "When possible use images that:" msgstr "Quand cela est possible, utiliser des images qui :" #: ../data/ui/PreferencesVarietyDialog.ui.h:131 ../variety/ThumbsManager.py:98 msgid "Size" msgstr "Taille" #: ../data/ui/PreferencesVarietyDialog.ui.h:132 msgid "Have landscape orientation" msgstr "Ont une orientation paysage" #: ../data/ui/PreferencesVarietyDialog.ui.h:133 msgid "Are big at least " msgstr "Ont une taille d'au moins " #: ../data/ui/PreferencesVarietyDialog.ui.h:134 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui.h:135 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui.h:136 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui.h:138 #, no-c-format msgid "% of the screen resolution" msgstr "% de la résolution de l'écran" #: ../data/ui/PreferencesVarietyDialog.ui.h:139 msgid "Color" msgstr "Couleur" #: ../data/ui/PreferencesVarietyDialog.ui.h:140 msgid "Are dark or light:" msgstr "Sont sombres ou claires :" #: ../data/ui/PreferencesVarietyDialog.ui.h:141 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Sombres" #: ../data/ui/PreferencesVarietyDialog.ui.h:142 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Claires" #: ../data/ui/PreferencesVarietyDialog.ui.h:143 msgid "Contain this color: " msgstr "Contiennent cette couleur : " #: ../data/ui/PreferencesVarietyDialog.ui.h:144 msgid "(Takes effect after some initial searching)" msgstr "(activé après quelques recherches préliminaires)" #: ../data/ui/PreferencesVarietyDialog.ui.h:145 msgid "Rating" msgstr "Évaluation" #: ../data/ui/PreferencesVarietyDialog.ui.h:146 msgid "Have EXIF rating at least " msgstr "Ont une note EXIF d'au moins " #: ../data/ui/PreferencesVarietyDialog.ui.h:147 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui.h:148 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui.h:149 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui.h:150 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui.h:151 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui.h:152 msgid "Color and size" msgstr "Couleur et taille" #: ../data/ui/PreferencesVarietyDialog.ui.h:153 msgid "Indicator Icon" msgstr "Icône de l'indicateur" #: ../data/ui/PreferencesVarietyDialog.ui.h:154 msgid "Indicator icon:" msgstr "Icône de l'indicateur :" #: ../data/ui/PreferencesVarietyDialog.ui.h:155 msgctxt "Icon option" msgid "Light" msgstr "Claire" #: ../data/ui/PreferencesVarietyDialog.ui.h:156 msgctxt "Icon option" msgid "Dark" msgstr "Sombre" #: ../data/ui/PreferencesVarietyDialog.ui.h:157 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Utiliser le fond d'écran actuel" #: ../data/ui/PreferencesVarietyDialog.ui.h:158 msgctxt "Icon option" msgid "Custom image..." msgstr "Image personnalisée…" #: ../data/ui/PreferencesVarietyDialog.ui.h:159 msgctxt "Icon option" msgid "None" msgstr "Aucune" #: ../data/ui/PreferencesVarietyDialog.ui.h:160 msgid "Select an icon" msgstr "Sélectionner une icône" #: ../data/ui/PreferencesVarietyDialog.ui.h:161 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.h:162 msgid "Favorites Operations" msgstr "Opérations sur Favoris" #: ../data/ui/PreferencesVarietyDialog.ui.h:163 msgid "Favorites operations to show in main menu:" msgstr "Opérations sur Favoris à proposer dans le menu principal :" #: ../data/ui/PreferencesVarietyDialog.ui.h:164 msgid "Copy to Favorites" msgstr "Copier vers Favoris" #: ../data/ui/PreferencesVarietyDialog.ui.h:166 msgid "Both Copy and Move" msgstr "Copier et Déplacer" #: ../data/ui/PreferencesVarietyDialog.ui.h:167 msgid "Depends on folder..." msgstr "Selon le dossier…" #: ../data/ui/PreferencesVarietyDialog.ui.h:170 msgid "Display dialog to customize the Facebook post before publishing" msgstr "" "Afficher une fenêtre de dialogue afin de personnaliser la publication " "Facebook avant de publier" #: ../data/ui/PreferencesVarietyDialog.ui.h:171 msgid "Login Screen Support" msgstr "Prise en charge de l'écran de connexion" #: ../data/ui/PreferencesVarietyDialog.ui.h:172 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.h:173 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.h:174 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.h:175 msgid "Reset to default" msgstr "Rétablir les valeurs par défaut" #: ../data/ui/PreferencesVarietyDialog.ui.h:176 msgid "Still doesn't work?" msgstr "Cela ne fonctionne toujours pas ?" #: ../data/ui/PreferencesVarietyDialog.ui.h:177 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.h:178 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.h:179 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.h:180 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.h:181 msgid "Customize" msgstr "Personnaliser" #: ../data/ui/PreferencesVarietyDialog.ui.h:182 msgid "Tips and tricks" msgstr "Trucs et astuces" #: ../data/ui/PreferencesVarietyDialog.ui.h:183 msgid "Recent changes" msgstr "Modifications récentes" #: ../data/ui/PreferencesVarietyDialog.ui.h:184 msgid "Visit website" msgstr "Visiter le site Web" #: ../data/ui/PreferencesVarietyDialog.ui.h:185 msgid "Report a bug or request a feature" msgstr "Signaler un bogue ou demander une fonctionnalité" #: ../data/ui/PreferencesVarietyDialog.ui.h:186 msgid "Send feedback" msgstr "Envoyer des commentaires" #: ../data/ui/PreferencesVarietyDialog.ui.h:187 msgid "Donate to Variety" msgstr "Faire un don à Variety" #: ../data/ui/PreferencesVarietyDialog.ui.h:188 msgid "Donate via PayPal" msgstr "Faire un don via PayPal" #: ../data/ui/PreferencesVarietyDialog.ui.h:189 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.h:193 msgid "" "For Bitcoin and other payment methods please go to Variety's website." msgstr "" "Pour utiliser Bitcoin et d'autres modes de paiement, veuillez visiter le " "site Web de Variety." #: ../data/ui/PreferencesVarietyDialog.ui.h:194 msgid "Donate" msgstr "Faire un don" #: ../variety/FacebookHelper.py:116 msgid "Authorization successful" msgstr "Autorisation réussie" #: ../variety/FacebookHelper.py:116 msgid "Publishing..." msgstr "Publication en cours..." #: ../variety/FacebookHelper.py:121 msgid "Authorization failed" msgstr "Autorisation échouée" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Haut" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Gauche" #: ../variety/ThumbsManager.py:94 msgid "Position" msgstr "Position" #: ../variety/ThumbsManager.py:109 msgid "Show Containing Folder" msgstr "Montrer le dossier parent" #: ../variety/ThumbsManager.py:136 ../variety/indicator.py:156 msgid "Set EXIF Rating" msgstr "Donner une note EXIF" #: ../variety/ThumbsManager.py:160 ../variety/indicator.py:87 msgid "Delete to _Trash" msgstr "Supprimer vers la _Corbeille" #: ../variety/ThumbsManager.py:167 ../variety/indicator.py:131 msgid "Where is it from?" msgstr "D'où est-il ?" #: ../variety/ThumbsManager.py:178 msgid "Close" msgstr "Fermer" #: ../variety/ThumbsManager.py:198 msgid "Could not set EXIF rating" msgstr "Impossible de donner une note EXIF" #: ../variety/ThumbsManager.py:217 msgid "Unrated" msgstr "Non évalué" #: ../variety/ThumbsManager.py:224 msgid "Rejected" msgstr "Refusé" #: ../variety/ThumbsManager.py:324 msgid "Variety History" msgstr "Historique de Variety" #: ../variety/ThumbsManager.py:326 msgid "Variety Recent Downloads" msgstr "Téléchargements récents de Variety" #: ../variety/ThumbsManager.py:328 msgid "Variety Images" msgstr "Images de Variety" #: ../data/ui/AddWallbaseDialog.ui.h:1 msgid "Variety - add Wallbase.cc image source" msgstr "Variety - ajouter Wallbase.cc comme source d'images" #: ../data/ui/AddWallbaseDialog.ui.h:2 msgid "Wallbase.cc" msgstr "Wallbase.cc" #: ../data/ui/AddWallbaseDialog.ui.h:3 msgid "" "Wallbase.cc is permanently down. Use Wallhaven.cc instead. Support for " "Wallbase.cc will be dropped completely in a future release, please remove or " "update your existing Wallbase sources." msgstr "" "Wallbase.cc est fermé pour de bon. Utilisez plutôt Wallhaven.cc. La prise en " "charge de Wallbase.cc sera abandonnée complètement dans une version future. " "Merci de supprimer ou mettre à jour vos sources Wallbase." #: ../data/ui/AddWallbaseDialog.ui.h:4 msgid "" "Wallbase.cc provides a variety of image " "search options. Below you can specify keywords to search for, or visit Wallbase.cc, setup your search criteria " "there, ensure you like the results, and paste the full Wallbase URL in the " "box.\n" "\n" "If you specify keywords, the most liked safe-for-work images that match any " "of the keywords will be used. \n" "\n" "If you specify a Wallbase 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." msgstr "" "Wallbase.cc fournit de nombreuses options " "de recherche d'images. Vous pouvez définir les mots-clés à rechercher ci-" "dessous ou visiter Wallbase.cc, y " "configurer vos critères de recherche, vous assurer que les résultats vous " "conviennent et copier l'URL Wallbase complète dans la zone de saisie.\n" "\n" "Si vous spécifiez des mots-clés, les images politiquement correctes les plus " "appréciées qui répondent à l'un des mots-clés seront utilisées. \n" "\n" "Si vous spécifiez une URL Wallbase, choisissez attentivement les critères de " "recherche. Variety recherche régulièrement des images, mais utilise " "uniquement des résultats parmi les premières centaines. Aléatoire ou Date " "signifiera que cette source d'images aura une « durée de vie » plus longue " "avant d'être épuisée. Favoris fournira de meilleures images et Pertinence " "fournira des résultats plus précis lors des recherches à base de phrases ou " "de couleurs." #: ../data/ui/FacebookPublishDialog.ui.h:1 msgid "Variety - Publish to Facebook" msgstr "Variety - Publier sur Facebook" #: ../data/ui/FacebookPublishDialog.ui.h:2 ../variety/indicator.py:149 #: ../variety/indicator.py:223 msgid "Share on Facebook" msgstr "Partager sur Facebook" #: ../data/ui/FacebookPublishDialog.ui.h:3 msgid "" "Publish a link to the current wallpaper on Facebook. Include this text along " "with the link (or just leave empty):" msgstr "" "Publier un lien vers le fond d'écran actuel sur Facebook. Inclure ce texte " "avec le lien (ou laisser vide) :" #: ../data/ui/FacebookPublishDialog.ui.h:4 msgid "Use current quote" msgstr "Utiliser la citation actuelle" #: ../data/ui/SmartRegisterDialog.ui.h:1 msgid "Variety - VRTY.ORG registration" msgstr "Variety - Inscription à VRTY.ORG" #: ../data/ui/SmartRegisterDialog.ui.h:2 msgid "Would you like to register?" msgstr "Souhaitez-vous vous inscrire ?" #: ../data/ui/SmartRegisterDialog.ui.h:3 msgid "" "You may participate in VRTY.ORG " "anonymously, but registration enables some very nice features, such as synchronization of favorites between computers and " "personalized recommendations. It also ensures " "you will not lose your profile and favorite wallpapers if you reinstall your " "OS." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:4 msgid "Registration is very easy and does not require any personal data." msgstr "" "L'inscription est très simple et ne nécessite aucune information personnelle." #: ../data/ui/SmartRegisterDialog.ui.h:5 msgid "" "If you choose to participate anonymously, you can register later from the " "\"Sync and social\" page in Preferences." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:6 msgid "" "Oops, we could not connect to VRTY.ORG. Server might be down. Please wait a " "couple of minutes and try again or choose \"Participate anonymously\" and register later " "from the \"Sync and social\" page in " "Preferences." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:7 msgid "" "Please continue the registration and follow the instructions in the browser " "tab we opened." msgstr "" "Veuillez poursuivre l'inscription et suivre les instructions dans l'onglet " "que nous avons ouvert dans votre navigateur Internet." #: ../data/ui/SmartRegisterDialog.ui.h:8 msgid "I will participate anonymously" msgstr "Je participerai de façon anonyme" #: ../data/ui/SmartRegisterDialog.ui.h:9 msgid "I'm registered, let me login" msgstr "Je suis déjà inscrit(e), je veux me connecter" #: ../data/ui/SmartRegisterDialog.ui.h:10 msgid "Register here" msgstr "Inscrivez-vous ici" #: ../variety.desktop.in.h:1 msgid "Variety" msgstr "Variety" #: ../variety.desktop.in.h:2 msgid "Variety Wallpaper Changer" msgstr "Changeur de fonds d'écran Variety" #: ../variety.desktop.in.h:3 msgid "Next" msgstr "Suivant" #: ../variety.desktop.in.h:4 msgid "Previous" msgstr "Précédent" #: ../variety.desktop.in.h:5 msgid "Pause / Resume" msgstr "Pause / Reprendre" #: ../variety.desktop.in.h:6 msgid "History" msgstr "Historique" #: ../variety.desktop.in.h:7 msgid "Preferences" msgstr "Préférences" #: ../data/plugins/quotes/LocalFilesSource.py:34 msgid "" "Displays quotes, defined in local text files.\n" "Put your own txt files in: ~/.config/variety/pluginconfig/quotes/.\n" "The file format is:\n" "\n" "quote -- author\n" ".\n" "second quote -- another author\n" ".\n" "etc...\n" "\n" "Example: http://rvelthuis.de/zips/quotes.txt" msgstr "" "Affiche les citations, définies dans les fichiers texte locaux.\n" "Placez vos propres fichiers txt dans : " "~/.config/variety/pluginconfig/quotes/.\n" "Le format du fichier est :\n" "\n" "citation -- auteur\n" ".\n" "seconde citation -- un autre auteur\n" ".\n" "etc…\n" "\n" "Exemple : http://rvelthuis.de/zips/quotes.txt" #: ../variety/indicator.py:49 ../variety/indicator.py:96 #: ../variety/indicator.py:166 msgid "_Next" msgstr "_Suivant" #: ../variety/indicator.py:54 ../variety/indicator.py:101 #: ../variety/indicator.py:171 msgid "_Previous" msgstr "_Précédent" #: ../variety/indicator.py:61 msgid "Current desktop wallpaper" msgstr "Fond d'écran actuel du bureau" #: ../variety/indicator.py:65 msgid "Show origin" msgstr "Afficher l'origine" #: ../variety/indicator.py:106 ../variety/indicator.py:176 msgid "_Next, skipping forward history" msgstr "" #: ../variety/indicator.py:114 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:124 msgid "_Image" msgstr "_Image" #: ../variety/indicator.py:135 msgid "Show without effects" msgstr "Afficher sans effets" #: ../variety/indicator.py:143 msgid "Google Image Search" msgstr "Recherche d'images Google" #: ../variety/indicator.py:196 msgid "View Favorites..." msgstr "Voir les Favoris..." #: ../variety/indicator.py:203 msgid "Copy to Clipboard" msgstr "Copier dans le presse-papier" #: ../variety/indicator.py:213 msgid "Google Quote" msgstr "Chercher la citation sur Google" #: ../variety/indicator.py:218 msgid "Google Author" msgstr "Chercher l'auteur sur Google" #: ../variety/indicator.py:230 ../variety/indicator.py:284 msgid "Preferences..." msgstr "Préférences…" #: ../variety/indicator.py:238 msgid "Turn off" msgstr "Désactiver" #: ../variety/indicator.py:244 msgid "_Quote" msgstr "_Citation" #: ../variety/indicator.py:251 msgid "_History" msgstr "_Historique" #: ../variety/indicator.py:257 msgid "_Wallpaper Selector" msgstr "_Sélecteur de fond d'écran" #: ../variety/indicator.py:263 msgid "Recent _Downloads" msgstr "_Téléchargements récents" #: ../variety/indicator.py:278 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:288 msgid "About" msgstr "À propos" #: ../variety/indicator.py:292 msgid "Quit" msgstr "Quitter" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:1 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Copier vers Favoris vs Déplacer vers Favoris" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:2 msgid "Reset to Default" msgstr "Restaurer les valeurs par défaut" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:3 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.h:4 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" #: ../variety/ImageFetcher.py:56 ../variety/ImageFetcher.py:103 msgid "Fetching" msgstr "Récupération" #. too small - delete and do not use #: ../variety/ImageFetcher.py:118 msgid "Image too small, ignoring it" msgstr "Image trop petite, ignorée" #: ../variety/ImageFetcher.py:140 #, python-format msgid "Sorry, got %s error..." msgstr "" #: ../variety/ImageFetcher.py:141 msgid "This means the link is no longer valid" msgstr "" #: ../variety/ImageFetcher.py:144 msgid "Fetch failed for some reason" msgstr "Échec de la récupération pour une raison inconnue" #: ../variety/ImageFetcher.py:145 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/po/uk.po0000644000000000000000000032715612655724347011061 0ustar # Ukrainian translation for variety # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the variety package. # Mykola Tkach , 2013. # msgid "" msgstr "" "Project-Id-Version: variety\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-01-29 10:57+0200\n" "PO-Revision-Date: 2015-12-19 05:36+0000\n" "Last-Translator: Микола Ткач \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-02-07 20:28+0000\n" "X-Generator: Launchpad (build 17908)\n" #: ../data/plugins/quotes/GoodreadsSource.py:49 msgid "Fetches quotes from Goodreads.com" msgstr "Вибирає цитати з Goodreads.com" #: ../data/ui/LoginOrRegisterDialog.ui.h:1 msgid "Login to VRTY.ORG" msgstr "Увійти на VRTY.ORG" #: ../data/ui/LoginOrRegisterDialog.ui.h:2 msgid "Username: " msgstr "Ім’я користувача: " #: ../data/ui/LoginOrRegisterDialog.ui.h:3 msgid "Password: " msgstr "Пароль: " #: ../data/ui/LoginOrRegisterDialog.ui.h:4 msgid "No account? Register here" msgstr "Немає облікового запису? Зареєструйтеся тут" #: ../data/ui/LoginOrRegisterDialog.ui.h:5 msgid "Forgot your password?" msgstr "Забули свій пароль?" #: ../data/ui/LoginOrRegisterDialog.ui.h:6 msgid "" "Tip: You can also login to VRTY.ORG in a " "browser and click the link \"Trigger Variety " "login\" in your profile." msgstr "" "Порада: Ви також можете увійти на VRTY.ORG " "у переглядачі тенет й натиснути посилання \"Trigger " "Variety login\" у своєму профілі." #: ../data/ui/LoginOrRegisterDialog.ui.h:7 msgid "Login" msgstr "Увійти" #: ../variety/LoginOrRegisterDialog.py:80 #, python-format msgid "Oops, server returned error (%s)" msgstr "На жаль, сервер повернув помилку (%s)" #: ../variety/LoginOrRegisterDialog.py:85 msgid "Could not connect to server" msgstr "Не вдалося з'єднатися з сервером" #: ../variety/AddWallhavenDialog.py:38 ../variety/AddWallbaseDialog.py:38 #: ../variety/AddFlickrDialog.py:138 msgid "No images found" msgstr "Зображень не знайдено" #: ../data/ui/AddPanoramioDialog.ui.h:1 msgid "Variety - add Panoramio image source" msgstr "Variety — додавання джерела зображень Panoramio" #. (_("Wallbase.cc"), self.on_add_wallbase_clicked), #: ../data/ui/AddPanoramioDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:388 msgid "Panoramio" msgstr "Panoramio" #: ../data/ui/AddPanoramioDialog.ui.h:3 msgid "Please zoom over your area of interest." msgstr "Будь ласка, збільшіть масштаб ділянки ваших інтересів" #: ../variety/FolderChooser.py:65 msgid "Choose a folder" msgstr "Оберіть теку" #: ../variety/FolderChooser.py:66 ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Cancel" msgstr "Скасувати" #: ../variety/FolderChooser.py:66 msgid "OK" msgstr "Так" #: ../data/ui/AddWallhavenDialog.ui.h:1 msgid "Variety - add Wallhaven.cc image source" msgstr "Variety - додати джерело зображень Wallhaven.cc" #: ../data/ui/AddWallhavenDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:386 msgid "Wallhaven.cc" msgstr "Wallhaven.cc" #: ../data/ui/AddWallhavenDialog.ui.h:3 msgid "" "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." msgstr "" "Wallhaven.cc забезпечує різноманіття " "параметрів пошуку шпалер. Нижче Ви можете вказати ключові слова для пошуку, " "або ж відвідати Wallhaven.cc, налаштуйте " "власні критерії пошуку зображень, переконайтеся, що Вам до вподоби " "результати, та вставте посилання Wallhaven у поле.\n" "\n" "Якщо Ви вирішите вказати ключові слова, з них використовуватимуться лише " "найуподобаніші, безпечні для роботи, зображення, ті які відповідають усім " "ключовим словам.\n" "\n" "Якщо Ви вкажете посилання Wallhaven, обирайте критерії пошуку з головою - " "Variety реґулярно вимагає зображення, але використовує лише шпалери з " "кількох сотень тих, які повернулися. Критерій пошуку \"Випадкове\" або " "\"Пошук за датою\" означатиме, що така світлина \"проживе\" довше, ніж решта " "зображень. Під критерієм \"Улюблені\" мається на увазі надання кращих " "зображень, власне завдяки проґрамі Relevance, що дозволить знайти кращі " "збіги, шукаючи за кольорами чи фразами." #: ../data/ui/AddWallhavenDialog.ui.h:8 ../data/ui/AddWallbaseDialog.ui.h:9 msgid "Enter keywords or paste URL here: " msgstr "Введіть ключові слова або посилання: " #: ../data/ui/AddWallhavenDialog.ui.h:9 ../data/ui/AddFlickrDialog.ui.h:16 #: ../data/ui/AddWallbaseDialog.ui.h:10 msgid "Just a moment to check this search" msgstr "Хвилинку, перевірка пошукового запиту" #: ../data/ui/AddWallhavenDialog.ui.h:10 ../data/ui/AddFlickrDialog.ui.h:17 #: ../data/ui/AddRedditDialog.ui.h:9 ../data/ui/AddMediaRssDialog.ui.h:6 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:10 #: ../data/ui/AddWallbaseDialog.ui.h:11 msgid " " msgstr " " #: ../variety/QuotesEngine.py:232 msgid "No quote plugins" msgstr "Додатки для цитат відсутні" #: ../variety/QuotesEngine.py:232 msgid "There are no quote plugins installed" msgstr "Не встановлено жодного додатку для отримання цитат" #: ../variety/QuotesEngine.py:238 msgid "No suitable quote plugins" msgstr "Немає відповідного додатку для цитат" #: ../variety/QuotesEngine.py:239 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "" "У Вас відсутні додатки з підтримкою пошуку по ключових словах чи по авторові" #: ../variety/QuotesEngine.py:251 msgid "Could not fetch quotes" msgstr "Не можу отримати цитати" #: ../variety/QuotesEngine.py:252 msgid "Quotes services may be down, we will continue trying" msgstr "" "Можливо сервіс цитат недоступний зараз, ми продовжимо спроби під’єднатися" #: ../variety/QuotesEngine.py:255 msgid "Could not find quotes" msgstr "Не вдалося знайти цитати." #: ../variety/QuotesEngine.py:256 msgid "Maybe you are searching for something very obscure?" msgstr "Можливо Ви шукаєте щось вельми темне?" #: ../variety/Texts.py:20 msgid "Keep original" msgstr "Зберегти оригінал" #: ../variety/Texts.py:21 msgid "Grayscale" msgstr "Тони сірого" #: ../variety/Texts.py:22 msgid "Heavy blur" msgstr "Жорстке розмиття" #: ../variety/Texts.py:23 msgid "Soft blur" msgstr "М’яке розмиття" #: ../variety/Texts.py:24 msgid "Oil painting" msgstr "Малювання олійною фарбою" #: ../variety/Texts.py:25 msgid "Pencil sketch" 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:37 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" "Останні вибрані зображення інших користувачів Variety. [Можуть бути " "неприйнятними (NSFW )]" #: ../variety/Texts.py:38 msgid "Random wallpapers from Desktoppr.co" msgstr "Випадкові шпалери з Desktoppr.co" #: ../variety/Texts.py:39 msgid "NASA's Astronomy Picture of the Day" msgstr "NASA: астрономічне фото дня" #: ../variety/Texts.py:41 msgid "World Sunlight Map - live wallpaper from Die.net" msgstr "Мапа освітленності Землі Солнцем — живі шпалери з Die.net" #: ../variety/Texts.py:42 msgid "Bing Photo of the Day" msgstr "Фото дня від Bing" #: ../variety/Texts.py:43 msgid "High-resolution photos from Unsplash.com" msgstr "Фото високої роздільности із Unsplash.com" #: ../variety/Texts.py:47 msgid "" "If you use KDE, you need to perform some actions before Variety will work. " "Please read here: http://peterlevi.com/variety/2014/05/variety-and-kde/" msgstr "" "Якщо Ви використовуєте KDE, Вам потрібно виконати деякі дії перед тим як " "Variety запрацює. Будь ласка, прочитайте тут: " "http://peterlevi.com/variety/2014/05/variety-and-kde/" #: ../variety/Texts.py:48 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" "Ви можете змінювати шпалери прокручуванням коліща миші на індикаторі." #: ../variety/Texts.py:49 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 " "~/.config/variety/scripts. There are examples there for various desktop " "environments." msgstr "" "Якщо Ви бажаєте кожного разу при змінюванні шпалер виконувати свої команди " "або користуєтеся альтернативним оточенням стільниці, будь ласка, " "відредагуйте скрипти у ~/.config/variety/scripts. Приклади для різних " "робочих середовищ поміщені теж там." #: ../variety/Texts.py:50 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:51 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:52 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:53 msgid "" "Adding your own custom filters is quite easy: open " "~/.config/variety/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 "" "Додати свої власні фільтри досить просто: відкрийте " "~/.config/variety/variety.conf у текстовому редакторі й скористайтеся " "існуючими, як прикладом. Будь-який фільтр — усього лише набір опцій для " "команди перетворення з ImageMagick." #: ../variety/Texts.py:54 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:55 msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of ~/.config/variety/scripts/set_wallpaper." msgstr "" "Для вмикання сповіщень при зміні шпалер розкоментуйте два останні рядки у " "файлі ~/.config/variety/scripts/set_wallpaper." #: ../variety/Texts.py:56 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:57 msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "~/.config/variety/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 "" "Коли Ви додаєте цитати у Вибрані, вони типово зберігаються у " "~/.config/variety/favorite_quotes.txt. Цей файл сумісний з локальним " "джерелом цитат Variety. Якщо бажаєте його використовувати, скопіюйте у " "~/.config/variety/pluginconfig/quotes/ та залучіть локальне джерело цитат. " "Цей файл також сумісний з Unix-утилітою fortune." #: ../variety/PreferencesVarietyDialog.py:259 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:382 #: ../variety/PreferencesVarietyDialog.py:551 #: ../data/ui/PreferencesVarietyDialog.ui.h:11 msgid "Images" msgstr "Зображення" #: ../variety/PreferencesVarietyDialog.py:383 msgid "Folders" msgstr "Теки" #: ../variety/PreferencesVarietyDialog.py:385 #: ../data/ui/AddFlickrDialog.ui.h:2 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:389 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:2 msgid "Wallpapers.net" msgstr "Wallpapers.net" #: ../variety/PreferencesVarietyDialog.py:390 #: ../data/ui/AddRedditDialog.ui.h:2 msgid "Reddit" msgstr "Reddit" #: ../variety/PreferencesVarietyDialog.py:391 #: ../data/ui/AddMediaRssDialog.ui.h:2 msgid "Media RSS" msgstr "Медійні RSS" #: ../variety/PreferencesVarietyDialog.py:416 msgid "Remove the source, keep the files" msgstr "Вилучити джерело, зберегти файли" #: ../variety/PreferencesVarietyDialog.py:417 msgid "Remove the sources, keep the files" msgstr "Вилучити джерела, зберегти файли" #: ../variety/PreferencesVarietyDialog.py:424 msgid "Remove the source and delete the downloaded files" msgstr "Вилучити джерело й завантажені файли" #: ../variety/PreferencesVarietyDialog.py:425 msgid "Remove the sources and delete the downloaded files" msgstr "Вилучити джерела й завантажені файли" #: ../variety/PreferencesVarietyDialog.py:458 msgid "World Sunlight Map enabled" msgstr "Карту сонячного світла на планеті увімкнено" #: ../variety/PreferencesVarietyDialog.py:459 msgid "" "Using the World Sunlight Map requires both downloading and changing enabled " "at intervals of 30 minutes or less. Settings were adjusted automatically." msgstr "" "Використання карти сонячного світла потребує одночасного увімкнення " "параметрів автоматичного стягування та оновлення не рідше ніж раз на 30-ть " "хвилин. Параметри будуть скориговані автоматично." #: ../variety/PreferencesVarietyDialog.py:544 msgid "Add Images" msgstr "Додати зображення" #: ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Add" msgstr "Додати" #: ../variety/PreferencesVarietyDialog.py:567 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Додати теки — додавайте лише кореневі теки, пошук у підтеках рекурсивний" #: ../variety/PreferencesVarietyDialog.py:703 #: ../variety/PreferencesVarietyDialog.py:716 #: ../data/ui/PreferencesVarietyDialog.ui.h:168 msgid "Edit..." msgstr "Змінити…" #: ../variety/PreferencesVarietyDialog.py:710 msgid "View Image" msgstr "Показати зображення" #: ../variety/PreferencesVarietyDialog.py:713 msgid "Open Folder" msgstr "Відкрити теку" #: ../variety/PreferencesVarietyDialog.py:1092 msgid "Recommended images source disabled" msgstr "Рекомендоване джерело зображень вимкнено" #: ../variety/PreferencesVarietyDialog.py:1120 #: ../variety/PreferencesVarietyDialog.py:1139 #: ../variety/PreferencesVarietyDialog.py:1147 msgid "No write permissions" msgstr "Немає прав для запису" #: ../variety/PreferencesVarietyDialog.py:1127 msgid "Limit disabled" msgstr "Обмеження вимкнено" #: ../variety/PreferencesVarietyDialog.py:1128 msgid "" "Changing the download folder automatically turns off the size limit to " "prevent from accidental data loss" msgstr "" "Зміна теки завантаження автоматично вимикає обмеження розміру для " "попередження випадкової втрати даних" #: ../variety/PreferencesVarietyDialog.py:1134 #, python-format msgid "Actual download folder: %s " msgstr "Поточна тека завантаження: %s " #: ../variety/PreferencesVarietyDialog.py:1214 msgid "Could not adjust permissions" msgstr "Не вдалося змінити права" #: ../variety/PreferencesVarietyDialog.py:1215 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Ви можете спробувати вручну виконати команду:\n" "sudo chmod %s \"%s\"" #: ../variety/PreferencesVarietyDialog.py:1247 msgid "Logged in as: " msgstr "Авторизовано як: " #: ../variety/PreferencesVarietyDialog.py:1249 msgid "Anonymous" msgstr "Анонім" #: ../variety/PreferencesVarietyDialog.py:1250 #: ../data/ui/PreferencesVarietyDialog.ui.h:109 msgid "Login or register" msgstr "Увійти або зареєструватися" #: ../variety/PreferencesVarietyDialog.py:1250 msgid "Switch user" msgstr "Змінити користувача" #: ../data/ui/AddFlickrDialog.ui.h:1 msgid "Variety - add Flickr as an image source" msgstr "Variety — додати Flickr як джерело зображень" #: ../data/ui/AddFlickrDialog.ui.h:3 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.h:4 #: ../data/ui/PreferencesVarietyDialog.ui.h:58 msgid "Tags: " msgstr "Теґи: " #: ../data/ui/AddFlickrDialog.ui.h:5 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.h:7 msgid "User: " msgstr "Користувач: " #: ../data/ui/AddFlickrDialog.ui.h:8 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.h:10 msgid "Group: " msgstr "Група: " #: ../data/ui/AddFlickrDialog.ui.h:11 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/group" "s/wallpapers/" msgstr "" "Будь-ласка, вставте адресу URL групи.\n" "Приклад: http://www.flickr.com/group" "s/wallpapers/" #: ../data/ui/AddFlickrDialog.ui.h:13 msgid "Text:" msgstr "Текст:" #: ../data/ui/AddFlickrDialog.ui.h:14 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by " "prepending them with -.\n" "Example: apple -pie" msgstr "" "Вільний пошук по тексту заголовків, описів та теґів фотографій. Параметри, " "що виключаються випереджуються знаком -.\n" "Приклад: яблучний -пиріг" #: ../variety/AddMediaRssDialog.py:40 msgid "" "This does not seem to be a valid Media RSS feed URL or there is no content " "there." msgstr "Це не схоже на URL стрічки RSS або немає доступу" #: ../variety/VarietyWindow.py:630 ../variety/VarietyWindow.py:772 #: ../variety/VarietyWindow.py:2650 msgid "Already in Favorites" msgstr "Завжди у Вибрані" #: ../variety/VarietyWindow.py:634 ../variety/ThumbsManager.py:144 #: ../variety/indicator.py:76 msgid "Copy to _Favorites" msgstr "Копіювати у Вибрані" #: ../variety/VarietyWindow.py:635 ../variety/ThumbsManager.py:151 msgid "Move to _Favorites" msgstr "Перемістити у Вибрані" #. both #: ../variety/VarietyWindow.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:165 ../variety/indicator.py:81 msgid "Move to Favorites" msgstr "Перемістити у Вибрані" #: ../variety/VarietyWindow.py:665 ../variety/ThumbsManager.py:119 msgid "Fetched: Show Origin" msgstr "Обране: Показати оригінали" #: ../variety/VarietyWindow.py:667 ../variety/VarietyWindow.py:762 #: ../variety/ThumbsManager.py:121 #, python-format msgid "View at %s" msgstr "Показати на %s" #: ../variety/VarietyWindow.py:711 msgid "Unknown" msgstr "Невідомо" #: ../variety/VarietyWindow.py:732 #, python-format msgid "Author: %s" msgstr "Автор: %s" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 #: ../variety/indicator.py:120 ../variety/indicator.py:185 msgid "Pause on current" msgstr "Призупинити на поточному" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 msgid "Resume regular changes" msgstr "Відновити регулярні зміни" #: ../variety/VarietyWindow.py:772 ../variety/indicator.py:191 msgid "Save to Favorites" msgstr "Зберегти у Вибраних" #: ../variety/VarietyWindow.py:904 msgid "Filtering too strict?" msgstr "Фільтр занадто суворий?" #: ../variety/VarietyWindow.py:905 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "" "Variety знаходить замало фотографій, які відповідають Вашим критеріям " "фільтрації зображень" #: ../variety/VarietyWindow.py:1377 msgid "Please add more image sources or wait for some downloads" msgstr "" "Будь-ласка, додайте більше джерел зображень або дочекайтеся завантаження" #: ../variety/VarietyWindow.py:1379 msgid "Please add more image sources" msgstr "Будь-ласка, додайте більше джерел зображень" #: ../variety/VarietyWindow.py:1380 msgid "No more wallpapers" msgstr "Зображень більше немає" #: ../variety/VarietyWindow.py:1566 msgid "Current wallpaper is not in the image sources" msgstr "Це зображення відсутнє у джерелі" #: ../variety/VarietyWindow.py:1601 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "Не можу перенести у %s. Можливо не вистачає прав для переміщення." #: ../variety/VarietyWindow.py:1603 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "Не можу скопіювати %s. Можливо не вистачає прав для копіювання." #: ../variety/VarietyWindow.py:1623 ../variety/VarietyWindow.py:1643 msgid "Cannot delete" msgstr "Не можу вилучити" #: ../variety/VarietyWindow.py:1624 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "У Вас немає прав для вилучення %s у смітник." #: ../variety/VarietyWindow.py:1644 msgid "" "Probably there is no utility for moving to Trash?\n" "Please install trash-cli or gvfs-bin or konquerer." msgstr "" "Утиліти вилучення у Смітник не встановлено?\n" "Будь ласка, встановіть trash-cli, або gvfs-bin, або konquerer." #: ../variety/VarietyWindow.py:1776 msgid "Anonymous usage statistics" msgstr "Анонімна статистика використання" #: ../variety/VarietyWindow.py:1777 msgid "" "Variety collects anonymous usage statistics. \n" "These help us make it better and are not shared with anyone. \n" "To read more or turn them off, go to \"Sync and social\"" msgstr "" "Variety збирає анонімну статистику використання. \n" "Це допомагає нам зробити проґраму кращою й не поділяється ні з ким. \n" "Щоб дізнатися більше або вимкнути функцію, перейдіть у розділ " "\"Синхронізація і соціум\"" #: ../variety/VarietyWindow.py:1920 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:1945 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 /some/local/image.jpg --next" msgstr "" "%prog [параметри] [файли чи url]\n" "\n" "Вказані локальні файли будуть додані у чергу Variety.\n" "Файли за вказаним адресами URL будуть завантажені до теки Fetched й додані " "до черги.\n" "\n" "Для встановлення конкретного зображення: %prog /будь-" "яке/локальне/зображення.jpg --next" #: ../variety/VarietyWindow.py:1955 msgid "" "Show logging messages (-vv shows even finer debugging messages, -vvv debugs " "variety_lib too)" msgstr "" "Показувати повідомлення журналу (-vv показує більш докладні відлагоджувані " "повідомлення, -vvv — повідомлення які відносяться до variety_lib)" #: ../variety/VarietyWindow.py:1959 msgid "Make the running instance quit" msgstr "Вийти з запущеного екземпляру" #: ../variety/VarietyWindow.py:1963 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" "Показати шлях до зображення зі стільниці. Працює лише при запущеному " "застосунку." #: ../variety/VarietyWindow.py:1967 msgid "Show Next wallpaper" msgstr "Показати наступні шпалери" #: ../variety/VarietyWindow.py:1971 msgid "Show Previous wallpaper" msgstr "Показати попередні шпалери" #: ../variety/VarietyWindow.py:1975 msgid "Show Next wallpaper, skipping the forward history" msgstr "Показати наступне зображення ігноруючи історію" #: ../variety/VarietyWindow.py:1979 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Перемістити поточні шпалери до смітника. Працює лише при запущеному " "застосунку." #: ../variety/VarietyWindow.py:1983 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Копіювати поточні шпалери у Вибрані. Працює лише при запущеному застосунку." #: ../variety/VarietyWindow.py:1987 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Перемістити поточні шпалери у Вибрані. Працює лише при запущеному застосунку." #: ../variety/VarietyWindow.py:1991 msgid "Pause on current image" msgstr "Призупинити на поточному зображенні" #: ../variety/VarietyWindow.py:1995 msgid "Resume regular image changes" msgstr "Відновити регулярне змінювання зображень" #: ../variety/VarietyWindow.py:1999 msgid "Toggle Pause/Resume state" msgstr "Перемикання Призупинити/Відтворити" #: ../variety/VarietyWindow.py:2003 msgid "Show Next quote" msgstr "Показати наступну цитату" #: ../variety/VarietyWindow.py:2007 msgid "Show Previous quote" msgstr "Показати попередню цитату" #: ../variety/VarietyWindow.py:2011 msgid "Show Next quote, skipping the forward history" msgstr "Показати наступну цитату ігноруючи історію" #: ../variety/VarietyWindow.py:2015 msgid "Toggle Quotes Pause/Resume state" msgstr "Перемикання Призупинити/Відтворити для цитат" #: ../variety/VarietyWindow.py:2019 msgid "Save the current quote to Favorites" msgstr "Зберегти поточну цитату у Вибраних" #: ../variety/VarietyWindow.py:2023 msgid "Toggle History display" msgstr "Перемикнути показ історії" #: ../variety/VarietyWindow.py:2027 msgid "Toggle Recent Downloads display" msgstr "Перемикнути показ останніх завантажень" #: ../variety/VarietyWindow.py:2031 msgid "Show Preferences dialog" msgstr "Показати діалог налаштувань" #: ../variety/VarietyWindow.py:2035 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Показати перемикач шпалер — панель ескізів зображень з активних інтернет-" "джерел" #: ../variety/VarietyWindow.py:2039 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/VarietyWindow.py:2053 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "параметри --next/--fast-forward та --previous є взаємовиключними" #: ../variety/VarietyWindow.py:2056 msgid "options --trash and --favorite are mutually exclusive" msgstr "параметри --trash та --favorite є взаємовиключними" #: ../variety/VarietyWindow.py:2059 msgid "options --pause and --resume are mutually exclusive" msgstr "параметри --pause та --resume є взаємовиключними" #: ../variety/VarietyWindow.py:2062 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "параметри --quotes-next/--quotes-fast-forward та --quotes-previous є " "взаємовиключними" #: ../variety/VarietyWindow.py:2179 ../variety/ImageFetcher.py:60 #: ../variety/ImageFetcher.py:71 ../variety/ImageFetcher.py:78 #: ../variety/ImageFetcher.py:112 msgid "Not an image" msgstr "Не є зображенням" #: ../variety/VarietyWindow.py:2184 msgid "Added to queue" msgstr "Додано до цитат" #: ../variety/VarietyWindow.py:2185 ../variety/VarietyWindow.py:2191 msgid "Press Next to see it" msgstr "Натисніть Далі для перегляду" #: ../variety/VarietyWindow.py:2191 msgid "Fetched" msgstr "Отримані" #: ../variety/VarietyWindow.py:2237 msgid "Unsupported source type" msgstr "Непідтримуваний тип джерела" #: ../variety/VarietyWindow.py:2238 ../variety/VarietyWindow.py:2286 msgid "Are you running the most recent version of Variety?" msgstr "Чи Ваша версія Variety найновіша?" #: ../variety/VarietyWindow.py:2244 msgid "New image source added" msgstr "Нове джерело зображень додано" #: ../variety/VarietyWindow.py:2246 msgid "Image source already exists, enabling it" msgstr "Таке джерело зображень вже існує, вмикаю його" #: ../variety/VarietyWindow.py:2272 msgid "Fetched and applied" msgstr "Завантажено та застосовано" #: ../variety/VarietyWindow.py:2282 msgid "It works!" msgstr "Це працює!" #: ../variety/VarietyWindow.py:2282 msgid "Yay, Variety links work. Great!" msgstr "Вау, посилання Variety працюють. Чудово!" #: ../variety/VarietyWindow.py:2286 msgid "Unsupported command" msgstr "Команда не підтримується" #: ../variety/VarietyWindow.py:2288 msgid "Could not process the given variety:// URL" msgstr "Не вдалося обробити дану variety:// URL" #: ../variety/VarietyWindow.py:2289 msgid "Run with logging enabled to see details" msgstr "Запустити з журналюванням, щоб бачити подробиці" #: ../variety/VarietyWindow.py:2488 msgid "Do not ask anymore, always use the current quote" msgstr "Більше не запитувати, завжди використовувати поточну цитату" #: ../variety/VarietyWindow.py:2491 ../data/ui/FacebookPublishDialog.ui.h:5 msgid "Do not ask anymore, always use the text above" msgstr "Більше не питати, завжди використовувати цей текст" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "Published" msgstr "Опубліковано" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "You may open your Facebook feed to see the post" msgstr "" "Ви можете перейти до своєї стрічки у Facebook для перегляду повідомлення" #: ../variety/VarietyWindow.py:2526 ../variety/VarietyWindow.py:2555 msgid "Could not publish" msgstr "Неможливо опублікувати" #: ../variety/VarietyWindow.py:2718 msgid "Could not create autostart entry" msgstr "Не вдалося створити запис в автозавантаженні" #: ../variety/VarietyWindow.py:2719 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:2769 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:2769 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/FacebookFirstRunDialog.ui.h:1 msgid "Variety - Facebook Sharing" msgstr "Variety — поділитися на Facebook" #: ../data/ui/FacebookFirstRunDialog.ui.h:2 #: ../data/ui/PreferencesVarietyDialog.ui.h:169 msgid "Facebook Sharing" msgstr "Поділитися на Facebook" #: ../data/ui/FacebookFirstRunDialog.ui.h:3 msgid "" "You are sharing on Facebook for the first time. Sharing from Variety is " "available for images that come from online sources and for quotes. It works " "this way: \n" "\n" "1. Login to Facebook\n" "Facebook will open in your default browser. You will be prompted to login if " "you are not already logged in. \n" "\n" "2. Authorize Variety to publish to your " "feed.\n" "You will be asked to allow Variety to publish to your feed on your behalf. " "Variety will only use this permission to publish those images and quotes " "that you tell it to, nothing else.\n" "\n" "3. Configure browser to open variety:// links " "with Variety or xdg-open\n" "Then you will be redirected to a page with instructions to associate " "\"variety://\" links with Variety in your browser. Please follow these " "instructions to complete the setup. You have to do this only once.\n" "\n" "No passwords or login information is kept locally, just an OAuth Facebook " "token that will be valid for a couple of weeks. After its validity expires " "you will be asked to login again." msgstr "" "Ви вперше ділитеся у Facebook. Публікація з Variety доступна для зображень, " "отриманих з інтернет-джерел, та цитат. Працює так:\n" "\n" "1. Увійдіть до Facebook\n" "Facebook відкриється у Вашому переглядачі типово. Вам буде запропоновано " "увійти, якщо ви не зробили цього раніше.\n" "\n" "2. Авторизуйте Variety для публікації у Вашій " "стрічці.\n" "У Вас буде запитано дозвіл Variety публікувати у Вашій стрічці від Вашого " "ім’я. Variety буде користуватися цим дозволом, лише для публікації тих " "зображень і цитат, які Ви самі вкажете, й ні для чого більше.\n" "\n" "3. Налаштуйте переглядач на відкривання " "variety:// посилань Variety або xdg-open\n" "Потім Вас перенаправить на сторінку з інструкціями по асоціяції " "\"variety://\" посилань Variety у Вашому переглядачі. Будь ласка, " "дотримуйтеся цих вказівок, аби завершити налаштування. Це потрібно буде " "зробити лише одного разу.\n" "\n" "Ніякі паролі або логіни не зберігаються локально, лише OAuth токен Facebook, " "дійсний протягом пари тижнів. Коли термін його дії вийде, Вам буде " "запропоновано авторизуватися знову." #: ../variety/AddWallpapersNetCategoryDialog.py:40 msgid "Could not find wallpapers there. Please check the URL." msgstr "Не можу знайти там зображень. Перевірте URL." #: ../data/ui/WelcomeDialog.ui.h:1 msgid "Welcome to Variety!" msgstr "Ласкаво просимо до Variety!" #: ../data/ui/WelcomeDialog.ui.h:2 ../data/ui/SmartFeaturesNoticeDialog.ui.h:3 msgid "Continue" msgstr "Далі" #: ../data/ui/WelcomeDialog.ui.h:3 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.h:4 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.h:5 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" "Тепер, будь ласка, знайдіть час, щоб встановити параметри на наступних " "екранах." #: ../data/ui/WelcomeDialog.ui.h:6 msgid "KDE Users - Important, please read:" msgstr "Користувачі KDE — будь-ласка, прочитайте, це важливо:" #: ../data/ui/WelcomeDialog.ui.h:7 msgid "" "You appear to be running KDE. In KDE 4 it is impossible to set the wallpaper " "from inside a program - there is no API for this. To make Variety work, please read " "and follow the instructions here." msgstr "" "Здається Ви використовуєте середовище KDE. У KDE 4, неможливо встановити " "шпалери з середини програми - немає API для цього. Для того щоб Variety " "працювала, будь ласка, уважно прочитайте та виконайте інструкції наведені тут " "." #: ../data/ui/AddRedditDialog.ui.h:1 msgid "Variety - add Reddit feed" msgstr "Variety — додавання стрічки Reddit" #: ../data/ui/AddRedditDialog.ui.h:3 msgid "" "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" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:7 msgid "URL or name of a subreddit: " msgstr "URL-адреса або ім'я subreddit: " #: ../data/ui/AddRedditDialog.ui.h:8 msgid "Just a moment to check what's there" msgstr "Лише момент щоб перевірити, що там" #: ../data/ui/AddMediaRssDialog.ui.h:1 msgid "Variety - add Media RSS feed" msgstr "Variety — додати стрічку Медіа RSS" #: ../data/ui/AddMediaRssDialog.ui.h:3 msgid "" "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." msgstr "" "Будь-ласка вставте URL каналу Медіа RSS нижче. Зверніть увагу, що " "підтримуються лише канали Медіа RSS, а не довільні стрічки RSS. Канали Медіа " "RSS містять теґ media:content, який посилається безпосередньо на саме " "зображення. Деякі приклади сайтів, що надають Медіа RSS канали: Picasa, deviantART, SmugMug, Flickr, InterfaceLIFT." #: ../data/ui/AddMediaRssDialog.ui.h:4 msgid "Paste the URL of the Media RSS feed here: " msgstr "Вставте URL каналу Медіа RSS сюди: " #: ../data/ui/AddMediaRssDialog.ui.h:5 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:9 msgid "Just a moment to check what's at that URL" msgstr "Хвилинку, перевіримо, що за цією адресою" #: ../variety/AddRedditDialog.py:43 msgid "This does not seem to be a valid Reddit URL" msgstr "Здається ця Reddit URL не дійсна" #: ../variety/AddRedditDialog.py:46 msgid "We could not find any image submissions there." msgstr "Ми не змогли знайти якихось поданих там зображень." #: ../variety/Smart.py:111 msgid "" "Your smart_user.json config file appears broken. You may have to login again " "to VRTY.ORG." msgstr "" "Ваш конфігураційний файл smart_user.json здається зіпсований. Можливо Вам " "доведеться знову увійти на VRTY.ORG." #: ../variety/Smart.py:195 msgid "Your VRTY.ORG credentials are probably outdated. Please login again." msgstr "" "Ваші облікові дані на VRTY.ORG ймовірно застаріли. Будь ласка, увійдіть " "знову." #: ../variety/Smart.py:597 ../variety/Smart.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:111 msgid "Sync" msgstr "Синхронізація" #: ../variety/Smart.py:598 #, python-format msgid "Fetching %d images" msgstr "Завантажено зображень: %d" #: ../variety/Smart.py:598 msgid "Fetching 1 image" msgstr "Завантажено 1 зображення" #: ../variety/Smart.py:643 msgid "Finished" msgstr "Завершено" #: ../variety/Smart.py:664 #, python-format msgid "Logged in as %s" msgstr "Авторизовано як %s" #: ../variety/Smart.py:676 #, python-format msgid "" "Do you want to login to VRTY.ORG as %s?" msgstr "" "Ви бажаєте увійти на VRTY.ORG як %s?" #: ../variety/Smart.py:677 msgid "VRTY.ORG login confirmation" msgstr "Підтвердити вхід на VRTY.ORG" #: ../data/plugins/quotes/QuotationsPageSource.py:35 msgid "Fetches quotes from TheQuotationsPage.com" msgstr "Вибирає цитати з TheQuotationsPage.com" #: ../variety/__init__.py:143 msgid "Terminating signal received, quitting..." msgstr "Отримано сигнал припинення роботи — вихід…" #: ../variety/__init__.py:198 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Variety вже працює. Надсилання команди до запущеного екземпляру." #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:1 msgid "VRTY.ORG integration" msgstr "VRTY.ORG інтеґрація" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:2 msgid "This feature requires VRTY.ORG integration" msgstr "Ця функція потребує інтеграції VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:3 msgid "Enable VRTY.ORG integration" msgstr "Увімкнути VRTY.ORG інтеґрацію" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:4 msgid "" "For this feature Variety needs permission to collect data about the images " "you like or dislike and the online sources you have enabled.\n" "\n" "Collected data is anonymous by default and covers only images which Variety " "downloaded, never images you already had in your local folders that might be " "private.\n" "\n" "This data helps us provide better images for everyone and fuels VRTY.ORG - a valuable resource for all users " "of Variety." msgstr "" "Подобається Вам чи не подобається але для цієї функції Variety потрібен " "дозвіл для збору даних про зображення і джерела в інтернеті які Ви увімкнули " ".\n" "\n" "Зібрані дані є типово анонімними і охоплюють лише зображення які завантажені " "Variety, та ніколи не включають в себе зображення які Ви вже мали у своїх " "локальних теках й які можуть бути приватними.\n" "\n" "Ці дані допомагають нам забезпечити кращі зображення для всіх та VRTY.ORG - цінний ресурс для всіх користувачів " "Variety." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:1 msgid "Variety - VRTY.ORG" msgstr "Variety - VRTY.ORG" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:2 msgid "No, thanks" msgstr "Ні, дякую" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:4 msgid "" "Introducing VRTY.ORG! Wanna take part?" msgstr "" "Введення VRTY.ORG! Бажаєте прийняти участь?" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:5 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to find and add new image sources to Variety, and to follow other users' " "favorites." msgstr "" "VRTY.ORG поєднати користувачів Variety з " "аналогічними смаками і забезпечити супер-зручний спосіб зміни Ваших шпалер, " "щоб знайти та додати нові джерела зображень до Variety і простежити за " "Вибраним інших користувачів." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:6 msgid "" "Participation takes no effort - your profile will be built automatically, as " "you like or dislike images downloaded by Variety. Your profile will not be " "shared with third parties, unless you opt-in to make it public. Read more details about the " "service and the privacy policy here." msgstr "" "Участь не вимагає ніяких зусиль - Ваш профіль буде побудований автоматично, " "які завантажені на Variety зображення Вам подобаються чи не подобаються. Ваш " "профіль не буде переданий третім особам, якщо Ви вирішите його оприлюднити. " "Більш докладну інформацію " "про сервіс й політику конфіденційності читайте тут." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:7 msgid "" "Participation is required for some features of Variety such as synchronization of favorites between computers." msgstr "" "Участь є обов'язковою для деяких функцій Variety таких як синхронізація Вибраного між комп'ютерами." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:8 #: ../data/ui/PreferencesVarietyDialog.ui.h:105 msgid "Participate in VRTY.ORG" msgstr "Прийняти участь у VRTY.ORG" #: ../data/plugins/quotes/QuotesDaddySource.py:31 msgid "" "Fetches quotes from QuotesDaddy's daily quotes RSS feed.\n" "Does not support searching by tags or authors." msgstr "" "Бере цитати з щоденної RSS стрічки на QuotesDaddy's.\n" "Не підтримує пошук по теґах та авторові." #: ../data/ui/AboutVarietyDialog.ui.h:1 msgid "Copyright (c) 2012, Peter Levi " msgstr "Авторські права © 2012, Peter Levi " #: ../data/ui/AboutVarietyDialog.ui.h:2 msgid "About Variety" msgstr "Про Variety" #: ../data/ui/AboutVarietyDialog.ui.h:3 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Автоматичний змінювач, завантажувач та менеджер шпалер." #: ../data/ui/AboutVarietyDialog.ui.h:4 msgid "http://peterlevi.com/variety" msgstr "http://peterlevi.com/variety" #: ../data/ui/AboutVarietyDialog.ui.h:5 msgid "" "# Copyright (c) 2012, Peter Levi \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 "" "# Авторські права © 2012, Peter Levi \n" "# Це вільне програмне забезпечення; Ви можете розповсюджувати та/або " "змінювати його\n" "# на умовах ліцензії GNU General Public License версії 3, опублікованої\n" "# Фондом вільного програмного забезпечення.\n" "#\n" "# Ця програма розповсюджується з надією, що вона буде корисною, але\n" "# БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ; навіть без натяку на гарантії\n" "# КОМЕРЦІЙНОЇ ВИГОДИ, ЗАДОВІЛЬНОЇ ЯКОСТІ або ПРИДАТНОСТІ ДЛЯ КОНКРЕТНОЇ\n" "# МЕТИ. Для отримання додаткових відомостей зверніться до ліцензії GNU " "General Public License.\n" "#\n" "# Ви повинні були отримати копію GNU General Public License\n" "# з цією програмою. Якщо ні, дивіться .\n" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:1 msgid "Variety - add Wallpapers.net category" msgstr "Variety — додати категорії з сайту Wallpapers.net" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:3 msgid "" "Please visit wallpapers.net and choose " "a category with wallpapers, then paste its URL below. A category is " "anything on the site that has one or more pages with wallpapers on them. " "Here are some examples:\n" "\n" "All wallpapers: http://www.wallpapers.net/\n" "Specific resolution: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" msgstr "" "Будь ласка, відвідайте wallpapers.net " "і виберіть категорію, потім вставте її URL нижче. Категорія — це що-небудь " "на сайті, що має одну чи більше сторінок зі шпалерами. Ось декілька " "прикладів:\n" "\n" "Усі шпалери: http://www.wallpapers.net/\n" "Питома роздільна здатність: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:8 msgid "Paste URL here: " msgstr "Вставте URL тут: " #: ../data/ui/PreferencesVarietyDialog.ui.h:1 msgid "seconds" msgstr "секунд(и)" #: ../data/ui/PreferencesVarietyDialog.ui.h:2 msgid "minutes" msgstr "хвилин(и)" #: ../data/ui/PreferencesVarietyDialog.ui.h:3 msgid "hours" msgstr "годин(и)" #: ../data/ui/PreferencesVarietyDialog.ui.h:4 msgid "days" msgstr "дні(в)" #: ../data/ui/PreferencesVarietyDialog.ui.h:5 msgid "Variety Preferences" msgstr "Налаштування Variety" #: ../data/ui/PreferencesVarietyDialog.ui.h:6 msgid "General" msgstr "Загальні" #: ../data/ui/PreferencesVarietyDialog.ui.h:7 msgid "Start Variety when the computer starts" msgstr "Запускати Variety при старті системи" #: ../data/ui/PreferencesVarietyDialog.ui.h:8 msgid "Change wallpaper every " msgstr "Змінювати шпалери кожні " #: ../data/ui/PreferencesVarietyDialog.ui.h:9 msgid "Minimum interval is 5 seconds" msgstr "Мінімальний інтервал 5 секунд" #: ../data/ui/PreferencesVarietyDialog.ui.h:10 msgid "Change wallpaper on start" msgstr "Змінювати шпалери при запуску" #: ../data/ui/PreferencesVarietyDialog.ui.h:12 msgid "Enabled" msgstr "Увімкнено" #: ../data/ui/PreferencesVarietyDialog.ui.h:13 msgid "Type" msgstr "Тип" #: ../data/ui/PreferencesVarietyDialog.ui.h:14 msgid "Location" msgstr "Розташування" #: ../data/ui/PreferencesVarietyDialog.ui.h:15 msgid "_Add..." msgstr "_Додати…" #: ../data/ui/PreferencesVarietyDialog.ui.h:16 msgid "Add images, folders or online image sources" msgstr "Додати зображення, теки або інтернет-джерела" #: ../data/ui/PreferencesVarietyDialog.ui.h:17 msgid "_Edit..." msgstr "З_мінити…" #: ../data/ui/PreferencesVarietyDialog.ui.h:18 msgid "Edit the selected source" msgstr "Змінити виділене джерело" #: ../data/ui/PreferencesVarietyDialog.ui.h:19 msgid "_Remove..." msgstr "_Вилучити…" #: ../data/ui/PreferencesVarietyDialog.ui.h:20 msgid "Remove selected image sources" msgstr "Вилучити виділені джерела зображень" #: ../data/ui/PreferencesVarietyDialog.ui.h:21 msgid "_Use" msgstr "_Застосувати…" #: ../data/ui/PreferencesVarietyDialog.ui.h:22 msgid "Enable the selected sources and disable all others" msgstr "Увімкнути вибрані джерела та від’єднати решту" #: ../data/ui/PreferencesVarietyDialog.ui.h:23 msgid "Download a wallpaper every " msgstr "Завантажувати шпалери кожні " #: ../data/ui/PreferencesVarietyDialog.ui.h:24 msgid "Minimum interval is one minute" msgstr "Мінімальний інтервал - 1 хвилина" #: ../data/ui/PreferencesVarietyDialog.ui.h:25 msgid "to " msgstr "у " #: ../data/ui/PreferencesVarietyDialog.ui.h:26 msgid "Actual download folder " msgstr "Тека завантаження " #: ../data/ui/PreferencesVarietyDialog.ui.h:27 msgid "" "Caution: do NOT use this option if you use a custom download folder with " "valuable files in it. Variety will maintain the limit regardless of what is " "in the download folder." msgstr "" "Увага: НЕ використовуйте цей параметр, якщо у вказаній Вами теці " "завантаження є важливі файли. Variety буде дотримуватися межі незалежно від " "вмісту теки." #: ../data/ui/PreferencesVarietyDialog.ui.h:28 msgid "Limit download folder to " msgstr "Обмежити розмір теки завантаження до " #: ../data/ui/PreferencesVarietyDialog.ui.h:29 msgid "Minimum size is 50 MB" msgstr "Мінімальний розмір 50 МБ" #: ../data/ui/PreferencesVarietyDialog.ui.h:30 msgid "MB by deleting oldest files when necessary" msgstr "МБ, за необхідності вилучаючи старі файли" #: ../data/ui/PreferencesVarietyDialog.ui.h:31 msgid "Favorites" msgstr "Вибрані" #: ../data/ui/PreferencesVarietyDialog.ui.h:32 msgid "Copy favorite wallpapers to " msgstr "Копіювати вибрані шпалери у " #: ../data/ui/PreferencesVarietyDialog.ui.h:33 msgid "Filters" msgstr "Фільтри" #: ../data/ui/PreferencesVarietyDialog.ui.h:34 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" "Застосовувати випадкові фільтри до виведених на екран шпалер (дякуємо " "чудовому ImageMagick)" #: ../data/ui/PreferencesVarietyDialog.ui.h:35 msgid "Quotes" msgstr "Цитати" #: ../data/ui/PreferencesVarietyDialog.ui.h:36 msgid "Show random wise quotes on the desktop" msgstr "Показати випадкові афоризми на стільниці" #: ../data/ui/PreferencesVarietyDialog.ui.h:37 msgid "Text color: " msgstr "Колір тексту: " #: ../data/ui/PreferencesVarietyDialog.ui.h:38 msgid "Text font: " msgstr "Шрифт тексту: " #: ../data/ui/PreferencesVarietyDialog.ui.h:39 msgid "Backdrop color: " msgstr "Колір тла: " #: ../data/ui/PreferencesVarietyDialog.ui.h:40 msgid "Backdrop opacity: " msgstr "Прозорість тла: " #: ../data/ui/PreferencesVarietyDialog.ui.h:41 msgid " Transparent" msgstr " Прозорий" #: ../data/ui/PreferencesVarietyDialog.ui.h:42 msgid "Opaque" msgstr "Непрозорий" #: ../data/ui/PreferencesVarietyDialog.ui.h:43 msgid "Draw a text shadow" msgstr "Показувати тінь від тексту" #: ../data/ui/PreferencesVarietyDialog.ui.h:44 msgid "Appearance" msgstr "Зовнішній вигляд" #: ../data/ui/PreferencesVarietyDialog.ui.h:45 msgid "Quotes area width: " msgstr "Ширина ділянки цитат: " #: ../data/ui/PreferencesVarietyDialog.ui.h:46 msgid "Narrow " msgstr "Вузька " #: ../data/ui/PreferencesVarietyDialog.ui.h:47 msgid "Wide" msgstr "Широка" #: ../data/ui/PreferencesVarietyDialog.ui.h:48 msgid "Horizontal position: " msgstr "Горизонтальне розташування: " #: ../data/ui/PreferencesVarietyDialog.ui.h:49 msgid "Left " msgstr "Ліворуч " #: ../data/ui/PreferencesVarietyDialog.ui.h:50 ../variety/ThumbsManager.py:44 msgid "Right" msgstr "Праворуч" #: ../data/ui/PreferencesVarietyDialog.ui.h:51 msgid "Vertical position: " msgstr "Вертикальне розташування: " #: ../data/ui/PreferencesVarietyDialog.ui.h:52 msgid "Top " msgstr "Вгорі " #: ../data/ui/PreferencesVarietyDialog.ui.h:53 ../variety/ThumbsManager.py:41 msgid "Bottom" msgstr "Знизу" #: ../data/ui/PreferencesVarietyDialog.ui.h:54 msgid "Placement" msgstr "Розташування" #: ../data/ui/PreferencesVarietyDialog.ui.h:55 msgid "Show quotes from these sources: " msgstr "Показувати цитати з цих джерел: " #: ../data/ui/PreferencesVarietyDialog.ui.h:56 msgid "" "More " "plugins" msgstr "" "Більше " "додатків" #: ../data/ui/PreferencesVarietyDialog.ui.h:57 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" "Показувати лише для цих теґів та авторів. Залиште порожнім щоб показувати " "випадкові цитати." #: ../data/ui/PreferencesVarietyDialog.ui.h:59 msgid "Example: funny, inspirational" msgstr "Приклад: funny, inspirational" #: ../data/ui/PreferencesVarietyDialog.ui.h:60 msgid "Example: Albert Einstein, Voltaire" msgstr "Приклад: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui.h:61 msgid "Authors: " msgstr "Автори: " #: ../data/ui/PreferencesVarietyDialog.ui.h:62 msgid "Sources and filtering" msgstr "Джерела та фільтрування" #: ../data/ui/PreferencesVarietyDialog.ui.h:63 msgid "Change quote every " msgstr "Змінювати цитату через " #: ../data/ui/PreferencesVarietyDialog.ui.h:64 msgid "Minimum interval is 10 seconds" msgstr "Мінімальний інтервал 10 секунд" #: ../data/ui/PreferencesVarietyDialog.ui.h:65 msgid "Regular change" msgstr "Постійна зміна" #: ../data/ui/PreferencesVarietyDialog.ui.h:66 msgid "Clock" msgstr "Годинник" #: ../data/ui/PreferencesVarietyDialog.ui.h:67 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "" "Показувати на стільниці великий цифровий годинник з поточним часом та датою" #: ../data/ui/PreferencesVarietyDialog.ui.h:68 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.h:69 msgid "Clock font: " msgstr "Шрифт годинника: " #: ../data/ui/PreferencesVarietyDialog.ui.h:70 msgid "Date font: " msgstr "Шрифт дати: " #: ../data/ui/PreferencesVarietyDialog.ui.h:71 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "Не працює? Читай " "тут. Як ще налаштувати годинник? Прочитай тут." #: ../data/ui/PreferencesVarietyDialog.ui.h:72 msgid "Effects" msgstr "Ефекти" #: ../data/ui/PreferencesVarietyDialog.ui.h:73 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:74 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:75 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:76 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:77 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:78 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:79 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:80 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:81 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:82 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:83 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:84 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:85 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:86 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:87 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:88 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:89 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:90 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:91 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:92 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:93 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:94 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:95 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:96 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:97 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:98 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:99 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:100 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:101 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:102 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:103 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:104 msgid "VRTY.ORG" msgstr "VRTY.ORG" #: ../data/ui/PreferencesVarietyDialog.ui.h:106 msgid "VRTY.ORG is in beta and will take some time to mature" msgstr "" "VRTY.ORG знаходиться на стадії бета тестування й потрібен певний час для " "доробки" #: ../data/ui/PreferencesVarietyDialog.ui.h:107 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to add new image sources to Variety, and to follow other users' favorites. " "It is fueled by the favorite images of all participating users." msgstr "" "VRTY.ORG поєднує користувачів Variety з " "аналогічними смаками і забезпечує супер-зручні способи для зміни Ваших " "шпалер, додавання нових джерел зображень Variety і стеження за Вибраним " "інших користувачів. Це джерело поповнюється улюбленими зображеннями усіх " "користувачів, що беруть участь." #: ../data/ui/PreferencesVarietyDialog.ui.h:108 msgid "" "Could not create user - no connection to VRTY.ORG. We will try again later." msgstr "" "Не вдалося створити користувача - немає з’єднання з VRTY.ORG. Спробуйте ще " "раз пізніше." #: ../data/ui/PreferencesVarietyDialog.ui.h:110 msgid "" "Registration enables cool features like synchronization of favorite images " "and sources between computers and personalized recommendations." msgstr "" "Реєстрація дозволяє користуватися цікавими функціями, такими як " "синхронізація улюблених зображень і джерел між комп'ютерами та персональні " "рекомендації." #: ../data/ui/PreferencesVarietyDialog.ui.h:112 msgid "Synchronize favorite images between computers" msgstr "Синхронізація улюблених зображень між комп’ютерами" #: ../data/ui/PreferencesVarietyDialog.ui.h:113 msgid "Requires VRTY.ORG enabled and logged in." msgstr "Потрібно увімкнути VRTY.ORG та пройти ідентифікацію" #: ../data/ui/PreferencesVarietyDialog.ui.h:114 msgid "" "Your favorite images from other computers will be automatically downloaded " "to this computer. You need to be logged in with the same VRTY.ORG user " "everywhere. Sync will not delete any images." msgstr "" "Ваші улюблені зображення з інших комп’ютерів будуть автоматично завантажені " "на комп’ютер. Ви повинні увійти у систему від одного користувача VRTY.ORG " "скрізь. Синхронізація не призведе до вилучення ніяких зображень." #: ../data/ui/PreferencesVarietyDialog.ui.h:115 msgid "Privacy policy" msgstr "Політика конфіденційності" #: ../data/ui/PreferencesVarietyDialog.ui.h:116 msgid "" "Variety sends data only for images it downloaded, never for images you " "already had in your local folders that might be private, and Sync does not " "work for such images. Collected data is not shared with third parties, " "unless you opt-in to make your profile public. Read more details about the " "service and the privacy policy here." msgstr "" "Variety надсилає дані лише про зображення нею завантажені й ніколи про " "зображення які вже були у Ваших локальних теках, які можуть бути приватними " "й такі зображення не синхронізуються. Зібрані дані не передаються третім " "особам, якщо Ви погодитеся зробити свій профіль загальнодоступним. Читайте більш докладну " "інформацію про сервіс і політику конфіденційності тут." #: ../data/ui/PreferencesVarietyDialog.ui.h:117 msgid "Usage statistics" msgstr "Статистика використання" #: ../data/ui/PreferencesVarietyDialog.ui.h:118 msgid "Help make Variety better by sending anonymous usage statistics" msgstr "" "Допоможіть зробити Variety кращою, відправивши анонімну статистику " "використання" #: ../data/ui/PreferencesVarietyDialog.ui.h:119 msgid "" "These stats help us improve Variety by understanding how users interact with " "it. They also include general info about your OS version and monitor setup. " "Collected data is not shared with anyone." msgstr "" "Ця статистика допоможе нам поліпшити Variety й дасть розуміння того як " "користувачі взаємодіють з проґрамою. Вона також включає у себе загальну " "інформацію про вашу версію ОС і налаштування монітора. Зібрані дані не " "поділяються ні з ким." #: ../data/ui/PreferencesVarietyDialog.ui.h:120 msgid "Sync and social" msgstr "Синхронізація і соціум" #: ../data/ui/PreferencesVarietyDialog.ui.h:121 msgid "Fetch folder" msgstr "Завантажені вручну" #: ../data/ui/PreferencesVarietyDialog.ui.h:122 msgid "Save manually downloaded wallpapers to " msgstr "Зберегти завантажені вручну зображення у " #: ../data/ui/PreferencesVarietyDialog.ui.h:123 msgid "Drag and drop" msgstr "Перетягування" #: ../data/ui/PreferencesVarietyDialog.ui.h:124 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.h:126 msgid "Clipboard monitoring" msgstr "Стеження за буфером обміну" #: ../data/ui/PreferencesVarietyDialog.ui.h:127 msgid "Monitor clipboard for image URLs and fetch them" msgstr "" "Стежити за буфером обміну при виявлені там адреси зображення, завантажувати " "їх" #: ../data/ui/PreferencesVarietyDialog.ui.h:128 msgid "But fetch only when the URL host is one of these:" msgstr "Завантажувати, лише якщо URL хосту один з наступних" #: ../data/ui/PreferencesVarietyDialog.ui.h:129 msgid "Manual downloading" msgstr "Ручне завантаження" #: ../data/ui/PreferencesVarietyDialog.ui.h:130 msgid "When possible use images that:" msgstr "За можливістю використовувати зображення які:" #: ../data/ui/PreferencesVarietyDialog.ui.h:131 ../variety/ThumbsManager.py:98 msgid "Size" msgstr "Розмір" #: ../data/ui/PreferencesVarietyDialog.ui.h:132 msgid "Have landscape orientation" msgstr "Мають альбомну орієтацію" #: ../data/ui/PreferencesVarietyDialog.ui.h:133 msgid "Are big at least " msgstr "Принаймні " #: ../data/ui/PreferencesVarietyDialog.ui.h:134 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui.h:135 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui.h:136 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui.h:138 #, no-c-format msgid "% of the screen resolution" msgstr "% від розміру екрану" #: ../data/ui/PreferencesVarietyDialog.ui.h:139 msgid "Color" msgstr "Колір" #: ../data/ui/PreferencesVarietyDialog.ui.h:140 msgid "Are dark or light:" msgstr "Темні або світлі:" #: ../data/ui/PreferencesVarietyDialog.ui.h:141 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Темні" #: ../data/ui/PreferencesVarietyDialog.ui.h:142 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Світлі" #: ../data/ui/PreferencesVarietyDialog.ui.h:143 msgid "Contain this color: " msgstr "Містять цей колір: " #: ../data/ui/PreferencesVarietyDialog.ui.h:144 msgid "(Takes effect after some initial searching)" msgstr "(Вступає у силу після деяких початкових пошуків)" #: ../data/ui/PreferencesVarietyDialog.ui.h:145 msgid "Rating" msgstr "Оцінка" #: ../data/ui/PreferencesVarietyDialog.ui.h:146 msgid "Have EXIF rating at least " msgstr "Оцінка в EXIF не менше " #: ../data/ui/PreferencesVarietyDialog.ui.h:147 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui.h:148 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui.h:149 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui.h:150 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui.h:151 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui.h:152 msgid "Color and size" msgstr "Колір та розмір" #: ../data/ui/PreferencesVarietyDialog.ui.h:153 msgid "Indicator Icon" msgstr "Піктограма індикатора" #: ../data/ui/PreferencesVarietyDialog.ui.h:154 msgid "Indicator icon:" msgstr "Піктограма індикатора:" #: ../data/ui/PreferencesVarietyDialog.ui.h:155 msgctxt "Icon option" msgid "Light" msgstr "Світлий" #: ../data/ui/PreferencesVarietyDialog.ui.h:156 msgctxt "Icon option" msgid "Dark" msgstr "Темний" #: ../data/ui/PreferencesVarietyDialog.ui.h:157 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Поточні шпалери" #: ../data/ui/PreferencesVarietyDialog.ui.h:158 msgctxt "Icon option" msgid "Custom image..." msgstr "Вибрати зображення…" #: ../data/ui/PreferencesVarietyDialog.ui.h:159 msgctxt "Icon option" msgid "None" msgstr "Немає" #: ../data/ui/PreferencesVarietyDialog.ui.h:160 msgid "Select an icon" msgstr "Виберіть піктограму" #: ../data/ui/PreferencesVarietyDialog.ui.h:161 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.h:162 msgid "Favorites Operations" msgstr "Вибрані операції" #: ../data/ui/PreferencesVarietyDialog.ui.h:163 msgid "Favorites operations to show in main menu:" msgstr "Вибрані операції, що показуються в основному меню:" #: ../data/ui/PreferencesVarietyDialog.ui.h:164 msgid "Copy to Favorites" msgstr "Копіювати у Вибрані" #: ../data/ui/PreferencesVarietyDialog.ui.h:166 msgid "Both Copy and Move" msgstr "Обидві (копіювати та перемістити)" #: ../data/ui/PreferencesVarietyDialog.ui.h:167 msgid "Depends on folder..." msgstr "Залежить від теки…" #: ../data/ui/PreferencesVarietyDialog.ui.h:170 msgid "Display dialog to customize the Facebook post before publishing" msgstr "" "Показувати діалог зміни тексту повідомлення у Facebook перед публікацією" #: ../data/ui/PreferencesVarietyDialog.ui.h:171 msgid "Login Screen Support" msgstr "Підтримка екрану входу у систему" #: ../data/ui/PreferencesVarietyDialog.ui.h:172 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "Переконайтеся, що шпалери, встановлені Variety, будуть використовуватися на " "екрані входу у систему" #: ../data/ui/PreferencesVarietyDialog.ui.h:173 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.h:174 msgid "Copy wallpaper image files to this folder: " msgstr "Копіювати файли шпалер для стільниці у цю теку: " #: ../data/ui/PreferencesVarietyDialog.ui.h:175 msgid "Reset to default" msgstr "Відновити типові значення" #: ../data/ui/PreferencesVarietyDialog.ui.h:176 msgid "Still doesn't work?" msgstr "Усе ще не працює?" #: ../data/ui/PreferencesVarietyDialog.ui.h:177 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Здається, Вашу домашню теку зашифровано, так що використання теки в ній не " "буде працювати" #: ../data/ui/PreferencesVarietyDialog.ui.h:178 msgid "You don't have write permissions for this folder." msgstr "У Вас немає права на запис до цієї теки" #: ../data/ui/PreferencesVarietyDialog.ui.h:179 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "Права не дозволяють LightDM читати файли з цієї теки." #: ../data/ui/PreferencesVarietyDialog.ui.h:180 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "Можна налаштувати дозвіл, але Ви повинні будете надати Variety повноваження " "суперкористувача." #: ../data/ui/PreferencesVarietyDialog.ui.h:181 msgid "Customize" msgstr "Налаштувати" #: ../data/ui/PreferencesVarietyDialog.ui.h:182 msgid "Tips and tricks" msgstr "Корисні поради" #: ../data/ui/PreferencesVarietyDialog.ui.h:183 msgid "Recent changes" msgstr "Останні зміни" #: ../data/ui/PreferencesVarietyDialog.ui.h:184 msgid "Visit website" msgstr "Завітати на сайт" #: ../data/ui/PreferencesVarietyDialog.ui.h:185 msgid "Report a bug or request a feature" msgstr "Повідомити про помилку або запропонувати нову функцію" #: ../data/ui/PreferencesVarietyDialog.ui.h:186 msgid "Send feedback" msgstr "Надіслати відгук" #: ../data/ui/PreferencesVarietyDialog.ui.h:187 msgid "Donate to Variety" msgstr "Пожертвувати на Variety" #: ../data/ui/PreferencesVarietyDialog.ui.h:188 msgid "Donate via PayPal" msgstr "Пожертвувати через PayPal" #: ../data/ui/PreferencesVarietyDialog.ui.h:189 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.h:193 msgid "" "For Bitcoin and other payment methods please go to Variety's website." msgstr "" "Для Bitcoin та інших способів оплати, відвідайте веб-сайт Variety." #: ../data/ui/PreferencesVarietyDialog.ui.h:194 msgid "Donate" msgstr "Пожертвувати" #: ../variety/FacebookHelper.py:116 msgid "Authorization successful" msgstr "Успіх авторизації" #: ../variety/FacebookHelper.py:116 msgid "Publishing..." msgstr "Публікація..." #: ../variety/FacebookHelper.py:121 msgid "Authorization failed" msgstr "Помилка авторизації" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Згори" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Ліворуч" #: ../variety/ThumbsManager.py:94 msgid "Position" msgstr "Розташування" #: ../variety/ThumbsManager.py:109 msgid "Show Containing Folder" msgstr "Показати у теці" #: ../variety/ThumbsManager.py:136 ../variety/indicator.py:156 msgid "Set EXIF Rating" msgstr "Встановити EXIF рейтиг" #: ../variety/ThumbsManager.py:160 ../variety/indicator.py:87 msgid "Delete to _Trash" msgstr "Вилучити у смітник" #: ../variety/ThumbsManager.py:167 ../variety/indicator.py:131 msgid "Where is it from?" msgstr "Звідкіля це?" #: ../variety/ThumbsManager.py:178 msgid "Close" msgstr "Закрити" #: ../variety/ThumbsManager.py:198 msgid "Could not set EXIF rating" msgstr "Не вдалося записати оцінку в EXIF" #: ../variety/ThumbsManager.py:217 msgid "Unrated" msgstr "Без оцінки" #: ../variety/ThumbsManager.py:224 msgid "Rejected" msgstr "Відхилено" #: ../variety/ThumbsManager.py:324 msgid "Variety History" msgstr "Історія Variety" #: ../variety/ThumbsManager.py:326 msgid "Variety Recent Downloads" msgstr "Нові завантаження Variety" #: ../variety/ThumbsManager.py:328 msgid "Variety Images" msgstr "Зображення Variety" #: ../data/ui/AddWallbaseDialog.ui.h:1 msgid "Variety - add Wallbase.cc image source" msgstr "Variety — додати Wallbase.cc як джерело" #: ../data/ui/AddWallbaseDialog.ui.h:2 msgid "Wallbase.cc" msgstr "Wallbase.cc" #: ../data/ui/AddWallbaseDialog.ui.h:3 msgid "" "Wallbase.cc is permanently down. Use Wallhaven.cc instead. Support for " "Wallbase.cc will be dropped completely in a future release, please remove or " "update your existing Wallbase sources." msgstr "" "Підтримка Wallbase.cc постійно зменшується. Натомість використовуйте " "Wallhaven.cc. Підтримка Wallbase.cc буде повністю вилучена у майбутньому " "випуску, будь ласка вилучіть або оновіть існуючі джерела Wallbase." #: ../data/ui/AddWallbaseDialog.ui.h:4 msgid "" "Wallbase.cc provides a variety of image " "search options. Below you can specify keywords to search for, or visit Wallbase.cc, setup your search criteria " "there, ensure you like the results, and paste the full Wallbase URL in the " "box.\n" "\n" "If you specify keywords, the most liked safe-for-work images that match any " "of the keywords will be used. \n" "\n" "If you specify a Wallbase 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." msgstr "" "Wallbase.cc надає безліч опцій для " "пошуку зображень. Нижче Ви можете вказати ключові слова для пошуку. Або " "відвідайте Wallbase.cc, вкажіть критерії " "пошуку, впевніться в тому, що отриманий результат пошуку подобається і " "скопіюйте повне посилання Wallbase в поле." #: ../data/ui/FacebookPublishDialog.ui.h:1 msgid "Variety - Publish to Facebook" msgstr "Variety — опублікувати у Facebook" #: ../data/ui/FacebookPublishDialog.ui.h:2 ../variety/indicator.py:149 #: ../variety/indicator.py:223 msgid "Share on Facebook" msgstr "Поділитися у Facebook" #: ../data/ui/FacebookPublishDialog.ui.h:3 msgid "" "Publish a link to the current wallpaper on Facebook. Include this text along " "with the link (or just leave empty):" msgstr "" "Опублікувати посилання на поточні шпалери у Facebook. Включити цей текст " "разом з посиланням (або залишити порожнім):" #: ../data/ui/FacebookPublishDialog.ui.h:4 msgid "Use current quote" msgstr "Використовувати поточну цитату" #: ../data/ui/SmartRegisterDialog.ui.h:1 msgid "Variety - VRTY.ORG registration" msgstr "Variety - реєстрація на VRTY.ORG" #: ../data/ui/SmartRegisterDialog.ui.h:2 msgid "Would you like to register?" msgstr "Ви бажали-б зареєструватися?" #: ../data/ui/SmartRegisterDialog.ui.h:3 msgid "" "You may participate in VRTY.ORG " "anonymously, but registration enables some very nice features, such as synchronization of favorites between computers and " "personalized recommendations. It also ensures " "you will not lose your profile and favorite wallpapers if you reinstall your " "OS." msgstr "" "Ви можете прийняти участь на VRTY.ORG " "анонімно але реєстрація дозволяє дуже хороші функції, такі як синхронізація Вибраного між комп’ютерами та персональні рекомендації. Вона також гарантує, що Ви " "не втратите свій профіль та улюблені шпалери при перевстановленні ОС." #: ../data/ui/SmartRegisterDialog.ui.h:4 msgid "Registration is very easy and does not require any personal data." msgstr "Реєстрація дуже проста й не вимагає якихось персональних даних." #: ../data/ui/SmartRegisterDialog.ui.h:5 msgid "" "If you choose to participate anonymously, you can register later from the " "\"Sync and social\" page in Preferences." msgstr "" "Якщо Ви вибираєте взяти участь анонімно, Ви можете зареєструватися на " "сторінці налаштувань \"Синхронізація і соціум\" " "пізніше." #: ../data/ui/SmartRegisterDialog.ui.h:6 msgid "" "Oops, we could not connect to VRTY.ORG. Server might be down. Please wait a " "couple of minutes and try again or choose \"Participate anonymously\" and register later " "from the \"Sync and social\" page in " "Preferences." msgstr "" "Нажаль ми не змогли з’єднатися з VRTY.ORG. Сервер міг впасти. Будь ласка " "зачекайте декілька хвилин й спробуйте ще раз або виберіть \"Взяти участь анонімно\" і зареєструватися " "пізніше на сторінці налаштувань \"Синхронізація і " "соціум\"." #: ../data/ui/SmartRegisterDialog.ui.h:7 msgid "" "Please continue the registration and follow the instructions in the browser " "tab we opened." msgstr "" "Будь ласка продовжіть реєстрацію і дотримуйтеся інструкцій на вкладці " "відкритого нами переглядача тенет." #: ../data/ui/SmartRegisterDialog.ui.h:8 msgid "I will participate anonymously" msgstr "Я буду брати участь анонімно" #: ../data/ui/SmartRegisterDialog.ui.h:9 msgid "I'm registered, let me login" msgstr "Я зареєстрований, дайте увійти" #: ../data/ui/SmartRegisterDialog.ui.h:10 msgid "Register here" msgstr "Реєстрація тут" #: ../variety.desktop.in.h:1 msgid "Variety" msgstr "Variety" #: ../variety.desktop.in.h:2 msgid "Variety Wallpaper Changer" msgstr "Variety — проґрама для зміни шпалер" #: ../variety.desktop.in.h:3 msgid "Next" msgstr "Наступні" #: ../variety.desktop.in.h:4 msgid "Previous" msgstr "Попередні" #: ../variety.desktop.in.h:5 msgid "Pause / Resume" msgstr "Призупинити / Продовжити" #: ../variety.desktop.in.h:6 msgid "History" msgstr "Історія" #: ../variety.desktop.in.h:7 msgid "Preferences" msgstr "Налаштування" #: ../data/plugins/quotes/LocalFilesSource.py:34 msgid "" "Displays quotes, defined in local text files.\n" "Put your own txt files in: ~/.config/variety/pluginconfig/quotes/.\n" "The file format is:\n" "\n" "quote -- author\n" ".\n" "second quote -- another author\n" ".\n" "etc...\n" "\n" "Example: http://rvelthuis.de/zips/quotes.txt" msgstr "" "Показує цитати збережені в текстовому файлі.\n" "Помістіть власний txt файл до: ~/.config/variety/pluginconfig/quotes/.\n" "Формат файлу:\n" "\n" "цитата -- автор\n" ".\n" "наступна цитата -- наступний автор\n" ".\n" "так далі...\n" "\n" "Приклад: http://rvelthuis.de/zips/quotes.txt" #: ../variety/indicator.py:49 ../variety/indicator.py:96 #: ../variety/indicator.py:166 msgid "_Next" msgstr "Наступні" #: ../variety/indicator.py:54 ../variety/indicator.py:101 #: ../variety/indicator.py:171 msgid "_Previous" msgstr "Попередні" #: ../variety/indicator.py:61 msgid "Current desktop wallpaper" msgstr "Поточне зображення на стільниці" #: ../variety/indicator.py:65 msgid "Show origin" msgstr "Показати оригінал" #: ../variety/indicator.py:106 ../variety/indicator.py:176 msgid "_Next, skipping forward history" msgstr "_Далі, пропускаючи вперед історію" #: ../variety/indicator.py:114 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Порада: гортайте шпалери\n" "крутячи коліщатко миші на індикаторі" #: ../variety/indicator.py:124 msgid "_Image" msgstr "_Зображення" #: ../variety/indicator.py:135 msgid "Show without effects" msgstr "Показати без ефектів" #: ../variety/indicator.py:143 msgid "Google Image Search" msgstr "Пошук зображень на Google" #: ../variety/indicator.py:196 msgid "View Favorites..." msgstr "Дивитися Вибрані..." #: ../variety/indicator.py:203 msgid "Copy to Clipboard" msgstr "Копіювати до буферу обміну" #: ../variety/indicator.py:213 msgid "Google Quote" msgstr "Поґуглити цитату" #: ../variety/indicator.py:218 msgid "Google Author" msgstr "Поґуглити автора" #: ../variety/indicator.py:230 ../variety/indicator.py:284 msgid "Preferences..." msgstr "Налаштування…" #: ../variety/indicator.py:238 msgid "Turn off" msgstr "Вимкнути" #: ../variety/indicator.py:244 msgid "_Quote" msgstr "_Цитата" #: ../variety/indicator.py:251 msgid "_History" msgstr "Історія" #: ../variety/indicator.py:257 msgid "_Wallpaper Selector" msgstr "_Перемикач шпалер" #: ../variety/indicator.py:263 msgid "Recent _Downloads" msgstr "Нові завантаження" #: ../variety/indicator.py:278 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:288 msgid "About" msgstr "Про проґраму" #: ../variety/indicator.py:292 msgid "Quit" msgstr "Вийти" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:1 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Копіювати або перемістити у Вибрані" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:2 msgid "Reset to Default" msgstr "Перевстановити типові налаштування" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:3 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.h:4 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" #: ../variety/ImageFetcher.py:56 ../variety/ImageFetcher.py:103 msgid "Fetching" msgstr "Отримання" #. too small - delete and do not use #: ../variety/ImageFetcher.py:118 msgid "Image too small, ignoring it" msgstr "Зображення надто мале, ігноруємо" #: ../variety/ImageFetcher.py:140 #, python-format msgid "Sorry, got %s error..." msgstr "Нажаль сталася помилка %s..." #: ../variety/ImageFetcher.py:141 msgid "This means the link is no longer valid" msgstr "Це не означає, що посилання більше не дійсне" #: ../variety/ImageFetcher.py:144 msgid "Fetch failed for some reason" msgstr "Отримання перервано з певних причин" #: ../variety/ImageFetcher.py:145 msgid "" "To get more information, please run Variety from terminal with -v option and " "retry the action" msgstr "" "Для отримання більш місткої інформації, будь-ласка, запустіть Variety з " "терміналу з параметром -v та повторіть дію" variety/po/ru.po0000644000000000000000000032624512655724351011061 0ustar # Russian translation for variety # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the variety package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: variety\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-01-29 10:57+0200\n" "PO-Revision-Date: 2015-08-24 11:54+0000\n" "Last-Translator: Rodion R. \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-02-07 20:28+0000\n" "X-Generator: Launchpad (build 17908)\n" #: ../data/plugins/quotes/GoodreadsSource.py:49 msgid "Fetches quotes from Goodreads.com" msgstr "Загружать цитаты с Goodreads.com" #: ../data/ui/LoginOrRegisterDialog.ui.h:1 msgid "Login to VRTY.ORG" msgstr "Вход в VRTY.ORG" #: ../data/ui/LoginOrRegisterDialog.ui.h:2 msgid "Username: " msgstr "Имя пользователя: " #: ../data/ui/LoginOrRegisterDialog.ui.h:3 msgid "Password: " msgstr "Пароль: " #: ../data/ui/LoginOrRegisterDialog.ui.h:4 msgid "No account? Register here" msgstr "Нет аккаунта? Зарегистрируйся здесь" #: ../data/ui/LoginOrRegisterDialog.ui.h:5 msgid "Forgot your password?" msgstr "Забыли пароль?" #: ../data/ui/LoginOrRegisterDialog.ui.h:6 msgid "" "Tip: You can also login to VRTY.ORG in a " "browser and click the link \"Trigger Variety " "login\" in your profile." msgstr "" "Совет: вы также можете войти в VRTY.ORG в " "браузере и нажать ссылку \"Trigger Variety " "login\" в своём профиле." #: ../data/ui/LoginOrRegisterDialog.ui.h:7 msgid "Login" msgstr "Войти" #: ../variety/LoginOrRegisterDialog.py:80 #, python-format msgid "Oops, server returned error (%s)" msgstr "Ой, сервер вернул ошибку (%s)" #: ../variety/LoginOrRegisterDialog.py:85 msgid "Could not connect to server" msgstr "Не удалось соединиться с сервером" #: ../variety/AddWallhavenDialog.py:38 ../variety/AddWallbaseDialog.py:38 #: ../variety/AddFlickrDialog.py:138 msgid "No images found" msgstr "Изображения не найдены" #: ../data/ui/AddPanoramioDialog.ui.h:1 msgid "Variety - add Panoramio image source" msgstr "Variety — добавление источника изображений Panoramio" #. (_("Wallbase.cc"), self.on_add_wallbase_clicked), #: ../data/ui/AddPanoramioDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:388 msgid "Panoramio" msgstr "Panoramio" #: ../data/ui/AddPanoramioDialog.ui.h:3 msgid "Please zoom over your area of interest." msgstr "Пожалуйста, увеличьте масштаб области ваших интересов" #: ../variety/FolderChooser.py:65 msgid "Choose a folder" msgstr "Выберите папку" #: ../variety/FolderChooser.py:66 ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Cancel" msgstr "Отмена" #: ../variety/FolderChooser.py:66 msgid "OK" msgstr "OK" #: ../data/ui/AddWallhavenDialog.ui.h:1 msgid "Variety - add Wallhaven.cc image source" msgstr "Variety — добавить источник иображений Wallhaven.cc" #: ../data/ui/AddWallhavenDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:386 msgid "Wallhaven.cc" msgstr "Wallhaven.cc" #: ../data/ui/AddWallhavenDialog.ui.h:3 msgid "" "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." msgstr "" "Wallhaven.cc предоставляет множество " "опций поиска изображений. Ниже можно использовать ключевые слова для поиска " "или посетить Wallhaven.cc, настройте " "критерии поиска там и вставьте полный адрес в поле ввода.\n" "\n" "Если вы введёте ключевые слова – самые понравившиеся SFW-изображения (Safe " "For Work, \"Безопасные для использования на рабочем месте\"), которые " "подходят к ключевым словам, будут использованы.\n" "\n" "Если вы введёте ссылку, позаботьтесь о выборе категории – Variety постоянно " "запрашивает изображения, но использует только несколько сотен результатов. " "\"Random\" и \"Date\" означают, что источник будет использован несколько " "дольше, пока не будет исчерпан. \"Favorites\" предоставит лучшие результаты, " "а \"Relevance\" предоставит точные совпадения при поиске по фразам и цветам." #: ../data/ui/AddWallhavenDialog.ui.h:8 ../data/ui/AddWallbaseDialog.ui.h:9 msgid "Enter keywords or paste URL here: " msgstr "Введите сюда ключевые слова или вставьте URL: " #: ../data/ui/AddWallhavenDialog.ui.h:9 ../data/ui/AddFlickrDialog.ui.h:16 #: ../data/ui/AddWallbaseDialog.ui.h:10 msgid "Just a moment to check this search" msgstr "Одну минуту, проверка поискового запроса" #: ../data/ui/AddWallhavenDialog.ui.h:10 ../data/ui/AddFlickrDialog.ui.h:17 #: ../data/ui/AddRedditDialog.ui.h:9 ../data/ui/AddMediaRssDialog.ui.h:6 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:10 #: ../data/ui/AddWallbaseDialog.ui.h:11 msgid " " msgstr " " #: ../variety/QuotesEngine.py:232 msgid "No quote plugins" msgstr "Нет расширений для цитат" #: ../variety/QuotesEngine.py:232 msgid "There are no quote plugins installed" msgstr "Не установлено ни одного расширения для цитат" #: ../variety/QuotesEngine.py:238 msgid "No suitable quote plugins" msgstr "Нет подходящих расширений для цитат" #: ../variety/QuotesEngine.py:239 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "" "У вас нет расширений, поддерживающих поиск по ключевым словам и авторам в " "цитатах" #: ../variety/QuotesEngine.py:251 msgid "Could not fetch quotes" msgstr "Не удалось загрузить цитаты" #: ../variety/QuotesEngine.py:252 msgid "Quotes services may be down, we will continue trying" msgstr "Возможно, сервис цитат недоступен, но мы продолжим попытки" #: ../variety/QuotesEngine.py:255 msgid "Could not find quotes" msgstr "Не удалось найти цитаты" #: ../variety/QuotesEngine.py:256 msgid "Maybe you are searching for something very obscure?" msgstr "Возможно, вы ищете что-то слишком неопределённое?" #: ../variety/Texts.py:20 msgid "Keep original" msgstr "Сохранить оригинал" #: ../variety/Texts.py:21 msgid "Grayscale" msgstr "Оттенки серого" #: ../variety/Texts.py:22 msgid "Heavy blur" msgstr "Жёсткое размытие" #: ../variety/Texts.py:23 msgid "Soft blur" msgstr "Мягкое размытие" #: ../variety/Texts.py:24 msgid "Oil painting" msgstr "Масляная живопись" #: ../variety/Texts.py:25 msgid "Pencil sketch" 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:37 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:38 msgid "Random wallpapers from Desktoppr.co" msgstr "Случайные обои с Desktoppr.co" #: ../variety/Texts.py:39 msgid "NASA's Astronomy Picture of the Day" msgstr "NASA: астрономическое фото дня" #: ../variety/Texts.py:41 msgid "World Sunlight Map - live wallpaper from Die.net" msgstr "Карта освещённости Земли Солнцем — живые обои с Die.net" #: ../variety/Texts.py:42 msgid "Bing Photo of the Day" msgstr "Фото дня от Bing" #: ../variety/Texts.py:43 msgid "High-resolution photos from Unsplash.com" msgstr "Фото высокого разрешения из Unsplash.com" #: ../variety/Texts.py:47 msgid "" "If you use KDE, you need to perform some actions before Variety will work. " "Please read here: http://peterlevi.com/variety/2014/05/variety-and-kde/" msgstr "" "Если у вас KDE, то необходимо выполнить некоторые действия, прежде чем " "Variety начнёт работать. Пожалуйста, прочтите здесь: " "http://peterlevi.com/variety/2014/05/variety-and-kde/" #: ../variety/Texts.py:48 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "Вы можете менять обои прокруткой колеса мыши на индикаторе." #: ../variety/Texts.py:49 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 " "~/.config/variety/scripts. There are examples there for various desktop " "environments." msgstr "" "Если вы хотите каждый раз при смене обоев выполнять свои команды или " "пользуетесь альтернативным окружением рабочего стола, пожалуйста, " "отредактируйте скрипты в ~/.config/variety/scripts. Примеры для различных " "рабочих сред помещены там же." #: ../variety/Texts.py:50 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:51 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:52 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:53 msgid "" "Adding your own custom filters is quite easy: open " "~/.config/variety/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 "" "Добавить свои собственные фильтры достаточно просто: откройте " "~/.config/variety/variety.conf в текстовом редакторе и воспользуйтесь " "существующими, как примером. Любой фильтр — всего лишь набор опций для " "команды преобразования из ImageMagick." #: ../variety/Texts.py:54 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:55 msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of ~/.config/variety/scripts/set_wallpaper." msgstr "" "Для включения уведомлений при смене обоев раскомментируйте две последние " "строки в файле ~/.config/variety/scripts/set_wallpaper." #: ../variety/Texts.py:56 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:57 msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "~/.config/variety/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 "" "Когда вы добавляете цитаты в Избранные, они по умолчанию сохраняются в " "~/.config/variety/favorite_quotes.txt. Этот файл совместим с локальным " "источником цитат Variety. Если хотите его использовать, скопируйте в " "~/.config/variety/pluginconfig/quotes/ и задействуйте локальный источник " "цитат. Этот файл также совсестим с Unix-утилитой fortune." #: ../variety/PreferencesVarietyDialog.py:259 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:382 #: ../variety/PreferencesVarietyDialog.py:551 #: ../data/ui/PreferencesVarietyDialog.ui.h:11 msgid "Images" msgstr "Изображения" #: ../variety/PreferencesVarietyDialog.py:383 msgid "Folders" msgstr "Папки" #: ../variety/PreferencesVarietyDialog.py:385 #: ../data/ui/AddFlickrDialog.ui.h:2 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:389 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:2 msgid "Wallpapers.net" msgstr "Wallpapers.net" #: ../variety/PreferencesVarietyDialog.py:390 #: ../data/ui/AddRedditDialog.ui.h:2 msgid "Reddit" msgstr "Reddit" #: ../variety/PreferencesVarietyDialog.py:391 #: ../data/ui/AddMediaRssDialog.ui.h:2 msgid "Media RSS" msgstr "Медиа RSS" #: ../variety/PreferencesVarietyDialog.py:416 msgid "Remove the source, keep the files" msgstr "Удалить источник, сохранить файлы" #: ../variety/PreferencesVarietyDialog.py:417 msgid "Remove the sources, keep the files" msgstr "Удалить источники, сохранить файлы" #: ../variety/PreferencesVarietyDialog.py:424 msgid "Remove the source and delete the downloaded files" msgstr "Удалить источник и загруженные файлы" #: ../variety/PreferencesVarietyDialog.py:425 msgid "Remove the sources and delete the downloaded files" msgstr "Удалить источники и загруженные файлы" #: ../variety/PreferencesVarietyDialog.py:458 msgid "World Sunlight Map enabled" msgstr "Включена карта освещённости Земли Солнцем" #: ../variety/PreferencesVarietyDialog.py:459 msgid "" "Using the World Sunlight Map requires both downloading and changing enabled " "at intervals of 30 minutes or less. Settings were adjusted automatically." msgstr "" "Карта освещённости требует загрузки и смены с интервалом 30 минут или " "меньше. Настройки скорректированы автоматически." #: ../variety/PreferencesVarietyDialog.py:544 msgid "Add Images" msgstr "Добавить изображения" #: ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Add" msgstr "Добавить" #: ../variety/PreferencesVarietyDialog.py:567 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Добавить папки — добавляйте только корневые папки, поиск в подпапках " "осуществляется автоматически." #: ../variety/PreferencesVarietyDialog.py:703 #: ../variety/PreferencesVarietyDialog.py:716 #: ../data/ui/PreferencesVarietyDialog.ui.h:168 msgid "Edit..." msgstr "Изменить..." #: ../variety/PreferencesVarietyDialog.py:710 msgid "View Image" msgstr "Показать изображение" #: ../variety/PreferencesVarietyDialog.py:713 msgid "Open Folder" msgstr "Открыть папку" #: ../variety/PreferencesVarietyDialog.py:1092 msgid "Recommended images source disabled" msgstr "Рекомендованные источники изображений отключены" #: ../variety/PreferencesVarietyDialog.py:1120 #: ../variety/PreferencesVarietyDialog.py:1139 #: ../variety/PreferencesVarietyDialog.py:1147 msgid "No write permissions" msgstr "Нет прав для записи" #: ../variety/PreferencesVarietyDialog.py:1127 msgid "Limit disabled" msgstr "Лимит отключён" #: ../variety/PreferencesVarietyDialog.py:1128 msgid "" "Changing the download folder automatically turns off the size limit to " "prevent from accidental data loss" msgstr "" "Смена папки загрузки автоматически отключает ограничение размера для " "предотвращения случайной потери данных" #: ../variety/PreferencesVarietyDialog.py:1134 #, python-format msgid "Actual download folder: %s " msgstr "Указанная папка загрузки: %s " #: ../variety/PreferencesVarietyDialog.py:1214 msgid "Could not adjust permissions" msgstr "Не удалось настроить права доступа" #: ../variety/PreferencesVarietyDialog.py:1215 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Вы можете попробовать выполнить эту команду вручную:\n" "sudo chmod %s \"%s\"" #: ../variety/PreferencesVarietyDialog.py:1247 msgid "Logged in as: " msgstr "Авторизовано как: " #: ../variety/PreferencesVarietyDialog.py:1249 msgid "Anonymous" msgstr "Аноним" #: ../variety/PreferencesVarietyDialog.py:1250 #: ../data/ui/PreferencesVarietyDialog.ui.h:109 msgid "Login or register" msgstr "Войти или зарегистрироваться" #: ../variety/PreferencesVarietyDialog.py:1250 msgid "Switch user" msgstr "Сменить пользователя" #: ../data/ui/AddFlickrDialog.ui.h:1 msgid "Variety - add Flickr as an image source" msgstr "Variety — добавление источника изображений Flickr" #: ../data/ui/AddFlickrDialog.ui.h:3 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.h:4 #: ../data/ui/PreferencesVarietyDialog.ui.h:58 msgid "Tags: " msgstr "Теги: " #: ../data/ui/AddFlickrDialog.ui.h:5 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.h:7 msgid "User: " msgstr "Пользователь: " #: ../data/ui/AddFlickrDialog.ui.h:8 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.h:10 msgid "Group: " msgstr "Группа: " #: ../data/ui/AddFlickrDialog.ui.h:11 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/group" "s/wallpapers/" msgstr "" "Пожалуйста, вставьте URL-адрес группы.\n" "Пример: http://www.flickr.com/group" "s/wallpapers/" #: ../data/ui/AddFlickrDialog.ui.h:13 msgid "Text:" msgstr "Текст:" #: ../data/ui/AddFlickrDialog.ui.h:14 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by " "prepending them with -.\n" "Example: apple -pie" msgstr "" "Свободный поиск по тексту заголовков, описаний и тегов фотографий. " "Исключаемые параметры предваряются знаком «-».\n" "Например: яблочный -пирог" #: ../variety/AddMediaRssDialog.py:40 msgid "" "This does not seem to be a valid Media RSS feed URL or there is no content " "there." msgstr "Это не похоже на URL фида медиа-RSS либо нет доступа." #: ../variety/VarietyWindow.py:630 ../variety/VarietyWindow.py:772 #: ../variety/VarietyWindow.py:2650 msgid "Already in Favorites" msgstr "Всегда в Избранные" #: ../variety/VarietyWindow.py:634 ../variety/ThumbsManager.py:144 #: ../variety/indicator.py:76 msgid "Copy to _Favorites" msgstr "Копировать в Избр_анные" #: ../variety/VarietyWindow.py:635 ../variety/ThumbsManager.py:151 msgid "Move to _Favorites" msgstr "Переместить в Избр_анные" #. both #: ../variety/VarietyWindow.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:165 ../variety/indicator.py:81 msgid "Move to Favorites" msgstr "Переместить в Избранные" #: ../variety/VarietyWindow.py:665 ../variety/ThumbsManager.py:119 msgid "Fetched: Show Origin" msgstr "Выбранное: Показать оригиналы" #: ../variety/VarietyWindow.py:667 ../variety/VarietyWindow.py:762 #: ../variety/ThumbsManager.py:121 #, python-format msgid "View at %s" msgstr "Показать на %s" #: ../variety/VarietyWindow.py:711 msgid "Unknown" msgstr "Неизвестно" #: ../variety/VarietyWindow.py:732 #, python-format msgid "Author: %s" msgstr "Автор: %s" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 #: ../variety/indicator.py:120 ../variety/indicator.py:185 msgid "Pause on current" msgstr "Приостановить на текущем" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 msgid "Resume regular changes" msgstr "Возобновить регулярные изменения" #: ../variety/VarietyWindow.py:772 ../variety/indicator.py:191 msgid "Save to Favorites" msgstr "Сохранить в Favorites" #: ../variety/VarietyWindow.py:904 msgid "Filtering too strict?" msgstr "Фильтр слишком строг?" #: ../variety/VarietyWindow.py:905 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "" "Variety находит мало фотографий, подходящих вашим критериям фильтрации " "изображений" #: ../variety/VarietyWindow.py:1377 msgid "Please add more image sources or wait for some downloads" msgstr "" "Пожалуйста, добавьте несколько источников изображения или дождитесь загрузки" #: ../variety/VarietyWindow.py:1379 msgid "Please add more image sources" msgstr "Пожалуйста, добавьте несколько источников изображения" #: ../variety/VarietyWindow.py:1380 msgid "No more wallpapers" msgstr "Больше нет изображений" #: ../variety/VarietyWindow.py:1566 msgid "Current wallpaper is not in the image sources" msgstr "Данное изображение отсутствует в источнике" #: ../variety/VarietyWindow.py:1601 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "Не могу перенести в %s. Возможно не достаточно прав для перемещения." #: ../variety/VarietyWindow.py:1603 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" "Не могу скопировать в %s. Возможно не достаточно прав для копирования." #: ../variety/VarietyWindow.py:1623 ../variety/VarietyWindow.py:1643 msgid "Cannot delete" msgstr "Не могу удалить" #: ../variety/VarietyWindow.py:1624 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "У вас нет прав для удаления %s в корзину." #: ../variety/VarietyWindow.py:1644 msgid "" "Probably there is no utility for moving to Trash?\n" "Please install trash-cli or gvfs-bin or konquerer." msgstr "" "Утилита удаления в Корзину не установлена?\n" "Пожалуйста, установите trash-cli, или gvfs-bin, или konquerer." #: ../variety/VarietyWindow.py:1776 msgid "Anonymous usage statistics" msgstr "Анонимная статистика использования" #: ../variety/VarietyWindow.py:1777 msgid "" "Variety collects anonymous usage statistics. \n" "These help us make it better and are not shared with anyone. \n" "To read more or turn them off, go to \"Sync and social\"" msgstr "" "Variety собирает анонимную статистику использования. \n" "Она помогает нам улучшать программу и не передаётся кому-либо ещё. \n" "Прочитать подробнее или отключить функцию можно на вкладке «Синхронизация и " "общество»" #: ../variety/VarietyWindow.py:1920 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:1945 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 /some/local/image.jpg --next" msgstr "" "%prog [опции] [файлы или адреса]\n" "\n" "Передача локальных файлов добавит их в очередь Variety.\n" "Передача удаленных URL-адресов добавит их в выбранную папку и поместит их в " "очередь.\n" "\n" "Чтобы установить конкретную картинку: %prog /любая/локальная/картинка.jpg --" "next" #: ../variety/VarietyWindow.py:1955 msgid "" "Show logging messages (-vv shows even finer debugging messages, -vvv debugs " "variety_lib too)" msgstr "" "Показывать журналируемые сообщения (-vv показывает более тонкие отладочные " "сообщения, -vvv ещё и относящиеся к variety_lib)" #: ../variety/VarietyWindow.py:1959 msgid "Make the running instance quit" msgstr "Выйти из запущенного приложения" #: ../variety/VarietyWindow.py:1963 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" "Отобразить путь к изображению с рабочего стола. Работает только при " "запущенном приложении." #: ../variety/VarietyWindow.py:1967 msgid "Show Next wallpaper" msgstr "Показать следующие обои" #: ../variety/VarietyWindow.py:1971 msgid "Show Previous wallpaper" msgstr "Показать предыдущие обои" #: ../variety/VarietyWindow.py:1975 msgid "Show Next wallpaper, skipping the forward history" msgstr "Показать следующее изображение игнорируя историю" #: ../variety/VarietyWindow.py:1979 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Переместить текущие обои в Корзину. Работает только при запущенном " "приложении." #: ../variety/VarietyWindow.py:1983 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Копировать текущие обои в Избранные. Работает только при запущенном " "приложении." #: ../variety/VarietyWindow.py:1987 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Переместить текущие обои в Избранные. Работает только при запущенном " "приложении." #: ../variety/VarietyWindow.py:1991 msgid "Pause on current image" msgstr "Приостановить на текущем изображении" #: ../variety/VarietyWindow.py:1995 msgid "Resume regular image changes" msgstr "Возобновить регулярную смену изображений" #: ../variety/VarietyWindow.py:1999 msgid "Toggle Pause/Resume state" msgstr "Переключение пауза\\воспроизведение" #: ../variety/VarietyWindow.py:2003 msgid "Show Next quote" msgstr "Показать следующую цитату" #: ../variety/VarietyWindow.py:2007 msgid "Show Previous quote" msgstr "Показать предыдущую цитату" #: ../variety/VarietyWindow.py:2011 msgid "Show Next quote, skipping the forward history" msgstr "Показать следующую цитату игнорируя историю" #: ../variety/VarietyWindow.py:2015 msgid "Toggle Quotes Pause/Resume state" msgstr "Переключение пауза\\воспроизведение для цитат" #: ../variety/VarietyWindow.py:2019 msgid "Save the current quote to Favorites" msgstr "Сохранить текущую цитату в Favorites" #: ../variety/VarietyWindow.py:2023 msgid "Toggle History display" msgstr "Переключить отображение истории" #: ../variety/VarietyWindow.py:2027 msgid "Toggle Recent Downloads display" msgstr "Переключить отображение последних загрузок" #: ../variety/VarietyWindow.py:2031 msgid "Show Preferences dialog" msgstr "Показать диалог настроек" #: ../variety/VarietyWindow.py:2035 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Показать переключатель обоев — панель эскизов изображений из активных " "интернет-источников" #: ../variety/VarietyWindow.py:2039 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/VarietyWindow.py:2053 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "опции --next/--fast-forward и --previous взаимоисключающие" #: ../variety/VarietyWindow.py:2056 msgid "options --trash and --favorite are mutually exclusive" msgstr "опции --trash и --favorite взаимоисключающие" #: ../variety/VarietyWindow.py:2059 msgid "options --pause and --resume are mutually exclusive" msgstr "опции --pause и --resume взаимоисключающие" #: ../variety/VarietyWindow.py:2062 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "опции --quotes-next/--quotes-fast-forward и --quotes-previous " "взаимоисключающие" #: ../variety/VarietyWindow.py:2179 ../variety/ImageFetcher.py:60 #: ../variety/ImageFetcher.py:71 ../variety/ImageFetcher.py:78 #: ../variety/ImageFetcher.py:112 msgid "Not an image" msgstr "Не изображение" #: ../variety/VarietyWindow.py:2184 msgid "Added to queue" msgstr "Добавлено в очередь" #: ../variety/VarietyWindow.py:2185 ../variety/VarietyWindow.py:2191 msgid "Press Next to see it" msgstr "Нажмите Далее для просмотра" #: ../variety/VarietyWindow.py:2191 msgid "Fetched" msgstr "Полученные" #: ../variety/VarietyWindow.py:2237 msgid "Unsupported source type" msgstr "Неподдерживаемый тип источника" #: ../variety/VarietyWindow.py:2238 ../variety/VarietyWindow.py:2286 msgid "Are you running the most recent version of Variety?" msgstr "Вы используете последнюю версию Variety?" #: ../variety/VarietyWindow.py:2244 msgid "New image source added" msgstr "Новый источник изображений добавлен" #: ../variety/VarietyWindow.py:2246 msgid "Image source already exists, enabling it" msgstr "Такой источник изображений уже существует, включаю его" #: ../variety/VarietyWindow.py:2272 msgid "Fetched and applied" msgstr "Загружено и применено" #: ../variety/VarietyWindow.py:2282 msgid "It works!" msgstr "Работает!" #: ../variety/VarietyWindow.py:2282 msgid "Yay, Variety links work. Great!" msgstr "Ура, ссылки Variety работают. Великолепно!" #: ../variety/VarietyWindow.py:2286 msgid "Unsupported command" msgstr "Неподдерживаемая команда" #: ../variety/VarietyWindow.py:2288 msgid "Could not process the given variety:// URL" msgstr "Не удалось обработать данный variety:// URL" #: ../variety/VarietyWindow.py:2289 msgid "Run with logging enabled to see details" msgstr "Запуск с ведением журнала, чтобы видеть детали" #: ../variety/VarietyWindow.py:2488 msgid "Do not ask anymore, always use the current quote" msgstr "Больше не спрашивать и всегда использовать текущую цитату" #: ../variety/VarietyWindow.py:2491 ../data/ui/FacebookPublishDialog.ui.h:5 msgid "Do not ask anymore, always use the text above" msgstr "Не спрашивать больше, всегда использовать текст выше" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "Published" msgstr "Опубликовано" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "You may open your Facebook feed to see the post" msgstr "Вы можете перейти к своим фидам в Facebook для просмотра поста" #: ../variety/VarietyWindow.py:2526 ../variety/VarietyWindow.py:2555 msgid "Could not publish" msgstr "Не могу опубликовать" #: ../variety/VarietyWindow.py:2718 msgid "Could not create autostart entry" msgstr "Не удалось создать запись в автозагрузке" #: ../variety/VarietyWindow.py:2719 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:2769 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:2769 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/FacebookFirstRunDialog.ui.h:1 msgid "Variety - Facebook Sharing" msgstr "Variety — поделиться в Facebook" #: ../data/ui/FacebookFirstRunDialog.ui.h:2 #: ../data/ui/PreferencesVarietyDialog.ui.h:169 msgid "Facebook Sharing" msgstr "Поделиться в Facebook" #: ../data/ui/FacebookFirstRunDialog.ui.h:3 msgid "" "You are sharing on Facebook for the first time. Sharing from Variety is " "available for images that come from online sources and for quotes. It works " "this way: \n" "\n" "1. Login to Facebook\n" "Facebook will open in your default browser. You will be prompted to login if " "you are not already logged in. \n" "\n" "2. Authorize Variety to publish to your " "feed.\n" "You will be asked to allow Variety to publish to your feed on your behalf. " "Variety will only use this permission to publish those images and quotes " "that you tell it to, nothing else.\n" "\n" "3. Configure browser to open variety:// links " "with Variety or xdg-open\n" "Then you will be redirected to a page with instructions to associate " "\"variety://\" links with Variety in your browser. Please follow these " "instructions to complete the setup. You have to do this only once.\n" "\n" "No passwords or login information is kept locally, just an OAuth Facebook " "token that will be valid for a couple of weeks. After its validity expires " "you will be asked to login again." msgstr "" "Вы впервые делитесь в Facebook. Публикация из Variety доступна для " "изображений, полученных из интернет-источников, и цитат. Работает так: \n" "\n" "1. Войдите в Facebook\n" "Facebook откроется в вашем браузере по умолчанию. Вам будет предложено " "войти, если вы не сделали этого ранее. \n" "\n" "2. Авторизуйте Variety для публикации в вашей " "ленте.\n" "У вас будет запрошено разрешение Variety публиковать в вашей ленте от вашего " "имени. Variety будет пользоваться этим разрешением, только для публикации " "тех изображений и цитат, которые вы сами укажете, и ни для чего больше.\n" "\n" "3. Настройте браузер на открытие variety:// " "ссылок Variety или xdg-open\n" "Затем вас перенаправит на страницу с инструкциями по ассоциации " "\"variety://\" ссылок Variety в вашем браузере. Пожалуйста, следуйте этим " "инструкциям, чтобы завершить настройку. Это придётся сделать лишь однажды.\n" "\n" "Никакие пароли или логины не хранятся локально, только OAuth токен Facebook, " "действительный пару недель. Когда срок его действия истечёт, вам будет " "предложено авторизоваться снова." #: ../variety/AddWallpapersNetCategoryDialog.py:40 msgid "Could not find wallpapers there. Please check the URL." msgstr "Не могу найти там изображений. Проверьте URL." #: ../data/ui/WelcomeDialog.ui.h:1 msgid "Welcome to Variety!" msgstr "Добро пожаловать в Variety!" #: ../data/ui/WelcomeDialog.ui.h:2 ../data/ui/SmartFeaturesNoticeDialog.ui.h:3 msgid "Continue" msgstr "Продолжить" #: ../data/ui/WelcomeDialog.ui.h:3 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.h:4 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.h:5 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" "Теперь уделите, пожалуйста, немного времени настройкам на следующих экранах." #: ../data/ui/WelcomeDialog.ui.h:6 msgid "KDE Users - Important, please read:" msgstr "Пользователям KDE — пожалуйста, прочтите, это важно:" #: ../data/ui/WelcomeDialog.ui.h:7 msgid "" "You appear to be running KDE. In KDE 4 it is impossible to set the wallpaper " "from inside a program - there is no API for this. To make Variety work, please read " "and follow the instructions here." msgstr "" "Вероятно, вы работаете в KDE. В KDE 4 невозможно менять обои прямо из " "программы — нет API для этого. Чтобы Variety заработала, пожалуйста, " "прочтите и выполните инструкции." #: ../data/ui/AddRedditDialog.ui.h:1 msgid "Variety - add Reddit feed" msgstr "Variety — добавление ленты Reddit" #: ../data/ui/AddRedditDialog.ui.h:3 msgid "" "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" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:7 msgid "URL or name of a subreddit: " msgstr "URL или название сабреддита: " #: ../data/ui/AddRedditDialog.ui.h:8 msgid "Just a moment to check what's there" msgstr "Минутку, проверим, что там" #: ../data/ui/AddMediaRssDialog.ui.h:1 msgid "Variety - add Media RSS feed" msgstr "Variety — добавление ленты медиа RSS" #: ../data/ui/AddMediaRssDialog.ui.h:3 msgid "" "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." msgstr "" "Пожалуйста, вставьте URL канала Медиа RSS ниже. Обратите внимание, что " "поддерживаются только каналы Медиа RSS, а не произвольные ленты RSS. Медиа " "RSS каналы содержат тег media:content, ссылающийся непосредственно на само " "изображение. Некоторые примеры сайтов, предоставляющих Медиа RSS каналы: Picasa, deviantART, SmugMug, Flickr, InterfaceLIFT." #: ../data/ui/AddMediaRssDialog.ui.h:4 msgid "Paste the URL of the Media RSS feed here: " msgstr "Вставьте URL канала Медиа RSS сюда: " #: ../data/ui/AddMediaRssDialog.ui.h:5 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:9 msgid "Just a moment to check what's at that URL" msgstr "Минутку, проверим, что по этому адресу" #: ../variety/AddRedditDialog.py:43 msgid "This does not seem to be a valid Reddit URL" msgstr "Не похоже на допустимый URL Реддит" #: ../variety/AddRedditDialog.py:46 msgid "We could not find any image submissions there." msgstr "Не удаётся найти изображения по данному запросу" #: ../variety/Smart.py:111 msgid "" "Your smart_user.json config file appears broken. You may have to login again " "to VRTY.ORG." msgstr "" "Конфигурационный файл \"smart_user.json\" испорчен. Перезайдите на VRTY.ORG." #: ../variety/Smart.py:195 msgid "Your VRTY.ORG credentials are probably outdated. Please login again." msgstr "Данные для входа на сайт VRTY.ORG устарели. Перезайдите." #: ../variety/Smart.py:597 ../variety/Smart.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:111 msgid "Sync" msgstr "Синхронизация" #: ../variety/Smart.py:598 #, python-format msgid "Fetching %d images" msgstr "Загружено изображений: %d" #: ../variety/Smart.py:598 msgid "Fetching 1 image" msgstr "Загружено 1 изображение" #: ../variety/Smart.py:643 msgid "Finished" msgstr "Завершено" #: ../variety/Smart.py:664 #, python-format msgid "Logged in as %s" msgstr "Авторизовано как %s" #: ../variety/Smart.py:676 #, python-format msgid "" "Do you want to login to VRTY.ORG as %s?" msgstr "Выполнить вход на VRTY.ORG как %s?" #: ../variety/Smart.py:677 msgid "VRTY.ORG login confirmation" msgstr "Подтверждение логина для VRTY.ORG" #: ../data/plugins/quotes/QuotationsPageSource.py:35 msgid "Fetches quotes from TheQuotationsPage.com" msgstr "Загружать цитаты с TheQuotationsPage.com" #: ../variety/__init__.py:143 msgid "Terminating signal received, quitting..." msgstr "Получен сигнал отмены - выхожу..." #: ../variety/__init__.py:198 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Variety уже запущена. Отправка команды на запущенный экземпляр." #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:1 msgid "VRTY.ORG integration" msgstr "Интеграция с VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:2 msgid "This feature requires VRTY.ORG integration" msgstr "Опция требует интеграции с VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:3 msgid "Enable VRTY.ORG integration" msgstr "Включить интеграцию с VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:4 msgid "" "For this feature Variety needs permission to collect data about the images " "you like or dislike and the online sources you have enabled.\n" "\n" "Collected data is anonymous by default and covers only images which Variety " "downloaded, never images you already had in your local folders that might be " "private.\n" "\n" "This data helps us provide better images for everyone and fuels VRTY.ORG - a valuable resource for all users " "of Variety." msgstr "" "Для работы опции, программе нужно знать, какие изображения вам (не) нравятся " "и какие онлайн-ресурсы использовать.\n" "\n" "Собранные данные анонимны и относятся только к изображениям, которые скачаны " "программой, – изображения, изначально бывшие на компьютере, остаются " "личными.\n" "\n" "Эти данные помогают нам предоставлять лучшие изображения и обеспечивать VRTY.ORG – ресурс для всех пользователей " "Variety." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:1 msgid "Variety - VRTY.ORG" msgstr "Variety — VRTY.ORG" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:2 msgid "No, thanks" msgstr "Нет, спасибо" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:4 msgid "" "Introducing VRTY.ORG! Wanna take part?" msgstr "" "Представляем VRTY.ORG! Желаете присоединиться?" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:5 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to find and add new image sources to Variety, and to follow other users' " "favorites." msgstr "" "VRTY.ORG объединяет пользователей Variety " "со схожими вкусами и предоставляет супер-удобные пути, чтобы менять обои, " "находить и добавлять новые источники изображений в Variety и следовать " "избранным других пользователей." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:6 msgid "" "Participation takes no effort - your profile will be built automatically, as " "you like or dislike images downloaded by Variety. Your profile will not be " "shared with third parties, unless you opt-in to make it public. Read more details about the " "service and the privacy policy here." msgstr "" "Участвовать очень просто - профиль создаётся автоматически, по мере оценки " "изображений, скачанных Variety. Профиль защищён от третьих лиц, если профиль " "не является публичным. Ознакомиться с правилами сервиса и политикой приватности." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:7 msgid "" "Participation is required for some features of Variety such as synchronization of favorites between computers." msgstr "" "Участие необходимо для таких опций Variety как, например, синхронизация избранного между компьютерами." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:8 #: ../data/ui/PreferencesVarietyDialog.ui.h:105 msgid "Participate in VRTY.ORG" msgstr "Участвовать в VRTY.ORG" #: ../data/plugins/quotes/QuotesDaddySource.py:31 msgid "" "Fetches quotes from QuotesDaddy's daily quotes RSS feed.\n" "Does not support searching by tags or authors." msgstr "" "Загружать цитаты из RSS ленты QuotesDaddy.\n" "Поиск по тегам и авторам не поддерживается." #: ../data/ui/AboutVarietyDialog.ui.h:1 msgid "Copyright (c) 2012, Peter Levi " msgstr "Авторские права © 2012, Peter Levi " #: ../data/ui/AboutVarietyDialog.ui.h:2 msgid "About Variety" msgstr "О Variety" #: ../data/ui/AboutVarietyDialog.ui.h:3 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Автоматический сменщик, загрузчик и менеджер обоев." #: ../data/ui/AboutVarietyDialog.ui.h:4 msgid "http://peterlevi.com/variety" msgstr "http://peterlevi.com/variety" #: ../data/ui/AboutVarietyDialog.ui.h:5 msgid "" "# Copyright (c) 2012, Peter Levi \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 "" "# Авторские права © 2012, Peter Levi \n" "# Это свободное программное обеспечение; вы можете распространять и/или " "изменять его \n" "# на условиях лицензии GNU General Public License версии 3, опубликованной \n" "# Фондом свободного программного обеспечения.\n" "# \n" "# Эта программа распространяется в надежде, что она будет полезной, но \n" "# БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемых гарантий \n" "# КОММЕРЧЕСКОЙ ВЫГОДЫ, УДОВЛЕТВОРИТЕЛЬНОГО КАЧЕСТВА или ПРИГОДНОСТИ ДЛЯ " "КОНКРЕТНОЙ \n" "# ЦЕЛИ. Для получения дополнительных сведений обратитесь к лицензии GNU " "General Public License.\n" "# \n" "# Вы должны были получить копию GNU General Public License \n" "# с этой программой. Если нет, смотрите .\n" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:1 msgid "Variety - add Wallpapers.net category" msgstr "Variety — добавление категории с сайта Wallpapers.net" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:3 msgid "" "Please visit wallpapers.net and choose " "a category with wallpapers, then paste its URL below. A category is " "anything on the site that has one or more pages with wallpapers on them. " "Here are some examples:\n" "\n" "All wallpapers: http://www.wallpapers.net/\n" "Specific resolution: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" msgstr "" "Пожалуйста, посетите wallpapers.net и " "выберите категорию, затем вставьте её URL ниже. Категория — это что-либо на " "сайте, имеющее одну или более страниц с обоями. Вот несколько примеров:\n" "\n" "Все обои: http://www.wallpapers.net/\n" "Определённое разрешение: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:8 msgid "Paste URL here: " msgstr "Вставьте URL здесь: " #: ../data/ui/PreferencesVarietyDialog.ui.h:1 msgid "seconds" msgstr "секунды" #: ../data/ui/PreferencesVarietyDialog.ui.h:2 msgid "minutes" msgstr "минуты" #: ../data/ui/PreferencesVarietyDialog.ui.h:3 msgid "hours" msgstr "часы" #: ../data/ui/PreferencesVarietyDialog.ui.h:4 msgid "days" msgstr "дни" #: ../data/ui/PreferencesVarietyDialog.ui.h:5 msgid "Variety Preferences" msgstr "Параметры Variety" #: ../data/ui/PreferencesVarietyDialog.ui.h:6 msgid "General" msgstr "Основные" #: ../data/ui/PreferencesVarietyDialog.ui.h:7 msgid "Start Variety when the computer starts" msgstr "Запускать Variety при старте системы" #: ../data/ui/PreferencesVarietyDialog.ui.h:8 msgid "Change wallpaper every " msgstr "Менять обои каждые " #: ../data/ui/PreferencesVarietyDialog.ui.h:9 msgid "Minimum interval is 5 seconds" msgstr "Минимальный интервал 5 секунд" #: ../data/ui/PreferencesVarietyDialog.ui.h:10 msgid "Change wallpaper on start" msgstr "Менять обои при запуске" #: ../data/ui/PreferencesVarietyDialog.ui.h:12 msgid "Enabled" msgstr "Включено" #: ../data/ui/PreferencesVarietyDialog.ui.h:13 msgid "Type" msgstr "Тип" #: ../data/ui/PreferencesVarietyDialog.ui.h:14 msgid "Location" msgstr "Расположение" #: ../data/ui/PreferencesVarietyDialog.ui.h:15 msgid "_Add..." msgstr "_Добавить…" #: ../data/ui/PreferencesVarietyDialog.ui.h:16 msgid "Add images, folders or online image sources" msgstr "Добавить изображения, папки или интернет-источники" #: ../data/ui/PreferencesVarietyDialog.ui.h:17 msgid "_Edit..." msgstr "_Изменить…" #: ../data/ui/PreferencesVarietyDialog.ui.h:18 msgid "Edit the selected source" msgstr "Изменить выделенный источник" #: ../data/ui/PreferencesVarietyDialog.ui.h:19 msgid "_Remove..." msgstr "_Удалить..." #: ../data/ui/PreferencesVarietyDialog.ui.h:20 msgid "Remove selected image sources" msgstr "Удалить выделенные источники изображений" #: ../data/ui/PreferencesVarietyDialog.ui.h:21 msgid "_Use" msgstr "_Применить" #: ../data/ui/PreferencesVarietyDialog.ui.h:22 msgid "Enable the selected sources and disable all others" msgstr "Включить выбранные источники и отключить остальные" #: ../data/ui/PreferencesVarietyDialog.ui.h:23 msgid "Download a wallpaper every " msgstr "Загружать обои каждые " #: ../data/ui/PreferencesVarietyDialog.ui.h:24 msgid "Minimum interval is one minute" msgstr "Минимальный интервал — 1 минута" #: ../data/ui/PreferencesVarietyDialog.ui.h:25 msgid "to " msgstr "в " #: ../data/ui/PreferencesVarietyDialog.ui.h:26 msgid "Actual download folder " msgstr "Папка загрузки " #: ../data/ui/PreferencesVarietyDialog.ui.h:27 msgid "" "Caution: do NOT use this option if you use a custom download folder with " "valuable files in it. Variety will maintain the limit regardless of what is " "in the download folder." msgstr "" "Внимание: НЕ используйте эту опцию, если в указанной вами папке загрузки " "есть ценные файлы. Variety будет придерживаться лимита независимо от " "содержимого папки." #: ../data/ui/PreferencesVarietyDialog.ui.h:28 msgid "Limit download folder to " msgstr "Ограничить размер папки загрузки до " #: ../data/ui/PreferencesVarietyDialog.ui.h:29 msgid "Minimum size is 50 MB" msgstr "Минимальный размер 50 МБ" #: ../data/ui/PreferencesVarietyDialog.ui.h:30 msgid "MB by deleting oldest files when necessary" msgstr "МБ, при необходимости удаляя старые файлы" #: ../data/ui/PreferencesVarietyDialog.ui.h:31 msgid "Favorites" msgstr "Избранные" #: ../data/ui/PreferencesVarietyDialog.ui.h:32 msgid "Copy favorite wallpapers to " msgstr "Копировать избранные обои в " #: ../data/ui/PreferencesVarietyDialog.ui.h:33 msgid "Filters" msgstr "Фильтры" #: ../data/ui/PreferencesVarietyDialog.ui.h:34 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" "Применять случайные фильтры к отображаемым обоям (спасибо чудесному " "ImageMagick):" #: ../data/ui/PreferencesVarietyDialog.ui.h:35 msgid "Quotes" msgstr "Цитаты" #: ../data/ui/PreferencesVarietyDialog.ui.h:36 msgid "Show random wise quotes on the desktop" msgstr "Показывать случайные мудрые цитаты на рабочем столе" #: ../data/ui/PreferencesVarietyDialog.ui.h:37 msgid "Text color: " msgstr "Цвет текста: " #: ../data/ui/PreferencesVarietyDialog.ui.h:38 msgid "Text font: " msgstr "Шрифт текста: " #: ../data/ui/PreferencesVarietyDialog.ui.h:39 msgid "Backdrop color: " msgstr "Цвет фона: " #: ../data/ui/PreferencesVarietyDialog.ui.h:40 msgid "Backdrop opacity: " msgstr "Прозрачность фона: " #: ../data/ui/PreferencesVarietyDialog.ui.h:41 msgid " Transparent" msgstr " Прозрачный" #: ../data/ui/PreferencesVarietyDialog.ui.h:42 msgid "Opaque" msgstr "Непрозрачный" #: ../data/ui/PreferencesVarietyDialog.ui.h:43 msgid "Draw a text shadow" msgstr "Рисовать текст с тенью" #: ../data/ui/PreferencesVarietyDialog.ui.h:44 msgid "Appearance" msgstr "Внешний вид" #: ../data/ui/PreferencesVarietyDialog.ui.h:45 msgid "Quotes area width: " msgstr "Ширина области цитат: " #: ../data/ui/PreferencesVarietyDialog.ui.h:46 msgid "Narrow " msgstr "Узкая " #: ../data/ui/PreferencesVarietyDialog.ui.h:47 msgid "Wide" msgstr "Широкая" #: ../data/ui/PreferencesVarietyDialog.ui.h:48 msgid "Horizontal position: " msgstr "Горизонтальное положение: " #: ../data/ui/PreferencesVarietyDialog.ui.h:49 msgid "Left " msgstr "Слева " #: ../data/ui/PreferencesVarietyDialog.ui.h:50 ../variety/ThumbsManager.py:44 msgid "Right" msgstr "Справа" #: ../data/ui/PreferencesVarietyDialog.ui.h:51 msgid "Vertical position: " msgstr "Вертикальное положение: " #: ../data/ui/PreferencesVarietyDialog.ui.h:52 msgid "Top " msgstr "Сверху " #: ../data/ui/PreferencesVarietyDialog.ui.h:53 ../variety/ThumbsManager.py:41 msgid "Bottom" msgstr "Снизу" #: ../data/ui/PreferencesVarietyDialog.ui.h:54 msgid "Placement" msgstr "Расположение" #: ../data/ui/PreferencesVarietyDialog.ui.h:55 msgid "Show quotes from these sources: " msgstr "Показывать цитаты из этих источников: " #: ../data/ui/PreferencesVarietyDialog.ui.h:56 msgid "" "More " "plugins" msgstr "" "Больше " "расширений" #: ../data/ui/PreferencesVarietyDialog.ui.h:57 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" "Показывать только эти теги и авторов (оставьте пустым для отображения " "случайных цитат)." #: ../data/ui/PreferencesVarietyDialog.ui.h:59 msgid "Example: funny, inspirational" msgstr "Пример: funny, inspirational" #: ../data/ui/PreferencesVarietyDialog.ui.h:60 msgid "Example: Albert Einstein, Voltaire" msgstr "Пример: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui.h:61 msgid "Authors: " msgstr "Авторы: " #: ../data/ui/PreferencesVarietyDialog.ui.h:62 msgid "Sources and filtering" msgstr "Источники и фильтры" #: ../data/ui/PreferencesVarietyDialog.ui.h:63 msgid "Change quote every " msgstr "Менять цитату через " #: ../data/ui/PreferencesVarietyDialog.ui.h:64 msgid "Minimum interval is 10 seconds" msgstr "Минимальный интервал 10 секунд" #: ../data/ui/PreferencesVarietyDialog.ui.h:65 msgid "Regular change" msgstr "Постоянная смена" #: ../data/ui/PreferencesVarietyDialog.ui.h:66 msgid "Clock" msgstr "Часы" #: ../data/ui/PreferencesVarietyDialog.ui.h:67 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "" "Показывать на рабочем столе большие симпатичные цифровые часы с текущими " "временем и датой" #: ../data/ui/PreferencesVarietyDialog.ui.h:68 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.h:69 msgid "Clock font: " msgstr "Шрифт часов: " #: ../data/ui/PreferencesVarietyDialog.ui.h:70 msgid "Date font: " msgstr "Шрифт даты: " #: ../data/ui/PreferencesVarietyDialog.ui.h:71 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "Не работают? Читай тут. Как " "ещё настроить часы? Прочти " "здесь." #: ../data/ui/PreferencesVarietyDialog.ui.h:72 msgid "Effects" msgstr "Эффекты" #: ../data/ui/PreferencesVarietyDialog.ui.h:73 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:74 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:75 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:76 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:77 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:78 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:79 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:80 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:81 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:82 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:83 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:84 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:85 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:86 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:87 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:88 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:89 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:90 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:91 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:92 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:93 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:94 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:95 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:96 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:97 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:98 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:99 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:100 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:101 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:102 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:103 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:104 msgid "VRTY.ORG" msgstr "VRTY.ORG" #: ../data/ui/PreferencesVarietyDialog.ui.h:106 msgid "VRTY.ORG is in beta and will take some time to mature" msgstr "" "VRTY.ORG на стадии бета-тестирования, и развитие займёт некоторое время" #: ../data/ui/PreferencesVarietyDialog.ui.h:107 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to add new image sources to Variety, and to follow other users' favorites. " "It is fueled by the favorite images of all participating users." msgstr "" "VRTY.ORG объединяет пользователей с " "похожими вкусами и предоставляет удобные способы изменять обои, добавлять " "новые источники изображений и следить за избранным других пользователей. " "Сервис пополняется любимыми изображениями всех участников." #: ../data/ui/PreferencesVarietyDialog.ui.h:108 msgid "" "Could not create user - no connection to VRTY.ORG. We will try again later." msgstr "" "Не удалось создать пользователя — нет соединения с VRTY.ORG. Попробуем ещё " "раз позже." #: ../data/ui/PreferencesVarietyDialog.ui.h:110 msgid "" "Registration enables cool features like synchronization of favorite images " "and sources between computers and personalized recommendations." msgstr "" "Регистрация включает такие отличные возможности, как синхронизация избранных " "изображений между компьютерами и личные рекомендации." #: ../data/ui/PreferencesVarietyDialog.ui.h:112 msgid "Synchronize favorite images between computers" msgstr "Синхронизировать избранные изображения между компьютерами" #: ../data/ui/PreferencesVarietyDialog.ui.h:113 msgid "Requires VRTY.ORG enabled and logged in." msgstr "Требуется включение VRTY.ORG и входа на него" #: ../data/ui/PreferencesVarietyDialog.ui.h:114 msgid "" "Your favorite images from other computers will be automatically downloaded " "to this computer. You need to be logged in with the same VRTY.ORG user " "everywhere. Sync will not delete any images." msgstr "" "Ваши избранные изображения с других компьютеров будут автоматически " "загружены на этот. Необходимо лишь войти на VRTY.ORG со всех устройств как " "один пользователь. Синхронизация не удалит никаких изображений." #: ../data/ui/PreferencesVarietyDialog.ui.h:115 msgid "Privacy policy" msgstr "Политика конфиденциальности" #: ../data/ui/PreferencesVarietyDialog.ui.h:116 msgid "" "Variety sends data only for images it downloaded, never for images you " "already had in your local folders that might be private, and Sync does not " "work for such images. Collected data is not shared with third parties, " "unless you opt-in to make your profile public. Read more details about the " "service and the privacy policy here." msgstr "" "Variety отсылает данные только о скачанном, – изображения, которые были на " "компьютере, остаются личными, их синхронизация невозможна. Данные не будут " "доступны третьим лицам, если профиль не объявлен публичным. Прочитать больше о сервисе и " "политике приватности." #: ../data/ui/PreferencesVarietyDialog.ui.h:117 msgid "Usage statistics" msgstr "Статистика использования" #: ../data/ui/PreferencesVarietyDialog.ui.h:118 msgid "Help make Variety better by sending anonymous usage statistics" msgstr "" "Помочь сделать Variety лучше, отправляя анонимную статистику использования" #: ../data/ui/PreferencesVarietyDialog.ui.h:119 msgid "" "These stats help us improve Variety by understanding how users interact with " "it. They also include general info about your OS version and monitor setup. " "Collected data is not shared with anyone." msgstr "" "Эта статистика поможет нам улучшить Variety, понять, как пользователи " "взаимодействуют с программой. Она также включает общую информацию о вашей ОС " "и настройках монитора. Собранные данные не будут переданы третьим лицам." #: ../data/ui/PreferencesVarietyDialog.ui.h:120 msgid "Sync and social" msgstr "Синхронизация и общество" #: ../data/ui/PreferencesVarietyDialog.ui.h:121 msgid "Fetch folder" msgstr "Загруженные вручную" #: ../data/ui/PreferencesVarietyDialog.ui.h:122 msgid "Save manually downloaded wallpapers to " msgstr "Сохранить загруженные вручную изображения в " #: ../data/ui/PreferencesVarietyDialog.ui.h:123 msgid "Drag and drop" msgstr "Перетаскивание" #: ../data/ui/PreferencesVarietyDialog.ui.h:124 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.h:126 msgid "Clipboard monitoring" msgstr "Слежение за буфером обмена" #: ../data/ui/PreferencesVarietyDialog.ui.h:127 msgid "Monitor clipboard for image URLs and fetch them" msgstr "" "Следить за буфером обмена и при обнаружении там URL изображений, загружать их" #: ../data/ui/PreferencesVarietyDialog.ui.h:128 msgid "But fetch only when the URL host is one of these:" msgstr "Загружать, только если URL хоста один из следующих:" #: ../data/ui/PreferencesVarietyDialog.ui.h:129 msgid "Manual downloading" msgstr "Ручная загрузка" #: ../data/ui/PreferencesVarietyDialog.ui.h:130 msgid "When possible use images that:" msgstr "По возможности использовать изображения, которые:" #: ../data/ui/PreferencesVarietyDialog.ui.h:131 ../variety/ThumbsManager.py:98 msgid "Size" msgstr "Размер" #: ../data/ui/PreferencesVarietyDialog.ui.h:132 msgid "Have landscape orientation" msgstr "Имеют альбомную ориентацию" #: ../data/ui/PreferencesVarietyDialog.ui.h:133 msgid "Are big at least " msgstr "По крайней мере " #: ../data/ui/PreferencesVarietyDialog.ui.h:134 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui.h:135 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui.h:136 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui.h:138 #, no-c-format msgid "% of the screen resolution" msgstr "% от размера экрана" #: ../data/ui/PreferencesVarietyDialog.ui.h:139 msgid "Color" msgstr "Цвет" #: ../data/ui/PreferencesVarietyDialog.ui.h:140 msgid "Are dark or light:" msgstr "Тёмные или светлые:" #: ../data/ui/PreferencesVarietyDialog.ui.h:141 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Тёмные" #: ../data/ui/PreferencesVarietyDialog.ui.h:142 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Светлые" #: ../data/ui/PreferencesVarietyDialog.ui.h:143 msgid "Contain this color: " msgstr "Содержат этот цвет: " #: ../data/ui/PreferencesVarietyDialog.ui.h:144 msgid "(Takes effect after some initial searching)" msgstr "(Применяется после первоначального поиска)" #: ../data/ui/PreferencesVarietyDialog.ui.h:145 msgid "Rating" msgstr "Оценка" #: ../data/ui/PreferencesVarietyDialog.ui.h:146 msgid "Have EXIF rating at least " msgstr "EXIF оценка не меньше " #: ../data/ui/PreferencesVarietyDialog.ui.h:147 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui.h:148 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui.h:149 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui.h:150 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui.h:151 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui.h:152 msgid "Color and size" msgstr "Цвет и размер" #: ../data/ui/PreferencesVarietyDialog.ui.h:153 msgid "Indicator Icon" msgstr "Значок индикатора" #: ../data/ui/PreferencesVarietyDialog.ui.h:154 msgid "Indicator icon:" msgstr "Значок индикатора:" #: ../data/ui/PreferencesVarietyDialog.ui.h:155 msgctxt "Icon option" msgid "Light" msgstr "Светлый" #: ../data/ui/PreferencesVarietyDialog.ui.h:156 msgctxt "Icon option" msgid "Dark" msgstr "Тёмный" #: ../data/ui/PreferencesVarietyDialog.ui.h:157 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Текущие обои" #: ../data/ui/PreferencesVarietyDialog.ui.h:158 msgctxt "Icon option" msgid "Custom image..." msgstr "Выбрать изображение..." #: ../data/ui/PreferencesVarietyDialog.ui.h:159 msgctxt "Icon option" msgid "None" msgstr "Нет" #: ../data/ui/PreferencesVarietyDialog.ui.h:160 msgid "Select an icon" msgstr "Выберите значок" #: ../data/ui/PreferencesVarietyDialog.ui.h:161 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.h:162 msgid "Favorites Operations" msgstr "Избранные операции" #: ../data/ui/PreferencesVarietyDialog.ui.h:163 msgid "Favorites operations to show in main menu:" msgstr "Избранные операции, отображаемые в главном меню:" #: ../data/ui/PreferencesVarietyDialog.ui.h:164 msgid "Copy to Favorites" msgstr "Копировать в Избранные" #: ../data/ui/PreferencesVarietyDialog.ui.h:166 msgid "Both Copy and Move" msgstr "Обе (копировать и переместить)" #: ../data/ui/PreferencesVarietyDialog.ui.h:167 msgid "Depends on folder..." msgstr "Зависит от папки..." #: ../data/ui/PreferencesVarietyDialog.ui.h:170 msgid "Display dialog to customize the Facebook post before publishing" msgstr "Показывать диалог изменения записи в Facebook перед публикацией" #: ../data/ui/PreferencesVarietyDialog.ui.h:171 msgid "Login Screen Support" msgstr "Поддержка экрана входа в систему" #: ../data/ui/PreferencesVarietyDialog.ui.h:172 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "Удостоверьтесь, что обои, установленные Variety, будут использоваться на " "экране входа в систему" #: ../data/ui/PreferencesVarietyDialog.ui.h:173 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.h:174 msgid "Copy wallpaper image files to this folder: " msgstr "Копировать файлы обоев в эту папку: " #: ../data/ui/PreferencesVarietyDialog.ui.h:175 msgid "Reset to default" msgstr "Сбросить настройки" #: ../data/ui/PreferencesVarietyDialog.ui.h:176 msgid "Still doesn't work?" msgstr "Всё ещё не работает?" #: ../data/ui/PreferencesVarietyDialog.ui.h:177 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Похоже, ваш домашний каталог зашифрован, поэтому использовать его подпапки " "не получится." #: ../data/ui/PreferencesVarietyDialog.ui.h:178 msgid "You don't have write permissions for this folder." msgstr "У вас нет прав на запись в эту папку." #: ../data/ui/PreferencesVarietyDialog.ui.h:179 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "Права доступа не позволяют LightDM читать файлы из этой папки." #: ../data/ui/PreferencesVarietyDialog.ui.h:180 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "Variety может настроить права доступа, но вы должны предоставить права " "администратора." #: ../data/ui/PreferencesVarietyDialog.ui.h:181 msgid "Customize" msgstr "Настройка предпочтений" #: ../data/ui/PreferencesVarietyDialog.ui.h:182 msgid "Tips and tricks" msgstr "Полезные советы" #: ../data/ui/PreferencesVarietyDialog.ui.h:183 msgid "Recent changes" msgstr "Последние изменения" #: ../data/ui/PreferencesVarietyDialog.ui.h:184 msgid "Visit website" msgstr "Посетить сайт" #: ../data/ui/PreferencesVarietyDialog.ui.h:185 msgid "Report a bug or request a feature" msgstr "Сообщить об ошибке или предложить новую функцию" #: ../data/ui/PreferencesVarietyDialog.ui.h:186 msgid "Send feedback" msgstr "Отправить отзыв" #: ../data/ui/PreferencesVarietyDialog.ui.h:187 msgid "Donate to Variety" msgstr "Пожертвовать на Variety" #: ../data/ui/PreferencesVarietyDialog.ui.h:188 msgid "Donate via PayPal" msgstr "Пожертвовать через PayPal" #: ../data/ui/PreferencesVarietyDialog.ui.h:189 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.h:193 msgid "" "For Bitcoin and other payment methods please go to Variety's website." msgstr "" "Для Bitcoin и других способов оплаты, посетите веб-сайт Variety." #: ../data/ui/PreferencesVarietyDialog.ui.h:194 msgid "Donate" msgstr "Пожертвования" #: ../variety/FacebookHelper.py:116 msgid "Authorization successful" msgstr "Успешная авторизация" #: ../variety/FacebookHelper.py:116 msgid "Publishing..." msgstr "Публикация..." #: ../variety/FacebookHelper.py:121 msgid "Authorization failed" msgstr "Ошибка авторизации" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Сверху" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Слева" #: ../variety/ThumbsManager.py:94 msgid "Position" msgstr "Положение" #: ../variety/ThumbsManager.py:109 msgid "Show Containing Folder" msgstr "Показать в папке" #: ../variety/ThumbsManager.py:136 ../variety/indicator.py:156 msgid "Set EXIF Rating" msgstr "Задать EXIF оценку" #: ../variety/ThumbsManager.py:160 ../variety/indicator.py:87 msgid "Delete to _Trash" msgstr "Удалить в _Корзину" #: ../variety/ThumbsManager.py:167 ../variety/indicator.py:131 msgid "Where is it from?" msgstr "Откуда это?" #: ../variety/ThumbsManager.py:178 msgid "Close" msgstr "Закрыть" #: ../variety/ThumbsManager.py:198 msgid "Could not set EXIF rating" msgstr "Не удалось задать EXIF оценку" #: ../variety/ThumbsManager.py:217 msgid "Unrated" msgstr "Без оценки" #: ../variety/ThumbsManager.py:224 msgid "Rejected" msgstr "Отклонено" #: ../variety/ThumbsManager.py:324 msgid "Variety History" msgstr "История Variety" #: ../variety/ThumbsManager.py:326 msgid "Variety Recent Downloads" msgstr "Новые загрузки Variety" #: ../variety/ThumbsManager.py:328 msgid "Variety Images" msgstr "Изображения Variety" #: ../data/ui/AddWallbaseDialog.ui.h:1 msgid "Variety - add Wallbase.cc image source" msgstr "Variety — добавление источника изображений Wallbase.cc" #: ../data/ui/AddWallbaseDialog.ui.h:2 msgid "Wallbase.cc" msgstr "Wallbase.cc" #: ../data/ui/AddWallbaseDialog.ui.h:3 msgid "" "Wallbase.cc is permanently down. Use Wallhaven.cc instead. Support for " "Wallbase.cc will be dropped completely in a future release, please remove or " "update your existing Wallbase sources." msgstr "" "Wallbase.cc больше нет. Взамен используйте Wallhaven.cc. Поддержка " "Wallbase.cc в будущем будет полностью исключена, пожалуйста, удалите или " "обновите существующие источники Wallbase." #: ../data/ui/AddWallbaseDialog.ui.h:4 msgid "" "Wallbase.cc provides a variety of image " "search options. Below you can specify keywords to search for, or visit Wallbase.cc, setup your search criteria " "there, ensure you like the results, and paste the full Wallbase URL in the " "box.\n" "\n" "If you specify keywords, the most liked safe-for-work images that match any " "of the keywords will be used. \n" "\n" "If you specify a Wallbase 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." msgstr "" "Wallbase.cc предоставляет разнообразные " "опции поиска изображений. Ниже вы можете указать ключевые слова для поиска " "или посетите Wallbase.cc, настройте ваши " "критерии поиска там, убедитесь, что результат подходит, и скопируйте полный " "Wallbase URL в поле.\n" "\n" "Если вы укажете ключевые слова, будут использованы наиболее популярные " "«безобидные» изображения, соответсвующие любому из слов. \n" "\n" "Если же задаёте Wallbase URL, пожалуйста, тщательно отбирайте критерии " "поиска: Variety регулярно запрашивает изображения, но использует только " "первые несколько сотен. Random или Date будет означать, что такой источник с " "более длинным «жизненным циклом», пока не исчерпается. Favorites " "предоставляет лучшие изображения, а Relevance обеспечит более близкое " "соответсвие при поиске по фразам или цвету." #: ../data/ui/FacebookPublishDialog.ui.h:1 msgid "Variety - Publish to Facebook" msgstr "Variety - Опубликовать в Facebook" #: ../data/ui/FacebookPublishDialog.ui.h:2 ../variety/indicator.py:149 #: ../variety/indicator.py:223 msgid "Share on Facebook" msgstr "Поделиться событием на Facebook" #: ../data/ui/FacebookPublishDialog.ui.h:3 msgid "" "Publish a link to the current wallpaper on Facebook. Include this text along " "with the link (or just leave empty):" msgstr "" "Опубликовать ссылку на текущие обои на Facebook. Включить этот текст вместе " "с ссылкой (или оставить пустым):" #: ../data/ui/FacebookPublishDialog.ui.h:4 msgid "Use current quote" msgstr "Использовать текущую цитату" #: ../data/ui/SmartRegisterDialog.ui.h:1 msgid "Variety - VRTY.ORG registration" msgstr "Variety — регистрация на VRTY.ORG" #: ../data/ui/SmartRegisterDialog.ui.h:2 msgid "Would you like to register?" msgstr "Желаете зарегистрироваться?" #: ../data/ui/SmartRegisterDialog.ui.h:3 msgid "" "You may participate in VRTY.ORG " "anonymously, but registration enables some very nice features, such as synchronization of favorites between computers and " "personalized recommendations. It also ensures " "you will not lose your profile and favorite wallpapers if you reinstall your " "OS." msgstr "" "Вы можете участвовать в VRTY.ORG анонимно, " "но регистрация предоставит дополнительные опции, например, синхронизацию избранного между компьютерами, а также " "персональные рекомендации. Это убережёт вас от " "потери данных профиля и избранного в случае переустановки операционной " "системы." #: ../data/ui/SmartRegisterDialog.ui.h:4 msgid "Registration is very easy and does not require any personal data." msgstr "Регистрация очень проста и не требует отправки персональных данных." #: ../data/ui/SmartRegisterDialog.ui.h:5 msgid "" "If you choose to participate anonymously, you can register later from the " "\"Sync and social\" page in Preferences." msgstr "" "Если вы выберете анонимное участие, то можете зарегистрироваться позже на " "вкладке «Синхронизация и общество» в Параметрах." #: ../data/ui/SmartRegisterDialog.ui.h:6 msgid "" "Oops, we could not connect to VRTY.ORG. Server might be down. Please wait a " "couple of minutes and try again or choose \"Participate anonymously\" and register later " "from the \"Sync and social\" page in " "Preferences." msgstr "" "Ой, нем не удалось соединиться с VRTY.ORG. Возможно, сервер недоступен. " "Пожалуйста, подождите пару минут и попробуйте ещё раз либо выберите «Участвовать анонимно» и зарегистрируйтесь позже " "на вкладке «Синхронизация и общество» в " "Параметрах." #: ../data/ui/SmartRegisterDialog.ui.h:7 msgid "" "Please continue the registration and follow the instructions in the browser " "tab we opened." msgstr "" "Пожалуйста, продолжите регистрацию и следуйте инструкциям в открывшейся " "вкладке браузера." #: ../data/ui/SmartRegisterDialog.ui.h:8 msgid "I will participate anonymously" msgstr "Я буду участвовать анонимно" #: ../data/ui/SmartRegisterDialog.ui.h:9 msgid "I'm registered, let me login" msgstr "Я зарегистрирован, дайте войти" #: ../data/ui/SmartRegisterDialog.ui.h:10 msgid "Register here" msgstr "Зарегистрируйтесь здесь" #: ../variety.desktop.in.h:1 msgid "Variety" msgstr "Variety" #: ../variety.desktop.in.h:2 msgid "Variety Wallpaper Changer" msgstr "Variety — программа для смены обоев" #: ../variety.desktop.in.h:3 msgid "Next" msgstr "Следующее" #: ../variety.desktop.in.h:4 msgid "Previous" msgstr "Предыдущее" #: ../variety.desktop.in.h:5 msgid "Pause / Resume" msgstr "Пауза / Продолжить" #: ../variety.desktop.in.h:6 msgid "History" msgstr "История" #: ../variety.desktop.in.h:7 msgid "Preferences" msgstr "Параметры" #: ../data/plugins/quotes/LocalFilesSource.py:34 msgid "" "Displays quotes, defined in local text files.\n" "Put your own txt files in: ~/.config/variety/pluginconfig/quotes/.\n" "The file format is:\n" "\n" "quote -- author\n" ".\n" "second quote -- another author\n" ".\n" "etc...\n" "\n" "Example: http://rvelthuis.de/zips/quotes.txt" msgstr "" "Показывает цитаты из локальных текстовых файлов.\n" "Поместите ваши txt файлы в: ~/.config/variety/pluginconfig/quotes/.\n" "Формат файла:\n" "\n" "цитата -- автор\n" ".\n" "вторая цитата -- другой автор\n" ".\n" "и т. д.\n" "\n" "Пример: http://rvelthuis.de/zips/quotes.txt" #: ../variety/indicator.py:49 ../variety/indicator.py:96 #: ../variety/indicator.py:166 msgid "_Next" msgstr "_Следующее" #: ../variety/indicator.py:54 ../variety/indicator.py:101 #: ../variety/indicator.py:171 msgid "_Previous" msgstr "_Предыдущее" #: ../variety/indicator.py:61 msgid "Current desktop wallpaper" msgstr "Текущее изображение на рабочем столе" #: ../variety/indicator.py:65 msgid "Show origin" msgstr "Показать оригинал" #: ../variety/indicator.py:106 ../variety/indicator.py:176 msgid "_Next, skipping forward history" msgstr "_Дальше, пропустив уже просмотренные" #: ../variety/indicator.py:114 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Совет: прокручивайте обои вперёд и назад\n" "колесом мыши на индикаторе программы" #: ../variety/indicator.py:124 msgid "_Image" msgstr "_Изображение" #: ../variety/indicator.py:135 msgid "Show without effects" msgstr "Показать без эффектов" #: ../variety/indicator.py:143 msgid "Google Image Search" msgstr "Google поиск по картинке" #: ../variety/indicator.py:196 msgid "View Favorites..." msgstr "Смотреть Favorites..." #: ../variety/indicator.py:203 msgid "Copy to Clipboard" msgstr "Копировать в буфер обмена" #: ../variety/indicator.py:213 msgid "Google Quote" msgstr "Искать цитату в Google" #: ../variety/indicator.py:218 msgid "Google Author" msgstr "Искать автора в Google" #: ../variety/indicator.py:230 ../variety/indicator.py:284 msgid "Preferences..." msgstr "Параметры…" #: ../variety/indicator.py:238 msgid "Turn off" msgstr "Выключить" #: ../variety/indicator.py:244 msgid "_Quote" msgstr "_Цитата" #: ../variety/indicator.py:251 msgid "_History" msgstr "_История" #: ../variety/indicator.py:257 msgid "_Wallpaper Selector" msgstr "_Переключатель обоев" #: ../variety/indicator.py:263 msgid "Recent _Downloads" msgstr "Но_вые загрузки" #: ../variety/indicator.py:278 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:288 msgid "About" msgstr "О программе" #: ../variety/indicator.py:292 msgid "Quit" msgstr "Выход" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:1 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Копировать или переместить в Избранные" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:2 msgid "Reset to Default" msgstr "Сбросить настройки" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:3 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.h:4 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" #: ../variety/ImageFetcher.py:56 ../variety/ImageFetcher.py:103 msgid "Fetching" msgstr "Получение" #. too small - delete and do not use #: ../variety/ImageFetcher.py:118 msgid "Image too small, ignoring it" msgstr "Изображение слишком маленькое, игнорирую его" #: ../variety/ImageFetcher.py:140 #, python-format msgid "Sorry, got %s error..." msgstr "Извините, получена ошибка %s..." #: ../variety/ImageFetcher.py:141 msgid "This means the link is no longer valid" msgstr "Это значит, что ссылка более не действительна" #: ../variety/ImageFetcher.py:144 msgid "Fetch failed for some reason" msgstr "Получение прервано по некоторым причинам" #: ../variety/ImageFetcher.py:145 msgid "" "To get more information, please run Variety from terminal with -v option and " "retry the action" msgstr "" "Для получения более подробной информации, пожалуйста, запустите Variety из " "терминала с опцией -v и повторите действие" variety/po/bg.po0000644000000000000000000032631512655724351011021 0ustar # Bulgarian translation for variety # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the variety package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: variety\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-01-29 10:57+0200\n" "PO-Revision-Date: 2015-08-02 13:45+0000\n" "Last-Translator: Peter Levi \n" "Language-Team: Bulgarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-02-07 20:28+0000\n" "X-Generator: Launchpad (build 17908)\n" #: ../data/plugins/quotes/GoodreadsSource.py:49 msgid "Fetches quotes from Goodreads.com" msgstr "Тегли цитати от Goodreads.com" #: ../data/ui/LoginOrRegisterDialog.ui.h:1 msgid "Login to VRTY.ORG" msgstr "Влизане във VRTY.ORG" #: ../data/ui/LoginOrRegisterDialog.ui.h:2 msgid "Username: " msgstr "Потребителско име: " #: ../data/ui/LoginOrRegisterDialog.ui.h:3 msgid "Password: " msgstr "Парола: " #: ../data/ui/LoginOrRegisterDialog.ui.h:4 msgid "No account? Register here" msgstr "Нямате акаунт? Регистрирайте се" #: ../data/ui/LoginOrRegisterDialog.ui.h:5 msgid "Forgot your password?" msgstr "Забравена парола?" #: ../data/ui/LoginOrRegisterDialog.ui.h:6 msgid "" "Tip: You can also login to VRTY.ORG in a " "browser and click the link \"Trigger Variety " "login\" in your profile." msgstr "" "Можете също да се логнете във VRTY.ORG в " "браузъра си и да натиснете линка \"Trigger Variety " "login\" от вашия профил." #: ../data/ui/LoginOrRegisterDialog.ui.h:7 msgid "Login" msgstr "Вход" #: ../variety/LoginOrRegisterDialog.py:80 #, python-format msgid "Oops, server returned error (%s)" msgstr "Упс, сървърът върна грешка (%s)" #: ../variety/LoginOrRegisterDialog.py:85 msgid "Could not connect to server" msgstr "Няма връзка със сървъра" #: ../variety/AddWallhavenDialog.py:38 ../variety/AddWallbaseDialog.py:38 #: ../variety/AddFlickrDialog.py:138 msgid "No images found" msgstr "Не намерих картинки" #: ../data/ui/AddPanoramioDialog.ui.h:1 msgid "Variety - add Panoramio image source" msgstr "Variety - добавяне на Panoramio като източник" #. (_("Wallbase.cc"), self.on_add_wallbase_clicked), #: ../data/ui/AddPanoramioDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:388 msgid "Panoramio" msgstr "Panoramio" #: ../data/ui/AddPanoramioDialog.ui.h:3 msgid "Please zoom over your area of interest." msgstr "Моля фокусирайте зоната, която Ви е интересна." #: ../variety/FolderChooser.py:65 msgid "Choose a folder" msgstr "Изберете папка" #: ../variety/FolderChooser.py:66 ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Cancel" msgstr "Отказ" #: ../variety/FolderChooser.py:66 msgid "OK" msgstr "ОК" #: ../data/ui/AddWallhavenDialog.ui.h:1 msgid "Variety - add Wallhaven.cc image source" msgstr "Variety - добавяне на Wallhaven.cc като източник" #: ../data/ui/AddWallhavenDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:386 msgid "Wallhaven.cc" msgstr "Wallhaven.cc" #: ../data/ui/AddWallhavenDialog.ui.h:3 msgid "" "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." msgstr "" "Wallhaven.cc предоставя различни опции " "за търсене. Отдолу можете да зададете ключови думи или да посетите Wallhaven.cc, да нагласите критериите за " "търсене там, и след като сте сигурни, че резултатите Ви удовлетворяват, да " "копирате целия Wallhaven URL в полето долу.\n" "\n" "Ако зададете ключови думи, Variety ще използва най-харесваните картинки, " "които отговарят на всички ключови думи и са подходящи за работна среда. \n" "\n" "Ако зададете Wallhaven URL, моля подберете внимателно критерия за сортиране -" " Variety регулярно дърпа нови картинки, но използва само първите стотина " "картинки от търсенето. Сортиране \"Random\" или по \"Date\" означава, че " "този източник ще има по-дълъг \"живот\" преди да се изчерпи. Сортиране по " "\"Favorites\" осигурява по-качествени картинки, а \"Relevance\" ще връща по-" "точни резултати при търсене на фраза или по цвят." #: ../data/ui/AddWallhavenDialog.ui.h:8 ../data/ui/AddWallbaseDialog.ui.h:9 msgid "Enter keywords or paste URL here: " msgstr "Въведете ключови думи или URL: " #: ../data/ui/AddWallhavenDialog.ui.h:9 ../data/ui/AddFlickrDialog.ui.h:16 #: ../data/ui/AddWallbaseDialog.ui.h:10 msgid "Just a moment to check this search" msgstr "Секунда да проверим това търсене" #: ../data/ui/AddWallhavenDialog.ui.h:10 ../data/ui/AddFlickrDialog.ui.h:17 #: ../data/ui/AddRedditDialog.ui.h:9 ../data/ui/AddMediaRssDialog.ui.h:6 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:10 #: ../data/ui/AddWallbaseDialog.ui.h:11 msgid " " msgstr " " #: ../variety/QuotesEngine.py:232 msgid "No quote plugins" msgstr "Няма плъгини за цитати" #: ../variety/QuotesEngine.py:232 msgid "There are no quote plugins installed" msgstr "Нямате инсталирани плъгини за цитати" #: ../variety/QuotesEngine.py:238 msgid "No suitable quote plugins" msgstr "Няма подходящи плъгини за цитати" #: ../variety/QuotesEngine.py:239 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "Никой от плъгините за цитати не поддържа търсене по думи и автори" #: ../variety/QuotesEngine.py:251 msgid "Could not fetch quotes" msgstr "Не успях да изтегля цитати" #: ../variety/QuotesEngine.py:252 msgid "Quotes services may be down, we will continue trying" msgstr "" "Може би няма връзка със сървърите за цитати, ще продължим да опитваме." #: ../variety/QuotesEngine.py:255 msgid "Could not find quotes" msgstr "Не намерихме цитати" #: ../variety/QuotesEngine.py:256 msgid "Maybe you are searching for something very obscure?" msgstr "Може би търсите нещо твърде затънтено?" #: ../variety/Texts.py:20 msgid "Keep original" msgstr "Запазване на оригинала" #: ../variety/Texts.py:21 msgid "Grayscale" msgstr "Степени на сивото" #: ../variety/Texts.py:22 msgid "Heavy blur" msgstr "Силно размазване" #: ../variety/Texts.py:23 msgid "Soft blur" msgstr "Леко размазване" #: ../variety/Texts.py:24 msgid "Oil painting" msgstr "Картина с маслени бои" #: ../variety/Texts.py:25 msgid "Pencil sketch" 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:37 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:38 msgid "Random wallpapers from Desktoppr.co" msgstr "Случайно избрани тапети от Desktoppr.co" #: ../variety/Texts.py:39 msgid "NASA's Astronomy Picture of the Day" msgstr "НАСА: Астрономическа смимка на деня" #: ../variety/Texts.py:41 msgid "World Sunlight Map - live wallpaper from Die.net" msgstr "" "World Sunlight Map - Карта на осветеността на Земята от Слънцето, променяща " "се през деня" #: ../variety/Texts.py:42 msgid "Bing Photo of the Day" msgstr "Bing Фото на деня" #: ../variety/Texts.py:43 msgid "High-resolution photos from Unsplash.com" msgstr "Фотографии с висока резолюция от Unsplash.com" #: ../variety/Texts.py:47 msgid "" "If you use KDE, you need to perform some actions before Variety will work. " "Please read here: http://peterlevi.com/variety/2014/05/variety-and-kde/" msgstr "" "Ако използвате KDE, трябва да направите някои настройки, без които Variety " "няма да работи. Моля прочетете тук: " "http://peterlevi.com/variety/2014/05/variety-and-kde/" #: ../variety/Texts.py:48 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" "Можете да сменяте тапета като въртите колелцето на мишката нагоре или надолу " "върху индикаторната икона." #: ../variety/Texts.py:49 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 " "~/.config/variety/scripts. There are examples there for various desktop " "environments." msgstr "" "Ако искате да изпълните специфични команди при всяка смяна на тапета или пък " "използвате работна среда, която не се поддържа по подразбиране, можете да " "редактирате скриптовете в ~/.config/variety/scripts." #: ../variety/Texts.py:50 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:51 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:52 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:53 msgid "" "Adding your own custom filters is quite easy: open " "~/.config/variety/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 "" "Можете лесно да добавяте свои собствени филтри: отворете " "~/.config/variety/variety.conf в текстов редактор и използвайте " "съществуващите филтри като пример. Всеки филтър е набор от опции, които да " "се подадат към командата convert на ImageMagick." #: ../variety/Texts.py:54 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:55 msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of ~/.config/variety/scripts/set_wallpaper." msgstr "" "За да получавате нотификации когато тапета се сменя, разкоментирайте двете " "линии на края на ~/.config/variety/scripts/set_wallpaper." #: ../variety/Texts.py:56 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:57 msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "~/.config/variety/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 "" "Когато записвате цитат в Любими, той се записва във файла " "~/.config/variety/favorite_quotes.txt. Форматът на този файл е съвместим с " "плъгина на Variety за цитати от локални файлове. Ако искате да го ползвате - " "копирайте го в ~/.config/variety/pluginconfig/quotes/ и активирайте плъгина " "за цитати от локални файлове. Освен това този файл е съвместим с Unix " "приложението fortune." #: ../variety/PreferencesVarietyDialog.py:259 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:382 #: ../variety/PreferencesVarietyDialog.py:551 #: ../data/ui/PreferencesVarietyDialog.ui.h:11 msgid "Images" msgstr "Картинки" #: ../variety/PreferencesVarietyDialog.py:383 msgid "Folders" msgstr "Папки" #: ../variety/PreferencesVarietyDialog.py:385 #: ../data/ui/AddFlickrDialog.ui.h:2 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:389 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:2 msgid "Wallpapers.net" msgstr "Wallpapers.net" #: ../variety/PreferencesVarietyDialog.py:390 #: ../data/ui/AddRedditDialog.ui.h:2 msgid "Reddit" msgstr "Reddit" #: ../variety/PreferencesVarietyDialog.py:391 #: ../data/ui/AddMediaRssDialog.ui.h:2 msgid "Media RSS" msgstr "Media RSS" #: ../variety/PreferencesVarietyDialog.py:416 msgid "Remove the source, keep the files" msgstr "Изтрий от списъка, запази файловете" #: ../variety/PreferencesVarietyDialog.py:417 msgid "Remove the sources, keep the files" msgstr "Изтрий от списъка, запази файловете" #: ../variety/PreferencesVarietyDialog.py:424 msgid "Remove the source and delete the downloaded files" msgstr "Изтрий от списъка и изтрий изтеглените файловете" #: ../variety/PreferencesVarietyDialog.py:425 msgid "Remove the sources and delete the downloaded files" msgstr "Изтрий от списъка и изтрий изтеглените файловете" #: ../variety/PreferencesVarietyDialog.py:458 msgid "World Sunlight Map enabled" msgstr "Включихте World Sunlight Map" #: ../variety/PreferencesVarietyDialog.py:459 msgid "" "Using the World Sunlight Map requires both downloading and changing enabled " "at intervals of 30 minutes or less. Settings were adjusted automatically." msgstr "" "За да използвате World Sunlight Map е необходимо опциите за реглярно сваляне " "и смяна на тапети да са включени с интервал не по-голям от 30 минути. " "Настройките Ви бяха автоматично променени." #: ../variety/PreferencesVarietyDialog.py:544 msgid "Add Images" msgstr "Добавяне на картинки" #: ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Add" msgstr "Добави" #: ../variety/PreferencesVarietyDialog.py:567 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" "Добавяне на папки - добавяйте само най-горната папкa, подпапките се включват " "автоматично в търсенето" #: ../variety/PreferencesVarietyDialog.py:703 #: ../variety/PreferencesVarietyDialog.py:716 #: ../data/ui/PreferencesVarietyDialog.ui.h:168 msgid "Edit..." msgstr "Редактирай..." #: ../variety/PreferencesVarietyDialog.py:710 msgid "View Image" msgstr "Виж картинката" #: ../variety/PreferencesVarietyDialog.py:713 msgid "Open Folder" msgstr "Отвори папката" #: ../variety/PreferencesVarietyDialog.py:1092 msgid "Recommended images source disabled" msgstr "Източника за Препоръчани картинки беше изключен" #: ../variety/PreferencesVarietyDialog.py:1120 #: ../variety/PreferencesVarietyDialog.py:1139 #: ../variety/PreferencesVarietyDialog.py:1147 msgid "No write permissions" msgstr "Нямате права за писане" #: ../variety/PreferencesVarietyDialog.py:1127 msgid "Limit disabled" msgstr "Квотата беше деактивирана" #: ../variety/PreferencesVarietyDialog.py:1128 msgid "" "Changing the download folder automatically turns off the size limit to " "prevent from accidental data loss" msgstr "" "Промяната на папката за теглене автоматично изключва опцията за ограничване " "на размера, за да се избегне неволна загуба на данни" #: ../variety/PreferencesVarietyDialog.py:1134 #, python-format msgid "Actual download folder: %s " msgstr "Реална папка за теглене: %s " #: ../variety/PreferencesVarietyDialog.py:1214 msgid "Could not adjust permissions" msgstr "На успях да променя правата" #: ../variety/PreferencesVarietyDialog.py:1215 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "Може да пробвате ръчно да изпълните следната команда:\n" "sudo chmod %s \"%s\"" #: ../variety/PreferencesVarietyDialog.py:1247 msgid "Logged in as: " msgstr "Влезли сте с потребител: " #: ../variety/PreferencesVarietyDialog.py:1249 msgid "Anonymous" msgstr "Анонимен потребител" #: ../variety/PreferencesVarietyDialog.py:1250 #: ../data/ui/PreferencesVarietyDialog.ui.h:109 msgid "Login or register" msgstr "Вход или регистрация" #: ../variety/PreferencesVarietyDialog.py:1250 msgid "Switch user" msgstr "Превключи потребителя" #: ../data/ui/AddFlickrDialog.ui.h:1 msgid "Variety - add Flickr as an image source" msgstr "Variety - добавяне на Flickr като източник" #: ../data/ui/AddFlickrDialog.ui.h:3 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.h:4 #: ../data/ui/PreferencesVarietyDialog.ui.h:58 msgid "Tags: " msgstr "Етикети: " #: ../data/ui/AddFlickrDialog.ui.h:5 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.h:7 msgid "User: " msgstr "Потребител: " #: ../data/ui/AddFlickrDialog.ui.h:8 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.h:10 msgid "Group: " msgstr "Група: " #: ../data/ui/AddFlickrDialog.ui.h:11 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/group" "s/wallpapers/" msgstr "" "Моля въведете URL на групата.\n" "Пример: http://www.flickr.com/group" "s/wallpapers/" #: ../data/ui/AddFlickrDialog.ui.h:13 msgid "Text:" msgstr "Текст:" #: ../data/ui/AddFlickrDialog.ui.h:14 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" #: ../variety/AddMediaRssDialog.py:40 msgid "" "This does not seem to be a valid Media RSS feed URL or there is no content " "there." msgstr "Това не е URL на валиден Media RSS фийд или в него няма съдържание." #: ../variety/VarietyWindow.py:630 ../variety/VarietyWindow.py:772 #: ../variety/VarietyWindow.py:2650 msgid "Already in Favorites" msgstr "Вече е в Любими" #: ../variety/VarietyWindow.py:634 ../variety/ThumbsManager.py:144 #: ../variety/indicator.py:76 msgid "Copy to _Favorites" msgstr "Копирай в _Любими" #: ../variety/VarietyWindow.py:635 ../variety/ThumbsManager.py:151 msgid "Move to _Favorites" msgstr "Премести в _Любими" #. both #: ../variety/VarietyWindow.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:165 ../variety/indicator.py:81 msgid "Move to Favorites" msgstr "Премести в Любими" #: ../variety/VarietyWindow.py:665 ../variety/ThumbsManager.py:119 msgid "Fetched: Show Origin" msgstr "Довлечено: Покажи източника" #: ../variety/VarietyWindow.py:667 ../variety/VarietyWindow.py:762 #: ../variety/ThumbsManager.py:121 #, python-format msgid "View at %s" msgstr "Виж във %s" #: ../variety/VarietyWindow.py:711 msgid "Unknown" msgstr "Неизвестно" #: ../variety/VarietyWindow.py:732 #, python-format msgid "Author: %s" msgstr "Автор: %s" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 #: ../variety/indicator.py:120 ../variety/indicator.py:185 msgid "Pause on current" msgstr "Пауза върху тази картинка" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 msgid "Resume regular changes" msgstr "Поднови регулярната смяна" #: ../variety/VarietyWindow.py:772 ../variety/indicator.py:191 msgid "Save to Favorites" msgstr "Запиши в Любими" #: ../variety/VarietyWindow.py:904 msgid "Filtering too strict?" msgstr "Твърде строги филтри?" #: ../variety/VarietyWindow.py:905 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "" "Variety намира много малко картинки, които съответстват на филтрите ви." #: ../variety/VarietyWindow.py:1377 msgid "Please add more image sources or wait for some downloads" msgstr "" "Моля добавете още източници на картинки или изчакайте да се изтеглят нови" #: ../variety/VarietyWindow.py:1379 msgid "Please add more image sources" msgstr "Моля добавете още източници на картинки" #: ../variety/VarietyWindow.py:1380 msgid "No more wallpapers" msgstr "Няма повече тапети" #: ../variety/VarietyWindow.py:1566 msgid "Current wallpaper is not in the image sources" msgstr "Текущият тапет не е в никой от източниците" #: ../variety/VarietyWindow.py:1601 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "" "Не успях да преместя в %s. Вероятно нямате права да местите този файл." #: ../variety/VarietyWindow.py:1603 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" "Не можах да копирам в %s. Вероятно нямате права да копирате този файл." #: ../variety/VarietyWindow.py:1623 ../variety/VarietyWindow.py:1643 msgid "Cannot delete" msgstr "Неуспешно изтриване" #: ../variety/VarietyWindow.py:1624 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "Нямате права да преместите %s в Коша." #: ../variety/VarietyWindow.py:1644 msgid "" "Probably there is no utility for moving to Trash?\n" "Please install trash-cli or gvfs-bin or konquerer." msgstr "" "Може би нямате инсталирано приложение за триене към Коша?\n" "Моля инсталирайте trash-cli, gvfs-bin или konquerer." #: ../variety/VarietyWindow.py:1776 msgid "Anonymous usage statistics" msgstr "Анонимна статистика за използване" #: ../variety/VarietyWindow.py:1777 msgid "" "Variety collects anonymous usage statistics. \n" "These help us make it better and are not shared with anyone. \n" "To read more or turn them off, go to \"Sync and social\"" msgstr "" "Variety събира анонимни статистически данни за използването на програмата. \n" "Те ни помагат да я подобряваме и не се споделят с никого. \n" "За да видите по-подробна информация или да ги изключите, отворете " "настройките за Синхронизиране." #: ../variety/VarietyWindow.py:1920 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:1945 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 /some/local/image.jpg --next" msgstr "" "%prog [опции] [файлове или УРЛи]\n" "\n" "Ако подадете локални файлове, те ще бъдат добавени в опашката на Variety.\n" "Ако подадете URLи към картинки в интернет, Variety ще ги изтегли в папката " "за ръчно теглене и ще ги добави в опашката.\n" "\n" "За да изберете текущ тапет: %prog /локална/картинка.jpg --next" #: ../variety/VarietyWindow.py:1955 msgid "" "Show logging messages (-vv shows even finer debugging messages, -vvv debugs " "variety_lib too)" msgstr "" "Показвай logging информация (-vv логва с повече детайли, -vvv логва и дебъг " "информация от variety_lib)" #: ../variety/VarietyWindow.py:1959 msgid "Make the running instance quit" msgstr "Подай сигнал за излизане към вървящия процес" #: ../variety/VarietyWindow.py:1963 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" "Покажи пътя към текущия тапет. Използва се само при вървящо приложение." #: ../variety/VarietyWindow.py:1967 msgid "Show Next wallpaper" msgstr "Покажи следващия тапет" #: ../variety/VarietyWindow.py:1971 msgid "Show Previous wallpaper" msgstr "Покажи предишния тапет" #: ../variety/VarietyWindow.py:1975 msgid "Show Next wallpaper, skipping the forward history" msgstr "Покажи нов тапет, като пропуснеш forward историята" #: ../variety/VarietyWindow.py:1979 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" "Премести текущия тапет в Коша. Използва се само при вървящо приложение." #: ../variety/VarietyWindow.py:1983 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Копирай текущия тапет в Любими. Използва се само при вървящо приложение." #: ../variety/VarietyWindow.py:1987 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" "Премести текущия тапет в Любими. Използва се само при вървящо приложение." #: ../variety/VarietyWindow.py:1991 msgid "Pause on current image" msgstr "Пауза върху текущата картинка" #: ../variety/VarietyWindow.py:1995 msgid "Resume regular image changes" msgstr "Поднови регулярната смяна" #: ../variety/VarietyWindow.py:1999 msgid "Toggle Pause/Resume state" msgstr "Паузирай или възобнови" #: ../variety/VarietyWindow.py:2003 msgid "Show Next quote" msgstr "Покажи следващия цитат" #: ../variety/VarietyWindow.py:2007 msgid "Show Previous quote" msgstr "Покажи предишния цитат" #: ../variety/VarietyWindow.py:2011 msgid "Show Next quote, skipping the forward history" msgstr "Покажи нов цитат като пропуснеш forward историята" #: ../variety/VarietyWindow.py:2015 msgid "Toggle Quotes Pause/Resume state" msgstr "Паузирай или възобнови смяната на цитати" #: ../variety/VarietyWindow.py:2019 msgid "Save the current quote to Favorites" msgstr "Запиши текущия цитат в Любими" #: ../variety/VarietyWindow.py:2023 msgid "Toggle History display" msgstr "Покажи или скрий историята" #: ../variety/VarietyWindow.py:2027 msgid "Toggle Recent Downloads display" msgstr "Покажи или скрий скорошно изтеглените" #: ../variety/VarietyWindow.py:2031 msgid "Show Preferences dialog" msgstr "Покажи диалога за настройки" #: ../variety/VarietyWindow.py:2035 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" "Ръчен избор на тапет - показва лентата с картинки от текущо активните " "източници" #: ../variety/VarietyWindow.py:2039 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/VarietyWindow.py:2053 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "опциите --next/--fast-forward и --previous са взаимно изключващи се" #: ../variety/VarietyWindow.py:2056 msgid "options --trash and --favorite are mutually exclusive" msgstr "опциите --trash и --favorite са взаимно изключващи се" #: ../variety/VarietyWindow.py:2059 msgid "options --pause and --resume are mutually exclusive" msgstr "опциите --pause и --resume са взаимно изключващи се" #: ../variety/VarietyWindow.py:2062 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "опциите --quotes-next/--quotes-fast-forward и --quotes-previous са взаимно " "изключващи се" #: ../variety/VarietyWindow.py:2179 ../variety/ImageFetcher.py:60 #: ../variety/ImageFetcher.py:71 ../variety/ImageFetcher.py:78 #: ../variety/ImageFetcher.py:112 msgid "Not an image" msgstr "Не е картинка" #: ../variety/VarietyWindow.py:2184 msgid "Added to queue" msgstr "Добавено в опашката" #: ../variety/VarietyWindow.py:2185 ../variety/VarietyWindow.py:2191 msgid "Press Next to see it" msgstr "Натиснете \"Напред\" за да го видите" #: ../variety/VarietyWindow.py:2191 msgid "Fetched" msgstr "Изтеглено" #: ../variety/VarietyWindow.py:2237 msgid "Unsupported source type" msgstr "Този тип източник не се поддържа" #: ../variety/VarietyWindow.py:2238 ../variety/VarietyWindow.py:2286 msgid "Are you running the most recent version of Variety?" msgstr "Сигурни ли сте, че използвате последната версия на Variety?" #: ../variety/VarietyWindow.py:2244 msgid "New image source added" msgstr "Добавих нов източник на картинки" #: ../variety/VarietyWindow.py:2246 msgid "Image source already exists, enabling it" msgstr "" "Този източник на картинки вече е в списъка, включихме го за използване." #: ../variety/VarietyWindow.py:2272 msgid "Fetched and applied" msgstr "Картинката беше изтеглена и зададена като тапет" #: ../variety/VarietyWindow.py:2282 msgid "It works!" msgstr "Работи!" #: ../variety/VarietyWindow.py:2282 msgid "Yay, Variety links work. Great!" msgstr "Ура, Variety линковете работят. Чудесно!" #: ../variety/VarietyWindow.py:2286 msgid "Unsupported command" msgstr "Неизвестна команда" #: ../variety/VarietyWindow.py:2288 msgid "Could not process the given variety:// URL" msgstr "Не успяхме да обработим зададения variety:// линк." #: ../variety/VarietyWindow.py:2289 msgid "Run with logging enabled to see details" msgstr "" "Стартирайте Variety с настройка за подробен лог, за да видите повече " "информация." #: ../variety/VarietyWindow.py:2488 msgid "Do not ask anymore, always use the current quote" msgstr "Не питай повече, винаги използвай текущия цитат" #: ../variety/VarietyWindow.py:2491 ../data/ui/FacebookPublishDialog.ui.h:5 msgid "Do not ask anymore, always use the text above" msgstr "Не питай повече, винаги използвай горния текст" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "Published" msgstr "Публикувано" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "You may open your Facebook feed to see the post" msgstr "Можете да отворите своя Facebook фийд, за да видите публикацията" #: ../variety/VarietyWindow.py:2526 ../variety/VarietyWindow.py:2555 msgid "Could not publish" msgstr "Публикуването беше неуспешно" #: ../variety/VarietyWindow.py:2718 msgid "Could not create autostart entry" msgstr "На успяхме да създадем Autostart файла" #: ../variety/VarietyWindow.py:2719 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:2769 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:2769 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/FacebookFirstRunDialog.ui.h:1 msgid "Variety - Facebook Sharing" msgstr "Variety - Публикуване във Faceobok" #: ../data/ui/FacebookFirstRunDialog.ui.h:2 #: ../data/ui/PreferencesVarietyDialog.ui.h:169 msgid "Facebook Sharing" msgstr "Публикуване във Facebook" #: ../data/ui/FacebookFirstRunDialog.ui.h:3 msgid "" "You are sharing on Facebook for the first time. Sharing from Variety is " "available for images that come from online sources and for quotes. It works " "this way: \n" "\n" "1. Login to Facebook\n" "Facebook will open in your default browser. You will be prompted to login if " "you are not already logged in. \n" "\n" "2. Authorize Variety to publish to your " "feed.\n" "You will be asked to allow Variety to publish to your feed on your behalf. " "Variety will only use this permission to publish those images and quotes " "that you tell it to, nothing else.\n" "\n" "3. Configure browser to open variety:// links " "with Variety or xdg-open\n" "Then you will be redirected to a page with instructions to associate " "\"variety://\" links with Variety in your browser. Please follow these " "instructions to complete the setup. You have to do this only once.\n" "\n" "No passwords or login information is kept locally, just an OAuth Facebook " "token that will be valid for a couple of weeks. After its validity expires " "you will be asked to login again." msgstr "" "За пръв път споделяте във Фейсбук. С Variety можете да споделяте картинки, " "които са свалени от интернет, както и цитати. Споделянето работи така:\n" "\n" "1. Логин във Фейсбук\n" "Фейсбук ще се отвори в браузъра по подразбиране. Ще трябва да се логнете, " "ако вече не сте логнат. \n" "\n" "2. Разрешаване на Variety да публикува от Ваше " "име\n" "След като се логнете, ще бъдете попитан дали разрешавате на Variety да " "публикува във Вашия фийд. Variety ще използва това разрешение, за да " "публикува единствено тези снимки или цитати, които Вие ръчно сте поискали да " "споделите, за нищо друго. \n" "\n" "3. Настройване на браузъра да отваря variety:// " "линкове с Variety или xdg-open\n" "След това ще бъдете препратен към страница с инструкции как да асоциирате " "\"variety://\" линкове с Variety. Моля изпълнете тези инструкции, с това " "първоначалните настройки ще приключат. Това се прави еднократно.\n" "\n" "На локалния диск не се пазят никакви пароли или логин информация, освен " "OAuth Facebook ключа, който ще бъде валиден няколко седмици. След като " "валидността му изтече, ще бъдете помолен да се логнете отново." #: ../variety/AddWallpapersNetCategoryDialog.py:40 msgid "Could not find wallpapers there. Please check the URL." msgstr "Не намерих никакви картинки. Моля проверете URL-a." #: ../data/ui/WelcomeDialog.ui.h:1 msgid "Welcome to Variety!" msgstr "Добре дошли във Variety!" #: ../data/ui/WelcomeDialog.ui.h:2 ../data/ui/SmartFeaturesNoticeDialog.ui.h:3 msgid "Continue" msgstr "Напред" #: ../data/ui/WelcomeDialog.ui.h:3 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.h:4 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.h:5 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" "Моля, отделете малко време да настроите програмата в следващите няколко " "екрана." #: ../data/ui/WelcomeDialog.ui.h:6 msgid "KDE Users - Important, please read:" msgstr "KDE потребители - Важно, моля прочетете:" #: ../data/ui/WelcomeDialog.ui.h:7 msgid "" "You appear to be running KDE. In KDE 4 it is impossible to set the wallpaper " "from inside a program - there is no API for this. To make Variety work, please read " "and follow the instructions here." msgstr "" "Изглежда сте с KDE. В KDE 4 няма как тапетът да бъде сменен от програма - " "няма API за това. За да работи Variety, моля " "прочетете и изпълнете тези инструкции." #: ../data/ui/AddRedditDialog.ui.h:1 msgid "Variety - add Reddit feed" msgstr "Variety - добавяне на Reddit като източник" #: ../data/ui/AddRedditDialog.ui.h:3 msgid "" "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" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:7 msgid "URL or name of a subreddit: " msgstr "URL или име на събредит: " #: ../data/ui/AddRedditDialog.ui.h:8 msgid "Just a moment to check what's there" msgstr "Момент да проверим както има там" #: ../data/ui/AddMediaRssDialog.ui.h:1 msgid "Variety - add Media RSS feed" msgstr "Variety - добавяне на Media RSS фийд" #: ../data/ui/AddMediaRssDialog.ui.h:3 msgid "" "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." msgstr "" "Моля въведете URL-a към Media RSS фийда отдолу. Имайте предвид, че се " "поддържат само Media RSS фийдове, а не произволни RSS фийдове. Media RSS " "фийдовете съдържат тагове media:content, които препращат директно към " "реалните файлове с картинки. Ето някои сайтове, които предоставят Media RSS " "фийдове: Picasa, deviantART, SmugMug, Flickr, InterfaceLIFT." #: ../data/ui/AddMediaRssDialog.ui.h:4 msgid "Paste the URL of the Media RSS feed here: " msgstr "Копирайте адреса на Media RSS фийда тук: " #: ../data/ui/AddMediaRssDialog.ui.h:5 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:9 msgid "Just a moment to check what's at that URL" msgstr "Секунда да проверим какво има на този адрес" #: ../variety/AddRedditDialog.py:43 msgid "This does not seem to be a valid Reddit URL" msgstr "Това не прилича на валиден Reddit URL" #: ../variety/AddRedditDialog.py:46 msgid "We could not find any image submissions there." msgstr "Не успяхме да намерим никакви публикации с картинки там." #: ../variety/Smart.py:111 msgid "" "Your smart_user.json config file appears broken. You may have to login again " "to VRTY.ORG." msgstr "" "Конфигурационният файл smart_user.json явно е повреден. Моля логнете се " "наново във VRTY.ORG." #: ../variety/Smart.py:195 msgid "Your VRTY.ORG credentials are probably outdated. Please login again." msgstr "" "Данните Ви за вход във VRTY.ORG вероятно са стари. Моля влезте отново." #: ../variety/Smart.py:597 ../variety/Smart.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:111 msgid "Sync" msgstr "Синхронизиранe" #: ../variety/Smart.py:598 #, python-format msgid "Fetching %d images" msgstr "Изтегляме %d картинки" #: ../variety/Smart.py:598 msgid "Fetching 1 image" msgstr "Изтегляме 1 картинка" #: ../variety/Smart.py:643 msgid "Finished" msgstr "Готово" #: ../variety/Smart.py:664 #, python-format msgid "Logged in as %s" msgstr "Влезли сте с потребител %s" #: ../variety/Smart.py:676 #, python-format msgid "" "Do you want to login to VRTY.ORG as %s?" msgstr "" "Искате ли да се логнете във VRTY.ORG като %s?" #: ../variety/Smart.py:677 msgid "VRTY.ORG login confirmation" msgstr "Потвърждение за логин във VRTY.ORG" #: ../data/plugins/quotes/QuotationsPageSource.py:35 msgid "Fetches quotes from TheQuotationsPage.com" msgstr "Тегли цитати от TheQuotationsPage.com" #: ../variety/__init__.py:143 msgid "Terminating signal received, quitting..." msgstr "Получихме сигнал за излизане, излизаме..." #: ../variety/__init__.py:198 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Variety е вече пусната. Изпращаме командата към вървящата инстанция." #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:1 msgid "VRTY.ORG integration" msgstr "Интеграция с VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:2 msgid "This feature requires VRTY.ORG integration" msgstr "Тази функция изисква интеграция с VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:3 msgid "Enable VRTY.ORG integration" msgstr "Включи интеграцията с VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:4 msgid "" "For this feature Variety needs permission to collect data about the images " "you like or dislike and the online sources you have enabled.\n" "\n" "Collected data is anonymous by default and covers only images which Variety " "downloaded, never images you already had in your local folders that might be " "private.\n" "\n" "This data helps us provide better images for everyone and fuels VRTY.ORG - a valuable resource for all users " "of Variety." msgstr "" "За тази функция Variety Има нужда от разрешение да събира данни за " "картинките, които харесвате или триете и за онлайн източниците, които сте " "активирали.\n" "\n" "Събраните данни са анонимни и покриват само картинки, свалени от Variety, не " "такива, които вече са били на компютъра Ви и може да са лични.\n" "\n" "Тези данни ни позволяват да предлагаме по-добри картинки на всички и " "захранват VRTY.ORG - ценен ресурс за всички " "потребители на Variety." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:1 msgid "Variety - VRTY.ORG" msgstr "Variety - VRTY.ORG" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:2 msgid "No, thanks" msgstr "Не, благодаря" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:4 msgid "" "Introducing VRTY.ORG! Wanna take part?" msgstr "" "Запознайте се с VRTY.ORG! Искате ли да се включите?" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:5 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to find and add new image sources to Variety, and to follow other users' " "favorites." msgstr "" "VRTY.ORG свързва потребители на Variety с " "подобен вкус към картинки и предоставя супер-удобни начини за смяна на " "тапета, за намиране и добавяне на нови източници на картинки и за абониране " "за любимите картинки на други потребители." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:6 msgid "" "Participation takes no effort - your profile will be built automatically, as " "you like or dislike images downloaded by Variety. Your profile will not be " "shared with third parties, unless you opt-in to make it public. Read more details about the " "service and the privacy policy here." msgstr "" "Участието не изисква усилия - профилът Ви ще бъде обновяван автоматично " "когато харесвате или триете картинки, които Variety е свалила. Профилът Ви " "няма да бъде споделян с никого, освен ако не решите сами да го направите " "публичен. Прочетете още за " "услугата и политиката за поверителност." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:7 msgid "" "Participation is required for some features of Variety such as synchronization of favorites between computers." msgstr "" "Участието е нужно за някои функции на Variety, като синхронизиране на любимите Ви картинки между компютрите " "Ви." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:8 #: ../data/ui/PreferencesVarietyDialog.ui.h:105 msgid "Participate in VRTY.ORG" msgstr "Участвайте във VRTY.ORG" #: ../data/plugins/quotes/QuotesDaddySource.py:31 msgid "" "Fetches quotes from QuotesDaddy's daily quotes RSS feed.\n" "Does not support searching by tags or authors." msgstr "" "Тегли цитати от RSS фийда на QuotesDaddy.\n" "Не поддържа търсене по тагове или автор." #: ../data/ui/AboutVarietyDialog.ui.h:1 msgid "Copyright (c) 2012, Peter Levi " msgstr "Запазени права (c) 2012, Петър Леви " #: ../data/ui/AboutVarietyDialog.ui.h:2 msgid "About Variety" msgstr "Относно Variety" #: ../data/ui/AboutVarietyDialog.ui.h:3 msgid "An automatic wallpaper changer, downloader and manager." msgstr "" "Програма за автоматично изтегляне, управление и смяна на тапети за работния " "плот" #: ../data/ui/AboutVarietyDialog.ui.h:4 msgid "http://peterlevi.com/variety" msgstr "http://peterlevi.com/variety" #: ../data/ui/AboutVarietyDialog.ui.h:5 msgid "" "# Copyright (c) 2012, Peter Levi \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, Peter Levi \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" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:1 msgid "Variety - add Wallpapers.net category" msgstr "Variety - добавяне на Wallpaper.net като източник" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:3 msgid "" "Please visit wallpapers.net and choose " "a category with wallpapers, then paste its URL below. A category is " "anything on the site that has one or more pages with wallpapers on them. " "Here are some examples:\n" "\n" "All wallpapers: http://www.wallpapers.net/\n" "Specific resolution: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" msgstr "" "Моля отворете wallpapers.net и " "изберете категория с тапети, после копирайте URL-а в полето отдолу. Можете " "да изпозлвате всяка част от сайта, която има една или повече страници с " "тапети. Ето няколко примера:\n" "\n" "Всички тапети: http://www.wallpapers.net/\n" "Определен размер: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:8 msgid "Paste URL here: " msgstr "Копирайте адреса тук: " #: ../data/ui/PreferencesVarietyDialog.ui.h:1 msgid "seconds" msgstr "секунди" #: ../data/ui/PreferencesVarietyDialog.ui.h:2 msgid "minutes" msgstr "минути" #: ../data/ui/PreferencesVarietyDialog.ui.h:3 msgid "hours" msgstr "часа" #: ../data/ui/PreferencesVarietyDialog.ui.h:4 msgid "days" msgstr "дни" #: ../data/ui/PreferencesVarietyDialog.ui.h:5 msgid "Variety Preferences" msgstr "Variety: Настройки" #: ../data/ui/PreferencesVarietyDialog.ui.h:6 msgid "General" msgstr "Общи" #: ../data/ui/PreferencesVarietyDialog.ui.h:7 msgid "Start Variety when the computer starts" msgstr "Стартирай Variety при стартиране на компютъра" #: ../data/ui/PreferencesVarietyDialog.ui.h:8 msgid "Change wallpaper every " msgstr "Сменяй тапета на всеки " #: ../data/ui/PreferencesVarietyDialog.ui.h:9 msgid "Minimum interval is 5 seconds" msgstr "Минималният интервал е 5 секунди" #: ../data/ui/PreferencesVarietyDialog.ui.h:10 msgid "Change wallpaper on start" msgstr "Сменяй тапета при стартиране" #: ../data/ui/PreferencesVarietyDialog.ui.h:12 msgid "Enabled" msgstr "Използвай" #: ../data/ui/PreferencesVarietyDialog.ui.h:13 msgid "Type" msgstr "Тип" #: ../data/ui/PreferencesVarietyDialog.ui.h:14 msgid "Location" msgstr "Адрес" #: ../data/ui/PreferencesVarietyDialog.ui.h:15 msgid "_Add..." msgstr "_Добави..." #: ../data/ui/PreferencesVarietyDialog.ui.h:16 msgid "Add images, folders or online image sources" msgstr "Добавяне на картинки, папки или онлайн източници" #: ../data/ui/PreferencesVarietyDialog.ui.h:17 msgid "_Edit..." msgstr "_Редактирай..." #: ../data/ui/PreferencesVarietyDialog.ui.h:18 msgid "Edit the selected source" msgstr "Редактиране на избрания източник" #: ../data/ui/PreferencesVarietyDialog.ui.h:19 msgid "_Remove..." msgstr "_Изтрий…" #: ../data/ui/PreferencesVarietyDialog.ui.h:20 msgid "Remove selected image sources" msgstr "Премахване на избрания източник" #: ../data/ui/PreferencesVarietyDialog.ui.h:21 msgid "_Use" msgstr "_Използвай" #: ../data/ui/PreferencesVarietyDialog.ui.h:22 msgid "Enable the selected sources and disable all others" msgstr "Активирай избрания източник и деактивирай всички други" #: ../data/ui/PreferencesVarietyDialog.ui.h:23 msgid "Download a wallpaper every " msgstr "Изтегляй нов тапет на всеки " #: ../data/ui/PreferencesVarietyDialog.ui.h:24 msgid "Minimum interval is one minute" msgstr "Минималният интервал е една минута" #: ../data/ui/PreferencesVarietyDialog.ui.h:25 msgid "to " msgstr "във " #: ../data/ui/PreferencesVarietyDialog.ui.h:26 msgid "Actual download folder " msgstr "Реална папка за теглене " #: ../data/ui/PreferencesVarietyDialog.ui.h:27 msgid "" "Caution: do NOT use this option if you use a custom download folder with " "valuable files in it. Variety will maintain the limit regardless of what is " "in the download folder." msgstr "" "Внимание: НЕ изпозлвайте тази опция ако сте избрали папка за теглене, в " "която държите ценни файлове. Variety ще поддържа зададената квота като трие " "стари файлове, независимо какво има в папката за теглене." #: ../data/ui/PreferencesVarietyDialog.ui.h:28 msgid "Limit download folder to " msgstr "Ограничи папката за теглене до " #: ../data/ui/PreferencesVarietyDialog.ui.h:29 msgid "Minimum size is 50 MB" msgstr "Минималният размер е 50 мб" #: ../data/ui/PreferencesVarietyDialog.ui.h:30 msgid "MB by deleting oldest files when necessary" msgstr "мб като триеш най-старите файлове когато е необходимо" #: ../data/ui/PreferencesVarietyDialog.ui.h:31 msgid "Favorites" msgstr "Любими" #: ../data/ui/PreferencesVarietyDialog.ui.h:32 msgid "Copy favorite wallpapers to " msgstr "Копирай любимите тапети във " #: ../data/ui/PreferencesVarietyDialog.ui.h:33 msgid "Filters" msgstr "Филтри" #: ../data/ui/PreferencesVarietyDialog.ui.h:34 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" "Върху тапетите прилагай някой случайно избран филтър от следните (с " "благодарности към ImageMagick):" #: ../data/ui/PreferencesVarietyDialog.ui.h:35 msgid "Quotes" msgstr "Цитати" #: ../data/ui/PreferencesVarietyDialog.ui.h:36 msgid "Show random wise quotes on the desktop" msgstr "Показвай разнообразни умни цитати върху работния плот" #: ../data/ui/PreferencesVarietyDialog.ui.h:37 msgid "Text color: " msgstr "Цвят на текста: " #: ../data/ui/PreferencesVarietyDialog.ui.h:38 msgid "Text font: " msgstr "Шрифт на текста: " #: ../data/ui/PreferencesVarietyDialog.ui.h:39 msgid "Backdrop color: " msgstr "Цвят на фона: " #: ../data/ui/PreferencesVarietyDialog.ui.h:40 msgid "Backdrop opacity: " msgstr "Прозрачност на фона: " #: ../data/ui/PreferencesVarietyDialog.ui.h:41 msgid " Transparent" msgstr " Прозрачен" #: ../data/ui/PreferencesVarietyDialog.ui.h:42 msgid "Opaque" msgstr "Непрозрачен" #: ../data/ui/PreferencesVarietyDialog.ui.h:43 msgid "Draw a text shadow" msgstr "Добави сянка под текста" #: ../data/ui/PreferencesVarietyDialog.ui.h:44 msgid "Appearance" msgstr "Външен вид" #: ../data/ui/PreferencesVarietyDialog.ui.h:45 msgid "Quotes area width: " msgstr "Ширина на полето за цитати: " #: ../data/ui/PreferencesVarietyDialog.ui.h:46 msgid "Narrow " msgstr "Тясно " #: ../data/ui/PreferencesVarietyDialog.ui.h:47 msgid "Wide" msgstr "Широко" #: ../data/ui/PreferencesVarietyDialog.ui.h:48 msgid "Horizontal position: " msgstr "Хоризонтална позиция: " #: ../data/ui/PreferencesVarietyDialog.ui.h:49 msgid "Left " msgstr "Вляво " #: ../data/ui/PreferencesVarietyDialog.ui.h:50 ../variety/ThumbsManager.py:44 msgid "Right" msgstr "Вдясно" #: ../data/ui/PreferencesVarietyDialog.ui.h:51 msgid "Vertical position: " msgstr "Вертикална позиция: " #: ../data/ui/PreferencesVarietyDialog.ui.h:52 msgid "Top " msgstr "Горе " #: ../data/ui/PreferencesVarietyDialog.ui.h:53 ../variety/ThumbsManager.py:41 msgid "Bottom" msgstr "Долу" #: ../data/ui/PreferencesVarietyDialog.ui.h:54 msgid "Placement" msgstr "Разположение" #: ../data/ui/PreferencesVarietyDialog.ui.h:55 msgid "Show quotes from these sources: " msgstr "Показвай цитати от следните източници: " #: ../data/ui/PreferencesVarietyDialog.ui.h:56 msgid "" "More " "plugins" msgstr "" "Още " "плъгини" #: ../data/ui/PreferencesVarietyDialog.ui.h:57 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" "Показвай само тези тагове и автори. Оставете празно, за да се показват " "случайни цитати." #: ../data/ui/PreferencesVarietyDialog.ui.h:59 msgid "Example: funny, inspirational" msgstr "Пример: funny, inspirational" #: ../data/ui/PreferencesVarietyDialog.ui.h:60 msgid "Example: Albert Einstein, Voltaire" msgstr "Пример: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui.h:61 msgid "Authors: " msgstr "Автори: " #: ../data/ui/PreferencesVarietyDialog.ui.h:62 msgid "Sources and filtering" msgstr "Източници и филтриране" #: ../data/ui/PreferencesVarietyDialog.ui.h:63 msgid "Change quote every " msgstr "Сменяй цитата на всеки " #: ../data/ui/PreferencesVarietyDialog.ui.h:64 msgid "Minimum interval is 10 seconds" msgstr "Минималния интервал е 10 секунди" #: ../data/ui/PreferencesVarietyDialog.ui.h:65 msgid "Regular change" msgstr "Регулярна смяна" #: ../data/ui/PreferencesVarietyDialog.ui.h:66 msgid "Clock" msgstr "Часовник" #: ../data/ui/PreferencesVarietyDialog.ui.h:67 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "Показвай красив дигитален часовник с дата и час" #: ../data/ui/PreferencesVarietyDialog.ui.h:68 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.h:69 msgid "Clock font: " msgstr "Шрифт за часа: " #: ../data/ui/PreferencesVarietyDialog.ui.h:70 msgid "Date font: " msgstr "Шрифт за датата: " #: ../data/ui/PreferencesVarietyDialog.ui.h:71 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "Тези не работят? Чети тук. Как " "да донастроим часовника? Чети " "тук." #: ../data/ui/PreferencesVarietyDialog.ui.h:72 msgid "Effects" msgstr "Ефекти" #: ../data/ui/PreferencesVarietyDialog.ui.h:73 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:74 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:75 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:76 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:77 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:78 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:79 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:80 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:81 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:82 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:83 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:84 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:85 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:86 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:87 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:88 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:89 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:90 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:91 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:92 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:93 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:94 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:95 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:96 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:97 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:98 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:99 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:100 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:101 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:102 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:103 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:104 msgid "VRTY.ORG" msgstr "VRTY.ORG" #: ../data/ui/PreferencesVarietyDialog.ui.h:106 msgid "VRTY.ORG is in beta and will take some time to mature" msgstr "VRTY.ORG е още в Beta и ще мине време докато \"узрее\"" #: ../data/ui/PreferencesVarietyDialog.ui.h:107 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to add new image sources to Variety, and to follow other users' favorites. " "It is fueled by the favorite images of all participating users." msgstr "" "VRTY.ORG свързва потребители на Variety с " "подобен вкус към картинки и предоставя супер-удобни начини за смяна на " "тапета, за намиране и добавяне на нови източници и за абониране за любимите " "картинки на други потребители. Сайтът се подхранва от любимите картинки на " "всички участващи потребители." #: ../data/ui/PreferencesVarietyDialog.ui.h:108 msgid "" "Could not create user - no connection to VRTY.ORG. We will try again later." msgstr "" "Не успяхме да създаден потребител - няма връзка с VRTY.ORG. Ще опитаме пак " "по-късно." #: ../data/ui/PreferencesVarietyDialog.ui.h:110 msgid "" "Registration enables cool features like synchronization of favorite images " "and sources between computers and personalized recommendations." msgstr "" "Регистрацията е нужна за някои интересни функции като синхронизиране на " "картинки и източници между компютрите Ви и персонализирани препоръки." #: ../data/ui/PreferencesVarietyDialog.ui.h:112 msgid "Synchronize favorite images between computers" msgstr "Синхронизиране на любимите картинки между компютрите" #: ../data/ui/PreferencesVarietyDialog.ui.h:113 msgid "Requires VRTY.ORG enabled and logged in." msgstr "Изисква да сте включили интеграцията с VRTY.ORG и да сте логнати" #: ../data/ui/PreferencesVarietyDialog.ui.h:114 msgid "" "Your favorite images from other computers will be automatically downloaded " "to this computer. You need to be logged in with the same VRTY.ORG user " "everywhere. Sync will not delete any images." msgstr "" "Любимите Ви картинки от други компютри ще бъдат автоматично сваляни на този. " "Трябва да сте логнати с еднакъв VRTY.ORG потребител навсякъде. " "Синхронизирането никога не трие картинки." #: ../data/ui/PreferencesVarietyDialog.ui.h:115 msgid "Privacy policy" msgstr "Поверителност на данните" #: ../data/ui/PreferencesVarietyDialog.ui.h:116 msgid "" "Variety sends data only for images it downloaded, never for images you " "already had in your local folders that might be private, and Sync does not " "work for such images. Collected data is not shared with third parties, " "unless you opt-in to make your profile public. Read more details about the " "service and the privacy policy here." msgstr "" "Variety изпраща информация само за картинки, които тя е свалила, никога за " "такива, които пазите локално на компютъра си и може да представляват лични " "данни. Синхронизирането също не работи за такива картинки. Събраните данни " "не се споделят с никого, освен ако не направите сами профила си публичен. Прочетете повече за услугата и " "политиката за поверителност." #: ../data/ui/PreferencesVarietyDialog.ui.h:117 msgid "Usage statistics" msgstr "Статистика за използването" #: ../data/ui/PreferencesVarietyDialog.ui.h:118 msgid "Help make Variety better by sending anonymous usage statistics" msgstr "" "Помогнете ни да подобряваме Variety като ни изпращате анонимни данни за " "използването ѝ" #: ../data/ui/PreferencesVarietyDialog.ui.h:119 msgid "" "These stats help us improve Variety by understanding how users interact with " "it. They also include general info about your OS version and monitor setup. " "Collected data is not shared with anyone." msgstr "" "Тези данни ни помагат да разберем как потребителите на Variety работят с " "програмата. Те също така включват обща информация за версията на " "операционната система и конфигурацията на мониторите. Събраните данни не се " "споделят с никого." #: ../data/ui/PreferencesVarietyDialog.ui.h:120 msgid "Sync and social" msgstr "Синхронизиране" #: ../data/ui/PreferencesVarietyDialog.ui.h:121 msgid "Fetch folder" msgstr "Папка за ръчно изтегляне" #: ../data/ui/PreferencesVarietyDialog.ui.h:122 msgid "Save manually downloaded wallpapers to " msgstr "Записвай ръчно изтеглените тапети във " #: ../data/ui/PreferencesVarietyDialog.ui.h:123 msgid "Drag and drop" msgstr "Влачене и пускане" #: ../data/ui/PreferencesVarietyDialog.ui.h:124 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.h:126 msgid "Clipboard monitoring" msgstr "Следене на клипборда" #: ../data/ui/PreferencesVarietyDialog.ui.h:127 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Следи клипборда за адреси към картинки и ги изтегляй" #: ../data/ui/PreferencesVarietyDialog.ui.h:128 msgid "But fetch only when the URL host is one of these:" msgstr "Но ги изтегляй само когато домейнът в адреса е един от тези:" #: ../data/ui/PreferencesVarietyDialog.ui.h:129 msgid "Manual downloading" msgstr "Ръчно теглене" #: ../data/ui/PreferencesVarietyDialog.ui.h:130 msgid "When possible use images that:" msgstr "Когато е възможно, използвай картинки, които:" #: ../data/ui/PreferencesVarietyDialog.ui.h:131 ../variety/ThumbsManager.py:98 msgid "Size" msgstr "Размер" #: ../data/ui/PreferencesVarietyDialog.ui.h:132 msgid "Have landscape orientation" msgstr "Са с хоризонтална ориентация" #: ../data/ui/PreferencesVarietyDialog.ui.h:133 msgid "Are big at least " msgstr "Са големи поне " #: ../data/ui/PreferencesVarietyDialog.ui.h:134 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui.h:135 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui.h:136 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui.h:138 #, no-c-format msgid "% of the screen resolution" msgstr "% от размера на екрана" #: ../data/ui/PreferencesVarietyDialog.ui.h:139 msgid "Color" msgstr "Цвят" #: ../data/ui/PreferencesVarietyDialog.ui.h:140 msgid "Are dark or light:" msgstr "Са тъмни или светли:" #: ../data/ui/PreferencesVarietyDialog.ui.h:141 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Тъмни" #: ../data/ui/PreferencesVarietyDialog.ui.h:142 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Светли" #: ../data/ui/PreferencesVarietyDialog.ui.h:143 msgid "Contain this color: " msgstr "Съдържат този цвят: " #: ../data/ui/PreferencesVarietyDialog.ui.h:144 msgid "(Takes effect after some initial searching)" msgstr "(Влиза в действие след известно време за търсене)" #: ../data/ui/PreferencesVarietyDialog.ui.h:145 msgid "Rating" msgstr "Оценка" #: ../data/ui/PreferencesVarietyDialog.ui.h:146 msgid "Have EXIF rating at least " msgstr "Имат EXIF оценка поне " #: ../data/ui/PreferencesVarietyDialog.ui.h:147 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui.h:148 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui.h:149 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui.h:150 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui.h:151 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui.h:152 msgid "Color and size" msgstr "Цвят и размер" #: ../data/ui/PreferencesVarietyDialog.ui.h:153 msgid "Indicator Icon" msgstr "Индикаторна икона" #: ../data/ui/PreferencesVarietyDialog.ui.h:154 msgid "Indicator icon:" msgstr "Индикаторна икона:" #: ../data/ui/PreferencesVarietyDialog.ui.h:155 msgctxt "Icon option" msgid "Light" msgstr "Светла" #: ../data/ui/PreferencesVarietyDialog.ui.h:156 msgctxt "Icon option" msgid "Dark" msgstr "Тъмна" #: ../data/ui/PreferencesVarietyDialog.ui.h:157 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Използвай текущия тапет" #: ../data/ui/PreferencesVarietyDialog.ui.h:158 msgctxt "Icon option" msgid "Custom image..." msgstr "Задай картинка..." #: ../data/ui/PreferencesVarietyDialog.ui.h:159 msgctxt "Icon option" msgid "None" msgstr "Без икона" #: ../data/ui/PreferencesVarietyDialog.ui.h:160 msgid "Select an icon" msgstr "Изберете икона" #: ../data/ui/PreferencesVarietyDialog.ui.h:161 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.h:162 msgid "Favorites Operations" msgstr "Операция за добавяне в Любими" #: ../data/ui/PreferencesVarietyDialog.ui.h:163 msgid "Favorites operations to show in main menu:" msgstr "Операция за Любими в менюто:" #: ../data/ui/PreferencesVarietyDialog.ui.h:164 msgid "Copy to Favorites" msgstr "Копирай в Любими" #: ../data/ui/PreferencesVarietyDialog.ui.h:166 msgid "Both Copy and Move" msgstr "И двете (Копирай и Премести)" #: ../data/ui/PreferencesVarietyDialog.ui.h:167 msgid "Depends on folder..." msgstr "Зависи от папката..." #: ../data/ui/PreferencesVarietyDialog.ui.h:170 msgid "Display dialog to customize the Facebook post before publishing" msgstr "" "Показвай диалог за редактиране на Facebook поста преди да бъде публикуван" #: ../data/ui/PreferencesVarietyDialog.ui.h:171 msgid "Login Screen Support" msgstr "Интеграция с логин екрана" #: ../data/ui/PreferencesVarietyDialog.ui.h:172 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" "Искам всички тапети, зададени от Variety, да се показват и на логин екрана" #: ../data/ui/PreferencesVarietyDialog.ui.h:173 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.h:174 msgid "Copy wallpaper image files to this folder: " msgstr "Копирай тапетите в тази папка: " #: ../data/ui/PreferencesVarietyDialog.ui.h:175 msgid "Reset to default" msgstr "По подразбиране" #: ../data/ui/PreferencesVarietyDialog.ui.h:176 msgid "Still doesn't work?" msgstr "Пак не работи?" #: ../data/ui/PreferencesVarietyDialog.ui.h:177 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" "Изглажда home директорията Ви е криптирана. Опцията няма да сработи с папки, " "които са вътре." #: ../data/ui/PreferencesVarietyDialog.ui.h:178 msgid "You don't have write permissions for this folder." msgstr "Нямате права за писане в тази папка" #: ../data/ui/PreferencesVarietyDialog.ui.h:179 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "Правата на тази папка не допускат LightDM да чете оттам." #: ../data/ui/PreferencesVarietyDialog.ui.h:180 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" "Variety може да промени правата, но ще трябва да предоставите root " "привилегии." #: ../data/ui/PreferencesVarietyDialog.ui.h:181 msgid "Customize" msgstr "Персонализиране" #: ../data/ui/PreferencesVarietyDialog.ui.h:182 msgid "Tips and tricks" msgstr "Полезни съвети" #: ../data/ui/PreferencesVarietyDialog.ui.h:183 msgid "Recent changes" msgstr "Последни промени" #: ../data/ui/PreferencesVarietyDialog.ui.h:184 msgid "Visit website" msgstr "Посети уебсайта" #: ../data/ui/PreferencesVarietyDialog.ui.h:185 msgid "Report a bug or request a feature" msgstr "Докладвай за бъг или поискай нова функция" #: ../data/ui/PreferencesVarietyDialog.ui.h:186 msgid "Send feedback" msgstr "Изпрати отзив" #: ../data/ui/PreferencesVarietyDialog.ui.h:187 msgid "Donate to Variety" msgstr "Направи дарение за Variety" #: ../data/ui/PreferencesVarietyDialog.ui.h:188 msgid "Donate via PayPal" msgstr "Направи дарение чрез PayPal" #: ../data/ui/PreferencesVarietyDialog.ui.h:189 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.h:193 msgid "" "For Bitcoin and other payment methods please go to Variety's website." msgstr "" "За плащане с Bitcoin или други методи, моля посетете сайта на Variety." #: ../data/ui/PreferencesVarietyDialog.ui.h:194 msgid "Donate" msgstr "Направи дарение" #: ../variety/FacebookHelper.py:116 msgid "Authorization successful" msgstr "Успешна оторизация" #: ../variety/FacebookHelper.py:116 msgid "Publishing..." msgstr "Публикуване..." #: ../variety/FacebookHelper.py:121 msgid "Authorization failed" msgstr "Неуспешна оторизация" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Горе" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Вляво" #: ../variety/ThumbsManager.py:94 msgid "Position" msgstr "Разположение" #: ../variety/ThumbsManager.py:109 msgid "Show Containing Folder" msgstr "Отвори папката" #: ../variety/ThumbsManager.py:136 ../variety/indicator.py:156 msgid "Set EXIF Rating" msgstr "EXIF оценка" #: ../variety/ThumbsManager.py:160 ../variety/indicator.py:87 msgid "Delete to _Trash" msgstr "Изтрий към Коша" #: ../variety/ThumbsManager.py:167 ../variety/indicator.py:131 msgid "Where is it from?" msgstr "Откъде идва?" #: ../variety/ThumbsManager.py:178 msgid "Close" msgstr "Затвори" #: ../variety/ThumbsManager.py:198 msgid "Could not set EXIF rating" msgstr "Не успях да запиша EXIF оценката" #: ../variety/ThumbsManager.py:217 msgid "Unrated" msgstr "Без оценка" #: ../variety/ThumbsManager.py:224 msgid "Rejected" msgstr "Отхвърлено" #: ../variety/ThumbsManager.py:324 msgid "Variety History" msgstr "Variety: История" #: ../variety/ThumbsManager.py:326 msgid "Variety Recent Downloads" msgstr "Variety: Скорошно изтеглени" #: ../variety/ThumbsManager.py:328 msgid "Variety Images" msgstr "Variety: Картинки" #: ../data/ui/AddWallbaseDialog.ui.h:1 msgid "Variety - add Wallbase.cc image source" msgstr "Variety - добавяне на Wallbase.cc като източник" #: ../data/ui/AddWallbaseDialog.ui.h:2 msgid "Wallbase.cc" msgstr "Wallbase.cc" #: ../data/ui/AddWallbaseDialog.ui.h:3 msgid "" "Wallbase.cc is permanently down. Use Wallhaven.cc instead. Support for " "Wallbase.cc will be dropped completely in a future release, please remove or " "update your existing Wallbase sources." msgstr "" "Wallbase.cc вече не работи. Използвайте Wallhaven.cc вместо това. " "Поддръжката за Wallbase.cc във Variety ще бъде напълно премахната в някоя " "бъдеща версия, моля премахнете или обновете Wallbase.cc източниците си." #: ../data/ui/AddWallbaseDialog.ui.h:4 msgid "" "Wallbase.cc provides a variety of image " "search options. Below you can specify keywords to search for, or visit Wallbase.cc, setup your search criteria " "there, ensure you like the results, and paste the full Wallbase URL in the " "box.\n" "\n" "If you specify keywords, the most liked safe-for-work images that match any " "of the keywords will be used. \n" "\n" "If you specify a Wallbase 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." msgstr "" "Wallbase.cc предоставя набор от различни " "начини за търсене. В полето отдолу може да зададете ключови думи, за които " "да се търси, или може да посетите Wallbase.cc, там да настроите изцяло " "критериите си за търсене, да се уверите, че харесвате резултатите и след " "това да копирате URL-а в полето.\n" "\n" "Ако зададете ключови думи, ще бъдат използвани най-харесваните \"безобидни\" " "картинки, които отговарят на някоя от ключовите думи. \n" "\n" "Ако зададете Wallbase URL, моля изберете внимателно критерия за сортиране - " "Variety търси картинки регулярно, но използва само първите няколкостотин " "върнати резултата. Random или Date ще означават, че този източник на " "картинки ще има по-дълъг \"живот\" преди да се изчерпи. Favorites ще връща " "най-общо по-хубави картинки, а Relevance ще връща картинки, които по-точно " "съответсват на търсенето когато се търси по цяла фраза или цвят." #: ../data/ui/FacebookPublishDialog.ui.h:1 msgid "Variety - Publish to Facebook" msgstr "Variety - Публикувай във Фейсбук" #: ../data/ui/FacebookPublishDialog.ui.h:2 ../variety/indicator.py:149 #: ../variety/indicator.py:223 msgid "Share on Facebook" msgstr "Сподели във Фейсбук" #: ../data/ui/FacebookPublishDialog.ui.h:3 msgid "" "Publish a link to the current wallpaper on Facebook. Include this text along " "with the link (or just leave empty):" msgstr "" "Публикувай връзка към текущия тапет във Фейсбук. Добави този текст към " "връзката (можете да го оставите празен):" #: ../data/ui/FacebookPublishDialog.ui.h:4 msgid "Use current quote" msgstr "Използвай текущия цитат" #: ../data/ui/SmartRegisterDialog.ui.h:1 msgid "Variety - VRTY.ORG registration" msgstr "Variety - Регистриране във VRTY.ORG" #: ../data/ui/SmartRegisterDialog.ui.h:2 msgid "Would you like to register?" msgstr "Искате ли да се регистрирате?" #: ../data/ui/SmartRegisterDialog.ui.h:3 msgid "" "You may participate in VRTY.ORG " "anonymously, but registration enables some very nice features, such as synchronization of favorites between computers and " "personalized recommendations. It also ensures " "you will not lose your profile and favorite wallpapers if you reinstall your " "OS." msgstr "" "Можете да участвате във VRTY.ORG анонимно, " "но регистрацията Ви позволява да използвате някои много интересни функции " "като синхронизиране на любимите Ви картинки " "между компютрите и персонализирани препоръки. " "Тя също означава, че няма да загубите профила си и любимите си тапети при " "преинсталация на системата." #: ../data/ui/SmartRegisterDialog.ui.h:4 msgid "Registration is very easy and does not require any personal data." msgstr "Регистрацията е много лесна и не изисква никакви лични данни." #: ../data/ui/SmartRegisterDialog.ui.h:5 msgid "" "If you choose to participate anonymously, you can register later from the " "\"Sync and social\" page in Preferences." msgstr "" "Ако предпочетете да участвате анонимно, можете да се регистрирате по-късно " "от страницата за Синхронизиране в настройките." #: ../data/ui/SmartRegisterDialog.ui.h:6 msgid "" "Oops, we could not connect to VRTY.ORG. Server might be down. Please wait a " "couple of minutes and try again or choose \"Participate anonymously\" and register later " "from the \"Sync and social\" page in " "Preferences." msgstr "" "Упс, не можахме да се свържем с VRTY.ORG. Сървърът може би не работи в " "момента. Моля изчакайте няколко минути и пробвайте отново или изберете \"Анонимно участие\" и се регистрирайте по-късно " "от \"Синхронизиране\" в настройките." #: ../data/ui/SmartRegisterDialog.ui.h:7 msgid "" "Please continue the registration and follow the instructions in the browser " "tab we opened." msgstr "Моля продължете процеса по регистрация в браузъра си." #: ../data/ui/SmartRegisterDialog.ui.h:8 msgid "I will participate anonymously" msgstr "Ще участвам анонимно" #: ../data/ui/SmartRegisterDialog.ui.h:9 msgid "I'm registered, let me login" msgstr "Регистриран съм, Вход" #: ../data/ui/SmartRegisterDialog.ui.h:10 msgid "Register here" msgstr "Регистрирайте се тук" #: ../variety.desktop.in.h:1 msgid "Variety" msgstr "Variety" #: ../variety.desktop.in.h:2 msgid "Variety Wallpaper Changer" msgstr "Variety Wallpaper Changer" #: ../variety.desktop.in.h:3 msgid "Next" msgstr "Напред" #: ../variety.desktop.in.h:4 msgid "Previous" msgstr "Назад" #: ../variety.desktop.in.h:5 msgid "Pause / Resume" msgstr "Пауза / Подновяване" #: ../variety.desktop.in.h:6 msgid "History" msgstr "История" #: ../variety.desktop.in.h:7 msgid "Preferences" msgstr "Настройки" #: ../data/plugins/quotes/LocalFilesSource.py:34 msgid "" "Displays quotes, defined in local text files.\n" "Put your own txt files in: ~/.config/variety/pluginconfig/quotes/.\n" "The file format is:\n" "\n" "quote -- author\n" ".\n" "second quote -- another author\n" ".\n" "etc...\n" "\n" "Example: http://rvelthuis.de/zips/quotes.txt" msgstr "" "Показва цитати, дефинирани в локални текстови файлове.\n" "Слагайте вашите txt файлове в: ~/.config/variety/pluginconfig/quotes/.\n" "Форматът на файловете е:\n" "\n" "цитат -- автор\n" ".\n" "друг цитат -- друг автор\n" ".\n" "и т.н.\n" "\n" "Пример: http://rvelthuis.de/zips/quotes.txt" #: ../variety/indicator.py:49 ../variety/indicator.py:96 #: ../variety/indicator.py:166 msgid "_Next" msgstr "_Следваща" #: ../variety/indicator.py:54 ../variety/indicator.py:101 #: ../variety/indicator.py:171 msgid "_Previous" msgstr "_Предишна" #: ../variety/indicator.py:61 msgid "Current desktop wallpaper" msgstr "Текущ тапет" #: ../variety/indicator.py:65 msgid "Show origin" msgstr "Отвори източника" #: ../variety/indicator.py:106 ../variety/indicator.py:176 msgid "_Next, skipping forward history" msgstr "Следваща, пропускайки историята" #: ../variety/indicator.py:114 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Съвет: Скролирайте с колелцето\n" "върху иконата за да сменяте тапета." #: ../variety/indicator.py:124 msgid "_Image" msgstr "_Картинка" #: ../variety/indicator.py:135 msgid "Show without effects" msgstr "Покажи без ефектите" #: ../variety/indicator.py:143 msgid "Google Image Search" msgstr "Търсене на картинката с Google Image Search" #: ../variety/indicator.py:196 msgid "View Favorites..." msgstr "Виж Любимите..." #: ../variety/indicator.py:203 msgid "Copy to Clipboard" msgstr "Копирай в клипборда" #: ../variety/indicator.py:213 msgid "Google Quote" msgstr "Потърси цитата в Google" #: ../variety/indicator.py:218 msgid "Google Author" msgstr "Потърси автора в Google" #: ../variety/indicator.py:230 ../variety/indicator.py:284 msgid "Preferences..." msgstr "Настройки..." #: ../variety/indicator.py:238 msgid "Turn off" msgstr "Изключи" #: ../variety/indicator.py:244 msgid "_Quote" msgstr "_Цитат" #: ../variety/indicator.py:251 msgid "_History" msgstr "_История" #: ../variety/indicator.py:257 msgid "_Wallpaper Selector" msgstr "Избиране на тапет" #: ../variety/indicator.py:263 msgid "Recent _Downloads" msgstr "_Скорошно изтеглени" #: ../variety/indicator.py:278 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:288 msgid "About" msgstr "За приложението" #: ../variety/indicator.py:292 msgid "Quit" msgstr "Изход" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:1 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Копирай в Любими или Премести в Любими" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:2 msgid "Reset to Default" msgstr "Върни оригиналната стойност" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:3 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.h:4 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" #: ../variety/ImageFetcher.py:56 ../variety/ImageFetcher.py:103 msgid "Fetching" msgstr "Изтегляне" #. too small - delete and do not use #: ../variety/ImageFetcher.py:118 msgid "Image too small, ignoring it" msgstr "Картинката е твърде малка, игнорираме я" #: ../variety/ImageFetcher.py:140 #, python-format msgid "Sorry, got %s error..." msgstr "Съжалявам, получихме грешка %s..." #: ../variety/ImageFetcher.py:141 msgid "This means the link is no longer valid" msgstr "Това означава, че линкът вече е невалиден" #: ../variety/ImageFetcher.py:144 msgid "Fetch failed for some reason" msgstr "Изтеглянето беше неуспешно" #: ../variety/ImageFetcher.py:145 msgid "" "To get more information, please run Variety from terminal with -v option and " "retry the action" msgstr "" "За повече информация, моля стартирайте Variety в терминал с опция -v и " "повторете действието." variety/po/ko.po0000644000000000000000000030446212655724345011044 0ustar msgid "" msgstr "" "Project-Id-Version: variety\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-01-29 10:57+0200\n" "PO-Revision-Date: 2015-05-15 13:34+0000\n" "Last-Translator: M.W.Park \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-02-07 20:28+0000\n" "X-Generator: Launchpad (build 17908)\n" "Language: Occitan (post 1500); Provençal\n" "X-Loco-Source-Locale: ms_MY\n" "X-Loco-Parser: loco_parse_po\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Loco-Target-Locale: oc_ZZ\n" #: ../data/plugins/quotes/GoodreadsSource.py:49 msgid "Fetches quotes from Goodreads.com" msgstr "Goodreads.com으로부터 명언을 불러옵니다" #: ../data/ui/LoginOrRegisterDialog.ui.h:1 msgid "Login to VRTY.ORG" msgstr "VRTY.ORG에 로그인하기" #: ../data/ui/LoginOrRegisterDialog.ui.h:2 msgid "Username: " msgstr "사용자 이름: " #: ../data/ui/LoginOrRegisterDialog.ui.h:3 msgid "Password: " msgstr "암호: " #: ../data/ui/LoginOrRegisterDialog.ui.h:4 msgid "No account? Register here" msgstr "계정이 없으십니까? 여기서 회원 가입을 하십시오" #: ../data/ui/LoginOrRegisterDialog.ui.h:5 msgid "Forgot your password?" msgstr "암호를 잊으셨습니까?" #: ../data/ui/LoginOrRegisterDialog.ui.h:6 msgid "" "Tip: You can also login to VRTY.ORG in a " "browser and click the link \"Trigger Variety " "login\" in your profile." msgstr "" "비법: 또한, 당신은 브라우저에서 VRTY.ORG로 로그인을 하시고 당신의 " "프로필에서 \"버라이어티 로그인이 작동되도록 합니다\" 링크를 누르실 수 있습니다." #: ../data/ui/LoginOrRegisterDialog.ui.h:7 msgid "Login" msgstr "로그인" #: ../variety/LoginOrRegisterDialog.py:80 #, python-format msgid "Oops, server returned error (%s)" msgstr "앗, 서버가 오류를 반환했습니다(%s)" #: ../variety/LoginOrRegisterDialog.py:85 msgid "Could not connect to server" msgstr "서버에 연결할 수 없습니다" #: ../variety/AddWallhavenDialog.py:38 ../variety/AddWallbaseDialog.py:38 #: ../variety/AddFlickrDialog.py:138 msgid "No images found" msgstr "이미지를 찾을 수 없습니다" #: ../data/ui/AddPanoramioDialog.ui.h:1 msgid "Variety - add Panoramio image source" msgstr "버라이어티 - 파노라미오 이미지 소스를 추가합니다" #. (_("Wallbase.cc"), self.on_add_wallbase_clicked), #: ../data/ui/AddPanoramioDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:388 msgid "Panoramio" msgstr "파노라미오" #: ../data/ui/AddPanoramioDialog.ui.h:3 msgid "Please zoom over your area of interest." msgstr "당신이 관심 있는 부분을 확대하십시오." #: ../variety/FolderChooser.py:65 msgid "Choose a folder" msgstr "폴더를 선택하십시오" #: ../variety/FolderChooser.py:66 ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Cancel" msgstr "취소" #: ../variety/FolderChooser.py:66 msgid "OK" msgstr "확인" #: ../data/ui/AddWallhavenDialog.ui.h:1 msgid "Variety - add Wallhaven.cc image source" msgstr "버라이어티 - Wallhaven.cc 이미지 소스를 추가합니다" #: ../data/ui/AddWallhavenDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:386 msgid "Wallhaven.cc" msgstr "Wallhaven.cc" #: ../data/ui/AddWallhavenDialog.ui.h:3 msgid "" "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." msgstr "" "Wallhaven.cc는 다양한 이미지 검색 선택 사항을 제공합니다. " "여기서 당신은 찾으려 하는 검색어의 키워드를 지정하시거나, Wallhaven.cc를 방문하셔서, 당신에게 만족스러운 검색 결과를 확실하게 " "제공하는, 당신만의 검색 조건을 설정하시고, 검색 창에 전체 월헤이븐 URL을 입력하실 수 있습니다.\n" "\n" "만약 당신이 키워드를 지정했다면, 주로 사용될 키워드 중 아무 키워드랑 관련 있는 건전한 이미지가 나올 것입니다. \n" "\n" "만약 당신이 월헤이븐 URL을 지정했다면, 분류 조건을 주의 깊게 선택하십시오 - 보통 버라이어티는 이미지를 요구하지만, 맨 처음에 " "나오는 수백 개의 되돌려진 주소로부터 나타나는 이미지만 사용합니다. 무작위 검색 혹은 날짜별 검색은 이 이미지 소스가 소멸하기 전까지 더 " "긴 \"수명\"을 가짐을 뜻합니다. 즐겨찾기 검색은 더 나은 화질의 이미지를 제공하며 연관성 검색은 구절이나 색깔을 검색할 때 더 관련 " "있는 결과를 제공합니다." #: ../data/ui/AddWallhavenDialog.ui.h:8 ../data/ui/AddWallbaseDialog.ui.h:9 msgid "Enter keywords or paste URL here: " msgstr "키워드를 입력하시거나 URL을 여기에 붙이십시오: " #: ../data/ui/AddWallhavenDialog.ui.h:9 ../data/ui/AddFlickrDialog.ui.h:16 #: ../data/ui/AddWallbaseDialog.ui.h:10 msgid "Just a moment to check this search" msgstr "검색을 확인 중이니 잠시 기다리십시오" #: ../data/ui/AddWallhavenDialog.ui.h:10 ../data/ui/AddFlickrDialog.ui.h:17 #: ../data/ui/AddRedditDialog.ui.h:9 ../data/ui/AddMediaRssDialog.ui.h:6 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:10 #: ../data/ui/AddWallbaseDialog.ui.h:11 msgid " " msgstr " " #: ../variety/QuotesEngine.py:232 msgid "No quote plugins" msgstr "명언 플러그인이 없습니다" #: ../variety/QuotesEngine.py:232 msgid "There are no quote plugins installed" msgstr "설치된 명언 플러그인이 없습니다" #: ../variety/QuotesEngine.py:238 msgid "No suitable quote plugins" msgstr "적합한 명언 플러그인이 없습니다" #: ../variety/QuotesEngine.py:239 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "당신은 키워드 및 저자 검색을 지원하는 명언 플러그인을 가지고 있지 않습니다" #: ../variety/QuotesEngine.py:251 msgid "Could not fetch quotes" msgstr "명언을 불러올 수 없습니다" #: ../variety/QuotesEngine.py:252 msgid "Quotes services may be down, we will continue trying" msgstr "명언 서비스가 다운된 것 같습니다, 계속 시도하고 있습니다" #: ../variety/QuotesEngine.py:255 msgid "Could not find quotes" msgstr "명언을 찾을 수 없습니다" #: ../variety/QuotesEngine.py:256 msgid "Maybe you are searching for something very obscure?" msgstr "아마 당신은 매우 불분명한 무언가를 찾는 중일지도 모릅니다?" #: ../variety/Texts.py:20 msgid "Keep original" msgstr "원본 유지하기" #: ../variety/Texts.py:21 msgid "Grayscale" msgstr "흑백" #: ../variety/Texts.py:22 msgid "Heavy blur" msgstr "강한 흐림" #: ../variety/Texts.py:23 msgid "Soft blur" msgstr "여린 흐림" #: ../variety/Texts.py:24 msgid "Oil painting" msgstr "유화" #: ../variety/Texts.py:25 msgid "Pencil sketch" 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:37 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:38 msgid "Random wallpapers from Desktoppr.co" msgstr "Desktoppr.co에서 무작위 배경화면을 불러옵니다" #: ../variety/Texts.py:39 msgid "NASA's Astronomy Picture of the Day" msgstr "나사의 오늘의 천체 사진" #: ../variety/Texts.py:41 msgid "World Sunlight Map - live wallpaper from Die.net" msgstr "" #: ../variety/Texts.py:42 msgid "Bing Photo of the Day" msgstr "" #: ../variety/Texts.py:43 msgid "High-resolution photos from Unsplash.com" msgstr "" #: ../variety/Texts.py:47 msgid "" "If you use KDE, you need to perform some actions before Variety will work. " "Please read here: http://peterlevi.com/variety/2014/05/variety-and-kde/" msgstr "" "만약 당신이 KDE를 사용하신다면, 당신은 버라이어티가 실행되도록 만들기 이전에 몇몇 동작을 취하셔야 합니다. 여기로 들어가셔서 " "읽으십시오: http://peterlevi.com/variety/2014/05/variety-and-kde/" #: ../variety/Texts.py:48 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "당신은 지표 아이콘 위에서 마우스 휠을 스크롤 하시는 걸로 배경화면을 앞뒤로 바꾸실 수 있습니다." #: ../variety/Texts.py:49 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 " "~/.config/variety/scripts. There are examples there for various desktop " "environments." msgstr "" "만약 당신이 매번 배경화면이 바뀌도록 하는 사용자 설정 명령어를 사용하고 싶거나 다른 데스크톱 환경을 사용하고 싶다면, " "~/.config/variety/scripts에서 스크립트를 편집하십시오. 여기에는 여러 데스크톱 환경을 위한 예시가 있습니다." #: ../variety/Texts.py:50 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:51 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:52 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:53 msgid "" "Adding your own custom filters is quite easy: open " "~/.config/variety/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 "" "당신만의 사용자 설정 필터를 추가하는 건 쉬운 일입니다: ~/.config/variety/variety.conf를 편집기로 여셔서 기존에 " "있는 필터를 예시로써 사용하십시오. 모든 필터는 이미지매직의 변환 명령어로 넘겨져야 할 한 줄의 선택 사항일 뿐입니다." #: ../variety/Texts.py:54 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:55 msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of ~/.config/variety/scripts/set_wallpaper." msgstr "" "바탕화면 알림을 사용하시려면 배경화면이 바뀔 때, ~/.config/variety/scripts/set_wallpaper의 밑에 있는 두 " "줄을 제거하십시오." #: ../variety/Texts.py:56 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:57 msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "~/.config/variety/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 "" "당신이 명언을 즐겨찾기에 저장함을 선택하실 때, 이들은 기본으로 ~/.config/variety/favorite_quotes.txt에 " "저장됩니다. 이 파일은 버라이어티의 로컬 파일 명언 소스와 호환이 됩니다. 만약 당신이 이것을 사용하고 싶다면 - 이것을 " "~/.config/variety/pluginconfig/quotes/에 복사하시고 로컬 파일 명언 소스를 사용하십시오. 이 파일은 " "마찬가지로 유닉스 포천 프로그램과 호환이 됩니다." #: ../variety/PreferencesVarietyDialog.py:259 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:382 #: ../variety/PreferencesVarietyDialog.py:551 #: ../data/ui/PreferencesVarietyDialog.ui.h:11 msgid "Images" msgstr "이미지" #: ../variety/PreferencesVarietyDialog.py:383 msgid "Folders" msgstr "폴더" #: ../variety/PreferencesVarietyDialog.py:385 #: ../data/ui/AddFlickrDialog.ui.h:2 msgid "Flickr" msgstr "플리커" #: ../variety/PreferencesVarietyDialog.py:389 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:2 msgid "Wallpapers.net" msgstr "Wallpapers.net" #: ../variety/PreferencesVarietyDialog.py:390 #: ../data/ui/AddRedditDialog.ui.h:2 msgid "Reddit" msgstr "레딧" #: ../variety/PreferencesVarietyDialog.py:391 #: ../data/ui/AddMediaRssDialog.ui.h:2 msgid "Media RSS" msgstr "미디어 RSS" #: ../variety/PreferencesVarietyDialog.py:416 msgid "Remove the source, keep the files" msgstr "파일들을 유지한 채, 소스를 삭제합니다" #: ../variety/PreferencesVarietyDialog.py:417 msgid "Remove the sources, keep the files" msgstr "파일들을 유지한 채, 소스들을 삭제합니다" #: ../variety/PreferencesVarietyDialog.py:424 msgid "Remove the source and delete the downloaded files" msgstr "내려받은 파일들을 삭제하고 소스를 제거합니다" #: ../variety/PreferencesVarietyDialog.py:425 msgid "Remove the sources and delete the downloaded files" msgstr "내려받은 파일들을 삭제하고 소스들을 제거합니다" #: ../variety/PreferencesVarietyDialog.py:458 msgid "World Sunlight Map enabled" msgstr "월드 선라이트 맵을 사용했습니다" #: ../variety/PreferencesVarietyDialog.py:459 msgid "" "Using the World Sunlight Map requires both downloading and changing enabled " "at intervals of 30 minutes or less. Settings were adjusted automatically." msgstr "" "월드 선라이트 맵을 사용하시려면 내려받기 및 30분 이내의 배경화면 변경 설정이 필요합니다. 설정은 자동으로 변경되었습니다." #: ../variety/PreferencesVarietyDialog.py:544 msgid "Add Images" msgstr "이미지를 추가합니다" #: ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Add" msgstr "추가하기" #: ../variety/PreferencesVarietyDialog.py:567 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "폴더를 추가합니다 - 재귀 검색이 되는 루트 폴더, 하위 폴더만 추가합니다" #: ../variety/PreferencesVarietyDialog.py:703 #: ../variety/PreferencesVarietyDialog.py:716 #: ../data/ui/PreferencesVarietyDialog.ui.h:168 msgid "Edit..." msgstr "편집하기..." #: ../variety/PreferencesVarietyDialog.py:710 msgid "View Image" msgstr "이미지를 봅니다" #: ../variety/PreferencesVarietyDialog.py:713 msgid "Open Folder" msgstr "폴더를 엽니다" #: ../variety/PreferencesVarietyDialog.py:1092 msgid "Recommended images source disabled" msgstr "권장 이미지 소스 사용 해제" #: ../variety/PreferencesVarietyDialog.py:1120 #: ../variety/PreferencesVarietyDialog.py:1139 #: ../variety/PreferencesVarietyDialog.py:1147 msgid "No write permissions" msgstr "쓰기 권한이 없습니다" #: ../variety/PreferencesVarietyDialog.py:1127 msgid "Limit disabled" msgstr "제한을 해제했습니다" #: ../variety/PreferencesVarietyDialog.py:1128 msgid "" "Changing the download folder automatically turns off the size limit to " "prevent from accidental data loss" msgstr "데이터 손실을 방지하기 위해 내려받기 폴더의 용량 제한을 자동으로 해제합니다" #: ../variety/PreferencesVarietyDialog.py:1134 #, python-format msgid "Actual download folder: %s " msgstr "실제 내려받기 폴더: %s " #: ../variety/PreferencesVarietyDialog.py:1214 msgid "Could not adjust permissions" msgstr "권한을 조정할 수 없습니다" #: ../variety/PreferencesVarietyDialog.py:1215 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "이 명령어를 직접 실행해보십시오:\n" "sudo chmod %s \"%s\"" #: ../variety/PreferencesVarietyDialog.py:1247 msgid "Logged in as: " msgstr "로그인되었습니다: " #: ../variety/PreferencesVarietyDialog.py:1249 msgid "Anonymous" msgstr "익명" #: ../variety/PreferencesVarietyDialog.py:1250 #: ../data/ui/PreferencesVarietyDialog.ui.h:109 msgid "Login or register" msgstr "로그인 혹은 회원 가입을 합니다" #: ../variety/PreferencesVarietyDialog.py:1250 msgid "Switch user" msgstr "사용자를 전환합니다" #: ../data/ui/AddFlickrDialog.ui.h:1 msgid "Variety - add Flickr as an image source" msgstr "버라이어티 - 플리커를 이미지 소스로 추가합니다" #: ../data/ui/AddFlickrDialog.ui.h:3 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.h:4 #: ../data/ui/PreferencesVarietyDialog.ui.h:58 msgid "Tags: " msgstr "태그: " #: ../data/ui/AddFlickrDialog.ui.h:5 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.h:7 msgid "User: " msgstr "사용자: " #: ../data/ui/AddFlickrDialog.ui.h:8 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.h:10 msgid "Group: " msgstr "그룹: " #: ../data/ui/AddFlickrDialog.ui.h:11 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/group" "s/wallpapers/" msgstr "" "그룹의 URL을 집어넣으십시오.\n" "예: http://www.flickr.com/group" "s/wallpapers/" #: ../data/ui/AddFlickrDialog.ui.h:13 msgid "Text:" msgstr "문자:" #: ../data/ui/AddFlickrDialog.ui.h:14 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by " "prepending them with -.\n" "Example: apple -pie" msgstr "" "사진에 있는 제목, 설명과 태그로 검색하는 무료 문자 검색 기능입니다. 제외하고자 하는 항목 앞에는 -을 입력하십시오.\n" "예: 사과 -파이" #: ../variety/AddMediaRssDialog.py:40 msgid "" "This does not seem to be a valid Media RSS feed URL or there is no content " "there." msgstr "이는 유효한 미디어 RSS 피드 URL이 아니거나 내용이 없는듯합니다." #: ../variety/VarietyWindow.py:630 ../variety/VarietyWindow.py:772 #: ../variety/VarietyWindow.py:2650 msgid "Already in Favorites" msgstr "이미 즐겨찾기에 있습니다" #: ../variety/VarietyWindow.py:634 ../variety/ThumbsManager.py:144 #: ../variety/indicator.py:76 msgid "Copy to _Favorites" msgstr "즐겨찾기에 복사하기(_F)" #: ../variety/VarietyWindow.py:635 ../variety/ThumbsManager.py:151 msgid "Move to _Favorites" msgstr "즐겨찾기로 이동합니다(_F)" #. both #: ../variety/VarietyWindow.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:165 ../variety/indicator.py:81 msgid "Move to Favorites" msgstr "즐겨찾기로 이동합니다" #: ../variety/VarietyWindow.py:665 ../variety/ThumbsManager.py:119 msgid "Fetched: Show Origin" msgstr "불러왔습니다: 원본을 봅니다" #: ../variety/VarietyWindow.py:667 ../variety/VarietyWindow.py:762 #: ../variety/ThumbsManager.py:121 #, python-format msgid "View at %s" msgstr "%s에서 봅니다" #: ../variety/VarietyWindow.py:711 msgid "Unknown" msgstr "알 수 없음" #: ../variety/VarietyWindow.py:732 #, python-format msgid "Author: %s" msgstr "저자: %s" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 #: ../variety/indicator.py:120 ../variety/indicator.py:185 msgid "Pause on current" msgstr "이미지 변경을 중지합니다." #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 msgid "Resume regular changes" msgstr "정기적 변경을 재개합니다" #: ../variety/VarietyWindow.py:772 ../variety/indicator.py:191 msgid "Save to Favorites" msgstr "즐겨찾기에 저장하기" #: ../variety/VarietyWindow.py:904 msgid "Filtering too strict?" msgstr "필터를 매우 까다롭게 설정하시겠습니까?" #: ../variety/VarietyWindow.py:905 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "버라이어티는 당신의 필터 범위와 관련 있는 매우 적은 수의 이미지를 찾는 중입니다" #: ../variety/VarietyWindow.py:1377 msgid "Please add more image sources or wait for some downloads" msgstr "더 많은 이미지 소스를 추가하시거나 몇몇 내려받기를 기다려주십시오" #: ../variety/VarietyWindow.py:1379 msgid "Please add more image sources" msgstr "더 많은 이미지 소스를 추가하십시오" #: ../variety/VarietyWindow.py:1380 msgid "No more wallpapers" msgstr "더는 배경화면은 없습니다" #: ../variety/VarietyWindow.py:1566 msgid "Current wallpaper is not in the image sources" msgstr "현재 배경화면은 이미지 소스에 없습니다" #: ../variety/VarietyWindow.py:1601 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "다음 %s. 로 이동할 수 없습니다 이 파일을 옮길 권한이 없는 것 같습니다." #: ../variety/VarietyWindow.py:1603 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "다음 %s. 로 복사할 수 없습니다. 이 파일을 복사할 권한이 없는 것 같습니다." #: ../variety/VarietyWindow.py:1623 ../variety/VarietyWindow.py:1643 msgid "Cannot delete" msgstr "삭제할 수 없습니다" #: ../variety/VarietyWindow.py:1624 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "휴지통에 %s를 버릴 권한이 없습니다." #: ../variety/VarietyWindow.py:1644 msgid "" "Probably there is no utility for moving to Trash?\n" "Please install trash-cli or gvfs-bin or konquerer." msgstr "" "아마도 휴지통에 이동을 해주는 프로그램이 없을지도 모릅니다?\n" "트래시-cli나 gvfs-bin 혹은 컨커러를 설치하십시오." #: ../variety/VarietyWindow.py:1776 msgid "Anonymous usage statistics" msgstr "익명의 사용 통계" #: ../variety/VarietyWindow.py:1777 msgid "" "Variety collects anonymous usage statistics. \n" "These help us make it better and are not shared with anyone. \n" "To read more or turn them off, go to \"Sync and social\"" msgstr "" "버라이어티는 익명의 사용 통계를 수집합니다. \n" "이는 버라이어티를 더 나은 프로그램으로 만들어주게 하며 아무에게도 공유되지 않습니다. \n" "\n" "더 자세한 사항을 읽으시거나 이를 안 보이게 설정하시려면, \"동기화와 소셜 네트워크\"로 가십시오" #: ../variety/VarietyWindow.py:1920 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:1945 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 /some/local/image.jpg --next" msgstr "" "%prog [선택 사항] [파일 혹은 URL]\n" "\n" "로컬 파일을 넘김은 이를 버리아어티의 대기열에 추가할 것입니다.\n" "\n" "원격 URL을 넘김은 버라이어티가 이를 불러온 폴더에 불러올 것이며 대기열에 위치하도록 할 것입니다.\n" "\n" "\n" "특정 배경화면을 정하시려면 다음과 같은 명령어를 사용하십시오: %prog /some/local/image.jpg --next" #: ../variety/VarietyWindow.py:1955 msgid "" "Show logging messages (-vv shows even finer debugging messages, -vvv debugs " "variety_lib too)" msgstr "" "로그 메시지를 봅니다(-vv는 디버깅 메시지를 보여주기도 하며, -vvv는 variety_lib를 디버깅을 해주기도 합니다)" #: ../variety/VarietyWindow.py:1959 msgid "Make the running instance quit" msgstr "실행 중인 버라이어티를 즉시 종료합니다" #: ../variety/VarietyWindow.py:1963 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "현재 배경화면 위치를 복사합니다. 프로그램이 이미 실행 중일 때만 사용됩니다." #: ../variety/VarietyWindow.py:1967 msgid "Show Next wallpaper" msgstr "다음 배경화면 보기" #: ../variety/VarietyWindow.py:1971 msgid "Show Previous wallpaper" msgstr "이전 배경화면 보기" #: ../variety/VarietyWindow.py:1975 msgid "Show Next wallpaper, skipping the forward history" msgstr "다음 배경화면 보기, 사용기록을 앞으로 넘깁니다" #: ../variety/VarietyWindow.py:1979 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "현재 배경화면을 휴지통에 이동합니다. 프로그램이 이미 실행 중일 때만 사용됩니다." #: ../variety/VarietyWindow.py:1983 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "현재 배경화면을 즐겨찾기에 복사합니다. 프로그램이 이미 실행 중일 때만 사용됩니다." #: ../variety/VarietyWindow.py:1987 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "현재 배경화면을 즐겨찾기에 이동합니다. 프로그램이 이미 실행 중일 때만 사용됩니다." #: ../variety/VarietyWindow.py:1991 msgid "Pause on current image" msgstr "이미지 변경을 중지합니다." #: ../variety/VarietyWindow.py:1995 msgid "Resume regular image changes" msgstr "정기적 이미지 변경을 재개합니다" #: ../variety/VarietyWindow.py:1999 msgid "Toggle Pause/Resume state" msgstr "일시 정지/재개 상태를 바꿉니다." #: ../variety/VarietyWindow.py:2003 msgid "Show Next quote" msgstr "다음 명언 보기" #: ../variety/VarietyWindow.py:2007 msgid "Show Previous quote" msgstr "이전 명언 보기" #: ../variety/VarietyWindow.py:2011 msgid "Show Next quote, skipping the forward history" msgstr "다음 명언 보기, 사용기록을 앞으로 넘깁니다" #: ../variety/VarietyWindow.py:2015 msgid "Toggle Quotes Pause/Resume state" msgstr "명언 일시 정지/재개 상태를 바꿉니다." #: ../variety/VarietyWindow.py:2019 msgid "Save the current quote to Favorites" msgstr "현재 명언을 즐겨찾기에 저장하기" #: ../variety/VarietyWindow.py:2023 msgid "Toggle History display" msgstr "사용 기록 표시창을 켭니다" #: ../variety/VarietyWindow.py:2027 msgid "Toggle Recent Downloads display" msgstr "최근 내려받기 표시창을 켭니다" #: ../variety/VarietyWindow.py:2031 msgid "Show Preferences dialog" msgstr "환경 설정 대화상자 보기" #: ../variety/VarietyWindow.py:2035 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "수동 배경화면 선택기 보기 - 섬네일 창에 활성 이미지 소스로부터 받은 이미지로 선택합니다" #: ../variety/VarietyWindow.py:2039 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/VarietyWindow.py:2053 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "선택 사항 --next/--fast-forward와 --previous는 상호 배타적입니다" #: ../variety/VarietyWindow.py:2056 msgid "options --trash and --favorite are mutually exclusive" msgstr "선택 사항 --trash와 --favorite는 상호 배타적입니다" #: ../variety/VarietyWindow.py:2059 msgid "options --pause and --resume are mutually exclusive" msgstr "선택 사항 --pause와 --resume은 상호 배타적입니다" #: ../variety/VarietyWindow.py:2062 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" "선택 사항 --quotes-next/--quotes-fast-forward와 --quotes-previous는 상호 배타적입니다" #: ../variety/VarietyWindow.py:2179 ../variety/ImageFetcher.py:60 #: ../variety/ImageFetcher.py:71 ../variety/ImageFetcher.py:78 #: ../variety/ImageFetcher.py:112 msgid "Not an image" msgstr "이미지가 아닙니다" #: ../variety/VarietyWindow.py:2184 msgid "Added to queue" msgstr "대기열에 추가됐습니다" #: ../variety/VarietyWindow.py:2185 ../variety/VarietyWindow.py:2191 msgid "Press Next to see it" msgstr "다음을 누르셔서 보십시오" #: ../variety/VarietyWindow.py:2191 msgid "Fetched" msgstr "불러왔습니다" #: ../variety/VarietyWindow.py:2237 msgid "Unsupported source type" msgstr "지원되지 않는 소스 형태입니다" #: ../variety/VarietyWindow.py:2238 ../variety/VarietyWindow.py:2286 msgid "Are you running the most recent version of Variety?" msgstr "지금 당신은 최신 버전의 버라이어티를 실행하고 계십니까?" #: ../variety/VarietyWindow.py:2244 msgid "New image source added" msgstr "새로운 이미지 소스가 추가됐습니다" #: ../variety/VarietyWindow.py:2246 msgid "Image source already exists, enabling it" msgstr "이미 이미지 소스가 존재합니다, 이 소스를 사용합니다" #: ../variety/VarietyWindow.py:2272 msgid "Fetched and applied" msgstr "불러왔고 적용되었습니다" #: ../variety/VarietyWindow.py:2282 msgid "It works!" msgstr "실행이 잘됩니다!" #: ../variety/VarietyWindow.py:2282 msgid "Yay, Variety links work. Great!" msgstr "와, 버라이어티 링크가 실행이 잘됩니다. 매우 기쁩니다!" #: ../variety/VarietyWindow.py:2286 msgid "Unsupported command" msgstr "지원되지 않는 명령어입니다" #: ../variety/VarietyWindow.py:2288 msgid "Could not process the given variety:// URL" msgstr "주어진 버라이어티:// URL을 처리할 수 없습니다" #: ../variety/VarietyWindow.py:2289 msgid "Run with logging enabled to see details" msgstr "로깅 사용과 같이 실행하여 자세한 사항을 봅니다" #: ../variety/VarietyWindow.py:2488 msgid "Do not ask anymore, always use the current quote" msgstr "다시는 묻지 않습니다, 현재의 명언을 항상 사용합니다" #: ../variety/VarietyWindow.py:2491 ../data/ui/FacebookPublishDialog.ui.h:5 msgid "Do not ask anymore, always use the text above" msgstr "다시는 묻지 않습니다, 문자를 항상 위에 둬서 사용합니다" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "Published" msgstr "발표됨" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "You may open your Facebook feed to see the post" msgstr "페이스북 피드를 열어 포스트를 볼 수 있습니다" #: ../variety/VarietyWindow.py:2526 ../variety/VarietyWindow.py:2555 msgid "Could not publish" msgstr "발표를 할 수 없습니다" #: ../variety/VarietyWindow.py:2718 msgid "Could not create autostart entry" msgstr "자동 실행 항목을 만들 수 없습니다" #: ../variety/VarietyWindow.py:2719 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:2769 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:2769 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/FacebookFirstRunDialog.ui.h:1 msgid "Variety - Facebook Sharing" msgstr "버라이어티 - 페이스북으로 공유합니다" #: ../data/ui/FacebookFirstRunDialog.ui.h:2 #: ../data/ui/PreferencesVarietyDialog.ui.h:169 msgid "Facebook Sharing" msgstr "페이스북으로 공유합니다" #: ../data/ui/FacebookFirstRunDialog.ui.h:3 msgid "" "You are sharing on Facebook for the first time. Sharing from Variety is " "available for images that come from online sources and for quotes. It works " "this way: \n" "\n" "1. Login to Facebook\n" "Facebook will open in your default browser. You will be prompted to login if " "you are not already logged in. \n" "\n" "2. Authorize Variety to publish to your " "feed.\n" "You will be asked to allow Variety to publish to your feed on your behalf. " "Variety will only use this permission to publish those images and quotes " "that you tell it to, nothing else.\n" "\n" "3. Configure browser to open variety:// links " "with Variety or xdg-open\n" "Then you will be redirected to a page with instructions to associate " "\"variety://\" links with Variety in your browser. Please follow these " "instructions to complete the setup. You have to do this only once.\n" "\n" "No passwords or login information is kept locally, just an OAuth Facebook " "token that will be valid for a couple of weeks. After its validity expires " "you will be asked to login again." msgstr "" "지금 당신은 처음으로 페이스북으로 공유하고 계십니다. 버라이어티에서 온라인 소스로부터 온 이미지 및 명언 공유가 가능합니다. 이 과정은 " "다음과 같은 방법으로 작동됩니다: \n" "\n" "1. 페이스북으로 로그인을 합니다\n" "페이스북은 당신의 기본 브라우저에서 열릴 것입니다. 만약 당신이 이미 로그인되어있지 않다면 페이스북은 당신이 로그인하도록 말할 것입니다. " "\n" "\n" "2. 버라이어티를 허가하셔서 당신의 피드를 발표하십시오.\n" "당신은 당신의 피드를 발표할 수 있게 버라이어티를 허가하도록 요구받을 것입니다. 버라이어티는 이 권한을 당신이 원하는 이미지 및 명언을 " "발표하는 데만 사용할 것이며, 그 외에는 사용하지 않을 것입니다.\n" "\n" "3. 브라우저가 버라이어티나 xdg-오픈으로 버라이어티:// 링크를 열 수 있도록 " "설정하십시오\n" "그러고 나서 당신은 브라우저에서 버라이어티와 함께 \"버라이어티://\" 링크에 관련된 지시문이 있는 페이지로 리다이렉트될 것입니다. " "다음과 같은 지시문을 따르셔서 설정을 완료하십시오. 당신은 이를 단 한 번만 하시면 됩니다.\n" "\n" "당신의 암호나 로그인 정보는 로컬에 보관되지 않으며, 몇 주 동안 유효한 OAuth 페이스북 토큰을 생성할 뿐입니다. 유효 기간이 " "만료되면 당신은 다시 로그인하도록 요구받을 것입니다." #: ../variety/AddWallpapersNetCategoryDialog.py:40 msgid "Could not find wallpapers there. Please check the URL." msgstr "여기서 배경화면을 찾을 수 없습니다. URL을 확인하십시오." #: ../data/ui/WelcomeDialog.ui.h:1 msgid "Welcome to Variety!" msgstr "버라이어티에 오신 걸 환영합니다!" #: ../data/ui/WelcomeDialog.ui.h:2 ../data/ui/SmartFeaturesNoticeDialog.ui.h:3 msgid "Continue" msgstr "계속" #: ../data/ui/WelcomeDialog.ui.h:3 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.h:4 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.h:5 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "지금부터 당신은 시간을 두셔서 다음 화면에 있는 당신만의 환경 설정을 설정하십시오." #: ../data/ui/WelcomeDialog.ui.h:6 msgid "KDE Users - Important, please read:" msgstr "KDE 사용자들에게 - 다음에 나오는 문장은 중요한 요소이니, 읽으십시오:" #: ../data/ui/WelcomeDialog.ui.h:7 msgid "" "You appear to be running KDE. In KDE 4 it is impossible to set the wallpaper " "from inside a program - there is no API for this. To make Variety work, please read " "and follow the instructions here." msgstr "" "당신은 KDE를 실행하고 계신듯합니다. KDE 4에서는 프로그램 안으로부터 배경화면을 설정하는 것이 불가능합니다 - 이를 위한 API가 " "없습니다. 버라이어티가 작동되기 위해서는, 여기에 들어가셔서 " "지시문을 읽고 따르십시오." #: ../data/ui/AddRedditDialog.ui.h:1 msgid "Variety - add Reddit feed" msgstr "버라이어티 - 레딧 피드를 추가합니다" #: ../data/ui/AddRedditDialog.ui.h:3 msgid "" "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" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:7 msgid "URL or name of a subreddit: " msgstr "URL 혹은 서브레딧의 이름: " #: ../data/ui/AddRedditDialog.ui.h:8 msgid "Just a moment to check what's there" msgstr "무엇이 있는지 확인 중이니 잠시 기다리십시오" #: ../data/ui/AddMediaRssDialog.ui.h:1 msgid "Variety - add Media RSS feed" msgstr "버라이어티 - 미디어 RSS 피드를 추가합니다" #: ../data/ui/AddMediaRssDialog.ui.h:3 msgid "" "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." msgstr "" "밑에 있는 창에 미디어 RSS 피드의 URL을 붙어놓으십시오. 임의 RSS 피드가 아니라, 미디어 RSS 피드만을 지원한다는 점에 " "유의하십시오. 미디어 RSS 피드는 미디어를 함유하고 있습니다:내용 태그는 실제 이미지 내용과 바로 연결을 합니다. 미디어 RSS 피드를 " "제공하는 몇몇 사이트의 예시는: 피카사, 디비언트아트, 스머그머그, 플리커, 인터페이스리프트입니다." #: ../data/ui/AddMediaRssDialog.ui.h:4 msgid "Paste the URL of the Media RSS feed here: " msgstr "여기에 미디어 RSS 피드의 URL을 붙어놓으십시오: " #: ../data/ui/AddMediaRssDialog.ui.h:5 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:9 msgid "Just a moment to check what's at that URL" msgstr "URL에 무엇이 들었는지 확인하는 중이니 잠시 기다리십시오" #: ../variety/AddRedditDialog.py:43 msgid "This does not seem to be a valid Reddit URL" msgstr "이 주소는 유효하지 않은 레딧 URL인듯합니다" #: ../variety/AddRedditDialog.py:46 msgid "We could not find any image submissions there." msgstr "우리는 이곳에서 아무 이미지 제안을 찾을 수 없습니다." #: ../variety/Smart.py:111 msgid "" "Your smart_user.json config file appears broken. You may have to login again " "to VRTY.ORG." msgstr "당신의 smart_user.json 설정 파일이 올바르지 않은듯합니다. 당신은 VRTG.ORG에 다시 로그인하셔야 합니다." #: ../variety/Smart.py:195 msgid "Your VRTY.ORG credentials are probably outdated. Please login again." msgstr "당신의 VRTY.ORG 자격 증명이 오래된 것 같습니다. 다시 로그인하십시오." #: ../variety/Smart.py:597 ../variety/Smart.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:111 msgid "Sync" msgstr "동기화" #: ../variety/Smart.py:598 #, python-format msgid "Fetching %d images" msgstr "%d개의 이미지를 불러오는 중입니다" #: ../variety/Smart.py:598 msgid "Fetching 1 image" msgstr "한 개의 이미지를 불러오는 중입니다" #: ../variety/Smart.py:643 msgid "Finished" msgstr "완료되었습니다" #: ../variety/Smart.py:664 #, python-format msgid "Logged in as %s" msgstr "%s로 로그인되었습니다" #: ../variety/Smart.py:676 #, python-format msgid "" "Do you want to login to VRTY.ORG as %s?" msgstr "당신은 %s로 VRTY.ORG에 로그인하시는 걸 원하십니까?" #: ../variety/Smart.py:677 msgid "VRTY.ORG login confirmation" msgstr "VRTY.ORG 로그인 확인" #: ../data/plugins/quotes/QuotationsPageSource.py:35 msgid "Fetches quotes from TheQuotationsPage.com" msgstr "TheQuotationsPage.com으로부터 명언을 불러옵니다" #: ../variety/__init__.py:143 msgid "Terminating signal received, quitting..." msgstr "받은 신호를 중지하는 중입니다, 종료하는 중입니다..." #: ../variety/__init__.py:198 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "버라이어티가 이미 실행 중입니다. 실행 중인 인스턴스에 명령어를 보냅니다." #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:1 msgid "VRTY.ORG integration" msgstr "VRTY.ORG 통합" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:2 msgid "This feature requires VRTY.ORG integration" msgstr "이 기능은 VRTY.ORG 통합을 요구합니다" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:3 msgid "Enable VRTY.ORG integration" msgstr "VRTY.ORG 통합을 사용합니다" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:4 msgid "" "For this feature Variety needs permission to collect data about the images " "you like or dislike and the online sources you have enabled.\n" "\n" "Collected data is anonymous by default and covers only images which Variety " "downloaded, never images you already had in your local folders that might be " "private.\n" "\n" "This data helps us provide better images for everyone and fuels VRTY.ORG - a valuable resource for all users " "of Variety." msgstr "" "이 기능은 버라이어티가 당신이 선호 혹은 비선호 하는 이미지 및 당신이 사용한 온라인 소스에 관한 자료를 수집할 수 있는 권한이 " "필요합니다.\n" "\n" "수집된 자료는 기본으로 익명 상태이고 버라이어티가 내려받은 이미지만 덮어씌웠으며, 절대로 당신이 개인적일지도 모르는 당신의 로컬 폴더에 " "이미 보유하고 있는 자료를 수집하지 않습니다.\n" "\n" "이 자료는 우리가 모두에게 더 나은 이미지를 제공하도록 하며 VRTY.ORG에 " "동력이 되어줍니다 - 버라이어티의 모든 사용자를 위한 귀중한 자료입니다." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:1 msgid "Variety - VRTY.ORG" msgstr "버라이어티 - VRTY.ORG" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:2 msgid "No, thanks" msgstr "고맙지만, 사양합니다" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:4 msgid "" "Introducing VRTY.ORG! Wanna take part?" msgstr "" "VRTY.ORG를 소개합니다! 참여하고 싶습니까?" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:5 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to find and add new image sources to Variety, and to follow other users' " "favorites." msgstr "" "VRTY.ORG는 같은 입맛을 가진 버라이어티 사용자와 연결을 해주고 당신의 " "배경화면을 아주-편리하게 바꾸는 방법을 제공하며, 버라이어티에 새로운 이미지 소스를 찾으시거나 추가하실 수 있고, 다른 사용자의 " "즐겨찾기를 따르실 수 있습니다." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:6 msgid "" "Participation takes no effort - your profile will be built automatically, as " "you like or dislike images downloaded by Variety. Your profile will not be " "shared with third parties, unless you opt-in to make it public. Read more details about the " "service and the privacy policy here." msgstr "" "참여하는 건 몹시 어렵지 않습니다 - 버라이어티가 당신이 선호 혹은 비선호 이미지를 내려받는 것으로 바탕을 두므로, 당신의 프로필은 " "자동으로 생성될 것입니다. 당신이 이 프로필을 모두에게 공개해서 참여함으로 설정하지 않은 이상, 당신의 프로필은 제삼자와 공유되지 " "않습니다. 여기에 들어가셔서 이 서비스에 관한 더 " "자세한 사항과 개인 정보 보호 정책을 읽으십시오." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:7 msgid "" "Participation is required for some features of Variety such as synchronization of favorites between computers." msgstr "" "컴퓨터들 사이에서 즐겨찾기를 동기화합니다와 같은 버라이어티의 몇몇 기능은 참여가 " "요구됩니다." #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:8 #: ../data/ui/PreferencesVarietyDialog.ui.h:105 msgid "Participate in VRTY.ORG" msgstr "VRTY.ORG에 참여합니다" #: ../data/plugins/quotes/QuotesDaddySource.py:31 msgid "" "Fetches quotes from QuotesDaddy's daily quotes RSS feed.\n" "Does not support searching by tags or authors." msgstr "" "QuotesDaddy의 일일 명언 RSS 피드로부터 명언을 불러옵니다.\n" "태그나 저자 검색을 지원하지 않습니다." #: ../data/ui/AboutVarietyDialog.ui.h:1 msgid "Copyright (c) 2012, Peter Levi " msgstr "저작권 (c) 2012, 피터 레비 " #: ../data/ui/AboutVarietyDialog.ui.h:2 msgid "About Variety" msgstr "버라이어티 설명" #: ../data/ui/AboutVarietyDialog.ui.h:3 msgid "An automatic wallpaper changer, downloader and manager." msgstr "자동 배경화면 바꾸기, 내려받기 및 관리자 프로그램입니다." #: ../data/ui/AboutVarietyDialog.ui.h:4 msgid "http://peterlevi.com/variety" msgstr "http://peterlevi.com/variety" #: ../data/ui/AboutVarietyDialog.ui.h:5 msgid "" "# Copyright (c) 2012, Peter Levi \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 "" "# 저작권 (c) 2012, 피터 레비 \n" "# 이 프로그램은 자유 소프트웨어입니다: 자유 소프트웨어 재단에 의하여 발표된, \n" "\n" "# GNU 일반 공중 사용 허가서 버전 3약관 아래에서 \n" "\n" "# 당신은 이 소프트웨어를 재배포하시거나/혹은 수정하실 수 있습니다.\n" "\n" "# \n" "\n" "# 이 프로그램은 이것이 매우 유용하게 사용될 것이라는 희망 내에서 배포되었지만, \n" "\n" "# 아무 보증이 없습니다; 설령 상업적 용도, 만족스러운 품질, 혹은 \n" "\n" "# 특정 목적을 위한 적합성 보증이 적용되지 않더라도 말입니다. \n" "\n" "# GNU 일반 공중 사용 허가서에서 더 자세한 사항을 보십시오.\n" "\n" "# \n" "\n" "# 당신은 이 프로그램과 같이 GNU 일반 공중 사용 허가서 복사본을 받으셔야 합니다. \n" "# 그렇지 않으면, 을 보십시오.\n" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:1 msgid "Variety - add Wallpapers.net category" msgstr "버라이어티 - Wallpapers.net 카테고리를 추가합니다" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:3 msgid "" "Please visit wallpapers.net and choose " "a category with wallpapers, then paste its URL below. A category is " "anything on the site that has one or more pages with wallpapers on them. " "Here are some examples:\n" "\n" "All wallpapers: http://www.wallpapers.net/\n" "Specific resolution: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" msgstr "" "wallpapers.net을 방문하셔서 배경화면과 같이 카테고리를 " "선택하신 다음, 이것의 URL을 밑에 붙여놓으십시오. 카테고리는 배경화면과 같이 나오는 하나 혹은 여러 페이지를 가진 아무 사이트임을 " "말합니다. 여기에 몇몇 예시가 있습니다:\n" "\n" "모든 배경화면: http://www.wallpapers.net/\n" "\n" "특정 해상도: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:8 msgid "Paste URL here: " msgstr "여기에 URL을 붙이십시오: " #: ../data/ui/PreferencesVarietyDialog.ui.h:1 msgid "seconds" msgstr "초" #: ../data/ui/PreferencesVarietyDialog.ui.h:2 msgid "minutes" msgstr "분" #: ../data/ui/PreferencesVarietyDialog.ui.h:3 msgid "hours" msgstr "시간" #: ../data/ui/PreferencesVarietyDialog.ui.h:4 msgid "days" msgstr "일" #: ../data/ui/PreferencesVarietyDialog.ui.h:5 msgid "Variety Preferences" msgstr "버라이어티 환경 설정" #: ../data/ui/PreferencesVarietyDialog.ui.h:6 msgid "General" msgstr "일반 설정" #: ../data/ui/PreferencesVarietyDialog.ui.h:7 msgid "Start Variety when the computer starts" msgstr "컴퓨터를 시작할 때 버라이어티 실행하기" #: ../data/ui/PreferencesVarietyDialog.ui.h:8 msgid "Change wallpaper every " msgstr "배경화면을 바꾸는 주기 " #: ../data/ui/PreferencesVarietyDialog.ui.h:9 msgid "Minimum interval is 5 seconds" msgstr "최소 간격은 5초입니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:10 msgid "Change wallpaper on start" msgstr "시작할 때 배경화면 바꾸기" #: ../data/ui/PreferencesVarietyDialog.ui.h:12 msgid "Enabled" msgstr "사용됨" #: ../data/ui/PreferencesVarietyDialog.ui.h:13 msgid "Type" msgstr "형식" #: ../data/ui/PreferencesVarietyDialog.ui.h:14 msgid "Location" msgstr "위치" #: ../data/ui/PreferencesVarietyDialog.ui.h:15 msgid "_Add..." msgstr "추가하기(_A)..." #: ../data/ui/PreferencesVarietyDialog.ui.h:16 msgid "Add images, folders or online image sources" msgstr "이미지, 폴더 혹은 온라인 이미지 소스를 추가합니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:17 msgid "_Edit..." msgstr "편집하기(_E)..." #: ../data/ui/PreferencesVarietyDialog.ui.h:18 msgid "Edit the selected source" msgstr "선택한 소스를 편집합니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:19 msgid "_Remove..." msgstr "제거하기(_R)..." #: ../data/ui/PreferencesVarietyDialog.ui.h:20 msgid "Remove selected image sources" msgstr "선택한 이미지 소스를 제거합니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:21 msgid "_Use" msgstr "사용하기(_U)" #: ../data/ui/PreferencesVarietyDialog.ui.h:22 msgid "Enable the selected sources and disable all others" msgstr "선택한 소스를 사용하고 다른 모든 소스를 사용하지 않습니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:23 msgid "Download a wallpaper every " msgstr "배경화면을 내려받는 주기 " #: ../data/ui/PreferencesVarietyDialog.ui.h:24 msgid "Minimum interval is one minute" msgstr "최소 간격은 일분입니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:25 msgid "to " msgstr "로 " #: ../data/ui/PreferencesVarietyDialog.ui.h:26 msgid "Actual download folder " msgstr "실제 내려받기 폴더 " #: ../data/ui/PreferencesVarietyDialog.ui.h:27 msgid "" "Caution: do NOT use this option if you use a custom download folder with " "valuable files in it. Variety will maintain the limit regardless of what is " "in the download folder." msgstr "" "주의 사항: 만약 당신이 중요한 파일이 들어있는 사용자 설정 내려받기 폴더를 사용하신다면 이 선택 사항을 사용하지 마십시오. 버라이어티는 " "내려받기 폴더에 무엇이 들었는지에 관계없이 제한을 유지할 것입니다." #: ../data/ui/PreferencesVarietyDialog.ui.h:28 msgid "Limit download folder to " msgstr "내려받기 폴더 크기를 다음으로 제한합니다 " #: ../data/ui/PreferencesVarietyDialog.ui.h:29 msgid "Minimum size is 50 MB" msgstr "최소 크기는 50MB입니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:30 msgid "MB by deleting oldest files when necessary" msgstr "공간이 필요할 경우에 오래된 파일을 삭제해서 MB를 확보합니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:31 msgid "Favorites" msgstr "즐겨찾기" #: ../data/ui/PreferencesVarietyDialog.ui.h:32 msgid "Copy favorite wallpapers to " msgstr "선호하는 배경화면을 다음으로 복사합니다 " #: ../data/ui/PreferencesVarietyDialog.ui.h:33 msgid "Filters" msgstr "필터" #: ../data/ui/PreferencesVarietyDialog.ui.h:34 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "이 필터를 표시된 배경화면에 무작위로 적용합니다(환상적인 프로그램인 이미지매직에 감사를 표합니다):" #: ../data/ui/PreferencesVarietyDialog.ui.h:35 msgid "Quotes" msgstr "명언" #: ../data/ui/PreferencesVarietyDialog.ui.h:36 msgid "Show random wise quotes on the desktop" msgstr "바탕화면에 무작위 지혜로운 명언을 보기" #: ../data/ui/PreferencesVarietyDialog.ui.h:37 msgid "Text color: " msgstr "문자 색깔: " #: ../data/ui/PreferencesVarietyDialog.ui.h:38 msgid "Text font: " msgstr "문자 글꼴: " #: ../data/ui/PreferencesVarietyDialog.ui.h:39 msgid "Backdrop color: " msgstr "배경 색깔: " #: ../data/ui/PreferencesVarietyDialog.ui.h:40 msgid "Backdrop opacity: " msgstr "배경 불투명도: " #: ../data/ui/PreferencesVarietyDialog.ui.h:41 msgid " Transparent" msgstr " 투명" #: ../data/ui/PreferencesVarietyDialog.ui.h:42 msgid "Opaque" msgstr "불투명" #: ../data/ui/PreferencesVarietyDialog.ui.h:43 msgid "Draw a text shadow" msgstr "문자에 그림자를 그리기" #: ../data/ui/PreferencesVarietyDialog.ui.h:44 msgid "Appearance" msgstr "외형" #: ../data/ui/PreferencesVarietyDialog.ui.h:45 msgid "Quotes area width: " msgstr "따옴표 공간 너비: " #: ../data/ui/PreferencesVarietyDialog.ui.h:46 msgid "Narrow " msgstr "좁은 " #: ../data/ui/PreferencesVarietyDialog.ui.h:47 msgid "Wide" msgstr "넓은" #: ../data/ui/PreferencesVarietyDialog.ui.h:48 msgid "Horizontal position: " msgstr "수평 위치: " #: ../data/ui/PreferencesVarietyDialog.ui.h:49 msgid "Left " msgstr "좌측 " #: ../data/ui/PreferencesVarietyDialog.ui.h:50 ../variety/ThumbsManager.py:44 msgid "Right" msgstr "우측" #: ../data/ui/PreferencesVarietyDialog.ui.h:51 msgid "Vertical position: " msgstr "수직 위치: " #: ../data/ui/PreferencesVarietyDialog.ui.h:52 msgid "Top " msgstr "상단 " #: ../data/ui/PreferencesVarietyDialog.ui.h:53 ../variety/ThumbsManager.py:41 msgid "Bottom" msgstr "하단" #: ../data/ui/PreferencesVarietyDialog.ui.h:54 msgid "Placement" msgstr "배치" #: ../data/ui/PreferencesVarietyDialog.ui.h:55 msgid "Show quotes from these sources: " msgstr "이 소스로부터 명언 보기: " #: ../data/ui/PreferencesVarietyDialog.ui.h:56 msgid "" "More " "plugins" msgstr "" "더 많은 " "플러그인" #: ../data/ui/PreferencesVarietyDialog.ui.h:57 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "이 태그 및 저자만 봅니다. 공란으로 남겨서 무작위 명언을 봅니다." #: ../data/ui/PreferencesVarietyDialog.ui.h:59 msgid "Example: funny, inspirational" msgstr "예: 웃긴, 고무적인" #: ../data/ui/PreferencesVarietyDialog.ui.h:60 msgid "Example: Albert Einstein, Voltaire" msgstr "예: 알베르트 아인슈타인, 볼테르" #: ../data/ui/PreferencesVarietyDialog.ui.h:61 msgid "Authors: " msgstr "저자: " #: ../data/ui/PreferencesVarietyDialog.ui.h:62 msgid "Sources and filtering" msgstr "소스 및 필터링" #: ../data/ui/PreferencesVarietyDialog.ui.h:63 msgid "Change quote every " msgstr "명언을 바꾸는 주기 " #: ../data/ui/PreferencesVarietyDialog.ui.h:64 msgid "Minimum interval is 10 seconds" msgstr "최소 간격은 10초입니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:65 msgid "Regular change" msgstr "정기적으로 변경하기" #: ../data/ui/PreferencesVarietyDialog.ui.h:66 msgid "Clock" msgstr "시계" #: ../data/ui/PreferencesVarietyDialog.ui.h:67 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "크고 멋진 디지털 시계를 바탕화면에 보여서, 현재 시각 및 날짜를 표시합니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:68 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.h:69 msgid "Clock font: " msgstr "시계 글꼴: " #: ../data/ui/PreferencesVarietyDialog.ui.h:70 msgid "Date font: " msgstr "날짜 글꼴: " #: ../data/ui/PreferencesVarietyDialog.ui.h:71 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" "이 방법의 효과가 미미하셨습니까? 여기에 들어가셔서 " "읽어보십시오. 어떻게 시계를 고급 설정을 합니까? 여기에 " "들어가셔서 읽어보십시오." #: ../data/ui/PreferencesVarietyDialog.ui.h:72 msgid "Effects" msgstr "효과" #: ../data/ui/PreferencesVarietyDialog.ui.h:73 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:74 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:75 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:76 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:77 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:78 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:79 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:80 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:81 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:82 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:83 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:84 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:85 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:86 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:87 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:88 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:89 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:90 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:91 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:92 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:93 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:94 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:95 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:96 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:97 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:98 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:99 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:100 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:101 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:102 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:103 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:104 msgid "VRTY.ORG" msgstr "VRTY.ORG" #: ../data/ui/PreferencesVarietyDialog.ui.h:106 msgid "VRTY.ORG is in beta and will take some time to mature" msgstr "VRTY.ORG는 베타 상태이며 성숙하기 전까지는 시간이 걸릴 것입니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:107 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to add new image sources to Variety, and to follow other users' favorites. " "It is fueled by the favorite images of all participating users." msgstr "" "VRTY.ORG는 같은 입맛을 가진 버라이어티 사용자와 연결을 해주고 당신의 " "배경화면을 아주-편리하게 바꾸는 방법을 제공하며, 버라이어티에 새로운 이미지 소스를 찾으시거나 추가하실 수 있고, 다른 사용자의 " "즐겨찾기를 따르실 수 있습니다. 이것은 참여하는 모든 사용자의 선호하는 이미지로 공급됩니다." #: ../data/ui/PreferencesVarietyDialog.ui.h:108 msgid "" "Could not create user - no connection to VRTY.ORG. We will try again later." msgstr "사용자를 만들 수 없습니다 - VRTY.ORG에 연결이 되지 않았습니다. 우리는 나중에 다시 시도할 것입니다." #: ../data/ui/PreferencesVarietyDialog.ui.h:110 msgid "" "Registration enables cool features like synchronization of favorite images " "and sources between computers and personalized recommendations." msgstr "" "회원 가입은 컴퓨터들 사이에서 선호하는 이미지 및 소스와 사용자 설정 추천을 동기화하는 것과 같은 멋진 기능을 사용할 수 있도록 해줍니다." #: ../data/ui/PreferencesVarietyDialog.ui.h:112 msgid "Synchronize favorite images between computers" msgstr "컴퓨터들 사이에서 선호하는 이미지를 동기화합니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:113 msgid "Requires VRTY.ORG enabled and logged in." msgstr "VRTY.ORG를 사용 중이고 로그인돼있으셔야 합니다." #: ../data/ui/PreferencesVarietyDialog.ui.h:114 msgid "" "Your favorite images from other computers will be automatically downloaded " "to this computer. You need to be logged in with the same VRTY.ORG user " "everywhere. Sync will not delete any images." msgstr "" "다른 컴퓨터로부터 온 당신의 선호하는 이미지는 이 컴퓨터에 자동으로 내려받을 것입니다. 당신은 모든 컴퓨터에서 같은 VRTY.ORG " "사용자로 로그인돼있으셔야 합니다. 동기화는 아무 이미지를 지우지 않습니다." #: ../data/ui/PreferencesVarietyDialog.ui.h:115 msgid "Privacy policy" msgstr "개인 정보 보호 정책" #: ../data/ui/PreferencesVarietyDialog.ui.h:116 msgid "" "Variety sends data only for images it downloaded, never for images you " "already had in your local folders that might be private, and Sync does not " "work for such images. Collected data is not shared with third parties, " "unless you opt-in to make your profile public. Read more details about the " "service and the privacy policy here." msgstr "" "버라이어티는 이것이 내려받은 이미지만 보내고, 절대로 당신이 개인 정보가 들어있을지도 모르는 당신의 로컬 폴더에 이미 보유하고 있는 " "자료를 수집하지 않으며, 이러한 이미지를 동기화하지 않습니다. 모두에게 공개해서 참여함으로 설정하지 않은 이상, 수집된 자료는 제삼자와 " "공유되지 않습니다. 여기에 들어가셔서 이 서비스에 " "관한 더 자세한 사항과 개인 정보 보호 정책을 읽으십시오." #: ../data/ui/PreferencesVarietyDialog.ui.h:117 msgid "Usage statistics" msgstr "사용 통계" #: ../data/ui/PreferencesVarietyDialog.ui.h:118 msgid "Help make Variety better by sending anonymous usage statistics" msgstr "익명의 사용 통계를 보내서 버라이어티가 더 나아질 수 있도록 도와줍니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:119 msgid "" "These stats help us improve Variety by understanding how users interact with " "it. They also include general info about your OS version and monitor setup. " "Collected data is not shared with anyone." msgstr "" "이러한 통계는 우리가 사용자가 어떻게 이 프로그램을 사용하는지를 이해하는 것으로 버라이어티를 더 나아지게 할 수 있도록 도와줍니다. " "이러한 것들은 당신의 운영체제 버전 및 모니터 설정에 관한 일반 정보 역시 포함하고 있습니다. 수집된 자료는 아무에게도 공유되지 않습니다." #: ../data/ui/PreferencesVarietyDialog.ui.h:120 msgid "Sync and social" msgstr "동기화와 소셜 네트워크" #: ../data/ui/PreferencesVarietyDialog.ui.h:121 msgid "Fetch folder" msgstr "폴더를 불러옵니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:122 msgid "Save manually downloaded wallpapers to " msgstr "수동으로 내려받은 배경화면 저장하기 " #: ../data/ui/PreferencesVarietyDialog.ui.h:123 msgid "Drag and drop" msgstr "끌기와 놓기" #: ../data/ui/PreferencesVarietyDialog.ui.h:124 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.h:126 msgid "Clipboard monitoring" msgstr "클립보드 모니터링" #: ../data/ui/PreferencesVarietyDialog.ui.h:127 msgid "Monitor clipboard for image URLs and fetch them" msgstr "이미지 URL 클립보드를 관리하고 불러옵니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:128 msgid "But fetch only when the URL host is one of these:" msgstr "URL 호스트가 이들 중 하나일 때 불러오기만 합니다:" #: ../data/ui/PreferencesVarietyDialog.ui.h:129 msgid "Manual downloading" msgstr "수동 내려받기" #: ../data/ui/PreferencesVarietyDialog.ui.h:130 msgid "When possible use images that:" msgstr "가능하다면 이러한 이미지를 사용합니다:" #: ../data/ui/PreferencesVarietyDialog.ui.h:131 ../variety/ThumbsManager.py:98 msgid "Size" msgstr "크기" #: ../data/ui/PreferencesVarietyDialog.ui.h:132 msgid "Have landscape orientation" msgstr "가로 방향으로 전환합니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:133 msgid "Are big at least " msgstr "최소 만큼 크게 합니다 " #: ../data/ui/PreferencesVarietyDialog.ui.h:134 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui.h:135 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui.h:136 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui.h:138 #, no-c-format msgid "% of the screen resolution" msgstr "화면 해상도의 %" #: ../data/ui/PreferencesVarietyDialog.ui.h:139 msgid "Color" msgstr "색깔" #: ../data/ui/PreferencesVarietyDialog.ui.h:140 msgid "Are dark or light:" msgstr "어둡거나 밝게 합니다:" #: ../data/ui/PreferencesVarietyDialog.ui.h:141 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "어둡게" #: ../data/ui/PreferencesVarietyDialog.ui.h:142 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "밝게" #: ../data/ui/PreferencesVarietyDialog.ui.h:143 msgid "Contain this color: " msgstr "이 색깔을 함유합니다: " #: ../data/ui/PreferencesVarietyDialog.ui.h:144 msgid "(Takes effect after some initial searching)" msgstr "(초기 검색을 마치고 나서 효과가 적용됩니다)" #: ../data/ui/PreferencesVarietyDialog.ui.h:145 msgid "Rating" msgstr "평점" #: ../data/ui/PreferencesVarietyDialog.ui.h:146 msgid "Have EXIF rating at least " msgstr "최소 점 만큼의 EXIF 평점을 가지고 있습니다 " #: ../data/ui/PreferencesVarietyDialog.ui.h:147 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui.h:148 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui.h:149 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui.h:150 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui.h:151 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui.h:152 msgid "Color and size" msgstr "색깔 및 크기" #: ../data/ui/PreferencesVarietyDialog.ui.h:153 msgid "Indicator Icon" msgstr "지표 아이콘" #: ../data/ui/PreferencesVarietyDialog.ui.h:154 msgid "Indicator icon:" msgstr "지표 아이콘:" #: ../data/ui/PreferencesVarietyDialog.ui.h:155 msgctxt "Icon option" msgid "Light" msgstr "밝음" #: ../data/ui/PreferencesVarietyDialog.ui.h:156 msgctxt "Icon option" msgid "Dark" msgstr "어둠" #: ../data/ui/PreferencesVarietyDialog.ui.h:157 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "현재 배경화면을 사용합니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:158 msgctxt "Icon option" msgid "Custom image..." msgstr "사용자 설정 이미지..." #: ../data/ui/PreferencesVarietyDialog.ui.h:159 msgctxt "Icon option" msgid "None" msgstr "사용 안 함" #: ../data/ui/PreferencesVarietyDialog.ui.h:160 msgid "Select an icon" msgstr "아이콘을 선택하십시오" #: ../data/ui/PreferencesVarietyDialog.ui.h:161 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.h:162 msgid "Favorites Operations" msgstr "즐겨찾기 작업" #: ../data/ui/PreferencesVarietyDialog.ui.h:163 msgid "Favorites operations to show in main menu:" msgstr "주메뉴에서 즐겨찾기 작업을 봅니다:" #: ../data/ui/PreferencesVarietyDialog.ui.h:164 msgid "Copy to Favorites" msgstr "즐겨찾기에 복사합니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:166 msgid "Both Copy and Move" msgstr "복사 및 이동을 동시에 사용합니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:167 msgid "Depends on folder..." msgstr "폴더에 따라..." #: ../data/ui/PreferencesVarietyDialog.ui.h:170 msgid "Display dialog to customize the Facebook post before publishing" msgstr "발표하기 전에 대화 상자를 표시하여 페이스북 포스트를 사용자 설정합니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:171 msgid "Login Screen Support" msgstr "로그인 화면 지원" #: ../data/ui/PreferencesVarietyDialog.ui.h:172 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "버라이어티가 설정한 배경화면이 로그인 화면에서 사용될 것임을 명심하십시오" #: ../data/ui/PreferencesVarietyDialog.ui.h:173 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.h:174 msgid "Copy wallpaper image files to this folder: " msgstr "배경화면 이미지 파일을 이 폴더에 복사합니다: " #: ../data/ui/PreferencesVarietyDialog.ui.h:175 msgid "Reset to default" msgstr "기본 설정으로 초기화를 합니다" #: ../data/ui/PreferencesVarietyDialog.ui.h:176 msgid "Still doesn't work?" msgstr "아직도 실행되지 않으십니까?" #: ../data/ui/PreferencesVarietyDialog.ui.h:177 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "당신의 홈 폴더가 암호화 상태인듯합니다, 그러므로 이 프로그램 안에서 폴더를 사용하는 것은 불가능합니다." #: ../data/ui/PreferencesVarietyDialog.ui.h:178 msgid "You don't have write permissions for this folder." msgstr "당신은 이 폴더에 작성 권한을 가지고 있지 않습니다." #: ../data/ui/PreferencesVarietyDialog.ui.h:179 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "이 권한은 라이트DM이 이 폴더에 있는 파일을 읽는 걸 허락하지 않습니다." #: ../data/ui/PreferencesVarietyDialog.ui.h:180 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "버라이어티는 권한을 조정할 수 있지만, 당신은 관리자 권한을 제공하셔야 합니다." #: ../data/ui/PreferencesVarietyDialog.ui.h:181 msgid "Customize" msgstr "사용자 설정" #: ../data/ui/PreferencesVarietyDialog.ui.h:182 msgid "Tips and tricks" msgstr "비법과 요령" #: ../data/ui/PreferencesVarietyDialog.ui.h:183 msgid "Recent changes" msgstr "최근 변경 사항" #: ../data/ui/PreferencesVarietyDialog.ui.h:184 msgid "Visit website" msgstr "웹사이트 방문하기" #: ../data/ui/PreferencesVarietyDialog.ui.h:185 msgid "Report a bug or request a feature" msgstr "버그를 보고하거나 새로운 기능 추가 요구하기" #: ../data/ui/PreferencesVarietyDialog.ui.h:186 msgid "Send feedback" msgstr "피드백 보내기" #: ../data/ui/PreferencesVarietyDialog.ui.h:187 msgid "Donate to Variety" msgstr "버라이어티에 기부하기" #: ../data/ui/PreferencesVarietyDialog.ui.h:188 msgid "Donate via PayPal" msgstr "페이팔을 통해 기부하기" #: ../data/ui/PreferencesVarietyDialog.ui.h:189 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.h:193 msgid "" "For Bitcoin and other payment methods please go to Variety's website." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:194 msgid "Donate" msgstr "기부하기" #: ../variety/FacebookHelper.py:116 msgid "Authorization successful" msgstr "인증에 성공하셨습니다" #: ../variety/FacebookHelper.py:116 msgid "Publishing..." msgstr "발표하는 중입니다..." #: ../variety/FacebookHelper.py:121 msgid "Authorization failed" msgstr "인증에 실패하셨습니다" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "상단" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "좌측" #: ../variety/ThumbsManager.py:94 msgid "Position" msgstr "위치" #: ../variety/ThumbsManager.py:109 msgid "Show Containing Folder" msgstr "들어있는 폴더를 봅니다" #: ../variety/ThumbsManager.py:136 ../variety/indicator.py:156 msgid "Set EXIF Rating" msgstr "EXIF 평점 정하기" #: ../variety/ThumbsManager.py:160 ../variety/indicator.py:87 msgid "Delete to _Trash" msgstr "휴지통에 삭제하기(_T)" #: ../variety/ThumbsManager.py:167 ../variety/indicator.py:131 msgid "Where is it from?" msgstr "이것은 어디서 왔습니까?" #: ../variety/ThumbsManager.py:178 msgid "Close" msgstr "닫기" #: ../variety/ThumbsManager.py:198 msgid "Could not set EXIF rating" msgstr "EXIF 평점을 정할 수 없습니다" #: ../variety/ThumbsManager.py:217 msgid "Unrated" msgstr "무등급" #: ../variety/ThumbsManager.py:224 msgid "Rejected" msgstr "거부됨" #: ../variety/ThumbsManager.py:324 msgid "Variety History" msgstr "버라이어티 사용 기록" #: ../variety/ThumbsManager.py:326 msgid "Variety Recent Downloads" msgstr "버라이어티 최근 내려받기 기록" #: ../variety/ThumbsManager.py:328 msgid "Variety Images" msgstr "버라이어티 이미지" #: ../data/ui/AddWallbaseDialog.ui.h:1 msgid "Variety - add Wallbase.cc image source" msgstr "버라이어티 - Wallbase.cc 이미지 소스를 추가합니다" #: ../data/ui/AddWallbaseDialog.ui.h:2 msgid "Wallbase.cc" msgstr "Wallbase.cc" #: ../data/ui/AddWallbaseDialog.ui.h:3 msgid "" "Wallbase.cc is permanently down. Use Wallhaven.cc instead. Support for " "Wallbase.cc will be dropped completely in a future release, please remove or " "update your existing Wallbase sources." msgstr "" "Wallbase.cc는 영구적으로 다운되었습니다. 대신에 Wallhaven.cc를 이용하십시오. Wallbase.cc에 대한 지원이 다음 " "버전에서 완전히 중단될 것이므로, 기존에 있는 당신의 월베이스 소스를 제거하거나 업데이트를 하십시오." #: ../data/ui/AddWallbaseDialog.ui.h:4 msgid "" "Wallbase.cc provides a variety of image " "search options. Below you can specify keywords to search for, or visit Wallbase.cc, setup your search criteria " "there, ensure you like the results, and paste the full Wallbase URL in the " "box.\n" "\n" "If you specify keywords, the most liked safe-for-work images that match any " "of the keywords will be used. \n" "\n" "If you specify a Wallbase 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." msgstr "" "Wallbase.cc는 다양한 이미지 검색 선택 사항을 제공합니다. 여기서 " "당신은 찾으려 하는 검색어의 키워드를 지정하시거나, Wallbase.cc를 " "방문하셔서, 당신에게 만족스러운 검색 결과를 확실하게 제공하는, 당신만의 검색 조건을 설정하시고, 검색 창에 전체 월베이스 URL을 " "입력하실 수 있습니다.\n" "\n" "만약 당신이 키워드를 지정했다면, 주로 사용될 키워드 중 아무 키워드랑 관련 있는 건전한 이미지가 나올 것입니다. \n" "\n" "만약 당신이 월베이스 URL을 지정했다면, 분류 조건을 주의 깊게 선택하십시오 - 보통 버라이어티는 이미지를 요구하지만, 맨 처음에 " "나오는 수백 개의 되돌려진 주소로부터 나타나는 이미지만 사용합니다. 무작위 검색 혹은 날짜별 검색은 이 이미지 소스가 소멸하기 전까지 더 " "긴 \"수명\"을 가짐을 뜻합니다. 즐겨찾기 검색은 더 나은 화질의 이미지를 제공하며 연관성 검색은 구절이나 색깔을 검색할 때 더 관련 " "있는 결과를 제공합니다." #: ../data/ui/FacebookPublishDialog.ui.h:1 msgid "Variety - Publish to Facebook" msgstr "버라이어티 - 페이스북에 발표합니다" #: ../data/ui/FacebookPublishDialog.ui.h:2 ../variety/indicator.py:149 #: ../variety/indicator.py:223 msgid "Share on Facebook" msgstr "페이스북으로 공유합니다" #: ../data/ui/FacebookPublishDialog.ui.h:3 msgid "" "Publish a link to the current wallpaper on Facebook. Include this text along " "with the link (or just leave empty):" msgstr "페이스북에 현재 배경화면의 링크를 발표합니다. 이 문자를 링크와 함께 발표합니다(혹은 공란으로 남기셔도 됩니다):" #: ../data/ui/FacebookPublishDialog.ui.h:4 msgid "Use current quote" msgstr "현재의 명언을 사용합니다" #: ../data/ui/SmartRegisterDialog.ui.h:1 msgid "Variety - VRTY.ORG registration" msgstr "버라이어티 - VRTY.ORG 회원 가입" #: ../data/ui/SmartRegisterDialog.ui.h:2 msgid "Would you like to register?" msgstr "회원 가입을 하시겠습니까?" #: ../data/ui/SmartRegisterDialog.ui.h:3 msgid "" "You may participate in VRTY.ORG " "anonymously, but registration enables some very nice features, such as synchronization of favorites between computers and " "personalized recommendations. It also ensures " "you will not lose your profile and favorite wallpapers if you reinstall your " "OS." msgstr "" "당신은 VRTY.ORG 에서 익명으로 참여하실 수 있지만, 회원 가입은 " "컴퓨터들 사이에서 즐겨찾기 및 사용자 설정 추천동기화를 합니다 같은, 매우 멋진 몇몇 기능을 사용할 수 있도록 해줍니다. 또한, 이 기능은 " "당신이 운영체제를 재설치하신다면 당신의 프로필과 선호하는 배경화면을 확실하게 잃지 않도록 해줍니다." #: ../data/ui/SmartRegisterDialog.ui.h:4 msgid "Registration is very easy and does not require any personal data." msgstr "회원 가입은 매우 쉬우며 아무 개인 정보를 요구하지 않습니다." #: ../data/ui/SmartRegisterDialog.ui.h:5 msgid "" "If you choose to participate anonymously, you can register later from the " "\"Sync and social\" page in Preferences." msgstr "" "만약 당신이 익명으로 참여함을 선택하셨다면, 당신은 환경 설정에 있는 \"동기화와 소셜 " "네트워크\" 페이지에서 나중에 가입하실 수 있습니다." #: ../data/ui/SmartRegisterDialog.ui.h:6 msgid "" "Oops, we could not connect to VRTY.ORG. Server might be down. Please wait a " "couple of minutes and try again or choose \"Participate anonymously\" and register later " "from the \"Sync and social\" page in " "Preferences." msgstr "" "이런, 우리는 VRTY.ORG 서버를 연결할 수 없습니다. 서버가 잠시 다운된 상태일 수도 있습니다. 잠시 몇 분 동안 기다리시고 다시 " "접속을 시도하시거나 \"익명으로 참여합니다\"를 선택하시고 환경 설정에 있는 " "\"동기화와 소셜 네트워크\" 페이지에서 나중에 가입하십시오." #: ../data/ui/SmartRegisterDialog.ui.h:7 msgid "" "Please continue the registration and follow the instructions in the browser " "tab we opened." msgstr "회원 가입을 계속하시고 우리가 브라우저 탭에 열은 지시문을 따르십시오." #: ../data/ui/SmartRegisterDialog.ui.h:8 msgid "I will participate anonymously" msgstr "익명으로 참여할 것입니다" #: ../data/ui/SmartRegisterDialog.ui.h:9 msgid "I'm registered, let me login" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:10 msgid "Register here" msgstr "여기서 회원 가입을 하십시오" #: ../variety.desktop.in.h:1 msgid "Variety" msgstr "버라이어티" #: ../variety.desktop.in.h:2 msgid "Variety Wallpaper Changer" msgstr "버라이어티 배경화면 바꾸기 프로그램" #: ../variety.desktop.in.h:3 msgid "Next" msgstr "다음" #: ../variety.desktop.in.h:4 msgid "Previous" msgstr "이전" #: ../variety.desktop.in.h:5 msgid "Pause / Resume" msgstr "일시 정지 / 재개" #: ../variety.desktop.in.h:6 msgid "History" msgstr "사용 기록" #: ../variety.desktop.in.h:7 msgid "Preferences" msgstr "환경 설정" #: ../data/plugins/quotes/LocalFilesSource.py:34 msgid "" "Displays quotes, defined in local text files.\n" "Put your own txt files in: ~/.config/variety/pluginconfig/quotes/.\n" "The file format is:\n" "\n" "quote -- author\n" ".\n" "second quote -- another author\n" ".\n" "etc...\n" "\n" "Example: http://rvelthuis.de/zips/quotes.txt" msgstr "" "명언을 표시합니다, 로컬 문자 파일에서 설정됩니다.\n" "당신만의 txt 파일을: ~/.config/variety/pluginconfig/quotes/에 넣으십시오.\n" "\n" "파일 형식은:\n" "\n" "명언 -- 저자\n" ".\n" "두 번째 명언 -- 다른 저자\n" ".\n" "등등... 입니다\n" "\n" "예: http://rvelthuis.de/zips/quotes.txt" #: ../variety/indicator.py:49 ../variety/indicator.py:96 #: ../variety/indicator.py:166 msgid "_Next" msgstr "다음(_N)" #: ../variety/indicator.py:54 ../variety/indicator.py:101 #: ../variety/indicator.py:171 msgid "_Previous" msgstr "이전(_P)" #: ../variety/indicator.py:61 msgid "Current desktop wallpaper" msgstr "현재 데스크톱 배경화면" #: ../variety/indicator.py:65 msgid "Show origin" msgstr "원본을 봅니다" #: ../variety/indicator.py:106 ../variety/indicator.py:176 msgid "_Next, skipping forward history" msgstr "다음(_N), 사용 기록을 앞으로 나아가는 걸 넘깁니다" #: ../variety/indicator.py:114 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "비법: 아이콘 위에 마우스 휠을 스크롤 하셔서\n" "앞뒤로 넘기십시오" #: ../variety/indicator.py:124 msgid "_Image" msgstr "이미지(_I)" #: ../variety/indicator.py:135 msgid "Show without effects" msgstr "효과 없이 봅니다" #: ../variety/indicator.py:143 msgid "Google Image Search" msgstr "구글 이미지 검색" #: ../variety/indicator.py:196 msgid "View Favorites..." msgstr "즐겨찾기 보기..." #: ../variety/indicator.py:203 msgid "Copy to Clipboard" msgstr "클립보드에 복사하기" #: ../variety/indicator.py:213 msgid "Google Quote" msgstr "구글 명언" #: ../variety/indicator.py:218 msgid "Google Author" msgstr "구글 저자" #: ../variety/indicator.py:230 ../variety/indicator.py:284 msgid "Preferences..." msgstr "환경 설정..." #: ../variety/indicator.py:238 msgid "Turn off" msgstr "끕니다" #: ../variety/indicator.py:244 msgid "_Quote" msgstr "명언(_Q)" #: ../variety/indicator.py:251 msgid "_History" msgstr "사용 기록(_H)" #: ../variety/indicator.py:257 msgid "_Wallpaper Selector" msgstr "배경화면 선택기(_W)" #: ../variety/indicator.py:263 msgid "Recent _Downloads" msgstr "최근 내려받기 기록(_D)" #: ../variety/indicator.py:278 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:288 msgid "About" msgstr "설명" #: ../variety/indicator.py:292 msgid "Quit" msgstr "끝내기" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:1 msgid "Copy to Favorites vs. Move to Favorites" msgstr "즐겨찾기에 복사하기 대 즐겨찾기로 이동하기" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:2 msgid "Reset to Default" msgstr "기본 설정으로 초기화를 합니다" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:3 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.h:4 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" "다른 사항:두 개를 동시에 사용합니다" #: ../variety/ImageFetcher.py:56 ../variety/ImageFetcher.py:103 msgid "Fetching" msgstr "불러오는 중입니다" #. too small - delete and do not use #: ../variety/ImageFetcher.py:118 msgid "Image too small, ignoring it" msgstr "이미지가 너무 작습니다, 무시합니다" #: ../variety/ImageFetcher.py:140 #, python-format msgid "Sorry, got %s error..." msgstr "죄송합니다, %s 오류가 발생했습니다..." #: ../variety/ImageFetcher.py:141 msgid "This means the link is no longer valid" msgstr "이는 링크가 더는 유효하지 않음을 뜻합니다" #: ../variety/ImageFetcher.py:144 msgid "Fetch failed for some reason" msgstr "모종의 이유로 불러오는 걸 실패했습니다" #: ../variety/ImageFetcher.py:145 msgid "" "To get more information, please run Variety from terminal with -v option and " "retry the action" msgstr "더 자세한 정보를 보시려면, 터미널에서 버라이어티를 -v 선택 사항과 같이 실행하시고 다시 시도하십시오" variety/po/pl.po0000644000000000000000000023773612655724342011054 0ustar # Polish translation for variety # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the variety package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: variety\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-01-29 10:57+0200\n" "PO-Revision-Date: 2015-07-02 19:36+0000\n" "Last-Translator: Seweryn Opyd \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-02-07 20:28+0000\n" "X-Generator: Launchpad (build 17908)\n" #: ../data/plugins/quotes/GoodreadsSource.py:49 msgid "Fetches quotes from Goodreads.com" msgstr "Pobiera cytaty z Goodreads.com" #: ../data/ui/LoginOrRegisterDialog.ui.h:1 msgid "Login to VRTY.ORG" msgstr "Zaloguj się na VRTY.ORG" #: ../data/ui/LoginOrRegisterDialog.ui.h:2 msgid "Username: " msgstr "Nazwa użytkownika: " #: ../data/ui/LoginOrRegisterDialog.ui.h:3 msgid "Password: " msgstr "Hasło: " #: ../data/ui/LoginOrRegisterDialog.ui.h:4 msgid "No account? Register here" msgstr "Nie masz konta? Zarejestruj się." #: ../data/ui/LoginOrRegisterDialog.ui.h:5 msgid "Forgot your password?" msgstr "Nie pamiętasz hasła?" #: ../data/ui/LoginOrRegisterDialog.ui.h:6 msgid "" "Tip: You can also login to VRTY.ORG in a " "browser and click the link \"Trigger Variety " "login\" in your profile." msgstr "" "Możesz również zalogować się na VRTY.ORG w " "przeglądarce i kliknąć „Trigger Variety login” " "w swoim profilu." #: ../data/ui/LoginOrRegisterDialog.ui.h:7 msgid "Login" msgstr "Zaloguj" #: ../variety/LoginOrRegisterDialog.py:80 #, python-format msgid "Oops, server returned error (%s)" msgstr "Ups, serwer zwrócił błąd (%s)" #: ../variety/LoginOrRegisterDialog.py:85 msgid "Could not connect to server" msgstr "Nie udało się połączyć z serwerem" #: ../variety/AddWallhavenDialog.py:38 ../variety/AddWallbaseDialog.py:38 #: ../variety/AddFlickrDialog.py:138 msgid "No images found" msgstr "Nie znaleziono żadnych obrazów" #: ../data/ui/AddPanoramioDialog.ui.h:1 msgid "Variety - add Panoramio image source" msgstr "Variety – dodaj Panoramio jako źródło obrazów" #. (_("Wallbase.cc"), self.on_add_wallbase_clicked), #: ../data/ui/AddPanoramioDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:388 msgid "Panoramio" msgstr "Panoramio" #: ../data/ui/AddPanoramioDialog.ui.h:3 msgid "Please zoom over your area of interest." msgstr "Najedź na interesujący cię obszar." #: ../variety/FolderChooser.py:65 msgid "Choose a folder" msgstr "Wybierz folder" #: ../variety/FolderChooser.py:66 ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Cancel" msgstr "Anuluj" #: ../variety/FolderChooser.py:66 msgid "OK" msgstr "OK" #: ../data/ui/AddWallhavenDialog.ui.h:1 msgid "Variety - add Wallhaven.cc image source" msgstr "Variety – dodaj Wallhaven.cc jako źródło obrazów" #: ../data/ui/AddWallhavenDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:386 msgid "Wallhaven.cc" msgstr "Wallhaven.cc" #: ../data/ui/AddWallhavenDialog.ui.h:3 msgid "" "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." msgstr "" #: ../data/ui/AddWallhavenDialog.ui.h:8 ../data/ui/AddWallbaseDialog.ui.h:9 msgid "Enter keywords or paste URL here: " msgstr "Wpisz słowa kluczowe lub wklej URL tutaj: " #: ../data/ui/AddWallhavenDialog.ui.h:9 ../data/ui/AddFlickrDialog.ui.h:16 #: ../data/ui/AddWallbaseDialog.ui.h:10 msgid "Just a moment to check this search" msgstr "Sprawdzanie wyników szukania..." #: ../data/ui/AddWallhavenDialog.ui.h:10 ../data/ui/AddFlickrDialog.ui.h:17 #: ../data/ui/AddRedditDialog.ui.h:9 ../data/ui/AddMediaRssDialog.ui.h:6 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:10 #: ../data/ui/AddWallbaseDialog.ui.h:11 msgid " " msgstr " " #: ../variety/QuotesEngine.py:232 msgid "No quote plugins" msgstr "Brak wtyczek do cytatów" #: ../variety/QuotesEngine.py:232 msgid "There are no quote plugins installed" msgstr "Nie ma już więcej zainstalowanych wtyczek do cytatów" #: ../variety/QuotesEngine.py:238 msgid "No suitable quote plugins" msgstr "Brak odpowiednich wtyczek do cytatów" #: ../variety/QuotesEngine.py:239 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:251 msgid "Could not fetch quotes" msgstr "Nie można pobrać cytatów" #: ../variety/QuotesEngine.py:252 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:255 msgid "Could not find quotes" msgstr "Nie znaleziono cytatów" #: ../variety/QuotesEngine.py:256 msgid "Maybe you are searching for something very obscure?" msgstr "Może szukasz czegoś dziwnego?" #: ../variety/Texts.py:20 msgid "Keep original" msgstr "Zachowaj oryginał" #: ../variety/Texts.py:21 msgid "Grayscale" msgstr "Odcienie szarości" #: ../variety/Texts.py:22 msgid "Heavy blur" msgstr "Mocne rozmazanie" #: ../variety/Texts.py:23 msgid "Soft blur" msgstr "Słabe rozmazanie" #: ../variety/Texts.py:24 msgid "Oil painting" msgstr "Obraz olejny" #: ../variety/Texts.py:25 msgid "Pencil sketch" msgstr "Szkic ołówkiem" #: ../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:37 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:38 msgid "Random wallpapers from Desktoppr.co" msgstr "Losowe tapety z Desktoppr.co" #: ../variety/Texts.py:39 msgid "NASA's Astronomy Picture of the Day" msgstr "Astronomiczny Obraz Dnia od NASA" #: ../variety/Texts.py:41 msgid "World Sunlight Map - live wallpaper from Die.net" msgstr "" #: ../variety/Texts.py:42 msgid "Bing Photo of the Day" msgstr "" #: ../variety/Texts.py:43 msgid "High-resolution photos from Unsplash.com" msgstr "" #: ../variety/Texts.py:47 msgid "" "If you use KDE, you need to perform some actions before Variety will work. " "Please read here: http://peterlevi.com/variety/2014/05/variety-and-kde/" msgstr "" "Jeżeli używasz KDE, musisz dokonać pewnych czynności zanim Variety będzie " "działać. Proszę przeczytaj: http://peterlevi.com/variety/2014/05/variety-and-" "kde/" #: ../variety/Texts.py:48 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:49 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 " "~/.config/variety/scripts. There are examples there for various desktop " "environments." msgstr "" "Jeżeli chcesz wykonywać własne polecenie przy każdej zmianie tapety lub " "jeżeli używasz innego środowiska graficznego, zmień " "~/.config/variety/scripts. Są tam także przykłady dla różnych środowisk " "graficznych." #: ../variety/Texts.py:50 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:51 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:52 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:53 msgid "" "Adding your own custom filters is quite easy: open " "~/.config/variety/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 "" "Dodawanie własnych filtrów jest całkiem proste: otwórz " "~/.config/variety/variety.conf i skorzystaj z istniejących jako przykładów. " "Każdy filtr to po prostu lista opcji do przekazania do ImageMagick, który " "zastosuje filtr." #: ../variety/Texts.py:54 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:55 msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of ~/.config/variety/scripts/set_wallpaper." msgstr "" "Aby włączyć powiadomienia zmiany tapety, odkomentuj ostatnie dwie linie w " "~/.config/variety/scripts/set_wallpaper." #: ../variety/Texts.py:56 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:57 msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "~/.config/variety/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 "" "Kiedy zapisujesz cytaty do Ulubionych, są one zapisywane do " "~/.config/variety/favorite_quotes.txt. Ten plik jest kompatybilny z " "lokalnymi źródłami cytatów Variety. Jeśli chcesz, możesz skopiować je do " "~/.config/variety/pluginconfig/quotes/ i włączyć \"Pliki Lokalne\" w " "źródłach cytatów. Ten plik jest także kompatybilny z Unixowym narzędziem " "\"fortune\"." #: ../variety/PreferencesVarietyDialog.py:259 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:382 #: ../variety/PreferencesVarietyDialog.py:551 #: ../data/ui/PreferencesVarietyDialog.ui.h:11 msgid "Images" msgstr "Obrazy" #: ../variety/PreferencesVarietyDialog.py:383 msgid "Folders" msgstr "Katalogi" #: ../variety/PreferencesVarietyDialog.py:385 #: ../data/ui/AddFlickrDialog.ui.h:2 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:389 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:2 msgid "Wallpapers.net" msgstr "Wallpapers.net" #: ../variety/PreferencesVarietyDialog.py:390 #: ../data/ui/AddRedditDialog.ui.h:2 msgid "Reddit" msgstr "Reddit" #: ../variety/PreferencesVarietyDialog.py:391 #: ../data/ui/AddMediaRssDialog.ui.h:2 msgid "Media RSS" msgstr "Media RSS" #: ../variety/PreferencesVarietyDialog.py:416 msgid "Remove the source, keep the files" msgstr "Usuń źródło, zachowaj pliki" #: ../variety/PreferencesVarietyDialog.py:417 msgid "Remove the sources, keep the files" msgstr "Usuń źródła, zachowaj pliki" #: ../variety/PreferencesVarietyDialog.py:424 msgid "Remove the source and delete the downloaded files" msgstr "Usuń źródło i pobrane pliki" #: ../variety/PreferencesVarietyDialog.py:425 msgid "Remove the sources and delete the downloaded files" msgstr "Usuń źródła i pobrane pliki" #: ../variety/PreferencesVarietyDialog.py:458 msgid "World Sunlight Map enabled" msgstr "Mapa oświetlenia świata włączona" #: ../variety/PreferencesVarietyDialog.py:459 msgid "" "Using the World Sunlight Map requires both downloading and changing enabled " "at intervals of 30 minutes or less. Settings were adjusted automatically." msgstr "" "Użycie Mapy oświetlenia świata wymaga pobierania oraz zmiany tapety co 30 " "minut lub częściej. Ustawienia zostaną dostosowane automatycznie." #: ../variety/PreferencesVarietyDialog.py:544 msgid "Add Images" msgstr "Add obrazy" #: ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Add" msgstr "Dodaj" #: ../variety/PreferencesVarietyDialog.py:567 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:703 #: ../variety/PreferencesVarietyDialog.py:716 #: ../data/ui/PreferencesVarietyDialog.ui.h:168 msgid "Edit..." msgstr "Edytuj…" #: ../variety/PreferencesVarietyDialog.py:710 msgid "View Image" msgstr "Pokaż obraz" #: ../variety/PreferencesVarietyDialog.py:713 msgid "Open Folder" msgstr "Otwórz katalog" #: ../variety/PreferencesVarietyDialog.py:1092 msgid "Recommended images source disabled" msgstr "Polecane źródła obrazów wyłączone" #: ../variety/PreferencesVarietyDialog.py:1120 #: ../variety/PreferencesVarietyDialog.py:1139 #: ../variety/PreferencesVarietyDialog.py:1147 msgid "No write permissions" msgstr "Brak uprawnień do zapisu" #: ../variety/PreferencesVarietyDialog.py:1127 msgid "Limit disabled" msgstr "Limity wyłączone" #: ../variety/PreferencesVarietyDialog.py:1128 msgid "" "Changing the download folder automatically turns off the size limit to " "prevent from accidental data loss" msgstr "" "Zmiana katalogu pobierania automatycznie wyłącza limit rozmiaru, aby " "zapobiec przypadkowej utracie danych" #: ../variety/PreferencesVarietyDialog.py:1134 #, python-format msgid "Actual download folder: %s " msgstr "Aktualny folder pobierania: %s " #: ../variety/PreferencesVarietyDialog.py:1214 msgid "Could not adjust permissions" msgstr "Nie można poprawić uprawnień" #: ../variety/PreferencesVarietyDialog.py:1215 #, 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/PreferencesVarietyDialog.py:1247 msgid "Logged in as: " msgstr "" #: ../variety/PreferencesVarietyDialog.py:1249 msgid "Anonymous" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1250 #: ../data/ui/PreferencesVarietyDialog.ui.h:109 msgid "Login or register" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1250 msgid "Switch user" msgstr "" #: ../data/ui/AddFlickrDialog.ui.h:1 msgid "Variety - add Flickr as an image source" msgstr "Variety - dodaj Flickr jako źródło obrazów" #: ../data/ui/AddFlickrDialog.ui.h:3 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.h:4 #: ../data/ui/PreferencesVarietyDialog.ui.h:58 msgid "Tags: " msgstr "Tagi: " #: ../data/ui/AddFlickrDialog.ui.h:5 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.h:7 msgid "User: " msgstr "Użytkownik: " #: ../data/ui/AddFlickrDialog.ui.h:8 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.h:10 msgid "Group: " msgstr "Grupa: " #: ../data/ui/AddFlickrDialog.ui.h:11 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/group" "s/wallpapers/" msgstr "" "Proszę podać URL grupy.\n" "Przykład: http://www.flickr.com/group" "s/wallpapers/" #: ../data/ui/AddFlickrDialog.ui.h:13 msgid "Text:" msgstr "Tekst:" #: ../data/ui/AddFlickrDialog.ui.h:14 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" #: ../variety/AddMediaRssDialog.py:40 msgid "" "This does not seem to be a valid Media RSS feed URL or there is no content " "there." msgstr "" "To źródło (RSS lub URL) wydaje się błędne lub pod linkiem nie ma żadnej " "treści." #: ../variety/VarietyWindow.py:630 ../variety/VarietyWindow.py:772 #: ../variety/VarietyWindow.py:2650 msgid "Already in Favorites" msgstr "Jest już w Ulubionych" #: ../variety/VarietyWindow.py:634 ../variety/ThumbsManager.py:144 #: ../variety/indicator.py:76 msgid "Copy to _Favorites" msgstr "Kopiuj do Ulubionych" #: ../variety/VarietyWindow.py:635 ../variety/ThumbsManager.py:151 msgid "Move to _Favorites" msgstr "Przenieś do _Ulubionych" #. both #: ../variety/VarietyWindow.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:165 ../variety/indicator.py:81 msgid "Move to Favorites" msgstr "Przenieś do Ulubionych" #: ../variety/VarietyWindow.py:665 ../variety/ThumbsManager.py:119 msgid "Fetched: Show Origin" msgstr "Złapane: Pokaż źródło" #: ../variety/VarietyWindow.py:667 ../variety/VarietyWindow.py:762 #: ../variety/ThumbsManager.py:121 #, python-format msgid "View at %s" msgstr "Pokaż w %s" #: ../variety/VarietyWindow.py:711 msgid "Unknown" msgstr "" #: ../variety/VarietyWindow.py:732 #, python-format msgid "Author: %s" msgstr "Autor: %s" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 #: ../variety/indicator.py:120 ../variety/indicator.py:185 msgid "Pause on current" msgstr "" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 msgid "Resume regular changes" msgstr "" #: ../variety/VarietyWindow.py:772 ../variety/indicator.py:191 msgid "Save to Favorites" msgstr "Zapisz do Ulubionych" #: ../variety/VarietyWindow.py:904 msgid "Filtering too strict?" msgstr "Czy filtrowanie nie jest za ostre?" #: ../variety/VarietyWindow.py:905 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:1377 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:1379 msgid "Please add more image sources" msgstr "Proszę dodać więcej źródeł obrazów" #: ../variety/VarietyWindow.py:1380 msgid "No more wallpapers" msgstr "Nie ma już więcej tapet" #: ../variety/VarietyWindow.py:1566 msgid "Current wallpaper is not in the image sources" msgstr "Bieżącej tapety nie ma w źródłach" #: ../variety/VarietyWindow.py:1601 #, 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:1603 #, 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:1623 ../variety/VarietyWindow.py:1643 msgid "Cannot delete" msgstr "Nie można usunąć" #: ../variety/VarietyWindow.py:1624 #, 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:1644 msgid "" "Probably there is no utility for moving to Trash?\n" "Please install trash-cli or gvfs-bin or konquerer." msgstr "" "Prawdopodobnie brakuje narzędzia do przenoszenia do Kosza?\n" "Proszę zainstalować trash-cli or gvfs-bin lub konquerer." #: ../variety/VarietyWindow.py:1776 msgid "Anonymous usage statistics" msgstr "" #: ../variety/VarietyWindow.py:1777 msgid "" "Variety collects anonymous usage statistics. \n" "These help us make it better and are not shared with anyone. \n" "To read more or turn them off, go to \"Sync and social\"" msgstr "" #: ../variety/VarietyWindow.py:1920 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:1945 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 /some/local/image.jpg --next" msgstr "" "%prog [opcje] [pliki lub adresy URL]\n" "\n" "Podanie plików lokalnych doda je do kolejki Variety.\n" "Podanie nielokalnych adresów URL sprawi, że Variety złapie je do Złapanych i " "umieści w kolejce.\n" "\n" "Żeby ustawić konkretną tapetę: %prog /jakiś/lokalny/obraz.jpg --next" #: ../variety/VarietyWindow.py:1955 msgid "" "Show logging messages (-vv shows even finer debugging messages, -vvv debugs " "variety_lib too)" msgstr "" "Pokaż logi (-vv pokazuje nawet lepsze debugowanie, -vvv debuguje także " "variety_lib)" #: ../variety/VarietyWindow.py:1959 msgid "Make the running instance quit" msgstr "Zamknij uruchomioną instancję" #: ../variety/VarietyWindow.py:1963 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/VarietyWindow.py:1967 msgid "Show Next wallpaper" msgstr "Pokaż następną" #: ../variety/VarietyWindow.py:1971 msgid "Show Previous wallpaper" msgstr "Pokaż poprzednią" #: ../variety/VarietyWindow.py:1975 msgid "Show Next wallpaper, skipping the forward history" msgstr "Pokaż następną, pomiń historię" #: ../variety/VarietyWindow.py:1979 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/VarietyWindow.py:1983 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/VarietyWindow.py:1987 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/VarietyWindow.py:1991 msgid "Pause on current image" msgstr "" #: ../variety/VarietyWindow.py:1995 msgid "Resume regular image changes" msgstr "" #: ../variety/VarietyWindow.py:1999 msgid "Toggle Pause/Resume state" msgstr "Wstrzymaj/Wznów" #: ../variety/VarietyWindow.py:2003 msgid "Show Next quote" msgstr "Pokaż następny cytat" #: ../variety/VarietyWindow.py:2007 msgid "Show Previous quote" msgstr "Pokaż poprzedni cytat" #: ../variety/VarietyWindow.py:2011 msgid "Show Next quote, skipping the forward history" msgstr "Pokaż następny cytat, pomiń historię" #: ../variety/VarietyWindow.py:2015 msgid "Toggle Quotes Pause/Resume state" msgstr "Wstrzymaj/Wznów cytaty" #: ../variety/VarietyWindow.py:2019 msgid "Save the current quote to Favorites" msgstr "Zapisz bieżący cytat do Ulubionych" #: ../variety/VarietyWindow.py:2023 msgid "Toggle History display" msgstr "Pokaż/Ukryj historię" #: ../variety/VarietyWindow.py:2027 msgid "Toggle Recent Downloads display" msgstr "Pokaż/Ukryj Niedawno Pobrane" #: ../variety/VarietyWindow.py:2031 msgid "Show Preferences dialog" msgstr "Pokaż preferencje" #: ../variety/VarietyWindow.py:2035 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/VarietyWindow.py:2039 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/VarietyWindow.py:2053 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "opcje --next/--fast-forward i --previous się wykluczają" #: ../variety/VarietyWindow.py:2056 msgid "options --trash and --favorite are mutually exclusive" msgstr "opcje --trash i --favorite się wykluczają" #: ../variety/VarietyWindow.py:2059 msgid "options --pause and --resume are mutually exclusive" msgstr "opcje --pause i --resume się wykluczają" #: ../variety/VarietyWindow.py:2062 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:2179 ../variety/ImageFetcher.py:60 #: ../variety/ImageFetcher.py:71 ../variety/ImageFetcher.py:78 #: ../variety/ImageFetcher.py:112 msgid "Not an image" msgstr "Plik nie jest obrazem" #: ../variety/VarietyWindow.py:2184 msgid "Added to queue" msgstr "Dodane do kolejki" #: ../variety/VarietyWindow.py:2185 ../variety/VarietyWindow.py:2191 msgid "Press Next to see it" msgstr "Naciśnij Następny aby zobaczyć" #: ../variety/VarietyWindow.py:2191 msgid "Fetched" msgstr "Złapane" #: ../variety/VarietyWindow.py:2237 msgid "Unsupported source type" msgstr "" #: ../variety/VarietyWindow.py:2238 ../variety/VarietyWindow.py:2286 msgid "Are you running the most recent version of Variety?" msgstr "Czy używasz najnowszej wersji Variety?" #: ../variety/VarietyWindow.py:2244 msgid "New image source added" msgstr "" #: ../variety/VarietyWindow.py:2246 msgid "Image source already exists, enabling it" msgstr "" #: ../variety/VarietyWindow.py:2272 msgid "Fetched and applied" msgstr "" #: ../variety/VarietyWindow.py:2282 msgid "It works!" msgstr "" #: ../variety/VarietyWindow.py:2282 msgid "Yay, Variety links work. Great!" msgstr "" #: ../variety/VarietyWindow.py:2286 msgid "Unsupported command" msgstr "Nieobsługiwane polecenie" #: ../variety/VarietyWindow.py:2288 msgid "Could not process the given variety:// URL" msgstr "" #: ../variety/VarietyWindow.py:2289 msgid "Run with logging enabled to see details" msgstr "" #: ../variety/VarietyWindow.py:2488 msgid "Do not ask anymore, always use the current quote" msgstr "Nie pytaj więcej, zawsze używaj aktualnego cytatu" #: ../variety/VarietyWindow.py:2491 ../data/ui/FacebookPublishDialog.ui.h:5 msgid "Do not ask anymore, always use the text above" msgstr "Nigdy więcej nie pytaj, zawsze używaj powyższej frazy" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "Published" msgstr "Opublikowano" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "You may open your Facebook feed to see the post" msgstr "Możesz otworzyć swój kanał Facebooka, żeby zobaczyć post" #: ../variety/VarietyWindow.py:2526 ../variety/VarietyWindow.py:2555 msgid "Could not publish" msgstr "Nie udało się opublikować" #: ../variety/VarietyWindow.py:2718 msgid "Could not create autostart entry" msgstr "" #: ../variety/VarietyWindow.py:2719 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:2769 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:2769 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/FacebookFirstRunDialog.ui.h:1 msgid "Variety - Facebook Sharing" msgstr "Variety - Udostępnianie na Facebooku" #: ../data/ui/FacebookFirstRunDialog.ui.h:2 #: ../data/ui/PreferencesVarietyDialog.ui.h:169 msgid "Facebook Sharing" msgstr "Udostępnianie na Facebooku" #: ../data/ui/FacebookFirstRunDialog.ui.h:3 msgid "" "You are sharing on Facebook for the first time. Sharing from Variety is " "available for images that come from online sources and for quotes. It works " "this way: \n" "\n" "1. Login to Facebook\n" "Facebook will open in your default browser. You will be prompted to login if " "you are not already logged in. \n" "\n" "2. Authorize Variety to publish to your " "feed.\n" "You will be asked to allow Variety to publish to your feed on your behalf. " "Variety will only use this permission to publish those images and quotes " "that you tell it to, nothing else.\n" "\n" "3. Configure browser to open variety:// links " "with Variety or xdg-open\n" "Then you will be redirected to a page with instructions to associate " "\"variety://\" links with Variety in your browser. Please follow these " "instructions to complete the setup. You have to do this only once.\n" "\n" "No passwords or login information is kept locally, just an OAuth Facebook " "token that will be valid for a couple of weeks. After its validity expires " "you will be asked to login again." msgstr "" "Pierwszy raz udostępniasz na Facebooku. Udostępnanie przez Variety jest " "dostępne dla obrazów pochodzących ze źródeł z sieci i dla cytatów. Działa to " "następująco:\n" "\n" "1. Zaloguj się na Facebooku\n" "Facebook zostanie otwarty w domyślnej przeglądarce. Jeśli nie jesteś jeszcze " "zalogowany, zostaniesz o to poproszony.\n" "\n" "2. Pozwól Variety publikować na swojej " "tablicy.\n" "Zostaniesz poproszony o pozwolenie Variety na publikowanie w Twoim imieniu " "na swojej tablicy. Variety użyje tego uprawnienia jedynie do publikowania " "wskazanych przez Ciebie obrazów i cytatów i niczego innego.\n" "\n" "3. Skonfiguruj przeglądarkę tak, aby linki " "\"variety://\" były otwierane przez Variety lub xdg-open\n" "Następnie zostaniesz przekierowany na stronę z instrukcjami jak w Twojej " "przeglądarce powiązać linki \"variety://\" z Variety. Wykonaj te instrukcje, " "aby zakończyć procedurę. Wystarczy to zrobić raz.\n" "\n" "Informacje o loginach i hasłach nie są przechowywane lokalnie, jedynie token " "OAuth otrzymany z Facebooka, który jest ważny przez kilka tygodni. Po jego " "wygaśnięciu zostaniesz poproszony o ponowne zalogowanie." #: ../variety/AddWallpapersNetCategoryDialog.py:40 msgid "Could not find wallpapers there. Please check the URL." msgstr "Nie znaleziono żadnych tapet. Proszę sprawdzić adres URL." #: ../data/ui/WelcomeDialog.ui.h:1 msgid "Welcome to Variety!" msgstr "Witaj w Variety!" #: ../data/ui/WelcomeDialog.ui.h:2 ../data/ui/SmartFeaturesNoticeDialog.ui.h:3 msgid "Continue" msgstr "Kontynuuj" #: ../data/ui/WelcomeDialog.ui.h:3 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.h:4 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.h:5 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" #: ../data/ui/WelcomeDialog.ui.h:6 msgid "KDE Users - Important, please read:" msgstr "KDE - Ważne, przeczytaj:" #: ../data/ui/WelcomeDialog.ui.h:7 msgid "" "You appear to be running KDE. In KDE 4 it is impossible to set the wallpaper " "from inside a program - there is no API for this. To make Variety work, please read " "and follow the instructions here." msgstr "" #: ../data/ui/AddRedditDialog.ui.h:1 msgid "Variety - add Reddit feed" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:3 msgid "" "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" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:7 msgid "URL or name of a subreddit: " msgstr "" #: ../data/ui/AddRedditDialog.ui.h:8 msgid "Just a moment to check what's there" msgstr "" #: ../data/ui/AddMediaRssDialog.ui.h:1 msgid "Variety - add Media RSS feed" msgstr "Variety - dodaj kanał Media RSS" #: ../data/ui/AddMediaRssDialog.ui.h:3 msgid "" "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." msgstr "" "Proszę wklej adres URL lub Media RSS poniżej. Zauważ, że tylko Media RSS " "jest wspierane, nie ogólne RSS. Media RSS zawiera tag media:content łączący " "bezpośrednio do aktualnej zawartości. Niektóre przykłady stron " "umożliwiających Media RSS: Picasa, deviantART, SmugMug, Flickr, InterfaceLIFT." #: ../data/ui/AddMediaRssDialog.ui.h:4 msgid "Paste the URL of the Media RSS feed here: " msgstr "Wklej URL lub kanał RSS: " #: ../data/ui/AddMediaRssDialog.ui.h:5 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:9 msgid "Just a moment to check what's at that URL" msgstr "Chwilkę, sprawdzanie zawartości URL" #: ../variety/AddRedditDialog.py:43 msgid "This does not seem to be a valid Reddit URL" msgstr "" #: ../variety/AddRedditDialog.py:46 msgid "We could not find any image submissions there." msgstr "" #: ../variety/Smart.py:111 msgid "" "Your smart_user.json config file appears broken. You may have to login again " "to VRTY.ORG." msgstr "" #: ../variety/Smart.py:195 msgid "Your VRTY.ORG credentials are probably outdated. Please login again." msgstr "" #: ../variety/Smart.py:597 ../variety/Smart.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:111 msgid "Sync" msgstr "" #: ../variety/Smart.py:598 #, python-format msgid "Fetching %d images" msgstr "" #: ../variety/Smart.py:598 msgid "Fetching 1 image" msgstr "" #: ../variety/Smart.py:643 msgid "Finished" msgstr "" #: ../variety/Smart.py:664 #, python-format msgid "Logged in as %s" msgstr "" #: ../variety/Smart.py:676 #, python-format msgid "" "Do you want to login to VRTY.ORG as %s?" msgstr "" #: ../variety/Smart.py:677 msgid "VRTY.ORG login confirmation" msgstr "" #: ../data/plugins/quotes/QuotationsPageSource.py:35 msgid "Fetches quotes from TheQuotationsPage.com" msgstr "Pobiera cytaty z TheQuotationsPage.com" #: ../variety/__init__.py:143 msgid "Terminating signal received, quitting..." msgstr "Otrzymano sygnał zakończenia. Zamykanie..." #: ../variety/__init__.py:198 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." #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:1 msgid "VRTY.ORG integration" msgstr "" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:2 msgid "This feature requires VRTY.ORG integration" msgstr "" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:3 msgid "Enable VRTY.ORG integration" msgstr "" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:4 msgid "" "For this feature Variety needs permission to collect data about the images " "you like or dislike and the online sources you have enabled.\n" "\n" "Collected data is anonymous by default and covers only images which Variety " "downloaded, never images you already had in your local folders that might be " "private.\n" "\n" "This data helps us provide better images for everyone and fuels VRTY.ORG - a valuable resource for all users " "of Variety." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:1 msgid "Variety - VRTY.ORG" msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:2 msgid "No, thanks" msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:4 msgid "" "Introducing VRTY.ORG! Wanna take part?" msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:5 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to find and add new image sources to Variety, and to follow other users' " "favorites." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:6 msgid "" "Participation takes no effort - your profile will be built automatically, as " "you like or dislike images downloaded by Variety. Your profile will not be " "shared with third parties, unless you opt-in to make it public. Read more details about the " "service and the privacy policy here." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:7 msgid "" "Participation is required for some features of Variety such as synchronization of favorites between computers." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:8 #: ../data/ui/PreferencesVarietyDialog.ui.h:105 msgid "Participate in VRTY.ORG" msgstr "" #: ../data/plugins/quotes/QuotesDaddySource.py:31 msgid "" "Fetches quotes from QuotesDaddy's daily quotes RSS feed.\n" "Does not support searching by tags or authors." msgstr "" "Pobiera cytaty z QuotesDaddy RSS.\n" "Szukaie według autorów lub tagów nie jest wspierane." #: ../data/ui/AboutVarietyDialog.ui.h:1 msgid "Copyright (c) 2012, Peter Levi " msgstr "Copyright (c) 2012, Peter Levi " #: ../data/ui/AboutVarietyDialog.ui.h:2 msgid "About Variety" msgstr "O Variety" #: ../data/ui/AboutVarietyDialog.ui.h:3 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Automatyczny pobieracz i zmieniacz tapet." #: ../data/ui/AboutVarietyDialog.ui.h:4 msgid "http://peterlevi.com/variety" msgstr "http://peterlevi.com/variety" #: ../data/ui/AboutVarietyDialog.ui.h:5 msgid "" "# Copyright (c) 2012, Peter Levi \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, Peter Levi \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" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:1 msgid "Variety - add Wallpapers.net category" msgstr "Variety - dodaj kategorię Wallpapers.net" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:3 msgid "" "Please visit wallpapers.net and choose " "a category with wallpapers, then paste its URL below. A category is " "anything on the site that has one or more pages with wallpapers on them. " "Here are some examples:\n" "\n" "All wallpapers: http://www.wallpapers.net/\n" "Specific resolution: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" msgstr "" "Odwiedź wallpapers.net i wybierz " "kategorię tapet, po czym wklej adres URL poniżej. Kategoria zawiera " "przynajmniej jedną stronę z tapetami. Przykłady:\n" "\n" "Wszystkie tapety: http://www.wallpapers.net/\n" "Konkretna rozdzielczość: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:8 msgid "Paste URL here: " msgstr "Wklej tu URL: " #: ../data/ui/PreferencesVarietyDialog.ui.h:1 msgid "seconds" msgstr "sekund(-y)" #: ../data/ui/PreferencesVarietyDialog.ui.h:2 msgid "minutes" msgstr "min" #: ../data/ui/PreferencesVarietyDialog.ui.h:3 msgid "hours" msgstr "godz." #: ../data/ui/PreferencesVarietyDialog.ui.h:4 msgid "days" msgstr "dni" #: ../data/ui/PreferencesVarietyDialog.ui.h:5 msgid "Variety Preferences" msgstr "Preferencje" #: ../data/ui/PreferencesVarietyDialog.ui.h:6 msgid "General" msgstr "Ogólne" #: ../data/ui/PreferencesVarietyDialog.ui.h:7 msgid "Start Variety when the computer starts" msgstr "Uruchom Variety wraz z systemem" #: ../data/ui/PreferencesVarietyDialog.ui.h:8 msgid "Change wallpaper every " msgstr "Zmieniaj tapetę co: " #: ../data/ui/PreferencesVarietyDialog.ui.h:9 msgid "Minimum interval is 5 seconds" msgstr "Najmniejszy odcinek czasu to 5 sekund" #: ../data/ui/PreferencesVarietyDialog.ui.h:10 msgid "Change wallpaper on start" msgstr "Zmień tapetę na starcie" #: ../data/ui/PreferencesVarietyDialog.ui.h:12 msgid "Enabled" msgstr "Aktywne" #: ../data/ui/PreferencesVarietyDialog.ui.h:13 msgid "Type" msgstr "Typ" #: ../data/ui/PreferencesVarietyDialog.ui.h:14 msgid "Location" msgstr "Położenie" #: ../data/ui/PreferencesVarietyDialog.ui.h:15 msgid "_Add..." msgstr "_Dodaj..." #: ../data/ui/PreferencesVarietyDialog.ui.h:16 msgid "Add images, folders or online image sources" msgstr "Dodaj obrazy, foldery lub źródła obrazów online" #: ../data/ui/PreferencesVarietyDialog.ui.h:17 msgid "_Edit..." msgstr "_Edytuj..." #: ../data/ui/PreferencesVarietyDialog.ui.h:18 msgid "Edit the selected source" msgstr "Edytuj wybrane źródło" #: ../data/ui/PreferencesVarietyDialog.ui.h:19 msgid "_Remove..." msgstr "_Usuń..." #: ../data/ui/PreferencesVarietyDialog.ui.h:20 msgid "Remove selected image sources" msgstr "Usuń zaznaczone źródła" #: ../data/ui/PreferencesVarietyDialog.ui.h:21 msgid "_Use" msgstr "_Użyj" #: ../data/ui/PreferencesVarietyDialog.ui.h:22 msgid "Enable the selected sources and disable all others" msgstr "Aktywuj zaznaczone żródła i deaktywuj resztę" #: ../data/ui/PreferencesVarietyDialog.ui.h:23 msgid "Download a wallpaper every " msgstr "Pobierz tapetę co: " #: ../data/ui/PreferencesVarietyDialog.ui.h:24 msgid "Minimum interval is one minute" msgstr "Najmniejszy odstęp czasu to minuta" #: ../data/ui/PreferencesVarietyDialog.ui.h:25 msgid "to " msgstr "do " #: ../data/ui/PreferencesVarietyDialog.ui.h:26 msgid "Actual download folder " msgstr "Bieżący folder pobierania " #: ../data/ui/PreferencesVarietyDialog.ui.h:27 msgid "" "Caution: do NOT use this option if you use a custom download folder with " "valuable files in it. Variety will maintain the limit regardless of what is " "in the download folder." msgstr "" "Uwaga: NIE używaj tej opcji jeżeli twój folder pobierania zawiera inne ważne " "pliki. Variety zastosuje limit i obojętnie co do zawartości usunie starsze " "pliki." #: ../data/ui/PreferencesVarietyDialog.ui.h:28 msgid "Limit download folder to " msgstr "Ogranicz rozmiar folderu pobierania do " #: ../data/ui/PreferencesVarietyDialog.ui.h:29 msgid "Minimum size is 50 MB" msgstr "Najmnieszy rozmiar to 50 MB" #: ../data/ui/PreferencesVarietyDialog.ui.h:30 msgid "MB by deleting oldest files when necessary" msgstr "MB przez usuwanie starszych plików jeśli niezbędne" #: ../data/ui/PreferencesVarietyDialog.ui.h:31 msgid "Favorites" msgstr "Ulubione" #: ../data/ui/PreferencesVarietyDialog.ui.h:32 msgid "Copy favorite wallpapers to " msgstr "Kopiuj ulubione tapety do " #: ../data/ui/PreferencesVarietyDialog.ui.h:33 msgid "Filters" msgstr "Filtry" #: ../data/ui/PreferencesVarietyDialog.ui.h:34 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.h:35 msgid "Quotes" msgstr "Cytaty" #: ../data/ui/PreferencesVarietyDialog.ui.h:36 msgid "Show random wise quotes on the desktop" msgstr "Pokaż losowy cytat na pulpicie" #: ../data/ui/PreferencesVarietyDialog.ui.h:37 msgid "Text color: " msgstr "Kolor tekstu: " #: ../data/ui/PreferencesVarietyDialog.ui.h:38 msgid "Text font: " msgstr "Czcionka: " #: ../data/ui/PreferencesVarietyDialog.ui.h:39 msgid "Backdrop color: " msgstr "Kolor tła: " #: ../data/ui/PreferencesVarietyDialog.ui.h:40 msgid "Backdrop opacity: " msgstr "Przezroczystość tła: " #: ../data/ui/PreferencesVarietyDialog.ui.h:41 msgid " Transparent" msgstr " Przezroczyste" #: ../data/ui/PreferencesVarietyDialog.ui.h:42 msgid "Opaque" msgstr "Nieprzezroczyste" #: ../data/ui/PreferencesVarietyDialog.ui.h:43 msgid "Draw a text shadow" msgstr "Rysuj cień tekstu" #: ../data/ui/PreferencesVarietyDialog.ui.h:44 msgid "Appearance" msgstr "Wygląd" #: ../data/ui/PreferencesVarietyDialog.ui.h:45 msgid "Quotes area width: " msgstr "Szerokość obszaru cytatów: " #: ../data/ui/PreferencesVarietyDialog.ui.h:46 msgid "Narrow " msgstr "Wąski " #: ../data/ui/PreferencesVarietyDialog.ui.h:47 msgid "Wide" msgstr "Szeroki" #: ../data/ui/PreferencesVarietyDialog.ui.h:48 msgid "Horizontal position: " msgstr "Pozycja poziomo: " #: ../data/ui/PreferencesVarietyDialog.ui.h:49 msgid "Left " msgstr "Lewa strona " #: ../data/ui/PreferencesVarietyDialog.ui.h:50 ../variety/ThumbsManager.py:44 msgid "Right" msgstr "Prawo" #: ../data/ui/PreferencesVarietyDialog.ui.h:51 msgid "Vertical position: " msgstr "Pozycja pionowo: " #: ../data/ui/PreferencesVarietyDialog.ui.h:52 msgid "Top " msgstr "Góra " #: ../data/ui/PreferencesVarietyDialog.ui.h:53 ../variety/ThumbsManager.py:41 msgid "Bottom" msgstr "Dół" #: ../data/ui/PreferencesVarietyDialog.ui.h:54 msgid "Placement" msgstr "Położenie" #: ../data/ui/PreferencesVarietyDialog.ui.h:55 msgid "Show quotes from these sources: " msgstr "Pokaż cytaty z: " #: ../data/ui/PreferencesVarietyDialog.ui.h:56 msgid "" "More " "plugins" msgstr "" "Więcej " "wtyczek" #: ../data/ui/PreferencesVarietyDialog.ui.h:57 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.h:59 msgid "Example: funny, inspirational" msgstr "Przykład: zabawny, interesujący" #: ../data/ui/PreferencesVarietyDialog.ui.h:60 msgid "Example: Albert Einstein, Voltaire" msgstr "Przykład: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui.h:61 msgid "Authors: " msgstr "Autorzy: " #: ../data/ui/PreferencesVarietyDialog.ui.h:62 msgid "Sources and filtering" msgstr "Źródła i filtrowanie" #: ../data/ui/PreferencesVarietyDialog.ui.h:63 msgid "Change quote every " msgstr "Zmień cytat co " #: ../data/ui/PreferencesVarietyDialog.ui.h:64 msgid "Minimum interval is 10 seconds" msgstr "Najmniejszy odstęp czasu to 10 sekund" #: ../data/ui/PreferencesVarietyDialog.ui.h:65 msgid "Regular change" msgstr "Regularna zmiana" #: ../data/ui/PreferencesVarietyDialog.ui.h:66 msgid "Clock" msgstr "Zegar" #: ../data/ui/PreferencesVarietyDialog.ui.h:67 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.h:68 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.h:69 msgid "Clock font: " msgstr "Czcionka zegara: " #: ../data/ui/PreferencesVarietyDialog.ui.h:70 msgid "Date font: " msgstr "Czcionka daty: " #: ../data/ui/PreferencesVarietyDialog.ui.h:71 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.h:72 msgid "Effects" msgstr "Efekty" #: ../data/ui/PreferencesVarietyDialog.ui.h:73 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:74 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:75 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:76 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:77 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:78 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:79 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:80 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:81 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:82 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:83 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:84 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:85 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:86 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:87 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:88 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:89 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:90 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:91 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:92 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:93 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:94 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:95 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:96 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:97 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:98 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:99 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:100 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:101 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:102 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:103 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:104 msgid "VRTY.ORG" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:106 msgid "VRTY.ORG is in beta and will take some time to mature" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:107 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to add new image sources to Variety, and to follow other users' favorites. " "It is fueled by the favorite images of all participating users." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:108 msgid "" "Could not create user - no connection to VRTY.ORG. We will try again later." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:110 msgid "" "Registration enables cool features like synchronization of favorite images " "and sources between computers and personalized recommendations." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:112 msgid "Synchronize favorite images between computers" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:113 msgid "Requires VRTY.ORG enabled and logged in." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:114 msgid "" "Your favorite images from other computers will be automatically downloaded " "to this computer. You need to be logged in with the same VRTY.ORG user " "everywhere. Sync will not delete any images." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:115 msgid "Privacy policy" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:116 msgid "" "Variety sends data only for images it downloaded, never for images you " "already had in your local folders that might be private, and Sync does not " "work for such images. Collected data is not shared with third parties, " "unless you opt-in to make your profile public. Read more details about the " "service and the privacy policy here." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:117 msgid "Usage statistics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:118 msgid "Help make Variety better by sending anonymous usage statistics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:119 msgid "" "These stats help us improve Variety by understanding how users interact with " "it. They also include general info about your OS version and monitor setup. " "Collected data is not shared with anyone." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:120 msgid "Sync and social" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:121 msgid "Fetch folder" msgstr "Folder Złapanych" #: ../data/ui/PreferencesVarietyDialog.ui.h:122 msgid "Save manually downloaded wallpapers to " msgstr "Zapisz ręcznie pobrane tapety do " #: ../data/ui/PreferencesVarietyDialog.ui.h:123 msgid "Drag and drop" msgstr "Przeciągnij i upuść" #: ../data/ui/PreferencesVarietyDialog.ui.h:124 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.h:126 msgid "Clipboard monitoring" msgstr "Monitorowanie schowka" #: ../data/ui/PreferencesVarietyDialog.ui.h:127 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Monitoruj schowek w poszukiwaniu adresów obrazów" #: ../data/ui/PreferencesVarietyDialog.ui.h:128 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.h:129 msgid "Manual downloading" msgstr "Ręcznie pobieranie" #: ../data/ui/PreferencesVarietyDialog.ui.h:130 msgid "When possible use images that:" msgstr "Gdy możliwe używaj obrazów, które są:" #: ../data/ui/PreferencesVarietyDialog.ui.h:131 ../variety/ThumbsManager.py:98 msgid "Size" msgstr "Rozmiar" #: ../data/ui/PreferencesVarietyDialog.ui.h:132 msgid "Have landscape orientation" msgstr "Ułożone poziomo" #: ../data/ui/PreferencesVarietyDialog.ui.h:133 msgid "Are big at least " msgstr "Wielkości co najmniej " #: ../data/ui/PreferencesVarietyDialog.ui.h:134 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui.h:135 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui.h:136 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui.h:138 #, no-c-format msgid "% of the screen resolution" msgstr "% rozdzielczości ekranu" #: ../data/ui/PreferencesVarietyDialog.ui.h:139 msgid "Color" msgstr "Kolor" #: ../data/ui/PreferencesVarietyDialog.ui.h:140 msgid "Are dark or light:" msgstr "Ciemne czy jasne:" #: ../data/ui/PreferencesVarietyDialog.ui.h:141 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Ciemne" #: ../data/ui/PreferencesVarietyDialog.ui.h:142 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Jasne" #: ../data/ui/PreferencesVarietyDialog.ui.h:143 msgid "Contain this color: " msgstr "Zawierające ten kolor: " #: ../data/ui/PreferencesVarietyDialog.ui.h:144 msgid "(Takes effect after some initial searching)" msgstr "(Efekt widoczny po chwili początkowego szukania)" #: ../data/ui/PreferencesVarietyDialog.ui.h:145 msgid "Rating" msgstr "Ocena" #: ../data/ui/PreferencesVarietyDialog.ui.h:146 msgid "Have EXIF rating at least " msgstr "Posiadają ocenę EXIF co najmniej " #: ../data/ui/PreferencesVarietyDialog.ui.h:147 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui.h:148 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui.h:149 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui.h:150 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui.h:151 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui.h:152 msgid "Color and size" msgstr "Kolor i wielkość" #: ../data/ui/PreferencesVarietyDialog.ui.h:153 msgid "Indicator Icon" msgstr "Ikona wskaźnika" #: ../data/ui/PreferencesVarietyDialog.ui.h:154 msgid "Indicator icon:" msgstr "Ikona wskaźnika:" #: ../data/ui/PreferencesVarietyDialog.ui.h:155 msgctxt "Icon option" msgid "Light" msgstr "Jasna" #: ../data/ui/PreferencesVarietyDialog.ui.h:156 msgctxt "Icon option" msgid "Dark" msgstr "Ciemna" #: ../data/ui/PreferencesVarietyDialog.ui.h:157 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Użyj bieżącej tapety" #: ../data/ui/PreferencesVarietyDialog.ui.h:158 msgctxt "Icon option" msgid "Custom image..." msgstr "Własny obraz..." #: ../data/ui/PreferencesVarietyDialog.ui.h:159 msgctxt "Icon option" msgid "None" msgstr "Brak" #: ../data/ui/PreferencesVarietyDialog.ui.h:160 msgid "Select an icon" msgstr "Wybierz ikonę" #: ../data/ui/PreferencesVarietyDialog.ui.h:161 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.h:162 msgid "Favorites Operations" msgstr "Operacje na Ulubionych" #: ../data/ui/PreferencesVarietyDialog.ui.h:163 msgid "Favorites operations to show in main menu:" msgstr "Operacje na Ulubionych pokazywane w menu:" #: ../data/ui/PreferencesVarietyDialog.ui.h:164 msgid "Copy to Favorites" msgstr "Kopiuj do Ulubionych" #: ../data/ui/PreferencesVarietyDialog.ui.h:166 msgid "Both Copy and Move" msgstr "Kopiuj i Przenieś" #: ../data/ui/PreferencesVarietyDialog.ui.h:167 msgid "Depends on folder..." msgstr "W zależności od folderu..." #: ../data/ui/PreferencesVarietyDialog.ui.h:170 msgid "Display dialog to customize the Facebook post before publishing" msgstr "Pokaż okno, aby edytować post przed opublikowaniem na Facebooku" #: ../data/ui/PreferencesVarietyDialog.ui.h:171 msgid "Login Screen Support" msgstr "Wsparcie dla Ekranu Logowania" #: ../data/ui/PreferencesVarietyDialog.ui.h:172 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.h:173 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.h:174 msgid "Copy wallpaper image files to this folder: " msgstr "Kopiuj tapety do folderu: " #: ../data/ui/PreferencesVarietyDialog.ui.h:175 msgid "Reset to default" msgstr "Przywróć domyślne" #: ../data/ui/PreferencesVarietyDialog.ui.h:176 msgid "Still doesn't work?" msgstr "Ciągle nie działa?" #: ../data/ui/PreferencesVarietyDialog.ui.h:177 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.h:178 msgid "You don't have write permissions for this folder." msgstr "Brak uprawnień do zapisu do tego folderu." #: ../data/ui/PreferencesVarietyDialog.ui.h:179 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.h:180 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.h:181 msgid "Customize" msgstr "Dostosuj" #: ../data/ui/PreferencesVarietyDialog.ui.h:182 msgid "Tips and tricks" msgstr "Sztuczki i kruczki" #: ../data/ui/PreferencesVarietyDialog.ui.h:183 msgid "Recent changes" msgstr "Ostatnie zmiany" #: ../data/ui/PreferencesVarietyDialog.ui.h:184 msgid "Visit website" msgstr "Odwiedź stronę" #: ../data/ui/PreferencesVarietyDialog.ui.h:185 msgid "Report a bug or request a feature" msgstr "Zgłoś błąd lub zaproponuj funkcję" #: ../data/ui/PreferencesVarietyDialog.ui.h:186 msgid "Send feedback" msgstr "Wyślij zgłoszenie" #: ../data/ui/PreferencesVarietyDialog.ui.h:187 msgid "Donate to Variety" msgstr "Wspomóż Variety" #: ../data/ui/PreferencesVarietyDialog.ui.h:188 msgid "Donate via PayPal" msgstr "Wspomóż przez PayPal" #: ../data/ui/PreferencesVarietyDialog.ui.h:189 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.h:193 msgid "" "For Bitcoin and other payment methods please go to Variety's website." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:194 msgid "Donate" msgstr "Przekaż darowiznę" #: ../variety/FacebookHelper.py:116 msgid "Authorization successful" msgstr "Autoryzacja zakończona sukcesem" #: ../variety/FacebookHelper.py:116 msgid "Publishing..." msgstr "Publikowanie..." #: ../variety/FacebookHelper.py:121 msgid "Authorization failed" msgstr "Autoryzacja się nie powiodła" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Góra" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Lewo" #: ../variety/ThumbsManager.py:94 msgid "Position" msgstr "Pozycja" #: ../variety/ThumbsManager.py:109 msgid "Show Containing Folder" msgstr "Pokaż folder zawierający" #: ../variety/ThumbsManager.py:136 ../variety/indicator.py:156 msgid "Set EXIF Rating" msgstr "Ustaw Ocenę EXIF" #: ../variety/ThumbsManager.py:160 ../variety/indicator.py:87 msgid "Delete to _Trash" msgstr "Usuń do _Kosza" #: ../variety/ThumbsManager.py:167 ../variety/indicator.py:131 msgid "Where is it from?" msgstr "Skąd to jest?" #: ../variety/ThumbsManager.py:178 msgid "Close" msgstr "Zamknij" #: ../variety/ThumbsManager.py:198 msgid "Could not set EXIF rating" msgstr "Nie udało się ustawić oceny EXIF" #: ../variety/ThumbsManager.py:217 msgid "Unrated" msgstr "Bez oceny" #: ../variety/ThumbsManager.py:224 msgid "Rejected" msgstr "Odrzucone" #: ../variety/ThumbsManager.py:324 msgid "Variety History" msgstr "Historia" #: ../variety/ThumbsManager.py:326 msgid "Variety Recent Downloads" msgstr "Niedawno Pobrane" #: ../variety/ThumbsManager.py:328 msgid "Variety Images" msgstr "Obrazy" #: ../data/ui/AddWallbaseDialog.ui.h:1 msgid "Variety - add Wallbase.cc image source" msgstr "Variety - dodaj Wallbase.cc jako źródło obrazów" #: ../data/ui/AddWallbaseDialog.ui.h:2 msgid "Wallbase.cc" msgstr "Wallbase.cc" #: ../data/ui/AddWallbaseDialog.ui.h:3 msgid "" "Wallbase.cc is permanently down. Use Wallhaven.cc instead. Support for " "Wallbase.cc will be dropped completely in a future release, please remove or " "update your existing Wallbase sources." msgstr "" #: ../data/ui/AddWallbaseDialog.ui.h:4 msgid "" "Wallbase.cc provides a variety of image " "search options. Below you can specify keywords to search for, or visit Wallbase.cc, setup your search criteria " "there, ensure you like the results, and paste the full Wallbase URL in the " "box.\n" "\n" "If you specify keywords, the most liked safe-for-work images that match any " "of the keywords will be used. \n" "\n" "If you specify a Wallbase 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." msgstr "" "Wallbase.cc dostarcza wielu opcji " "szukania obrazów. Poniżej możesz wpisać słowa kluczowe do wyszukania, lub " "odwiedzić Wallbase.cc, wstawić tam swoje " "kryteria wyszukiwania, upewnić się czy wyniki są dobre i wkleić URL strony " "do formularza.\n" "\n" "Jeśli określisz słowa kluczowe, zostaną użyte najbardziej lubiane i " "niewulgarne obrazy które spełniają którekolwiek kryterium. \n" "\n" "Jeśli określisz adres na Wallbase, proszę ostrożnie wybieraj kryteria " "sortowania - Variety regularnie żąda obrazów, ale używa tylko obrazów z " "kilkuset pierwszych rezultatów. Losowe lub Data będzie oznaczać, że to " "źródło będzie miało dłuższy \"czas życia\" do wyczerpania. Ulubione " "dostarczą lepszych obrazów i wyniki Relevance będą lepiej dopasowane, gdy " "szukasz fraz lub kolorów." #: ../data/ui/FacebookPublishDialog.ui.h:1 msgid "Variety - Publish to Facebook" msgstr "Variety - opublikuj na Facebooku" #: ../data/ui/FacebookPublishDialog.ui.h:2 ../variety/indicator.py:149 #: ../variety/indicator.py:223 msgid "Share on Facebook" msgstr "Podziel się na Facebooku" #: ../data/ui/FacebookPublishDialog.ui.h:3 msgid "" "Publish a link to the current wallpaper on Facebook. Include this text along " "with the link (or just leave empty):" msgstr "" "Opublikuj link do bieżącej tapety na Facebooku. Dodaj też następujący tekst " "(lub nie):" #: ../data/ui/FacebookPublishDialog.ui.h:4 msgid "Use current quote" msgstr "Użyj aktualnego cytatu" #: ../data/ui/SmartRegisterDialog.ui.h:1 msgid "Variety - VRTY.ORG registration" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:2 msgid "Would you like to register?" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:3 msgid "" "You may participate in VRTY.ORG " "anonymously, but registration enables some very nice features, such as synchronization of favorites between computers and " "personalized recommendations. It also ensures " "you will not lose your profile and favorite wallpapers if you reinstall your " "OS." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:4 msgid "Registration is very easy and does not require any personal data." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:5 msgid "" "If you choose to participate anonymously, you can register later from the " "\"Sync and social\" page in Preferences." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:6 msgid "" "Oops, we could not connect to VRTY.ORG. Server might be down. Please wait a " "couple of minutes and try again or choose \"Participate anonymously\" and register later " "from the \"Sync and social\" page in " "Preferences." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:7 msgid "" "Please continue the registration and follow the instructions in the browser " "tab we opened." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:8 msgid "I will participate anonymously" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:9 msgid "I'm registered, let me login" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:10 msgid "Register here" msgstr "" #: ../variety.desktop.in.h:1 msgid "Variety" msgstr "Variety" #: ../variety.desktop.in.h:2 msgid "Variety Wallpaper Changer" msgstr "Zmieniacz tapet Variety" #: ../variety.desktop.in.h:3 msgid "Next" msgstr "Następna" #: ../variety.desktop.in.h:4 msgid "Previous" msgstr "Poprzednia" #: ../variety.desktop.in.h:5 msgid "Pause / Resume" msgstr "Wstrzymaj / Kontynuuj" #: ../variety.desktop.in.h:6 msgid "History" msgstr "Historia" #: ../variety.desktop.in.h:7 msgid "Preferences" msgstr "Preferencje" #: ../data/plugins/quotes/LocalFilesSource.py:34 msgid "" "Displays quotes, defined in local text files.\n" "Put your own txt files in: ~/.config/variety/pluginconfig/quotes/.\n" "The file format is:\n" "\n" "quote -- author\n" ".\n" "second quote -- another author\n" ".\n" "etc...\n" "\n" "Example: http://rvelthuis.de/zips/quotes.txt" msgstr "" "Pokazuje cytaty, zdefiniowane w lokalnych plikach tekstowych.\n" "Umieść własne pliki .txt w: ~/.config/variety/pluginconfig/quotes/.\n" "Schemat pliku:\n" "\n" "cytat -- autor\n" ".\n" "drugi cytat -- inny autor\n" ".\n" "itd...\n" "\n" "Przykład: http://rvelthuis.de/zips/quotes.txt" #: ../variety/indicator.py:49 ../variety/indicator.py:96 #: ../variety/indicator.py:166 msgid "_Next" msgstr "_Następny" #: ../variety/indicator.py:54 ../variety/indicator.py:101 #: ../variety/indicator.py:171 msgid "_Previous" msgstr "_Poprzedni" #: ../variety/indicator.py:61 msgid "Current desktop wallpaper" msgstr "Bieżąca tapeta" #: ../variety/indicator.py:65 msgid "Show origin" msgstr "Pokaż źródło" #: ../variety/indicator.py:106 ../variety/indicator.py:176 msgid "_Next, skipping forward history" msgstr "" #: ../variety/indicator.py:114 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:124 msgid "_Image" msgstr "_Obraz" #: ../variety/indicator.py:135 msgid "Show without effects" msgstr "Pokaż bez efektów" #: ../variety/indicator.py:143 msgid "Google Image Search" msgstr "" #: ../variety/indicator.py:196 msgid "View Favorites..." msgstr "Pokaż Ulubione..." #: ../variety/indicator.py:203 msgid "Copy to Clipboard" msgstr "Skopiuj do schowka" #: ../variety/indicator.py:213 msgid "Google Quote" msgstr "Google Quote" #: ../variety/indicator.py:218 msgid "Google Author" msgstr "Google Author" #: ../variety/indicator.py:230 ../variety/indicator.py:284 msgid "Preferences..." msgstr "Preferencje…" #: ../variety/indicator.py:238 msgid "Turn off" msgstr "Wyłącz" #: ../variety/indicator.py:244 msgid "_Quote" msgstr "_Cytat" #: ../variety/indicator.py:251 msgid "_History" msgstr "_Historia" #: ../variety/indicator.py:257 msgid "_Wallpaper Selector" msgstr "_Wybieracz tapety" #: ../variety/indicator.py:263 msgid "Recent _Downloads" msgstr "Ostatnio _Pobrane" #: ../variety/indicator.py:278 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:288 msgid "About" msgstr "O programie" #: ../variety/indicator.py:292 msgid "Quit" msgstr "Wyjdź" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:1 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Kopiuj do Ulubionych lub Przenieś do Ulubionych" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:2 msgid "Reset to Default" msgstr "Przywróć domyślne" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:3 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.h:4 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" #: ../variety/ImageFetcher.py:56 ../variety/ImageFetcher.py:103 msgid "Fetching" msgstr "Pobieranie" #. too small - delete and do not use #: ../variety/ImageFetcher.py:118 msgid "Image too small, ignoring it" msgstr "Obraz jest za mały, ignoruj" #: ../variety/ImageFetcher.py:140 #, python-format msgid "Sorry, got %s error..." msgstr "" #: ../variety/ImageFetcher.py:141 msgid "This means the link is no longer valid" msgstr "" #: ../variety/ImageFetcher.py:144 msgid "Fetch failed for some reason" msgstr "Pobieranie się nie powiodło z jakiegoś powodu" #: ../variety/ImageFetcher.py:145 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/po/es.po0000644000000000000000000024161412655724352011037 0ustar # Spanish translation for variety # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the variety package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: variety\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-01-29 10:57+0200\n" "PO-Revision-Date: 2015-01-28 04:57+0000\n" "Last-Translator: Adolfo Jayme \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-02-07 20:28+0000\n" "X-Generator: Launchpad (build 17908)\n" #: ../data/plugins/quotes/GoodreadsSource.py:49 msgid "Fetches quotes from Goodreads.com" msgstr "Obtiene citas de Goodreads.com" #: ../data/ui/LoginOrRegisterDialog.ui.h:1 msgid "Login to VRTY.ORG" msgstr "Acceder a VRTY.ORG" #: ../data/ui/LoginOrRegisterDialog.ui.h:2 msgid "Username: " msgstr "Nombre de usuario: " #: ../data/ui/LoginOrRegisterDialog.ui.h:3 msgid "Password: " msgstr "Contraseña: " #: ../data/ui/LoginOrRegisterDialog.ui.h:4 msgid "No account? Register here" msgstr "¿No tiene una cuenta? Cree una" #: ../data/ui/LoginOrRegisterDialog.ui.h:5 msgid "Forgot your password?" msgstr "¿Olvidó su contraseña?" #: ../data/ui/LoginOrRegisterDialog.ui.h:6 msgid "" "Tip: You can also login to VRTY.ORG in a " "browser and click the link \"Trigger Variety " "login\" in your profile." msgstr "" "Consejo: también puede acceder a VRTY.ORG " "en el navegador y pulsar en el enlace «Trigger Variety " "login» en su perfil." #: ../data/ui/LoginOrRegisterDialog.ui.h:7 msgid "Login" msgstr "Acceder" #: ../variety/LoginOrRegisterDialog.py:80 #, python-format msgid "Oops, server returned error (%s)" msgstr "Ocurrió un error en el servidor (%s)" #: ../variety/LoginOrRegisterDialog.py:85 msgid "Could not connect to server" msgstr "No se pudo conectar con el servidor" #: ../variety/AddWallhavenDialog.py:38 ../variety/AddWallbaseDialog.py:38 #: ../variety/AddFlickrDialog.py:138 msgid "No images found" msgstr "No se encontraron imágenes" #: ../data/ui/AddPanoramioDialog.ui.h:1 msgid "Variety - add Panoramio image source" msgstr "Variety – Añadir Panoramio como origen de imágenes" #. (_("Wallbase.cc"), self.on_add_wallbase_clicked), #: ../data/ui/AddPanoramioDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:388 msgid "Panoramio" msgstr "Panoramio" #: ../data/ui/AddPanoramioDialog.ui.h:3 msgid "Please zoom over your area of interest." msgstr "" #: ../variety/FolderChooser.py:65 msgid "Choose a folder" msgstr "Seleccione una carpeta" #: ../variety/FolderChooser.py:66 ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Cancel" msgstr "Cancelar" #: ../variety/FolderChooser.py:66 msgid "OK" msgstr "Aceptar" #: ../data/ui/AddWallhavenDialog.ui.h:1 msgid "Variety - add Wallhaven.cc image source" msgstr "Variety – Añadir Wallhaven.cc como origen de imágenes" #: ../data/ui/AddWallhavenDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:386 msgid "Wallhaven.cc" msgstr "Wallhaven.cc" #: ../data/ui/AddWallhavenDialog.ui.h:3 msgid "" "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." msgstr "" #: ../data/ui/AddWallhavenDialog.ui.h:8 ../data/ui/AddWallbaseDialog.ui.h:9 msgid "Enter keywords or paste URL here: " msgstr "Escriba palabras clave o pegue el URL: " #: ../data/ui/AddWallhavenDialog.ui.h:9 ../data/ui/AddFlickrDialog.ui.h:16 #: ../data/ui/AddWallbaseDialog.ui.h:10 msgid "Just a moment to check this search" msgstr "Un momento para revisar esta búsqueda" #: ../data/ui/AddWallhavenDialog.ui.h:10 ../data/ui/AddFlickrDialog.ui.h:17 #: ../data/ui/AddRedditDialog.ui.h:9 ../data/ui/AddMediaRssDialog.ui.h:6 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:10 #: ../data/ui/AddWallbaseDialog.ui.h:11 msgid " " msgstr " " #: ../variety/QuotesEngine.py:232 msgid "No quote plugins" msgstr "Sin complemento de citas" #: ../variety/QuotesEngine.py:232 msgid "There are no quote plugins installed" msgstr "No está instalado un complemento de citas" #: ../variety/QuotesEngine.py:238 msgid "No suitable quote plugins" msgstr "No hay complemento de citas disponible" #: ../variety/QuotesEngine.py:239 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:251 msgid "Could not fetch quotes" msgstr "No se pudieron recuperar citas" #: ../variety/QuotesEngine.py:252 msgid "Quotes services may be down, we will continue trying" msgstr "" "El servicio de citas puede estar detenido. Continuaremos intentándolo." #: ../variety/QuotesEngine.py:255 msgid "Could not find quotes" msgstr "No se pudieron encontrar citas" #: ../variety/QuotesEngine.py:256 msgid "Maybe you are searching for something very obscure?" msgstr "¿Quizá está buscando algo muy oculto?" #: ../variety/Texts.py:20 msgid "Keep original" msgstr "Mantener el original" #: ../variety/Texts.py:21 msgid "Grayscale" msgstr "Escala de grises" #: ../variety/Texts.py:22 msgid "Heavy blur" msgstr "Desenfoque duro" #: ../variety/Texts.py:23 msgid "Soft blur" msgstr "Desenfoque suave" #: ../variety/Texts.py:24 msgid "Oil painting" msgstr "Pintura al óleo" #: ../variety/Texts.py:25 msgid "Pencil sketch" msgstr "Dibujo a lápiz" #: ../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 "" #: ../variety/Texts.py:37 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:38 msgid "Random wallpapers from Desktoppr.co" msgstr "Fondos aleatorios de Desktoppr.co" #: ../variety/Texts.py:39 msgid "NASA's Astronomy Picture of the Day" msgstr "Imagen astronómica del día de la NASA" #: ../variety/Texts.py:41 msgid "World Sunlight Map - live wallpaper from Die.net" msgstr "" #: ../variety/Texts.py:42 msgid "Bing Photo of the Day" msgstr "" #: ../variety/Texts.py:43 msgid "High-resolution photos from Unsplash.com" msgstr "" #: ../variety/Texts.py:47 msgid "" "If you use KDE, you need to perform some actions before Variety will work. " "Please read here: http://peterlevi.com/variety/2014/05/variety-and-kde/" msgstr "" "Si utiliza KDE necesitará realizar algunas acciones antes para que Variety " "funcione. Consulte: http://peterlevi.com/variety/2014/05/variety-and-kde/" #: ../variety/Texts.py:48 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:49 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 " "~/.config/variety/scripts. There are examples there for various desktop " "environments." msgstr "" "Para ejecutar órdenes al cambiar de fondo o si utiliza un entorno de " "escritorio diferente, edite las secuencias de órdenes ubicadas en " "~/.config/variety/scripts, donde encontrará ejemplos para varios entornos." #: ../variety/Texts.py:50 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:51 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:52 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:53 msgid "" "Adding your own custom filters is quite easy: open " "~/.config/variety/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:54 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:55 msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of ~/.config/variety/scripts/set_wallpaper." msgstr "" #: ../variety/Texts.py:56 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:57 msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "~/.config/variety/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/PreferencesVarietyDialog.py:259 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:382 #: ../variety/PreferencesVarietyDialog.py:551 #: ../data/ui/PreferencesVarietyDialog.ui.h:11 msgid "Images" msgstr "Imágenes" #: ../variety/PreferencesVarietyDialog.py:383 msgid "Folders" msgstr "Carpetas" #: ../variety/PreferencesVarietyDialog.py:385 #: ../data/ui/AddFlickrDialog.ui.h:2 msgid "Flickr" msgstr "Flickr" #: ../variety/PreferencesVarietyDialog.py:389 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:2 msgid "Wallpapers.net" msgstr "Wallpapers.net" #: ../variety/PreferencesVarietyDialog.py:390 #: ../data/ui/AddRedditDialog.ui.h:2 msgid "Reddit" msgstr "Reddit" #: ../variety/PreferencesVarietyDialog.py:391 #: ../data/ui/AddMediaRssDialog.ui.h:2 msgid "Media RSS" msgstr "RSS del medio" #: ../variety/PreferencesVarietyDialog.py:416 msgid "Remove the source, keep the files" msgstr "Quitar el origen, mantener los archivos" #: ../variety/PreferencesVarietyDialog.py:417 msgid "Remove the sources, keep the files" msgstr "Quitar los orígenes, mantener los archivos" #: ../variety/PreferencesVarietyDialog.py:424 msgid "Remove the source and delete the downloaded files" msgstr "Quitar el origen y eliminar los archivos descargados" #: ../variety/PreferencesVarietyDialog.py:425 msgid "Remove the sources and delete the downloaded files" msgstr "Quitar los orígenes y eliminar los archivos descargados" #: ../variety/PreferencesVarietyDialog.py:458 msgid "World Sunlight Map enabled" msgstr "Mapamundi de luz solar activado" #: ../variety/PreferencesVarietyDialog.py:459 msgid "" "Using the World Sunlight Map requires both downloading and changing enabled " "at intervals of 30 minutes or less. Settings were adjusted automatically." msgstr "" "Para usar el mapamundi de luz solar se necesita activar la descarga y el " "cambio a intervalos de 30 minutos o menos. Se ha ajustado la configuración " "automáticamente." #: ../variety/PreferencesVarietyDialog.py:544 msgid "Add Images" msgstr "Añadir imágenes" #: ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Add" msgstr "Añadir" #: ../variety/PreferencesVarietyDialog.py:567 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:703 #: ../variety/PreferencesVarietyDialog.py:716 #: ../data/ui/PreferencesVarietyDialog.ui.h:168 msgid "Edit..." msgstr "Editar…" #: ../variety/PreferencesVarietyDialog.py:710 msgid "View Image" msgstr "Ver imagen" #: ../variety/PreferencesVarietyDialog.py:713 msgid "Open Folder" msgstr "Abrir carpeta" #: ../variety/PreferencesVarietyDialog.py:1092 msgid "Recommended images source disabled" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1120 #: ../variety/PreferencesVarietyDialog.py:1139 #: ../variety/PreferencesVarietyDialog.py:1147 msgid "No write permissions" msgstr "Sin permisos de escritura" #: ../variety/PreferencesVarietyDialog.py:1127 msgid "Limit disabled" msgstr "Límite desactivado" #: ../variety/PreferencesVarietyDialog.py:1128 msgid "" "Changing the download folder automatically turns off the size limit to " "prevent from accidental data loss" msgstr "" "Al cambiar la carpeta de descarga, el límite de tamaño se desactiva " "automáticamente para prevenir la pérdida de datos accidental." #: ../variety/PreferencesVarietyDialog.py:1134 #, python-format msgid "Actual download folder: %s " msgstr "Carpeta de descargas real: %s " #: ../variety/PreferencesVarietyDialog.py:1214 msgid "Could not adjust permissions" msgstr "No se pudieron ajustar los permisos" #: ../variety/PreferencesVarietyDialog.py:1215 #, 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/PreferencesVarietyDialog.py:1247 msgid "Logged in as: " msgstr "Se accedió como: " #: ../variety/PreferencesVarietyDialog.py:1249 msgid "Anonymous" msgstr "Anónimo" #: ../variety/PreferencesVarietyDialog.py:1250 #: ../data/ui/PreferencesVarietyDialog.ui.h:109 msgid "Login or register" msgstr "Acceder o registrarse" #: ../variety/PreferencesVarietyDialog.py:1250 msgid "Switch user" msgstr "Cambiar de usuario" #: ../data/ui/AddFlickrDialog.ui.h:1 msgid "Variety - add Flickr as an image source" msgstr "Variety – Añadir Flickr como origen de imágenes" #: ../data/ui/AddFlickrDialog.ui.h:3 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.h:4 #: ../data/ui/PreferencesVarietyDialog.ui.h:58 msgid "Tags: " msgstr "Etiquetas: " #: ../data/ui/AddFlickrDialog.ui.h:5 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.h:7 msgid "User: " msgstr "Usuario: " #: ../data/ui/AddFlickrDialog.ui.h:8 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.h:10 msgid "Group: " msgstr "Grupo: " #: ../data/ui/AddFlickrDialog.ui.h:11 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/group" "s/wallpapers/" msgstr "" "Escriba la dirección URL del grupo.\n" "Ejemplo: http://www.flickr.com/group" "s/wallpapers/" #: ../data/ui/AddFlickrDialog.ui.h:13 msgid "Text:" msgstr "Texto:" #: ../data/ui/AddFlickrDialog.ui.h:14 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" #: ../variety/AddMediaRssDialog.py:40 msgid "" "This does not seem to be a valid Media RSS feed URL or there is no content " "there." msgstr "" "Este no parece ser el URL de un canal RSS de medios válido, o no hay " "contenido en él." #: ../variety/VarietyWindow.py:630 ../variety/VarietyWindow.py:772 #: ../variety/VarietyWindow.py:2650 msgid "Already in Favorites" msgstr "Ya está en Favoritos" #: ../variety/VarietyWindow.py:634 ../variety/ThumbsManager.py:144 #: ../variety/indicator.py:76 msgid "Copy to _Favorites" msgstr "Copiar en _Favoritos" #: ../variety/VarietyWindow.py:635 ../variety/ThumbsManager.py:151 msgid "Move to _Favorites" msgstr "Mover a _Favoritos" #. both #: ../variety/VarietyWindow.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:165 ../variety/indicator.py:81 msgid "Move to Favorites" msgstr "Mover a Favoritos" #: ../variety/VarietyWindow.py:665 ../variety/ThumbsManager.py:119 msgid "Fetched: Show Origin" msgstr "Obtenidos: Mostrar origen" #: ../variety/VarietyWindow.py:667 ../variety/VarietyWindow.py:762 #: ../variety/ThumbsManager.py:121 #, python-format msgid "View at %s" msgstr "Ver en %s" #: ../variety/VarietyWindow.py:711 msgid "Unknown" msgstr "Desconocido" #: ../variety/VarietyWindow.py:732 #, python-format msgid "Author: %s" msgstr "Autor: %s" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 #: ../variety/indicator.py:120 ../variety/indicator.py:185 msgid "Pause on current" msgstr "Pausar en el actual" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 msgid "Resume regular changes" msgstr "Reanudar cambios periódicos" #: ../variety/VarietyWindow.py:772 ../variety/indicator.py:191 msgid "Save to Favorites" msgstr "Guardar en Favoritos" #: ../variety/VarietyWindow.py:904 msgid "Filtering too strict?" msgstr "¿El filtrado es demasiado estricto?" #: ../variety/VarietyWindow.py:905 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:1377 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:1379 msgid "Please add more image sources" msgstr "Añada más orígenes de imágenes" #: ../variety/VarietyWindow.py:1380 msgid "No more wallpapers" msgstr "No hay más fondos" #: ../variety/VarietyWindow.py:1566 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:1601 #, 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:1603 #, 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:1623 ../variety/VarietyWindow.py:1643 msgid "Cannot delete" msgstr "No se puede eliminar" #: ../variety/VarietyWindow.py:1624 #, 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:1644 msgid "" "Probably there is no utility for moving to Trash?\n" "Please install trash-cli or gvfs-bin or konquerer." msgstr "" "Probablemente no hay ninguna herramienta para mover a la papelera.\n" "Instale trash-cli, gvfs-bin o konquerer." #: ../variety/VarietyWindow.py:1776 msgid "Anonymous usage statistics" msgstr "Estadísticas de uso anónimas" #: ../variety/VarietyWindow.py:1777 msgid "" "Variety collects anonymous usage statistics. \n" "These help us make it better and are not shared with anyone. \n" "To read more or turn them off, go to \"Sync and social\"" msgstr "" "Variety recopila estadísticas anónimas de uso.\n" "Estas nos ayudan a mejorar el programa y no las compartimos con nadie.\n" "Para obtener más información o para desactivarlas, vaya a «Sincronización y " "funciones sociales»." #: ../variety/VarietyWindow.py:1920 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:1945 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 /some/local/image.jpg --next" msgstr "" "%prog [opciones] [archivos o url]\n" "\n" "Al pasar archivos locales, estos se añadirán a la cola de Variety.\n" "Al pasar URL, se descargarán los archivos en la carpeta Obtenidos y luego se " "colocarán en la cola.\n" "\n" "Para establecer un fondo específico: %prog /una/imagen/local.jpg --next" #: ../variety/VarietyWindow.py:1955 msgid "" "Show logging messages (-vv shows even finer debugging messages, -vvv debugs " "variety_lib too)" msgstr "" "Mostrar mensajes de registro (-vv muestra mejores mensajes de depuración, -" "vvv depura variety_lib también)" #: ../variety/VarietyWindow.py:1959 msgid "Make the running instance quit" msgstr "Salir de la instancia en ejecución" #: ../variety/VarietyWindow.py:1963 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/VarietyWindow.py:1967 msgid "Show Next wallpaper" msgstr "Mostrar el siguiente fondo" #: ../variety/VarietyWindow.py:1971 msgid "Show Previous wallpaper" msgstr "Mostrar el fondo anterior" #: ../variety/VarietyWindow.py:1975 msgid "Show Next wallpaper, skipping the forward history" msgstr "Mostrar el siguiente fondo, omitiendo el histórico" #: ../variety/VarietyWindow.py:1979 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/VarietyWindow.py:1983 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/VarietyWindow.py:1987 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/VarietyWindow.py:1991 msgid "Pause on current image" msgstr "Pausar en la imagen actual" #: ../variety/VarietyWindow.py:1995 msgid "Resume regular image changes" msgstr "Reanudar cambios periódicos de imagen" #: ../variety/VarietyWindow.py:1999 msgid "Toggle Pause/Resume state" msgstr "Pausar/reanudar" #: ../variety/VarietyWindow.py:2003 msgid "Show Next quote" msgstr "Ver la cita siguiente" #: ../variety/VarietyWindow.py:2007 msgid "Show Previous quote" msgstr "Ver la cita anterior" #: ../variety/VarietyWindow.py:2011 msgid "Show Next quote, skipping the forward history" msgstr "Mostrar la siguiente cita, omitiendo el histórico" #: ../variety/VarietyWindow.py:2015 msgid "Toggle Quotes Pause/Resume state" msgstr "Pausar/reanudar citas" #: ../variety/VarietyWindow.py:2019 msgid "Save the current quote to Favorites" msgstr "Guardar la cita actual en Favoritos" #: ../variety/VarietyWindow.py:2023 msgid "Toggle History display" msgstr "Mostrar/ocultar historial" #: ../variety/VarietyWindow.py:2027 msgid "Toggle Recent Downloads display" msgstr "Mostrar/ocultar descargas recientes" #: ../variety/VarietyWindow.py:2031 msgid "Show Preferences dialog" msgstr "Mostrar el diálogo Preferencias" #: ../variety/VarietyWindow.py:2035 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" #: ../variety/VarietyWindow.py:2039 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/VarietyWindow.py:2053 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "" "las opciones --next/--fast-forward y --previous son mutualmente excluyentes" #: ../variety/VarietyWindow.py:2056 msgid "options --trash and --favorite are mutually exclusive" msgstr "las opciones --trash y --favorite son mutualmente excluyentes" #: ../variety/VarietyWindow.py:2059 msgid "options --pause and --resume are mutually exclusive" msgstr "las opciones --pause y --resume son mutualmente excluyentes" #: ../variety/VarietyWindow.py:2062 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:2179 ../variety/ImageFetcher.py:60 #: ../variety/ImageFetcher.py:71 ../variety/ImageFetcher.py:78 #: ../variety/ImageFetcher.py:112 msgid "Not an image" msgstr "No es una imagen" #: ../variety/VarietyWindow.py:2184 msgid "Added to queue" msgstr "Añadido a la cola" #: ../variety/VarietyWindow.py:2185 ../variety/VarietyWindow.py:2191 msgid "Press Next to see it" msgstr "Pulse Siguiente para verlo" #: ../variety/VarietyWindow.py:2191 msgid "Fetched" msgstr "Obtenidos" #: ../variety/VarietyWindow.py:2237 msgid "Unsupported source type" msgstr "El origen no es compatible" #: ../variety/VarietyWindow.py:2238 ../variety/VarietyWindow.py:2286 msgid "Are you running the most recent version of Variety?" msgstr "¿Está utilizando la versión más reciente de Variety?" #: ../variety/VarietyWindow.py:2244 msgid "New image source added" msgstr "Se añadió un origen de imágenes nuevo" #: ../variety/VarietyWindow.py:2246 msgid "Image source already exists, enabling it" msgstr "El origen de imágenes ya existe. Activándolo" #: ../variety/VarietyWindow.py:2272 msgid "Fetched and applied" msgstr "" #: ../variety/VarietyWindow.py:2282 msgid "It works!" msgstr "¡Funciona!" #: ../variety/VarietyWindow.py:2282 msgid "Yay, Variety links work. Great!" msgstr "" #: ../variety/VarietyWindow.py:2286 msgid "Unsupported command" msgstr "No se admite la orden" #: ../variety/VarietyWindow.py:2288 msgid "Could not process the given variety:// URL" msgstr "No se pudo procesar el URL variety:// dado" #: ../variety/VarietyWindow.py:2289 msgid "Run with logging enabled to see details" msgstr "" #: ../variety/VarietyWindow.py:2488 msgid "Do not ask anymore, always use the current quote" msgstr "No preguntar de nuevo y usar siempre la cita actual" #: ../variety/VarietyWindow.py:2491 ../data/ui/FacebookPublishDialog.ui.h:5 msgid "Do not ask anymore, always use the text above" msgstr "No preguntar de nuevo, siempre usar el texto anterior" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "Published" msgstr "Publicado" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "You may open your Facebook feed to see the post" msgstr "Puede abrir «Novedades» en Facebook para ver la publicación" #: ../variety/VarietyWindow.py:2526 ../variety/VarietyWindow.py:2555 msgid "Could not publish" msgstr "No se pudo publicar" #: ../variety/VarietyWindow.py:2718 msgid "Could not create autostart entry" msgstr "No se pudo crear la entrada de inicio automático" #: ../variety/VarietyWindow.py:2719 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:2769 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:2769 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/FacebookFirstRunDialog.ui.h:1 msgid "Variety - Facebook Sharing" msgstr "Variety – Compartir en Facebook" #: ../data/ui/FacebookFirstRunDialog.ui.h:2 #: ../data/ui/PreferencesVarietyDialog.ui.h:169 msgid "Facebook Sharing" msgstr "Compartir en Facebook" #: ../data/ui/FacebookFirstRunDialog.ui.h:3 msgid "" "You are sharing on Facebook for the first time. Sharing from Variety is " "available for images that come from online sources and for quotes. It works " "this way: \n" "\n" "1. Login to Facebook\n" "Facebook will open in your default browser. You will be prompted to login if " "you are not already logged in. \n" "\n" "2. Authorize Variety to publish to your " "feed.\n" "You will be asked to allow Variety to publish to your feed on your behalf. " "Variety will only use this permission to publish those images and quotes " "that you tell it to, nothing else.\n" "\n" "3. Configure browser to open variety:// links " "with Variety or xdg-open\n" "Then you will be redirected to a page with instructions to associate " "\"variety://\" links with Variety in your browser. Please follow these " "instructions to complete the setup. You have to do this only once.\n" "\n" "No passwords or login information is kept locally, just an OAuth Facebook " "token that will be valid for a couple of weeks. After its validity expires " "you will be asked to login again." msgstr "" #: ../variety/AddWallpapersNetCategoryDialog.py:40 msgid "Could not find wallpapers there. Please check the URL." msgstr "No se pudieron encontrar fondos allí. Compruebe la dirección URL." #: ../data/ui/WelcomeDialog.ui.h:1 msgid "Welcome to Variety!" msgstr "Le damos la bienvenida a Variety." #: ../data/ui/WelcomeDialog.ui.h:2 ../data/ui/SmartFeaturesNoticeDialog.ui.h:3 msgid "Continue" msgstr "Continuar" #: ../data/ui/WelcomeDialog.ui.h:3 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.h:4 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.h:5 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." #: ../data/ui/WelcomeDialog.ui.h:6 msgid "KDE Users - Important, please read:" msgstr "Usuarios de KDE – Importante, lea:" #: ../data/ui/WelcomeDialog.ui.h:7 msgid "" "You appear to be running KDE. In KDE 4 it is impossible to set the wallpaper " "from inside a program - there is no API for this. To make Variety work, please read " "and follow the instructions here." msgstr "" #: ../data/ui/AddRedditDialog.ui.h:1 msgid "Variety - add Reddit feed" msgstr "Variety – Añadir un canal de Reddit" #: ../data/ui/AddRedditDialog.ui.h:3 msgid "" "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" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:7 msgid "URL or name of a subreddit: " msgstr "URL o nombre de un subreddit: " #: ../data/ui/AddRedditDialog.ui.h:8 msgid "Just a moment to check what's there" msgstr "Espere un momento mientras revisamos lo que hay" #: ../data/ui/AddMediaRssDialog.ui.h:1 msgid "Variety - add Media RSS feed" msgstr "Variety – Añadir canal RSS de medios" #: ../data/ui/AddMediaRssDialog.ui.h:3 msgid "" "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." msgstr "" "Pegue la URL del canal RSS multimedia a continuación. Note que solo son " "compatibles los canales RSS multimedia, y no los comunes. Los canales RSS " "multimedia contienen etiquetas media:content que enlazan directamente a la " "imagen en sí. Ejemplos de sitios que proporcionan canales RSS multimedia " "incluyen: Picasa, deviantART, SmugMug, Flickr, InterfaceLIFT." #: ../data/ui/AddMediaRssDialog.ui.h:4 msgid "Paste the URL of the Media RSS feed here: " msgstr "Pegue aquí la URL del canal RSS de medios: " #: ../data/ui/AddMediaRssDialog.ui.h:5 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:9 msgid "Just a moment to check what's at that URL" msgstr "Espere un momento, se está comprobando la URL" #: ../variety/AddRedditDialog.py:43 msgid "This does not seem to be a valid Reddit URL" msgstr "Este no parece ser un URL de Reddit válido" #: ../variety/AddRedditDialog.py:46 msgid "We could not find any image submissions there." msgstr "" #: ../variety/Smart.py:111 msgid "" "Your smart_user.json config file appears broken. You may have to login again " "to VRTY.ORG." msgstr "" "Parece que hay un problema en el archivo de configuración smart_user.json. " "Es posible que necesite acceder de nuevo a VRTY.ORG." #: ../variety/Smart.py:195 msgid "Your VRTY.ORG credentials are probably outdated. Please login again." msgstr "" "Sus datos de acceso de VRTY.ORG están probablemente desactualizados. Acceda " "de nuevo." #: ../variety/Smart.py:597 ../variety/Smart.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:111 msgid "Sync" msgstr "Sincronizar" #: ../variety/Smart.py:598 #, python-format msgid "Fetching %d images" msgstr "Obteniendo %d imágenes" #: ../variety/Smart.py:598 msgid "Fetching 1 image" msgstr "Obteniendo 1 imagen" #: ../variety/Smart.py:643 msgid "Finished" msgstr "Finalizado" #: ../variety/Smart.py:664 #, python-format msgid "Logged in as %s" msgstr "Sesión iniciada como %s" #: ../variety/Smart.py:676 #, python-format msgid "" "Do you want to login to VRTY.ORG as %s?" msgstr "" "¿Quiere acceder a VRTY.ORG como %s?" #: ../variety/Smart.py:677 msgid "VRTY.ORG login confirmation" msgstr "Confirmación de acceso a VRTY.ORG" #: ../data/plugins/quotes/QuotationsPageSource.py:35 msgid "Fetches quotes from TheQuotationsPage.com" msgstr "Obtiene citas de TheQuotationsPage.com" #: ../variety/__init__.py:143 msgid "Terminating signal received, quitting..." msgstr "Señal de finalización recibida, saliendo…" #: ../variety/__init__.py:198 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." #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:1 msgid "VRTY.ORG integration" msgstr "Integración con VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:2 msgid "This feature requires VRTY.ORG integration" msgstr "Esta funcionalidad necesita integración con VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:3 msgid "Enable VRTY.ORG integration" msgstr "Activar la integración con VRTY.ORG" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:4 msgid "" "For this feature Variety needs permission to collect data about the images " "you like or dislike and the online sources you have enabled.\n" "\n" "Collected data is anonymous by default and covers only images which Variety " "downloaded, never images you already had in your local folders that might be " "private.\n" "\n" "This data helps us provide better images for everyone and fuels VRTY.ORG - a valuable resource for all users " "of Variety." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:1 msgid "Variety - VRTY.ORG" msgstr "Variety – VRTY.ORG" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:2 msgid "No, thanks" msgstr "No, gracias" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:4 msgid "" "Introducing VRTY.ORG! Wanna take part?" msgstr "" "Presentamos VRTY.ORG. ¿Quiere ser parte?" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:5 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to find and add new image sources to Variety, and to follow other users' " "favorites." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:6 msgid "" "Participation takes no effort - your profile will be built automatically, as " "you like or dislike images downloaded by Variety. Your profile will not be " "shared with third parties, unless you opt-in to make it public. Read more details about the " "service and the privacy policy here." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:7 msgid "" "Participation is required for some features of Variety such as synchronization of favorites between computers." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:8 #: ../data/ui/PreferencesVarietyDialog.ui.h:105 msgid "Participate in VRTY.ORG" msgstr "Participar en VRTY.ORG" #: ../data/plugins/quotes/QuotesDaddySource.py:31 msgid "" "Fetches quotes from QuotesDaddy's daily quotes RSS feed.\n" "Does not support searching by tags or authors." msgstr "" "Recupera citas desde el proveedor RSS «QuotesDaddy's daily quotes».\n" "No permite la búsqueda por etiquetas o autores." #: ../data/ui/AboutVarietyDialog.ui.h:1 msgid "Copyright (c) 2012, Peter Levi " msgstr "Copyright (c) 2012, Peter Levi " #: ../data/ui/AboutVarietyDialog.ui.h:2 msgid "About Variety" msgstr "Acerca de Variety" #: ../data/ui/AboutVarietyDialog.ui.h:3 msgid "An automatic wallpaper changer, downloader and manager." msgstr "Un cambiador, descargador y gestor de fondos automático." #: ../data/ui/AboutVarietyDialog.ui.h:4 msgid "http://peterlevi.com/variety" msgstr "http://peterlevi.com/variety" #: ../data/ui/AboutVarietyDialog.ui.h:5 msgid "" "# Copyright (c) 2012, Peter Levi \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, Peter Levi \n" "# Este programa es software libre: usted puede redistribuirlo y/o " "modificarlo \n" "# bajo los términos de la Licencia Pública General GNU publicada \n" "# por la Fundación para el Software Libre, ya sea la versión 3 \n" "# de la Licencia, o (a su elección) cualquier versión posterior.\n" "\n" "# Este programa se distribuye con la esperanza de que sea útil, pero \n" "# SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita \n" "# MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO. \n" "# Consulte los detalles de la Licencia Pública General GNU para obtener \n" "# una información más detallada. \n" "\n" "# Debería haber recibido una copia de la Licencia Pública General GNU \n" "# junto a este programa. \n" "# En caso contrario, consulte .\n" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:1 msgid "Variety - add Wallpapers.net category" msgstr "Variety – Añadir categoría de Wallpapers.net" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:3 msgid "" "Please visit wallpapers.net and choose " "a category with wallpapers, then paste its URL below. A category is " "anything on the site that has one or more pages with wallpapers on them. " "Here are some examples:\n" "\n" "All wallpapers: http://www.wallpapers.net/\n" "Specific resolution: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" msgstr "" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:8 msgid "Paste URL here: " msgstr "Pegue el URL aquí: " #: ../data/ui/PreferencesVarietyDialog.ui.h:1 msgid "seconds" msgstr "segundos" #: ../data/ui/PreferencesVarietyDialog.ui.h:2 msgid "minutes" msgstr "minutos" #: ../data/ui/PreferencesVarietyDialog.ui.h:3 msgid "hours" msgstr "horas" #: ../data/ui/PreferencesVarietyDialog.ui.h:4 msgid "days" msgstr "días" #: ../data/ui/PreferencesVarietyDialog.ui.h:5 msgid "Variety Preferences" msgstr "Preferencias de Variety" #: ../data/ui/PreferencesVarietyDialog.ui.h:6 msgid "General" msgstr "General" #: ../data/ui/PreferencesVarietyDialog.ui.h:7 msgid "Start Variety when the computer starts" msgstr "Iniciar Variety cuando arranque el equipo" #: ../data/ui/PreferencesVarietyDialog.ui.h:8 msgid "Change wallpaper every " msgstr "Cambiar el fondo cada " #: ../data/ui/PreferencesVarietyDialog.ui.h:9 msgid "Minimum interval is 5 seconds" msgstr "El intervalo mínimo es de 5 segundos" #: ../data/ui/PreferencesVarietyDialog.ui.h:10 msgid "Change wallpaper on start" msgstr "Cambiar el fondo al iniciar" #: ../data/ui/PreferencesVarietyDialog.ui.h:12 msgid "Enabled" msgstr "Activado" #: ../data/ui/PreferencesVarietyDialog.ui.h:13 msgid "Type" msgstr "Tipo" #: ../data/ui/PreferencesVarietyDialog.ui.h:14 msgid "Location" msgstr "Ubicación" #: ../data/ui/PreferencesVarietyDialog.ui.h:15 msgid "_Add..." msgstr "_Añadir…" #: ../data/ui/PreferencesVarietyDialog.ui.h:16 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.h:17 msgid "_Edit..." msgstr "_Editar…" #: ../data/ui/PreferencesVarietyDialog.ui.h:18 msgid "Edit the selected source" msgstr "Editar el origen seleccionado" #: ../data/ui/PreferencesVarietyDialog.ui.h:19 msgid "_Remove..." msgstr "_Quitar…" #: ../data/ui/PreferencesVarietyDialog.ui.h:20 msgid "Remove selected image sources" msgstr "Quitar los orígenes de imágenes seleccionados" #: ../data/ui/PreferencesVarietyDialog.ui.h:21 msgid "_Use" msgstr "_Usar" #: ../data/ui/PreferencesVarietyDialog.ui.h:22 msgid "Enable the selected sources and disable all others" msgstr "Activar los orígenes seleccionados y desactivar los demás" #: ../data/ui/PreferencesVarietyDialog.ui.h:23 msgid "Download a wallpaper every " msgstr "Descargar un fondo cada " #: ../data/ui/PreferencesVarietyDialog.ui.h:24 msgid "Minimum interval is one minute" msgstr "El intervalo mínimo es de un minuto" #: ../data/ui/PreferencesVarietyDialog.ui.h:25 msgid "to " msgstr "a " #: ../data/ui/PreferencesVarietyDialog.ui.h:26 msgid "Actual download folder " msgstr "Carpeta de descargas real " #: ../data/ui/PreferencesVarietyDialog.ui.h:27 msgid "" "Caution: do NOT use this option if you use a custom download folder with " "valuable files in it. Variety will maintain the limit regardless of what is " "in the download folder." msgstr "" "Precaución: NO utilice esta opción si usa una carpeta de descargas " "personalizada que contiene archivos valiosos. Variety mantendrá el límite, " "sin importar lo que contenga la carpeta de descargas." #: ../data/ui/PreferencesVarietyDialog.ui.h:28 msgid "Limit download folder to " msgstr "Limitar la carpeta de descargas a " #: ../data/ui/PreferencesVarietyDialog.ui.h:29 msgid "Minimum size is 50 MB" msgstr "El tamaño mínimo es de 50 MB" #: ../data/ui/PreferencesVarietyDialog.ui.h:30 msgid "MB by deleting oldest files when necessary" msgstr "MB eliminando archivos antiguos cuando sea necesario" #: ../data/ui/PreferencesVarietyDialog.ui.h:31 msgid "Favorites" msgstr "Favoritos" #: ../data/ui/PreferencesVarietyDialog.ui.h:32 msgid "Copy favorite wallpapers to " msgstr "Copiar los fondos favoritos a " #: ../data/ui/PreferencesVarietyDialog.ui.h:33 msgid "Filters" msgstr "Filtros" #: ../data/ui/PreferencesVarietyDialog.ui.h:34 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.h:35 msgid "Quotes" msgstr "Citas" #: ../data/ui/PreferencesVarietyDialog.ui.h:36 msgid "Show random wise quotes on the desktop" msgstr "Mostrar citas sabias al azar en el escritorio" #: ../data/ui/PreferencesVarietyDialog.ui.h:37 msgid "Text color: " msgstr "Color del texto: " #: ../data/ui/PreferencesVarietyDialog.ui.h:38 msgid "Text font: " msgstr "Tipo de letra del texto: " #: ../data/ui/PreferencesVarietyDialog.ui.h:39 msgid "Backdrop color: " msgstr "Color de fondo: " #: ../data/ui/PreferencesVarietyDialog.ui.h:40 msgid "Backdrop opacity: " msgstr "Opacidad del fondo: " #: ../data/ui/PreferencesVarietyDialog.ui.h:41 msgid " Transparent" msgstr " Transparente" #: ../data/ui/PreferencesVarietyDialog.ui.h:42 msgid "Opaque" msgstr "Opaco" #: ../data/ui/PreferencesVarietyDialog.ui.h:43 msgid "Draw a text shadow" msgstr "Dibujar una sombra de texto" #: ../data/ui/PreferencesVarietyDialog.ui.h:44 msgid "Appearance" msgstr "Apariencia" #: ../data/ui/PreferencesVarietyDialog.ui.h:45 msgid "Quotes area width: " msgstr "Anchura de la zona de citas: " #: ../data/ui/PreferencesVarietyDialog.ui.h:46 msgid "Narrow " msgstr "Estrecha " #: ../data/ui/PreferencesVarietyDialog.ui.h:47 msgid "Wide" msgstr "Ancha" #: ../data/ui/PreferencesVarietyDialog.ui.h:48 msgid "Horizontal position: " msgstr "Posición horizontal: " #: ../data/ui/PreferencesVarietyDialog.ui.h:49 msgid "Left " msgstr "Izquierda " #: ../data/ui/PreferencesVarietyDialog.ui.h:50 ../variety/ThumbsManager.py:44 msgid "Right" msgstr "Derecha" #: ../data/ui/PreferencesVarietyDialog.ui.h:51 msgid "Vertical position: " msgstr "Posición vertical: " #: ../data/ui/PreferencesVarietyDialog.ui.h:52 msgid "Top " msgstr "Arriba " #: ../data/ui/PreferencesVarietyDialog.ui.h:53 ../variety/ThumbsManager.py:41 msgid "Bottom" msgstr "Abajo" #: ../data/ui/PreferencesVarietyDialog.ui.h:54 msgid "Placement" msgstr "Posición" #: ../data/ui/PreferencesVarietyDialog.ui.h:55 msgid "Show quotes from these sources: " msgstr "Mostrar citas de estos orígenes: " #: ../data/ui/PreferencesVarietyDialog.ui.h:56 msgid "" "More " "plugins" msgstr "" "Más " "complementos" #: ../data/ui/PreferencesVarietyDialog.ui.h:57 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.h:59 msgid "Example: funny, inspirational" msgstr "Ejemplo: divertido, inspirador" #: ../data/ui/PreferencesVarietyDialog.ui.h:60 msgid "Example: Albert Einstein, Voltaire" msgstr "Ejemplo: Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui.h:61 msgid "Authors: " msgstr "Autores: " #: ../data/ui/PreferencesVarietyDialog.ui.h:62 msgid "Sources and filtering" msgstr "Orígenes y filtrado" #: ../data/ui/PreferencesVarietyDialog.ui.h:63 msgid "Change quote every " msgstr "Cambiar la cita cada " #: ../data/ui/PreferencesVarietyDialog.ui.h:64 msgid "Minimum interval is 10 seconds" msgstr "El intervalo mínimo es de 10 segundos" #: ../data/ui/PreferencesVarietyDialog.ui.h:65 msgid "Regular change" msgstr "Cambio periódico" #: ../data/ui/PreferencesVarietyDialog.ui.h:66 msgid "Clock" msgstr "Reloj" #: ../data/ui/PreferencesVarietyDialog.ui.h:67 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.h:68 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.h:69 msgid "Clock font: " msgstr "Tipo de letra del reloj: " #: ../data/ui/PreferencesVarietyDialog.ui.h:70 msgid "Date font: " msgstr "Tipo de letra de la fecha: " #: ../data/ui/PreferencesVarietyDialog.ui.h:71 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.h:72 msgid "Effects" msgstr "Efectos" #: ../data/ui/PreferencesVarietyDialog.ui.h:73 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:74 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:75 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:76 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:77 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:78 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:79 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:80 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:81 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:82 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:83 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:84 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:85 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:86 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:87 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:88 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:89 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:90 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:91 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:92 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:93 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:94 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:95 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:96 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:97 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:98 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:99 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:100 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:101 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:102 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:103 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:104 msgid "VRTY.ORG" msgstr "VRTY.ORG" #: ../data/ui/PreferencesVarietyDialog.ui.h:106 msgid "VRTY.ORG is in beta and will take some time to mature" msgstr "VRTY.ORG está en fase beta y le tomará algo de tiempo madurar" #: ../data/ui/PreferencesVarietyDialog.ui.h:107 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to add new image sources to Variety, and to follow other users' favorites. " "It is fueled by the favorite images of all participating users." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:108 msgid "" "Could not create user - no connection to VRTY.ORG. We will try again later." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:110 msgid "" "Registration enables cool features like synchronization of favorite images " "and sources between computers and personalized recommendations." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:112 msgid "Synchronize favorite images between computers" msgstr "Sincronizar imágenes favoritas en varios equipos" #: ../data/ui/PreferencesVarietyDialog.ui.h:113 msgid "Requires VRTY.ORG enabled and logged in." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:114 msgid "" "Your favorite images from other computers will be automatically downloaded " "to this computer. You need to be logged in with the same VRTY.ORG user " "everywhere. Sync will not delete any images." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:115 msgid "Privacy policy" msgstr "Política de privacidad" #: ../data/ui/PreferencesVarietyDialog.ui.h:116 msgid "" "Variety sends data only for images it downloaded, never for images you " "already had in your local folders that might be private, and Sync does not " "work for such images. Collected data is not shared with third parties, " "unless you opt-in to make your profile public. Read more details about the " "service and the privacy policy here." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:117 msgid "Usage statistics" msgstr "Estadísticas de uso" #: ../data/ui/PreferencesVarietyDialog.ui.h:118 msgid "Help make Variety better by sending anonymous usage statistics" msgstr "Ayude a mejorar Variety al enviar estadísticas anónimas de uso" #: ../data/ui/PreferencesVarietyDialog.ui.h:119 msgid "" "These stats help us improve Variety by understanding how users interact with " "it. They also include general info about your OS version and monitor setup. " "Collected data is not shared with anyone." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:120 msgid "Sync and social" msgstr "Sincronización y funciones sociales" #: ../data/ui/PreferencesVarietyDialog.ui.h:121 msgid "Fetch folder" msgstr "Carpeta Obtenidos" #: ../data/ui/PreferencesVarietyDialog.ui.h:122 msgid "Save manually downloaded wallpapers to " msgstr "Guardar los fondos descargados manualmente en " #: ../data/ui/PreferencesVarietyDialog.ui.h:123 msgid "Drag and drop" msgstr "Arrastrar y soltar" #: ../data/ui/PreferencesVarietyDialog.ui.h:124 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.h:126 msgid "Clipboard monitoring" msgstr "Monitoreo del portapapeles" #: ../data/ui/PreferencesVarietyDialog.ui.h:127 msgid "Monitor clipboard for image URLs and fetch them" msgstr "Detectar URL de imágenes en el portapapeles y obtenerlas" #: ../data/ui/PreferencesVarietyDialog.ui.h:128 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.h:129 msgid "Manual downloading" msgstr "Descarga manual" #: ../data/ui/PreferencesVarietyDialog.ui.h:130 msgid "When possible use images that:" msgstr "Siempre que sea posible usar imágenes que:" #: ../data/ui/PreferencesVarietyDialog.ui.h:131 ../variety/ThumbsManager.py:98 msgid "Size" msgstr "Tamaño" #: ../data/ui/PreferencesVarietyDialog.ui.h:132 msgid "Have landscape orientation" msgstr "Tienen orientación horizontal" #: ../data/ui/PreferencesVarietyDialog.ui.h:133 msgid "Are big at least " msgstr "Tienen por lo menos " #: ../data/ui/PreferencesVarietyDialog.ui.h:134 msgid "50" msgstr "50" #: ../data/ui/PreferencesVarietyDialog.ui.h:135 msgid "80" msgstr "80" #: ../data/ui/PreferencesVarietyDialog.ui.h:136 msgid "100" msgstr "100" #: ../data/ui/PreferencesVarietyDialog.ui.h:138 #, no-c-format msgid "% of the screen resolution" msgstr "% de la resolución de la pantalla" #: ../data/ui/PreferencesVarietyDialog.ui.h:139 msgid "Color" msgstr "Color" #: ../data/ui/PreferencesVarietyDialog.ui.h:140 msgid "Are dark or light:" msgstr "Son oscuras o claras:" #: ../data/ui/PreferencesVarietyDialog.ui.h:141 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "Oscuras" #: ../data/ui/PreferencesVarietyDialog.ui.h:142 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "Claras" #: ../data/ui/PreferencesVarietyDialog.ui.h:143 msgid "Contain this color: " msgstr "Contienen este color: " #: ../data/ui/PreferencesVarietyDialog.ui.h:144 msgid "(Takes effect after some initial searching)" msgstr "(Será efectivo después de realizar algunas búsquedas)" #: ../data/ui/PreferencesVarietyDialog.ui.h:145 msgid "Rating" msgstr "Valoración" #: ../data/ui/PreferencesVarietyDialog.ui.h:146 msgid "Have EXIF rating at least " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:147 msgid "1" msgstr "1" #: ../data/ui/PreferencesVarietyDialog.ui.h:148 msgid "2" msgstr "2" #: ../data/ui/PreferencesVarietyDialog.ui.h:149 msgid "3" msgstr "3" #: ../data/ui/PreferencesVarietyDialog.ui.h:150 msgid "4" msgstr "4" #: ../data/ui/PreferencesVarietyDialog.ui.h:151 msgid "5" msgstr "5" #: ../data/ui/PreferencesVarietyDialog.ui.h:152 msgid "Color and size" msgstr "Color y tamaño" #: ../data/ui/PreferencesVarietyDialog.ui.h:153 msgid "Indicator Icon" msgstr "Icono del indicador" #: ../data/ui/PreferencesVarietyDialog.ui.h:154 msgid "Indicator icon:" msgstr "Icono del indicador:" #: ../data/ui/PreferencesVarietyDialog.ui.h:155 msgctxt "Icon option" msgid "Light" msgstr "Claro" #: ../data/ui/PreferencesVarietyDialog.ui.h:156 msgctxt "Icon option" msgid "Dark" msgstr "Oscuro" #: ../data/ui/PreferencesVarietyDialog.ui.h:157 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "Usar el fondo actual" #: ../data/ui/PreferencesVarietyDialog.ui.h:158 msgctxt "Icon option" msgid "Custom image..." msgstr "Imagen personalizada…" #: ../data/ui/PreferencesVarietyDialog.ui.h:159 msgctxt "Icon option" msgid "None" msgstr "Ninguna" #: ../data/ui/PreferencesVarietyDialog.ui.h:160 msgid "Select an icon" msgstr "Seleccione un icono" #: ../data/ui/PreferencesVarietyDialog.ui.h:161 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.h:162 msgid "Favorites Operations" msgstr "Operaciones de favoritos" #: ../data/ui/PreferencesVarietyDialog.ui.h:163 msgid "Favorites operations to show in main menu:" msgstr "Operaciones de favoritos a mostrar en el menú principal:" #: ../data/ui/PreferencesVarietyDialog.ui.h:164 msgid "Copy to Favorites" msgstr "Copiar a favoritos" #: ../data/ui/PreferencesVarietyDialog.ui.h:166 msgid "Both Copy and Move" msgstr "Copiar y mover" #: ../data/ui/PreferencesVarietyDialog.ui.h:167 msgid "Depends on folder..." msgstr "Depende de la carpeta…" #: ../data/ui/PreferencesVarietyDialog.ui.h:170 msgid "Display dialog to customize the Facebook post before publishing" msgstr "" "Mostrar diálogo para personalizar la entrada de Facebook antes de publicarla" #: ../data/ui/PreferencesVarietyDialog.ui.h:171 msgid "Login Screen Support" msgstr "Compatibilidad con pantalla de acceso" #: ../data/ui/PreferencesVarietyDialog.ui.h:172 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.h:173 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.h:174 msgid "Copy wallpaper image files to this folder: " msgstr "Copiar las imágenes de fondo en esta carpeta: " #: ../data/ui/PreferencesVarietyDialog.ui.h:175 msgid "Reset to default" msgstr "Restaurar al valor predeterminado" #: ../data/ui/PreferencesVarietyDialog.ui.h:176 msgid "Still doesn't work?" msgstr "¿Sigue sin funcionar?" #: ../data/ui/PreferencesVarietyDialog.ui.h:177 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.h:178 msgid "You don't have write permissions for this folder." msgstr "No tiene permisos de escritura para esta carpeta." #: ../data/ui/PreferencesVarietyDialog.ui.h:179 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.h:180 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.h:181 msgid "Customize" msgstr "Personalizar" #: ../data/ui/PreferencesVarietyDialog.ui.h:182 msgid "Tips and tricks" msgstr "Consejos y trucos" #: ../data/ui/PreferencesVarietyDialog.ui.h:183 msgid "Recent changes" msgstr "Cambios recientes" #: ../data/ui/PreferencesVarietyDialog.ui.h:184 msgid "Visit website" msgstr "Visitar el sitio web" #: ../data/ui/PreferencesVarietyDialog.ui.h:185 msgid "Report a bug or request a feature" msgstr "Informar de un error o pedir una característica" #: ../data/ui/PreferencesVarietyDialog.ui.h:186 msgid "Send feedback" msgstr "Enviar comentarios" #: ../data/ui/PreferencesVarietyDialog.ui.h:187 msgid "Donate to Variety" msgstr "Done a Variety" #: ../data/ui/PreferencesVarietyDialog.ui.h:188 msgid "Donate via PayPal" msgstr "Donar con PayPal" #: ../data/ui/PreferencesVarietyDialog.ui.h:189 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.h:193 msgid "" "For Bitcoin and other payment methods please go to Variety's website." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:194 msgid "Donate" msgstr "Donar" #: ../variety/FacebookHelper.py:116 msgid "Authorization successful" msgstr "" #: ../variety/FacebookHelper.py:116 msgid "Publishing..." msgstr "Publicando…" #: ../variety/FacebookHelper.py:121 msgid "Authorization failed" msgstr "Falló la autorización" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "Arriba" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "Izquierda" #: ../variety/ThumbsManager.py:94 msgid "Position" msgstr "Posición" #: ../variety/ThumbsManager.py:109 msgid "Show Containing Folder" msgstr "Mostrar la carpeta contenedora" #: ../variety/ThumbsManager.py:136 ../variety/indicator.py:156 msgid "Set EXIF Rating" msgstr "Establecer valoración de EXIF" #: ../variety/ThumbsManager.py:160 ../variety/indicator.py:87 msgid "Delete to _Trash" msgstr "Mover a la _papelera" #: ../variety/ThumbsManager.py:167 ../variety/indicator.py:131 msgid "Where is it from?" msgstr "¿De dónde es?" #: ../variety/ThumbsManager.py:178 msgid "Close" msgstr "Cerrar" #: ../variety/ThumbsManager.py:198 msgid "Could not set EXIF rating" msgstr "No se pudo establecer la valoración de EXIF" #: ../variety/ThumbsManager.py:217 msgid "Unrated" msgstr "Sin valorar" #: ../variety/ThumbsManager.py:224 msgid "Rejected" msgstr "Rechazado" #: ../variety/ThumbsManager.py:324 msgid "Variety History" msgstr "Histórico de Variety" #: ../variety/ThumbsManager.py:326 msgid "Variety Recent Downloads" msgstr "Descargas recientes de Variety" #: ../variety/ThumbsManager.py:328 msgid "Variety Images" msgstr "Imágenes de Variety" #: ../data/ui/AddWallbaseDialog.ui.h:1 msgid "Variety - add Wallbase.cc image source" msgstr "Variety – Añadir origen de imagen de Wallbase.cc" #: ../data/ui/AddWallbaseDialog.ui.h:2 msgid "Wallbase.cc" msgstr "Wallbase.cc" #: ../data/ui/AddWallbaseDialog.ui.h:3 msgid "" "Wallbase.cc is permanently down. Use Wallhaven.cc instead. Support for " "Wallbase.cc will be dropped completely in a future release, please remove or " "update your existing Wallbase sources." msgstr "" "Wallbase.cc cerró indefinidamente. Utilice Wallhaven.cc en su lugar. Elimine " "o actualice sus orígenes de imágenes." #: ../data/ui/AddWallbaseDialog.ui.h:4 msgid "" "Wallbase.cc provides a variety of image " "search options. Below you can specify keywords to search for, or visit Wallbase.cc, setup your search criteria " "there, ensure you like the results, and paste the full Wallbase URL in the " "box.\n" "\n" "If you specify keywords, the most liked safe-for-work images that match any " "of the keywords will be used. \n" "\n" "If you specify a Wallbase 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." msgstr "" "Wallbase.cc proporciona distintas " "opciones de búsqueda de imágenes. Debajo puede especificar palabras claves a " "buscar, o visite Wallbase.cc, configure " "allí sus criterios de búsqueda, asegúrese de que está satisfecho con los " "resultados y pegue la URL completa de Wallbase en la casilla.\n" "\n" "Si especifica palabras clave se usarán las imágenes seguras para el trabajo " "que más gustan y que coincidan con cualquiera de las palabras clave.\n" "\n" "Si indica una URL de Wallbase, elija el criterio de ordenación con cuidado. " "Variety solicita regularmente imágenes, pero solo usa imágenes de los " "primeros cientos de imágenes devueltas. «Aleatorio» o «Fecha» significa que " "el origen de imágenes tendrá un ciclo de vida más largo, hasta que se " "consuma. «Favoritos» proporcionará mejores imágenes y «Relevancia» devolverá " "coincidencias más exactas cuando busque frases o colores." #: ../data/ui/FacebookPublishDialog.ui.h:1 msgid "Variety - Publish to Facebook" msgstr "Variety – Publicar en Facebook" #: ../data/ui/FacebookPublishDialog.ui.h:2 ../variety/indicator.py:149 #: ../variety/indicator.py:223 msgid "Share on Facebook" msgstr "Compartir en Facebook" #: ../data/ui/FacebookPublishDialog.ui.h:3 msgid "" "Publish a link to the current wallpaper on Facebook. Include this text along " "with the link (or just leave empty):" msgstr "" "Publicar un enlace a la imagen de fondo actual en Facebook. Incluir este " "texto junto con el enlace (o simplemente déjelo en blanco):" #: ../data/ui/FacebookPublishDialog.ui.h:4 msgid "Use current quote" msgstr "Usar la cita actual" #: ../data/ui/SmartRegisterDialog.ui.h:1 msgid "Variety - VRTY.ORG registration" msgstr "Variety – Registro en VRTY.ORG" #: ../data/ui/SmartRegisterDialog.ui.h:2 msgid "Would you like to register?" msgstr "¿Quiere registrarse?" #: ../data/ui/SmartRegisterDialog.ui.h:3 msgid "" "You may participate in VRTY.ORG " "anonymously, but registration enables some very nice features, such as synchronization of favorites between computers and " "personalized recommendations. It also ensures " "you will not lose your profile and favorite wallpapers if you reinstall your " "OS." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:4 msgid "Registration is very easy and does not require any personal data." msgstr "Es sencillo registrarse y no se le solicitará ningún dato personal." #: ../data/ui/SmartRegisterDialog.ui.h:5 msgid "" "If you choose to participate anonymously, you can register later from the " "\"Sync and social\" page in Preferences." msgstr "" "Si elige participar anónimamente, puede registrarse más tarde en la página " "«Sincronización y funciones sociales» en " "Preferencias." #: ../data/ui/SmartRegisterDialog.ui.h:6 msgid "" "Oops, we could not connect to VRTY.ORG. Server might be down. Please wait a " "couple of minutes and try again or choose \"Participate anonymously\" and register later " "from the \"Sync and social\" page in " "Preferences." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:7 msgid "" "Please continue the registration and follow the instructions in the browser " "tab we opened." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:8 msgid "I will participate anonymously" msgstr "Participaré anónimamente" #: ../data/ui/SmartRegisterDialog.ui.h:9 msgid "I'm registered, let me login" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:10 msgid "Register here" msgstr "Regístrese aquí" #: ../variety.desktop.in.h:1 msgid "Variety" msgstr "Variety" #: ../variety.desktop.in.h:2 msgid "Variety Wallpaper Changer" msgstr "Cambiador de fondos de pantalla Variety" #: ../variety.desktop.in.h:3 msgid "Next" msgstr "Siguiente" #: ../variety.desktop.in.h:4 msgid "Previous" msgstr "Anterior" #: ../variety.desktop.in.h:5 msgid "Pause / Resume" msgstr "Pausar/reanudar" #: ../variety.desktop.in.h:6 msgid "History" msgstr "Historial" #: ../variety.desktop.in.h:7 msgid "Preferences" msgstr "Preferencias" #: ../data/plugins/quotes/LocalFilesSource.py:34 msgid "" "Displays quotes, defined in local text files.\n" "Put your own txt files in: ~/.config/variety/pluginconfig/quotes/.\n" "The file format is:\n" "\n" "quote -- author\n" ".\n" "second quote -- another author\n" ".\n" "etc...\n" "\n" "Example: http://rvelthuis.de/zips/quotes.txt" msgstr "" "Muestra citas, definidas en archivos de texto locales.\n" "Ponga sus propios archivos txt en: ~/.config/variety/pluginconfig/quotes/.\n" "El formato del archivo es:\n" "\n" "cita -- autor\n" ".\n" "segunda cita -- otro autor\n" ".\n" "etc.\n" "\n" "Ejemplo: http://rvelthuis.de/zips/quotes.txt" #: ../variety/indicator.py:49 ../variety/indicator.py:96 #: ../variety/indicator.py:166 msgid "_Next" msgstr "_Siguiente" #: ../variety/indicator.py:54 ../variety/indicator.py:101 #: ../variety/indicator.py:171 msgid "_Previous" msgstr "_Anterior" #: ../variety/indicator.py:61 msgid "Current desktop wallpaper" msgstr "Fondo de pantalla actual" #: ../variety/indicator.py:65 msgid "Show origin" msgstr "Mostrar origen" #: ../variety/indicator.py:106 ../variety/indicator.py:176 msgid "_Next, skipping forward history" msgstr "" #: ../variety/indicator.py:114 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:124 msgid "_Image" msgstr "_Imagen" #: ../variety/indicator.py:135 msgid "Show without effects" msgstr "Mostrar sin efectos" #: ../variety/indicator.py:143 msgid "Google Image Search" msgstr "Búsqueda de imágenes de Google" #: ../variety/indicator.py:196 msgid "View Favorites..." msgstr "Ver favoritos…" #: ../variety/indicator.py:203 msgid "Copy to Clipboard" msgstr "Copiar al portapapeles" #: ../variety/indicator.py:213 msgid "Google Quote" msgstr "Cita de Google" #: ../variety/indicator.py:218 msgid "Google Author" msgstr "Autor de Google" #: ../variety/indicator.py:230 ../variety/indicator.py:284 msgid "Preferences..." msgstr "Preferencias…" #: ../variety/indicator.py:238 msgid "Turn off" msgstr "Apagar" #: ../variety/indicator.py:244 msgid "_Quote" msgstr "" #: ../variety/indicator.py:251 msgid "_History" msgstr "_Histórico" #: ../variety/indicator.py:257 msgid "_Wallpaper Selector" msgstr "Selector de _fondos" #: ../variety/indicator.py:263 msgid "Recent _Downloads" msgstr "_Descargas recientes" #: ../variety/indicator.py:278 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:288 msgid "About" msgstr "Acerca de" #: ../variety/indicator.py:292 msgid "Quit" msgstr "Salir" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:1 msgid "Copy to Favorites vs. Move to Favorites" msgstr "Copiar a favoritos o mover a favoritos" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:2 msgid "Reset to Default" msgstr "Restablecer valores predeterminados" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:3 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.h:4 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" #: ../variety/ImageFetcher.py:56 ../variety/ImageFetcher.py:103 msgid "Fetching" msgstr "Obteniendo" #. too small - delete and do not use #: ../variety/ImageFetcher.py:118 msgid "Image too small, ignoring it" msgstr "La imagen es demasiado pequeña, se ignorará" #: ../variety/ImageFetcher.py:140 #, python-format msgid "Sorry, got %s error..." msgstr "Se obtuvo el error %s…" #: ../variety/ImageFetcher.py:141 msgid "This means the link is no longer valid" msgstr "Eso significa que el enlace no es válido" #: ../variety/ImageFetcher.py:144 msgid "Fetch failed for some reason" msgstr "Falló la descarga por algún motivo" #: ../variety/ImageFetcher.py:145 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/po/variety.pot0000664000000000000000000017032212655733122012271 0ustar # 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: 2016-02-07 22:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: ../data/plugins/quotes/GoodreadsSource.py:49 msgid "Fetches quotes from Goodreads.com" msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:1 msgid "Login to VRTY.ORG" msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:2 msgid "Username: " msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:3 msgid "Password: " msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:4 msgid "No account? Register here" msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:5 msgid "Forgot your password?" msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:6 msgid "" "Tip: You can also login to VRTY.ORG in a " "browser and click the link \"Trigger Variety login\" in your profile." msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:7 msgid "Login" msgstr "" #: ../variety/LoginOrRegisterDialog.py:80 #, python-format msgid "Oops, server returned error (%s)" msgstr "" #: ../variety/LoginOrRegisterDialog.py:85 msgid "Could not connect to server" msgstr "" #: ../variety/AddWallhavenDialog.py:38 ../variety/AddWallbaseDialog.py:38 #: ../variety/AddFlickrDialog.py:138 msgid "No images found" msgstr "" #: ../data/ui/AddPanoramioDialog.ui.h:1 msgid "Variety - add Panoramio image source" msgstr "" #. (_("Wallbase.cc"), self.on_add_wallbase_clicked), #: ../data/ui/AddPanoramioDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:388 msgid "Panoramio" msgstr "" #: ../data/ui/AddPanoramioDialog.ui.h:3 msgid "Please zoom over your area of interest." msgstr "" #: ../variety/FolderChooser.py:65 msgid "Choose a folder" msgstr "" #: ../variety/FolderChooser.py:66 ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Cancel" msgstr "" #: ../variety/FolderChooser.py:66 msgid "OK" msgstr "" #: ../data/ui/AddWallhavenDialog.ui.h:1 msgid "Variety - add Wallhaven.cc image source" msgstr "" #: ../data/ui/AddWallhavenDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:386 msgid "Wallhaven.cc" msgstr "" #: ../data/ui/AddWallhavenDialog.ui.h:3 msgid "" "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." msgstr "" #: ../data/ui/AddWallhavenDialog.ui.h:8 ../data/ui/AddWallbaseDialog.ui.h:9 msgid "Enter keywords or paste URL here: " msgstr "" #: ../data/ui/AddWallhavenDialog.ui.h:9 ../data/ui/AddFlickrDialog.ui.h:16 #: ../data/ui/AddWallbaseDialog.ui.h:10 msgid "Just a moment to check this search" msgstr "" #: ../data/ui/AddWallhavenDialog.ui.h:10 ../data/ui/AddFlickrDialog.ui.h:17 #: ../data/ui/AddRedditDialog.ui.h:9 ../data/ui/AddMediaRssDialog.ui.h:6 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:10 #: ../data/ui/AddWallbaseDialog.ui.h:11 msgid " " msgstr "" #: ../variety/QuotesEngine.py:232 msgid "No quote plugins" msgstr "" #: ../variety/QuotesEngine.py:232 msgid "There are no quote plugins installed" msgstr "" #: ../variety/QuotesEngine.py:238 msgid "No suitable quote plugins" msgstr "" #: ../variety/QuotesEngine.py:239 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "" #: ../variety/QuotesEngine.py:251 msgid "Could not fetch quotes" msgstr "" #: ../variety/QuotesEngine.py:252 msgid "Quotes services may be down, we will continue trying" msgstr "" #: ../variety/QuotesEngine.py:255 msgid "Could not find quotes" msgstr "" #: ../variety/QuotesEngine.py:256 msgid "Maybe you are searching for something very obscure?" msgstr "" #: ../variety/Texts.py:20 msgid "Keep original" msgstr "" #: ../variety/Texts.py:21 msgid "Grayscale" msgstr "" #: ../variety/Texts.py:22 msgid "Heavy blur" msgstr "" #: ../variety/Texts.py:23 msgid "Soft blur" msgstr "" #: ../variety/Texts.py:24 msgid "Oil painting" msgstr "" #: ../variety/Texts.py:25 msgid "Pencil sketch" 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:37 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:38 msgid "Random wallpapers from Desktoppr.co" msgstr "" #: ../variety/Texts.py:39 msgid "NASA's Astronomy Picture of the Day" msgstr "" #: ../variety/Texts.py:41 msgid "World Sunlight Map - live wallpaper from Die.net" msgstr "" #: ../variety/Texts.py:42 msgid "Bing Photo of the Day" msgstr "" #: ../variety/Texts.py:43 msgid "High-resolution photos from Unsplash.com" msgstr "" #: ../variety/Texts.py:47 msgid "" "If you use KDE, you need to perform some actions before Variety will work. " "Please read here: http://peterlevi.com/variety/2014/05/variety-and-kde/" msgstr "" #: ../variety/Texts.py:48 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" #: ../variety/Texts.py:49 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 ~/." "config/variety/scripts. There are examples there for various desktop " "environments." msgstr "" #: ../variety/Texts.py:50 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:51 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:52 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:53 msgid "" "Adding your own custom filters is quite easy: open ~/.config/variety/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:54 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:55 msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of ~/.config/variety/scripts/set_wallpaper." msgstr "" #: ../variety/Texts.py:56 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:57 msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "~/.config/variety/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/PreferencesVarietyDialog.py:259 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:382 #: ../variety/PreferencesVarietyDialog.py:551 #: ../data/ui/PreferencesVarietyDialog.ui.h:11 msgid "Images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:383 msgid "Folders" msgstr "" #: ../variety/PreferencesVarietyDialog.py:385 #: ../data/ui/AddFlickrDialog.ui.h:2 msgid "Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:389 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:2 msgid "Wallpapers.net" msgstr "" #: ../variety/PreferencesVarietyDialog.py:390 #: ../data/ui/AddRedditDialog.ui.h:2 msgid "Reddit" msgstr "" #: ../variety/PreferencesVarietyDialog.py:391 #: ../data/ui/AddMediaRssDialog.ui.h:2 msgid "Media RSS" msgstr "" #: ../variety/PreferencesVarietyDialog.py:416 msgid "Remove the source, keep the files" msgstr "" #: ../variety/PreferencesVarietyDialog.py:417 msgid "Remove the sources, keep the files" msgstr "" #: ../variety/PreferencesVarietyDialog.py:424 msgid "Remove the source and delete the downloaded files" msgstr "" #: ../variety/PreferencesVarietyDialog.py:425 msgid "Remove the sources and delete the downloaded files" msgstr "" #: ../variety/PreferencesVarietyDialog.py:458 msgid "World Sunlight Map enabled" msgstr "" #: ../variety/PreferencesVarietyDialog.py:459 msgid "" "Using the World Sunlight Map requires both downloading and changing enabled " "at intervals of 30 minutes or less. Settings were adjusted automatically." msgstr "" #: ../variety/PreferencesVarietyDialog.py:544 msgid "Add Images" msgstr "" #: ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Add" msgstr "" #: ../variety/PreferencesVarietyDialog.py:567 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "" #: ../variety/PreferencesVarietyDialog.py:703 #: ../variety/PreferencesVarietyDialog.py:716 #: ../data/ui/PreferencesVarietyDialog.ui.h:168 msgid "Edit..." msgstr "" #: ../variety/PreferencesVarietyDialog.py:710 msgid "View Image" msgstr "" #: ../variety/PreferencesVarietyDialog.py:713 msgid "Open Folder" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1092 msgid "Recommended images source disabled" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1120 #: ../variety/PreferencesVarietyDialog.py:1139 #: ../variety/PreferencesVarietyDialog.py:1147 msgid "No write permissions" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1127 msgid "Limit disabled" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1128 msgid "" "Changing the download folder automatically turns off the size limit to " "prevent from accidental data loss" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1134 #, python-format msgid "Actual download folder: %s " msgstr "" #: ../variety/PreferencesVarietyDialog.py:1214 msgid "Could not adjust permissions" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1215 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1247 msgid "Logged in as: " msgstr "" #: ../variety/PreferencesVarietyDialog.py:1249 msgid "Anonymous" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1250 #: ../data/ui/PreferencesVarietyDialog.ui.h:109 msgid "Login or register" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1250 msgid "Switch user" msgstr "" #: ../data/ui/AddFlickrDialog.ui.h:1 msgid "Variety - add Flickr as an image source" msgstr "" #: ../data/ui/AddFlickrDialog.ui.h:3 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.h:4 #: ../data/ui/PreferencesVarietyDialog.ui.h:58 msgid "Tags: " msgstr "" #: ../data/ui/AddFlickrDialog.ui.h:5 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.h:7 msgid "User: " msgstr "" #: ../data/ui/AddFlickrDialog.ui.h:8 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.h:10 msgid "Group: " msgstr "" #: ../data/ui/AddFlickrDialog.ui.h:11 msgid "" "Please insert the group's URL.\n" "Example: http://www." "flickr.com/groups/wallpapers/" msgstr "" #: ../data/ui/AddFlickrDialog.ui.h:13 msgid "Text:" msgstr "" #: ../data/ui/AddFlickrDialog.ui.h:14 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by " "prepending them with -.\n" "Example: apple -pie" msgstr "" #: ../variety/AddMediaRssDialog.py:40 msgid "" "This does not seem to be a valid Media RSS feed URL or there is no content " "there." msgstr "" #: ../variety/VarietyWindow.py:630 ../variety/VarietyWindow.py:772 #: ../variety/VarietyWindow.py:2650 msgid "Already in Favorites" msgstr "" #: ../variety/VarietyWindow.py:634 ../variety/ThumbsManager.py:144 #: ../variety/indicator.py:76 msgid "Copy to _Favorites" msgstr "" #: ../variety/VarietyWindow.py:635 ../variety/ThumbsManager.py:151 msgid "Move to _Favorites" msgstr "" #. both #: ../variety/VarietyWindow.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:165 ../variety/indicator.py:81 msgid "Move to Favorites" msgstr "" #: ../variety/VarietyWindow.py:665 ../variety/ThumbsManager.py:119 msgid "Fetched: Show Origin" msgstr "" #: ../variety/VarietyWindow.py:667 ../variety/VarietyWindow.py:762 #: ../variety/ThumbsManager.py:121 #, python-format msgid "View at %s" msgstr "" #: ../variety/VarietyWindow.py:711 msgid "Unknown" msgstr "" #: ../variety/VarietyWindow.py:732 #, python-format msgid "Author: %s" msgstr "" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 #: ../variety/indicator.py:120 ../variety/indicator.py:185 msgid "Pause on current" msgstr "" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 msgid "Resume regular changes" msgstr "" #: ../variety/VarietyWindow.py:772 ../variety/indicator.py:191 msgid "Save to Favorites" msgstr "" #: ../variety/VarietyWindow.py:904 msgid "Filtering too strict?" msgstr "" #: ../variety/VarietyWindow.py:905 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "" #: ../variety/VarietyWindow.py:1377 msgid "Please add more image sources or wait for some downloads" msgstr "" #: ../variety/VarietyWindow.py:1379 msgid "Please add more image sources" msgstr "" #: ../variety/VarietyWindow.py:1380 msgid "No more wallpapers" msgstr "" #: ../variety/VarietyWindow.py:1566 msgid "Current wallpaper is not in the image sources" msgstr "" #: ../variety/VarietyWindow.py:1601 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "" #: ../variety/VarietyWindow.py:1603 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "" #: ../variety/VarietyWindow.py:1623 ../variety/VarietyWindow.py:1643 msgid "Cannot delete" msgstr "" #: ../variety/VarietyWindow.py:1624 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "" #: ../variety/VarietyWindow.py:1644 msgid "" "Probably there is no utility for moving to Trash?\n" "Please install trash-cli or gvfs-bin or konquerer." msgstr "" #: ../variety/VarietyWindow.py:1776 msgid "Anonymous usage statistics" msgstr "" #: ../variety/VarietyWindow.py:1777 msgid "" "Variety collects anonymous usage statistics. \n" "These help us make it better and are not shared with anyone. \n" "To read more or turn them off, go to \"Sync and social\"" msgstr "" #: ../variety/VarietyWindow.py:1920 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:1945 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 /some/local/image.jpg --next" msgstr "" #: ../variety/VarietyWindow.py:1955 msgid "" "Show logging messages (-vv shows even finer debugging messages, -vvv debugs " "variety_lib too)" msgstr "" #: ../variety/VarietyWindow.py:1959 msgid "Make the running instance quit" msgstr "" #: ../variety/VarietyWindow.py:1963 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "" #: ../variety/VarietyWindow.py:1967 msgid "Show Next wallpaper" msgstr "" #: ../variety/VarietyWindow.py:1971 msgid "Show Previous wallpaper" msgstr "" #: ../variety/VarietyWindow.py:1975 msgid "Show Next wallpaper, skipping the forward history" msgstr "" #: ../variety/VarietyWindow.py:1979 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "" #: ../variety/VarietyWindow.py:1983 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" #: ../variety/VarietyWindow.py:1987 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "" #: ../variety/VarietyWindow.py:1991 msgid "Pause on current image" msgstr "" #: ../variety/VarietyWindow.py:1995 msgid "Resume regular image changes" msgstr "" #: ../variety/VarietyWindow.py:1999 msgid "Toggle Pause/Resume state" msgstr "" #: ../variety/VarietyWindow.py:2003 msgid "Show Next quote" msgstr "" #: ../variety/VarietyWindow.py:2007 msgid "Show Previous quote" msgstr "" #: ../variety/VarietyWindow.py:2011 msgid "Show Next quote, skipping the forward history" msgstr "" #: ../variety/VarietyWindow.py:2015 msgid "Toggle Quotes Pause/Resume state" msgstr "" #: ../variety/VarietyWindow.py:2019 msgid "Save the current quote to Favorites" msgstr "" #: ../variety/VarietyWindow.py:2023 msgid "Toggle History display" msgstr "" #: ../variety/VarietyWindow.py:2027 msgid "Toggle Recent Downloads display" msgstr "" #: ../variety/VarietyWindow.py:2031 msgid "Show Preferences dialog" msgstr "" #: ../variety/VarietyWindow.py:2035 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" #: ../variety/VarietyWindow.py:2039 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/VarietyWindow.py:2053 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "" #: ../variety/VarietyWindow.py:2056 msgid "options --trash and --favorite are mutually exclusive" msgstr "" #: ../variety/VarietyWindow.py:2059 msgid "options --pause and --resume are mutually exclusive" msgstr "" #: ../variety/VarietyWindow.py:2062 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "" #: ../variety/VarietyWindow.py:2179 ../variety/ImageFetcher.py:60 #: ../variety/ImageFetcher.py:71 ../variety/ImageFetcher.py:78 #: ../variety/ImageFetcher.py:112 msgid "Not an image" msgstr "" #: ../variety/VarietyWindow.py:2184 msgid "Added to queue" msgstr "" #: ../variety/VarietyWindow.py:2185 ../variety/VarietyWindow.py:2191 msgid "Press Next to see it" msgstr "" #: ../variety/VarietyWindow.py:2191 msgid "Fetched" msgstr "" #: ../variety/VarietyWindow.py:2237 msgid "Unsupported source type" msgstr "" #: ../variety/VarietyWindow.py:2238 ../variety/VarietyWindow.py:2286 msgid "Are you running the most recent version of Variety?" msgstr "" #: ../variety/VarietyWindow.py:2244 msgid "New image source added" msgstr "" #: ../variety/VarietyWindow.py:2246 msgid "Image source already exists, enabling it" msgstr "" #: ../variety/VarietyWindow.py:2272 msgid "Fetched and applied" msgstr "" #: ../variety/VarietyWindow.py:2282 msgid "It works!" msgstr "" #: ../variety/VarietyWindow.py:2282 msgid "Yay, Variety links work. Great!" msgstr "" #: ../variety/VarietyWindow.py:2286 msgid "Unsupported command" msgstr "" #: ../variety/VarietyWindow.py:2288 msgid "Could not process the given variety:// URL" msgstr "" #: ../variety/VarietyWindow.py:2289 msgid "Run with logging enabled to see details" msgstr "" #: ../variety/VarietyWindow.py:2488 msgid "Do not ask anymore, always use the current quote" msgstr "" #: ../variety/VarietyWindow.py:2491 ../data/ui/FacebookPublishDialog.ui.h:5 msgid "Do not ask anymore, always use the text above" msgstr "" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "Published" msgstr "" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "You may open your Facebook feed to see the post" msgstr "" #: ../variety/VarietyWindow.py:2526 ../variety/VarietyWindow.py:2555 msgid "Could not publish" msgstr "" #: ../variety/VarietyWindow.py:2718 msgid "Could not create autostart entry" msgstr "" #: ../variety/VarietyWindow.py:2719 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:2769 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:2769 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/FacebookFirstRunDialog.ui.h:1 msgid "Variety - Facebook Sharing" msgstr "" #: ../data/ui/FacebookFirstRunDialog.ui.h:2 #: ../data/ui/PreferencesVarietyDialog.ui.h:169 msgid "Facebook Sharing" msgstr "" #: ../data/ui/FacebookFirstRunDialog.ui.h:3 msgid "" "You are sharing on Facebook for the first time. Sharing from Variety is " "available for images that come from online sources and for quotes. It works " "this way: \n" "\n" "1. Login to Facebook\n" "Facebook will open in your default browser. You will be prompted to login if " "you are not already logged in. \n" "\n" "2. Authorize Variety to publish to your feed.\n" "You will be asked to allow Variety to publish to your feed on your behalf. " "Variety will only use this permission to publish those images and quotes " "that you tell it to, nothing else.\n" "\n" "3. Configure browser to open variety:// links " "with Variety or xdg-open\n" "Then you will be redirected to a page with instructions to associate " "\"variety://\" links with Variety in your browser. Please follow these " "instructions to complete the setup. You have to do this only once.\n" "\n" "No passwords or login information is kept locally, just an OAuth Facebook " "token that will be valid for a couple of weeks. After its validity expires " "you will be asked to login again." msgstr "" #: ../variety/AddWallpapersNetCategoryDialog.py:40 msgid "Could not find wallpapers there. Please check the URL." msgstr "" #: ../data/ui/WelcomeDialog.ui.h:1 msgid "Welcome to Variety!" msgstr "" #: ../data/ui/WelcomeDialog.ui.h:2 ../data/ui/SmartFeaturesNoticeDialog.ui.h:3 msgid "Continue" msgstr "" #: ../data/ui/WelcomeDialog.ui.h:3 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.h:4 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.h:5 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" #: ../data/ui/WelcomeDialog.ui.h:6 msgid "KDE Users - Important, please read:" msgstr "" #: ../data/ui/WelcomeDialog.ui.h:7 msgid "" "You appear to be running KDE. In KDE 4 it is impossible to set the wallpaper " "from inside a program - there is no API for this. To make Variety work, please read " "and follow the instructions here." msgstr "" #: ../data/ui/AddRedditDialog.ui.h:1 msgid "Variety - add Reddit feed" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:3 msgid "" "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" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:7 msgid "URL or name of a subreddit: " msgstr "" #: ../data/ui/AddRedditDialog.ui.h:8 msgid "Just a moment to check what's there" msgstr "" #: ../data/ui/AddMediaRssDialog.ui.h:1 msgid "Variety - add Media RSS feed" msgstr "" #: ../data/ui/AddMediaRssDialog.ui.h:3 msgid "" "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." msgstr "" #: ../data/ui/AddMediaRssDialog.ui.h:4 msgid "Paste the URL of the Media RSS feed here: " msgstr "" #: ../data/ui/AddMediaRssDialog.ui.h:5 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:9 msgid "Just a moment to check what's at that URL" msgstr "" #: ../variety/AddRedditDialog.py:43 msgid "This does not seem to be a valid Reddit URL" msgstr "" #: ../variety/AddRedditDialog.py:46 msgid "We could not find any image submissions there." msgstr "" #: ../variety/Smart.py:111 msgid "" "Your smart_user.json config file appears broken. You may have to login again " "to VRTY.ORG." msgstr "" #: ../variety/Smart.py:195 msgid "Your VRTY.ORG credentials are probably outdated. Please login again." msgstr "" #: ../variety/Smart.py:597 ../variety/Smart.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:111 msgid "Sync" msgstr "" #: ../variety/Smart.py:598 #, python-format msgid "Fetching %d images" msgstr "" #: ../variety/Smart.py:598 msgid "Fetching 1 image" msgstr "" #: ../variety/Smart.py:643 msgid "Finished" msgstr "" #: ../variety/Smart.py:664 #, python-format msgid "Logged in as %s" msgstr "" #: ../variety/Smart.py:676 #, python-format msgid "" "Do you want to login to VRTY.ORG as %s?" msgstr "" #: ../variety/Smart.py:677 msgid "VRTY.ORG login confirmation" msgstr "" #: ../data/plugins/quotes/QuotationsPageSource.py:35 msgid "Fetches quotes from TheQuotationsPage.com" msgstr "" #: ../variety/__init__.py:143 msgid "Terminating signal received, quitting..." msgstr "" #: ../variety/__init__.py:198 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:1 msgid "VRTY.ORG integration" msgstr "" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:2 msgid "This feature requires VRTY.ORG integration" msgstr "" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:3 msgid "Enable VRTY.ORG integration" msgstr "" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:4 msgid "" "For this feature Variety needs permission to collect data about the images " "you like or dislike and the online sources you have enabled.\n" "\n" "Collected data is anonymous by default and covers only images which Variety " "downloaded, never images you already had in your local folders that might be " "private.\n" "\n" "This data helps us provide better images for everyone and fuels VRTY.ORG - a valuable resource for all users of " "Variety." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:1 msgid "Variety - VRTY.ORG" msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:2 msgid "No, thanks" msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:4 msgid "" "Introducing VRTY.ORG! Wanna take part?" msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:5 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to find and add new image sources to Variety, and to follow other users' " "favorites." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:6 msgid "" "Participation takes no effort - your profile will be built automatically, as " "you like or dislike images downloaded by Variety. Your profile will not be " "shared with third parties, unless you opt-in to make it public. Read more details about the " "service and the privacy policy here." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:7 msgid "" "Participation is required for some features of Variety such as synchronization of favorites between computers." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:8 #: ../data/ui/PreferencesVarietyDialog.ui.h:105 msgid "Participate in VRTY.ORG" msgstr "" #: ../data/plugins/quotes/QuotesDaddySource.py:31 msgid "" "Fetches quotes from QuotesDaddy's daily quotes RSS feed.\n" "Does not support searching by tags or authors." msgstr "" #: ../data/ui/AboutVarietyDialog.ui.h:1 msgid "Copyright (c) 2012, Peter Levi " msgstr "" #: ../data/ui/AboutVarietyDialog.ui.h:2 msgid "About Variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui.h:3 msgid "An automatic wallpaper changer, downloader and manager." msgstr "" #: ../data/ui/AboutVarietyDialog.ui.h:4 msgid "http://peterlevi.com/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui.h:5 msgid "" "# Copyright (c) 2012, Peter Levi \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/AddWallpapersNetCategoryDialog.ui.h:1 msgid "Variety - add Wallpapers.net category" msgstr "" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:3 msgid "" "Please visit wallpapers.net and choose " "a category with wallpapers, then paste its URL below. A category is " "anything on the site that has one or more pages with wallpapers on them. " "Here are some examples:\n" "\n" "All wallpapers: http://www.wallpapers." "net/\n" "Specific resolution: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" msgstr "" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:8 msgid "Paste URL here: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:1 msgid "seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:2 msgid "minutes" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:3 msgid "hours" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:4 msgid "days" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:5 msgid "Variety Preferences" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:6 msgid "General" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:7 msgid "Start Variety when the computer starts" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:8 msgid "Change wallpaper every " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:9 msgid "Minimum interval is 5 seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:10 msgid "Change wallpaper on start" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:12 msgid "Enabled" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:13 msgid "Type" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:14 msgid "Location" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:15 msgid "_Add..." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:16 msgid "Add images, folders or online image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:17 msgid "_Edit..." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:18 msgid "Edit the selected source" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:19 msgid "_Remove..." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:20 msgid "Remove selected image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:21 msgid "_Use" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:22 msgid "Enable the selected sources and disable all others" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:23 msgid "Download a wallpaper every " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:24 msgid "Minimum interval is one minute" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:25 msgid "to " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:26 msgid "Actual download folder " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:27 msgid "" "Caution: do NOT use this option if you use a custom download folder with " "valuable files in it. Variety will maintain the limit regardless of what is " "in the download folder." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:28 msgid "Limit download folder to " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:29 msgid "Minimum size is 50 MB" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:30 msgid "MB by deleting oldest files when necessary" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:31 msgid "Favorites" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:32 msgid "Copy favorite wallpapers to " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:33 msgid "Filters" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:34 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:35 msgid "Quotes" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:36 msgid "Show random wise quotes on the desktop" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:37 msgid "Text color: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:38 msgid "Text font: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:39 msgid "Backdrop color: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:40 msgid "Backdrop opacity: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:41 msgid " Transparent" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:42 msgid "Opaque" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:43 msgid "Draw a text shadow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:44 msgid "Appearance" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:45 msgid "Quotes area width: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:46 msgid "Narrow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:47 msgid "Wide" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:48 msgid "Horizontal position: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:49 msgid "Left " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:50 ../variety/ThumbsManager.py:44 msgid "Right" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:51 msgid "Vertical position: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:52 msgid "Top " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:53 ../variety/ThumbsManager.py:41 msgid "Bottom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:54 msgid "Placement" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:55 msgid "Show quotes from these sources: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:56 msgid "" "More plugins" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:57 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:59 msgid "Example: funny, inspirational" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:60 msgid "Example: Albert Einstein, Voltaire" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:61 msgid "Authors: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:62 msgid "Sources and filtering" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:63 msgid "Change quote every " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:64 msgid "Minimum interval is 10 seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:65 msgid "Regular change" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:66 msgid "Clock" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:67 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:68 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.h:69 msgid "Clock font: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:70 msgid "Date font: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:71 msgid "" "These don't work? Read here. How to further configure the clock? Read here." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:72 msgid "Effects" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:73 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:74 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:75 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:76 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:77 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:78 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:79 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:80 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:81 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:82 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:83 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:84 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:85 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:86 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:87 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:88 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:89 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:90 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:91 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:92 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:93 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:94 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:95 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:96 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:97 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:98 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:99 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:100 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:101 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:102 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:103 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:104 msgid "VRTY.ORG" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:106 msgid "VRTY.ORG is in beta and will take some time to mature" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:107 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to add new image sources to Variety, and to follow other users' favorites. " "It is fueled by the favorite images of all participating users." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:108 msgid "" "Could not create user - no connection to VRTY.ORG. We will try again later." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:110 msgid "" "Registration enables cool features like synchronization of favorite images " "and sources between computers and personalized recommendations." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:112 msgid "Synchronize favorite images between computers" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:113 msgid "Requires VRTY.ORG enabled and logged in." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:114 msgid "" "Your favorite images from other computers will be automatically downloaded " "to this computer. You need to be logged in with the same VRTY.ORG user " "everywhere. Sync will not delete any images." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:115 msgid "Privacy policy" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:116 msgid "" "Variety sends data only for images it downloaded, never for images you " "already had in your local folders that might be private, and Sync does not " "work for such images. Collected data is not shared with third parties, " "unless you opt-in to make your profile public. Read more details about the service and the privacy " "policy here." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:117 msgid "Usage statistics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:118 msgid "Help make Variety better by sending anonymous usage statistics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:119 msgid "" "These stats help us improve Variety by understanding how users interact with " "it. They also include general info about your OS version and monitor setup. " "Collected data is not shared with anyone." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:120 msgid "Sync and social" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:121 msgid "Fetch folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:122 msgid "Save manually downloaded wallpapers to " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:123 msgid "Drag and drop" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:124 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.h:126 msgid "Clipboard monitoring" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:127 msgid "Monitor clipboard for image URLs and fetch them" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:128 msgid "But fetch only when the URL host is one of these:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:129 msgid "Manual downloading" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:130 msgid "When possible use images that:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:131 ../variety/ThumbsManager.py:98 msgid "Size" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:132 msgid "Have landscape orientation" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:133 msgid "Are big at least " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:134 msgid "50" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:135 msgid "80" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:136 msgid "100" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:138 #, no-c-format msgid "% of the screen resolution" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:139 msgid "Color" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:140 msgid "Are dark or light:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:141 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:142 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:143 msgid "Contain this color: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:144 msgid "(Takes effect after some initial searching)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:145 msgid "Rating" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:146 msgid "Have EXIF rating at least " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:147 msgid "1" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:148 msgid "2" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:149 msgid "3" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:150 msgid "4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:151 msgid "5" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:152 msgid "Color and size" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:153 msgid "Indicator Icon" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:154 msgid "Indicator icon:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:155 msgctxt "Icon option" msgid "Light" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:156 msgctxt "Icon option" msgid "Dark" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:157 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:158 msgctxt "Icon option" msgid "Custom image..." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:159 msgctxt "Icon option" msgid "None" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:160 msgid "Select an icon" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:161 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.h:162 msgid "Favorites Operations" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:163 msgid "Favorites operations to show in main menu:" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:164 msgid "Copy to Favorites" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:166 msgid "Both Copy and Move" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:167 msgid "Depends on folder..." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:170 msgid "Display dialog to customize the Facebook post before publishing" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:171 msgid "Login Screen Support" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:172 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:173 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.h:174 msgid "Copy wallpaper image files to this folder: " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:175 msgid "Reset to default" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:176 msgid "Still doesn't work?" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:177 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:178 msgid "You don't have write permissions for this folder." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:179 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:180 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:181 msgid "Customize" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:182 msgid "Tips and tricks" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:183 msgid "Recent changes" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:184 msgid "Visit website" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:185 msgid "Report a bug or request a feature" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:186 msgid "Send feedback" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:187 msgid "Donate to Variety" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:188 msgid "Donate via PayPal" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:189 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.h:193 msgid "" "For Bitcoin and other payment methods please go to Variety's website." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:194 msgid "Donate" msgstr "" #: ../variety/FacebookHelper.py:116 msgid "Authorization successful" msgstr "" #: ../variety/FacebookHelper.py:116 msgid "Publishing..." msgstr "" #: ../variety/FacebookHelper.py:121 msgid "Authorization failed" msgstr "" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "" #: ../variety/ThumbsManager.py:94 msgid "Position" msgstr "" #: ../variety/ThumbsManager.py:109 msgid "Show Containing Folder" msgstr "" #: ../variety/ThumbsManager.py:136 ../variety/indicator.py:156 msgid "Set EXIF Rating" msgstr "" #: ../variety/ThumbsManager.py:160 ../variety/indicator.py:87 msgid "Delete to _Trash" msgstr "" #: ../variety/ThumbsManager.py:167 ../variety/indicator.py:131 msgid "Where is it from?" msgstr "" #: ../variety/ThumbsManager.py:178 msgid "Close" msgstr "" #: ../variety/ThumbsManager.py:198 msgid "Could not set EXIF rating" msgstr "" #: ../variety/ThumbsManager.py:217 msgid "Unrated" msgstr "" #: ../variety/ThumbsManager.py:224 msgid "Rejected" msgstr "" #: ../variety/ThumbsManager.py:324 msgid "Variety History" msgstr "" #: ../variety/ThumbsManager.py:326 msgid "Variety Recent Downloads" msgstr "" #: ../variety/ThumbsManager.py:328 msgid "Variety Images" msgstr "" #: ../data/ui/AddWallbaseDialog.ui.h:1 msgid "Variety - add Wallbase.cc image source" msgstr "" #: ../data/ui/AddWallbaseDialog.ui.h:2 msgid "Wallbase.cc" msgstr "" #: ../data/ui/AddWallbaseDialog.ui.h:3 msgid "" "Wallbase.cc is permanently down. Use Wallhaven.cc instead. Support for " "Wallbase.cc will be dropped completely in a future release, please remove or " "update your existing Wallbase sources." msgstr "" #: ../data/ui/AddWallbaseDialog.ui.h:4 msgid "" "Wallbase.cc provides a variety of image " "search options. Below you can specify keywords to search for, or visit Wallbase.cc, setup your search criteria " "there, ensure you like the results, and paste the full Wallbase URL in the " "box.\n" "\n" "If you specify keywords, the most liked safe-for-work images that match any " "of the keywords will be used. \n" "\n" "If you specify a Wallbase 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." msgstr "" #: ../data/ui/FacebookPublishDialog.ui.h:1 msgid "Variety - Publish to Facebook" msgstr "" #: ../data/ui/FacebookPublishDialog.ui.h:2 ../variety/indicator.py:149 #: ../variety/indicator.py:223 msgid "Share on Facebook" msgstr "" #: ../data/ui/FacebookPublishDialog.ui.h:3 msgid "" "Publish a link to the current wallpaper on Facebook. Include this text along " "with the link (or just leave empty):" msgstr "" #: ../data/ui/FacebookPublishDialog.ui.h:4 msgid "Use current quote" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:1 msgid "Variety - VRTY.ORG registration" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:2 msgid "Would you like to register?" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:3 msgid "" "You may participate in VRTY.ORG " "anonymously, but registration enables some very nice features, such as synchronization of favorites between computers and " "personalized recommendations. It also ensures " "you will not lose your profile and favorite wallpapers if you reinstall your " "OS." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:4 msgid "Registration is very easy and does not require any personal data." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:5 msgid "" "If you choose to participate anonymously, you can register later from the " "\"Sync and social\" page in Preferences." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:6 msgid "" "Oops, we could not connect to VRTY.ORG. Server might be down. Please wait a " "couple of minutes and try again or choose " "\"Participate anonymously\" and register later from the \"Sync and social\" page in Preferences." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:7 msgid "" "Please continue the registration and follow the instructions in the browser " "tab we opened." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:8 msgid "I will participate anonymously" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:9 msgid "I'm registered, let me login" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:10 msgid "Register here" msgstr "" #: ../variety.desktop.in.h:1 msgid "Variety" msgstr "" #: ../variety.desktop.in.h:2 msgid "Variety Wallpaper Changer" msgstr "" #: ../variety.desktop.in.h:3 msgid "Next" msgstr "" #: ../variety.desktop.in.h:4 msgid "Previous" msgstr "" #: ../variety.desktop.in.h:5 msgid "Pause / Resume" msgstr "" #: ../variety.desktop.in.h:6 msgid "History" msgstr "" #: ../variety.desktop.in.h:7 msgid "Preferences" msgstr "" #: ../data/plugins/quotes/LocalFilesSource.py:34 msgid "" "Displays quotes, defined in local text files.\n" "Put your own txt files in: ~/.config/variety/pluginconfig/quotes/.\n" "The file format is:\n" "\n" "quote -- author\n" ".\n" "second quote -- another author\n" ".\n" "etc...\n" "\n" "Example: http://rvelthuis.de/zips/quotes.txt" msgstr "" #: ../variety/indicator.py:49 ../variety/indicator.py:96 #: ../variety/indicator.py:166 msgid "_Next" msgstr "" #: ../variety/indicator.py:54 ../variety/indicator.py:101 #: ../variety/indicator.py:171 msgid "_Previous" msgstr "" #: ../variety/indicator.py:61 msgid "Current desktop wallpaper" msgstr "" #: ../variety/indicator.py:65 msgid "Show origin" msgstr "" #: ../variety/indicator.py:106 ../variety/indicator.py:176 msgid "_Next, skipping forward history" msgstr "" #: ../variety/indicator.py:114 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" #: ../variety/indicator.py:124 msgid "_Image" msgstr "" #: ../variety/indicator.py:135 msgid "Show without effects" msgstr "" #: ../variety/indicator.py:143 msgid "Google Image Search" msgstr "" #: ../variety/indicator.py:196 msgid "View Favorites..." msgstr "" #: ../variety/indicator.py:203 msgid "Copy to Clipboard" msgstr "" #: ../variety/indicator.py:213 msgid "Google Quote" msgstr "" #: ../variety/indicator.py:218 msgid "Google Author" msgstr "" #: ../variety/indicator.py:230 ../variety/indicator.py:284 msgid "Preferences..." msgstr "" #: ../variety/indicator.py:238 msgid "Turn off" msgstr "" #: ../variety/indicator.py:244 msgid "_Quote" msgstr "" #: ../variety/indicator.py:251 msgid "_History" msgstr "" #: ../variety/indicator.py:257 msgid "_Wallpaper Selector" msgstr "" #: ../variety/indicator.py:263 msgid "Recent _Downloads" msgstr "" #: ../variety/indicator.py:278 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:288 msgid "About" msgstr "" #: ../variety/indicator.py:292 msgid "Quit" msgstr "" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:1 msgid "Copy to Favorites vs. Move to Favorites" msgstr "" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:2 msgid "Reset to Default" msgstr "" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:3 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.h:4 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 "" #: ../variety/ImageFetcher.py:56 ../variety/ImageFetcher.py:103 msgid "Fetching" msgstr "" #. too small - delete and do not use #: ../variety/ImageFetcher.py:118 msgid "Image too small, ignoring it" msgstr "" #: ../variety/ImageFetcher.py:140 #, python-format msgid "Sorry, got %s error..." msgstr "" #: ../variety/ImageFetcher.py:141 msgid "This means the link is no longer valid" msgstr "" #: ../variety/ImageFetcher.py:144 msgid "Fetch failed for some reason" msgstr "" #: ../variety/ImageFetcher.py:145 msgid "" "To get more information, please run Variety from terminal with -v option and " "retry the action" msgstr "" variety/po/zh_CN.po0000644000000000000000000020561112655724347011432 0ustar # Chinese (Simplified) translation for variety # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the variety package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: variety\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-01-29 10:57+0200\n" "PO-Revision-Date: 2014-07-15 23:54+0000\n" "Last-Translator: kaiman \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-02-07 20:28+0000\n" "X-Generator: Launchpad (build 17908)\n" #: ../data/plugins/quotes/GoodreadsSource.py:49 msgid "Fetches quotes from Goodreads.com" msgstr "从 Goodreads.com 获取箴言" #: ../data/ui/LoginOrRegisterDialog.ui.h:1 msgid "Login to VRTY.ORG" msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:2 msgid "Username: " msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:3 msgid "Password: " msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:4 msgid "No account? Register here" msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:5 msgid "Forgot your password?" msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:6 msgid "" "Tip: You can also login to VRTY.ORG in a " "browser and click the link \"Trigger Variety " "login\" in your profile." msgstr "" #: ../data/ui/LoginOrRegisterDialog.ui.h:7 msgid "Login" msgstr "" #: ../variety/LoginOrRegisterDialog.py:80 #, python-format msgid "Oops, server returned error (%s)" msgstr "" #: ../variety/LoginOrRegisterDialog.py:85 msgid "Could not connect to server" msgstr "" #: ../variety/AddWallhavenDialog.py:38 ../variety/AddWallbaseDialog.py:38 #: ../variety/AddFlickrDialog.py:138 msgid "No images found" msgstr "没有找到图像" #: ../data/ui/AddPanoramioDialog.ui.h:1 msgid "Variety - add Panoramio image source" msgstr "" #. (_("Wallbase.cc"), self.on_add_wallbase_clicked), #: ../data/ui/AddPanoramioDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:388 msgid "Panoramio" msgstr "" #: ../data/ui/AddPanoramioDialog.ui.h:3 msgid "Please zoom over your area of interest." msgstr "" #: ../variety/FolderChooser.py:65 msgid "Choose a folder" msgstr "选择一个文件夹" #: ../variety/FolderChooser.py:66 ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Cancel" msgstr "取消" #: ../variety/FolderChooser.py:66 msgid "OK" msgstr "确定" #: ../data/ui/AddWallhavenDialog.ui.h:1 msgid "Variety - add Wallhaven.cc image source" msgstr "" #: ../data/ui/AddWallhavenDialog.ui.h:2 #: ../variety/PreferencesVarietyDialog.py:386 msgid "Wallhaven.cc" msgstr "" #: ../data/ui/AddWallhavenDialog.ui.h:3 msgid "" "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." msgstr "" #: ../data/ui/AddWallhavenDialog.ui.h:8 ../data/ui/AddWallbaseDialog.ui.h:9 msgid "Enter keywords or paste URL here: " msgstr "输入关键字或粘贴URL于此: " #: ../data/ui/AddWallhavenDialog.ui.h:9 ../data/ui/AddFlickrDialog.ui.h:16 #: ../data/ui/AddWallbaseDialog.ui.h:10 msgid "Just a moment to check this search" msgstr "稍待片刻" #: ../data/ui/AddWallhavenDialog.ui.h:10 ../data/ui/AddFlickrDialog.ui.h:17 #: ../data/ui/AddRedditDialog.ui.h:9 ../data/ui/AddMediaRssDialog.ui.h:6 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:10 #: ../data/ui/AddWallbaseDialog.ui.h:11 msgid " " msgstr " " #: ../variety/QuotesEngine.py:232 msgid "No quote plugins" msgstr "没有箴言插件" #: ../variety/QuotesEngine.py:232 msgid "There are no quote plugins installed" msgstr "箴言插件没安装" #: ../variety/QuotesEngine.py:238 msgid "No suitable quote plugins" msgstr "没合适的箴言插件" #: ../variety/QuotesEngine.py:239 msgid "" "You have no quote plugins which support searching by keywords and authors" msgstr "没支持搜索关键字和作者的箴言插件" #: ../variety/QuotesEngine.py:251 msgid "Could not fetch quotes" msgstr "不能获取箴言" #: ../variety/QuotesEngine.py:252 msgid "Quotes services may be down, we will continue trying" msgstr "" #: ../variety/QuotesEngine.py:255 msgid "Could not find quotes" msgstr "" #: ../variety/QuotesEngine.py:256 msgid "Maybe you are searching for something very obscure?" msgstr "" #: ../variety/Texts.py:20 msgid "Keep original" msgstr "保持原始" #: ../variety/Texts.py:21 msgid "Grayscale" msgstr "灰度" #: ../variety/Texts.py:22 msgid "Heavy blur" msgstr "" #: ../variety/Texts.py:23 msgid "Soft blur" msgstr "" #: ../variety/Texts.py:24 msgid "Oil painting" msgstr "油画" #: ../variety/Texts.py:25 msgid "Pencil sketch" 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:37 msgid "" "Latest favorites by the other users of Variety. [May contain NSFW images]" msgstr "" #: ../variety/Texts.py:38 msgid "Random wallpapers from Desktoppr.co" msgstr "" #: ../variety/Texts.py:39 msgid "NASA's Astronomy Picture of the Day" msgstr "" #: ../variety/Texts.py:41 msgid "World Sunlight Map - live wallpaper from Die.net" msgstr "" #: ../variety/Texts.py:42 msgid "Bing Photo of the Day" msgstr "" #: ../variety/Texts.py:43 msgid "High-resolution photos from Unsplash.com" msgstr "" #: ../variety/Texts.py:47 msgid "" "If you use KDE, you need to perform some actions before Variety will work. " "Please read here: http://peterlevi.com/variety/2014/05/variety-and-kde/" msgstr "" #: ../variety/Texts.py:48 msgid "" "You can change the wallpaper back and forth by scrolling the mouse wheel on " "top of the indicator icon." msgstr "" #: ../variety/Texts.py:49 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 " "~/.config/variety/scripts. There are examples there for various desktop " "environments." msgstr "" #: ../variety/Texts.py:50 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:51 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:52 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:53 msgid "" "Adding your own custom filters is quite easy: open " "~/.config/variety/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:54 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:55 msgid "" "To enable desktop notifications when the wallpaper changes, uncomment the " "two lines at the bottom of ~/.config/variety/scripts/set_wallpaper." msgstr "" #: ../variety/Texts.py:56 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:57 msgid "" "When you choose to save quotes to Favorites, these are by default saved to " "~/.config/variety/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/PreferencesVarietyDialog.py:259 msgid "All" msgstr "" #: ../variety/PreferencesVarietyDialog.py:382 #: ../variety/PreferencesVarietyDialog.py:551 #: ../data/ui/PreferencesVarietyDialog.ui.h:11 msgid "Images" msgstr "图片" #: ../variety/PreferencesVarietyDialog.py:383 msgid "Folders" msgstr "文件夹" #: ../variety/PreferencesVarietyDialog.py:385 #: ../data/ui/AddFlickrDialog.ui.h:2 msgid "Flickr" msgstr "" #: ../variety/PreferencesVarietyDialog.py:389 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:2 msgid "Wallpapers.net" msgstr "" #: ../variety/PreferencesVarietyDialog.py:390 #: ../data/ui/AddRedditDialog.ui.h:2 msgid "Reddit" msgstr "" #: ../variety/PreferencesVarietyDialog.py:391 #: ../data/ui/AddMediaRssDialog.ui.h:2 msgid "Media RSS" msgstr "" #: ../variety/PreferencesVarietyDialog.py:416 msgid "Remove the source, keep the files" msgstr "从源里移除,但保留文件" #: ../variety/PreferencesVarietyDialog.py:417 msgid "Remove the sources, keep the files" msgstr "从源里移除,但保留文件" #: ../variety/PreferencesVarietyDialog.py:424 msgid "Remove the source and delete the downloaded files" msgstr "移除源,并且删除已下载文件" #: ../variety/PreferencesVarietyDialog.py:425 msgid "Remove the sources and delete the downloaded files" msgstr "移除源,并且删除已下载文件" #: ../variety/PreferencesVarietyDialog.py:458 msgid "World Sunlight Map enabled" msgstr "启用世界鸟瞰地图" #: ../variety/PreferencesVarietyDialog.py:459 msgid "" "Using the World Sunlight Map requires both downloading and changing enabled " "at intervals of 30 minutes or less. Settings were adjusted automatically." msgstr "世界鸟瞰地图下载间隔要求不大于30分钟。配置之前是自动调整的" #: ../variety/PreferencesVarietyDialog.py:544 msgid "Add Images" msgstr "添加图片" #: ../variety/PreferencesVarietyDialog.py:545 #: ../variety/PreferencesVarietyDialog.py:569 msgid "Add" msgstr "添加" #: ../variety/PreferencesVarietyDialog.py:567 msgid "" "Add Folders - Only add the root folders, subfolders are searched recursively" msgstr "增加文件夹-只需要添加顶层文件夹,子文件夹会自动添加" #: ../variety/PreferencesVarietyDialog.py:703 #: ../variety/PreferencesVarietyDialog.py:716 #: ../data/ui/PreferencesVarietyDialog.ui.h:168 msgid "Edit..." msgstr "编辑..." #: ../variety/PreferencesVarietyDialog.py:710 msgid "View Image" msgstr "浏览图像" #: ../variety/PreferencesVarietyDialog.py:713 msgid "Open Folder" msgstr "打开文件夹" #: ../variety/PreferencesVarietyDialog.py:1092 msgid "Recommended images source disabled" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1120 #: ../variety/PreferencesVarietyDialog.py:1139 #: ../variety/PreferencesVarietyDialog.py:1147 msgid "No write permissions" msgstr "没有写权限" #: ../variety/PreferencesVarietyDialog.py:1127 msgid "Limit disabled" msgstr "限制取消" #: ../variety/PreferencesVarietyDialog.py:1128 msgid "" "Changing the download folder automatically turns off the size limit to " "prevent from accidental data loss" msgstr "自动修改下载文件夹关闭大小限制, 防止意外的数据丢失" #: ../variety/PreferencesVarietyDialog.py:1134 #, python-format msgid "Actual download folder: %s " msgstr "实际下载文件夹:%s " #: ../variety/PreferencesVarietyDialog.py:1214 msgid "Could not adjust permissions" msgstr "不能修改权限" #: ../variety/PreferencesVarietyDialog.py:1215 #, python-format msgid "" "You may try manually running this command:\n" "sudo chmod %s \"%s\"" msgstr "" "你需要手动运行命令:\n" "sudo chmod %s \"%s\"" #: ../variety/PreferencesVarietyDialog.py:1247 msgid "Logged in as: " msgstr "" #: ../variety/PreferencesVarietyDialog.py:1249 msgid "Anonymous" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1250 #: ../data/ui/PreferencesVarietyDialog.ui.h:109 msgid "Login or register" msgstr "" #: ../variety/PreferencesVarietyDialog.py:1250 msgid "Switch user" msgstr "" #: ../data/ui/AddFlickrDialog.ui.h:1 msgid "Variety - add Flickr as an image source" msgstr "Variety - 添加 Flickr 作为图像来源" #: ../data/ui/AddFlickrDialog.ui.h:3 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.h:4 #: ../data/ui/PreferencesVarietyDialog.ui.h:58 msgid "Tags: " msgstr "标记: " #: ../data/ui/AddFlickrDialog.ui.h:5 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.h:7 msgid "User: " msgstr "用户名: " #: ../data/ui/AddFlickrDialog.ui.h:8 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.h:10 msgid "Group: " msgstr "群组: " #: ../data/ui/AddFlickrDialog.ui.h:11 msgid "" "Please insert the group's URL.\n" "Example: http://www.flickr.com/group" "s/wallpapers/" msgstr "" #: ../data/ui/AddFlickrDialog.ui.h:13 msgid "Text:" msgstr "文本:" #: ../data/ui/AddFlickrDialog.ui.h:14 msgid "" "Free text search in photos' titles, descriptions and tags. Exclude terms by " "prepending them with -.\n" "Example: apple -pie" msgstr "" "搜索图片标题,描述和标签。 用“-”除去不需要的项\n" "例子:apple - pie(搜索苹果图片,但是不要苹果派的图片)" #: ../variety/AddMediaRssDialog.py:40 msgid "" "This does not seem to be a valid Media RSS feed URL or there is no content " "there." msgstr "输入不是一个合法的RSS链接或者RSS链接里面没有内容" #: ../variety/VarietyWindow.py:630 ../variety/VarietyWindow.py:772 #: ../variety/VarietyWindow.py:2650 msgid "Already in Favorites" msgstr "收藏夹中已存在" #: ../variety/VarietyWindow.py:634 ../variety/ThumbsManager.py:144 #: ../variety/indicator.py:76 msgid "Copy to _Favorites" msgstr "拷贝到收藏夹(_F)" #: ../variety/VarietyWindow.py:635 ../variety/ThumbsManager.py:151 msgid "Move to _Favorites" msgstr "移动到收藏夹(_F)" #. both #: ../variety/VarietyWindow.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:165 ../variety/indicator.py:81 msgid "Move to Favorites" msgstr "移动到收藏夹" #: ../variety/VarietyWindow.py:665 ../variety/ThumbsManager.py:119 msgid "Fetched: Show Origin" msgstr "抓到数据" #: ../variety/VarietyWindow.py:667 ../variety/VarietyWindow.py:762 #: ../variety/ThumbsManager.py:121 #, python-format msgid "View at %s" msgstr "在%s浏览" #: ../variety/VarietyWindow.py:711 msgid "Unknown" msgstr "" #: ../variety/VarietyWindow.py:732 #, python-format msgid "Author: %s" msgstr "" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 #: ../variety/indicator.py:120 ../variety/indicator.py:185 msgid "Pause on current" msgstr "" #: ../variety/VarietyWindow.py:755 ../variety/VarietyWindow.py:769 msgid "Resume regular changes" msgstr "" #: ../variety/VarietyWindow.py:772 ../variety/indicator.py:191 msgid "Save to Favorites" msgstr "" #: ../variety/VarietyWindow.py:904 msgid "Filtering too strict?" msgstr "匹配规则过于严格?" #: ../variety/VarietyWindow.py:905 msgid "" "Variety is finding too few images that match your image filtering criteria" msgstr "Varity用您目前的图片规则匹配到的图片太少" #: ../variety/VarietyWindow.py:1377 msgid "Please add more image sources or wait for some downloads" msgstr "请增加更多的图片源或者等待下载结束" #: ../variety/VarietyWindow.py:1379 msgid "Please add more image sources" msgstr "请增加更多的图片源" #: ../variety/VarietyWindow.py:1380 msgid "No more wallpapers" msgstr "没有更多的桌面图片" #: ../variety/VarietyWindow.py:1566 msgid "Current wallpaper is not in the image sources" msgstr "当前的桌面图片不在图片源中" #: ../variety/VarietyWindow.py:1601 #, python-format msgid "" "Could not move to %s. You probably don't have permissions to move this file." msgstr "不能移动到 %s。你可能没有相应的权限移动该文件。" #: ../variety/VarietyWindow.py:1603 #, python-format msgid "" "Could not copy to %s. You probably don't have permissions to copy this file." msgstr "不能复制到 %s。你可能没有相应的权限复制该文件。" #: ../variety/VarietyWindow.py:1623 ../variety/VarietyWindow.py:1643 msgid "Cannot delete" msgstr "无法删除" #: ../variety/VarietyWindow.py:1624 #, python-format msgid "You don't have permissions to delete %s to Trash." msgstr "你没有权限删除 %s 到回收站。" #: ../variety/VarietyWindow.py:1644 msgid "" "Probably there is no utility for moving to Trash?\n" "Please install trash-cli or gvfs-bin or konquerer." msgstr "" "可能没有删除工具?\n" "请安装trash-cli, gvfs-bin或者konquerer." #: ../variety/VarietyWindow.py:1776 msgid "Anonymous usage statistics" msgstr "" #: ../variety/VarietyWindow.py:1777 msgid "" "Variety collects anonymous usage statistics. \n" "These help us make it better and are not shared with anyone. \n" "To read more or turn them off, go to \"Sync and social\"" msgstr "" #: ../variety/VarietyWindow.py:1920 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:1945 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 /some/local/image.jpg --next" msgstr "" #: ../variety/VarietyWindow.py:1955 msgid "" "Show logging messages (-vv shows even finer debugging messages, -vvv debugs " "variety_lib too)" msgstr "显示日志消息(-vv 显示更详细的debug消息, -vvv 用来debug varity的库文件" #: ../variety/VarietyWindow.py:1959 msgid "Make the running instance quit" msgstr "让运行中的实例退出" #: ../variety/VarietyWindow.py:1963 msgid "" "Print the current wallpaper location. Used only when the application is " "already running." msgstr "打印当前桌面图片地址。 只有当Variety运行时可用" #: ../variety/VarietyWindow.py:1967 msgid "Show Next wallpaper" msgstr "显示下一壁纸" #: ../variety/VarietyWindow.py:1971 msgid "Show Previous wallpaper" msgstr "显示前一壁纸" #: ../variety/VarietyWindow.py:1975 msgid "Show Next wallpaper, skipping the forward history" msgstr "显示下一张壁纸, 跳过前一壁纸历史" #: ../variety/VarietyWindow.py:1979 msgid "" "Move current wallpaper to Trash. Used only when the application is already " "running." msgstr "删除当前壁纸。程序运行时可用" #: ../variety/VarietyWindow.py:1983 msgid "" "Copy current wallpaper to Favorites. Used only when the application is " "already running." msgstr "拷贝当前壁纸到Favorites." #: ../variety/VarietyWindow.py:1987 msgid "" "Move current wallpaper to Favorites. Used only when the application is " "already running." msgstr "剪切当前壁纸到Favorites." #: ../variety/VarietyWindow.py:1991 msgid "Pause on current image" msgstr "" #: ../variety/VarietyWindow.py:1995 msgid "Resume regular image changes" msgstr "" #: ../variety/VarietyWindow.py:1999 msgid "Toggle Pause/Resume state" msgstr "切换 暂停/继续 状态" #: ../variety/VarietyWindow.py:2003 msgid "Show Next quote" msgstr "显示下一箴言" #: ../variety/VarietyWindow.py:2007 msgid "Show Previous quote" msgstr "显示前一箴言" #: ../variety/VarietyWindow.py:2011 msgid "Show Next quote, skipping the forward history" msgstr "显示下一箴言,跳过向前显示历史" #: ../variety/VarietyWindow.py:2015 msgid "Toggle Quotes Pause/Resume state" msgstr "切换箴言 暂停/继续 状态" #: ../variety/VarietyWindow.py:2019 msgid "Save the current quote to Favorites" msgstr "" #: ../variety/VarietyWindow.py:2023 msgid "Toggle History display" msgstr "切换历史显示" #: ../variety/VarietyWindow.py:2027 msgid "Toggle Recent Downloads display" msgstr "切换最近下载现实" #: ../variety/VarietyWindow.py:2031 msgid "Show Preferences dialog" msgstr "现实首选项对话框" #: ../variety/VarietyWindow.py:2035 msgid "" "Show manual wallpaper selector - the thumbnail bar filled with images from " "the active image sources" msgstr "" #: ../variety/VarietyWindow.py:2039 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/VarietyWindow.py:2053 msgid "options --next/--fast-forward and --previous are mutually exclusive" msgstr "选项 --next/--fast-forward 和 --previous 是互斥的" #: ../variety/VarietyWindow.py:2056 msgid "options --trash and --favorite are mutually exclusive" msgstr "选项 --trash 和 --favorite 是互斥的" #: ../variety/VarietyWindow.py:2059 msgid "options --pause and --resume are mutually exclusive" msgstr "选项 --parse 和 --resume 是互斥的" #: ../variety/VarietyWindow.py:2062 msgid "" "options --quotes-next/--quotes-fast-forward and --quotes-previous are " "mutually exclusive" msgstr "选项 --qutoes-next/--quotes-fast-forward 和 --quotes-previous 是互斥的" #: ../variety/VarietyWindow.py:2179 ../variety/ImageFetcher.py:60 #: ../variety/ImageFetcher.py:71 ../variety/ImageFetcher.py:78 #: ../variety/ImageFetcher.py:112 msgid "Not an image" msgstr "不是一个图像" #: ../variety/VarietyWindow.py:2184 msgid "Added to queue" msgstr "加入队列" #: ../variety/VarietyWindow.py:2185 ../variety/VarietyWindow.py:2191 msgid "Press Next to see it" msgstr "点击下一步查看" #: ../variety/VarietyWindow.py:2191 msgid "Fetched" msgstr "获取完毕" #: ../variety/VarietyWindow.py:2237 msgid "Unsupported source type" msgstr "" #: ../variety/VarietyWindow.py:2238 ../variety/VarietyWindow.py:2286 msgid "Are you running the most recent version of Variety?" msgstr "" #: ../variety/VarietyWindow.py:2244 msgid "New image source added" msgstr "" #: ../variety/VarietyWindow.py:2246 msgid "Image source already exists, enabling it" msgstr "" #: ../variety/VarietyWindow.py:2272 msgid "Fetched and applied" msgstr "" #: ../variety/VarietyWindow.py:2282 msgid "It works!" msgstr "" #: ../variety/VarietyWindow.py:2282 msgid "Yay, Variety links work. Great!" msgstr "" #: ../variety/VarietyWindow.py:2286 msgid "Unsupported command" msgstr "" #: ../variety/VarietyWindow.py:2288 msgid "Could not process the given variety:// URL" msgstr "" #: ../variety/VarietyWindow.py:2289 msgid "Run with logging enabled to see details" msgstr "" #: ../variety/VarietyWindow.py:2488 msgid "Do not ask anymore, always use the current quote" msgstr "" #: ../variety/VarietyWindow.py:2491 ../data/ui/FacebookPublishDialog.ui.h:5 msgid "Do not ask anymore, always use the text above" msgstr "总是用上面的文字不再提问" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "Published" msgstr "已发布" #: ../variety/VarietyWindow.py:2523 ../variety/VarietyWindow.py:2552 msgid "You may open your Facebook feed to see the post" msgstr "您可以打开您的Facebook feed来查看发布" #: ../variety/VarietyWindow.py:2526 ../variety/VarietyWindow.py:2555 msgid "Could not publish" msgstr "不能发布" #: ../variety/VarietyWindow.py:2718 msgid "Could not create autostart entry" msgstr "" #: ../variety/VarietyWindow.py:2719 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:2769 msgid "No images" msgstr "" #: ../variety/VarietyWindow.py:2769 msgid "There are no images in the slideshow folders" msgstr "" #: ../data/ui/FacebookFirstRunDialog.ui.h:1 msgid "Variety - Facebook Sharing" msgstr "Variety - 分享到Facebook" #: ../data/ui/FacebookFirstRunDialog.ui.h:2 #: ../data/ui/PreferencesVarietyDialog.ui.h:169 msgid "Facebook Sharing" msgstr "Facebook分享" #: ../data/ui/FacebookFirstRunDialog.ui.h:3 msgid "" "You are sharing on Facebook for the first time. Sharing from Variety is " "available for images that come from online sources and for quotes. It works " "this way: \n" "\n" "1. Login to Facebook\n" "Facebook will open in your default browser. You will be prompted to login if " "you are not already logged in. \n" "\n" "2. Authorize Variety to publish to your " "feed.\n" "You will be asked to allow Variety to publish to your feed on your behalf. " "Variety will only use this permission to publish those images and quotes " "that you tell it to, nothing else.\n" "\n" "3. Configure browser to open variety:// links " "with Variety or xdg-open\n" "Then you will be redirected to a page with instructions to associate " "\"variety://\" links with Variety in your browser. Please follow these " "instructions to complete the setup. You have to do this only once.\n" "\n" "No passwords or login information is kept locally, just an OAuth Facebook " "token that will be valid for a couple of weeks. After its validity expires " "you will be asked to login again." msgstr "" #: ../variety/AddWallpapersNetCategoryDialog.py:40 msgid "Could not find wallpapers there. Please check the URL." msgstr "找不到壁纸。 请检查链接" #: ../data/ui/WelcomeDialog.ui.h:1 msgid "Welcome to Variety!" msgstr "Variety 欢迎您!" #: ../data/ui/WelcomeDialog.ui.h:2 ../data/ui/SmartFeaturesNoticeDialog.ui.h:3 msgid "Continue" msgstr "继续" #: ../data/ui/WelcomeDialog.ui.h:3 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.h:4 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.h:5 msgid "" "Now please take some time to set your preferences on the following screens." msgstr "" #: ../data/ui/WelcomeDialog.ui.h:6 msgid "KDE Users - Important, please read:" msgstr "KDE用户 - 重要, 请阅读" #: ../data/ui/WelcomeDialog.ui.h:7 msgid "" "You appear to be running KDE. In KDE 4 it is impossible to set the wallpaper " "from inside a program - there is no API for this. To make Variety work, please read " "and follow the instructions here." msgstr "" #: ../data/ui/AddRedditDialog.ui.h:1 msgid "Variety - add Reddit feed" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:3 msgid "" "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" msgstr "" #: ../data/ui/AddRedditDialog.ui.h:7 msgid "URL or name of a subreddit: " msgstr "" #: ../data/ui/AddRedditDialog.ui.h:8 msgid "Just a moment to check what's there" msgstr "" #: ../data/ui/AddMediaRssDialog.ui.h:1 msgid "Variety - add Media RSS feed" msgstr "" #: ../data/ui/AddMediaRssDialog.ui.h:3 msgid "" "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." msgstr "" #: ../data/ui/AddMediaRssDialog.ui.h:4 msgid "Paste the URL of the Media RSS feed here: " msgstr "" #: ../data/ui/AddMediaRssDialog.ui.h:5 #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:9 msgid "Just a moment to check what's at that URL" msgstr "" #: ../variety/AddRedditDialog.py:43 msgid "This does not seem to be a valid Reddit URL" msgstr "" #: ../variety/AddRedditDialog.py:46 msgid "We could not find any image submissions there." msgstr "" #: ../variety/Smart.py:111 msgid "" "Your smart_user.json config file appears broken. You may have to login again " "to VRTY.ORG." msgstr "" #: ../variety/Smart.py:195 msgid "Your VRTY.ORG credentials are probably outdated. Please login again." msgstr "" #: ../variety/Smart.py:597 ../variety/Smart.py:643 #: ../data/ui/PreferencesVarietyDialog.ui.h:111 msgid "Sync" msgstr "" #: ../variety/Smart.py:598 #, python-format msgid "Fetching %d images" msgstr "" #: ../variety/Smart.py:598 msgid "Fetching 1 image" msgstr "" #: ../variety/Smart.py:643 msgid "Finished" msgstr "" #: ../variety/Smart.py:664 #, python-format msgid "Logged in as %s" msgstr "" #: ../variety/Smart.py:676 #, python-format msgid "" "Do you want to login to VRTY.ORG as %s?" msgstr "" #: ../variety/Smart.py:677 msgid "VRTY.ORG login confirmation" msgstr "" #: ../data/plugins/quotes/QuotationsPageSource.py:35 msgid "Fetches quotes from TheQuotationsPage.com" msgstr "从 QuotationsPage.com 获取箴言" #: ../variety/__init__.py:143 msgid "Terminating signal received, quitting..." msgstr "收到退出信号,正在退出" #: ../variety/__init__.py:198 msgid "" "Variety is already running. Sending the command to the running instance." msgstr "Variey正在运行. 发送命令到正在运行的实例" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:1 msgid "VRTY.ORG integration" msgstr "" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:2 msgid "This feature requires VRTY.ORG integration" msgstr "" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:3 msgid "Enable VRTY.ORG integration" msgstr "" #: ../data/ui/SmartFeaturesConfirmationDialog.ui.h:4 msgid "" "For this feature Variety needs permission to collect data about the images " "you like or dislike and the online sources you have enabled.\n" "\n" "Collected data is anonymous by default and covers only images which Variety " "downloaded, never images you already had in your local folders that might be " "private.\n" "\n" "This data helps us provide better images for everyone and fuels VRTY.ORG - a valuable resource for all users " "of Variety." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:1 msgid "Variety - VRTY.ORG" msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:2 msgid "No, thanks" msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:4 msgid "" "Introducing VRTY.ORG! Wanna take part?" msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:5 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to find and add new image sources to Variety, and to follow other users' " "favorites." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:6 msgid "" "Participation takes no effort - your profile will be built automatically, as " "you like or dislike images downloaded by Variety. Your profile will not be " "shared with third parties, unless you opt-in to make it public. Read more details about the " "service and the privacy policy here." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:7 msgid "" "Participation is required for some features of Variety such as synchronization of favorites between computers." msgstr "" #: ../data/ui/SmartFeaturesNoticeDialog.ui.h:8 #: ../data/ui/PreferencesVarietyDialog.ui.h:105 msgid "Participate in VRTY.ORG" msgstr "" #: ../data/plugins/quotes/QuotesDaddySource.py:31 msgid "" "Fetches quotes from QuotesDaddy's daily quotes RSS feed.\n" "Does not support searching by tags or authors." msgstr "" #: ../data/ui/AboutVarietyDialog.ui.h:1 msgid "Copyright (c) 2012, Peter Levi " msgstr "Copyright (c) 2012, Peter Levi " #: ../data/ui/AboutVarietyDialog.ui.h:2 msgid "About Variety" msgstr "关于 Variety" #: ../data/ui/AboutVarietyDialog.ui.h:3 msgid "An automatic wallpaper changer, downloader and manager." msgstr "一个壁纸自动切换、下载和管理软件。" #: ../data/ui/AboutVarietyDialog.ui.h:4 msgid "http://peterlevi.com/variety" msgstr "" #: ../data/ui/AboutVarietyDialog.ui.h:5 msgid "" "# Copyright (c) 2012, Peter Levi \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/AddWallpapersNetCategoryDialog.ui.h:1 msgid "Variety - add Wallpapers.net category" msgstr "" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:3 msgid "" "Please visit wallpapers.net and choose " "a category with wallpapers, then paste its URL below. A category is " "anything on the site that has one or more pages with wallpapers on them. " "Here are some examples:\n" "\n" "All wallpapers: http://www.wallpapers.net/\n" "Specific resolution: http://www.wallpapers.net/2560x1440-wallpapers_r19\n" msgstr "" #: ../data/ui/AddWallpapersNetCategoryDialog.ui.h:8 msgid "Paste URL here: " msgstr "粘贴 URL 到这里 " #: ../data/ui/PreferencesVarietyDialog.ui.h:1 msgid "seconds" msgstr "秒" #: ../data/ui/PreferencesVarietyDialog.ui.h:2 msgid "minutes" msgstr "分钟" #: ../data/ui/PreferencesVarietyDialog.ui.h:3 msgid "hours" msgstr "小时" #: ../data/ui/PreferencesVarietyDialog.ui.h:4 msgid "days" msgstr "天" #: ../data/ui/PreferencesVarietyDialog.ui.h:5 msgid "Variety Preferences" msgstr "Variety 首选项" #: ../data/ui/PreferencesVarietyDialog.ui.h:6 msgid "General" msgstr "基本设置" #: ../data/ui/PreferencesVarietyDialog.ui.h:7 msgid "Start Variety when the computer starts" msgstr "启动时同时启动Variety" #: ../data/ui/PreferencesVarietyDialog.ui.h:8 msgid "Change wallpaper every " msgstr "切换壁纸每 " #: ../data/ui/PreferencesVarietyDialog.ui.h:9 msgid "Minimum interval is 5 seconds" msgstr "最小间隔是5秒" #: ../data/ui/PreferencesVarietyDialog.ui.h:10 msgid "Change wallpaper on start" msgstr "启动时切换壁纸" #: ../data/ui/PreferencesVarietyDialog.ui.h:12 msgid "Enabled" msgstr "启用" #: ../data/ui/PreferencesVarietyDialog.ui.h:13 msgid "Type" msgstr "类型" #: ../data/ui/PreferencesVarietyDialog.ui.h:14 msgid "Location" msgstr "位置" #: ../data/ui/PreferencesVarietyDialog.ui.h:15 msgid "_Add..." msgstr "添加(_A)..." #: ../data/ui/PreferencesVarietyDialog.ui.h:16 msgid "Add images, folders or online image sources" msgstr "添加图片,文件夹或联机图片源" #: ../data/ui/PreferencesVarietyDialog.ui.h:17 msgid "_Edit..." msgstr "编辑(_E)..." #: ../data/ui/PreferencesVarietyDialog.ui.h:18 msgid "Edit the selected source" msgstr "编辑被选中的源" #: ../data/ui/PreferencesVarietyDialog.ui.h:19 msgid "_Remove..." msgstr "删除(_R)..." #: ../data/ui/PreferencesVarietyDialog.ui.h:20 msgid "Remove selected image sources" msgstr "删除被选中的图片源" #: ../data/ui/PreferencesVarietyDialog.ui.h:21 msgid "_Use" msgstr "使用(_U)" #: ../data/ui/PreferencesVarietyDialog.ui.h:22 msgid "Enable the selected sources and disable all others" msgstr "启用选中的源同时禁用其他的源。" #: ../data/ui/PreferencesVarietyDialog.ui.h:23 msgid "Download a wallpaper every " msgstr "下载一张壁纸每 " #: ../data/ui/PreferencesVarietyDialog.ui.h:24 msgid "Minimum interval is one minute" msgstr "最小间隔是一分钟" #: ../data/ui/PreferencesVarietyDialog.ui.h:25 msgid "to " msgstr "到 " #: ../data/ui/PreferencesVarietyDialog.ui.h:26 msgid "Actual download folder " msgstr "实际下载文件夹 " #: ../data/ui/PreferencesVarietyDialog.ui.h:27 msgid "" "Caution: do NOT use this option if you use a custom download folder with " "valuable files in it. Variety will maintain the limit regardless of what is " "in the download folder." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:28 msgid "Limit download folder to " msgstr "存放下载文件的文件夹容量限制为 " #: ../data/ui/PreferencesVarietyDialog.ui.h:29 msgid "Minimum size is 50 MB" msgstr "最小尺寸为 50 MB" #: ../data/ui/PreferencesVarietyDialog.ui.h:30 msgid "MB by deleting oldest files when necessary" msgstr "MB 必要时删除最早的文件" #: ../data/ui/PreferencesVarietyDialog.ui.h:31 msgid "Favorites" msgstr "收藏夹" #: ../data/ui/PreferencesVarietyDialog.ui.h:32 msgid "Copy favorite wallpapers to " msgstr "拷贝收藏壁纸到 " #: ../data/ui/PreferencesVarietyDialog.ui.h:33 msgid "Filters" msgstr "修饰" #: ../data/ui/PreferencesVarietyDialog.ui.h:34 msgid "" "Randomly apply these filters to the displayed wallpapers (thanks to the " "wonderful ImageMagick):" msgstr "用下面的修饰风格随机应用于当前显示的壁纸(归功于神奇的ImageMagick):" #: ../data/ui/PreferencesVarietyDialog.ui.h:35 msgid "Quotes" msgstr "箴言" #: ../data/ui/PreferencesVarietyDialog.ui.h:36 msgid "Show random wise quotes on the desktop" msgstr "在桌面显示随机的智慧箴言" #: ../data/ui/PreferencesVarietyDialog.ui.h:37 msgid "Text color: " msgstr "文字颜色 " #: ../data/ui/PreferencesVarietyDialog.ui.h:38 msgid "Text font: " msgstr "文字字体: " #: ../data/ui/PreferencesVarietyDialog.ui.h:39 msgid "Backdrop color: " msgstr "背景色: " #: ../data/ui/PreferencesVarietyDialog.ui.h:40 msgid "Backdrop opacity: " msgstr "背景透明度: " #: ../data/ui/PreferencesVarietyDialog.ui.h:41 msgid " Transparent" msgstr " 透明" #: ../data/ui/PreferencesVarietyDialog.ui.h:42 msgid "Opaque" msgstr "不透明" #: ../data/ui/PreferencesVarietyDialog.ui.h:43 msgid "Draw a text shadow" msgstr "显示文字阴影" #: ../data/ui/PreferencesVarietyDialog.ui.h:44 msgid "Appearance" msgstr "外观" #: ../data/ui/PreferencesVarietyDialog.ui.h:45 msgid "Quotes area width: " msgstr "箴言区域宽度 " #: ../data/ui/PreferencesVarietyDialog.ui.h:46 msgid "Narrow " msgstr "窄 " #: ../data/ui/PreferencesVarietyDialog.ui.h:47 msgid "Wide" msgstr "宽" #: ../data/ui/PreferencesVarietyDialog.ui.h:48 msgid "Horizontal position: " msgstr "水平位置 " #: ../data/ui/PreferencesVarietyDialog.ui.h:49 msgid "Left " msgstr "左侧 " #: ../data/ui/PreferencesVarietyDialog.ui.h:50 ../variety/ThumbsManager.py:44 msgid "Right" msgstr "右侧" #: ../data/ui/PreferencesVarietyDialog.ui.h:51 msgid "Vertical position: " msgstr "竖直位置 " #: ../data/ui/PreferencesVarietyDialog.ui.h:52 msgid "Top " msgstr "顶部 " #: ../data/ui/PreferencesVarietyDialog.ui.h:53 ../variety/ThumbsManager.py:41 msgid "Bottom" msgstr "底部" #: ../data/ui/PreferencesVarietyDialog.ui.h:54 msgid "Placement" msgstr "位置" #: ../data/ui/PreferencesVarietyDialog.ui.h:55 msgid "Show quotes from these sources: " msgstr "显示箴言从如下源: " #: ../data/ui/PreferencesVarietyDialog.ui.h:56 msgid "" "More " "plugins" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:57 msgid "Show only these tags and authors. Leave empty to show random quotes." msgstr "仅显示如下标签和作者的,留空则随机显示箴言。" #: ../data/ui/PreferencesVarietyDialog.ui.h:59 msgid "Example: funny, inspirational" msgstr "例如:funny, inspirational" #: ../data/ui/PreferencesVarietyDialog.ui.h:60 msgid "Example: Albert Einstein, Voltaire" msgstr "例如:Albert Einstein, Voltaire" #: ../data/ui/PreferencesVarietyDialog.ui.h:61 msgid "Authors: " msgstr "作者: " #: ../data/ui/PreferencesVarietyDialog.ui.h:62 msgid "Sources and filtering" msgstr "源和过滤器" #: ../data/ui/PreferencesVarietyDialog.ui.h:63 msgid "Change quote every " msgstr "切换箴言每 " #: ../data/ui/PreferencesVarietyDialog.ui.h:64 msgid "Minimum interval is 10 seconds" msgstr "最小间隔为10 秒" #: ../data/ui/PreferencesVarietyDialog.ui.h:65 msgid "Regular change" msgstr "切换规则" #: ../data/ui/PreferencesVarietyDialog.ui.h:66 msgid "Clock" msgstr "时钟" #: ../data/ui/PreferencesVarietyDialog.ui.h:67 msgid "" "Show a nice big digital clock on the desktop, displaying the current time " "and date" msgstr "显示一个漂亮的大数字时钟,用于显示当前时间和日期。" #: ../data/ui/PreferencesVarietyDialog.ui.h:68 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.h:69 msgid "Clock font: " msgstr "时钟字体: " #: ../data/ui/PreferencesVarietyDialog.ui.h:70 msgid "Date font: " msgstr "日期字体: " #: ../data/ui/PreferencesVarietyDialog.ui.h:71 msgid "" "These don't work? Read here. How " "to further configure the clock? Read " "here." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:72 msgid "Effects" msgstr "特效" #: ../data/ui/PreferencesVarietyDialog.ui.h:73 msgid "Images for slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:74 msgid "Favorite images" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:75 msgid "Images in all enabled image sources" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:76 msgid "All images in the Downloads folder" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:77 msgid "Custom folder (includes images in subfolders) " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:78 msgid "Order of images in slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:79 msgid "Random" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:80 msgid "By name, A to Z" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:81 msgid "By name, Z to A" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:82 msgid "By date, oldest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:83 msgid "By date, newest first" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:84 msgid "Screen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:85 msgid "Run on monitor" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:86 msgid "Window mode for the slideshow " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:87 msgid "Fullscreen" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:88 msgid "Desktop (stays below other windows)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:89 msgid "Maximized window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:90 msgid "Normal window" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:91 msgid "Dynamics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:92 msgid "Interval between image changes " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:93 msgid " seconds" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:94 msgid "Quick fade " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:95 msgid "Slow fade" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:96 msgid "Less zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:97 msgid "More zoom" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:98 msgid "Less pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:99 msgid "More pan" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:100 msgid "Reset to defaults" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:101 msgid "Changes on this page take effect after the slideshow is restarted" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:102 msgid "Start slideshow now" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:103 msgid "Slideshow" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:104 msgid "VRTY.ORG" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:106 msgid "VRTY.ORG is in beta and will take some time to mature" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:107 msgid "" "VRTY.ORG connects Variety users with " "similar tastes and provides super-convenient ways to change your wallpaper, " "to add new image sources to Variety, and to follow other users' favorites. " "It is fueled by the favorite images of all participating users." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:108 msgid "" "Could not create user - no connection to VRTY.ORG. We will try again later." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:110 msgid "" "Registration enables cool features like synchronization of favorite images " "and sources between computers and personalized recommendations." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:112 msgid "Synchronize favorite images between computers" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:113 msgid "Requires VRTY.ORG enabled and logged in." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:114 msgid "" "Your favorite images from other computers will be automatically downloaded " "to this computer. You need to be logged in with the same VRTY.ORG user " "everywhere. Sync will not delete any images." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:115 msgid "Privacy policy" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:116 msgid "" "Variety sends data only for images it downloaded, never for images you " "already had in your local folders that might be private, and Sync does not " "work for such images. Collected data is not shared with third parties, " "unless you opt-in to make your profile public. Read more details about the " "service and the privacy policy here." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:117 msgid "Usage statistics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:118 msgid "Help make Variety better by sending anonymous usage statistics" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:119 msgid "" "These stats help us improve Variety by understanding how users interact with " "it. They also include general info about your OS version and monitor setup. " "Collected data is not shared with anyone." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:120 msgid "Sync and social" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:121 msgid "Fetch folder" msgstr "存放获取图片的文件夹" #: ../data/ui/PreferencesVarietyDialog.ui.h:122 msgid "Save manually downloaded wallpapers to " msgstr "手动保存下载的壁纸到 " #: ../data/ui/PreferencesVarietyDialog.ui.h:123 msgid "Drag and drop" msgstr "拖放" #: ../data/ui/PreferencesVarietyDialog.ui.h:124 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.h:126 msgid "Clipboard monitoring" msgstr "监视剪贴板" #: ../data/ui/PreferencesVarietyDialog.ui.h:127 msgid "Monitor clipboard for image URLs and fetch them" msgstr "监视剪贴板中图片的URL并获取它们" #: ../data/ui/PreferencesVarietyDialog.ui.h:128 msgid "But fetch only when the URL host is one of these:" msgstr "仅获取下面网站之一的图片" #: ../data/ui/PreferencesVarietyDialog.ui.h:129 msgid "Manual downloading" msgstr "手动下载" #: ../data/ui/PreferencesVarietyDialog.ui.h:130 msgid "When possible use images that:" msgstr "用到图片之处:" #: ../data/ui/PreferencesVarietyDialog.ui.h:131 ../variety/ThumbsManager.py:98 msgid "Size" msgstr "大小" #: ../data/ui/PreferencesVarietyDialog.ui.h:132 msgid "Have landscape orientation" msgstr "保持景观取向" #: ../data/ui/PreferencesVarietyDialog.ui.h:133 msgid "Are big at least " msgstr "大小至少是 " #: ../data/ui/PreferencesVarietyDialog.ui.h:134 msgid "50" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:135 msgid "80" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:136 msgid "100" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:138 #, no-c-format msgid "% of the screen resolution" msgstr "% 的屏幕分辨率" #: ../data/ui/PreferencesVarietyDialog.ui.h:139 msgid "Color" msgstr "颜色" #: ../data/ui/PreferencesVarietyDialog.ui.h:140 msgid "Are dark or light:" msgstr "暗或亮:" #: ../data/ui/PreferencesVarietyDialog.ui.h:141 msgctxt "Color option - images that are dark or light" msgid "Dark" msgstr "暗色" #: ../data/ui/PreferencesVarietyDialog.ui.h:142 msgctxt "Color option - images that are dark or light" msgid "Light" msgstr "加亮" #: ../data/ui/PreferencesVarietyDialog.ui.h:143 msgid "Contain this color: " msgstr "包括该色彩: " #: ../data/ui/PreferencesVarietyDialog.ui.h:144 msgid "(Takes effect after some initial searching)" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:145 msgid "Rating" msgstr "评分" #: ../data/ui/PreferencesVarietyDialog.ui.h:146 msgid "Have EXIF rating at least " msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:147 msgid "1" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:148 msgid "2" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:149 msgid "3" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:150 msgid "4" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:151 msgid "5" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:152 msgid "Color and size" msgstr "色彩与尺寸" #: ../data/ui/PreferencesVarietyDialog.ui.h:153 msgid "Indicator Icon" msgstr "指示器图标" #: ../data/ui/PreferencesVarietyDialog.ui.h:154 msgid "Indicator icon:" msgstr "指示器图标:" #: ../data/ui/PreferencesVarietyDialog.ui.h:155 msgctxt "Icon option" msgid "Light" msgstr "加亮" #: ../data/ui/PreferencesVarietyDialog.ui.h:156 msgctxt "Icon option" msgid "Dark" msgstr "暗色" #: ../data/ui/PreferencesVarietyDialog.ui.h:157 msgctxt "Icon option" msgid "Use current wallpaper" msgstr "用当前壁纸" #: ../data/ui/PreferencesVarietyDialog.ui.h:158 msgctxt "Icon option" msgid "Custom image..." msgstr "定制图片" #: ../data/ui/PreferencesVarietyDialog.ui.h:159 msgctxt "Icon option" msgid "None" msgstr "无" #: ../data/ui/PreferencesVarietyDialog.ui.h:160 msgid "Select an icon" msgstr "选择图标" #: ../data/ui/PreferencesVarietyDialog.ui.h:161 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.h:162 msgid "Favorites Operations" msgstr "收藏夹操作" #: ../data/ui/PreferencesVarietyDialog.ui.h:163 msgid "Favorites operations to show in main menu:" msgstr "在主菜单显示收藏夹操作" #: ../data/ui/PreferencesVarietyDialog.ui.h:164 msgid "Copy to Favorites" msgstr "拷贝到收藏夹" #: ../data/ui/PreferencesVarietyDialog.ui.h:166 msgid "Both Copy and Move" msgstr "拷贝且移动" #: ../data/ui/PreferencesVarietyDialog.ui.h:167 msgid "Depends on folder..." msgstr "依赖文件夹..." #: ../data/ui/PreferencesVarietyDialog.ui.h:170 msgid "Display dialog to customize the Facebook post before publishing" msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:171 msgid "Login Screen Support" msgstr "登录屏支持" #: ../data/ui/PreferencesVarietyDialog.ui.h:172 msgid "" "Make sure the wallpapers set by Variety will be used on the login screen" msgstr "确认登录屏壁纸由Variety设置" #: ../data/ui/PreferencesVarietyDialog.ui.h:173 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.h:174 msgid "Copy wallpaper image files to this folder: " msgstr "复制壁纸图片到该文件夹: " #: ../data/ui/PreferencesVarietyDialog.ui.h:175 msgid "Reset to default" msgstr "重置为默认设置" #: ../data/ui/PreferencesVarietyDialog.ui.h:176 msgid "Still doesn't work?" msgstr "还不能工作?" #: ../data/ui/PreferencesVarietyDialog.ui.h:177 msgid "" "It seems your home folder is encrypted, so using folders inside it will not " "work." msgstr "貌似你的主文件夹被加密了,因此其中的文件夹不能使用。" #: ../data/ui/PreferencesVarietyDialog.ui.h:178 msgid "You don't have write permissions for this folder." msgstr "你没有这个文件夹的写权限:" #: ../data/ui/PreferencesVarietyDialog.ui.h:179 msgid "Permissions do not allow LightDM to read files from this folder." msgstr "该文件夹没有赋予LightDM读文件的权限" #: ../data/ui/PreferencesVarietyDialog.ui.h:180 msgid "" "Variety can adjust the permissions, but you will have to provide superuser " "privileges." msgstr "Variety能够调整权限,但你必须提供超级用户的权限。" #: ../data/ui/PreferencesVarietyDialog.ui.h:181 msgid "Customize" msgstr "自定义" #: ../data/ui/PreferencesVarietyDialog.ui.h:182 msgid "Tips and tricks" msgstr "提示和窍门" #: ../data/ui/PreferencesVarietyDialog.ui.h:183 msgid "Recent changes" msgstr "最近切换" #: ../data/ui/PreferencesVarietyDialog.ui.h:184 msgid "Visit website" msgstr "浏览网站" #: ../data/ui/PreferencesVarietyDialog.ui.h:185 msgid "Report a bug or request a feature" msgstr "报告BUG或申请特性" #: ../data/ui/PreferencesVarietyDialog.ui.h:186 msgid "Send feedback" msgstr "发送反馈" #: ../data/ui/PreferencesVarietyDialog.ui.h:187 msgid "Donate to Variety" msgstr "捐赠 Variety" #: ../data/ui/PreferencesVarietyDialog.ui.h:188 msgid "Donate via PayPal" msgstr "通过PayPal捐赠" #: ../data/ui/PreferencesVarietyDialog.ui.h:189 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.h:193 msgid "" "For Bitcoin and other payment methods please go to Variety's website." msgstr "" #: ../data/ui/PreferencesVarietyDialog.ui.h:194 msgid "Donate" msgstr "捐赠" #: ../variety/FacebookHelper.py:116 msgid "Authorization successful" msgstr "" #: ../variety/FacebookHelper.py:116 msgid "Publishing..." msgstr "" #: ../variety/FacebookHelper.py:121 msgid "Authorization failed" msgstr "" #: ../variety/ThumbsManager.py:42 msgid "Top" msgstr "顶部" #: ../variety/ThumbsManager.py:43 msgid "Left" msgstr "左侧" #: ../variety/ThumbsManager.py:94 msgid "Position" msgstr "位置" #: ../variety/ThumbsManager.py:109 msgid "Show Containing Folder" msgstr "显示包含的文件夹" #: ../variety/ThumbsManager.py:136 ../variety/indicator.py:156 msgid "Set EXIF Rating" msgstr "" #: ../variety/ThumbsManager.py:160 ../variety/indicator.py:87 msgid "Delete to _Trash" msgstr "移动到回收站(_T)" #: ../variety/ThumbsManager.py:167 ../variety/indicator.py:131 msgid "Where is it from?" msgstr "" #: ../variety/ThumbsManager.py:178 msgid "Close" msgstr "关闭" #: ../variety/ThumbsManager.py:198 msgid "Could not set EXIF rating" msgstr "" #: ../variety/ThumbsManager.py:217 msgid "Unrated" msgstr "未评级的" #: ../variety/ThumbsManager.py:224 msgid "Rejected" msgstr "已拒绝" #: ../variety/ThumbsManager.py:324 msgid "Variety History" msgstr "Variety 历史" #: ../variety/ThumbsManager.py:326 msgid "Variety Recent Downloads" msgstr "Variety 最近下载" #: ../variety/ThumbsManager.py:328 msgid "Variety Images" msgstr "Variety 图片" #: ../data/ui/AddWallbaseDialog.ui.h:1 msgid "Variety - add Wallbase.cc image source" msgstr "Variety -增加Wallbase.cc 图片源" #: ../data/ui/AddWallbaseDialog.ui.h:2 msgid "Wallbase.cc" msgstr "" #: ../data/ui/AddWallbaseDialog.ui.h:3 msgid "" "Wallbase.cc is permanently down. Use Wallhaven.cc instead. Support for " "Wallbase.cc will be dropped completely in a future release, please remove or " "update your existing Wallbase sources." msgstr "" #: ../data/ui/AddWallbaseDialog.ui.h:4 msgid "" "Wallbase.cc provides a variety of image " "search options. Below you can specify keywords to search for, or visit Wallbase.cc, setup your search criteria " "there, ensure you like the results, and paste the full Wallbase URL in the " "box.\n" "\n" "If you specify keywords, the most liked safe-for-work images that match any " "of the keywords will be used. \n" "\n" "If you specify a Wallbase 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." msgstr "" #: ../data/ui/FacebookPublishDialog.ui.h:1 msgid "Variety - Publish to Facebook" msgstr "Variety - 发布到 Facebook" #: ../data/ui/FacebookPublishDialog.ui.h:2 ../variety/indicator.py:149 #: ../variety/indicator.py:223 msgid "Share on Facebook" msgstr "分享到 Facebook" #: ../data/ui/FacebookPublishDialog.ui.h:3 msgid "" "Publish a link to the current wallpaper on Facebook. Include this text along " "with the link (or just leave empty):" msgstr "" #: ../data/ui/FacebookPublishDialog.ui.h:4 msgid "Use current quote" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:1 msgid "Variety - VRTY.ORG registration" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:2 msgid "Would you like to register?" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:3 msgid "" "You may participate in VRTY.ORG " "anonymously, but registration enables some very nice features, such as synchronization of favorites between computers and " "personalized recommendations. It also ensures " "you will not lose your profile and favorite wallpapers if you reinstall your " "OS." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:4 msgid "Registration is very easy and does not require any personal data." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:5 msgid "" "If you choose to participate anonymously, you can register later from the " "\"Sync and social\" page in Preferences." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:6 msgid "" "Oops, we could not connect to VRTY.ORG. Server might be down. Please wait a " "couple of minutes and try again or choose \"Participate anonymously\" and register later " "from the \"Sync and social\" page in " "Preferences." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:7 msgid "" "Please continue the registration and follow the instructions in the browser " "tab we opened." msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:8 msgid "I will participate anonymously" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:9 msgid "I'm registered, let me login" msgstr "" #: ../data/ui/SmartRegisterDialog.ui.h:10 msgid "Register here" msgstr "" #: ../variety.desktop.in.h:1 msgid "Variety" msgstr "" #: ../variety.desktop.in.h:2 msgid "Variety Wallpaper Changer" msgstr "Variety 壁纸切换器" #: ../variety.desktop.in.h:3 msgid "Next" msgstr "下一个" #: ../variety.desktop.in.h:4 msgid "Previous" msgstr "上一个" #: ../variety.desktop.in.h:5 msgid "Pause / Resume" msgstr "暂停 / 恢复" #: ../variety.desktop.in.h:6 msgid "History" msgstr "历史" #: ../variety.desktop.in.h:7 msgid "Preferences" msgstr "首选项" #: ../data/plugins/quotes/LocalFilesSource.py:34 msgid "" "Displays quotes, defined in local text files.\n" "Put your own txt files in: ~/.config/variety/pluginconfig/quotes/.\n" "The file format is:\n" "\n" "quote -- author\n" ".\n" "second quote -- another author\n" ".\n" "etc...\n" "\n" "Example: http://rvelthuis.de/zips/quotes.txt" msgstr "" #: ../variety/indicator.py:49 ../variety/indicator.py:96 #: ../variety/indicator.py:166 msgid "_Next" msgstr "下一个(_N)" #: ../variety/indicator.py:54 ../variety/indicator.py:101 #: ../variety/indicator.py:171 msgid "_Previous" msgstr "上一个(_P)" #: ../variety/indicator.py:61 msgid "Current desktop wallpaper" msgstr "当前桌面壁纸" #: ../variety/indicator.py:65 msgid "Show origin" msgstr "" #: ../variety/indicator.py:106 ../variety/indicator.py:176 msgid "_Next, skipping forward history" msgstr "" #: ../variety/indicator.py:114 msgid "" "Tip: Scroll wheel over icon\n" "for Next and Previous" msgstr "" "Tip: 在缩略图上滚动滚轮\n" "可以向前或向后切换" #: ../variety/indicator.py:124 msgid "_Image" msgstr "" #: ../variety/indicator.py:135 msgid "Show without effects" msgstr "" #: ../variety/indicator.py:143 msgid "Google Image Search" msgstr "" #: ../variety/indicator.py:196 msgid "View Favorites..." msgstr "" #: ../variety/indicator.py:203 msgid "Copy to Clipboard" msgstr "复制到剪贴板" #: ../variety/indicator.py:213 msgid "Google Quote" msgstr "" #: ../variety/indicator.py:218 msgid "Google Author" msgstr "" #: ../variety/indicator.py:230 ../variety/indicator.py:284 msgid "Preferences..." msgstr "首选项..." #: ../variety/indicator.py:238 msgid "Turn off" msgstr "关闭" #: ../variety/indicator.py:244 msgid "_Quote" msgstr "" #: ../variety/indicator.py:251 msgid "_History" msgstr "历史(_H)" #: ../variety/indicator.py:257 msgid "_Wallpaper Selector" msgstr "" #: ../variety/indicator.py:263 msgid "Recent _Downloads" msgstr "最近下载(_D)" #: ../variety/indicator.py:278 msgid "Start Slideshow" msgstr "" #: ../variety/indicator.py:288 msgid "About" msgstr "关于" #: ../variety/indicator.py:292 msgid "Quit" msgstr "退出" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:1 msgid "Copy to Favorites vs. Move to Favorites" msgstr "" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:2 msgid "Reset to Default" msgstr "重置为默认值" #: ../data/ui/EditFavoriteOperationsDialog.ui.h:3 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.h:4 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 "" #: ../variety/ImageFetcher.py:56 ../variety/ImageFetcher.py:103 msgid "Fetching" msgstr "正在获取" #. too small - delete and do not use #: ../variety/ImageFetcher.py:118 msgid "Image too small, ignoring it" msgstr "图片太小略过它" #: ../variety/ImageFetcher.py:140 #, python-format msgid "Sorry, got %s error..." msgstr "" #: ../variety/ImageFetcher.py:141 msgid "This means the link is no longer valid" msgstr "" #: ../variety/ImageFetcher.py:144 msgid "Fetch failed for some reason" msgstr "因为某些原因获取失败" #: ../variety/ImageFetcher.py:145 msgid "" "To get more information, please run Variety from terminal with -v option and " "retry the action" msgstr "要获取更多信息,请在终端中以 -v 参数运行 Variety 然后重试操作" variety/variety_lib/0000775000000000000000000000000012657457236011763 5ustar variety/variety_lib/varietyconfig.py0000664000000000000000000000424112655733065015202 0ustar # -*- 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 Variety CONFIGURATION FILE # YOU CAN PUT THERE SOME GLOBAL VALUE # Do not touch unless you know what you're doing. # you're warned :) __all__ = [ 'project_path_not_found', 'get_data_file', 'get_data_path', ] # Where your project will look for your data (for instance, images and ui # files). By default, this is ../data, relative your trunk layout __variety_data_directory__ = '../data/' __license__ = 'GPL-3' __version__ = '0.6.0' 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__ variety/variety_lib/Builder.py0000644000000000000000000002620212641772700013710 0ustar # -*- 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''' from gi.repository import GObject, Gtk # pylint: disable=E0611 import inspect import functools import logging logger = logging.getLogger('variety_lib') from xml.etree.cElementTree import ElementTree # 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.getiterator("object") for ele_widget in ele_widgets: name = ele_widget.attrib['id'] 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.getiterator("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 iterator(): '''Support 'for o in self' ''' return iter(widget_dict.values()) setattr(self, '__iter__', iterator) def __getitem__(self, name): '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 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 = 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/variety_lib/PreferencesDialog.py0000644000000000000000000000460312641772700015704 0ustar # -*- 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 """ from gi.repository import Gtk # pylint: disable=E0611 import logging logger = logging.getLogger('variety_lib') from . helpers import get_builder, show_uri, get_help_uri 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/variety_lib/__init__.py0000644000000000000000000000165412641772700014065 0ustar # -*- 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 . helpers import set_up_logging from . varietyconfig import get_version variety/variety_lib/helpers.py0000644000000000000000000000775612641772700014001 0ustar # -*- 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 . varietyconfig import get_data_file from . Builder import Builder 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 class NullHandler(logging.Handler): def emit(self, record): pass def set_up_logging(opts): # add a handler to prevent basicConfig root = logging.getLogger() null_handler = 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(os.path.expanduser(u"~/.config/variety/"), "variety.log"), "w") logger_file.setFormatter(formatter) logger.addHandler(logger_file) except Exception: logger.exception("Could not create file logger") pass lib_logger = logging.getLogger('variety_lib') lib_logger_sh = logging.StreamHandler() lib_logger_sh.setFormatter(formatter) lib_logger.addHandler(lib_logger_sh) # Set the logging level to show debug messages. if opts.verbose: logger.setLevel(logging.INFO) logger.debug('logging enabled') if opts.verbose > 1: logger.setLevel(logging.DEBUG) if opts.verbose > 2: lib_logger.setLevel(logging.DEBUG) 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/variety_lib/AboutDialog.py0000644000000000000000000000357512641772700014524 0ustar # -*- 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 . 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) variety/tests/0000775000000000000000000000000012641771331010600 5ustar variety/tests/TestQuotesDaddySource.py0000664000000000000000000000235112641771331015422 0ustar #!/usr/bin/python2 # -*- 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 import os.path import unittest sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) from jumble.Jumble import Jumble class TestQuotesDaddySource(unittest.TestCase): def test_get_random(self): p = Jumble(["../data/plugins"]) p.load() source = p.get_plugins(typename="QuotesDaddySource")[0] q = source["plugin"].get_random()[0] self.assertEqual("QuotesDaddy", q["sourceName"]) variety/tests/TestDownloader.py0000664000000000000000000000234412641771331014113 0ustar #!/usr/bin/python2 # -*- 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 import os.path import unittest sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) from variety.Downloader import Downloader class TestDownloader(unittest.TestCase): def test_convert_url(self): self.assertEqual("wallpapers_net_some_category_html", Downloader("", "", "", ".").convert_to_filename("http://wallpapers.net/some-category.html")) if __name__ == '__main__': unittest.main() variety/tests/TestBingDownloader.py0000664000000000000000000000225512641771331014714 0ustar #!/usr/bin/python2 # -*- 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 import os.path import unittest sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) from variety.BingDownloader import BingDownloader class TestBingDownloader(unittest.TestCase): def test_fill_queue(self): dl = BingDownloader(None) dl.fill_queue() self.assertTrue(len(dl.queue) > 0) if __name__ == '__main__': unittest.main() variety/tests/TestJumble.py0000664000000000000000000000257012641771331013234 0ustar #!/usr/bin/python2 # -*- 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 import os.path import unittest sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) from jumble.Jumble import Jumble from jumble.IPlugin import IPlugin from variety.plugins.IQuoteSource import IQuoteSource class P1(IPlugin): pass class P2(IQuoteSource): pass class TestJumble(unittest.TestCase): def test_load(self): p = Jumble(["../data/plugins"]) p.load() self.assertEqual(4, len(p.get_plugins())) self.assertEqual(4, len(p.get_plugins(IPlugin))) self.assertEqual(1, len(p.get_plugins(name="Goodreads"))) variety/tests/TestImageFetcher.py0000664000000000000000000000461512641771331014343 0ustar #!/usr/bin/python2 # -*- 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 import os.path import unittest sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) from variety.ImageFetcher import ImageFetcher class TestImageFetcher(unittest.TestCase): 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/tests/test.jpg.metadata.json0000664000000000000000000000052212641771331015007 0ustar { "sourceURL": "b", "sourceType": "flickr", "sourceName": "a", "authorURL": "url", "keywords": [ "дума1", "дума2" ], "sourceLocation": "c", "description": "проба2", "author": "автор", "headline": "проба1", "sfwRating": 50, "imageURL": "d" }variety/tests/TestMediaRssDownloader.py0000664000000000000000000000326612641771331015547 0ustar #!/usr/bin/python2 # -*- 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 import os.path import unittest sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) from variety.MediaRssDownloader import MediaRssDownloader class TestFlickrDownloader(unittest.TestCase): def test_validate_deviantart(self): self.assertTrue(MediaRssDownloader.validate("http://backend.deviantart.com/rss.xml?q=boost%3Apopular+leaves&type=deviation")) def test_validate_picasa(self): self.assertTrue(MediaRssDownloader.validate("https://picasaweb.google.com/data/feed/base/user/111758109475195528754/albumid/5731259484758046113?alt=rss&kind=photo&hl=bg")) 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/tests/fake_image.jpg0000664000000000000000000000001412641771331013345 0ustar Not an imagevariety/tests/TestQuotationsPageSource.py0000664000000000000000000000402712641771331016141 0ustar #!/usr/bin/python2 # -*- 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 import os.path import unittest sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) from jumble.Jumble import Jumble class TestQuotationsPageSource(unittest.TestCase): def test_get_random(self): p = Jumble(["../data/plugins"]) 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(["../data/plugins"]) 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(["../data/plugins"]) 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/tests/__init__.py0000664000000000000000000000000012641771331012677 0ustar variety/tests/TestUnsplashDownloader.py0000664000000000000000000000241412641771331015627 0ustar #!/usr/bin/python2 # -*- 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 import os.path import unittest sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) from variety.UnsplashDownloader import UnsplashDownloader class TestUnsplashDownloader(unittest.TestCase): def test_unsplash_downloader(self): dl = UnsplashDownloader(None) dl.target_folder = '/tmp/variety/' dl.fill_queue() self.assertTrue(len(dl.queue) > 0) dl.download_one() if __name__ == '__main__': unittest.main() variety/tests/test_lint.py0000664000000000000000000000315312641771331013161 0ustar #!/usr/bin/python2 # -*- 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 import subprocess 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(["pylint", '-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/tests/test.jpg0000664000000000000000000001077612641771331012274 0ustar JFIF.ExifII* проба2 http://ns.adobe.com/xap/1.0/ дума1 дума2 автор проба2 HPhotoshop 3.08BIM, дума1 дума2i проба1C     C   ]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[ # 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 import os.path import unittest sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) from variety.RedditDownloader import RedditDownloader class TestRedditDownloader(unittest.TestCase): def test_build_json_url(self): self.assertEquals('http://www.reddit.com/r/comics/.json?limit=100', RedditDownloader.build_json_url('http://www.reddit.com/r/comics/')) self.assertEquals('http://www.reddit.com/r/comics/top/.json?limit=100', RedditDownloader.build_json_url('http://www.reddit.com/r/comics/top/')) self.assertEquals('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): self.assertTrue(RedditDownloader.validate('http://www.reddit.com/r/comics')) self.assertTrue(RedditDownloader.validate('http://www.reddit.com/r/comics/')) self.assertTrue(RedditDownloader.validate('http://www.reddit.com/r/AutumnPorn/')) self.assertTrue(RedditDownloader.validate('http://www.reddit.com/r/AutumnPorn/top?sort=top&t=month')) self.assertFalse(RedditDownloader.validate('http://www.reddit.com/r/bestof/')) self.assertFalse(RedditDownloader.validate('http://www.reddit.com/r/dhkjregfhjregfjfdrejh/')) self.assertFalse(RedditDownloader.validate('http://www.notreddit.com/r/dhkjregfhjregfjfdrejh/')) if __name__ == '__main__': unittest.main() variety/tests/TestGoodreadsSource.py0000664000000000000000000000244012641771331015102 0ustar #!/usr/bin/python2 # -*- 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 import os.path import unittest sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) from jumble.Jumble import Jumble class TestGoodreadsSource(unittest.TestCase): def test_get_for_author(self): p = Jumble(["../data/plugins"]) p.load() source = p.get_plugins(typename="GoodreadsSource")[0] q = source["plugin"].get_for_author(u"Вежинов") self.assertTrue(len(q) > 0) self.assertEqual("Goodreads", q[0]["sourceName"]) variety/tests/TestVarietyWindow.py0000664000000000000000000000271412641771331014631 0ustar #!/usr/bin/python2 # -*- 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 import os.path import unittest sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) 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/tests/TestFlickrDownloader.py0000664000000000000000000000541112641771331015244 0ustar #!/usr/bin/python2 # -*- 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 import os.path import unittest sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) from variety.FlickrDownloader import FlickrDownloader class TestFlickrDownloader(unittest.TestCase): 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.assertEquals('https://farm9.staticflickr.com/8426/7527967456_946cc5d94b_o.jpg', FlickrDownloader.get_image_url('https://www.flickr.com/photos/peter-levi/7527967456/')) def test_get_extra_metadata(self): expected = { 'headline': u'IMG_1924', 'keywords': [u'greece', u'greek', u'islands'], 'description': u'', 'authorURL': u'https://www.flickr.com/photos/93647178@N00', 'author': u'Peter Levi' } self.assertEquals(expected, FlickrDownloader.get_extra_metadata('https://www.flickr.com/photos/peter-levi/7527967456/')) if __name__ == '__main__': unittest.main() variety/tests/test.svg0000664000000000000000000003242712641771331012310 0ustar image/svg+xml variety/tests/TestUtil.py0000664000000000000000000002514012641771331012731 0ustar #!/usr/bin/python2 # -*- 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 import os.path import unittest import time sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) from variety.Util import Util, debounce, throttle class TestUtil(unittest.TestCase): 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.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': u'b', 'imageURL': u'd', 'sourceName': u'a', 'sourceLocation': u'c', 'sourceType': u'flickr', 'author': u'автор', 'authorURL': u'url', 'keywords': [u'дума1', u'дума2'], 'headline': u'проба1', 'description': u'проба2', 'sfwRating': 50, } self.assertTrue(Util.write_metadata('test.jpg', info)) self.assertEqual(info, Util.read_metadata('test.jpg')) self.assertTrue(os.path.exists('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')) 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.assertEquals('/etc/fstab_1', Util.find_unique_name('/etc/fstab')) self.assertEquals('/etc/bash_1.bashrc', Util.find_unique_name('/etc/bash.bashrc')) def test_folderpath(self): self.assertEquals("/", Util.folderpath("/")) self.assertEquals("/a/b/c/", Util.folderpath("/a/b/c")) def test_gtk_to_fcmatch_font(self): self.assertEquals( ("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.assertEquals(-1, Util.compare_versions("0.4.10", "0.4.11")) self.assertEquals(-1, Util.compare_versions("0.4.10", "0.5")) self.assertEquals(-1, Util.compare_versions("0.4.10", "1")) self.assertEquals(0, Util.compare_versions("0.4.10", "0.4.10")) self.assertEquals(1, Util.compare_versions("0.4.10", "0.4.8")) self.assertEquals(1, Util.compare_versions("0.4.10", "0.4")) self.assertEquals(1, Util.compare_versions("0.4.10", "0")) def test_md5(self): self.assertEquals("098f6bcd4621d373cade4e832627b4f6", Util.md5("test")) def test_md5file(self): self.assertEquals("09e0399cd580cdae81102e676802e3cb", Util.md5file("test.jpg")) def test_collapseuser(self): self.assertEquals("~/.config/variety", Util.collapseuser("/home/peter/.config/variety")) self.assertEquals("/home/peteraaa/.config/variety", Util.collapseuser("/home/peteraaa/.config/variety")) self.assertEquals("/media/.config/variety", Util.collapseuser("/media/.config/variety")) def test_random_hash(self): s = set(Util.random_hash() for i in xrange(100)) self.assertEquals(100, len(s)) for x in s: self.assertEquals(32, len(x)) def test_get_file_icon_name(self): self.assertEquals("folder", Util.get_file_icon_name("/xxx/yyy/zzz")) # nonexistent self.assertEquals("user-home", Util.get_file_icon_name("~")) self.assertEquals("folder-pictures", Util.get_file_icon_name("~/Pictures")) def test_get_xdg_pictures_folder(self): self.assertEquals(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.assertEquals([20,30], list(Util.safe_map(f, [1,5,20,10,30,4]))) def test_urlopen(self): resp = Util.urlopen("//google.com") self.assertTrue(len(resp.read()) > 0) def test_get_size(self): self.assertEquals((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_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.google.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('http://upload.wikimedia.org/wikipedia/commons/5/53/Wikipedia-logo-en-big.png')) 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_guess_image_url(self): self.assertEquals('https://farm5.staticflickr.com/4032/4558166441_4e34855b39_o.jpg', Util.guess_image_url({'sourceURL': 'https://www.flickr.com/photos/83646108@N00/4558166441'})) self.assertEquals('https://farm5.staticflickr.com/4077/4768189432_24275ea76b_b.jpg', Util.guess_image_url({'sourceURL': 'http://www.flickr.com/photos/52821721@N00/4768189432'})) self.assertEquals('http://fc04.deviantart.net/fs71/i/2011/319/4/f/scarlet_leaf_wallpaper_by_venomxbaby-d4gc238.jpg', Util.guess_image_url({'sourceURL': 'http://fc04.deviantart.net/fs71/i/2011/319/4/f/scarlet_leaf_wallpaper_by_venomxbaby-d4gc238.jpg'})) def test_guess_source_type(self): self.assertEquals(None, Util.guess_source_type({})) self.assertEquals('wn', Util.guess_source_type({'sourceName': 'Wallpapers.net'})) self.assertEquals('mediarss', Util.guess_source_type({'sourceName': 'host.com', 'sourceLocation': 'http://host.com/rss'})) self.assertEquals('mediarss', Util.guess_source_type({'sourceName': 'camelid.deviantart.com', 'sourceLocation': 'http://backend.deviantart.com/rss.xml?type=deviation&q=by%3ACamelid+sort%3Atime+meta%3Aall'})) 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.3) def increment(): count[0] += 1 self.assertTrue(count[0] == 0) increment() increment() time.sleep(0.2) self.assertTrue(count[0]== 0) increment() increment() increment() increment() self.assertTrue(count[0] == 0) time.sleep(0.3) 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) if __name__ == '__main__': unittest.main() variety/tests/test.svg.metadata.json0000664000000000000000000000052212641771331015026 0ustar { "sourceURL": "b", "sourceType": "flickr", "sourceName": "a", "authorURL": "url", "keywords": [ "дума1", "дума2" ], "sourceLocation": "c", "description": "проба2", "author": "автор", "headline": "проба1", "sfwRating": 50, "imageURL": "d" }variety/debian/0000775000000000000000000000000012657457234010672 5ustar variety/debian/copyright0000444000000000000000000000056212652625355012620 0ustar Format: 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, Peter Levi License: GPL-3 The full text of the GPL is distributed in /usr/share/common-licenses/GPL-3 on Debian systems. variety/debian/compat0000664000000000000000000000000212641771331012056 0ustar 8 variety/debian/changelog0000664000000000000000000007646412657457234012565 0ustar 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/debian/control0000664000000000000000000000230412657457232012272 0ustar Source: variety Section: python Priority: extra Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-distutils-extra (>= 2.10) Maintainer: Peter Levi Standards-Version: 3.9.3 XS-Python-Version: current Package: variety Architecture: all XB-Python-Version: ${python:Versions} Depends: ${misc:Depends}, ${python:Depends}, gir1.2-notify-0.7, python-configobj, python-pyexiv2, gir1.2-gtk-3.0, python-dbus, gir1.2-pango-1.0, gir1.2-glib-2.0, python-pycurl, python-pil, python-cairo, gir1.2-gdkpixbuf-2.0, python-lxml, python-bs4, gir1.2-webkit-3.0, gir1.2-appindicator3-0.1, yelp, imagemagick, python-lxml, python-gi-cairo Recommends: variety-slideshow Description: Wallpaper changer, downloader and manager Variety changes the desktop wallpaper regularly, using local 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 forthVariety can fetch wallpapers from Flickr, Wallbase.cc, Wallpapers.net, NASA Astronomy Picture of the Day, Desktoppr.co. Media RSS feeds from Picasa, deviantART or any other place are also supported. variety/debian/rules0000755000000000000000000000021412657457220011740 0ustar #!/usr/bin/make -f %: ifneq ($(shell dh -l | grep -xF translations),) dh $@ --with python2,translations else dh $@ --with python2 endif variety/variety.desktop.in0000664000000000000000000000133112641771331013117 0ustar [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; [Desktop Action Next] Exec=variety --next _Name=Next OnlyShowIn=Unity; [Desktop Action Previous] Exec=variety --previous _Name=Previous OnlyShowIn=Unity; [Desktop Action PauseResume] Exec=variety --toggle-pause _Name=Pause / Resume OnlyShowIn=Unity; [Desktop Action History] Exec=variety --history _Name=History OnlyShowIn=Unity; [Desktop Action Preferences] Exec=variety --preferences _Name=Preferences OnlyShowIn=Unity; variety/AUTHORS0000664000000000000000000000007112641771331010504 0ustar Copyright (c) 2012, Peter Levi variety/data/0000775000000000000000000000000012641771331010347 5ustar variety/data/ui/0000775000000000000000000000000012655733065010773 5ustar variety/data/ui/AddRedditDialog.ui0000664000000000000000000002337112641771331014275 0ustar 700 False 5 Variety - add Reddit feed ../media/variety.svg normal 600 True False vertical 2 True False start 10 10 15 Reddit False True 0 True True start 10 10 15 Enter the name of a subreddit or paste the full URL of a subreddit or a <a href="http://reddit.com">Reddit</a> 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. Example: You may specify simply 'comics' or <a href="http://www.reddit.com/r/comics">http://www.reddit.com/r/comics</a> Example: Top posts from the month: <a href="http://www.reddit.com/r/comics/top/?sort=top&amp;t=month">http://www.reddit.com/r/comics/top/?sort=top&amp;t=month</a> True fill True 130 False True 1 True False True False 10 URL or name of a subreddit: False True 0 True True True True 10 True True True False True 1 False True 2 True False end start False Just a moment to check what's there False True 0 False end 10 False True 1 True False end 5 20 False True 2 False True 3 True False end gtk-cancel False True True True False True False False 0 gtk-ok False True True True True True 5 False True False False 1 False True end 4 btn_cancel btn_ok variety/data/ui/WelcomeDialog.ui0000664000000000000000000002456012641771331014045 0ustar 750 520 False 5 Welcome to Variety! False True center-always ../media/variety.svg normal 750 520 True False start vertical True False end 15 10 end Continue False True True True True False 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="http://peterlevi.com/variety/donate/">donate</a>. True fill True 130 False True 3 True True start start 20 0 Now please take some time to set your preferences on the following screens. True fill True 130 False True 4 True True 1 False 25 25 40 vertical True False start 10 KDE Users - Important, please read: False True 0 True False start start You appear to be running KDE. In KDE 4 it is impossible to set the wallpaper from inside a program - there is no API for this. To make Variety work, <a href="http://peterlevi.com/variety/2014/05/variety-and-kde/">please read and follow the instructions here</a>. True fill True 130 False True 1 True True 2 continue_button variety/data/ui/SmartFeaturesConfirmationDialog.ui0000664000000000000000000001421012641771331017577 0ustar 600 False 5 VRTY.ORG integration ../media/variety.svg normal True False vertical 2 True False end gtk-ok False True True True False True False False 0 False True end 0 True False 15 15 20 vertical True False start start 10 This feature requires VRTY.ORG integration False True 0 Enable VRTY.ORG integration False True True False start 10 False 0 True True False True 1 True False start 7 For this feature Variety needs permission to collect data about the images you like or dislike and the online sources you have enabled. Collected data is anonymous by default and covers only images which Variety downloaded, never images you already had in your local folders that might be private. This data helps us provide better images for everyone and fuels <a href="https://vrty.org">VRTY.ORG</a> - a valuable resource for all users of Variety. True fill True 130 False True 2 False True 1 btn_ok variety/data/ui/add_media_rss_dialog.xml0000664000000000000000000000060512641771331015604 0ustar variety/data/ui/FacebookPublishDialog.ui0000664000000000000000000002343412641771331015511 0ustar False 5 Variety - Publish to Facebook ../media/variety.svg normal 700 True False vertical 2 True False 15 end gtk-cancel False True True True False True False False 0 gtk-ok False True True True False True False False 1 False True end 0 True False vertical True False start start 5 20 15 Share on Facebook True True 0 True False start 20 20 Publish a link to the current wallpaper on Facebook. Include this text along with the link (or just leave empty): True 130 False True 1 True False True True 20 20 10 7 True in True True True False True 0 160 100 True False 20 10 10 False True 1 False True 2 Use current quote False True True True start 20 7 False False True 3 Do not ask anymore, always use the text above False True True False 20 False 0 True False True 4 False True 1 btn_cancel btn_ok variety/data/ui/smart_features_confirmation_dialog.xml0000664000000000000000000000067512641771331020631 0ustar variety/data/ui/LoginOrRegisterDialog.ui0000664000000000000000000004060412641771331015525 0ustar 750 520 False 5 Login to VRTY.ORG True center-always True ../media/variety.svg normal 750 520 True False vertical 2 True False end False True end 0 True False 25 25 True vertical True False start start 20 10 Login to VRTY.ORG False True 0 True False ../media/vrty-login.png False True 1 True False 100 100 20 20 10 True False end Username: 0 0 1 1 True False end 0 Password: 0 1 1 1 30 True True True True True 30 1 0 1 1 30 True True False True 1 1 1 1 False True 2 No account? Register here False True True True True center False none http://vrty.org/register False True 3 Forgot your password? False True True True True center False none http://vrty.org/password-recovery False True 4 True True 7 Tip: You can also login to <a href="https://vrty.org">VRTY.ORG</a> in a browser and click the link <span weight="bold">"Trigger Variety login"</span> in your profile. True 130 False True 5 True False end True vertical True False end False end label True False True 0 False True 1 True False end False end 10 5 False True 0 gtk-cancel False 80 True True True False True False True 1 Login False 80 30 True True True True True end 5 False False True 2 False True 2 False True end 6 True True 1 variety/data/ui/facebook_publish_dialog.xml0000664000000000000000000000062212641771331016324 0ustar variety/data/ui/welcome_dialog.xml0000664000000000000000000000055712641771331014467 0ustar variety/data/ui/add_reddit_dialog.xml0000664000000000000000000000057012641771331015112 0ustar variety/data/ui/AddWallpapersNetCategoryDialog.ui0000664000000000000000000002277112641771331017344 0ustar 500 False 5 Variety - add Wallpapers.net category True True ../media/variety.svg normal 600 True False vertical 2 True False start 10 10 15 Wallpapers.net False True 0 True False start 10 5 True Please visit <a href="http://wallpapers.net">wallpapers.net</a> and choose a category with wallpapers, then paste its URL below. A category is anything on the site that has one or more pages with wallpapers on them. Here are some examples: All wallpapers: <a href="http://www.wallpapers.net/">http://www.wallpapers.net/</a> Specific resolution: <a href="http://www.wallpapers.net/2560x1440-wallpapers_r19">http://www.wallpapers.net/2560x1440-wallpapers_r19</a> True fill True 130 False True 1 True False 30 True False 10 Paste URL here: False True 0 True True True True True False True 1 False True 2 True False 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 3 True False end False Just a moment to check what's at that URL False True 0 False end 10 False True 1 True False end 20 False True 2 False True 4 btn_cancel btn_ok variety/data/ui/facebook_first_run_dialog.xml0000664000000000000000000000062512641771331016674 0ustar variety/data/ui/about_variety_dialog.xml0000664000000000000000000000061712641771331015706 0ustar variety/data/ui/edit_favorite_operations_dialog.xml0000664000000000000000000000066112641771331020117 0ustar variety/data/ui/add_wallhaven_dialog.xml0000664000000000000000000000060612641771331015620 0ustar variety/data/ui/PreferencesVarietyDialog.ui0000664000000000000000000105157512655731434016273 0ustar 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 True ../media/variety.svg normal True False vertical True True 10 10 10 True False True vertical True False start vertical True False start 15 10 General False True 0 Start Variety when the computer starts False True True False start 30 0 True False True 1 True False 30 10 True Change wallpaper every False True True False 0 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 False True True False start 30 0 True False True 3 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 200 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 _Edit... False True True True Edit the selected source Edit the selected source 2 True False True 1 _Remove... False True True True True Remove selected image sources Remove selected image sources 2 True False True 2 _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 3 False True 1 True True 1 False True 1 True False end vertical True False end vertical True False end 30 20 10 True Download a wallpaper every False True True False 0 0.49000000953674316 True False True 0 True True True Minimum interval is one minute Minimum interval is one minute 4 False True 1 True False True Minimum interval is one minute Minimum interval is one minute liststore_download_interval 0 0 False True 5 2 True False to False True 3 Label False 30 True True True True 0 False True 4 True False False True 5 False True 0 False False end 30 25 5 5 Actual download folder fill True word-char False True 1 True False Caution: do NOT use this option if you use a custom download folder with valuable files in it. Variety will maintain the limit regardless of what is in the download folder. end 30 10 Limit download folder to False True True False 0 0.49000000953674316 True False True 0 True True True Minimum size is 50 MB Minimum size is 50 MB 6 False True 1 True False 7 20 MB by deleting oldest files when necessary False True 2 False True 2 False True 0 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 1 False True 2 True False General False True False vertical True False start 15 10 Filters False True 0 True False 10 vertical True False start 20 20 7 Randomly apply these filters to the displayed wallpapers (thanks to the wonderful ImageMagick): fill True False True 0 True False 20 20 10 vertical 20 False True 1 False True 1 True False vertical True False start 15 15 Quotes False True 0 Show random wise quotes on the desktop False True True False start 30 7 0 True False True 1 True True 30 5 True False vertical True False 30 5 True False 0 Text color: False True 0 False True True True False True 1 True False start 10 0 Text font: False True 2 False True True True 10 Sans 12 Neither success, nor failure, are final. False False True 3 False True 0 True False 30 True False start 0 Backdrop color: False True 0 False True True True False True 1 True False 10 0 Backdrop opacity: False True 2 True False 10 0 Transparent False True 3 100 True True 5 quotes_bg_opacity_adjustment 100 0 False False True 4 True False Opaque False True 10 5 False True 1 Draw a text shadow False True True False start 30 5 0 True False True 2 True False Appearance False True 2 True True 30 7 True False 30 vertical True False 5 True False 0 Quotes area width: False True 0 True False 10 1 Narrow False True 1 100 True True 5 quotes_width_adjustment 100 0 False False True 2 True False Wide False True 10 3 False True 0 True False True False 0 Horizontal position: False True 0 True False 10 1 Left False True 1 100 True True 5 quotes_hpos_adjustment 100 0 False False True 2 True False Right False True 10 3 False True 1 True False True False 0 Vertical position: False True 0 True False 10 1 Top False True 1 100 True True 5 quotes_vpos_adjustment 100 0 False False True 2 True False Bottom False True 10 3 False True 2 True False Placement False True 3 True True 30 7 True False vertical True False True True False start 30 20 10 Show quotes from these sources: True fill True False True 0 False True 0 True False 30 20 5 vertical 20 False True 1 True True start 30 20 3 10 True <small><a href='http://peterlevi.com/variety/wiki/Plugins'>More plugins</a></small> True fill True False True 2 True False start 30 20 10 Show only these tags and authors. Leave empty to show random quotes. fill True False True 4 True False 30 30 10 5 True True True 1 1 1 1 True True True 1 0 1 1 True False start 0 Tags: 0 0 1 1 True False start Example: funny, inspirational True 2 0 1 1 True False start Example: Albert Einstein, Voltaire True 2 1 1 1 True False start 0 Authors: 0 1 1 1 False True 5 True False Sources and filtering False True 4 True True 30 7 True False 30 10 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 True False Regular change False True 5 False True 3 True False vertical True False start 15 15 Clock False True 0 Show a nice big digital clock on the desktop, displaying the current time and date False 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 30 7 0 True False True 1 True True 30 5 True False vertical True False 30 5 True False start 0 Clock font: False True 0 False True True True Sans 12 Neither success, nor failure, are final. False False True 1 False True 0 True False 30 True False start 0 Date font: False True 0 False True True True Sans 12 Neither success, nor failure, are final. False False True 1 False True 1 True False start 30 30 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="http://peterlevi.com/variety/2012/11/configuring-the-clock/">Read here</a>. True fill True False True 2 True False Appearance False True 2 False True 3 1 True False Effects 1 False True False True vertical True False start vertical True False start start 15 10 7 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 0 Order of images in slideshow 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 5 Screen False True 2 True False 30 vertical True False True False 0 Run on monitor False True 0 True False False True 1 False True 0 True False True False 0 Window mode for the slideshow 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 5 Dynamics False True 0 True False 30 20 vertical True False 5 True False 0 Interval between image changes 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 0 Quick fade 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 0 Less zoom 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 0 Less pan 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 2 True False Slideshow 2 False True False vertical True False 15 15 10 vertical True False start start VRTY.ORG False True 0 True False Participate in VRTY.ORG False True True False start 15 7 0 True False True 0 True False False start 15 7 VRTY.ORG is in beta and will take some time to mature False True end 1 False True 1 True False start 15 7 <a href="https://vrty.org">VRTY.ORG</a> connects Variety users with similar tastes and provides super-convenient ways to change your wallpaper, to add new image sources to Variety, and to follow other users' favorites. It is fueled by the favorite images of all participating users. True fill True 130 False True 2 False 10 vertical 20 True False end 5 12 12 True False False True 0 True False Could not create user - no connection to VRTY.ORG. We will try again later. False True 1 False True 0 False True 3 False 10 vertical True False end 5 True False User: Anonymous True False True 0 Login or register False True True True False True 1 False True 0 True False False end Registration enables cool features like synchronization of favorite images and sources between computers and personalized recommendations. 130 False True 1 False True 4 False True 0 True False 15 15 10 vertical True False start start Sync False True 0 True False 7 Synchronize favorite images between computers False True True False start 15 0 True False True 0 True False True start 15 Requires VRTY.ORG enabled and logged in. fill True False True end 1 False True 1 True True start 15 7 Your favorite images from other computers will be automatically downloaded to this computer. You need to be logged in with the same VRTY.ORG user everywhere. Sync will not delete any images. True fill True 130 False True 3 False True 1 True False 15 15 15 vertical True False start start Privacy policy False True 0 True True start 15 7 Variety sends data only for images it downloaded, never for images you already had in your local folders that might be private, and Sync does not work for such images. Collected data is not shared with third parties, unless you opt-in to make your profile public. <a href='http://peterlevi.com/variety/vrty-org/'>Read more details about the service and the privacy policy here.</a> True fill True 130 False True 1 False True 2 True False 15 15 15 vertical True False start start Usage statistics False True 0 Help make Variety better by sending anonymous usage statistics False True True False start 15 7 0 True False True 1 True False start 15 7 These stats help us improve Variety by understanding how users interact with it. They also include general info about your OS version and monitor setup. Collected data is not shared with anyone. True fill True 130 False True 2 False True 3 3 True False Sync and social 3 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 4 True False Manual downloading 4 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 5 True False Color and size 5 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 0 Indicator icon: fill True False True 0 True False Light Dark 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 15 Favorites Operations False True 0 True False 30 True False start 10 5 0 Favorites operations to show in main menu: fill True 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 10 Facebook Sharing False True 0 True False start 30 10 True vertical Display dialog to customize the Facebook post before publishing False True True False start 7 0 True False True 0 False True 1 False True 2 True False start vertical True False start start 15 10 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 0 Copy wallpaper image files to this folder: 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 0 You don't have write permissions for this folder. False True 0 True False start 0 Permissions do not allow LightDM to read files from this folder. 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 6 True False Customize 6 False True False vertical True False start 15 10 Tips and tricks False True 0 100 True True 30 10 5 10 True in True True 3 3 3 3 False word tips_buffer False True 1 True False start 15 10 Recent changes False True 2 True True 30 10 5 10 True in True True 3 3 3 3 False word changes_buffer False True 3 True False start 15 10 Visit website False True 4 http://peterlevi.com/variety False True True True True start 30 none http://peterlevi.com/variety False True 5 True False start 15 10 Report a bug or request a feature False True 6 https://bugs.launchpad.net/variety/+filebug False True True True True start 30 none https://bugs.launchpad.net/variety/+filebug False True 7 True False start 15 10 Send feedback False True 8 peterlevi@peterlevi.com False True True True True start 30 none mailto:peterlevi@peterlevi.com False True 9 True False start 15 10 Donate to Variety False True 10 Donate via PayPal False True True True True start 30 none https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=DHQUELMQRQW46&lc=BG&item_name=Variety%20Wallpaper%20Changer&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted False True 11 7 True False Tips and tricks 7 False 8 8 False False True 0 50 True False 5 10 end gtk-close False 35 True True True True False False 1 False True end 2 False end 10 15 2 5 Status message True True False True 3 save variety/data/ui/add_flickr_dialog.xml0000664000000000000000000000057212641771331015113 0ustar variety/data/ui/changes.txt0000664000000000000000000000466312655724127013154 0ustar 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/data/ui/add_panoramio_dialog.xml0000664000000000000000000000060612641771331015624 0ustar variety/data/ui/AboutVarietyDialog.ui0000664000000000000000000000544712655724127015101 0ustar Copyright (c) 2012, Peter Levi <peterlevi@peterlevi.com>False 5 About Variety ../media/variety128.png normal Variety 0.6.0 An automatic wallpaper changer, downloader and manager. https://launchpad.net/variety http://peterlevi.com/variety # Copyright (c) 2012, Peter Levi <peterlevi@peterlevi.com> # 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/>. Copyright (c) 2012, Peter Levi <peterlevi@peterlevi.com> ../media/variety128.png gpl-3-0 True False vertical 2 True False end False True end 0 variety/data/ui/preferences_variety_dialog.xml0000664000000000000000000000063312641771331017073 0ustar variety/data/ui/EditFavoriteOperationsDialog.ui0000664000000000000000000002201112641771331017070 0ustar 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/data/ui/FacebookFirstRunDialog.ui0000664000000000000000000001237312641771331015657 0ustar False start 5 Variety - Facebook Sharing ../media/variety.svg normal 600 True False start vertical True False start start 30 20 Facebook Sharing True True 0 True False start start 20 30 You are sharing on Facebook for the first time. Sharing from Variety is available for images that come from online sources and for quotes. It works this way: <span font_weight="bold">1. Login to Facebook</span> Facebook will open in your default browser. You will be prompted to login if you are not already logged in. <span font_weight="bold">2. Authorize Variety to publish to your feed.</span> You will be asked to allow Variety to publish to your feed on your behalf. Variety will only use this permission to publish those images and quotes that you tell it to, nothing else. <span font_weight="bold">3. Configure browser to open variety:// links with Variety or xdg-open</span> Then you will be redirected to a page with instructions to associate "variety://" links with Variety in your browser. Please follow these instructions to complete the setup. You have to do this only once. No passwords or login information is kept locally, just an OAuth Facebook token that will be valid for a couple of weeks. After its validity expires you will be asked to login again. True fill True 130 False False 1 True False end end Continue False True True True 25 False top False False 1 False False end 2 continue variety/data/ui/add_wallpapers_net_category_dialog.xml0000664000000000000000000000067412641771331020561 0ustar variety/data/ui/SmartRegisterDialog.ui0000664000000000000000000003317112641771331015243 0ustar 750 520 False 5 Variety - VRTY.ORG registration True center-always ../media/variety.svg normal 750 520 True False vertical 2 True False end False True end 0 True False 25 25 True vertical True True start start 20 10 Would you like to register? False True 0 True False 10 ../media/vrty-users.png False True 1 True True start 10 You may participate in <a href="https://vrty.org">VRTY.ORG</a> anonymously, but registration enables some very nice features, such as <span weight="bold">synchronization</span> of favorites between computers and <span weight="bold">personalized recommendations</span>. It also ensures you will not lose your profile and favorite wallpapers if you reinstall your OS. True fill True 130 False True 2 True True start 10 Registration is very easy and does not require any personal data. True fill True 130 False True 3 True True start 10 If you choose to participate anonymously, you can register later from the <span weight="bold">"Sync and social"</span> page in Preferences. True fill True 130 False True 4 True False vertical False 7 Oops, we could not connect to VRTY.ORG. Server might be down. Please wait a couple of minutes and try again or choose <span font_weight="bold">"Participate anonymously"</span> and register later from the <span font_weight="bold">"Sync and social"</span> page in Preferences. True fill True 130 False True 0 False end 7 Please continue the registration and follow the instructions in the browser tab we opened. True True 130 False True 1 True False end start 5 False end False True 0 I will participate anonymously False True True True False False True 1 I'm registered, let me login False True True True False False False 2 Register here False True True True True True False none False True 3 False True 2 False True end 5 True True 1 variety/data/ui/smart_register_dialog.xml0000664000000000000000000000061212641771331016056 0ustar variety/data/ui/SmartFeaturesNoticeDialog.ui0000664000000000000000000002341212641771331016374 0ustar 750 520 False 5 Variety - VRTY.ORG True center-always ../media/variety.svg normal 750 520 True False vertical 2 True False 15 10 end No, thanks False True True True False False True 0 Continue False True True True True False False False 1 False True end 0 True False 25 25 vertical True False start start 20 10 <span font="14" weight="bold">Introducing <a href="https://vrty.org">VRTY.ORG</a>! Wanna take part?</span> True False True 0 True False 10 ../media/vrty-cloud.png False True 1 True True start 15 <a href="https://vrty.org">VRTY.ORG</a> connects Variety users with similar tastes and provides super-convenient ways to change your wallpaper, to find and add new image sources to Variety, and to follow other users' favorites. True fill True 130 False True 2 True True start 15 Participation takes no effort - your profile will be built automatically, as you like or dislike images downloaded by Variety. Your profile will not be shared with third parties, unless you opt-in to make it public. <a href='http://peterlevi.com/variety/vrty-org/'>Read more details about the service and the privacy policy here.</a> True fill True 130 False True 3 True True start 15 Participation is required for some features of Variety such as <span weight="bold">synchronization of favorites between computers</span>. True fill True 130 False True 4 Participate in VRTY.ORG False True True False 10 False 0 True True False True 6 True True 1 btn_no btn_ok variety/data/ui/AddPanoramioDialog.ui0000664000000000000000000001424012641771331015002 0ustar False 5 Variety - add Panoramio image source ../media/variety.svg normal 900 600 True False 10 10 True True vertical 2 True False end gtk-cancel False True True True False True False False 0 gtk-ok False True True True False True False False 1 False True end 0 True False start 10 15 Panoramio False True 1 True True start 7 Please zoom over your area of interest. True fill True False True 2 True False True True vertical True True True True in False True 0 False True 3 btn_cancel btn_ok variety/data/ui/AddWallbaseDialog.ui0000664000000000000000000002530312641771331014611 0ustar False 5 Variety - add Wallbase.cc image source True True ../media/variety.svg normal 700 True False 10 10 vertical 2 True False start 10 15 Wallbase.cc False True 0 True False start 20 Wallbase.cc is permanently down. Use Wallhaven.cc instead. Support for Wallbase.cc will be dropped completely in a future release, please remove or update your existing Wallbase sources. fill True 130 False True 1 True False start <a href="http://wallbase.cc">Wallbase.cc</a> provides a variety of image search options. Below you can specify keywords to search for, or visit <a href="http://wallbase.cc">Wallbase.cc</a>, setup your search criteria there, ensure you like the results, and paste the full Wallbase URL in the box. If you specify keywords, the most liked safe-for-work images that match any of the keywords will be used. If you specify a Wallbase 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. True fill True 130 False True 2 True False 40 True False Enter keywords or paste URL here: False True 0 True True True True True True False True 1 False True 3 True False 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 8 True False end 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 12 btn_cancel btn_ok variety/data/ui/smart_features_notice_dialog.xml0000664000000000000000000000064512641771331017417 0ustar variety/data/ui/login_or_register_dialog.xml0000664000000000000000000000062512641771331016544 0ustar variety/data/ui/AddWallhavenDialog.ui0000664000000000000000000002326612641771331015006 0ustar False 5 Variety - add Wallhaven.cc image source True True ../media/variety.svg normal 700 True False 10 10 vertical 2 True False start 10 15 Wallhaven.cc False True 0 True False start <a href="http://wallhaven.cc">Wallhaven.cc</a> provides a variety of image search options. Below you can specify keywords to search for, or visit <a href="http://wallhaven.cc">Wallhaven.cc</a>, setup your search criteria there, ensure you like the results, and paste the full Wallhaven URL in the box. If you specify keywords, the most liked safe-for-work images that match all of the keywords will be used. 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. True fill True 130 False True 1 True False 40 True False Enter keywords or paste URL here: False True 0 True True True True True True False True 1 False True 2 True False 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 7 True False end 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 11 btn_cancel btn_ok variety/data/ui/add_wallbase_dialog.xml0000664000000000000000000000060212641771331015425 0ustar variety/data/ui/AddMediaRssDialog.ui0000664000000000000000000002332312641771331014566 0ustar False 5 Variety - add Media RSS feed ../media/variety.svg normal 600 True False vertical 2 True False start 10 10 15 Media RSS False True 0 True True start 10 10 15 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: <a href="https://picasaweb.google.com/">Picasa</a>, <a href="http://www.deviantart.com">deviantART</a>, <a href="http://www.smugmug.com/browse/">SmugMug</a>, <a href="http://www.flickr.com">Flickr</a>, <a href="http://interfacelift.com">InterfaceLIFT</a>. True fill True 130 False True 1 True False True False 10 Paste the URL of the Media RSS feed here: False True 0 True True True True 10 True True True False True 1 False True 2 True False end start False Just a moment to check what's at that URL False True 0 False end 10 False True 1 True False end 5 20 False True 2 False True 3 True False end gtk-cancel False True True True False True False False 0 gtk-ok False True True True True True 5 False True False False 1 False True end 4 btn_cancel btn_ok variety/data/ui/AddFlickrDialog.ui0000664000000000000000000004540112641771331014272 0ustar 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/data/config/0000775000000000000000000000000012652624506011617 5ustar variety/data/config/filters.txt0000664000000000000000000000116712641771331014032 0ustar # 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|-blur 120x40 False|Oil painting|-paint 8 False|Pencil sketch|-colorspace gray \( +clone -tile ~/.config/variety/pencil_tile.png -draw "color 0,0 reset" +clone +swap -compose color_dodge -composite \) -fx 'u*.2+v*.8' False|Pointilism|-spread 10 -noise 3 False|Pixellate|-scale 3% -scale 3333% variety/data/config/sources.txt0000664000000000000000000000140212641771331014035 0ustar # 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 True|desktoppr|Random wallpapers from Desktoppr.co True|bing|Bing Photo of the Day True|unsplash|High-resolution photos from Unsplash.com False|apod|NASA's Astronomy Picture of the Day False|earth|World Sunlight Map - live wallpaper from Die.net False|recommended|Recommended by Variety. Adapts to your taste as you mark images as favorite or trash. False|latest|Latest favorites by the other users of Variety. [May contain NSFW images] variety/data/config/ui.conf0000664000000000000000000000021212641771331013073 0ustar # Position of thumbnails stripe: bottom, top, left or right thumbs_position=bottom # Size of thumbnails stripe in pixels thumbs_size=120 variety/data/config/variety.conf0000664000000000000000000002544112652624506014157 0ustar # change_on_start = change_on_start = False # change_enabled = change_enabled = True # change_interval = change_interval = 300 # download_enabled = download_enabled = True # download_interval = download_interval = 600 # download_folder = - when not specified, the default is ~/.config/variety/Downloaded download_folder = ~/.config/variety/Downloaded # Determine if there the download folder sould not exceed a certain size (in megabytes) # quota_enabled = # quota_size = quota_enabled = True quota_size = 500 # 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 # 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 = "wallbase.cc,ns223506.ovh.net,wallpapers.net,flickr.com,imgur.com,deviantart.com,interfacelift.com,vladstudio.com,imageshack.us" # 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 # 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 # Facebook - should we show the Share On Facebook item in menu and should we ask for a message every time # facebook_show_dialog = # facebook_message = facebook_show_dialog = True facebook_message = # 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 "Ubuntu Condensed, 70" # clock_date_font = , default is "Ubuntu Condensed, 30" clock_enabled = False clock_font = "Ubuntu Condensed, 70" clock_date_font = "Ubuntu Condensed, 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 - 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 Bitstream Charter 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_text_shadow = , default is False # quotes_disabled_sources = <|-separated list of disabled quote plugin names>, default is empty # quotes_tags = , default is empty # quotes_authors = , default is empty # quotes_change_enabled = # quotes_change_interval = , default is 300 quotes_enabled = False quotes_font = Bitstream Charter 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_disabled_sources = QuotesDaddy 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 = None 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 src3 = True|recommended|Recommended by Variety. Adapts to your taste as you mark images as favorite or trash. src4 = False|latest|Latest favorites by the other users of Variety. [May contain NSFW images] src5 = True|folder|/usr/share/backgrounds src6 = True|desktoppr|Random wallpapers from Desktoppr.co src7 = True|bing|Bing Photo of the Day src8 = True|unsplash|High-resolution photos from Unsplash.com src9 = True|apod|NASA's Astronomy Picture of the Day src10 = False|earth|World Sunlight Map - live wallpaper from Die.net src11 = True|reddit|https://www.reddit.com/r/MinimalWallpaper/top/?sort=top&t=year src12 = True|mediarss|https://vrty.org/user/~peterlevi/rss src13 = True|flickr|user:www.flickr.com/photos/peter-levi/;user_id:93647178@N00; src14 = True|flickr|text:colorful;user:www.flickr.com/photos/pinksherbet/;user_id:40645538@N00; src15 = True|flickr|user:www.flickr.com/photos/isayx3/;user_id:52821721@N00; src16 = True|wn|http://www.wallpapers.net/nature-hd-wallpapers78 src17 = True|wallhaven|autumn src18 = True|wallhaven|nature src19 = True|wallhaven|macro src20 = True|wallhaven|leaves src21 = True|wallhaven|cityscape src22 = True|wallhaven|tilt shift src23 = True|wallhaven|bokeh # 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|-blur 120x40 filter4 = False|Soft blur|-blur 20x7 filter5 = False|Oil painting|-paint 8 filter6 = """False|Pencil sketch|-colorspace gray \( +clone -tile ~/.config/variety/pencil_tile.png -draw "color 0,0 reset" +clone +swap -compose color_dodge -composite \) -fx 'u*.2+v*.8'""" filter7 = False|Pointilism|-spread 10 -noise 3 filter8 = False|Pixellate|-scale 3% -scale 3333% variety/data/plugins/0000775000000000000000000000000012657457236012044 5ustar variety/data/plugins/quotes/0000775000000000000000000000000012657457236013364 5ustar variety/data/plugins/quotes/QuotationsPageSource.py0000664000000000000000000001005112641771331020043 0ustar # -*- 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 bs4 import random import re from variety.Util import Util from variety.plugins.IQuoteSource import IQuoteSource from httplib2 import iri2uri from variety import _, _u import logging 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) fixmap = { u'\u0091': u"\u2018", u'\u0092': u"\u2019", u'\u0093': u"\u201C", u'\u0094': u"\u201D", u'\u0085': "...", u'\u0097': u"\u2014", u'\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 = u"\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.php3") def get_for_author(self, author): return self.get_for_search_url( iri2uri((u"http://www.quotationspage.com/search.php3?Search=&Author=%s" % author).encode('utf-8'))) def get_for_keyword(self, keyword): return self.get_for_search_url( iri2uri((u"http://www.quotationspage.com/search.php3?Search=%s&Author=" % keyword).encode('utf-8'))) 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('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/data/plugins/quotes/quotes.txt0000664000000000000000000075575212641771331015456 0ustar Marge: 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/data/plugins/quotes/QuotesDaddySource.py0000664000000000000000000000375512641771331017343 0ustar # -*- 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.Util import Util from variety.plugins.IQuoteSource import IQuoteSource from variety import _, _u import logging logger = logging.getLogger("variety") class QuotesDaddySource(IQuoteSource): @classmethod def get_info(cls): return { "name": "QuotesDaddy", "description": _("Fetches quotes from QuotesDaddy's daily quotes RSS feed.\n" "Does not support searching by tags or authors."), "author": "Peter Levi", "version": "0.1" } def supports_search(self): return False def get_random(self): url = "http://www.quotesdaddy.com/feed" bs = Util.xml_soup(url) item = bs.find("item") if not item: logger.warning(lambda: "Could not find quotes for URL " + url) return None link = item.find("link").contents[0].strip() s = item.find("description").contents[0] author = s[s.rindex('- ') + 1:].strip() quote = s[:s.rindex('- ')].strip().replace('"', '').replace('
', '\n').replace('
', '\n').strip() quote = u"\u201C%s\u201D" % quote return [{"quote": quote, "author": author, "sourceName": "QuotesDaddy", "link": link}] variety/data/plugins/quotes/__init__.py0000664000000000000000000000000012641771331015447 0ustar variety/data/plugins/quotes/GoodreadsSource.py0000664000000000000000000001246012641771331017015 0ustar # -*- 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 random import re from httplib2 import iri2uri from variety.Util import Util from variety.plugins.IQuoteSource import IQuoteSource from variety import _ import logging 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(u"http://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(u"http://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(u"http://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(u"http://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', 'quoteText'): logger.debug(lambda: "Parsing quote for div\n%s" % div) try: quote_text = u"" first_a = div.find('a') for elem in div.contents: if elem == first_a: break else: quote_text += unicode(elem) quote_text = quote_text.replace(u'
', '\n').replace(u'
', '\n').replace(u'―', '').strip() if first_a: author = first_a.contents[0] link = "http://www.goodreads.com" + div.find('a')["href"] if div.find('i'): author = author + ', ' + div.find('i').find('a').contents[0] else: link = None author = re.match(r'(\n\s+)+((.*)$)', quote_text, re.MULTILINE) 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/data/plugins/quotes/LocalFilesSource.py0000664000000000000000000000720212641771331017121 0ustar # -*- 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 re from variety.plugins.IQuoteSource import IQuoteSource from variety import _, _u import logging 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: ~/.config/variety/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"), "author": "Peter Levi", "version": "0.1" } 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, 'rU') as f: s = f.read().decode('utf-8', errors='ignore') for q in re.split(r'(^\.$|^%$)', s, flags=re.MULTILINE): try: if q.strip() and len(q.strip()) > 5: parts = q.split('-- ') quote = ' '.join(parts[0].split()) if quote[0] == quote[-1] == '"': quote = u"\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/data/plugins/__init__.py0000664000000000000000000000000012641771331014127 0ustar variety/data/scripts/0000775000000000000000000000000012657176734012053 5ustar variety/data/scripts/set_wallpaper0000775000000000000000000002125612657176734014651 0ustar #!/bin/bash # # This script is run by Variety when a new wallpaper is set. # You can use bash, python or whatever suits you for the script. # Here you can put custom commands for setting the wallpaper on your specific desktop environment # or run commands like notify-send to notify you of the change, or you can # run commands that would theme your browser, login screen or whatever you desire. # # 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.) # # 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 # Enlightenment # Needs Modules/System/DBus Extension loaded to work if [ "`echo $DESKTOP | grep Enlightenment`" ]; then 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 [ ! -z "$DIMENSION" ]; then WIDTH=$(echo $DIMENSION | cut -d/ -f1) HEIGHT=$(echo $DIMENSION | cut -d/ -f2) IMAGE="$(echo "$WP" | sed 's/[^[:alnum:]_-]/\\&/g')" if [ -z "$HEIGHT" -o "$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 ' connected' | wc -l) fi ## Set the wallpaper for each virtual desktop for ((x=0; x<$desk_x_count; x++)); do for ((y=0; y<$desk_y_count; y++)); do for ((z=0; z<$screen_count; z++)); do # -desktop-bg-add OPT1 OPT2 OPT3 OPT4 OPT5 Add a desktop bg definition. # OPT1 = ContainerNo OPT2 = ZoneNo OPT3 = Desk_x. OPT4 = Desk_y. OPT5 = bg file path enlightenment_remote -desktop-bg-add 0 "$z" "$x" "$y" "$OFILE.edj"& done done done # Remove all Variety wallpapers, but the current one and the previous one # as we are calling enlightenment_remote asynchronously, if the previous wallpaper hasn't been # replaced yet then the wallpaper will get set back to the theme one causing ugly artifacts LAST_WALLPAPER_FILE="$HOME/.config/variety/.enlightenment_last_wallpaper.txt" if [ -e $LAST_WALLPAPER_FILE ]; then find $OUTPUT_DIR -name "variety_wallpaper*.*" | grep -v "$OFILE.edj" | grep -v $(cat $LAST_WALLPAPER_FILE) | xargs rm else find $OUTPUT_DIR -name "variety_wallpaper*.*" | grep -v "$OFILE.edj" | xargs rm fi echo "$OFILE.edj" > $LAST_WALLPAPER_FILE exit 0 fi # KDE - User will have to manually choose ~/Pictures/variety-wallpaper/ as a slideshow folder with a short iterval. # Afterwards, with the command below, Variety will just overwrite the single file there when changing the wallpaper # and KDE will refresh it if [ "`env | grep KDE_FULL_SESSION | tail -c +18`" == "true" ]; then mkdir -p "$(xdg-user-dir PICTURES)/variety-wallpaper" NEWWP="$(xdg-user-dir PICTURES)/variety-wallpaper/wallpaper-kde-$RANDOM.jpg" cp "$WP" "$NEWWP" touch "$NEWWP" PWDIR=`pwd` cd "$(xdg-user-dir PICTURES)/variety-wallpaper/" ls -tr "$(xdg-user-dir PICTURES)/variety-wallpaper/" | head -n -1 | xargs --no-run-if-empty rm cd "$PWDIR" exit 0 fi # Cinnamon, for cases when it is detectable if [ "$XDG_CURRENT_DESKTOP" == "X-Cinnamon" ]; then gsettings set org.cinnamon.background picture-uri "file://$WP" 2> /dev/null if [ "`gsettings get org.cinnamon.background picture-options`" == "'none'" ]; then gsettings set org.cinnamon.background picture-options 'zoom' fi gsettings set org.cinnamon.desktop.background picture-uri "file://$WP" 2> /dev/null if [ "`gsettings get org.cinnamon.desktop.background picture-options`" == "'none'" ]; then gsettings set org.cinnamon.desktop.background picture-options 'zoom' fi exit 0 fi # Gnome 3, Unity gsettings set org.gnome.desktop.background picture-uri "file://$WP" 2> /dev/null if [ "`gsettings get org.gnome.desktop.background picture-options`" == "'none'" ]; then gsettings set org.gnome.desktop.background picture-options 'zoom' fi # Deepin if [ "$(gsettings list-schemas | grep com.deepin.wrap.gnome.desktop.background | wc -l)" -ge 1 ]; then gsettings set com.deepin.wrap.gnome.desktop.background picture-uri "file://$WP" 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 # 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|egrep -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 # LXDE/PCmanFM if [ "$XDG_CURRENT_DESKTOP" == "LXDE" ]; then pcmanfm --set-wallpaper "$WP" 2> /dev/null fi # LXQt/PCmanFM-qt if [ "$XDG_CURRENT_DESKTOP" == "LXQt" ]; then pcmanfm-qt --set-wallpaper "$WP" 2> /dev/null fi # i3-wm/Feh. Use Feh only for i3, as it may cause problems with Nautilus, (see bug https://bugs.launchpad.net/variety/+bug/1047083) if [ "$XDG_CURRENT_DESKTOP" == "i3" ] || [ "$XDG_SESSION_DESKTOP" == "i3" ]; then feh --bg-fill "$WP" 2> /dev/null fi # MATE after 1.6 gsettings set org.mate.background picture-filename "$WP" 2> /dev/null # MATE before 1.6 mateconftool-2 -t string -s /desktop/mate/background/picture_filename "$WP" 2> /dev/null # Cinnamon after 1.8, before 2.0 gsettings set org.cinnamon.background picture-uri "file://$WP" 2> /dev/null # Cinnamon after 2.0 gsettings set org.cinnamon.desktop.background picture-uri "file://$WP" 2> /dev/null # Gnome 2 gconftool-2 -t string -s /desktop/gnome/background/picture_filename "$WP" 2> /dev/null # openbox/nitrogen # check if openbox is running # if so, check if nitrogen is installed # now apply if [ "$DESKTOP_SESSION" == "openbox" ]; then if dpkg-query -Wf'${db:Status-abbrev}' nitrogen 2>/dev/null | grep -q '^i'; then nitrogen --set-zoom-fill --save "$WP" 2> /dev/null fi fi # Awesome Window Manager # Set the path to the wallpaper using awesome-client, which communicates with awesome using D-Bus. # Be sure to start variety when you start awesome, such as by adding it to ~/.xinitrc in Arch Linux. # echo "local gears = require(\"gears\") gears.wallpaper.maximized(\"$1\", s, true)" | awesome-client # 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. # Show a notification on wallpaper change (only when the change is automatic). Display the original filename, but the post-effects image. # name=$(echo "$3" | sed 's/\//\n/g'| tail -n 1) # if [ "$2" == "auto" ]; then notify-send --icon "$WP" "Wallpaper changed" "$name" ; fi variety/data/scripts/get_wallpaper0000775000000000000000000000346512641771331014622 0ustar #!/bin/bash # This script is run when the application starts # Its purpose is to obtain the current wallpaper as an absolute path, or file URI (e.g. file://a/b.jpg) # This is needed by Variety at start to ensure History->Back works OK to revert back to the pre-Variety wallpaper. # You need to edit this if you use something other than Gnome 3 or Unity for a desktop environment 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 # LXDE/PCmanFM elif [ "$XDG_CURRENT_DESKTOP" == "LXDE" ]; then grep wallpaper=/ ~/.config/pcmanfm/lubuntu/pcmanfm.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 [ `env | grep MATE_DESKTOP_SESSION_ID | wc -l` -gt 0 ]; then version=`mate-about -v | sed s/MATE\ Desktop\ Environment\ //` if [[ "$version" > "1.6.0" || "$version" == "1.6.0" ]]; then gsettings get org.mate.background picture-filename else mateconftool-2 --get /desktop/mate/background/picture_filename fi # Cinnamon after 2.0 elif [ "$desktop" == "Cinnamon" ] || [ "$XDG_CURRENT_DESKTOP" == "X-Cinnamon" ]; then gsettings get org.cinnamon.desktop.background picture-uri # 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/data/media/0000775000000000000000000000000012641771331011426 5ustar variety/data/media/variety128.png0000664000000000000000000000453512641771331014061 0ustar PNG  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/data/media/variety-very-small.svg0000664000000000000000000000514212641771331015725 0ustar image/svg+xml variety/data/media/variety32.png0000664000000000000000000000136512641771331013771 0ustar PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<rIDATXՖOHTQsԒaPa0ĕDme d0-r.a HQQmshSǜq̛?i1>s~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/data/media/variety-small.svg0000664000000000000000000000471112641771331014743 0ustar image/svg+xml variety/data/media/variety-indicator.svg0000664000000000000000000000675312641771331015617 0ustar image/svg+xml variety/data/media/wallpaper-kde.jpg0000664000000000000000000001402112641771331014656 0ustar JFIFhExifII*12iBShotwell 0.12.3  n http://ns.adobe.com/xap/1.0/ 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 ~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/data/media/tray-screenshot.png0000664000000000000000000012454412641771331015300 0ustar PNG  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/data/media/vrty-cloud.png0000664000000000000000000021651012641771331014251 0ustar PNG  IHDRx̫sBIT|d pHYstEXtSoftwarewww.inkscape.org< IDATxwdGyߪ:ag6欰 aƶ1 mk^$vyNGJ˵vstOwOzꫯ֚K!~ެv7,̿\: A @/䵰0Y_: TBpyw~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/data/media/variety.svg0000664000000000000000000000733112641771331013636 0ustar image/svg+xml variety/data/media/variety16a.png0000664000000000000000000000102212641771331014122 0ustar PNG  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/data/media/variety48.png0000664000000000000000000000205212641771331013772 0ustar PNG  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/data/media/variety-indicator.png0000664000000000000000000000125612641771331015575 0ustar PNG  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/data/media/variety64.png0000664000000000000000000000240112641771331013766 0ustar PNG  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 .4\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"S8N'$ē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 싐'̎~]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/data/media/variety16.png0000664000000000000000000000074212641771331013771 0ustar PNG  IHDRh6sRGB pHYs  tIME !tEXtCommentCreated with GIMPWOIDAT(ύJAgv7yK;kA,F0L%b0 *PBH Qٱ\,bc#-`gmƬD FQ  ILl fEWߧ JA?Pl IENDB`variety/data/media/variety-indicator-dark.svg0000664000000000000000000001305512641771331016527 0ustar image/svg+xml variety/data/media/variety14.png0000664000000000000000000000135212641771331013765 0ustar PNG  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/data/panoramio/0000775000000000000000000000000012641771331012334 5ustar variety/data/panoramio/panoramio.html0000664000000000000000000000116512641771331015212 0ustar Panoramio Layer
variety/data/panoramio/panoramio.js0000664000000000000000000000626012641771331014663 0ustar var map; function python(command) { console.log('Python command: ' + command); window.status = new Date().getTime() + '|' + command; } function initialize() { var mapOptions = { zoom: 1, center: new google.maps.LatLng(0, 20) //mapTypeId: google.maps.MapTypeId.SATELLITE }; map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); var panoramioLayer = new google.maps.panoramio.PanoramioLayer(); panoramioLayer.setMap(map); // Create the search box and link it to the UI element. var input = document.getElementById('search'); map.controls[google.maps.ControlPosition.TOP_LEFT].push(input); var searchBox = new google.maps.places.SearchBox(input); // Listen for the event fired when the user selects an item from the // pick list. Retrieve the matching places for that item. google.maps.event.addListener(searchBox, 'places_changed', function () { var places = searchBox.getPlaces(); if (places.length == 0) { return; } var bounds = new google.maps.LatLngBounds(); for (var i = 0, place; place = places[i]; i++) { if (place.geometry.viewport) { bounds.union(place.geometry.viewport); } else { bounds.extend(place.geometry.location); } } map.fitBounds(bounds); }); // Bias the SearchBox results towards places that are within the bounds of the // current map's viewport. google.maps.event.addListener(map, 'bounds_changed', function () { var bounds = map.getBounds(); searchBox.setBounds(bounds); }); google.maps.event.addListenerOnce(map, 'idle', function () { document.getElementById('search').style.display = 'block'; }); } function setLocation(json) { var l = JSON.parse(json, jsonReviver); map.setZoom(l["zoom"]); map.setCenter(l["center"]); if (l["search"]) { document.getElementById('search').value = l["search"]; } } function reportLocation() { var search = document.getElementById('search').value.trim(); var data = _.extend((search ? {search: search} : {}), { zoom: map.getZoom(), center: map.getCenter(), minx: map.getBounds().getSouthWest().lng(), miny: map.getBounds().getSouthWest().lat(), maxx: map.getBounds().getNorthEast().lng(), maxy: map.getBounds().getNorthEast().lat() }); var json = JSON.stringify(data, jsonReplacer); console.log("Reporting location: " + json); python('location:' + json); } function jsonReplacer(k, v) { if (v instanceof google.maps.LatLng) { return {lat: v.lat(), lng: v.lng()}; } else if (v instanceof google.maps.LatLngBounds) { return {sw: v.getSouthWest(), ne: v.getNorthEast()} } return v; } function jsonReviver(k, v) { if (_.isEqual(_.isObject(v) && _.keys(v).sort(), ['lat', 'lng'])) { return new google.maps.LatLng(v.lat, v.lng); } else if (_.isEqual(_.isObject(v) && _.keys(v).sort(), ['sw', 'ne'])) { return new google.maps.LatLngBounds(v.sw, v.ne); } return v; } google.maps.event.addDomListener(window, 'load', initialize); variety/data/panoramio/style.css0000664000000000000000000000224612641771331014212 0ustar html, body, #map-canvas { height: 100%; margin: 0px; padding: 0px } #panel { position: absolute; top: 5px; left: 50%; margin-left: -180px; z-index: 5; background-color: #fff; padding: 5px; border: 1px solid #999; } html, body, #map-canvas { height: 100%; margin: 0px; padding: 0px } .controls { margin-top: 16px; border: 1px solid transparent; border-radius: 2px 0 0 2px; box-sizing: border-box; -moz-box-sizing: border-box; height: 32px; outline: none; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); } #search { background-color: #fff; padding: 0 11px 0 13px; width: 400px; font-family: Roboto; font-size: 15px; font-weight: 300; text-overflow: ellipsis; box-shadow: 5px 5px 10px #444; } #search:focus { border-color: #4d90fe; margin-left: -1px; padding-left: 14px; /* Regular padding-left + 1. */ width: 401px; } .pac-container { font-family: Roboto; } #type-selector { color: #fff; background-color: #4d90fe; padding: 5px 11px 0px 11px; } #type-selector label { font-family: Roboto; font-size: 13px; font-weight: 300; } variety/data/panoramio/underscore-min.js0000664000000000000000000003453212641771331015633 0ustar // Underscore.js 1.6.0 // http://underscorejs.org // (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license. (function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?void(this._wrapped=n):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.6.0";var A=j.each=j.forEach=function(n,t,e){if(null==n)return n;if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return;return n};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var O="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},j.find=j.detect=function(n,t,r){var e;return k(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var k=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:k(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,j.property(t))},j.where=function(n,t){return j.filter(n,j.matches(t))},j.findWhere=function(n,t){return j.find(n,j.matches(t))},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);var e=-1/0,u=-1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;o>u&&(e=n,u=o)}),e},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);var e=1/0,u=1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;u>o&&(e=n,u=o)}),e},j.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=j.random(r++),e[r-1]=e[t],e[t]=n}),e},j.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=j.values(n)),n[j.random(n.length-1)]):j.shuffle(n).slice(0,Math.max(0,t))};var E=function(n){return null==n?j.identity:j.isFunction(n)?n:j.property(n)};j.sortBy=function(n,t,r){return t=E(t),j.pluck(j.map(n,function(n,e,u){return{value:n,index:e,criteria:t.call(r,n,e,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=E(r),A(t,function(i,a){var o=r.call(e,i,a,t);n(u,o,i)}),u}};j.groupBy=F(function(n,t,r){j.has(n,t)?n[t].push(r):n[t]=[r]}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=E(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])t?[]:o.call(n,0,t)},j.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},j.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},j.rest=j.tail=j.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},j.compact=function(n){return j.filter(n,j.identity)};var M=function(n,t,r){return t&&j.every(n,j.isArray)?c.apply(r,n):(A(n,function(n){j.isArray(n)||j.isArguments(n)?t?a.apply(r,n):M(n,t,r):r.push(n)}),r)};j.flatten=function(n,t){return M(n,t,[])},j.without=function(n){return j.difference(n,o.call(arguments,1))},j.partition=function(n,t){var r=[],e=[];return A(n,function(n){(t(n)?r:e).push(n)}),[r,e]},j.uniq=j.unique=function(n,t,r,e){j.isFunction(t)&&(e=r,r=t,t=!1);var u=r?j.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:j.contains(a,r))||(a.push(r),i.push(n[e]))}),i},j.union=function(){return j.uniq(j.flatten(arguments,!0))},j.intersection=function(n){var t=o.call(arguments,1);return j.filter(j.uniq(n),function(n){return j.every(t,function(t){return j.contains(t,n)})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===j&&(e[u]=arguments[r++]);for(;r=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u),e=u=null):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o,c=function(){var l=j.now()-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u),i=u=null))};return function(){i=this,u=arguments,a=j.now();var l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u),i=u=null),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return j.partial(t,n)},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=function(n){if(!j.isObject(n))return[];if(w)return w(n);var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o)&&"constructor"in n&&"constructor"in t)return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.constant=function(n){return function(){return n}},j.property=function(n){return function(t){return t[n]}},j.matches=function(n){return function(t){if(t===n)return!0;for(var r in n)if(n[r]!==t[r])return!1;return!0}},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},j.now=Date.now||function(){return(new Date).getTime()};var T={escape:{"&":"&","<":"<",">":">",'"':""","'":"'"}};T.unescape=j.invert(T.escape);var I={escape:new RegExp("["+j.keys(T.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(T.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(I[n],function(t){return T[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}}),"function"==typeof define&&define.amd&&define("underscore",[],function(){return j})}).call(this); //# sourceMappingURL=underscore-min.mapvariety/data/icons/0000775000000000000000000000000012641771331011462 5ustar variety/data/icons/22x22/0000775000000000000000000000000012641771331012241 5ustar variety/data/icons/22x22/apps/0000775000000000000000000000000012641771331013204 5ustar variety/data/icons/22x22/apps/variety-indicator-dark.png0000664000000000000000000000126712641771331020274 0ustar PNG  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/data/icons/22x22/apps/variety-indicator.png0000664000000000000000000000125612641771331017353 0ustar PNG  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/data/icons/scalable/0000775000000000000000000000000012641771331013230 5ustar variety/data/icons/scalable/apps/0000775000000000000000000000000012641771331014173 5ustar variety/data/icons/scalable/apps/variety.svg0000664000000000000000000000733112641771331016403 0ustar image/svg+xml variety/.quickly0000664000000000000000000000021312657457215011125 0ustar project = variety version = 12.08.1 template = ubuntu-application dependencies = imagemagick, python-lxml, python-gi-cairo lp_id = variety