pax_global_header00006660000000000000000000000064117622004220014506gustar00rootroot0000000000000052 comment=8145fba6002ed44be6edee747134f2b209b03acb kupfer-v208/000077500000000000000000000000001176220042200130435ustar00rootroot00000000000000kupfer-v208/.gitignore000066400000000000000000000001131176220042200150260ustar00rootroot00000000000000/GIT_VERSION /build/ /waf /.waf-*/ /.lock-wscript /po/untitled.pot *.pyc kupfer-v208/COPYING000066400000000000000000001043741176220042200141070ustar00rootroot00000000000000 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 . kupfer-v208/Documentation/000077500000000000000000000000001176220042200156545ustar00rootroot00000000000000kupfer-v208/Documentation/Contributing.rst000066400000000000000000000113501176220042200210550ustar00rootroot00000000000000 Guidelines and Policy ===================== Contributing ------------ You can clone git from its official repository at git.gnome.org, see: http://git.gnome.org/browse/kupfer/ You can structure your changes into a series of commits in git. A series of well disposed changes is easy to review. Write a sufficient commit log message for each change. Do not fear writing down details about why the change is implemented as it is, if there are multiple alternatives. Also, if you forsee any future possibilites or problems, please describe them in the commit log. It is not easy to write good commit messgages, because writing is an art. It is however essensial, and only by trying it, can you improve. You may publish your changes by sending an email to the mailing list, . You can attach your changes as patches, or you may also just attach a link to your published git repository. You can find kupfer's `git repository at github`__ and fork it there, for easy publication of your changes. If you suggest your changes for inclusion into Kupfer, make sure you have read the whole *Guidelines and Policy* chapter of this manual. And take care to structure your changes, do not fear asking for advice. Good Luck! __ http://github.com/engla/kupfer Icon Guidelines --------------- Consider the following: * A Leaf is an object, a metaphor for a physical thing. It can have as detailed icon as is possible. * An Action is a verb, a command that can be carried out. Choose its name with care. The icon should be simple, maybe assign the action to a category, rather than trying to illustrate the action itself. For example, all text display actions use the "bold style" icon, in some icon themes simply a bold "A". .. important:: Actions should have stylized, simple icons. Leaves and Sources should have detailed, specific icons. Coding style ------------ Kupfer python code is indented with tabs, which is a bit uncommon. (My editor is set to tabs of size four.) Otherwise, if you want to contribute to kupfer keep in mind that * Python code should be clear * Kupfer is a simple project. Do simple first. [#simple]_ Python's general style guideline is called `PEP 8`_, and you should programmers should read it. The advice given there is very useful when coding for Kupfer. .. _`PEP 8`: http://www.python.org/dev/peps/pep-0008/ .. [#simple] Writing simple code is more important than you think. Read your diff (changes) when you are finished writing a feature. Can you make it more simple to read? If you can make it simpler, often a more effective algorithm comes out of it at the same time. All optimizations have a price, and unless you measure the difference, abstain from optimizations. Specific Points --------------- Using ``rank_adjust`` ..................... A declaration like this can modify the ranking of an object:: class MyAction (Action): rank_adjust = -5 ... 1. Often, this is useless. Don't use it, let Kupfer learn which actions are important. 2. If the action is destructive, the adjust should be negative. Never positive. For example *Move to Trash* has a negative 10 ``rank_adjust``. 3. If the action is very general, and applies to almost everything but still should never be the default for anything, the adjust should be negative. Using ``super(..)`` ................... Many of kupfer plugin code uses super statements such as:: super(RecentsSource, self).__init__(_("Recent items")) We have learnt that it is not so practical. Therefore, when writing new code, you should however use the following style:: Source.__init__(self, _("Recent items")) Why? Because the second version is easier to copy! If you copy the whole class and rename it, which you often do to create new plugins, the second version does not need to be updated -- you are probably using the same superclass. Text and Encodings .................. Care must be taken with all input and output text and its encoding! Internally, kupfer must use ``unicode`` for all internal text. The module ``kupfer.kupferstring`` has functions for the most important text conversions. Two good resources for unicode in Python are to be found here: | http://farmdev.com/talks/unicode/ | http://www.amk.ca/python/howto/unicode **Always** find out what encoding you must expect for externally read text (from files or command output). If you must guess, use the locale encoding. Text received from PyGTK is either already unicode or in the UTF-8 encoding, so this text can be passed to ``kupferstring.tounicode``. Note that the gettext function ``_()`` always returns a unicode string. .. vim: ft=rst tw=72 et sts=4 .. this document best viewed with rst2html kupfer-v208/Documentation/Copyright.rst000066400000000000000000000006411176220042200203570ustar00rootroot00000000000000 Copyright ========= The program Kupfer is released under the `GNU General Public Licence v3`:t: (or at your option, any later version). Please see the main program file for more information. This documentation is released under the same terms as the main program. The documentation sources are available inside the Kupfer source distribution. Copyright 2009–2011 Ulrik Sverdrup .. vim: ft=rst tw=72 et sts=4 kupfer-v208/Documentation/GTKTheming.rst000066400000000000000000000066431176220042200203600ustar00rootroot00000000000000==================== GTK+ Theming Support ==================== ---------------------------- Changing Kupfer's Appearance ---------------------------- .. contents:: Introduction ============ In Kupfer's new 2011 interface, the interface elements are marked-up so that they can be changed using GTK+'s normal styling mechanism. For the general topic of GTK+ themes, read `this excellent tutorial.`__ __ http://live.gnome.org/GnomeArt/Tutorials/GtkThemes Kupfer's UI can be themed by using the normal GtkRc style language. Theming can change colors and some pre-defined parameters, but not the layout. Example Style ============= The following example style includes inline comments:: style "dark" { ## bg: background color bg[NORMAL] = "#333" bg[SELECTED] = "#000" bg[ACTIVE] = "#222" bg[PRELIGHT] = "#222" bg[INSENSITIVE] = "#333" ## fg: foreground text color fg[NORMAL] = "#DDD" fg[SELECTED] = "#EEE" fg[ACTIVE] = "#EEE" fg[PRELIGHT] = "#EEE" fg[INSENSITIVE] = "#DDD" ## text: text color in input widget and treeview text[NORMAL] = "#EEE" text[SELECTED] = "#EEE" text[ACTIVE] = "#EEE" text[PRELIGHT] = "#EEE" text[INSENSITIVE] = "#EEE" ## base: background color in input widget and treeview base[NORMAL] = "#777" base[SELECTED] = "#100" base[ACTIVE] = "#112" base[PRELIGHT] = "#777" base[INSENSITIVE] = "#777" ## These are UI Widget style properties with their approximate ## default values. These can all be overidden in the theme. ## The MatchView is the bezel around each pane in the interface MatchView :: corner-radius = 15 MatchView :: opacity = 95 ## The Search controls the result list Search :: list-opacity = 93 Search :: list-length = 200 ## The KupferWindow is the whole main window KupferWindow :: corner-radius = 15 KupferWindow :: opacity = 85 KupferWindow :: decorated = 0 KupferWindow :: border-width = 8 } ## These are the two defined icon sizes gtk-icon-sizes="kupfer-small=24,24:kupfer-large=128,128" To apply this style, it must be matched against the widgets in the UI using their names, as follows:: ## The main window is 'kupfer' widget "kupfer" style "dark" widget "kupfer.*" style "dark" ## The window with result list is 'kupfer-list' widget "kupfer-list.*" style "dark" ## Additional less used items: ## The menu button is '*.kupfer-menu-button' ## The description text is '*.kupfer-description' ## The context menu is '*.kupfer-menu' Injecting a Custom Style ======================== Any user can override the GTK+ style used for their applications. But more conventient is injecting the gtkrc at runtime by means of a Kupfer plugin. See ``kupfer/plugin/customtheme.py`` for an example. Icons ===== The kupfer-specific icon names we use are: + ``kupfer`` (application) + ``kupfer-catalog`` (root catalog) + ``kupfer-execute`` (default action icon) + ``kupfer-launch`` (default launch icon) + ``kupfer-object`` (blue box generic object icon) + ``kupfer-object-multiple`` (multiple generic objects) .. vim: ft=rst tw=72 et sts=4 sw=4 .. this document best viewed with rst2html kupfer-v208/Documentation/Localization.rst000066400000000000000000000054331176220042200210430ustar00rootroot00000000000000 Localization ============ kupfer is translated using gettext and it is managed in the build system using ``intltool``. Translation messages are located in the ``po/`` directory. Kupfer's localizations are listed among GNOME's modules. Its homepage is: http://l10n.gnome.org/module/kupfer/ You can download the latest version of your language's translation file there, if Kupfer is already translated to your language. .. contents:: To create a new translation --------------------------- Go into the directory ``po`` 1. Add the language code ``$LANG`` to the file ``LINGUAS`` 2. Run ``intltool-update --pot``, and copy ``untitled.pot`` to ``$LANG.po`` 3. Edit and check the whole file header: + Write in yourself as author + Check ``plurals`` (copy from a language that you know uses the same number of plural forms, or look up in GNOME's translation pages.) + Replace everything written in CAPS Fill in the charset used; Kupfer translations *must* use the UTF-8 encoding. When the header is filled-in, go to `To update or check an existing translation`_ To update or check an existing translation ------------------------------------------ Go to your Kupfer source directory. Here we will call your language ``$LANG``. You should use a two or four-letter code for your language instead of ``$LANG``, for example "de" for German or "pt_BR" for Brazilian Portuguese. Go to the translation directory ``po``:: cd po/ To update and check the translation file, run:: intltool-update $LANG Now check and edit ``$LANG.po``. Search for all messages marked "fuzzy", and remove the word "fuzzy" from them when they are done. Continue running ``intltool-update $LANG`` and check that you have 0 fuzzy and 0 untranslated, then you're finished. This will also check consistency of the file, so that you know that all your syntax is correct. If you want to send in the translation to a repository, or as a patch, you can use git if you have a checked-out copy of kupfer:: git add po/$LANG.po git commit -m "$LANG: Updated translation" # now we create a patch out of the latest change git format-patch HEAD^ You can send the patch, or the whole file, to the mailing list kupfer-list@gnome.org. To try the new translation -------------------------- Make sure the translation is listed in ``po/LINGUAS``. To try it, you have to install kupfer with ``./waf install``, then you can run kupfer as normal. .. note:: If you run ``./kupfer-run`` from the source directory it won't find the installed translations unless you make a symlink called ``locale`` to the installed location (for example ``~/.local/share/locale`` if install prefix was ``~/.local``):: $ ln -s ~/.local/share/locale .. vim: ft=rst tw=72 et sts=4 .. this document best viewed with rst2html kupfer-v208/Documentation/Makefile000066400000000000000000000004531176220042200173160ustar00rootroot00000000000000# This makefile can generate html versions that are pleasant to read # needs python-docutils all: Contributing.html Copyright.html Localization.html Manpage.html \ Manual.html PluginAPI.html \ GTKTheming.html VersionHistory.html %.html: %.rst rst2html $^ > $@ %.pdf: %.rst rst2pdf -o $@ $^ kupfer-v208/Documentation/Manpage.rst000066400000000000000000000046771176220042200177740ustar00rootroot00000000000000====== kupfer ====== ----------------------------------------------------------------- Convenient command and access tool for applications and documents ----------------------------------------------------------------- :Author: Ulrik Sverdrup :Date: 2011 :Manual section: 1 SYNOPSIS ======== | ``kupfer`` [ *OPTIONS* | *FILE* ... ] | ``kupfer-exec`` *FILE* ... DESCRIPTION =========== Kupfer is an interface for quick and convenient access to applications and their documents. The most typical use is to find a specific application and launch it. We have tried to make Kupfer easy to extend with plugins so that this quick-access paradigm can be extended to many more objects than just applications. ``kupfer-exec`` is a helper script that can execute commands saved to file, but only by connecting to an already running instance of Kupfer. SPAWNING ======== Running kupfer on the command line (without options) will try to show the program it if already running. Kupfer can be invoked with a list of files ``kupfer`` *FILE* ... This can be used to select files given as command-line arguments in the program. Then you can invoke actions even on objects from a shell-based context. You may also pipe text to ``kupfer`` to pass it to a currently running instance of the program. OPTIONS ======= --no-splash Launch without presenting main interface --list-plugins Display a list of all installed plugins --debug Enable more verbose output that can help understanding the program's operation. --relay Is deprecated and will be started by the Multihead Support plugin when needed --exec-helper=HELPER Run plugin helper program, which should be the name of a module inside kupfer. The following are generic options --help Display usage information --version Display version information CONFIGURATION ============= Custom plugins are added to kupfer by installing them to the directory *~/.local/share/kupfer/plugins*, or any kupfer/plugins directory in any of ``$XDG_DATA_DIRS``. ENVIRONMENT VARIABLES ===================== If *KUPFER_NO_CUSTOM_PLUGINS* is set, only allow loading built-in plugins (installed in the program's python package). If *KUPFER_NO_CACHE* is set, do not load from or write to any source cache files. .. vim: ft=rst tw=72 .. this document best viewed with:: rst2pdf Quickstart.rst && xdg-open Quickstart.pdf kupfer-v208/Documentation/Manual.rst000066400000000000000000000017561176220042200176340ustar00rootroot00000000000000 ============================== Kupfer Technical Documentation ============================== .. topic:: `Kupfer Plugin API `_ .. .. topic:: `GTK+ Theme Support `_ .. .. topic:: `Contributing `_ .. .. topic:: `Localization `_ .. .. topic:: `Man Page `_ .. .. topic:: `Version History `_ .. .. topic:: `Copyright `_ .. There is also `User Documentation`__ __ http://kaizer.se/wiki/kupfer/help/ .. How to Generate HTML or PDF from this documentation. This is a RestructuredText_ document and it can be rendered by installing ``python-docutils`` (``docutils`` module). This package should also provide the utilities ``rst2html`` and ``rst2pdf`` as well as ``rst2man``. .. _RestructuredText: http://docutils.sourceforge.net/rst.html .. vim: ft=rst tw=72 et sts=4 sw=4 .. this document best viewed with rst2html kupfer-v208/Documentation/PluginAPI.rst000066400000000000000000000715311176220042200202050ustar00rootroot00000000000000================= Kupfer Plugin API ================= :Homepage: http://kaizer.se/wiki/kupfer .. contents:: :depth: 2 Introduction ============ Kupfer is a Python program that allows loading extension modules at runtime. A plugin is equivalent to one Python module implemented as one ``.py`` file or as a Python package. The ``kupfer`` package is organized as follows:: kupfer/ obj/ ui/ core/ plugin/ core/__init__.py applications.py ... ... Plugins live in the package ``kupfer.plugin``. Kupfer also includes directories called ``kupfer/plugins`` from ``$XDG_DATA_DIRS``, which typically means ``/usr/share/kupfer/plugins`` and ``$HOME/.local/share/kupfer/plugins``. These directories are transparently included into the kupfer package, so the user has multiple choices of where to install plugins. The Plugin File ::::::::::::::: A kupfer plugin is a ``.py`` file with some special attributes. It starts like this (an imagined example):: __kupfer_name__ = _("Cool X-Documents") __kupfer_sources__ = ("DocumentSource", ) __kupfer_text_sources__ = () __kupfer_actions__ = ("Open", ) __description__ = _("Documents from the X program") __version__ = "1" __author__ = "Tom Author" For a plugin, the following attributes are required:: __kupfer_name__ (Localized name of plugin) __description__ (Localized description of plugin) __version__ __author__ For the plugin to do anything, the following attributes may be defined:: __kupfer_sources__ = () __kupfer_text_sources__ = () __kupfer_actions__ = () __kupfer_action_generators__ = () __kupfer_contents__ = () They should be tuples of *names* of classes in the module: * all sources have to be subclasses of ``kupfer.objects.Source`` * all text sources have to be subclasses of ``kupfer.objects.TextSource`` * all actions have to be subclasses of ``kupfer.objects.Action`` If an example plugin declares:: __kupfer_sources__ = ("DocumentSource", ) it will later in the file define the class ``DocumentSource``:: from kupfer.objects import Source class DocumentSource (Source): def __init__(self): Source.__init__(self, _("Cool X-Documents")) def get_items(self): ... # later we will see what we can do here! Ok, this looks simple. So what are Leaves, Sources and Actions? A **Leaf** is an object, it represents a program or a file, or a text or something else. Every type of Leaf has different possibilities, and you can define new Leaves. Example: a ``FileLeaf`` represents a file on the disk. A **Source** produces a collection of Leaves, so it makes Kupfer know about new objects. For example, it can provide all the FileLeaves for a particular folder. An **Action** is the part where something happens, an action is applied to a Leaf, and something happens. For example, *Open* can be an action that works with all ``FileLeaf``. A Short Working Example ::::::::::::::::::::::: The very simplest thing we can do is to provide an action on objects that already exist in Kupfer. These actions appear in the right-hand actions pane in kupfer, when an object of the right type is selected. The complete python code for the plugin:: __kupfer_name__ = _("Image Viewer") __kupfer_actions__ = ("View", ) __description__ = _("View images quickly") __version__ = "" __author__ = "Tom Author" import gtk from kupfer.objects import Action, FileLeaf class View (Action): def __init__(self): Action.__init__(self, _("View")) def item_types(self): yield FileLeaf def valid_for_item(self, fileobj): return fileobj.object.endswith(".jpg") def activate(self, fileobj): image_widget = gtk.image_new_from_file(fileobj.object) image_widget.show() window = gtk.Window() window.add(image_widget) window.present() That is all. What we did was the following: * Declare a plugin called "Image Viewer" with an action class ``View``. * ``View`` declares that it works with ``FileLeaf`` * ``View`` only accepts ``FileLeaf`` that end with '.jpg' * ``View`` defines a method ``activate`` that when called, will use gtk to show the file in a window .. note:: Kupfer uses a simplified programming style of composition and cooperative superclasses. You normally never call a superclass implementation inside a method that you define, with the exception of ``__init__``. On the other hand, there are superclass methods that should not be overridden. For example, ``KupferObject.get_pixbuf`` is never overridden, instead you implement ``KupferObject.get_icon_name``. Reference ========= Below follows a complete summary. To accompany this reference, you can read kupfer's inline module documentation with pydoc, by doing the following in the source directory:: $ pydoc kupfer.obj.base or equivalently:: $ python >>> help("kupfer.obj.base") KupferObject :::::::::::: KupferObject implements the things that are common to all objects: *name*, *description*, *icon*, *thumbnail* and *name aliases*. ``__init__(self, name)`` This is called when you call ``Leaf.__init__``, or ``Source.__init__``, and so on in your object's ``__init__`` method. The name parameter must be a unicode string. An object can not change name after it has called __init__. ``get_description(self)`` Return a longer user-visible unicode string that describes the object. ``get_icon_name(self)`` Return a string of one icon name for the object. The icon name should preferably be in the `Icon Naming Specification`_ .. _`Icon Naming Specification`: \ http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html ``get_gicon(self)`` Return a GIcon (GIO icon) object. This takes precedence over the icon name, if it is defined. ``get_thumbnail(self, width, height)`` Implement ``get_thumbnail`` to return a GdkPixbuf object of the requested size that is a thumbnail of the object. If applicable. ``get_pixbuf(self, x)`` This should not be redefined. Define ``get_icon_name`` and/or ``get_gicon`` instead. ``get_icon(self)`` This should not be redefined. Define ``get_icon_name`` and/or ``get_gicon`` instead. ``repr_key(self)`` Return an object whose str() will be used in the __repr__, self is returned by default. This value is used to differentiate and recognize objects. Override this if the objects type and name is not enough to differentiate it from other objects. ``__repr__`` This should not be redefined. Define ``repr_key`` instead. ``kupfer_add_alias(self, alias)`` This should not be redefined, but can be called by the object to add an alternate name to the object. KupferObject Attributes ....................... ``KupferObject.rank_adjust`` A number to adjust the ranking of a certain object. Should only be used on Actions. Should be set in the range -10 to -1 for actions that apply to many objects but not default for any. ``KupferObject.fallback_icon_name`` Used as a the class' fallback for icon name. Do not change this. Leaf :::: Leaf inherits from KupferObject. A Leaf represents an object that the user will want to act on. Examples are a file, an application or a free-text query (TextLeaf). This defines, in addition to KupferObject: ``__init__(self, obj, name)`` The default implementation of ``__init__`` stores the parameter ``obj`` into ``self.object`` and passes ``name`` up to ``KupferObject.__init__``. ``obj`` can be any data that the Leaf represents. ``name`` must be a unicode string. ``Leaf.object`` ``Leaf.object`` is the represented object, which is the implementation-specific internal data. ``get_actions()`` Return a sequence of Actions that always apply to the Leaf. These are "built-in" actions. ``__hash__`` and ``__eq__`` Leaves are hashable, can be members in a set, and duplicates are recognized (and removed); this is essensial so that equivalent Leaves from different sources are recognized. These methods need normally not be overridden. By default leaves are equal if both the name and the ``Leaf.object`` attribute are the same. ``has_content()`` and ``content_source()`` A leaf can contain something, like a folder contains files or a music album songs. If the Leaf should have content, it should override ``has_content`` to return ``True`` and define ``content_source()`` to return an instance of a Source. A Leaf may decide dynamically if it has content or not. Action :::::: Action inherits from KupferObject. An Action represents a command using a direct object and an optional indirect object. One example is ``kupfer.obj.fileactions.Open`` that will open its direct object (which must be a file), with its default viewer. Actions are the most versatile parts of Kupfer, since they can define ways to use objects together. They also have to decide, which types of Leaves they apply to, and if they apply to a given Leaf. An action is either a `Subject + Verb`:t: action: It needs one object, this is the direct object. Or it is a `Subject + Verb + Object`:t: action: It needs two objects, one direct object ("obj") and one indirect object ("iobj"). Action defines, in addition to KupferObject: Activate: Carrying Out the Action ................................. ``activate(self, obj)`` Called to perform the action if the action is a normal `Subject + Verb`:t: action. ``activate(self, obj, iobj)`` Called to perform the action if the action is a three-way `Subject + Verb + Object`:t: action. (That is, ``requires_object`` returns ``True``) ``activate_multiple(self, objects)`` .. ``activate_multiple(self, objects, iobjects)`` If implemented, ``activate_multiple`` is called with preference over ``activate(self, obj, iobj)`` or ``activate(self, obj)`` as appropriate. Implement ``activate_multiple`` to handle multiple objects on either side in a smart way. You should implement ``activate_multiple`` if it is possible to do something better than the equivalent of repeating ``activate`` *n* for *n* objects. ``activate`` and ``activate_multiple`` also receive a keyword argument called ``ctx`` if the action defines ``wants_context(self)`` to return ``True``. See ``wants_context`` below for more information. Determining Eligible Objects ............................ ``item_types(self)`` This method should return a sequence of all Leaf types that the action can apply to (direct object). ``valid_for_item(self, item)`` This method is called for each potential direct object of the correct type. Return True if the object is compatible with the action. By default always returns ``True``. ``requires_object(self)`` Return ``True`` if the action is a `Subject + Verb + Object`:t: action and requires both a direct and an indirect object. If ``requires_object`` returns ``True``, then you must must also define (at least) ``object_types``. ``object_types(self)`` Return a sequence of all Leaf types that are valid for the action's indirect object. ``object_source(self, for_item)`` If the action's indirect objects should not be picked from the full catalog, but from a defined source, return an instance of the Source here, else return None. ``for_item`` is the direct object. ``valid_object(self, iobj, for_item)`` This method, if defined, will be called for each indirect object (with the direct object as ``for_item``), to decide if it can be used. Return ``True`` if it can be used. Auxiliary Method ``wants_context(self)`` ........................................ ``wants_context(self)`` Return ``True`` if ``activate`` should receive an ``ExecutionToken`` as the keyword argument ``ctx``. This allows posting late (after-the-fact) results and errors, as well as allowing access to the GUI environment. ``wants_context`` defaults to ``False`` which corresponds to the old protocol without ``ctx``. So instead of ``activate(self, obj)``, the method should be implemented as ``activate(self, obj, ctx)``. The object passed as ``ctx`` has the following interface: ``ctx.register_late_result(result_object)`` Register the ``result_object`` as a late result. It must be a ``Leaf``. ``ctx.register_late_error(exc_info=None)`` Register an asynchronous error. (For synchronous errors, simply raise an ``OperationError`` inside ``activate``.) For asynchronous errors, call ``register_late_error``. If ``exc_info`` is ``None``, the current exception is used. If ``exc_info`` is an ``OperationError`` instance, then it is used as error. Otherwise, a tuple like ``sys.exc_info()`` can be passed. ``ctx.environment`` The environment object, which has the following methods: ``get_timestamp(self)`` Return the current event timestamp ``get_startup_notification_id(self)`` Make and return a startup notification id ``get_display(self)`` Return the display name (i.e ``:0.0``) ``present_window(self, window)`` Present ``window`` (a ``gtk.Window``) on the current workspace and monitor using the current event time. Auxiliary Action Methods ........................ Some auxiliary methods tell Kupfer about how to handle the action: ``is_factory(self)`` Return ``True`` if the return value of ``activate`` is a source that should be displayed immediately. ``has_result(self)`` Return ``True`` if the action's return value in ``activate`` should be selected. ``is_async(self)`` Return ``True`` if the action returns a ``Task`` object conforming to ``kupfer.task.Task`` from ``activate``. The task will be executed asynchronously in Kupfer's task queue. ``repr_key(self)`` Override this to define a unique key for the action, if you need to differentiate between different instances of the same Action class. Source :::::: Source inherits from KupferObject. A Source understands specific data and delivers Leaves for it. A Source subclass must at a minimum implement ``__init__``, ``get_items`` and ``provides``. ``Source`` defines, in addition to ``KupferObject``: ``__init__(self, names)`` You must call this method with a unicode name in the subclass ``__init__(self)``. ``get_items(self)`` Your source should define ``get_items`` to return a sequence of leaves which are its items; the return value is cached and used until ``mark_for_update`` is called. Often, implementing ``get_items`` in the style of a generator (using ``yield``) is the most convenient. The Leaves shall be returned in natural order (most relevant first), or if sorting is required, return in any order and define ``should_sort_lexically``. ``get_leaves(self)`` ``get_leaves`` must not be overridden, define ``get_items`` instead. ``provides(self)`` Return a sequence of all precise Leaf types the Source may contain. Often, the Source contains Leaves of only one type, in that case the implementation is written simply as ``yield ThatLeafType``. ``should_sort_lexically(self)`` Return ``True`` if the Source's leaves should be sorted alphabethically. If not sorted lexically, ``get_items`` should yield leaves in order of the most relevant object first (for example the most recently used). ``initialize(self)`` This method is called when the source should be made ready to use. This is where it should register for external change callbacks, for example. ``finalize(self)`` This method is called before the Source is disabled (shutdown or plugin deactivated). ``get_leaf_repr(self)`` Return a Leaf that represents the Source, if applicable; for example the DirectorySource is represented by a FileLeaf for the directory. ``__hash__`` and ``__eq__`` Sources are hashable, and equivalents are recognized just like Leaves, and the central SourceController manages them so that there are no duplicates in the application. ``get_items_forced(self)`` Like ``get_items``, called when a refresh is forced. By default it just calls ``get_items``. ``mark_for_update(self)`` Should not be overridden. Call ``mark_for_update`` in the source to mark it so that it is refreshed by calling ``get_items``. ``repr_key(self)`` Define to a unique key if you need to differentiate between sources of the same class. Normally only used with Sources from factory actions or from decorator sources. ``toplevel_source(self)`` If applicable, the source can return a different source to represent it and its objects in the top level of the catalog. The default implementation returns ``self`` which is normally what you want. ``is_dynamic(self)`` Return ``True`` if the Source should not be cached. This is almost never used. Saving Source configuration data ................................ These methods are must be implemented if the Source needs to save user-produced configuration data. ``config_save_name(self)`` Return the name key to save the data under. This should almost always be literally ``return __name__`` ``config_save(self)`` Implement this to return a datastructure that succintly but perfectly represents the configuration data. The returned value must be a composition of simple types, that is, nested compositions of ``dict``, ``list``, ``str`` etc. This is called after ``finalize`` is called on the source. ``config_restore(self, state)`` The ``state`` parameter is passed in as the saved return value of ``config_save``. ``config_restore`` is called before ``initialize`` is called on the Source. Content Decorators .................. A content-decorating source provides content to a Leaf, where it does not control the Leaf. An example is the recent documents content decorator, that provides document collections as content to applications. A normal Source listed in ``__kupfer_sources__`` will be eligible for content decoration as well if it implements the needed methods. Otherwise content-only sources are listed in ``__kupfer_contents__``. ``@classmethod decorates_type(cls)`` Return the type of Leaf that can be decorated. You must also implement ``decorate_item``. ``@classmethod decorate_item(cls, leaf)`` Return an instance of a Source (normally of the same type as the content decorator itself) that is the content for the object ``leaf``. Return ``None`` if not applicable. Sources returned from ``decorate_item`` go into the common Source pool. The new source instance will not be used if the returned instance is equivalent (as defined by class and ``reepr_key`` above). Source Attributes ................. ``Source.source_user_reloadable = False`` Set to ``True`` if the source should have a user-visible *Rescan* action. Normally you much prefer to use change notifications so that this is not necessary. ``Source.source_prefer_sublevel = False`` Set to ``True`` to not export its objects to the top level by default. Normally you don't wan't to change this ``Source._version`` Internal number that is ``1`` by default. Update this number in ``__init__`` to invalidate old versions of cache files. TextSource :::::::::: TextSource inherits from KupferObject. A text source returns items for a given text string, it is much like a simplified version of Source. At a minimum, a TextSource subclass must implement ``get_text_items`` and ``provides``. ``__init__(self, name)`` Override as ``__init__(self)`` to provide a unicode name for the source. ``get_text_items(self, text)`` Return a sequence of Leaves for the unicode string ``text``. ``provides(self)`` Return a sequence of the Leaf types it may contain ``get_rank(self)`` Return a static rank score for text output of this source. ActionGenerator ::::::::::::::: ActionGenerator inherits from object. ActionGenerator is a helper object that can be declared in ``__kupfer_action_generators__``. It allows generating action objects dynamically. ``get_actions_for_leaf(self, leaf)`` Return a sequence of Action objects appropriate for this Leaf .. note:: The ``ActionGenerator`` should not perform any expensive computation, and not access any slow media (files, network) when returning actions. Such expensive checks must postponed and be performed in each Action's ``valid_for_item`` method. The Plugin Runtime :::::::::::::::::: .. topic:: How a plugin is activated 1. The plugin module is imported into Kupfer. If an error occurs, the loading fails and the plugin is disabled. If the error raised is an ImportError then Kupfer report it as a dependency problem. 2. Kupfer will initialize a ``kupfer.plugin_support.PluginSettings`` object if it exists (see next section) 3. Kupfer will call the module-level function ``initialize_plugin(name)`` if it exists. 4. Kupfer instantiates the declared sources and actions and insert sources, actions, content decorators, action generators and text sources into the catalog. .. topic:: When a plugin is deactivated When the plugin is disabled, the module-level function ``finalize_plugin(name)`` is called if it exists. [It is not yet final whether this function is called at shutdown or only when hot-unplugging plugins.] kupfer.plugin_support ::::::::::::::::::::: This module provides important API for several plugin features. PluginSettings .............. To use user-settable configuration parameters, use:: __kupfer_settings__ = plugin_support.PluginSettings( { "key" : "frobbers", "label": _("Number of frobbers"), "type": int, "value": 9, }, ) Where ``PluginSettings`` takes a variable argument list of config parameter descriptions. The configuration values are accessed with ``__kupfer_settings__[key]`` where ``key`` is from the parameter description. Notice that ``__kupfer_settings__`` is not updated with the user values until the plugin is properly initialized. ``PluginSettings`` is read-only but supports the GObject signal ``plugin-setting-changed (key, value)`` when values change. check_dbus_support and check_keyring_support ............................................ ``plugin_support`` provides the convenience functions ``check_dbus_support()`` and ``check_keyring_support()`` that raise the appropriate error if a dependency is missing. Alternatives ............ Alternatives are mutually exclusive features where the user must select which to use. Each category permits one choice. .. topic:: Categories of Alternatives :``terminal``: the terminal used for running programs that require terminal :``icon_renderer``: method used to look up icon names Each category has a specific format of required data that is defined in ``kupfer/plugin_support.py``. A plugin should use the function ``kupfer.plugin_support.register_alternative(caller, category_key, id_, **kwargs)`` to register their implementations of new alternatives. The arguments are: .. topic:: ``register_alternative(caller, category_key, id_, ** kwargs)`` :``caller``: the name of the calling plugin, is always ``__name__`` :``category_key``: one of the above categories :``id_``: the plugin's identifier for the alternative :`kwargs`: key-value pairs defining the alternative ``register_alternative`` is normally called in the plugin's ``initialize_plugin(..)`` function. .. topic:: Fields requried for the category ``terminal`` :``name``: unicode visible name :``argv``: argument list: list of byte strings :``exearg``: the execute-flag as a byte string (``""`` when N/A) :``desktopid``: the likely application id as a byte string :``startup_notify``: whether to use startup notification as boolean .. topic:: Fields required for the category ``icon_renderer`` :``name``: unicode visible name :``renderer``: an object with an interface just like ``kupfer.icons.IconRenderer`` Plugin Packages, Resources and Distribution ::::::::::::::::::::::::::::::::::::::::::: A plugin is a Python module–either a single python file or a folder with an ``__init__.py`` file (a package module). In the latter case, the whole of the plugin can be defined inside ``__init__.py``, or it can be split into several modules. Kupfer will look for all the description variables (like ``__kupfer_name__``) in ``__init__.py``. .. topic:: Plugin-installed custom icons A package module may include custom icons as .svg files. The icon files must be declared in a file inside the python package called ``icon-list``. * Each line is a tab-separated field list, with the icon name in the first column and the filename (relative to the plugin package) in the second column. * Lines can be commented with a leading ``#`` * If a literal ``!override`` appears in the third column, the icon is installed even if it overrides the currently used GTK icon theme. Plugins may be installed into any of the ``kupfer/plugins`` data directories. Package modules can also be installed and used as ``.zip`` files, so they too can be distributed as single files. Example Plugins =============== I want to specifically highlight certain files in Kupfer that are good to read as examples. + Custom Leaf and Action: the common case of creating a custom ``Leaf`` type and defining its default ``Open`` action, see ``kupfer/plugin/notes.py`` + Content decoration: making content for objects, see ``kupfer/plugin/archiveinside.py`` (*Deep Archives* plugin) + Asynchronous error reporting: see ``kupfer/plugin/volumes.py``, action *Unmount* Reference to the ``kupfer`` Package =================================== There are several modules inside the ``kupfer`` package that a plugin can reuse. .. topic:: ``kupfer.commandexec`` ``kupfer.commandexec`` is not used by plugins anymore after version v204. See `Auxiliary Method wants_context(self)`_ above instead. .. topic:: ``kupfer.config`` .. .. topic:: ``kupfer.interface`` This module does not need to be imported just to implement the interface it defines. ``TextRepresentation`` ``get_text_representation`` If a Leaf has a text representation (used for copy-to-clipboard), it should implement this method and return a unicode string. .. topic:: ``kupfer.kupferstring`` A **byte string** (Python ``str``) is just a stream of data. When you handle byte strings that is text, you must convert it to unicode as soon as possible. You only know the encoding depending on the source of the byte string. ``tounicode`` decode UTF-8 or unicode object into unicode. ``tolocale(ustr)`` coerce unicode ``ustr`` into a locale-encoded bytestring. ``fromlocale(lstr)`` decode locale-encoded bytestring ``lstr`` to a unicode object. .. topic:: ``kupfer.objects`` ``kupfer.objects`` includes the basic objects from the package ``kupfer.obj``, such as ``Leaf``, ``Action``, ``Source`` etc. ``FileLeaf``, ``AppLeaf``, ``TextLeaf`` etc. The basic re-usable types live here ``OperationError`` Exception type for user-visible errors in action execution. Raise ``OperationError`` with a unicode localized error message inside ``Action.activate`` to notify the user of a serious error. Specialized versions exist: Such as ``CommandMissingError(cmd)``, ``NotAvailableError(toolname)``, ``NoMultiError()`` .. topic:: ``kupfer.pretty`` .. .. topic:: ``kupfer.runtimehelper`` .. .. topic:: ``kupfer.textutils`` .. .. topic:: ``kupfer.uiutils`` ``show_notification(title, text='', icon_name='', nid=0)`` Show a notification. If a previous return value is passed as ``nid`` , try to replace that previous notification. Returns a notification identifier, or None if notifications are not supported. .. topic:: ``kupfer.utils`` ``spawn_async(argv)`` Spawn a child process, returning True if successfully started. ``spawn_in_terminal(argv)`` .. ``show_path(path)`` .. ``show_url(url)`` Display with default viewer for ``path`` or ``url``. ``get_display_path_for_bytestring(filepath)`` File paths are bytestrings (and are not text). ``get_display_path_for_bytestring`` returns a user-displayable text representation as a unicode object. .. topic:: ``kupfer.task`` .. .. topic:: ``kupfer.weaklib`` .. .. topic:: ``kupfer.core`` The module ``kupfer.core`` can not be used by plugins. .. vim: ft=rst tw=72 et sts=4 sw=4 .. this document best viewed with rst2html kupfer-v208/Documentation/VersionHistory.rst000066400000000000000000001106061176220042200214210ustar00rootroot00000000000000.. role:: lp(strong) NEWS for kupfer =============== kupfer v208 ----------- Released Friday, 1 June 2012 * Fix bug with nonexisting catalog directories (Karol) (:lp:`1000980`) * Fix sending to many with Thunderbird (Karol) (:lp:`955100`) * Fix history file for OpenOffice/LibreOffice (Karol) * *Audacious* plugin: Work with Audacious 3 (Ulrik) * Localization updates: + cs, Marek Černocký + es, Daniel Mustieles + fr, Alexandre Franke, Bruno Brouard + ru, Nikolay Barbariyskiy + sl, Matej Urbančič kupfer v207 ----------- Released Sunday, 26 February 2012 * Documentation translated to French by Bruno Brouard * New translation to Brazilian Portuguese by Djavan Fagundes * New translation to Hungarian by SanskritFritz * Handle large text objects a bit better * Introduce proxy objects *Clipboard File* and *Clipboard Text*. These objects are implemented in the *Clipboard* plugin, just like the *Selected Text* object which has changed home to this plugin. Accordingly, deactivating the clipboard plugin will deactivate these proxies. * Support copying and pasting files from/to the clipboard, which allows much easier integration with file managers. * Add an information text detailing which keyring backend is used to store passwords, visible in the user credentials dialog. * *Vim:* Expand the vim plugin to use a helper process to track running server instances of (G)Vim. Each running session is exported as an object, and most importantly, files can be opened in a session using the action *Open With*. * *Multihead Support:* This new plugin will start the "keyboard shortcut relay" service on additional screens, if it is needed. It is active by default, and does not do anything on configurations with a single X screen. * *Send Keys:* Allow sending key sequences using comma trick. * *Thunar:* Add action *Symlink In...* * *Quicksilver Icons:* New plugin with a few icons from Quicksilver * Use themable custom icon names ``kupfer-execute``, ``kupfer-catalog``, ``kupfer-launch``. Also allow plugins to choose to supply icons when the icon theme lacks them, or always override the icon theme. * Fix passing zero-length arguments to programs (Fabián Ezequiel Gallina) (:lp:`863349`) * *Gmail:* Expose more contact info fields (Adi Sieker, Karol Będkowski) * Add plugin *DuckDuckGo* (Isaac Aggrey) * Add quick note action to *Zim* (Karol Będkowski) * Add *Edit Contact in Gmail* to *Gmail* (Karol) * Fix version detection in *Gajim* (Karol) * *Google Translate:* Since Google no longer provides this API (for free), this plugin is no longer included in Kupfer. * Fix compatibility with dbus-python version 1.0 (:lp:`921829`) * Fix loss of window shape when centering (David Schneider) (:lp:`779845`) * We are now using the format .tar.xz for the distribution tarball. * The git repository and tarball now includes a local copy of waf (1.6.11), unmodified but with unused in Tools/ and extras/ removed. * Localization updates: + (cs) Marek Černocký + (de) Mario Blättermann + (fr) Bruno Brouard + (es) Daniel Mustieles + (hu) SanskritFritz + (pl) Piotr Drąg + (pt_BR) Djavan Fagundes + (sl) Andrej Žnidaršič + (sv) Ulrik kupfer v206 ----------- `The longest changelog ever—the best Kupfer ever?`:t: Released Thursday, 14 April 2011 These are changes since the v205 release. Below this I have included, the full changelog for all the features introduced in v205, since it was not published in whole together with the v205 release. I would like to thank all contributors for patches, bug reports, comments and translations. A special thanks to those who have contributed to the `user documentation`__; it is now complete in both Polish and Spanish. If you like my work with Kupfer, you can support me by donating. There are instructions how to do so on the web page. –ulrik. __ http://kaizer.se/wiki/kupfer/help/ * *Thunderbird:* fix double create email windows (:lp:`747198`) * *Thunderbird:* fix problem with loading contacts (Karol Będkowski) (:lp:`747438`) * Use ``rst2man`` as it was configured (:lp:`747500`) * Reduce runtime memory use for substantially by reimplementing the icon cache (expectations vary btw. 10 to 30 percent). * Prefer gnomekeyring over kwallet, and don't load keyring support if it is not requested by a plugin (:lp:`747864`) * Make the "folder" icon take precedence over "inode/directory" * Fix a regression in *Go To* that would not focus minimized windows. * In *Go To* action, cycle application windows (if they are all on the same workspace). * Fix :lp:`671105`: the user's home is aliased as *Home Folder* and the "lookalike" application is hidden. * Use GTK+ as default icon set, the ASCII icon set remains as a plugin * Fix regression :lp:`749824`, kupfer used a GTK+ 2.20 feature. Kupfer should now run under GTK+ 2.18 (2.16?). GTK+ 2.20 is recommended and needed for full input method support. * Remake ``.desktop`` file parsing to be much more lenient, so that we can launch all applications again. Affected were especially launcher files written by wine. * Make sure the ``Home`` key works in text mode (:lp:`750240`) * *Rhythmbox:* Fix omission of ``.jpg`` extension when searching cover art (William Friesen) * Support xfce4-dict in *Dictionary* plugin (David Schneider) * Make sure ``kupfer.svg`` can be mimetype-detected (NAKAMURA Yoshitaka) (:lp:`750488`) * Fix regression that prevented mimetypes and icon cache from being updated properly when installing from source. * Focus the plugin list search box by default in the preferences window. * Fix regression in *XFCE Session Management* that had a broken logout command. * Install kupfer as a Thunar 'sendto' object. * Fix a bug in the autostart file we installed, it was including a '%F' which broke ``--no-splash`` when autostarted on XFCE. * *LibreOffice:* support their newer recent documents file (Karol Będkowski) * *Notes:* Insert newlines after the new note title (:lp:`748991`) * *Commands:* Recognize absolute paths with arguments as shell commands (for example ``/bin/grep --help``. (:lp:`152093`) * *GNU Screen:* check if sessions are still active (:lp:`756449`), don't give up even if ``$SCREENDIR`` is missing when we are started (:lp:`753376`) * *Notes:* support the program kzrnote as well * Renamed the two like-named command actions in spanish (Daniel Mustieles) * Localization updates for v206: + sl Andrej Žnidaršič + es Daniel Mustieles + de Mario Blättermann This is the changelog for the v205 release, which was released previously. * Changes to the interface + Add a small menu button on the window for explicit access to context actions, preferences window, and help. + Increase icon size to 128px + Always show description field + Use an undecorated window with rounded corners + Let the frame be slightly transparent if supported + Themable colors and properties by using GTK+ styling, see ``Documentation/GTKTheming.rst``, and the plugin *Custom Theme* that shows how to use custom styles. * Add context action "Set X as default action for object Y" + For example, you can make *Launch Again* default for Terminal, and our default configuration uses this setting for two common terminals (GNOME and XFCE). * Updated Kupfer's technical documentation (in ``Documentation/``), including the Plugin API reference. * Implement a preedit widget for input methods, also resolving the incompatibility with ibus (David Schneider) (:lp:`696727`) * Re-implement launching of applications * Allow the user to configure which terminal program is used. Applies to all of *Run in Terminal*, *Open Terminal Here*, for .desktop files that specify ``Terminal=true`` etc. * Implement an "alternatives" mechanism so that plugins can register mutually exclusive alternatives. Currently implemented are Terminals (see above) and Icon Renderers. * *Thunar*: Use Thunar 1.2's Copy and Move API. + These allow copying and moving anything through thunar, and it will show progress dialogs for longer transactions. * Add *Ascii & Unicode Icon Set* for fun * Add simple plugin *Quick Image Viewer* to show images in a simple way. * Add *Send Keys* plugin that can send synthetic keyboard events, and prominently can be used for the *Paste to Foreground Window* action on text. Requires ``xautomation`` package. (:lp:`621453`) * *Volumes:* treat mounts as regular folders, so they can be targets for file operations. * *File Actions:* the action *Move to Trash* switches home to the *Trash* plugin, the archive actions go to new *Archive Manager* plugin. *Archive Manager* also updated to recognize more archive file types, including ``.xz``. * Activate current selection on double-click in the interface. (:lp:`700948`) * Update the preferences window and move the folder configuration to the Catalog tab. * Add ``initialize_plugin`` to the plugin interface. * The D-Bus interface has been extended with X screen and timestamp-aware versions of all methods: + ``PresentOnDisplay``, ``PutFilesOnDisplay``, ``PutTextOnDisplay``, ``ExecuteFileOnDisplay`` all act like their similarly-named predecessors, but take ``$DISPLAY`` and ``$DESKTOP_STARTUP_ID`` as their last two arguments. + ``kupfer-exec`` activation sends the event timestamp so that focus can be carried along correctly even when running ``.kfcom`` files (if activated as an application by startup-notification-aware launchers, this works with most standard desktop components). * Internally, change how actions are carried out by allowing the action execution context object to be passed down the execution chain instead of being a global resource. This also allows plugins to cleanly access current environment (event timestamp, current screen etc). + Support running kupfer on multiple X screens (:lp:`614796`), use the command ``kupfer --relay`` on each additional screen for global keyboard shortcut support. This is experimental until further notice! * The *Tracker 0.8* plugin supports version 0.8 and 0.10 alike. Because of that and the expected compatibility with one version after this too, it's now called *Tracker*. * The *Favorites* plugin lists *Kupfer Help* and *Kupfer Preferences* by default (for new users), so that it's not empty and those items are ranked higher. * In free-text mode, show a character count in the text entry. * The action *Go To* on applications has changed implementation. It will first bring to front all the application's windows on the current workspace, and upon the next invocations it will focus the other workspaces, in order, if they have windows from the same application. For single-window applications, nothing is changed. * Localization updates for v205: + (cs) Marek Černocký + (de) Mario Blättermann + (es) Daniel Mustieles + (ko) Kim Boram + (nb) Kjartan Maraas + (pl) Karol Będkowski + (sl) Andrej Žnidaršič + (sv) Ulrik kupfer v205 ----------- Congratulating ourselves Released Friday, 1 April 2011 * Changes to the interface + NOw we have a teh awsum interface * Add context action "Set X as default action for object Y" + You can finally make Kupfer do what you want. * Implement a preedit widget for input methods, also resolving the incompatibility with ibus (David Schneider) (:lp:`696727`) + Ok, so that foreign people can enter text too. * Updated Kupfer's technical documentation (in ``Documentation/``), including the Plugin API reference. + Someone finally bothered * The action *Go To* on applications has changed implementation. It will first bring to front all yada yada, etc... + Whatever, it finally works in a sensible way * And tons of other stuff, enjoy! kupfer v204 ----------- Released Friday, 18 March 2011 * Expand and improve upon `Kupfer's User Documentation`__. * Use and require **Waf 1.6**, which supports building using either Python 3 or Python 2.6+. Kupfer itself still uses Python 2.6+ only. * Add *Gwibber* plugin that allows integration with Twitter, Identi.ca, Buzz etc. (Karol Będkowski) * Add chat client *Empathy* plugin (Jakh Daven) * Remove the plugin *Twitter* since it is incompatible and has no updated implementation. * Add *Show QRCode* plugin by Thomas Renard (:lp:`611162`) * Periodically save data from plugins so it's not lost if Kupfer can't exit cleanly at logout * *Commands*: Add actions *Pass to Command*, *Filter through Command*, *Send to Command* which add a lot of shell script-related power to Kupfer. These actions, and *Run (Get Output)* as well, use a shell so that you can run shell pipelines. * *Search the Web*: Fix bug in OpenSearch parser (:lp:`682476`) * *VirtualBox*: Support vboxapi4 (Karol Będkowski) * *Thunderbird*: Fix problems in the mork parser (Karol Będkowski) (:lp:`694314`) * *OpenOffice*: Support LibreOffice too (Karol Będkowski) * Fix "Y2011 bug" where the time parameter overflowed INT32 in keybinder * *Shorten Links*: Use only services with stable API, added and removed services. * *Google Search*, *Google Translate* and ``bit.ly`` in *Shorten Links* can use SSL for transport if a third-party plugin is installed. * Fix bug if evolution address book is missing (Luca Falavigna) (:lp:`691305`) * Fix *Search the Web* to use localized ``firefox-addons`` subdirectories for search engines (:lp:`735083`) * Fix bug with integer division (Francesco Marella) * *APT:* Workaround bug with ``subprocess`` (:lp:`711136`) * Find cover art files just like Rhythmbox (William Friesen) (:lp:`676433`) * Use ``readlink`` in ``kupfer-exec`` script too since ``realpath`` is not always available. * Allow plugins to use update notifications (William Friesen) * Bug :lp:`494237` is hopefully fixed once and for all. * The *Large Type* action will work with anything that has ``TextRepresentation`` __ http://kaizer.se/wiki/kupfer/help/ * Localization updates: + (cs) Marek Černocký + (da) Joe Hansen + (de) Mario Blättermann + (es) Daniel Mustieles + (gl) Marcos Lans + (pl) Karol Będkowski + (sl) Andrej Žnidaršič + (sv) Ulrik + (zh_CN) Aron Xu, Yinghua Wang kupfer v203 ----------- .. role:: git(emphasis) Released Saturday, 6 November 2010 * Center Kupfer on the monitor were the mouse pointer is (:lp:`642653`, :git:`3d0ba12`) * Ignore the system's configured input manager by default (User can choose by pressing Shift+F10 in Kupfer). Kupfer is still not compatible with ibus 1.3. (:lp:`601816`, :git:`4f029e6`) * Use ``readlink`` instead of ``realpath`` (:git:`656b32d`) * *Opera Mail*: Handle contacts with multiple e-mail addresses (Chris Parsons) (:lp:`661893`, :git:`12924be`) * *Google Translate*: Fix language list (Karol Będkowski) (:lp:`600406`, :git:`7afac2b`) * *TSClient*: Search recursively for session files (Karol, Freddie Brandt) (:git:`ad58c2e`) * *Rhythmbox*: Fix thumbnail lookup (William Friesen) (:lp:`669077`, :git:`b673f98`) * New Slovenian translation of help by Matej Urbančič (:git:`3b7df25`) * New Turkish translation by M. Deran Delice (:git:`bd95d2a`) kupfer v202 ----------- Released Sunday, 5 September 2010 * Add option to hide Kupfer when focus is lost (and enable by default) (Grigory Javadyan) (:lp:`511972`) * Use application indicators when available (Francesco Marella) (:lp:`601861`) * Python module `keyring` is now optional for Kupfer (but required for the same plugins that used them before) * Update *Google Translate* for protocol changes (Karol, Ulrik) (:lp:`600406`) * Disable saving window position until a better solution is found * Use 'mailto:' as URL (:lp:`630489`) * Fix UI glictch with empty Source (William Friesen) (:lp:`630244`) * Small changes (Francesco Marella) * New Czech translation of the help pages (Marek Černocký) * New Italian translation of the help pages (Francesco Marella) * New Polish translation of the help pages (Karol Będkowski) * New Basque translation (Oier Mees, Iñaki Larrañaga Murgoitio) * New Galician translation (Fran Diéguez) * Localization updates: + cs (Marek Černocký) + de (Mario Blättermann) + pl (Karol Będkowski) + sl (Andrej Žnidaršič) + zh_CN (Aron Xu) kupfer v201 ----------- Released Wednesday, 30 June 2010 * New Logo and Icon by Nasser Alshammari! * New plugin *Opera Mail* by Chris Parsons * New plugin *SSH Hosts* by Fabian Carlström * New plugin *Filezilla* by Karol Będkowski * New plugin *Getting Things GNOME!* (Karol) * New plugin *Vim* (recent files) * *Clipboard:* Option *Copy selection to primary clipboard* (Karol) * *Firefox:* Option *Include visited sites* (Karol) (:lp:`584618`) * *Thunar:* Action *Send To...* (Karol) * New preferences tab for Catalog configuration * Allow disabling and "unloading" plugins at runtime * Support new tracker in plugin *Tracker 0.8* * *Shell Commands:* New Action *Run (Get Output)* * New plugin capabilities: ActionGenerator, Plugin setting change notifications (Karol) * Use ``setproctitle`` module if available to set process title to ``kupfer`` (new optional dependency) * Don't use a crypted keyring (partially addresses :lp:`593319`) * Fix :lp:`544908`: Retain window position across sessions * Fix :lp:`583747`: Use real theme colors for highlight * Fix :lp:`593312`: About window has no icon * More minor changes * Localization updates: + cs, Marek Černocký + de, Mario Blättermann + es, Jorge González + it, Francesco Marella + pl, Karol Będkowski + sl, Andrej Žnidaršič + sv, Ulrik kupfer v200 ----------- Released Wednesday, 7 April 2010 * Add Keyboard Shortcut configuration (Karol Będkowski) * Make it easier to copy and move files (William Friesen), while showing user-friendly errors when action is not possible (Ulrik) (:lp:`516530`) * Collect results in a *Command Results* subcatalog, including results from asynchronous commands (Pro tip: Bind a trigger to *Command Results* → *Search Contents*, for quick access to copied files, downloaded files etc) * *Last Result* proxy object implemented * Add *Cliboards* -> *Clear* action (Karol) * Add *Rescan* action for some sources (Karol) * Add an icon in the plugin list search field to enable clearing it (Karol) * Fix spelling (Francesco Marella) * Fix bug `544289`:lp: * Require python module ``keyring`` (since pandoras-box-1.99, but was not mentioned) * Recommend python-keybinder version 0.0.9 or later * Localization updates: + cs Marek Černocký + de Mario Blättermann + es Jorge González + pl Karol Będkowski + sl Andrej Žnidaršič + sv Ulrik + zh_CN Aron Xu kupfer version pandoras-box-1.99 -------------------------------- Released Tuesday, 16 March 2010 * Plugins can be loaded at runtime, although not unloaded can they not * Plugins can bundle icons, and plugins can be packaged in .zip files * New plugins *Google Search*, *Textfiles* and *Thunar* * New plugin *Deep Archives* to browse inside .zip and .tar files * New plugins *Twitter*, *Gmail* and *Google Picasa* by Karol Będkowski * New plugin *Evolution* by Francesco Marella * New action *Get Note Search Results...* in *Notes* by William Friesen (LP#511954) * New plugin capabilities (user credentials, background loader) by Karol * Added *Next Window* proxy object to *Window List* plugin * Allow saving Kupfer commands to .kfcom files, and executing them with the ``kupfer-exec`` helper script. * Display error notifications to the user when some actions can not be carried out. * Allow collecting selections with the *Clipboard* plugin (Karol) * Include Gnome/Yelp documentation written using Mallard (Mario Blättermann) * Make *Zim* plugin compatible with newer Zim (Karol, Ulrik) * Detect multiple volume rar files (William Friesen) (LP#516021) * Detect XFCE logout better (Karol) (LP#517819) * Fix reading VirtualBox config files (Alexey Porotnikov) (LP#520987) * Fixed module name collision in user plugins (LP#518958), favoriting "loose" applications (LP#518908), bookmarked folders description (LP#509385), Locate plugin on OpenSUSE (LP#517819), Encoding problem for application aliases (LP#537730) * New French translation by Christophe Benz * New Norwegian (Bokmål) translation by Kjartan Maraas * Kupfer now requires Python 2.6 * Localization updates: + cs Marek Černocký + de Mario Blättermann + es Jorge González + fr Christophe Benz + it Francesco Marella + nb Kjartan Maraas + pl Karol Będkowski + pt Carlos Pais + sl Andrej Žnidaršič + sv Ulrik kupfer version pandoras-box-1.1 ------------------------------- Released Monday, 8 February 2010 * Fix bug in contact grouping code that could cause unusable Kupfer with Pidgin plugin. Reported by Vadim Peretokin (LP#517548) * Chromium plugin will index Google Chrome bookmarks as fallback, by William Friesen (LP#513602) * Kupfer's nautilus plugin was changed to be easier to reuse for others * Some minor changes * Localization updates: + pt (Carlos Pais) kupfer version pandoras-box-1 ----------------------------- "Pandora's box" Released Monday, 1 February 2010 * Implement the famous "comma trick": Press , (comma) in the first or third pane to make a stack of objects to perform actions on. This allows actions on many objects and even many-to-many actions. * New plugin: *Triggers*: Add global keybindings to any command you can perform in Kupfer. * New plugin *Skype* by Karol Będkowski * New plugin *Thunderbird* (or Icedove) (Karol) * Implement merging of contacts and hosts: All contacts of the same name are merged into one object. (Karol, Ulrik) * New plugin *Higher-order Actions* to work with saved commands as objects * The *Favorites* plugin was reimplemented: you may favorite (almost) any object. Favorites get a star and a rank boost. * *Window List* plugin was improved, most notably a *Frontmost Window* proxy object was added * New proxy object *Last Command* * The *Firefox* plugin now includes most-visited sites from browser history (William Friesen, Karol, Ulrik) * The list of plugins has a field to allow filtering the list (Karol) * New Czech localization by Marek Černocký * Many smaller changes. * Localization updates: + cs (Marek Černocký, Petr Kovar) + de (Mario Blättermann) + nl (Martin Koelewijn) + pl (Karol) + sv + sl (Andrej Žnidaršič) kupfer version c19.1 -------------------- Released 31 December 2009 * New plugin: *Shorten Links* by Karol Będkowski * Implemented *Ctrl+C* (and *Ctrl+X*) to copy (cut) selected object * Fix bug LP #498542: restore window position code to c18 * Partial fix of bug LP #494237, window is sometimes blank * Fix bug LP #500395, column order in *Top* plugin (Karol) * Fix bug LP #500619, handle network errors in *Google Translate* plugin (Karol) * Localization updates: + pl (Karol) + sv kupfer version c19 ------------------ Released 18 December 2009 * New plugins: + *Gnome Terminal Profiles* by Chmouel Boudjnah + *OpenOffice* recent documents in OpenOffice by Karol Będkowski + *Top* show and send signals to running tasks (Karol) + *Truecrypt* show volumes in truecrypt history and allow mounting them (Karol) + *Vinagre* Remote Desktop Viewer (Karol) + *XFCE Session Management* (Karol) + *Audacious* by Horia V. Corcalciuc * New Slovenian translation by Andrej Žnidaršič * Some plugins will now explicitly require a D-Bus connection and fail to load if no connection was found. * Add accelerators *Page Up*, *Page Down* and *Home* in the result list. (Karol) * Use customized or localized desktop directory instead of hardcoding ``~/Desktop`` by default. It will not affect users who already customized which directories Kupfer indexes. * It now is possible to favorite shell commandlines * *Gajim* plugin now works with version 0.13 (Karol) (LP #489484) * Basic support for Right-to-left (RTL) interface * Fix bugs with "loose" Applications (not in system directories), reported by Chmouel. * Add accelerator *Ctrl+Return* for **Compose Command**: You may compose a command object out of an (Object, Action) combination, to be used with the new action *Run After Delay...*. * Added file action *Send by Email* to *Claws Mail* plugin (Karol) * Added file action *Mount as TrueCrypt Volume* to *TrueCrypt* plugin (Karol) * Many small bugfixes Localization updates: * de: Mario Blättermann * es: Jorge González * it: Francesco Marella * pl: Karol Będkowski * sl: new (Andrej) * sv: Ulrik Sverdrup kupfer version c18.1 -------------------- Released 20 November 2009 * Fix bug to toss out malfunctioning plugins properly (Reported by Jan) * Fix bug in showing the shutdown dialog, reported by user sillyfofilly (LP 484664) * Fix bug in plugin *Document Templates*, reported by Francesco Marella (part of LP 471462) kupfer version c18 ------------------ Released 18 November 2009 "Mímisbrunnr" * New plugins: + *Pidgin* by Chmouel Boudjnah + *Google Translate* by Karol Będkowski + *APT* (package manager APT) by Martin Koelewijn and Ulrik + *Document Templates* + *Kupfer Plugins* + *Show Text* * *Gajim* plugin matches contacts by jid as well as name, suggested by Stanislav G-E (LP 462866) * Action *Rescan* on sources is now debug only (should not be needed) * Kupfer installs its Python package into ``$PREFIX/share`` by default, instead of installing as a system-wide Python module. * Kupfer can take input on stdin and pass as text to an already running instance * Fix bug in *Services* for Arch Linux, reported by lh (LP 463071) * Changes for plugin authors: + May use ``uiutils.show_text_result`` to show text + ``kupfer.task.ThreadTask`` is now a reliable way to run actions asynchronously (in a thread) + You can use item *Restart Kupfer* to restart (in debug mode) + Plugins may be implemented as Python packages, as well as modules * Updated the dependencies in the README. pygobject 2.18 is required. Added gvfs as very recommended. * Other bugfixes Localization updates: * de (Mario Blättermann) * es (Jorge González) * nl (Martin Koelewijn) * pl (Karol Będkowski) * sv * zh_CH (lh) kupfer version c17 ------------------ Released, 25 October 2009 "A fire lit by nine kinds of wood" * 8 new plugins by Karol Będkowski: + *Claws Mail*, Contacts and actions + *Gajim*, Access to gajim contacts + *Opera Bookmarks*, for the web browser Opera + *PuTTY Sessions*, access to PuTTY sessions + *System Services*, start, stop or restart system services + *Terminal Server Client*, access to TSClient sessions + *VirtualBox*, control virtual machines, Sun or OSE version + *Zim*, access pages in the desktop wiki * New plugin *Chromium Bookmarks* by Francesco Marella * Plugins missing dependencies will be presented in the GUI with a clear error message. * *Firefox Bookmarks* plugin: Workaround Firefox 3.5 writing invalid JSON (Karol, Ulrik) * *Locate* plugin: Ignore case by default, add option to control this. (Karol) * Kupfer is much more friendly and says "Type to search in *Catalog*" when it is ready to be used. * Localization updates: + New Simplified Chinese localization (lh) + New Dutch localization (Martin Koelewijn) + New Portuguese localization (Carlos Pais) + Updated pl (Karol) + Updated es (Jesús Barbero Rodríguez) kupfer version c16 ------------------ Released 5 October 2009 * Translation to German (Thibaud Roth) * Polish translation updated (Maciej Kwiatkowski) * Add search engine descriptions from ``firefox-addons`` (Francesco Marella) * Speed up directory browsing by using much less system calls * Improve documentation and put it together into a `Manual`. * Generate man page from reStructuredText document `Quickstart`. * Evaluate valid actions (per object) lazily to save work. * Add accelerators *Ctrl+Q* (select quit) and *Alt+A* (activate) * Parse even horribly wrong search engine descriptions (Bug reported by Martin Koelewijn) kupfer version c15 ------------------ * Translation to Polish by Maciej Kwiatkowski * Speed up the string ranker tremendously; 3x faster in common cases. * All objects now have an alias in the basic latin alphabet (if possible) so that, for example, query `wylacz` matches item *Wyłącz*. * Show notification icon by default * Read XML with cElementTree (Faster.) * Read Firefox 3's bookmarks (Python2.5 requires `cjson` module) * New Plugin: Image Tools, with action *Scale...* and JPEG rotation actions (*Scale* requires ImageMagick (`convert`), JPEG actions `jpegtran` and `jhead`) * Basic support for a Magic Keybinding: summon kupfer with current selection kupfer version c14.1 -------------------- * Fix two bugs with new browisng mode (soft reset for text mode, backspace or left to erase a subcatalog search) kupfer version c14 ------------------ * Rewrite and improve browsing mode: * Browsing the catalog or folders is much improved; it is easier to keep the overview and be oriented. * Returning to kupfer after having performed an action, the old object is still available, but without locking the catalog to its location. When spawning kupfer again, the previous context is available if you immediately browse; if you search, you search the whole catalog. * The search times out after 2 seconds if no key is typed. Now the highlight text will fade to show this. * Add accelerators `Ctrl+G` and `Ctrl+T` to get current selection in nautilus and currently selected text (if available). kupfer version c13.1 -------------------- * Fix two bugs with *Rename To...* kupfer version c13 ------------------ * New Plugin: Calculator * New Action: *Rename To...* in File Actions Plugin * Smaller changes (Stop learned mnemonics database from growing indefinitely, Catch SIGINT without python's handler, *Copy To...* requires pygobject 2.18 now) kupfer version c12 ------------------ * Translation to Spanish by Leandro Leites * Preferences. Display plugin settings and options beside the plugin list, and allow configuring included (and watched) directories. * Support the new Gnome session protocol to save state on log out. * Improve embarassingly bad shell command quoting for *Execute* and Tracker tag actions. * Specify user data locations with `X-UserData` * Fix an AttributeError in Notes plugin reported by Francesco Marella * Smaller fixes (Add/remove favorite could cease to work, Track intantiated sources better) kupfer version c11 ------------------ The "this one goes to 11" release * New plugin: Notes (Gnote and Tomboy support) * Access notes, Actions: *Create Note* and *Append to Note...* * New plugin: Selected File * Kupfer ships with a Nautilus python extension that once installed, you can access the currently selected file in Nautilus from Kupfer, as the *Selected File* object This release is localized in: Swedish (100%), Italian (90%) kupfer version c10.1 -------------------- * Spanish Translation by Leandro Leites kupfer version c10 ------------------ * Updated italian localization * New plugins: Url Actions, Web Search (rewritten to use all Firefox' search engines) * New actions: *Set Default Application*, *Create Archive In...*, *Restore* (Restore trashed file) * Add accelerators `Control+R` for reset, `Control+S` for select first (source) pane and `Control+.` for untoggle text mode. * Only the bookmarks plugins can toggle "include in toplevel" now. * Other smaller changes (Refuse invalid Application objects from the cache) This release is localized in: Swedish (100%), Italian (93%) kupfer version c9.1 ------------------- * User interface consistency and behaviour improvements. UI is simpler and better. * Other improvements. This release is localized in: Swedish (100%), Italian (60%) kupfer version c9 ----------------- The "c9" release * Search and browse perform better * The interface is now modal. In command mode we can bind special keys to new functions. Type period `.` to enter free-text mode (just like in QS). * Pressing kupfer's keybinding again will hide the window. * Other smaller improvements This release is localized in: Swedish (100%), Italian (60%) kupfer version c8 ----------------- * Make the use of the indirect object pane much more fluid * Apply interface polish (proper english capitalization of actions and other objects, other changes) * Add `Copy To...` action * Try `xdg-terminal` first in *Open Terminal Here* (non-Gnome users can either install `xdg-terminal` or symlink it to their terminal program) * Allow unbinding the keybinding * Fix a bug with tracker tags [Please file bug reports and feature requests.][lp]. Read the files in `Documentation/` and see how you can add new plugins with object and application knowledge to kupfer. This release is localized in: Swedish (100%), Italian (60%) [lp]: http://launchpad.net/kupfer kupfer version c7 ----------------- The "choice" release This is a followup with some small changes after the c6 release, which introduced lots of major changes, including a preferences window and "application content." * Allow wnck to be optional. Kupfer needs wnck to do application matching and focusing of already running applications, but can now run without it if wnck is not available. Window List plugin also needs wnck * Rhythmbox plugin should not crash even if library is not found, now kupfer can run even if rhythmbox's files are not there. * Applications will match names as well as the executables, so that "gedit" matches Text Editor regardless of what the displayed localized name is. [Please file bug reports and feature requests.][lp]. Read the files in `Documentation/` and see how you can add new plugins with object and application knowledge to kupfer. This release is localized in: Swedish (100%), Italian (60%) [lp]: http://launchpad.net/kupfer kupfer version c6 ----------------- The "Sisyphus incremental improvements" release * Preferences window * Allows setting keybinding on the fly * List and enable/disable plugins and set plugin options * Everything was improved slightly, but steadily * Understands more applications, provides more files and objects, and actions with **new plugins:** *Rhythmbox, Abiword, Clipboards, Dictionary, Favorites, Selected Text, Wikipedia* * Connect applications with their related object sources and make it their content, such as Rhythmbox music for the Rhythmbox application. * Applications contain their recently used documents, if available. * Firefox and Epiphany bookmarks are identified with each application * Miscellaneous improvements: * Kupfer object icon ("blue box") * *Some* default application associations are installed (others are learned by launching applications). * Experimental UI with two-line title+description in browse mode * Thumbnails for files and albums in browse mode * Allow sending files and queries to kupfer from the commandline using `kupfer 'query'` or `kupfer docs/file.pdf`. * Even more plugins listen to change callbacks or filesystem monitors to be up to date to the instant. * Do not display nonexisting files as results * Fine-tune how sources are loaded and refreshed on load This release deserves lots of testing. [File bug reports and feature requests.][bug] Read the files in `Documentation/` and see how you can add new plugins with object and application knowledge to kupfer. This release is localized in: Swedish (100%), Italian (60%) Future: part 2 of beautification is refactoring of the interface, so that the UI can be modularized and exchanged in plugins. [bug]: http://launchpad.net/kupfer kupfer version c5 ----------------- The "Beauty from the inside, part 1" release * Big refactorings of the whole data model * Move all of the data model to kupfer.data * Allow actions with indirect objects "threepane kupfer" (with means to configure which objects to use for an action etc) * Uses unicode internally, instead of UTF-8-encoded strings * Some new actions using new possibilities (Open with any, Move file to new location, Add/Remove tracker tags) but more is possible. * Basic manual page included * Fileactions plugin includes unpack archive/create archive * Ship extra and demonstration plugins in contrib/ and interals documentation in Documentation/ * Change learning algorithm to recognize an item's type as well (so that two objects named "project" can be ranked differently) * Small fixes (alphabethic sorting for applications, sources, check if objects still exist after an action, ``rank_adjust`` default actions slightly) This release deserves lots of testing. File bug reports and feature requests. Read the files in Documentation/ and see how you can add new plugins with object and application knowledge to kupfer. This release is localized in: Swedish (100%), Italian (80%) Future: part 2 of beautification is refactoring of the interface, so that the UI can be exchanged. And preferences will hopefully be implemented .. -*- encoding: UTF-8 -*- .. vim: tw=76 ft=rst kupfer-v208/NEWS000077700000000000000000000000001176220042200221072Documentation/VersionHistory.rstustar00rootroot00000000000000kupfer-v208/README.rst000066400000000000000000000066041176220042200145400ustar00rootroot00000000000000kupfer is a simple, flexible, launcher for Gnome ++++++++++++++++++++++++++++++++++++++++++++++++ :Homepage: http://kaizer.se/wiki/kupfer/ :Credits: Copyright 2007–2011 Ulrik Sverdrup :Licence: GNU General Public License v3 (or any later version) Kupfer is an interface for quick and convenient access to applications and their documents. The most typical use is to find a specific application and launch it. We have tried to make Kupfer easy to extend with plugins so that this quick-access paradigm can be extended to many more objects than just applications. Installing ========== This project is configured for the Waf build system; Installation follows the steps:: ./waf configure ./waf then:: ./waf install or :: sudo ./waf install You can use ``--prefix=$PREFIX`` when configuring to assign an installation spot. By default, Kupfer is installed for all users. Installing only for your user, the prefix ``~/.local`` is often used; you just have to make sure that ``~/.local/bin`` is in your ``$PATH``. About Waf --------- Waf is included in both the distributable tarball and the repository (so that full source code is incuded. See the file `waf` for author and licensing information). Waf was acquired through http://waf.googlecode.com/files/waf-1.6.11.tar.bz2 on Saturday, 25 February 2012. The following files extracted:: ./waf-light -> ./waf ./waflib -> ./waflib ./ChangeLog -> ./Waf.ChangeLog ./waflib/Tools/* some files excluded ./waflib/extras/* some files excluded No file contents touched. Build Requirements ------------------ * Python 2.6 or Python 3 * intltool * optionally: rst2man (python-docutils) to install the manpage * optionally: xml2po (gnome-doc-utils) to install mallard help pages Runtime Requirements -------------------- Kupfer requires Python 2.6 or later, and the following important libraries: * gtk python bindings, GTK+ version 2.20 [#]_ * glib python bindings (pygobject) 2.18 * dbus python bindings * python-xdg .. [#] GTK+ 2.20 required for using full support. Kupfer is known to run with version 2.18 as well. Optional, but very recommended runtime dependencies: * python-keybinder (see below) * wnck python bindings * gvfs * `keyring` python module Opportunistic dependencies * The deprecated 'gnome' module is used for session connection as fallback * If available, 'setproctitle' is used to set the process name * python-appindicator for ubuntu-style notification icon * nautilus-python for nautilus selected file * python-gdata for Google plugins Some plugins will require additional python modules! Spawning ======== The program is installed as ``kupfer`` into ``$PREFIX/bin``. Only one instance can be active for one user at a given time. Normal use of kupfer requires an active dbus session bus. Keybinder Module ---------------- Keybinder_ is a module for global keyboard shortcuts that originates from tomboy. .. _`Keybinder`: http://kaizer.se/wiki/keybinder You can use kupfer without the keybinder module, for example by assigning a global keybinding to the ``kupfer`` binary, but it not the recommended way. Documentation ============= Please read ``Documentation/`` and ``Documentation/Manpage.rst`` for technical documentation. User documentation is installed as GNOME (Mallard) help pages, available under the "Kupfer Help" object in the program itself. .. vim: ft=rst tw=72 kupfer-v208/Waf.ChangeLog000066400000000000000000000252731176220042200153420ustar00rootroot00000000000000NEW IN WAF 1.6.11 ----------------- * Enable custom variables for the boost detection #1089 * Disable the config test execution when detecting boost #1090 * Process moc classes in .cpp files by default #1095 * Apply the chmod attribute to the versioned libraries (vnum) #1097 * Fixed the python detection on OSX #1098 * Changed the win32 color settings for Windows 7 #1099 * Set the default fortran linker for ifort to xiar #1104 NEW IN WAF 1.6.10 ----------------- * Fixed the 'remove' attribute propagation in ant_glob #1086 * Fixed the behavior of recurse(name=xyz) when looking in existing folders * Fixed a problem with include paths in the relocation tool #1078 * Improved the pgicc compiler detection #1080 * Fixed the behavior of 'waf options' #1076 * Process larger java projects #1074 * Remove the ':' from the drives when dealing with foreign files and folders on Win32 * Let the 'subst' feature process a chmod attribute * Added a hook for distutils variable query #1083 NEW IN WAF 1.6.9 ---------------- * Fixed the duplicate moc file creation in slow_qt4 #1047 * Fixed the Visual Studio 2008 projects creation #1033 * Added a workaround to avoid creating include folders not under the build directory #1049 * Added a default virtual folder structure for out-of-tree build files #1053 * Added a way to set variants containing /, for example linux/debug * Added a more intuitive behaviour for conf.setenv() #1062 * Fixed the multiple bibliography processing for tex #1040 * Windows CE detection improvements #1065 * Fixed the library installation on OSX * Fixed the Powerpc/IPhone platform detection * Added an Xcode project generator NEW IN WAF 1.6.8 ---------------- * Fixed a typo in Utils.py affecting Win32 platforms (copystat) #1029 * Fixed a minor bug in the Eclipse project generator * Fixed a typo that prevented Waf from running on Pypy-trunk * Make the xlc/xlc++ compiler detection more accurate by looking at the version number #1022 * Minor perl, python and ruby tool improvements * Better logs for the boost detection #1036 * Fixed a performance issue in Runner.py #1039 * Changed the position of the linker flags #1025 NEW IN WAF 1.6.7 ---------------- * Provide more diagnostic for invalid build groups #914 * Various enhancements to msvs.py * Read MSVC_VERSIONS and MSVC_TARGETS from the command-line * Minor cross-compiler detection fix on msvc.py * Fix the redirections with pipes (waf configure > log) * Do not display runnable_status exceptions when running with -k * Let -k stop at the first runnable_status error and -kk run even further * Merge the add_object extension in the main line (source='file.o') * Make update_outputs more robust with changes in the task definition #1017 * Qt4 detection on Win32 NEW IN WAF 1.6.6 ---------------- * Fix the performance regression related to #974 NEW IN WAF 1.6.5 ---------------- * More documentation * Re-enable the colors for msys * Add the .ui files for the qt4 translations * Fix the conf.check_large_file() test * Fix the conf.check_library() in C++ mode #955 * Improve the latex scanner to avoid depending on generated files #943 * Remove the @file processing from the winrc tasks * Fix the python detection using python-config * Add the missing default includes and defines to the moc command * Improve support for hierarchical go-lang packages #953 * Fix the gfortran verbose flag detection on Windows * Fix the support of fortran import libraries #950 * Added a fix for running with Python 2.4 on Windows #949 * Limited support for IronPython * Support for older Visual Studio versions (VC6) #952 * New waf.bat file #964 * New method ConfigSet.keys * New Visual Studio and Eclipse CTD project generators (waflib/extras) * New lru_cache tool for use with WAFCACHE (waflib/extras) NEW IN WAF 1.6.4 ---------------- * Fix the Python detection on win32 #883 * Optimize the Python file installation #892 * Force +x permissions on installed fortran programs #893 * Qt library detection fixes #895 * Ensure that unit tests are executed only after the symlinks are created * Fix the precedence constraints for classes ending in _task #896 * Support the install_path attribute with add_pcfile #913 * Make the goprograms executable when installed #928 * Allow non-python data files in the waf executable #927 * Enforce a build order based on the scanner results #777, #922 * Multiple msvc detection fixes #907 #910 #923 #924 #926 * Fix the -of flag append with dmd #917 * Boost detection fixes #920 * Support newer javac compilers #921 * Fix the execution on python 2.3 for: "waf update", msvc.py, fc.py * Improve the support for mac applications (demos/mac_app) * Better default regexps in "waf step" * New error check for tasks creating the same nodes or having the same identifiers (waf -v) * New variables conf.env.NO_LOCK_IN_TOP/OUT/RUN for special projects (top='..') * New example on avoiding rebuilds when moving a project (playground/relocate) * Improve go-lang support for cgo-packages (fixes #932) * Fix the progress bar on cmd and msys NEW IN WAF 1.6.3 ---------------- * Fixed the interaction of Fortran configuration tests and WAFCACHE #842 * Various documentation fixes * Set the PYTHONARCHDIR variable for installing python extensions * Fixed the Waf file creation with --zip-type=gz (bunzip2 was not replaced by gzip -d) * Fixed multiple problems in the call to TaskGen.declare_chain(...) #850 * Fixed the task attribute 'vars' which might cause unnecessary rebuilds #852 * Return the value of post_check(...) in conf.check(...) #857 * Rewrite the boost tool (waflib/extras/boost.py) #814, #454, #424 * More fortran file extensions: .for, .FOR #867 * Searching above the root nodes no longer raise exceptions #868 * Msvc detection fixes for non-utf8 encodings #873 * Fixed the destdir processing on Windows #874 * Stop changing the flags on waf -v (make the errors more visible) #875 * Fixed the resource file compilation on Windows #876 * Fixed the vala file installation #881 * New system of plugins for C/C++/Fortran compilers (files named c_* in waflib/extras/) * New examples of interaction between Waf and existing makefiles (playground/) * New names for @before/@after: @before_method/@after_method NEW IN WAF 1.6.2 ---------------- * Support for C# debugging files #797 * Add -relocation-model=pic for shared libraries on ldc * Fixed 'waf dist' for tar files on python 3 #799 * Make the latex scanner recursive #798 * Enable the packing of non-python files in the waf file #802 * Improve the feature sniffing for hybrid programs/libraries #800 * New apidocs + tutorial in Sphinx format * Add the CPPFLAGS from os.environ #803 * Create the java output directory anywhere #806 * Enable the .luac file installation * Process Qt translation files * Detect when the folders were copied and prompt for "waf configure" * Parse_flags for the *-config outputs on windows (backslashes) #811 * Fix the doxygen task build order + improve the dependency scanner #821 * Various msvc fixes #819, #826, #825 * Ported the batch executor to waf 1.6 (batched_cc) * New tools: erlang, scala * Moved conf.multicheck(..) from playground to the library * New parameter to avoid reading the same scripts: bld.recurse(dir, once=True) * Detect invalid method calls in 'waf -v' such as env.append/env.add/env.prepend * New manifest option for jar targets #832 NEW IN WAF 1.6.1 ---------------- * Fixed the method check_waf_version #764 * Fixed the name in ctx.recurse(name) #769 * Stop caching the install tasks and tasks that have no outputs #770 * Fix the log in Context.cmd_and_log() when calling with "quiet" #778 * c_preproc exception when a file has the same name as a directory #777 * 'intltool_po' does not install the .mo files #782 * 'intltool_in' was broken #792 * Bind stderr and stdout to the exception in Context.cmd_and_log #779 * Tasks not rebuilding properly when the 'run' method changes #786 * Print the progress bar information as late as possible #787 * Fix for the FRAMEWORK value processing * Verbose mode should not require the compat15 tools #790 * Let static libraries use other static libraries as in 1.5 #768 * Fix for the boost tool #776 * boost tool update (in playground) #780 * Updated the java tool and examples * New gcj tool in playground * Update the c# tool and examples (playground) #796 * Read external c# libraries #774 * Xelatex support #785 * Rebuild fortran files when .mod files change #766 * docs #781 * Improve the ant_glob behaviour on ctx.root + absolute paths * Fix for glib_mkenums and dbus-binding-tool #795 * New feature 'subst' (see demos/subst) NEW IN WAF 1.6.0 ---------------- General: * Python 3 syntax by default (runs unmodified for 2.6, 2.7, 3.0 and 3.1) * Environment -> ConfigSet * only lists are allowed in ConfigSet * Better Node apis * Utils.load_tool -> Context.load_tool * set_options becomes options * only the build-related commands require a configured project * new variant system + build context commands * removed the pseudo glob in installation methods * eliminate find_sources_in_dirs * node.__class__.bld → node.ctx * bld.new_task_gen(...) disappears, use bld(...) * network updates for waf tools * accept node objects in the source and includes attributes * remove task_gen.allnodes: modify self.source directly * merge the include system for c, c++, d, gas and nasm * allow top == out (no build directory) * merge the Tool/wscript system (detect->configure, set_options->options) * new command "waf list" to list the x for "waf build --targets=x" * rename apply_core -> process_source * rename apply_rule -> process_rule * rename Task.TaskBase.classes -> Task.classes * the modules Utils.py and Logs.py are now independent from the rest of waf (imports) * remove Task.TaskManager and Build.BuildContext.all_task_gen to improve the build group handling * remove program_USELIB, shlib_USELIB staticlib_USELIB support * use tasks for target installation * improve the exception handling (WscriptError was removed, use WafError) * let the commands access node objects * infer the build directory from the lock filename * waf step --file=main.c * post task generators in a lazy manner preview 3: * remove the /W3 flag from msvc default flags * opt.tool_options -> opt.load (now all commands inherit the 'tool' method) * conf.check_tool -> conf.load * do not copy files when creating tar files in 'waf dist' * add zip files in 'waf dist' * fix the behaviour of 'waf distcheck' * preprocessor optimizations * python 2 fixes release candidate: * cache fixes * fortran fixes * python 2 and 3 fixes * docs and docstrings * support for custom waf files and preludes * fix in waflib.Context for overriding command classes * port the doxygen tool * Utils.to_hashtable -> Utils.str2dict * change the thread pool to enable thread pool sharing * fixed a regression on win32 + ansiterm.py + python 3 -> thanks to kesselhaus :-) * various msvc fixes (thanks to Nicolas Mercier) kupfer-v208/auxdata/000077500000000000000000000000001176220042200144725ustar00rootroot00000000000000kupfer-v208/auxdata/kupfer-exec.desktop.in000066400000000000000000000002371176220042200207120ustar00rootroot00000000000000 [Desktop Entry] Version=1.0 Type=Application Exec=kupfer-exec %F _Name=Execute in Kupfer Icon=kupfer NoDisplay=true StartupNotify=true MimeType=text/x-kfcom; kupfer-v208/auxdata/kupfer-mimetypes.xml.in000066400000000000000000000006051176220042200211300ustar00rootroot00000000000000 <_comment>Saved Kupfer Command kupfer-v208/auxdata/kupfer.desktop.in000066400000000000000000000004361176220042200177710ustar00rootroot00000000000000[Desktop Entry] Version=1.0 _Name=Kupfer _GenericName=Application Launcher _Comment=Convenient command and access tool for applications and documents Icon=kupfer Exec=kupfer %F Type=Application Categories=Utility; StartupNotify=true X-UserData=$CONFIG/kupfer;$DATA/kupfer;$CACHE/kupfer kupfer-v208/auxdata/kupfer.svg000066400000000000000000000624241176220042200165170ustar00rootroot00000000000000 kupfer-v208/auxdata/wscript000066400000000000000000000052521176220042200161140ustar00rootroot00000000000000#! /usr/bin/env python import os from waflib import Options, Utils, Logs def options(opt): opt.add_option('--no-update-mime', action='store_true', default=False, help='Do not update mime and desktop databases [Default:Update]') opt.add_option('--no-update-icon-cache', action='store_true', default=False, help='Do not update icon cache [Default:Update]') def configure(conf): if not Options.options.no_update_mime: conf.env["AUXDATA_MIME"] = 1 if not Options.options.no_update_icon_cache: conf.env["UPDATE_ICON_CACHE"] = 1 def build(bld): # merge translations into the .desktop file # and set it up to be installed def install_desktop_file(desktop_subst_file): return bld( features="intltool_in", podir="../po", flags = ("-d", "-q", "-u", "-c"), source = desktop_subst_file + ".in", target = desktop_subst_file, install_path = "${DATADIR}/applications", chmod = 0o755, ) k_desktop = install_desktop_file("kupfer.desktop") x_desktop = install_desktop_file("kupfer-exec.desktop") ## install kupfer.desktop as a Thunar sendto object kd_install = os.path.join( Utils.subst_vars(k_desktop.install_path, bld.env), "kupfer.desktop") symlink_location = \ Utils.subst_vars("${DATADIR}/Thunar/sendto/kupfer.desktop", bld.env) symlink_target = \ os.path.relpath(kd_install, os.path.dirname(symlink_location)) bld.symlink_as(symlink_location, symlink_target) ## install mimetype descriptions mimetypes_file = "kupfer-mimetypes.xml" bld( features="intltool_in", podir="../po", flags = ("-x", "-q", "-u", "-c"), source = mimetypes_file + ".in", target = mimetypes_file, install_path = "${DATADIR}/mime/packages/", ) def update_mime(bld): Logs.pprint('GREEN',"Updating mime database") bld.exec_command(["update-mime-database", Utils.subst_vars("${DATADIR}/mime", bld.env)]) bld.exec_command(["update-desktop-database", Utils.subst_vars("${DATADIR}/applications", bld.env)]) if bld.is_install and bld.env["AUXDATA_MIME"]: bld.add_post_fun(update_mime) ## install kupfer.svg icon icons_inst = bld.install_files("${DATADIR}/icons/hicolor/scalable/apps", "kupfer.svg") def update_icon_cache(bld): icon_dir = Utils.subst_vars('${DATADIR}/icons/hicolor', bld.env) if not Options.options.destdir: Logs.pprint('GREEN',"Updating Gtk icon cache.") command='gtk-update-icon-cache -q -f -t %s' % icon_dir bld.exec_command(command) else: Logs.pprint('YELLOW','Icon cache not updated. After install, run this:') Logs.pprint('YELLOW','gtk-update-icon-cache -q -f -t %s'%icon_dir) if icons_inst and bld.is_install and bld.env["UPDATE_ICON_CACHE"]: bld.add_post_fun(update_icon_cache) kupfer-v208/bin/000077500000000000000000000000001176220042200136135ustar00rootroot00000000000000kupfer-v208/bin/kupfer-exec.in000077500000000000000000000016611176220042200163700ustar00rootroot00000000000000#!/bin/sh # This is a helper program to execute saved command files, # by sending them to a running instance of Kupfer. export TEXTDOMAIN='@PACKAGE@' export TEXTDOMAINDIR='@LOCALEDIR@' PYTHON='@PYTHON@' if test ! -f "$1" then echo "A file argument required" exit 1 fi SERVICE="se.kaizer.kupfer" OBJ="/interface" IFACE="se.kaizer.kupfer.Listener" while test $# != 0 do FILE=$(readlink -f "$1") dbus-send --print-reply --dest=$SERVICE $OBJ \ $IFACE.ExecuteFileOnDisplay string:"$FILE" \ string:"$DISPLAY" string:"$DESKTOP_STARTUP_ID" \ > /dev/null 2>&1 KUPFER_RUNNING=$? if test $KUPFER_RUNNING != 0 then # NOTE: If you change this string, you have to change # it inside kupfer/version.py as well. zenity --info --text "$(gettext 'Could not find running Kupfer')" & exit 1 fi shift done if test -n "$DESKTOP_STARTUP_ID" -a -n "${PYTHON##@*}" then ${PYTHON} -c "import gtk.gdk; gtk.gdk.notify_startup_complete()" fi kupfer-v208/bin/kupfer.in000077500000000000000000000052161176220042200154460ustar00rootroot00000000000000#!/bin/sh # kupfer A convenient command and access tool # # Copyright 2007--2010 Ulrik Sverdrup # # 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 . # This script invokes kupfer by calling an already running instance, or # starting a new if none is found running. _hasprefix () { test "x${1#$2}" != "x$1" } PYTHON="@PYTHON@" PYTHONDIR="@PYTHONDIR@" _hasprefix "$PYTHON" "@" && PYTHON=python _hasprefix "$PYTHONDIR" "@" && PYTHONDIR=$(dirname $(readlink -f -- $0))/.. SERVICE="se.kaizer.kupfer" OBJ="/interface" IFACE="se.kaizer.kupfer.Listener" # We allow reading directly from stdin if we pipe text into Kupfer if ! tty --quiet then echo "kupfer: Reading from stdin" >&2 TEXT_INPUT=$(cat) fi # If there are any options, like "--help", we run Kupfer directly _hasprefix "$1" "--" KUPFER_HAS_OPTIONS=$? test $KUPFER_HAS_OPTIONS != 0 && dbus-send --type=method_call --print-reply \ --dest=$SERVICE $OBJ $IFACE.PresentOnDisplay string:"$DISPLAY" \ "string:$DESKTOP_STARTUP_ID" >/dev/null 2>&1 KUPFER_RUNNING=$? if test \( -n "$TEXT_INPUT" -a $KUPFER_HAS_OPTIONS != 0 \) then dbus-send --type=method_call --dest=$SERVICE $OBJ \ $IFACE.PutTextOnDisplay string:"$TEXT_INPUT" \ string:"$DISPLAY" string:"$DESKTOP_STARTUP_ID" fi _realpaths () { # Emit realpaths for arguments, separated by NUL bytes while test $# != 0 do LINK=$(readlink -e -- "$1") if test $? != 0 ; then echo "Error: $1 does not exist" >&2 shift continue fi printf "%s\0" "$LINK" shift done } if test \( -n "$1" -a $KUPFER_HAS_OPTIONS != 0 \) then # NOTE: We must escape commas here since it is dbus-send's # array item separator. This is then unescaped by kupfer ARRAY=$(_realpaths "$@" | sed -e 's/,/%%kupfercomma%%/g' | tr \\0 ,) dbus-send --type=method_call --dest=$SERVICE $OBJ \ $IFACE.PutFilesOnDisplay array:string:"$ARRAY" \ string:"$DISPLAY" string:"$DESKTOP_STARTUP_ID" fi if test $KUPFER_RUNNING != 0 then exec ${PYTHON} "$PYTHONDIR/kupfer.py" $* fi if test -n "$DESKTOP_STARTUP_ID" then ${PYTHON} -c "import gtk.gdk; gtk.gdk.notify_startup_complete()" fi kupfer-v208/contrib/000077500000000000000000000000001176220042200145035ustar00rootroot00000000000000kupfer-v208/contrib/README000066400000000000000000000006011176220042200153600ustar00rootroot00000000000000contrib ======= A place to put contributed plugins that can serve as examples, even though they might not be enabled for release or installed by default The plugins here can't be guaranteed to be compatible with the current release, it might be that changes to the main code makes them incomptible. Custom plugins (like these) should be installed into ~/.local/share/kupfer/plugins kupfer-v208/contrib/evilplugin.py000066400000000000000000000013371176220042200172370ustar00rootroot00000000000000""" This is a plugin that should do everything wrong, for debugging Purposes """ __kupfer_name__ = u"Evil Plugin" __kupfer_sources__ = ( "EvilSource", "EvilInstantiationSource", ) __description__ = u"Evil for debugging purposes (necessary evil)" __version__ = "" __author__ = "Ulrik Sverdrup " from kupfer.objects import Leaf, Action, Source class EvilError (Exception): pass class EvilInstantiationSource (Source): def __init__(self): raise EvilError class EvilSource (Source): def __init__(self): Source.__init__(self, u"Evil Source") def initialize(self): raise EvilError def get_items(self): raise EvilError def get_icon_name(self): raise EvilError def provides(self): pass kupfer-v208/contrib/google_translate.py000066400000000000000000000167371176220042200204240ustar00rootroot00000000000000# -*- coding: UTF-8 -*- ''' Translate TextLeaf by Google Translate. ''' __kupfer_name__ = _("Google Translate") __kupfer_actions__ = ("Translate", "TranslateUrl", 'OpenTranslatePage') __description__ = _("Translate text with Google Translate") __version__ = "2011-09-14" __author__ = "Karol Będkowski " import httplib import locale import urllib import re import socket from kupfer.objects import Source, Action, TextLeaf, Leaf, UrlLeaf from kupfer import icons, utils, pretty from kupfer.plugin import ssl_support try: import cjson json_decoder = cjson.decode except ImportError: import json json_decoder = json.loads _GOOGLE_TRANSLATE_HOST = 'ajax.googleapis.com' _GOOGLE_TRANSLATE_PATH = '/ajax/services/language/translate?' _GOOGLE_TRANS_LANG_PATH = '/#' _GOOGLE_TRANS_LANG_HOST = 'translate.google.com' _HEADER = { 'Content-type':'application/x-www-form-urlencoded', 'Accept': 'text/xml,application/xml,application/xhtml+xml,text/html', 'Accept-charset': 'utf-8;q=0.7' } def _parse_encoding_header(response, default="UTF-8"): """Parse response's header for an encoding, that is return 'utf-8' for: text/html; charset=utf-8 """ ctype = response.getheader("content-type", "") parts = ctype.split("charset=", 1) if len(parts) > 1: return parts[-1] return default def _translate(text, lang): ''' Translate @text to @lang. ''' query_param = urllib.urlencode(dict(v="1.0",langpair="|"+lang, q=text.encode('utf-8'))) try: if ssl_support.is_supported(): conn = ssl_support.VerifiedHTTPSConnection(_GOOGLE_TRANSLATE_HOST, timeout=5) pretty.print_debug(__name__, "Connected to", _GOOGLE_TRANSLATE_HOST, "using SSL") else: conn = httplib.HTTPConnection(_GOOGLE_TRANSLATE_HOST, timeout=5) conn.request("POST", _GOOGLE_TRANSLATE_PATH, query_param, _HEADER) resp = conn.getresponse() if resp.status != 200: raise ValueError('invalid response %d, %s' % (resp.status, resp.reason)) response_data = resp.read() encoding = _parse_encoding_header(resp) response_data = response_data.decode(encoding, 'replace') pretty.print_debug(__name__, "Translate response:", repr(response_data)) try: resp = json_decoder(response_data) yield resp['responseData']['translatedText'], '' except: pretty.print_exc(__name__) yield text, '' except socket.timeout: yield _("Google Translate connection timed out"), "" except (httplib.HTTPException, ValueError), err: pretty.print_error(__name__, '_translate error', repr(text), lang, err) yield _("Error connecting to Google Translate"), "" finally: conn.close() _RE_GET_LANG_SELECT = re.compile( r'\(.*)\<\/select\>', re.UNICODE|re.MULTILINE|re.IGNORECASE) _RE_GET_LANG = re.compile(r"""\ # code 'zh-TW' ([^<]+?) # match localized lang name \ """, re.UNICODE|re.IGNORECASE|re.VERBOSE) def _load_languages(): ''' Load available languages from Google. Generator: (lang_code, lang name) ''' user_language = locale.getlocale(locale.LC_MESSAGES)[0] pretty.print_debug(__name__, '_load_languages') try: conn = httplib.HTTPConnection(_GOOGLE_TRANS_LANG_HOST) conn.connect() conn.sock.settimeout(10) # set timeout to 10 sec headers = { "Accept-Language": "%s, en;q=0.7" % user_language, } conn.request("GET", _GOOGLE_TRANS_LANG_PATH, headers=headers) resp = conn.getresponse() if resp.status != 200: raise ValueError('invalid response %d, %s' % (resp.status, resp.reason)) result = resp.read().decode(_parse_encoding_header(resp), "replace") result = _RE_GET_LANG_SELECT.findall(result) if result: for key, name in _RE_GET_LANG.findall(result[0]): yield key, name except socket.timeout: pretty.print_error(__name__, 'Timed out when loading languages') except (httplib.HTTPException, ValueError, socket.error), err: pretty.print_error(__name__, '_load_languages error', type(err), err) finally: conn.close() class Translate (Action): def __init__(self): Action.__init__(self, _("Translate To...")) def activate(self, leaf, iobj): text = unicode(leaf.object) dest_lang = iobj.object return _TranslateQuerySource(text, dest_lang, unicode(iobj)) def is_factory(self): return True def item_types(self): yield TextLeaf def valid_for_item(self, leaf): return len(leaf.object.strip()) > 0 def get_description(self): return _("Translate text with Google Translate") def get_icon_name(self): return "accessories-dictionary" def requires_object(self): return True def object_types(self): yield _Language def object_source(self, for_item=None): return _LangSource() class TranslationLeaf(TextLeaf): def __init__(self, translation, descr): TextLeaf.__init__(self, translation) self._descrtiption = descr def get_description(self): return self._descrtiption or TextLeaf.get_description(self) class _TranslateQuerySource(Source): def __init__(self, text, lang, language_name): Source.__init__(self, name=_("Translate into %s") % language_name) self._text = text self._lang = lang def repr_key(self): return (hash(self._text), self._lang) def get_items(self): for translation, desc in _translate(self._text, self._lang): yield TranslationLeaf(translation.replace('\\n ', '\n'), desc) class _Language(Leaf): serializable = 1 def get_gicon(self): return icons.ComposedIcon("text-x-generic","preferences-desktop-locale") # cache for Languages (load it once) _LANG_CACHE = None class _LangSource(Source): def __init__(self): Source.__init__(self, _("Languages")) def get_items(self): global _LANG_CACHE if not _LANG_CACHE: _LANG_CACHE = tuple(( _Language(key, name.title()) for key, name in _load_languages() )) return _LANG_CACHE def provides(self): yield _Language def get_icon_name(self): return "preferences-desktop-locale" class TranslateUrl(Action): def __init__(self): Action.__init__(self, _("Translate To...")) def activate(self, leaf, iobj): dest_lang = iobj.object params = urllib.urlencode(dict(u=leaf.object, sl='auto', tl=dest_lang )) url = 'http://translate.google.com/translate?' + params utils.show_url(url) def item_types(self): yield UrlLeaf def valid_for_item(self, leaf): return leaf.object.startswith('http://') or leaf.object.startswith('www.') def get_description(self): return _("Show translated page in browser") def get_icon_name(self): return "accessories-dictionary" def requires_object(self): return True def object_types(self): yield _Language def object_source(self, for_item=None): return _LangSource() class OpenTranslatePage (Action): def __init__(self): Action.__init__(self, _("Show Translation To...")) def activate(self, leaf, iobj): text = urllib.quote(unicode(leaf.object).encode('utf-8')) dest_lang = iobj.object url = 'http://' + _GOOGLE_TRANSLATE_HOST + _GOOGLE_TRANS_LANG_PATH + \ "#auto|" + dest_lang + "|" + text utils.show_url(url) def item_types(self): yield TextLeaf def valid_for_item(self, leaf): return len(leaf.object.strip()) > 0 def get_description(self): return _("Show translation in browser") def get_icon_name(self): return "accessories-dictionary" def requires_object(self): return True def object_types(self): yield _Language def object_source(self, for_item=None): return _LangSource() kupfer-v208/contrib/icon_names.py000066400000000000000000000061721176220042200171760ustar00rootroot00000000000000""" A quick hack to search the icons of the `Icon Naming Specification`__, shown as available on the current system. __ http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html """ __kupfer_name__ = _("Icon Names") __kupfer_sources__ = ( "StandardIconsSource", "IconThemeSource", ) __description__ = _("Browse the icons of the Icon Naming Specification") __version__ = "" __author__ = "Ulrik Sverdrup " import urllib from xml.etree import cElementTree as ET import gtk from kupfer.objects import Leaf, Action, Source, SourceLeaf from kupfer import uiutils ICON_SPEC_ADDRESS = "http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-0.8.90.xml" class ShowDescription(Action): def __init__(self): Action.__init__(self, _("Show Full Description")) def activate(self, leaf): uiutils.show_large_type(leaf.description) class IconName (Leaf): def __init__(self, obj, desc, category): Leaf.__init__(self, obj, obj) self.description = desc if desc: self.kupfer_add_alias(desc.splitlines()[0]) def get_actions(self): yield ShowDescription() def get_description(self): return self.description.splitlines()[0] if self.description else None def get_icon_name(self): return self.object class IconNamesSource (Source): def get_items(self): for name, desc, info in self._get_all_items(): yield IconName(name, desc, info) class StandardIconsSource (IconNamesSource): def __init__(self): return Source.__init__(self, _("Standard Icon Names")) def _get_all_items(self): parsed = ET.parse(urllib.urlopen(ICON_SPEC_ADDRESS)) root = parsed.getroot() icon_names = {} def first(lst): return iter(lst).next() def flatten(tag): """return text of @tag and its immediate children""" return tag.text + "".join(c.text+c.tail for c in tag.getchildren()) names = first(s for s in root.findall("sect1") if s.get("id") == "names") for table in names.findall("table"): category_name = table.get("id") rows = table.find("tgroup").find("tbody") for row in rows: icon_names.setdefault(category_name, []).append( tuple(flatten(e).strip() for e in row.findall("entry"))) for category in icon_names: for name, desc in icon_names[category]: yield name, desc, category def get_icon_name(self): return "emblem-photos" class IconThemeCategorySource (IconNamesSource): def __init__(self, category): IconNamesSource.__init__(self, category or "All Icons") self.category = category def repr_key(self): return self.category def _get_all_items(self): it = gtk.icon_theme_get_default() for icon_name in it.list_icons(self.category): desc = str(it.get_icon_sizes(icon_name)) yield icon_name, desc, self.category def should_sort_lexically(self): return True class IconThemeSource (Source): def __init__(self): Source.__init__(self, _("All Icon Theme Icons")) def get_items(self): it = gtk.icon_theme_get_default() yield SourceLeaf(IconThemeCategorySource(None)) for ctx in it.list_contexts(): yield SourceLeaf(IconThemeCategorySource(ctx)) def get_icon_name(self): it = gtk.icon_theme_get_default() return it.get_example_icon_name() kupfer-v208/contrib/runningapplications.py000066400000000000000000000015611176220042200211470ustar00rootroot00000000000000__kupfer_name__ = _("Running Applications") __kupfer_sources__ = ("RunningApplicationsSource",) __description__ = _("Currently active applications") __version__ = "" __author__ = "Ulrik Sverdrup " import gio from kupfer.objects import Source, AppLeaf from kupfer import launch class RunningApplicationsSource (Source): """List currently running applications """ def __init__(self): Source.__init__(self, _("Running Applications")) self.all_apps = [] def initialize(self): self.all_apps = gio.app_info_get_all() def is_dynamic(self): return True def get_items(self): is_running = launch.application_is_running return (AppLeaf(ai) for ai in self.all_apps if is_running(ai)) def provides(self): yield AppLeaf def get_description(self): return _("Running applications") def get_icon_name(self): return "gnome-applications" kupfer-v208/contrib/twitter/000077500000000000000000000000001176220042200162055ustar00rootroot00000000000000kupfer-v208/contrib/twitter/COPYING000066400000000000000000000000761176220042200172430ustar00rootroot00000000000000twitter.svg Author: Karol Będkowski Licence: Public Domain kupfer-v208/contrib/twitter/__init__.py000066400000000000000000000230271176220042200203220ustar00rootroot00000000000000# -*- coding: UTF-8 -*- from __future__ import absolute_import __kupfer_name__ = _("Twitter") __kupfer_sources__ = ("FriendsSource", "TimelineSource") __kupfer_actions__ = ("PostUpdate", "SendDirectMessage", 'SendAsDirectMessageToFriend' ) __description__ = _("Microblogging with Twitter: send updates and show friends' tweets") __version__ = "2010-04-06" __author__ = "Karol Będkowski " import urllib2 import time raise ImportError("This plugin is no longer supported due to Twitter API Changes") import twitter as twitter from kupfer import icons, pretty from kupfer import plugin_support from kupfer import kupferstring from kupfer.objects import Action, TextLeaf, Source, SourceLeaf, TextSource from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj.contacts import ContactLeaf, NAME_KEY from kupfer.obj.special import PleaseConfigureLeaf plugin_support.check_keyring_support() __kupfer_settings__ = plugin_support.PluginSettings( { 'key': 'userpass', 'label': '', 'type': plugin_support.UserNamePassword, 'value': '', }, { 'key': 'loadicons', 'label': _("Load friends' pictures"), 'type': bool, 'value': True }, { 'key': 'loadtweets', 'label': _("Load friends' public tweets"), 'type': bool, 'value': False, }, { 'key': 'loadtimeline', 'label': _('Load timeline'), 'type': bool, 'value': False, } ) MAX_STATUSES_COUNT = 10 MAX_TIMELINE_STATUSES_COUNT = MAX_STATUSES_COUNT * 2 TWITTER_USERNAME_KEY = 'twitter_username' # friends UPDATE_FR_INTERVAL_S = 20*60 # 15 min UPDATE_FR_STARTUP_S = 7 #sec # timeline UPDATE_TL_START_S = 13 # sec UPDATE_TL_INTERVAL_S = 15 * 60 # 20 min def get_twitter_api(): upass = __kupfer_settings__['userpass'] api = None if upass: api = twitter.Api(username=upass.username, password=upass.password) api.SetXTwitterHeaders('Kupfer', '', __version__) # optional return api def send_direct_message(user, message): api = get_twitter_api() if api and user: api.PostDirectMessage(user, trunc_message(message)) def trunc_message(message): if len(message) > 140: message = message[:139] + '…' return message def download_image(url): result = None try: f = urllib2.urlopen(url) result = f.read() except urllib2.HTTPError, err: pretty.print_error(__name__, 'download_image', url, err) return result def _load_tweets(api, user, count): pretty.print_debug(__name__, '_load_tweets', user, count) try: if user: timeline = api.GetUserTimeline(user, count) else: timeline = api.GetFriendsTimeline(count=count) for status in timeline: text = kupferstring.tounicode(status.text) name = kupferstring.tounicode(status.user.name) yield StatusLeaf(text, name, status.relative_created_at, status.id) except urllib2.HTTPError, err: pretty.print_error(__name__, '_load_tweets', user, count, err) def load_data(): pretty.print_debug(__name__, 'load_data: start') start_time = time.time() api = get_twitter_api() result = [] if api: for friend in api.GetFriends(): image = None if __kupfer_settings__['loadicons']: image = download_image(friend.profile_image_url) screen_name = kupferstring.tounicode(friend.screen_name) name = kupferstring.tounicode(friend.name) fobj = Friend(screen_name, name, image) if __kupfer_settings__['loadtweets']: fobj.tweets = list(_load_tweets(api, friend.screen_name, MAX_STATUSES_COUNT)) result.append(fobj) else: confl = PleaseConfigureLeaf(__name__, __kupfer_name__) result = [ confl ] pretty.print_debug(__name__, 'load_data: finished; load', len(result), time.time()-start_time) return result def load_data_timeline(): if not __kupfer_settings__['loadtimeline']: return None pretty.print_debug(__name__, 'load_data_timeline: start') start_time = time.time() api = get_twitter_api() result = None if api: result = list(_load_tweets(api, None, MAX_TIMELINE_STATUSES_COUNT)) else: result = [PleaseConfigureLeaf(__name__, __kupfer_name__)] pretty.print_debug(__name__, 'load_data_timeline: finished; load', len(result), time.time()-start_time) return result class Friend(ContactLeaf): grouping_slots = ContactLeaf.grouping_slots + (TWITTER_USERNAME_KEY, ) def __init__(self, username, name, image=None): slots = {TWITTER_USERNAME_KEY: username, NAME_KEY: name} ContactLeaf.__init__(self, slots, name) self.kupfer_add_alias(username) self.image = image self.tweets = None def repr_key(self): return self.object[TWITTER_USERNAME_KEY] def has_content(self): return bool(self.tweets) or ContactLeaf.has_content(self) def content_source(self, alternate=False): if ContactLeaf.has_content(self): return ContactLeaf.content_source(self, alternate=alternate) if self.tweets: return FriendStatusesSource(self) def get_description(self): return self[TWITTER_USERNAME_KEY] def get_gicon(self): return icons.ComposedIconSmall(self.get_icon_name(), "twitter") def get_thumbnail(self, width, height): if self.image: return icons.get_pixbuf_from_data(self.image, width, height) return ContactLeaf.get_thumbnail(self, width, height) class PostUpdate(Action): ''' send update status ''' def __init__(self): Action.__init__(self, _('Post Update to Twitter')) def activate(self, leaf): api = get_twitter_api() if api: api.PostUpdate(trunc_message(leaf.object)) def item_types(self): yield TextLeaf def valid_for_item(self, item): return bool(item.object) def get_gicon(self): return icons.ComposedIcon("mail-message-new", "twitter") class SendDirectMessage(Action): ''' send direct message to contact ''' def __init__(self): Action.__init__(self, _('Send Direct Message...')) def activate(self, leaf, iobj): user = TWITTER_USERNAME_KEY in leaf and leaf[TWITTER_USERNAME_KEY] if iobj.object: send_direct_message(user, iobj.object) def item_types(self): yield ContactLeaf def valid_for_item(self, item): return TWITTER_USERNAME_KEY in item and item[TWITTER_USERNAME_KEY] def requires_object(self): return True def object_types(self): yield TextLeaf def object_source(self, for_item=None): return StatusTextSource() def get_gicon(self): return icons.ComposedIcon("mail-message-new", "twitter") class SendAsDirectMessageToFriend(Action): ''' send text to friend ''' def __init__(self): Action.__init__(self, _('Send Direct Message To...')) def activate(self, leaf, iobj): user = TWITTER_USERNAME_KEY in iobj and iobj[TWITTER_USERNAME_KEY] send_direct_message(user, leaf.object) def item_types(self): yield TextLeaf def valid_for_item(self, item): return bool(item.object) def requires_object(self): return True def object_types(self): yield ContactLeaf def object_source(self, for_item=None): return FriendsSource() def get_gicon(self): return icons.ComposedIcon("mail-message-new", "twitter") class PostReply(Action): ''' send reply to the message ''' def __init__(self): Action.__init__(self, _('Reply...')) def activate(self, leaf, iobj): if iobj.object: api = get_twitter_api() message = trunc_message(iobj.object) api.PostUpdate(message, in_reply_to_status_id=leaf.status_id) def item_types(self): yield StatusLeaf def requires_object(self): return True def object_types(self): yield TextLeaf def object_source(self, for_item=None): return StatusTextSource() def get_gicon(self): return icons.ComposedIcon("mail-message-reply", "twitter") class StatusLeaf(TextLeaf): def __init__(self, text, user, created_at, status_id): TextLeaf.__init__(self, text) self._description = _("%(user)s %(when)s") % dict( user=user, when=created_at) self.status_id = status_id def get_description(self): return self._description def get_actions(self): yield PostReply() class InvisibleSourceLeaf (SourceLeaf): """Hack to hide this source""" def is_valid(self): return False class TimelineSource(Source): """ Source for main user timeline """ source_user_reloadable = True def __init__(self, name=_("Twitter Timeline")): Source.__init__(self, name) self.timeline = [] def get_items(self): return self.timeline def get_items_forced(self): self.timeline = load_data_timeline() or [] return self.timeline def get_icon_name(self): return 'twitter' def provides(self): yield StatusLeaf yield PleaseConfigureLeaf def get_leaf_repr(self): return None if self._is_valid() else InvisibleSourceLeaf(self) def _is_valid(self): return __kupfer_settings__['loadtimeline'] class FriendsSource(ToplevelGroupingSource): source_user_reloadable = True def __init__(self, name=_('Twitter Friends')): super(FriendsSource, self).__init__(name, "Contacts") self._version = 1 self.items = [] def get_items(self): return self.items def get_items_forced(self): self.items = load_data() or [] return self.items def get_icon_name(self): return 'twitter' def provides(self): yield ContactLeaf yield PleaseConfigureLeaf def should_sort_lexically(self): return True class FriendStatusesSource(Source): def __init__(self, friend): name = _("Timeline for %s") % friend Source.__init__(self, name) self.friend = friend def get_items(self): return self.friend.tweets def get_icon_name(self): return 'twitter' def provides(self): yield StatusLeaf def has_parent(self): return True class StatusTextSource (TextSource): def get_rank(self): return 100 def get_text_items(self, text): n = len(text) summary = trunc_message(text) desc_template = ngettext("%s (%d character)", "%s (%d characters)", n) yield TextLeaf(text, desc_template % (summary, n)) def get_items(self, text): return self.get_text_items(text) kupfer-v208/contrib/twitter/icon-list000066400000000000000000000000241176220042200200250ustar00rootroot00000000000000twitter twitter.svg kupfer-v208/contrib/twitter/twitter.svg000066400000000000000000000153621176220042200204370ustar00rootroot00000000000000 Twitter logo image/svg+xml Twitter logo Karol Będkowski kupfer-v208/data/000077500000000000000000000000001176220042200137545ustar00rootroot00000000000000kupfer-v208/data/credentials_dialog.ui000066400000000000000000000177711176220042200201440ustar00rootroot00000000000000 6 User credentials False True center dialog True vertical 12 True 6 vertical 12 True 0 gtk-dialog-authentication 6 0 True 2 2 6 6 True 0 _User: True entry_username True 0 _Password: True entry_password 1 2 True True 1 2 True True False 1 2 1 2 False 1 True gtk-dialog-info False 0 250 True 0 10 15 True 1 2 False 1 True end gtk-cancel True True True True False False 0 _Change True True True True True True False False 1 False end 0 button_cancel button_ok kupfer-v208/data/defaults.cfg000066400000000000000000000045531176220042200162530ustar00rootroot00000000000000# This is the kupfer default configuration file # This file is not intended to be modified; # users should modify their settings in # $XDG_CONFIG_HOME/kupfer/kupfer.cfg # (normally ~/.config/kupfer/kupfer.cfg) # The separator is semicolon (;). Continued lines # have to be indented [Kupfer] Keybinding = space MagicKeybinding = ShowStatusIcon = True UseCommandKeys = True [Keybindings] activate = a comma_trick = comma compose_action = Return erase_affinity_for_first_pane = mark_as_default = reset_all = r select_quit = q select_selected_file = g select_selected_text = t show_help = F1 show_preferences = semicolon switch_to_source = s toggle_text_mode_quick = period [Tools] terminal = kupfer.plugin.core.gnome-terminal icon_renderer = kupfer.plugin.core.gtk # Catalog: The sources of the plugin are included # as subcatalogs in the main search catalog, and # its items are not available in the main catalog # Directories to keep in catalog [Directories] Catalog = Direct = ~/; USER_DIRECTORY_DESKTOP; # Deep directories are recursive down to @depth [DeepDirectories] Depth = 2 Catalog = Direct = [plugin_core] kupfer_enabled = True kupfer_hidden = True [plugin_abiword] kupfer_enabled = False [plugin_applications] kupfer_enabled = True [plugin_archivemanager] kupfer_enabled = True [plugin_calculator] kupfer_enabled = True [plugin_clipboard] kupfer_enabled = True [plugin_commands] kupfer_enabled = True [plugin_dictionary] kupfer_enabled = True [plugin_documents] kupfer_enabled = True [plugin_epiphany] kupfer_enabled = True [plugin_favorites] kupfer_enabled = True [plugin_fileactions] kupfer_enabled = True [plugin_firefox] kupfer_enabled = True [plugin_multihead] kupfer_enabled = True [plugin_nautilusselection] kupfer_enabled = True [plugin_rhythmbox] kupfer_enabled = True [plugin_session_gnome] kupfer_enabled = True [plugin_session_xfce] kupfer_enabled = False [plugin_screen] kupfer_enabled = False [plugin_show_text] kupfer_enabled = True [plugin_tracker1] kupfer_enabled = False [plugin_triggers] kupfer_enabled = True [plugin_trash] kupfer_enabled = True [plugin_urlactions] kupfer_enabled = True [plugin_volumes] kupfer_enabled = True [plugin_websearch] kupfer_enabled = True [plugin_wikipedia] kupfer_enabled = True [plugin_windows] kupfer_enabled = False kupfer-v208/data/getkey_dialog.ui000066400000000000000000000145501176220042200171270ustar00rootroot00000000000000 6 Set Keyboard Shortcut False True center normal False True vertical 12 True 12 True gtk-preferences 6 0 True vertical 12 True 0 0 Set Keyboard Shortcut 0 True 0 0 Please press desired key combination True 1 True 12 True gtk-dialog-error 0 True 0 Keybinding could not be bound 1 2 True 0 3 1 1 True end gtk-cancel True False False True False False 0 False end 0 buttoncancel kupfer-v208/data/preferences.ui000066400000000000000000001166521176220042200166270ustar00rootroot00000000000000 10 Kupfer Preferences Preferences center kupfer True vertical True vertical 10 True True True True 5 vertical 15 True 0 none True 6 12 Start automatically on login True True False True True <b>Start</b> True False 0 True 0 none True 6 12 True vertical 6 Show icon in notification area True True False True True 0 True 10 True 0 3 Icon set: False 0 True False end 1 False False 1 True 10 True 0 3 Terminal emulator: False 0 True False end 1 False False 2 True Desktop Environment False 1 False 0 True General False True 6 vertical 6 True 0 0 <b>Global Keyboard Shortcuts</b> True False 0 True 12 True vertical 2 True 0 True end Reset True True True False False 0 1 False 1 True 0 0 <b>Browser Keyboard Shortcuts</b> True False 2 True 12 True vertical 2 True True automatic automatic 0 True end Reset True True True False False 0 False 1 3 Use single keystroke commands (Space, /, period, comma etc.) True True False True False 4 1 True Keyboard 1 False True 10 350 True vertical True True never automatic in 0 True True gtk-clear False False 1 False 0 320 True never never 1 2 True Plugins 2 False True 2 2 2 True 6 vertical True 0 0 Inclusion in Top Level Searches True 30 False 0 True 0 6 6 True 0 3 Marked sources have their objects included in top level searches. An unmarked source's contents are only available by locating its subcatalog. True 30 False 2 1 GTK_FILL True vertical True True never automatic in 0 1 2 True 6 vertical True 0 0 Indexed Folders True 30 False 0 True 0 6 6 True 0 3 Folders whose files are always available in the catalog. True 30 False 2 1 1 2 GTK_FILL True vertical 2 True True automatic automatic in 0 True True end gtk-remove True False True True True False False 0 gtk-add True True True True False False 1 False 1 1 2 1 2 3 True Catalog 2 False 0 True edge gtk-help True True True True False False 0 gtk-close True True True True False False 1 False 1 0 kupfer-v208/data/progress_dialog.ui000066400000000000000000000066101176220042200175010ustar00rootroot00000000000000 6 center 439 True vertical 12 True 6 vertical 12 True 0 0 True 0 0 True middle False 1 True 2 0 True 6 end gtk-cancel True True True True False False 0 False 1 kupfer-v208/data/result.ui000066400000000000000000000064021176220042200156330ustar00rootroot00000000000000 10 center 800 600 kupfer True vertical 10 True True automatic automatic True True False word 0 True gtk-copy True True True True False False 0 gtk-close True True True True False False 1 False 1 kupfer-v208/data/searchplugins/000077500000000000000000000000001176220042200166235ustar00rootroot00000000000000kupfer-v208/data/searchplugins/google.xml000066400000000000000000000006211176220042200206200ustar00rootroot00000000000000 Google UTF-8 kupfer-v208/data/wscript_build000066400000000000000000000004531176220042200165530ustar00rootroot00000000000000# configuration defaults and ui files bld.install_files("${DATADIR}/kupfer", "defaults.cfg") bld.install_files("${DATADIR}/kupfer", bld.path.ant_glob("*.ui")) # install all pure data files bld.install_files("${DATADIR}/kupfer/searchplugins", bld.path.ant_glob("searchplugins/*")) kupfer-v208/extras/000077500000000000000000000000001176220042200143515ustar00rootroot00000000000000kupfer-v208/extras/kupfer_provider.py000066400000000000000000000052061176220042200201340ustar00rootroot00000000000000# Copyright (C) 2009 Ulrik Sverdrup # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; either version 2, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., 51 Franklin # St, Fifth Floor, Boston, MA 02110-1301 USA """ This is a Nautilus Extension for Kupfer It is a Menu Provider, but needs not show a menu. This Extension will be updated with all file selections in Nautilus, and broadcast them over a D-Bus signal. """ import locale import dbus import dbus.glib from dbus.gobject_service import ExportedGObject import gio import gobject import nautilus service_name="se.kaizer.FileSelection" interface_name="se.kaizer.FileSelection" object_path = "/se/kaizer/FileSelection" class Object (ExportedGObject): @dbus.service.signal(interface_name, signature="asi") def SelectionChanged(self, uris, window_id): """Nautilus selection changed. @uris: an array of URI strings. @window_id: An ID for the window where the selection happened """ return uris class KupferSelectionProvider(nautilus.MenuProvider): def __init__(self): selfname = type(self).__name__ print "Initializing", selfname self.cursel = None self.max_threshold = 500 try: session_bus = dbus.Bus() except dbus.DBusException, exc: print exc self.service = None else: if session_bus.name_has_owner(service_name): self.service = None print selfname, "already running" else: bus_name = dbus.service.BusName(service_name, bus=session_bus) self.service = Object(bus_name, object_path=object_path) def get_file_items(self, window, files): """We show nothing, but we get info on files that are selected Ask GIO for the file path of each URI item, and pass on any that have a defined path. We use a threshold on the files so that we don't generate too much traffic; with more than 500 files selected, we simply send nothing. """ if len(files) > self.max_threshold: return [] window_id = window.window.xid if window.window else 0 uris = [f.get_uri() for f in files] if self.cursel != (uris, window_id) and self.service: self.service.SelectionChanged(uris, window_id) self.cursel = (uris, window_id) return [] kupfer-v208/extras/wscript000066400000000000000000000013511176220042200157670ustar00rootroot00000000000000import Options, Utils import os def options(opt): opt.add_option('--no-install-nautilus-extension', action='store_true', default=False, help='Install Kupfer Nautilus Extension [Default:Install]') def configure(conf): if Options.options.no_install_nautilus_extension: return libdir = Utils.subst_vars("${LIBDIR}", conf.env) if libdir.startswith(os.path.expanduser("~/")): NAUTILUS_EXT_LIBDIR=os.path.expanduser("~/.nautilus/python-extensions/") else: NAUTILUS_EXT_LIBDIR=os.path.join(libdir, "nautilus", "extensions-2.0", "python") conf.env["NAUTILUS_EXT_LIBDIR"] = NAUTILUS_EXT_LIBDIR def build(bld): if not bld.env["NAUTILUS_EXT_LIBDIR"]: return bld.install_files("${NAUTILUS_EXT_LIBDIR}", "kupfer_provider.py") kupfer-v208/help/000077500000000000000000000000001176220042200137735ustar00rootroot00000000000000kupfer-v208/help/C/000077500000000000000000000000001176220042200141555ustar00rootroot00000000000000kupfer-v208/help/C/Makefile000066400000000000000000000014231176220042200156150ustar00rootroot00000000000000pages=$(wildcard *.page plugin/*.page) htmls=$(patsubst %.page,%.html,$(pages)) all: $(htmls) index.cache index.cache : $(pages) echo '$@.in echo ' xmlns="http://projectmallard.org/1.0/">' >> $@.in for page in $(pages); do \ echo "" >> $@.in; \ done echo '' >> $@.in xsltproc `pkg-config --variable xsltdir gnome-doc-utils`/mallard/cache/mal-cache.xsl $@.in | xmllint --format - > $@ rm $@.in $(htmls) : index.cache $(htmls) : %.html : %.page xsltproc \ --stringparam mal.cache.file `pwd`/index.cache \ --param mal.chunk.chunk_top 1 \ `pkg-config --variable mal2html gnome-doc-utils` $< .PHONY: clean clean: rm -fv index.cache *.html kupfer-v208/help/C/generalusage.page000066400000000000000000000065111176220042200174600ustar00rootroot00000000000000 How to start using Kupfer. Basic Usage
Keyboard Interface

Kupfer is to the largest part a keyboard-managed interface to applications and documents.

Kupfer's default mode is the command mode: If you type a query, kupfer will search for a match in its catalog.

The arrow keys allow you to browse query matches quite naturally, going to the previous or next match, and going up and down in the subcatalogs.

In command mode, some keystrokes have special meanings:

or Space

Go to the next match

or ShiftSpace

Go to the previous match

or /

Descend into an object with content

Backspace

Erase a character from the query. If the query is empty, go up a level

.

Activate free-text mode

,

Put selected object on the stack ("Comma Trick")

Additionally:

Return activates the current selection: the command is executed.

Escape clears the current selection.

Tab switches between the object and the action pane.

By default you show Kupfer using the global keyboard shortcut CtrlSpace.

See for more information.

Learning Habits

Kupfer remembers which objects and actions are used the most. When beginning to use it, you have to use the arrow keys at times to make it precise which object you want to find. After a few uses of that object, Kupfer will rank it higher. Objects marked as favorites are also ranked higher.

The Catalog

The Catalog is the collection of objects you can access in Kupfer, such as documents and programs.

Objects in the catalog that have content, like folders, are marked with an arrow. Pressing will enter these objects. Much of the catalog is composed of subcatalogs; plugin subcatalogs do in general list objects that are also available directly from the top level. Subcatalogs can be used for a narrower view or search scope, when using Kupfer.

Most subcatalogs update their content automatically. For example, the Desktop folder source is always up-to-date.

kupfer-v208/help/C/index.page000066400000000000000000000013431176220042200161230ustar00rootroot00000000000000 Ulrik Sverdrup ulrik.sverdrup@gmail.com 2009 Kupfer Development Team Creative Commons Share Alike 3.0 Kupfer Manual
Using Kupfer
About Specific Plugins
kupfer-v208/help/C/introduction.page000066400000000000000000000015561176220042200175430ustar00rootroot00000000000000 Introduction to Kupfer. Introduction

Kupfer is an interface for quick and convenient access to applications and their documents.

The most typical use is to find a specific application and launch it. We have tried to make Kupfer easy to extend with plugins so that this quick-access paradigm can be extended to many more objects than just applications.

We hope that using Kupfer feels both very fun and different.

For up-to-date information about Kupfer, visit its homepage.

kupfer-v208/help/C/keyboard.page000066400000000000000000000145131176220042200166170ustar00rootroot00000000000000 Complete keyboard shortcuts reference. Command Keys and Accelerator Keys
Keyboard Interface

In command mode, the following keystrokes have special meanings:

or Space

Go to the next match

or ShiftSpace

Go to the previous match

or /

Descend into an object with content

Backspace

Erase a character from the query. If the query is empty, go up a level

.

Activate free-text mode

,

Put selected object on the stack ("Comma Trick")

Quick access keys:

=

Activate free-text mode with = prefix (for )

/

Activate free-text mode (when nothing is selected) with / prefix (to input a rooted path)

Additionally:

Return activates the current selection: the command is executed.

Escape clears the current selection.

Tab switches between the object and the action pane.

The meaning of the keys Space, ., ,, / and = can not be changed, but you can deactivate their special meaning with the checkbox Use single keystroke commands in Kupfer Preferences.

Kupfer's Keyboard Shortcuts

These keyboard shortcuts are used in Kupfer's interface. They have the following meanings and default shortcuts:

Ctrl.

Toggle text mode

Ctrl,

The comma trick

Ctrl;

Show preferences window

CtrlR

Reset all

AltA

Alternate activate

CtrlReturn

Compose command

CtrlS

Switch to first pane

CtrlQ

Select 'Quit'

CtrlG

Select 'Selected File'

CtrlT

Select 'Selected Text'

F1

Show Help

How to configure a keyboard shortcut

Open Kupfer Preferences and go to the Keyboard tab.

Double-click the shorcut's row under Browser Keyboard Shortcuts.

Using the window that appears, press modifier keys and a letter or number key to set a shortcut. An example is pressing and holding Ctrl and then pressing and releasing T to bind CtrlT.

Global Keyboard Shortcuts

Kupfer always listens to global shortcuts, even if it is not currently in the foreground.

They have the following meanings and default shortcuts:

CtrlSpace

Show/hide Kupfer

(not configured by default)

Show Kupfer with 'Selection' object focused

How to configure a global keyboard shortcut

Open Kupfer Preferences and go to the Keyboard tab.

Double-click the shorcut's row under Global Keyboard Shortcuts.

Using the window that appears, press modifier keys and a letter or number key to set a global shortcut. An example is pressing and holding Super and then pressing and releasing Space to bind SuperSpace.

Since these keyboard shortcuts are global, they can be used from any application. Select shortcuts with care so that they do not conflict with other functions.

Triggers

The plugin Triggers allows to activate actions with global keyboard shortcuts. Trigger shortcuts do not appear in Kupfer Preferences.

See for more information.

kupfer-v208/help/C/license.page000066400000000000000000000025701176220042200164410ustar00rootroot00000000000000 You can copy, modify and share Kupfer. License

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 gnu.org/licenses.

This documentation is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License.

As a special exception, the copyright holders give you permission to copy, modify, and distribute the example code contained in this document under the terms of your choosing, without restriction.

kupfer-v208/help/C/managing-plugins.page000066400000000000000000000105761176220042200202640ustar00rootroot00000000000000 Using plugins with Kupfer. How to Configure Plugins

Functionality in Kupfer is organized by extentsion modules called "plugins". Each plugin provides additional functionality, for example integration with an external application.

Configuring Plugins Open <app>Kupfer Preferences</app> to the Plugins tab

Use one of the following methods:

Click the Kupfer icon in the notification area and select the item Preferences

.

Search for the object Kupfer Preferences in Kupfer itself. Press Return to open it.

Use the keyboard shortcut Ctrl;

Select the tab Plugins

Select plugins in the list to read about them, and tick the box next to its name to activate the plugin, or untick to deactivate.

If the plugin has any configurable parameters, they will be visible below the plugin information.

The plugin Kupfer Plugins allows fast access to each plugin's information page as well as the action "Show Source Code" which reveals the implementation.

If a Plugin can not be Activated

If a plugin fails to activate because it requires a software module that is not available, its plugin information will display a message like this:

Plugin could not be read due to an error:

Python module 'gdata' is needed

This means that you need to install a needed python module from your distribution—and possibly the plugin documentation can tell you how.

The plugin may also unexpectedly fail to load, and display a different error message. It may then be a program error in either the plugin or Kupfer.

Installing more Plugins

You can install custom plugins into the folder ~/.local/share/kupfer/plugins. Each plugin is either a single .py file or a python package (a folder directly containing a file called __init__.py). Plugins in the package format can include icon files. Python packages can even be installed as .zip files.

Caution: Treat a plugin as a computer program. Do not install untrusted plugins.

Creating Plugins

Documentation for plugin creators is available in the file Documentation/Manual.rst in the source distribution on the webpage at Kupfer Manual. An easy way to start is to copy an existing plugin and experimenting with it.

The <em>Catalog</em> Tab in Preferences

Each plugin can export a number of sources which contain objects. Normally, all these objects are directly accessible from a top-level search. Some plugins export so specialized or so many objects that their catalogs should better not have their objects exported to the top level. To reach those objects, you have to first find the catalog by name, then enter the catalog using the action Search Contents.

In the tab Catalog in Kupfer Preferences, a ticked box next to each source means that its objects are exported. An unticked box means that its contents are hidden from the top level.

Note: Kupfer may become slow if large enough subcatalogs are exported to the top level.

kupfer-v208/help/C/moreusage.page000066400000000000000000000141241176220042200170040ustar00rootroot00000000000000 More advanced usage information. Using <app>Kupfer</app> in Depth
Adding Applications and Scripts

Kupfer will show all applications that are configured visible in your menu editor.

If you want to add an application manually, you can create a new .desktop file and place it in one of the standard directories for applications, for example ~/.local/share/applications, where Kupfer will find it.

If you have a collection of scripts that you want to call from Kupfer, you can add the scripts folder as a catalog directory to Kupfer in the preferences. Scripts that you add to Kupfer's catalog this way can be run directly or in the terminal as long as they are executable.

You can also save command-lines by using the action Add to Favorites.

Opening Files and Folders

Using the action Open, files and folders are opened in their preferred application. The application associations can be changed, see .

The <em>Comma Trick</em>

The comma trick allows the user to use actions on many objects at the same time.

Simply press comma , when an object is selected. The object is put on a "stack", and you can find yet another file or object, press comma to put it on the stack. When you subsequently invoke an action, the action is carried out on all of the objects at the same time.

Some actions are only "multiplied" when used with many objects, other are smarter than that:

Selecting many files and using the Create Archive action, all files will be packed into the same archive.

If you select multiple contacts and use a Send Email action, it creates one email directed at all the contacts.

If you select multiple subcatalogs (For example Firefox Bookmarks and Epiphany Bookmarks) and use Search Contents.., you get a subcatalog search restricted to the objects of those two catalogs! You can even bind a trigger to this command(!)

The comma trick is directly taken from Quicksilver (the example given in the external article should work identically in Kupfer).

Grab Current Selection

To use the current selected text, from any application, with Kupfer, you can configure a global keyboard shortcut for the action Show with Selection in Kupfer Preferences.

If configured, pressing the global keyboard shortcut will summon Kupfer with the current selection as the focused object.

See

Command-line Connection

The command kupfer on the command-line will focus Kupfer if it's already running, otherwise it will start it.

The command kupfer can be used to send files or text from the command-line to Kupfer. For example, if you are using the shell in a directory where you have a file called "report.pdf", you can focus this file in Kupfer by running kupfer report.pdf.

You can also send text if you pipe the output of a command into kupfer.

Managing Context and Current Selection

If you find the object you want to use, then invoke an action, Kupfer goes away to perform the action (for example start a program or play a song). When you come back to Kupfer, it will still keep the same object and action selected. Some actions make sense to be repeated (like skipping to the next song) and it can be useful to perform different actions on the same object.

However, you always have the top level catalog reachable when you "come back" to Kupfer -- say you went into the subcatalog "Albums" to browse your albums only; you select an album to play, and play it. You come back with the album selected -- but your next search will still go over the top level catalog, not just albums.

How to come back into the subcatalog you were in? You do that by simply browsing, not searching the first thing you do when you focus Kupfer again. A quick way is to press down-arrow or space to open the browse window; think of it as saying "I want to stay in this subfolder". With the browse window open, your next query will search the current subcatalog.

This way you can work both ways -- you can quickly drill down into folders to find a file, and when you come back for the next action with Kupfer you can either summon any normal toplevel object (just start typing), or stay around where you were, deep in that folder (press space, then type a query).

Saving Commands as Files

You can use keyboard shortcut for Compose Command (by default it is CtrlReturn) to create a command object out of the currently focused command in Kupfer. This object can be saved as a runnable file if you use the Save As... action. The resulting file will can be executed when opened from the file manager (it requires that Kupfer is already running).

kupfer-v208/help/C/plugin-applications.page000066400000000000000000000051651176220042200210040ustar00rootroot00000000000000 Using the applications plugin. <app>Applications</app>
Applications Plugin

Applications provides all installed programs.

Basic Usage Launching an application

Activate Kupfer and type an abbreviation of the application name

Press Return to launch the application.

Opening a file with a specific application

Select a file in Kupfer

Type Tab and select the action Open With...

Type Tab to select the third (indirect object) pane and in it, select the application to open the file with.

The action Open opens files and folders with the registered default application for that specific file type. This can be configured using the action Set Default Application....

The file type associations are provided by the desktop environment, and modifying them here will modify them on the desktop as well. This may not be true when not using GNOME or XFCE.

Selecting default application for a file type or folders

Select a file or folder in Kupfer

Type Tab and select the action Set Default Application...

Type Tab to select the third (indirect object) pane and in it, select the application to always open the file type with.

Configuration

The configuration option Applications for Desktop Environment in the plugin's information pane in Kupfer Preferences determines how Kupfer should act with regard to the desktop environment configuration—certain applications request not to be shown depending on which desktop environment is used. By default, it behaves like GNOME.

kupfer-v208/help/C/plugin-calculator.page000066400000000000000000000035411176220042200204430ustar00rootroot00000000000000 Using the calculator plugin. <app>Calculator</app>
Calculator Plugin

The calculator plugin lets you calculate expressions quickly. It can evaluate expressions entered as text starting with "=". Entering = from command mode will start text mode directly with = prefixed for quick access.

Basic Usage

Activate Kupfer and type =

Type in a mathematical expression using +,-,/,* (and ** for exponentiation)

Press Return to get the result.

Notes

The Calculator uses python's math and complex math modules, and parses expressions as Python expressions. You may use common mathematical functions, such as sqrt, sin, exp and log; the command =help will show a list of all defined functions and constants.

Notice that the power operator in Python is double stars, for example =3**3 will evaluate to 27.

To calculate trig functions for angles, convert to radians first:

sin(radians(30)) -> 0.5

The last result is stored as the name _ (an underscore, just like in the Python console).

kupfer-v208/help/C/plugin-favorites.page000066400000000000000000000034701176220042200203150ustar00rootroot00000000000000 Using the favorites plugin. <app>Favorites</app>
Favorites Plugin

With Favorites you mark objects, for example files, for quicker access. It is a sort of shelf on which you can store objects in Kupfer. Objects marked as favorites will also be ranked higher and are adorned with a star symbol.

Basic Usage

Find an object in Kupfer

Type Tab and select either the action Add to Favorites or Remove from Favorites.

Power User Tips

If you favorite an object, you can access it in more places. Not only in the "Favorites" subcatalog, but also as the indirect (secondary) object for some actions. For example:

Command-lines from favorites are quick to access.

When scaling images with the Scale... action from the Image Tools plugin. This action needs a size description as the third object, like "1024" or "1200x800". If you often scale to the same size, say "1200x800", add this to favorites, and it will always appear as a suggestion for the action.

Actions needing an email address as the indirect object will pick up email addresses from favorites as well as well.

kupfer-v208/help/C/plugin-gwibber.page000066400000000000000000000040171176220042200177320ustar00rootroot00000000000000 Using the Gwibber plugin. <app>Gwibber</app>
Gwibber Plugin

With the Gwibber plugin you can send messages to social networks such as Twitter or Identi.ca.

The plugin requires that the application Gwibber is installed and configured for your user. Kupfer will start and use Gwibber's service in the background.

Basic Usage Sending a message to all services

Activate Kupfer and type . to enter text mode, then type in a message.

Type Tab and select the action Send Message and press Return.

Sending a message to a specific service

Activate Kupfer and search for the service object, for example Identi.ca

Type Tab and select the action Send Message.

Type Tab to select the last pane, and type in a message. Press Return to send.

The plugin also provides a source for incoming messages, Gwibber Messages and more actions on messages such as Reply, Send Private Message etc.

Power User Tips

You can use the comma trick if you want to send a message to more than one service, but not all, at the same time.

kupfer-v208/help/C/plugin-nautilusselection.page000066400000000000000000000021601176220042200220600ustar00rootroot00000000000000 Using the selected file plugin. <app>Selected File</app>
Basic Usage

Select a file in the file manager. Open Kupfer and search for the object Selected File, which represents the file or files that are selected.

Instead of searching, you can press CtrlG to directly focus the selected file. See for more information.

<app>Selected File</app> requires <app>Nautilus</app>

The selected file plugin works with the Nautilus file browser and requires that the extension kupfer_provider.py is installed (it is normally installed together with Kupfer). After installing it for the first time, Nautilus must start anew before it is active.

kupfer-v208/help/C/plugin-notes.page000066400000000000000000000034241176220042200174420ustar00rootroot00000000000000 Using the notes plugin. <app>Notes</app>
Notes Plugin

With Notes you can access or create new notes in either the program Gnote or Tomboy. Notes will work identically with either application—you can configure which one to use in the plugin's information pane in Kupfer Preferences.

Basic Usage Creating a new note

Activate Kupfer and type . to enter text mode, then type in a note title

Type Tab and select the action Create Note and press Return.

Finding a note by title

Simply search for the note title in Kupfer

Finding a note by content

Activate Kupfer and type . to enter text mode, then type in a search query

Type Tab and select the action Get Note Search Results... and press Return.

Power User Tips

You can use the Selected Text object and create a new note with the content of the selection.

kupfer-v208/help/C/plugin-triggers.page000066400000000000000000000067261176220042200201500ustar00rootroot00000000000000 Using the triggers plugin. <app>Triggers</app>
Triggers Plugin

With Triggers you can take a command you would normally perform in Kupfer, such as launching an application or opening a document, and bind a global key combination to run this command. As long as Kupfer is running, any application can have the current focus.

Basic Usage Creating a new trigger

Set up a command in Kupfer that you want to run

Press CtrlReturn to create a composed command.

Type Tab and select the action Add Trigger... and press Return

Using the window that appears, press modifier keys and a letter or number key to set a global shortcut. An example is pressing and holding CtrlAlt and then pressing and releasing R to bind CtrlAltR.

Removing a trigger

Find the source Triggers in Kupfer and press to see its contents.

Find the active trigger in the list and use the action Remove Trigger.

Since trigger keyboard shortcuts are global, they can be used from any application. Select shortcuts with care so that they do not conflict with other functions.

Power User Tips

Proxy objects such as Selected Text, Selected File, Frontmost Window, Last Command et cetera allow very powerful triggers.

The application action Launch is special; if you bind a trigger using Launch, it will start the application if it is not running, but focus the application when it is already running. By contrast, Start Again will start the application if it is running or not.

Example Triggers <em>Text Editor → Launch</em>

Start Text Editor or focus its window if it is already running.

<em>Selected Text → Search With → Google</em>

Search the web using the currently selected text.

<em>Selected File → Move To → (Downloads Folder)</em>

Move the currently selected file to a specific folder

<em>Songs → Search Contents</em>

You may even add a trigger to open a specific subcatalog in Kupfer, for example Rhythmbox's songs.

kupfer-v208/help/C/plugin-websearch.page000066400000000000000000000025021176220042200202510ustar00rootroot00000000000000 Using the search the web plugin. <app>Search the Web</app>
Basic Usage

Activate Kupfer and make sure it is in free-text mode (press period)

Type in a search query and tap Tab to switch to the action pane.

Type "Search With" to find Search the Web's action and tap Tab again to switch to the third pane (indirect object).

Select search engine with the arrow keys and type Return to open the search in a web browser.

Search Engines

The Search the Web plugin uses Firefox' search engines, so you can add Search Engines directly in Firefox and Kupfer will find them later.

You can also install custom search plugins directly, only for Kupfer, in the folder:

~/.local/share/kupfer/searchplugins/

The search engine descriptions must written in OpenSearch format.

kupfer-v208/help/Makefile000066400000000000000000000005021176220042200154300ustar00rootroot00000000000000# This makefile is for convenience. # # Run 'make' to build HTML documentation in the C directory # Run 'make $LANG' to update the translation file for language $LANG # # To add a new language, edit Makefile.am include Makefile.am all: make -C C $(DOC_LINGUAS): C/*.page xml2po -mmallard -u "$@/$@.po" C/*.page kupfer-v208/help/Makefile.am000066400000000000000000000013771176220042200160370ustar00rootroot00000000000000# # This file defines variables and files for Kupfer's # mallard documentation. # # This file is needed for GNOME's translation infrastructure, # but it is never used as a real Makefile. # # Define all languages for translation in the variable DOC_LINGUAS # # include $(top_srcdir)/gnome-doc-utils.make DOC_ID = kupfer DOC_INCLUDES = DOC_FIGURES = DOC_PAGES = \ generalusage.page \ index.page \ introduction.page \ keyboard.page \ license.page \ managing-plugins.page \ moreusage.page \ plugin-applications.page \ plugin-calculator.page \ plugin-favorites.page \ plugin-gwibber.page \ plugin-nautilusselection.page \ plugin-notes.page \ plugin-triggers.page \ plugin-websearch.page DOC_LINGUAS = cs de es fr it pl sl # dist-hook: doc-dist-hook kupfer-v208/help/cs/000077500000000000000000000000001176220042200144005ustar00rootroot00000000000000kupfer-v208/help/cs/cs.po000066400000000000000000002431601176220042200153530ustar00rootroot00000000000000# Czech translation for kupfer help. # Copyright (C) 2010 kupfer's COPYRIGHT HOLDER # This file is distributed under the same license as the kupfer help. # # Marek Černocký , 2010, 2011. # msgid "" msgstr "" "Project-Id-Version: kupfer master\n" "POT-Creation-Date: 2011-03-29 19:29+0000\n" "PO-Revision-Date: 2011-04-24 10:58+0200\n" "Last-Translator: Marek Černocký \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: C/plugin-websearch.page:7(desc) msgid "Using the search the web plugin." msgstr "Používání zásuvného modulu Prohledat web." #: C/plugin-websearch.page:10(app) #| msgid "Search the Web Search Engines" msgid "Search the Web" msgstr "Prohledat web" #: C/plugin-websearch.page:13(title) C/plugin-triggers.page:23(title) #: C/plugin-notes.page:22(title) C/plugin-nautilusselection.page:13(title) #: C/plugin-gwibber.page:25(title) C/plugin-favorites.page:22(title) #: C/plugin-calculator.page:21(title) C/plugin-applications.page:19(title) #: C/generalusage.page:10(title) msgid "Basic Usage" msgstr "Základy používání" #: C/plugin-websearch.page:15(p) msgid "Activate Kupfer and make sure it is in free-text mode (press period)" msgstr "" "Aktivujte Kupfer a ujistěte se, zda je v režimu volného textu (zmáčkněte " "tečku)" #: C/plugin-websearch.page:17(p) msgid "" "Type in a search query and tap Tab to switch to the action pane." msgstr "" "Napište hledaný dotaz a ťukněte na Tab, čímž se přepnete na panel " "akce." #: C/plugin-websearch.page:19(p) msgid "" "Type \"Search With\" to find Search the Web's action and tap Tab " "again to switch to the third pane (indirect object)." msgstr "" "Napište „Prohledat pomocí“, abyste našli akci z Prohledat web a ťuknutím na " "Tab se přepnete na třetí panel (nepřímý objekt)." #: C/plugin-websearch.page:22(p) msgid "" "Select search engine with the arrow keys and type Return to open " "the search in a web browser." msgstr "" "Šipkou vyberte vyhledávací stroj a zmáčknutím Enter otevřete " "hledání ve webovém prohlížeči." #: C/plugin-websearch.page:29(title) #| msgid "Search the Web Search Engines" msgid "Search Engines" msgstr "Vyhledávací stroje" #: C/plugin-websearch.page:30(p) msgid "" "The Search the Web plugin uses Firefox' search engines, so you " "can add Search Engines directly in Firefox and Kupfer " "will find them later." msgstr "" "Zásuvný modul Prohledat web používá vyhledávací stroj aplikace Firefox, takže můžete přidávat vyhledávače přímo do aplikace Firefox " "a aplikace Kupfer si je následně najde také." #: C/plugin-websearch.page:35(p) msgid "" "You can also install custom search plugins directly, only for Kupfer, in the folder:" msgstr "" "Můžete si také nainstalovat přímo, pouze pro aplikaci Kupfer, " "vlastní vyhledávací zásuvné moduly a to do složky:" #: C/plugin-websearch.page:39(code) #, no-wrap msgid "~/.local/share/kupfer/searchplugins/" msgstr "~/.local/share/kupfer/searchplugins/" #: C/plugin-websearch.page:40(p) msgid "The search engine descriptions must written in OpenSearch format." msgstr "Popisy vyhledávacích strojů musí být napsané ve formátu OpeanSearch." #: C/plugin-triggers.page:7(desc) msgid "Using the triggers plugin." msgstr "Používání zásuvného modulu Spouštěče." #: C/plugin-triggers.page:10(app) C/keyboard.page:213(title) msgid "Triggers" msgstr "Spouštěče" #: C/plugin-triggers.page:13(title) msgid "Triggers Plugin" msgstr "Zásuvný modul Spouštěče" #: C/plugin-triggers.page:14(p) msgid "" "With Triggers you can take a command you would normally perform " "in Kupfer, such as launching an application or opening a " "document, and bind a global key combination to run this command. As long as " "Kupfer is running, any application can have the current focus." msgstr "" "Pomocí zásuvného modulu Spouštěče můžete vzít příkaz, který " "normálně v aplikaci Kupfer provádíte, jak například spuštění " "aplikace nebo otevření dokumentu, a přiřadit mu globální kombinaci kláves, " "kterou se bude spouštět. Kdykoliv aplikace Kupfer běží, může " "libovolná aplikace získat aktuální zaměření." #: C/plugin-triggers.page:25(title) msgid "Creating a new trigger" msgstr "Vytváření nového spouštěče" #: C/plugin-triggers.page:27(p) msgid "Set up a command in Kupfer that you want to run" msgstr "Nastavte v aplikaci Kupfer příkaz, který chcete spustit" #: C/plugin-triggers.page:32(p) msgid "" "Press CtrlReturn to create a " "composed command." msgstr "" "Zmáčknutím CtrlEnter vytvořte " "složený příkaz." #: C/plugin-triggers.page:38(p) msgid "" "Type Tab and select the action Add Trigger... and press " "Return" msgstr "" "Zmáčkněte Tab, vyberte akci Přidat spouštěč… a zmáčkněte " "Enter" #: C/plugin-triggers.page:44(p) msgid "" "Using the window that appears, press modifier keys and a letter or number " "key to set a global shortcut. An example is pressing and holding " "CtrlAlt and then pressing and " "releasing R to bind CtrlAltR." msgstr "" "V okně, které se objeví, zmáčkněte klávesový modifikátor a klávesu s " "písmenem nebo číslem. Tím klávesovou zkratku nastavíte. Například zmáčknutím " "a držením modifikátorů CtrlAlt a " "následným zmáčknutím a uvolněním R přiřadíte CtrlAltR." #: C/plugin-triggers.page:54(title) msgid "Removing a trigger" msgstr "Odstranění spouštěče" #: C/plugin-triggers.page:56(p) msgid "" "Find the source Triggers in Kupfer and press to see its contents." msgstr "" "Najděte v aplikaci Kupfer zdroj Spouštěče a zmáčknutím " " zobrazte jeho obsah." #: C/plugin-triggers.page:62(p) msgid "" "Find the active trigger in the list and use the action Remove Trigger." msgstr "" "Najděte v seznamu aktivní spouštěč a použijte akci Odstranit spouštěč." #: C/plugin-triggers.page:68(p) msgid "" "Since trigger keyboard shortcuts are global, they can be used from any " "application. Select shortcuts with care so that they do not conflict with " "other functions." msgstr "" "Vzhledem k tomu, že klávesové zkratky jsou globální, můžete je použít z " "kterékoliv aplikace. Z toho důvodu je ale vybírejte s rozmyslem, aby nebyly " "v konfliktu s jinými funkcemi." #: C/plugin-triggers.page:74(title) C/plugin-notes.page:60(title) #: C/plugin-gwibber.page:68(title) C/plugin-favorites.page:38(title) msgid "Power User Tips" msgstr "Rady pro pokročilé uživatele" #: C/plugin-triggers.page:75(p) msgid "" "Proxy objects such as Selected Text, Selected File, Frontmost Window, Last Command et cetera allow very " "powerful triggers." msgstr "" "Objekty proxy, jako je Vybraný text, Vybraný soubor, Okno zcela nahoře, Poslední příkaz atd., dávají " "možnosti pro velmi mocné spouštěče." #: C/plugin-triggers.page:79(p) msgid "" "The application action Launch is special; if you bind a trigger " "using Launch, it will start the application if it is not running, " "but focus the application when it is already running. By contrast, Start " "Again will start the application if it is running or not." msgstr "" "Aplikační akce Spustit je speciální. Když přiřadíte spouštěč akcí " "Spustit, bude spouštět aplikace, pokud již neběží, a pokud běží, " "tak jim bude předávat zaměření. Oproti tomu, Spustit znovu spustí " "aplikaci, ať už běží nebo ne." #: C/plugin-triggers.page:87(title) msgid "Example Triggers" msgstr "Příklady spouštěčů" #: C/plugin-triggers.page:90(em) msgid "Text Editor → Launch" msgstr "Textový editor → Spustit" #: C/plugin-triggers.page:91(p) msgid "" "Start Text Editor or focus its window if it is already running." msgstr "" "Spustí Textový editor, případně zaměří jeho okno, pokud již běží" #: C/plugin-triggers.page:97(em) msgid "Selected Text → Search With → Google" msgstr "Vybraný text → Prohledat pomocí → Google" #: C/plugin-triggers.page:98(p) msgid "Search the web using the currently selected text." msgstr "Vyhledá na webu právě vybraný text." #: C/plugin-triggers.page:100(em) msgid "Selected File → Move To → (Downloads Folder)" msgstr "Vybraný soubor → Přesunout do → (složka Stažené)" #: C/plugin-triggers.page:101(p) msgid "Move the currently selected file to a specific folder" msgstr "Přesune právě vybraný soubor do zadané složky" #: C/plugin-triggers.page:105(em) msgid "Songs → Search Contents" msgstr "Skladby → Prohledat obsah" #: C/plugin-triggers.page:106(p) msgid "" "You may even add a trigger to open a specific subcatalog in Kupfer, for " "example Rhythmbox's songs." msgstr "" "Můžete také přidat spouštěč, který otevře zadaný podkatalog v aplikaci " "Kupfer, například se skladbami přehrávače Rhythmbox." #: C/plugin-notes.page:7(desc) msgid "Using the notes plugin." msgstr "Používání zásuvného modulu Poznámky." #: C/plugin-notes.page:10(app) C/plugin-calculator.page:37(title) msgid "Notes" msgstr "Poznámky" #: C/plugin-notes.page:13(title) #| msgid "Plugins" msgid "Notes Plugin" msgstr "Zásuvný modul Poznámky" #: C/plugin-notes.page:14(p) msgid "" "With Notes you can access or create new notes in either the " "program Gnote or Tomboy. Notes will work " "identically with either application—you can configure which one to use in " "the plugin's information pane in Kupfer Preferences." msgstr "" "Pomocí zásuvného modulu Poznámky můžete přistupovat k poznámkám " "nebo je i vytvářet buď v aplikaci Gnote nebo Tomboy. " "Poznámky pracují úplně stejně v obou aplikacích – můžete si ji " "vybrat v informačním panelu zásuvného modulu v Předvolbách Kupfer." #: C/plugin-notes.page:24(title) msgid "Creating a new note" msgstr "Vytváření nové poznámky" #: C/plugin-notes.page:26(p) msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "note title" msgstr "" "Aktivujte Kupfer, zmáčkněte . pro přechod do textového režimu a " "pak napište název poznámky" #: C/plugin-notes.page:32(p) msgid "" "Type Tab and select the action Create Note and press " "Return." msgstr "" "Zmáčkněte Tab, vyberte akci Vytvořit poznámku a " "zmáčkněte Enter." #: C/plugin-notes.page:39(title) msgid "Finding a note by title" msgstr "Hledání poznámky podle názvu" #: C/plugin-notes.page:41(p) msgid "Simply search for the note title in Kupfer" msgstr "Prostě nadpis poznámky v aplikaci Kupfer hledejte" #: C/plugin-notes.page:45(title) #| msgid "Descend into an object with content" msgid "Finding a note by content" msgstr "Hledání poznámky podle obsahu" #: C/plugin-notes.page:47(p) msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "search query" msgstr "" "Aktivujte Kupfer, zmáčkněte . pro přechod do textového režimu a " "pak napište vyhledávací dotaz" #: C/plugin-notes.page:53(p) msgid "" "Type Tab and select the action Get Note Search Results... and press Return." msgstr "" "Zmáčkněte Tab, vyberte akci Získat výsledky hledávání " "poznámek… a zmáčkněte Enter." #: C/plugin-notes.page:63(p) msgid "" "You can use the Selected Text object and create a new note with the " "content of the selection." msgstr "" "Můžete použít objekt Vybrat text a vytvořit novou poznámku s " "obsahem té vybrané." #: C/plugin-nautilusselection.page:7(desc) msgid "Using the selected file plugin." msgstr "Používání zásuvného modulu Vybraný soubor." #: C/plugin-nautilusselection.page:10(app) msgid "Selected File" msgstr "Vybraný soubor" #: C/plugin-nautilusselection.page:14(p) msgid "" "Select a file in the file manager. Open Kupfer and search for the " "object Selected File, which represents the file or files that are " "selected." msgstr "" "Vyberte soubor ve správci souborů. Otevřete aplikaci Kupfer a " "vyhledejte objekt Vybraný soubor, který reprezentuje soubor nebo " "soubory, které jsou vybrány." #: C/plugin-nautilusselection.page:19(p) msgid "" "Instead of searching, you can press CtrlG to directly focus the selected file. See " "for more information." msgstr "" "Místo hledání můžete zmáčknout CtrlG " "pro přímé zaměření vybraného souboru. Více informací viz ." #: C/plugin-nautilusselection.page:26(title) msgid "Selected File requires Nautilus" msgstr "" "Zásuvný modul Vybraný soubor vyžaduje aplikaci Nautilus" #: C/plugin-nautilusselection.page:27(p) msgid "" "The selected file plugin works with the Nautilus file browser and " "requires that the extension kupfer_provider.py is installed (it " "is normally installed together with Kupfer). After installing it " "for the first time, Nautilus must start anew before it is active." msgstr "" "Zásuvný modul Vybraný soubor pracuje se správcem souborů Nautilus " "a vyžaduje, aby bylo nainstalováno rozšíření kupfer_provider.py " "(to se normálně nainstaluje spolu s aplikací Kupfer). Po " "nainstalování se na poprvé musí nejdříve spustit Nautilus, aby " "došlo k aktivaci." #: C/plugin-gwibber.page:7(desc) msgid "Using the Gwibber plugin." msgstr "Používání zásuvného modulu Gwiber." #: C/plugin-gwibber.page:10(app) msgid "Gwibber" msgstr "Gwiber" #: C/plugin-gwibber.page:13(title) msgid "Gwibber Plugin" msgstr "Zásuvný modul Gwiber" #: C/plugin-gwibber.page:14(p) msgid "" "With the Gwibber plugin you can send messages to social networks " "such as Twitter or Identi.ca." msgstr "" "Pomocí zásuvného modulu Gwibber můžete posílat zprávy do " "sociálních sítí, jako je Twitter nebo Identi.ca." #: C/plugin-gwibber.page:18(p) msgid "" "The plugin requires that the application Gwibber is installed and " "configured for your user. Kupfer will start and use Gwibber's " "service in the background." msgstr "" "Zásuvný modul vyžaduje, aby byla nainstalována aplikace Gwibber a " "nastavena pro vás, jako uživatele. Aplikace Kupfer spustí a " "použije službu Gwibber na pozadí." #: C/plugin-gwibber.page:27(title) msgid "Sending a message to all services" msgstr "Odesílání zprávy na všechny služby" #: C/plugin-gwibber.page:29(p) msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "message." msgstr "" "Aktivujte Kupfer, zmáčkněte . pro přechod do textového režimu a " "pak napište zprávu." #: C/plugin-gwibber.page:35(p) msgid "" "Type Tab and select the action Send Message and press " "Return." msgstr "" "Zmáčkněte Tab, vyberte akci Odeslat zprávu a zmáčkněte " "Enter." #: C/plugin-gwibber.page:42(title) msgid "Sending a message to a specific service" msgstr "Odesílání zprávy na vybranou službu" #: C/plugin-gwibber.page:44(p) msgid "" "Activate Kupfer and search for the service object, for example Identi." "ca" msgstr "" "Aktivujte Kupfer a vyhledejte objekt služby, například Tweeter" #: C/plugin-gwibber.page:50(p) msgid "Type Tab and select the action Send Message." msgstr "Zmáčkněte Tab a vyberte akci Odeslat zprávu." #: C/plugin-gwibber.page:55(p) msgid "" "Type Tab to select the last pane, and type in a message. Press " "Return to send." msgstr "" "Zmáčkněte Tab pro výběr posledního panelu a napište zprávu. " "Zmáčknutím Enter ji odešlete." #: C/plugin-gwibber.page:61(p) msgid "" "The plugin also provides a source for incoming messages, Gwibber " "Messages and more actions on messages such as Reply, Send " "Private Message etc." msgstr "" "Zásuvný modul poskytuje rovněž zdroje pro příchozí zprávy, Zprávy " "Gwibber a další akce se zprávami, jako Odpovědět, Odeslat " "soukromou zprávu atd." #: C/plugin-gwibber.page:71(p) msgid "" "You can use the comma trick if you want to send a message to more " "than one service, but not all, at the same time." msgstr "" "Jestliže chcete odeslat zprávu naráz na více služeb, ale ne na všechny, " "můžete použít vložení do zásobníku." #: C/plugin-favorites.page:7(desc) msgid "Using the favorites plugin." msgstr "Používání zásuvného modulu Oblíbené." #: C/plugin-favorites.page:10(app) msgid "Favorites" msgstr "Oblíbené" #: C/plugin-favorites.page:13(title) #| msgid "Calculator Plugin" msgid "Favorites Plugin" msgstr "Zásuvný modul Oblíbené" #: C/plugin-favorites.page:14(p) msgid "" "With Favorites you mark objects, for example files, for quicker " "access. It is a sort of shelf on which you can store objects in Kupfer. " "Objects marked as favorites will also be ranked higher and are adorned with " "a star symbol." msgstr "" "Pomocí zásuvného modulu Oblíbené označujete objekty, např. " "soubory, pro rychlý přístup. Je to jakési odkladiště, ve kterém si můžete " "schovávat objekty. Objekty označené jako oblíbené jsou také výše hodnoceny a " "ozdobeny symbolem hvězdičky." #: C/plugin-favorites.page:25(p) #| msgid "Introduction to Kupfer." msgid "Find an object in Kupfer" msgstr "Najděte v aplikaci Kupfer nějaký objekt" #: C/plugin-favorites.page:30(p) msgid "" "Type Tab and select either the action Add to Favorites " "or Remove from Favorites." msgstr "" "Zmáčkněte Tab a vyberte buď Přidat do oblíbených nebo " "Odebrat z oblíbených." #: C/plugin-favorites.page:39(p) msgid "" "If you favorite an object, you can access it in more places. Not only in the " "\"Favorites\" subcatalog, but also as the indirect (secondary) object for " "some actions. For example:" msgstr "" "Když nějaký objekt přidáte do oblíbených, můžete k němu přistupovat na více " "místech. Ne jen v podkatalogu „Oblíbené“, ale také jako k nepřímému " "(druhému) objektu některých akcí. Například:" #: C/plugin-favorites.page:45(p) msgid "Command-lines from favorites are quick to access." msgstr "Z oblíbených jsou rychle přístupné příkazové řádky." #: C/plugin-favorites.page:46(p) msgid "" "When scaling images with the Scale... action from the Image " "Tools plugin. This action needs a size description as the third " "object, like \"1024\" or \"1200x800\". If you often scale to the same size, " "say \"1200x800\", add this to favorites, and it will always appear as a " "suggestion for the action." msgstr "" "Když měníte rozměry obrázků pomocí akce Změnit velikost… v zásuvném " "modulu Nástroje na obrázky. Tato akce vyžaduje jako třetí objekt " "popis velikosti, např. „1024“ nebo „1200x800“. Pokud často měníte velikost " "na ty stejné rozměry, řekněme „1200x800“, přidejte si je do oblíbených a ony " "se pak vždy objeví jako doporučené pro akci." #: C/plugin-favorites.page:54(p) msgid "" "Actions needing an email address as the indirect object will pick up email " "addresses from favorites as well as well." msgstr "" "Stejně tak akce, které potřebují e-mailovou adresu jako nepřímý objekt, " "získají e-mailové adresy z oblíbených." #: C/plugin-calculator.page:7(desc) #| msgid "Calculator Plugin" msgid "Using the calculator plugin." msgstr "Používání zásuvného modulu Kalkulačka." #: C/plugin-calculator.page:10(app) #| msgid "Calculator Plugin" msgid "Calculator" msgstr "Kalkulačka" #: C/plugin-calculator.page:13(title) msgid "Calculator Plugin" msgstr "Zásuvný modul Kalkulačka" #: C/plugin-calculator.page:14(p) msgid "" "The calculator plugin lets you calculate expressions quickly. It can " "evaluate expressions entered as text starting with \"=\". Entering = from " "command mode will start text mode directly with = prefixed for quick access." msgstr "" "Zásuvný modul Kalkulačka vám umožňuje rychlý výpočet výrazů. Umí vyhodnotit " "výraz zadaný jako text začínající „=“. Zadáním = v příkazovém režimu spustí " "přímo textový režim začínající = pro rychlý přístup." #: C/plugin-calculator.page:23(p) msgid "Activate Kupfer and type =" msgstr "Aktivujte Kupfer a zmáčkněte =" #: C/plugin-calculator.page:26(p) msgid "" "Type in a mathematical expression using +,-,/,* (and ** for exponentiation)" msgstr "" "Napište matematický výraz s použitím +,-,/," "* (a ** pro mocninu)" #: C/plugin-calculator.page:30(p) msgid "Press Return to get the result." msgstr "Zmáčkněte Enter a obdržíte výsledek" #: C/plugin-calculator.page:38(p) #| msgid "" #| "The Calculator uses python's math and complex math modules, and parses " #| "expressions as Python expressions. You may use common mathematical " #| "functions, such as sqrt, sin, exp and log; the command =help " #| "will show a list of all defined functions and constants." msgid "" "The Calculator uses python's math and complex math modules, and parses " "expressions as Python expressions. You may use common mathematical " "functions, such as sqrt, sin, exp and " "log; the command =help will show a list of all defined " "functions and constants." msgstr "" "Kalkulačka používá moduly jazyka Python math a complex math a zpracovává " "výrazy jako výrazy jazyka Python. Můžete používat běžné matematické funkce, " "jako je sqrt (odmocnina), sin, exp a " "log. Příkaz =help vám ukáže seznam všech definovaných " "funkcí a konstant." #: C/plugin-calculator.page:47(p) #| msgid "" #| "Notice that the power operator in Python is double stars, for example " #| "=3**3 will evaluate to 27." msgid "" "Notice that the power operator in Python is double stars, for example " "=3**3 will evaluate to 27." msgstr "" "Všimněte si, že operátor mocniny tvoří v jazyce Python dvě hvězdičky, např. " "=3**3 bude vyhodnoceno jako 27." #: C/plugin-calculator.page:53(p) msgid "To calculate trig functions for angles, convert to radians first:" msgstr "" "Při výpočtu trigonometrických funkcí je zapotřebí nejprve převést úhly na " "radiány:" #: C/plugin-calculator.page:56(code) #, no-wrap msgid "sin(radians(30)) -> 0.5" msgstr "sin(radians(30)) -> 0.5" #: C/plugin-calculator.page:59(p) msgid "" "The last result is stored as the name _ (an underscore, just like in the " "Python console)." msgstr "" "Poslední výsledek je uchován pod názvem _ (podtržítko, stejně jako v konzole " "Python)." #: C/plugin-applications.page:7(desc) msgid "Using the applications plugin." msgstr "Používání zásuvného modulu Aplikace." #: C/plugin-applications.page:10(app) msgid "Applications" msgstr "Aplikace" #: C/plugin-applications.page:13(title) #| msgid "Calculator Plugin" msgid "Applications Plugin" msgstr "Zásuvný modul Aplikace" #: C/plugin-applications.page:14(p) msgid "Applications provides all installed programs." msgstr "" "Zásuvný modul Aplikace poskytuje všechny nainstalované aplikace." #: C/plugin-applications.page:21(title) msgid "Launching an application" msgstr "Spuštění aplikace" #: C/plugin-applications.page:23(p) msgid "Activate Kupfer and type an abbreviation of the application name" msgstr "Aktivujte Kupfer a napište zkratku pro název aplikace" #: C/plugin-applications.page:28(p) msgid "Press Return to launch the application." msgstr "Zmáčknutím Enter aplikaci spustíte." #: C/plugin-applications.page:34(title) msgid "Opening a file with a specific application" msgstr "Otevření souboru pomocí zadané aplikace" #: C/plugin-applications.page:36(p) #| msgid "Introduction to Kupfer." msgid "Select a file in Kupfer" msgstr "V aplikaci Kupfer vyberte soubor" #: C/plugin-applications.page:41(p) msgid "Type Tab and select the action Open With..." msgstr "Zmáčkněte Tab a vyberte akci Otevřít s…" #: C/plugin-applications.page:46(p) msgid "" "Type Tab to select the third (indirect object) pane and in it, " "select the application to open the file with." msgstr "" "Zmáčkněte Tab pro výběr třetího panelu (nepřímého objektu) a v " "něm vyberte aplikaci, pomocí níž se má soubor otevřít." #: C/plugin-applications.page:53(p) msgid "" "The action Open opens files and folders with the registered default " "application for that specific file type. This can be configured using the " "action Set Default Application...." msgstr "" "Akce Otevřít otevře soubory a složky pomocí výchozí aplikace " "registrované pro zadaný typ souboru. Tuto aplikaci lze nastavit pomocí akce " "Nastavit výchozí aplikaci…." #: C/plugin-applications.page:58(p) msgid "" "The file type associations are provided by the desktop environment, and " "modifying them here will modify them on the desktop as well. This may not be " "true when not using GNOME or XFCE." msgstr "" "Přidružení souborů jsou poskytována pracovním prostředím a když je změníte " "zde, změní se i pro celé pracovní prostředí. Což ale nemusí být pravda, " "pokud nepoužíváte GNOME nebo XFCE." #: C/plugin-applications.page:64(title) msgid "Selecting default application for a file type or folders" msgstr "Výběr výchozí aplikace pro typ souboru a složky" #: C/plugin-applications.page:66(p) #| msgid "Introduction to Kupfer." msgid "Select a file or folder in Kupfer" msgstr "V aplikaci Kupfer vyberte soubor nebo složku" #: C/plugin-applications.page:71(p) msgid "" "Type Tab and select the action Set Default Application..." msgstr "" "Zmáčkněte Tab a vyberte akci Nastavit výchozí aplikaci…" #: C/plugin-applications.page:77(p) msgid "" "Type Tab to select the third (indirect object) pane and in it, " "select the application to always open the file type with." msgstr "" "Zmáčkněte Tab pro výběr třetího panelu (nepřímého objektu) a v " "něm vyberte aplikaci, pomocí níž se má soubor vždy otevírat." #: C/plugin-applications.page:85(title) #| msgid "Configuration files and paths" msgid "Configuration" msgstr "Nastavení" #: C/plugin-applications.page:86(p) msgid "" "The configuration option Applications for Desktop Environment in " "the plugin's information pane in Kupfer Preferences determines " "how Kupfer should act with regard to the desktop environment " "configuration—certain applications request not to be shown depending on " "which desktop environment is used. By default, it behaves like GNOME." msgstr "" "Volba nastavení Aplikace pro pracovní prostředí v informačním " "panelu v Předvolbách Kupfer určuje, jak by měla aplikace " "Kupfer chovat vůči nastavení pracovního prostředí – určité " "požadavky aplikací nejsou v závislosti na použitém pracovním prostředí " "zobrazeny. Ve výchozím stavu se chová jako GNOME." #: C/moreusage.page:7(desc) msgid "More advanced usage information." msgstr "Další pokročilé informace o používání." #: C/moreusage.page:10(title) #| msgid "Using Kupfer plugins." msgid "Using Kupfer in Depth" msgstr "Použití aplikace Kupfer do hloubky" #: C/moreusage.page:13(title) #| msgid "Adding your actions and scripts" msgid "Adding Applications and Scripts" msgstr "Přidávání aplikací a skriptů" #: C/moreusage.page:14(p) msgid "" "Kupfer will show all applications that are configured visible in " "your menu editor." msgstr "" "Aplikace Kupfer bude zobrazovat všechny aplikace, které jsou " "nastavené jako viditelné ve vašem editoru nabídky." #: C/moreusage.page:18(p) #| msgid "" #| "If you want to add a custom application, or an application called with " #| "special options, you can create a new launcher for it and place it in one " #| "of the standard places for applications, for example ~/.local/share/" #| "applications, where Kupfer will find it." msgid "" "If you want to add an application manually, you can create a new ." "desktop file and place it in one of the standard directories for " "applications, for example ~/.local/share/applications, where " "Kupfer will find it." msgstr "" "Pokud chcete přidat aplikaci ručně, můžete vytvořit nový soubor ." "desktop a umístit jej do jedné ze standardních složek pro aplikace, " "například ~/.local/share/applications, kde jej dokáže aplikace " "Kupfer najít." #: C/moreusage.page:24(p) msgid "" "If you have a collection of scripts that you want to call from Kupfer, you can add the scripts folder as a catalog directory to Kupfer in the preferences. Scripts that you add to Kupfer's catalog " "this way can be run directly or in the terminal as long as they are " "executable." msgstr "" "V případě, že máte sadu skriptů, které chcete z aplikace Kupfer " "volat, můžete přidat složku se skripty jako složku katalogu do předvoleb " "Kupfer. Skripty, které přidáte do katalogu aplikace Kupfer tímto způsobem, lze spouštět přímo nebo v terminálu, pokud jsou " "spustitelné." #: C/moreusage.page:31(p) msgid "" "You can also save command-lines by using the action Add to Favorites." msgstr "" "Můžete také ukládat příkazové řádky pomocí akce Přidat oblíbené." #: C/moreusage.page:38(title) msgid "Opening Files and Folders" msgstr "Otevírání souborů a složek" #: C/moreusage.page:39(p) msgid "" "Using the action Open, files and folders are opened in their " "preferred application. The application associations can be changed, see " "." msgstr "" "Použitím akce Otevřít se soubory a složky otevřou ve své " "upřednostňované aplikaci. Přidruženou aplikaci je možné změnit, viz ." #: C/moreusage.page:47(title) msgid "The Comma Trick" msgstr "Vkládání do zásobníku („trik s čárkou“)" #: C/moreusage.page:48(p) msgid "" "The comma trick allows the user to use actions on many objects at the same " "time." msgstr "" "Pomocí vložení do zásobníku (tzv. „trik s čárkou“, v originále „comma " "trick“) může uživatel použít akce na více objektů naráz." #: C/moreusage.page:52(p) msgid "" "Simply press comma , when an object is selected. The object is " "put on a \"stack\", and you can find yet another file or object, press comma " "to put it on the stack. When you subsequently invoke an action, the action " "is carried out on all of the objects at the same time." msgstr "" "Jednoduše zmáčkněte čárku , ve chvíli, kdy je vybrán nějaký " "objekt. Objekt se vloží do „zásobníku objektů“ a vy můžete hledat další " "soubor nebo objekt, který zase zmáčknutím čárky vložíte do zásobníku. Když " "následně vyvoláte akci, provede se na všech objektech naráz." #: C/moreusage.page:58(p) msgid "" "Some actions are only \"multiplied\" when used with many objects, other are " "smarter than that:" msgstr "" "Některé akce jsou pouze „vícenásobné“, když se spustí s více objekty, jiné " "se chovají elegantněji:" #: C/moreusage.page:61(p) msgid "" "Selecting many files and using the Create Archive action, all files will be " "packed into the same archive." msgstr "" "Vybráním více souborů a použitím akce Vytvořit archiv v… budou všechny " "soubory zabaleny do jediného archívu." #: C/moreusage.page:63(p) msgid "" "If you select multiple contacts and use a Send Email action, it creates one " "email directed at all the contacts." msgstr "" "Když vyberete více kontaktů a použijete akci Napsat e-mail, vytvoří se " "poštovní zpráva přímo se všemi kontakty jako příjemci." #: C/moreusage.page:65(p) msgid "" "If you select multiple subcatalogs (For example Firefox Bookmarks and " "Epiphany Bookmarks) and use Search Contents.., you get a subcatalog search " "restricted to the objects of those two catalogs! You can even bind a trigger " "to this command(!)" msgstr "" "Když vyberete více podkatalogů (například Záložky ve Firefoxu a Záložky v " "Epiphany) a použijete Prohledat obsah…, získáte výsledky hledání omezené na " "objekty těchto podkatalogů! Navíc můžete na tento příkaz navázat spouštěč!" #: C/moreusage.page:71(p) msgid "" "The comma trick is directly taken from Quicksilver (the " "example given in the external article should work identically in Kupfer)." msgstr "" "Trik s čárkou je převzat přímo z aplikace Quicksilver " "(příklad uvedený v externím článku by měl být víceméně totožný i pro " "aplikaci Kupfer; článek je v angličtině)." #: C/moreusage.page:80(title) #| msgid "Grab current selection" msgid "Grab Current Selection" msgstr "Zachytávání aktuálního výběru" #: C/moreusage.page:81(p) msgid "" "To use the current selected text, from any application, with Kupfer, you can configure a global keyboard shortcut for the action Show " "with Selection in Kupfer Preferences." msgstr "" "Jestli chcete použít aktuálně vybraný text z libovolné aplikace v aplikaci " "Kupfer, můžete si v Předvolbách Kupfer nastavit " "globální klávesovou zkratku pro akci Zobrazit s výběrem." #: C/moreusage.page:85(p) msgid "" "If configured, pressing the global keyboard shortcut will summon " "Kupfer with the current selection as the focused object." msgstr "" "Když je nastavená a zmáčknete ji, vyvolá se aplikace Kupfer s " "aktuálním výběrem jako zaměřeným objektem." #: C/moreusage.page:90(p) msgid "See " msgstr "Viz " #: C/moreusage.page:94(title) #| msgid "Command line connection" msgid "Command-line Connection" msgstr "Napojení na příkazový řádek" #: C/moreusage.page:95(p) msgid "" "The command kupfer on the command-line will focus Kupfer if it's already running, otherwise it will start it." msgstr "" "Příkaz kupfer v příkazovém řádku zaměří aplikaci Kupfer, pokud již běží, pokud neběží, tak ji spustí." #: C/moreusage.page:99(p) #| msgid "" #| "For example, if you are using the shell in a directory where you have a " #| "file called \"report.pdf\", you can focus this file in Kupfer " #| "by running kupfer report.pdf." msgid "" "The command kupfer can be used to send files or text from the " "command-line to Kupfer. For example, if you are using the shell " "in a directory where you have a file called \"report.pdf\", you can focus " "this file in Kupfer by running kupfer report.pdf." msgstr "" "Příkaz kupfer lze použít k poslání souborů nebo textu z příkazové " "řádky do aplikace Kupfer. Například, když použijete shell ve " "složce, kde máte soubor nazvaný „zpráva.pdf“, můžete tento soubor v aplikaci " "Kupfer zaměřit spuštěním kupfer zpráva.pdf." #: C/moreusage.page:107(p) msgid "" "You can also send text if you pipe the output of a command into kupfer." msgstr "" "Text můžete předat také tak, že použijete rouru mezi výstupem nějaké příkazu " "a příkazem kupfer." #: C/moreusage.page:114(title) msgid "Managing Context and Current Selection" msgstr "Správa kontextu a aktuálního výběru" #: C/moreusage.page:115(p) msgid "" "If you find the object you want to use, then invoke an action, Kupfer goes away to perform the action (for example start a program or play a " "song). When you come back to Kupfer, it will still keep the same " "object and action selected. Some actions make sense to be repeated (like " "skipping to the next song) and it can be useful to perform different actions " "on the same object." msgstr "" "Když najdete objekt, který chcete použít, vyvolejte akci a aplikace " "Kupfer zmizí akci provést (například spustit program nebo přehrát " "skladbu). Když se vrátíte zpět do aplikace Kupfer, bude stále " "držet ten stejný objekt a vybranou akci. Některé akce reagují na opakování " "(jako například přesun na další skladbu) a mohou být použity k provedení " "jiné akce s tím též objektem." #: C/moreusage.page:123(p) msgid "" "However, you always have the top level catalog reachable when you \"come back" "\" to Kupfer -- say you went into the subcatalog \"Albums\" to " "browse your albums only; you select an album to play, and play it. You come " "back with the album selected -- but your next search will still go over the " "top level catalog, not just albums." msgstr "" "Přesto máte, když se „vrátíte zpět“ do aplikace Kupfer, vždy " "dosažitelný katalog v nejvyšší úrovni. Řekněme, že jste přešli do " "podkatalogu „Alba“, abyste procházeli pouze svá alba. Vyberete si album, " "které chcete přehrát a začnete jej přehrávat. Vrátíte se zpět a máte vybráno " "album, ale následující hledání bude stále probíhat v horní úrovni katalogu, " "ne jen v albech." #: C/moreusage.page:130(p) msgid "" "How to come back into the subcatalog you were in? You do that by simply " "browsing, not searching the first thing you do when you focus Kupfer again. A quick way is to press down-arrow or space to open the browse " "window; think of it as saying \"I want to stay in this subfolder\". With the " "browse window open, your next query will search the current subcatalog." msgstr "" "Jak se vrátit do podkatalogu, ve kterém jste byli? Uděláte to jednoduše " "procházením, místo abyste jako první věc po opětovném zaměření aplikace " "Kupfer provedli vyhledávání. Rychlou cestou je zmáčknout šipku " "dolů nebo mezerník, aby se otevřelo okno prohlížeče. Smyslem toho je říci " "„Chci zůstat v této podsložce“. Při otevřeném okně prohlížeče bude váš " "následující dotaz prohledávat aktuální podkatalog." #: C/moreusage.page:137(p) msgid "" "This way you can work both ways -- you can quickly drill down into folders " "to find a file, and when you come back for the next action with Kupfer you can either summon any normal toplevel object (just start typing), " "or stay around where you were, deep in that folder (press space, then type a " "query)." msgstr "" "Touto cestou můžete pracovat oběma způsoby - můžete se rychle zanořovat do " "složek, abyste našli soubor a když se vrátíte zpět kvůli další akci s " "aplikací Kupfer, můžete buď vyvolat objekt některé normální " "nejvyšší úrovně (prostě tak, že začnete psát) nebo zůstat kde jste, zanořeni " "v této složce (zmáčknutím mezerníku a teprve pak psaním dotazu)." #: C/moreusage.page:146(title) msgid "Saving Commands as Files" msgstr "Ukládání příkazů jako souborů" #: C/moreusage.page:147(p) msgid "" "You can use keyboard shortcut for Compose Command (by default it is " "CtrlReturn) to create a command " "object out of the currently focused command in Kupfer. This object can be " "saved as a runnable file if you use the Save As... action. The " "resulting file will can be executed when opened from the file manager (it " "requires that Kupfer is already running)." msgstr "" "Můžete použít klávesovou zkratku pro Sestavit příkaz (ve výchozím " "stavu to je CtrlEnter), který vytvoří " "příkazový objekt z právě zaměřeného příkazu v aplikaci Kupfer. Tento objekt " "je možné uložit jako spustitelný soubor pomocí akce Uložit jako…. " "Výsledný soubor lze spouštět otevřením ve správci souborů (je potřeba, aby " "již běžela aplikace Kupfer)." #: C/managing-plugins.page:7(desc) #| msgid "Introduction to Kupfer." msgid "Using plugins with Kupfer." msgstr "Používání zásuvných modulů v aplikaci Kupfer." #: C/managing-plugins.page:10(title) msgid "How to Configure Plugins" msgstr "Jak nastavit zásuvné moduly" #: C/managing-plugins.page:12(p) msgid "" "Functionality in Kupfer is organized by extentsion modules called \"plugins" "\". Each plugin provides additional functionality, for example integration " "with an external application." msgstr "" "Funkcionalita v aplikaci Kupfer je dána rozšiřujícími moduly nazývanými " "„zásuvné moduly“. Každý zásuvný modul funkcionalitu nějakým způsobem " "doplňuje, například integrací externí aplikace." #: C/managing-plugins.page:19(title) msgid "Configuring Plugins" msgstr "Nastavování zásuvných modulů" #: C/managing-plugins.page:21(title) #| msgid "Using Kupfer plugins." msgid "Open Kupfer Preferences to the Plugins tab" msgstr "Otevřete Předvolby Kupfer na kartě Zásuvné moduly" #: C/managing-plugins.page:23(p) msgid "Use one of the following methods:" msgstr "Použijte jeden z následujících postupů:" #: C/managing-plugins.page:25(p) msgid "" "Click the Kupfer icon in the notification area and select the item " "Preferences" msgstr "" "Klikněte na ikonu Kupfer v oznamovací oblasti a vyberte položku " "Předvolby" #: C/managing-plugins.page:25(item) msgid "." msgstr "." #: C/managing-plugins.page:29(p) msgid "" "Search for the object Kupfer Preferences in Kupfer itself. Press " "Return to open it." msgstr "" "Vyhledejte objekt Předvolby Kupfer přímo v aplikaci Kupfer. " "Zmáčknutím Enter jej pak otevřete." #: C/managing-plugins.page:33(p) #| msgid " or ShiftSpace" msgid "Use the keyboard shortcut Ctrl;" msgstr "" "Použijte klávesovou zkratku Ctrl;" #: C/managing-plugins.page:39(p) msgid "Select the tab Plugins" msgstr "Vyberte kartu Zásuvné moduly" #: C/managing-plugins.page:45(p) msgid "" "Select plugins in the list to read about them, and tick the box next to its " "name to activate the plugin, or untick to deactivate." msgstr "" "Vyberte zásuvný modul v seznamu a můžete si o něm přečíst informace. " "Zaškrtnutím políčka vedle jeho názvu jej můžete aktivovat, zrušením " "zaškrtnutí deaktivovat." #: C/managing-plugins.page:49(p) msgid "" "If the plugin has any configurable parameters, they will be visible below " "the plugin information." msgstr "" "Pokud má zásuvný modul nějaké parametry nastavení, budou zobrazeny pod " "informacemi o něm." #: C/managing-plugins.page:53(p) msgid "" "The plugin Kupfer Plugins allows fast access to each plugin's " "information page as well as the action \"Show Source Code\" which reveals " "the implementation." msgstr "" "Zásuvný modul Zásuvné moduly Kupfer umožňuje rychlý přístup k " "informační stránce jednotlivých zásuvných modulů. Nabízí i akci „Zobrazit " "zdrojový kód“, která prozradí, jak je implementován." #: C/managing-plugins.page:59(title) msgid "If a Plugin can not be Activated" msgstr "Když nejde zásuvný modul aktivovat" #: C/managing-plugins.page:60(p) msgid "" "If a plugin fails to activate because it requires a software module that is " "not available, its plugin information will display a message like this:" msgstr "" "Když aktivace zásuvného modulu selže, protože vyžaduje softwarový modul, " "který není dostupný, zobrazí se informace v podobě takovéto zprávy:" #: C/managing-plugins.page:65(em) msgid "Plugin could not be read due to an error:" msgstr "Zásuvný modul nemohl být načten kvůli výskytu chyby:" #: C/managing-plugins.page:66(em) msgid "Python module 'gdata' is needed" msgstr "Je zapotřebí modul Python „gdata“" #: C/managing-plugins.page:67(p) msgid "" "This means that you need to install a needed python module from your " "distribution—and possibly the plugin documentation can tell you how." msgstr "" "Znamená to, že potřebujete nainstalovat požadovaný modul jazyka Python ve " "své distribuci – a jak na to vám snad poradí dokumentace k zásuvnému modulu." #: C/managing-plugins.page:72(p) msgid "" "The plugin may also unexpectedly fail to load, and display a different error " "message. It may then be a program error in either the plugin or Kupfer." msgstr "" "Zásuvný modul může také neočekávaně selhat při načítání a zobrazit jinou " "chybovou zprávu. Může se jednat o programovou chybu buď v zásuvném modulu " "nebo aplikaci Kupfer." #: C/managing-plugins.page:79(title) #| msgid "Calculator Plugin" msgid "Installing more Plugins" msgstr "Instalace dalších zásuvných modulů" #: C/managing-plugins.page:80(p) msgid "" "You can install custom plugins into the folder ~/.local/share/kupfer/" "plugins. Each plugin is either a single .py file or a " "python package (a folder directly containing a file called __init__." "py). Plugins in the package format can include icon files. Python " "packages can even be installed as .zip files." msgstr "" "Vlastní zásuvné moduly můžete instalovat do složky ~/.local/share/" "kupfer/plugins. Každý zásuvný modul má podobu buď jediného souboru " ".py nebo balíčku python (složka která přímo obsahuje soubor s " "názvem __init__.py). Zásuvné moduly ve formátu balíčku mohou " "zahrnovat soubory ikon. Balíčky python mohou být instalovány také v podobě " "souborů .zip." #: C/managing-plugins.page:88(p) msgid "" "Caution: Treat a plugin as a computer program. Do not install " "untrusted plugins." msgstr "" "Varování: Přistupujte k zásuvným modulům jako k jiným počítačovým " "programům. Neinstalujte neověřené zásuvné moduly." #: C/managing-plugins.page:95(title) #| msgid "Plugins" msgid "Creating Plugins" msgstr "Vytváření zásuvných modulů" #: C/managing-plugins.page:96(p) msgid "" "Documentation for plugin creators is available in the file " "Documentation/Manual.rst in the source distribution on the " "webpage at Kupfer " "Manual. An easy way to start is to copy an existing plugin and " "experimenting with it." msgstr "" "Dokumentace pro autory zásuvných modulů je dostupná v souboru " "Documentation/Manual.rst ve zdrojových kódech na webové stránce " "Příručka aplikace " "Kupfer. Nejjednodušší způsob, jak začít, je zkopírovat existující " "zásuvný modul a experimentovat s ním." #: C/managing-plugins.page:107(title) msgid "The Catalog Tab in Preferences" msgstr "Karta Katalog v předvolbách" #: C/managing-plugins.page:108(p) msgid "" "Each plugin can export a number of sources which contain objects. Normally, " "all these objects are directly accessible from a top-level search. Some " "plugins export so specialized or so many objects that their catalogs should " "better not have their objects exported to the top level. To reach those " "objects, you have to first find the catalog by name, then enter the catalog " "using the action Search Contents." msgstr "" "Každý zásuvný modul může exportovat řadu zdrojů, které obsahují objekty. " "Normálně jsou všechny tyto objekty přímo přístupné z nejvyšší úrovně " "hledání. Některé zásuvné moduly jsou příliš specializované nebo obsahují " "příliš mnoho objektů na to, aby bylo vhodné exportovat jejich objekty do " "nejvyšší úrovně. Abyste se k jejich objektům dostali, musíte nejprve podle " "názvu vyhledat katalog a pak do něj vstoupit pomocí akce Prohledat " "obsah." #: C/managing-plugins.page:118(p) msgid "" "In the tab Catalog in Kupfer Preferences, a ticked box " "next to each source means that its objects are exported. An unticked box " "means that its contents are hidden from the top level." msgstr "" "Na kartě Katalog v Předvolbách Kupfer najdete u každého " "zdroje zaškrtávací políčko. Zaškrtnuté znamená, že jeho objekty jsou " "exportovány, nezaškrtnuté, že jeho obsah je pro nejvyšší úroveň skryt." #: C/managing-plugins.page:123(p) msgid "" "Note: Kupfer may become slow if large enough subcatalogs are " "exported to the top level." msgstr "" "Poznámka: Když jsou do nejvyšší úrovně exportovány opravdu rozsáhlé " "katalogy, může se Kupfer zpomalit." #: C/license.page:7(desc) msgid "You can copy, modify and share Kupfer." msgstr "Aplikaci Kupfer můžete kopírovat, upravovat a sdílet." #: C/license.page:10(title) msgid "License" msgstr "Licence" #: C/license.page:12(p) msgid "" "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." msgstr "" "Tento program je svobodný software: Můžete jej dále šířit a/nebo upravovat " "za podmínek licence GNU General Public License v podobě, v jaké ji " "vydala Free Software Foundation, a to buď ve verzi 3 této licence nebo (dle " "vaší volby) v libovolné novější verzi." #: C/license.page:18(p) msgid "" "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." msgstr "" "Tento program je šířen ve víře, že bude užitečný, ale BEZ JAKÝCHKOLIV ZÁRUK, " "a to i bez předpokládané záruky na PRODEJNOST nebo VHODNOST PRO KONKRÉTNÍ " "ÚČEL. Více podrobností najdete přímo v licenci GNU General Public " "License." #: C/license.page:24(p) msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see gnu." "org/licenses." msgstr "" "Spolu s tímto programem byste měli obdržet kopii licence GNU General Public " "License. Pokud se tak nestalo, podívejte se na gnu.org/licenses." #: C/license.page:30(p) msgid "" "This documentation is licensed under a Creative Commons Attribution-Share Alike 3.0 " "Unported License." msgstr "" "Tato dokumentace je licencována pod Creative Commons Attribution-Share Alike 3.0 Unported " "License." #: C/license.page:36(p) msgid "" "As a special exception, the copyright holders give you permission to copy, " "modify, and distribute the example code contained in this document under the " "terms of your choosing, without restriction." msgstr "" "Jako speciální výjimku vám držitel autorských práv uděluje svolení " "kopírovat, upravovat a šířit ukázkový kód obsažený v tomto dokumentu za " "podmínek, které si zvolíte, bez dalších omezení." #: C/keyboard.page:7(desc) #| msgid "Global Keyboard Shortcuts" msgid "Complete keyboard shortcuts reference." msgstr "Úplný přehled klávesových zkratek." #: C/keyboard.page:10(title) msgid "Command Keys and Accelerator Keys" msgstr "Příkazové klávesy a klávesové zkratky" #: C/keyboard.page:13(title) C/generalusage.page:12(title) msgid "Keyboard Interface" msgstr "Obsluha z klávesnice" #: C/keyboard.page:14(p) #| msgid "In command mode, some keystrokes have special meanings:" msgid "In command mode, the following keystrokes have special meanings:" msgstr "V příkazovém režimu mají následující klávesy speciální význam:" #: C/keyboard.page:19(p) C/generalusage.page:34(p) msgid " or Space" msgstr " nebo Mezerník" #: C/keyboard.page:20(p) C/generalusage.page:35(p) msgid "Go to the next match" msgstr "Přejít na následující nalezenou shodu" #: C/keyboard.page:23(p) C/generalusage.page:38(p) msgid " or ShiftSpace" msgstr " nebo ShiftMezerník" #: C/keyboard.page:26(p) C/generalusage.page:41(p) msgid "Go to the previous match" msgstr "Přejít na předchozí nalezenou shodu" #: C/keyboard.page:29(p) C/generalusage.page:44(p) msgid " or /" msgstr " nebo/" #: C/keyboard.page:30(p) C/generalusage.page:45(p) msgid "Descend into an object with content" msgstr "Přejít do objektu s obsahem" #: C/keyboard.page:33(key) C/generalusage.page:48(key) msgid "Backspace" msgstr "Backspace" #: C/keyboard.page:34(p) C/generalusage.page:49(p) msgid "Erase a character from the query. If the query is empty, go up a level" msgstr "Smazat znak z dotazu. Pokud je dotaz prázdný, přejde o úroveň výš." #: C/keyboard.page:39(key) C/keyboard.page:93(key) C/generalusage.page:54(key) msgid "." msgstr "." #: C/keyboard.page:40(p) C/generalusage.page:55(p) msgid "Activate free-text mode" msgstr "Aktivovat volný textový režim" #: C/keyboard.page:43(key) C/keyboard.page:97(key) C/generalusage.page:58(key) msgid "," msgstr "," #: C/keyboard.page:44(p) C/generalusage.page:59(p) msgid "Put selected object on the stack (\"Comma Trick\")" msgstr "" "Vložit objekt do zásobníku (tzv. „trik s čárkou“, v originále „Comma Trick“)" #: C/keyboard.page:47(p) msgid "Quick access keys:" msgstr "Klávesy pro rychlý přístup:" #: C/keyboard.page:53(key) msgid "=" msgstr "=" #: C/keyboard.page:55(p) msgid "" "Activate free-text mode with = prefix (for )" msgstr "" "Aktivuje volný textový režim s předponou = (pro objekt )" #: C/keyboard.page:61(key) msgid "/" msgstr "/" #: C/keyboard.page:63(p) msgid "" "Activate free-text mode (when nothing is selected) with / " "prefix (to input a rooted path)" msgstr "" "Aktivuje volný textový režim (pokud není nic vybráno) s předponou / (pro zadání kořenové cesty)" #: C/keyboard.page:68(p) C/generalusage.page:62(p) msgid "Additionally:" msgstr "Navíc:" #: C/keyboard.page:72(p) C/generalusage.page:66(p) #| msgid "" #| "Additionally, the key Return activates the current selection: " #| "the command is executed. Escape clears the current selection." msgid "" "Return activates the current selection: the command is executed." msgstr "Enter aktivuje aktuální výběr: příkaz je proveden." #: C/keyboard.page:74(p) C/generalusage.page:68(p) msgid "Escape clears the current selection." msgstr "Esc vymaže aktuální výběr." #: C/keyboard.page:75(p) C/generalusage.page:69(p) msgid "Tab switches between the object and the action pane." msgstr "Tab přepne mezi panelem objektu a akce." #: C/keyboard.page:77(p) msgid "" "The meaning of the keys Space, ., ,, /" " and = can not be changed, but you can deactivate their " "special meaning with the checkbox Use single keystroke commands " "in Kupfer Preferences." msgstr "" "Význam kláves Mezerník, ., ,, / " "a = nelze změnit, ale můžete jejich speciální funkci deaktivovat " "pomocí zaškrtávacího políčka Použít jednoklávesové příkazy v " "Předvolbách Kupfer." #: C/keyboard.page:86(title) #| msgid "Global Keyboard Shortcuts" msgid "Kupfer's Keyboard Shortcuts" msgstr "Klávesové zkratky aplikace Kupfer" #: C/keyboard.page:87(p) msgid "" "These keyboard shortcuts are used in Kupfer's interface. They " "have the following meanings and default shortcuts:" msgstr "" "Tyto klávesové zkratky jsou použity v rozhraní aplikace Kupfer. " "Mají následující významy a výchozí klávesy:" #: C/keyboard.page:93(key) C/keyboard.page:97(key) C/keyboard.page:101(key) #: C/keyboard.page:105(key) C/keyboard.page:113(key) C/keyboard.page:117(key) #: C/keyboard.page:121(key) C/keyboard.page:125(key) C/keyboard.page:129(key) #: C/keyboard.page:174(key) msgid "Ctrl" msgstr "Ctrl" #: C/keyboard.page:94(p) msgid "Toggle text mode" msgstr "Přepnout textový režim" #: C/keyboard.page:98(p) msgid "The comma trick" msgstr "Vložit do zásobníku" #: C/keyboard.page:101(key) msgid ";" msgstr ";" #: C/keyboard.page:102(p) msgid "Show preferences window" msgstr "Zobrazit okno předvoleb" #: C/keyboard.page:105(key) msgid "R" msgstr "R" #: C/keyboard.page:106(p) msgid "Reset all" msgstr "Vše vynulovat" #: C/keyboard.page:109(key) msgid "Alt" msgstr "Alt" #: C/keyboard.page:109(key) msgid "A" msgstr "A" #: C/keyboard.page:110(p) msgid "Alternate activate" msgstr "Přepnout aktivaci" #: C/keyboard.page:113(key) msgid "Return" msgstr "Enter" #: C/keyboard.page:114(p) msgid "Compose command" msgstr "Sestavit příkaz" #: C/keyboard.page:117(key) msgid "S" msgstr "S" #: C/keyboard.page:118(p) msgid "Switch to first pane" msgstr "Přepnout na první panel" #: C/keyboard.page:121(key) msgid "Q" msgstr "Q" #: C/keyboard.page:122(p) msgid "Select 'Quit'" msgstr "Vybrat „Ukončit“" #: C/keyboard.page:125(key) msgid "G" msgstr "G" #: C/keyboard.page:126(p) msgid "Select 'Selected File'" msgstr "Vybrat „Vybraný soubor“" #: C/keyboard.page:129(key) msgid "T" msgstr "T" #: C/keyboard.page:130(p) msgid "Select 'Selected Text'" msgstr "Vybrat „Vybraný text“" #: C/keyboard.page:133(key) msgid "F1" msgstr "F1" #: C/keyboard.page:134(p) msgid "Show Help" msgstr "Zobrazit nápovědu" #: C/keyboard.page:139(title) #| msgid "Additional Keyboard Shortcuts" msgid "How to configure a keyboard shortcut" msgstr "Jak nastavit klávesové zkratky" #: C/keyboard.page:141(p) C/keyboard.page:185(p) msgid "Open Kupfer Preferences and go to the Keyboard tab." msgstr "" "Otevřete Předvolby Kupfer a přejděte na kartu Klávesnice." #: C/keyboard.page:147(p) msgid "" "Double-click the shorcut's row under Browser Keyboard Shortcuts." msgstr "" "Dvojitě klikněte na řádek klávesové zkratky pod Klávesové zkratky " "prohlížeče." #: C/keyboard.page:153(p) msgid "" "Using the window that appears, press modifier keys and a letter or number " "key to set a shortcut. An example is pressing and holding Ctrl " "and then pressing and releasing T to bind CtrlT." msgstr "" "V okně, které se objeví, zmáčkněte klávesový modifikátor a klávesu s " "písmenem nebo číslem. Tím klávesovou zkratku nastavíte. Například zmáčknutím " "a držením modifikátoru Ctrl a následným zmáčknutím a uvolněním " "T přiřadíte CtrlT." #: C/keyboard.page:164(title) msgid "Global Keyboard Shortcuts" msgstr "Globální klávesové zkratky" #: C/keyboard.page:165(p) msgid "" "Kupfer always listens to global shortcuts, even if it is not " "currently in the foreground." msgstr "" "Aplikace Kupfer naslouchá, jestli není zmáčknuta nějaká klávesová " "zkratka, vždy, i když zrovna není na popředí." #: C/keyboard.page:169(p) msgid "They have the following meanings and default shortcuts:" msgstr "Mají následující význam a výchozí klávesy:" #: C/keyboard.page:174(key) msgid "Space" msgstr "Mezerník" #: C/keyboard.page:175(p) #| msgid "Introduction to Kupfer." msgid "Show/hide Kupfer" msgstr "Zobrazit/skrýt aplikaci Kupfer" #: C/keyboard.page:178(p) msgid "(not configured by default)" msgstr "(ve výchozím stavu nenataveno)" #: C/keyboard.page:179(p) msgid "Show Kupfer with 'Selection' object focused" msgstr "Zobrazit aplikaci Kupfer se zaměřeným objektem „Výběr“" #: C/keyboard.page:183(title) #| msgid "Global Keyboard Shortcuts" msgid "How to configure a global keyboard shortcut" msgstr "Jak nastavit globální klávesové zkratky" #: C/keyboard.page:191(p) msgid "" "Double-click the shorcut's row under Global Keyboard Shortcuts." msgstr "" "Dvojitě klikněte na řádek klávesové zkratky pod Globální klávesové " "zkratky." #: C/keyboard.page:197(p) msgid "" "Using the window that appears, press modifier keys and a letter or number " "key to set a global shortcut. An example is pressing and holding Super and then pressing and releasing Space to bind " "SuperSpace." msgstr "" "V okně, které se objeví, zmáčkněte klávesový modifikátor a klávesu s " "písmenem nebo číslem. Tím klávesovou zkratku nastavíte. Například zmáčknutím " "a držením modifikátoru Super (obvykle klávesa s logem Windows) a " "následným zmáčknutím a uvolněním Mezerníku přiřadíte " "SuperMezerník." #: C/keyboard.page:206(p) msgid "" "Since these keyboard shortcuts are global, they can be used from any " "application. Select shortcuts with care so that they do not conflict with " "other functions." msgstr "" "Díky tomu, že jsou klávesové zkratky globální, můžete je použít v kterékoliv " "aplikaci. Vybírejte je ale obezřetně, aby nebyly v konfliktu s jinými " "funkcemi těchto aplikací." #: C/keyboard.page:214(p) msgid "" "The plugin Triggers allows to activate actions with global keyboard " "shortcuts. Trigger shortcuts do not appear in Kupfer Preferences." msgstr "" "Zásuvný modul Spouštěče umožňuje aktivovat akce pomocí globálních " "klávesových zkratek. Spouštěcí zkratky se neobjeví v Předvoblách " "Kupfer." #: C/keyboard.page:220(p) msgid "See for more information." msgstr "Více informací viz ." #: C/introduction.page:7(desc) msgid "Introduction to Kupfer." msgstr "Úvod do aplikace Kupfer." #: C/introduction.page:10(title) msgid "Introduction" msgstr "Úvod" #: C/introduction.page:12(p) #| msgid "" #| "Kupfer is to the largest part a keyboard-managed interface to " #| "applications and documents." msgid "" "Kupfer is an interface for quick and convenient access to " "applications and their documents." msgstr "" "Aplikace Kupfer je rozhraní pro rychlý a pohodlný přístup k " "aplikacím a jejich dokumentům." #: C/introduction.page:16(p) msgid "" "The most typical use is to find a specific application and launch it. We " "have tried to make Kupfer easy to extend with plugins so that " "this quick-access paradigm can be extended to many more objects than just " "applications." msgstr "" "Typickou ukázkou použití je najít konkrétní aplikaci a spustit ji. Snažili " "jsme se vytvořit Kupfer tak, aby šel snadno rozšiřovat pomocí " "zásuvných modulů, takže základní funkčnost rychlého přístupu lze rozšířit i " "na další objekty, než jsou jen aplikace." #: C/introduction.page:22(p) msgid "" "We hope that using Kupfer feels both very fun and " "different." msgstr "" "Doufáme, že se při používání aplikace Kupfer budete cítit " "jako při zábavě a zároveň odlišně." #: C/introduction.page:26(p) #| msgid "" #| "For more information about Kupfer, visit its homepage." msgid "" "For up-to-date information about Kupfer, visit its homepage." msgstr "" "Aktuální informace o aplikaci Kupfer najdete na domovské stránce." #: C/index.page:9(name) msgid "Ulrik Sverdrup" msgstr "Ulrik Sverdrup" #: C/index.page:10(email) msgid "ulrik.sverdrup@gmail.com" msgstr "ulrik.sverdrup@gmail.com" #: C/index.page:13(year) msgid "2009" msgstr "2009" #: C/index.page:14(name) msgid "Kupfer Development Team" msgstr "Vývojářský tým Kupfer" #: C/index.page:17(license) msgid "Creative Commons Share Alike 3.0" msgstr "Creative Commons Share Alike 3.0" #: C/index.page:21(title) #| msgid "Kupfer manual" msgid "Kupfer Manual" msgstr "Příručka aplikace Kupfer" #: C/index.page:24(title) msgid "Using Kupfer" msgstr "Používání aplikace Kupfer" #: C/index.page:27(title) msgid "About Specific Plugins" msgstr "O konkrétních zásuvných modulech" #: C/generalusage.page:7(desc) #| msgid "Introduction to Kupfer." msgid "How to start using Kupfer." msgstr "Jak začít používat aplikaci Kupfer." #: C/generalusage.page:14(p) msgid "" "Kupfer is to the largest part a keyboard-managed interface to " "applications and documents." msgstr "" "Aplikace Kupfer z velké části spravuje přístup k aplikacím a " "dokumentům z klávesnice." #: C/generalusage.page:18(p) msgid "" "Kupfer's default mode is the command mode: If you type a query, kupfer will " "search for a match in its catalog." msgstr "" "Výchozí režim aplikace Kupfer je příkazový: Když píšete dotaz, aplikace " "Kupfer bude ve svých katalozích hledat shodu." #: C/generalusage.page:23(p) msgid "" "The arrow keys allow you to browse query matches quite naturally, going to " "the previous or next match, and going up and down in the subcatalogs." msgstr "" "Klávesové šipky vám dovolují zcela přirozeně procházet výsledky dotazu, " "přecházet na předchozí nebo následující nalezenou položku a přecházet nahoru " "a dolů v podkatalozích." #: C/generalusage.page:29(p) msgid "In command mode, some keystrokes have special meanings:" msgstr "V příkazovém režimu mají některé klávesy speciální význam:" #: C/generalusage.page:71(p) #| msgid " or ShiftSpace" msgid "" "By default you show Kupfer using the global keyboard shortcut " "CtrlSpace." msgstr "" "Standardně aplikaci Kupfer zobrazíte pomocí globální klávesové " "zkratky CtrlMezerník." #: C/generalusage.page:74(p) msgid "See for more information." msgstr "Více informací viz " #: C/generalusage.page:78(title) msgid "Learning Habits" msgstr "Učení návyků" #: C/generalusage.page:79(p) msgid "" "Kupfer remembers which objects and actions are used the most. " "When beginning to use it, you have to use the arrow keys at times to make it " "precise which object you want to find. After a few uses of that object, " "Kupfer will rank it higher. Objects marked as favorites are also ranked higher." msgstr "" "Aplikace Kupfer si pamatuje, které objekty a akce se nejvíce " "používají. Když s ní poprvé začnete pracovat, musíte často používat šipky, " "abyste našli ten správný objekt. Po několika použitích těchto objektů je " "začne Kupfer hodnotit výše. Výše jsou hodnoceny rovněž objekty označené jako " "oblíbené." #: C/generalusage.page:90(title) msgid "The Catalog" msgstr "Katalog" #: C/generalusage.page:91(p) msgid "" "The Catalog is the collection of objects you can access in Kupfer, such as " "documents and programs." msgstr "" "Katalog je kolekce objektů, ke kterým můžete v aplikaci Kupfer přistupovat. " "Jedná se například o dokumenty nebo programy." #: C/generalusage.page:96(p) #| msgid "" #| "Objects in the catalog that have content, like folders, are marked with " #| "an arrow. Pressing right-arrow will enter these objects. Much " #| "of the catalog is composed of subcatalogs; plugin subcatalogs do in " #| "general list objects that are also available directly from the top level. " #| "Subcatalogs can be used for a narrower view or search scope, when using " #| "Kupfer." msgid "" "Objects in the catalog that have content, like folders, are marked with an " "arrow. Pressing will enter these objects. Much of the catalog " "is composed of subcatalogs; plugin subcatalogs do in general list objects " "that are also available directly from the top level. Subcatalogs can be used " "for a narrower view or search scope, when using Kupfer." msgstr "" "Objekt katalogu, který má nějaký obsah, jako třeba složka, je označen " "šipkou. Zmáčknutím šipky doprava do tohoto objektu vstoupíte. " "Řada katalogů je složena z podkatalogů. Zásuvné moduly subkatalogů vytváří " "obecné seznamy objektů, které jsou přímo dostupné i z nejvyšší úrovně. " "Subkatalogy jsou použitelné k užšímu pohledu nebo prohledávaní ve vymezeném " "rozsahu v aplikaci Kupfer." #: C/generalusage.page:105(p) #| msgid "" #| "Most subcatalogs update their content automatically. For example, the " #| "Desktop folder catalog is always uptodate." msgid "" "Most subcatalogs update their content automatically. For example, the " "Desktop folder source is always up-to-date." msgstr "" "Většina subkatalogů aktualizuje svůj obsah automaticky. Například obsah " "katalogu složky pracovní plochy je vždy aktuální." #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/index.page:0(None) msgid "translator-credits" msgstr "Marek Černocký " #~ msgid "Using Kupfer more conveniently." #~ msgstr "Jak používat aplikaci Kupfer pohodlněji." #~ msgid "" #~ "Kupfer listens to global shortcuts, even if Kupfer is not currently in " #~ "the foreground. The most important global shortcut is the shortcut to " #~ "show and hide Kupfer's command window which by default is " #~ "CtrlSpace." #~ msgstr "" #~ "Aplikace Kupfer naslouchá globálním klávesovým zkratkám, i když není " #~ "zrovna v popředí. Nejdůležitější globální klávesová zkratka je ta, která " #~ "zobrazuje a skrývá příkazové okno aplikace kupfer a ve výchozím nastavení " #~ "je to CtrlMezerník." #~ msgid "Global Keyboard Shortcuts are configured in Kupfer's preferences." #~ msgstr "" #~ "Globální klávesové zkratky se nastavují v předvolbách aplikace Kupfer." #~ msgid "" #~ "The Triggers plugin allows to configure actions to be activated by global " #~ "shortcuts, but triggers can only be configured in that plugin." #~ msgstr "" #~ "Zásuvný modul Spouštěče umožňuje nastavit akce, které se mají aktivovat " #~ "globálními klávesovými zkratkami, ale spouštěče lze v tomto zásuvném " #~ "modulu pouze nastavovat." #~ msgid "" #~ "Additional keyboard shortcuts that work with Kupfer when it is in the " #~ "foreground can be configured in Kupfer's preferences." #~ msgstr "" #~ "Doplňující klávesové zkratky, které fungují v aplikaci Kupfer, pokud je " #~ "na popředí, je možné nastavit v předvolbách aplikace Kupfer." #~ msgid "" #~ "Install custom plugins in the folder ~/.local/share/kupfer/plugins/" #~ "" #~ msgstr "" #~ "Vlastní zásuvné moduly instalujte do ~/.local/share/kupfer/plugins/" #~ "" #~ msgid "" #~ "Kupfer cache, config and data are located in the directories ~/." #~ "cache/kupfer, ~/.config/kupfer and ~/.local/" #~ "share/kupfer." #~ msgstr "" #~ "Mezipaměť, nastavení a data aplikace Kupfer jsou uložené v ~/.cache/" #~ "kupfer, ~/.config/kupfer a ~/.local/share/" #~ "kupfer." #~ msgid "" #~ "You can install custom plugins into ~/.local/share/kupfer/plugins; adding " #~ "to Kupfer's object knowledge can be surprisingly easy, just " #~ "look at the default plugins if you want to create new." #~ msgstr "" #~ "Vlastní zásuvné moduly si můžete nainstalovat do ~/.local/share/kupfer/" #~ "plugins. Pokud chcete vytvořit nový zásuvný modul, stačí se podívat jak " #~ "vypadá výchozí a zjistíte, že postup přidávání do objektu aplikace " #~ "Kupfer je nečekaně jednoduchý." #~ msgid "Open Terminal Here" #~ msgstr "Otevřít terminál zde" #~ msgid "" #~ "Open terminal first calls xdg-terminal, then gnome-" #~ "terminal. xdg-terminal is a script to find the user's configured " #~ "terminal program for his/her Desktop Environment. Install xdg-" #~ "terminal if you need this (or install a symlink called xdg-" #~ "terminal)." #~ msgstr "" #~ "Otevře terminál nejdříve voláním xdg-terminal a potom " #~ "gnome-terminal. xdg-terminal je skript, který najde " #~ "uživatelovo nastavení programu terminálu pro jeho pracovní prostředí. " #~ "Pokud to tak potřebujete, nainstalujte xdg-terminal (nebo " #~ "vytvořte symbolický odkaz nazvaný xdg-terminal)." #~ msgid "" #~ "To use Kupfer like a pro, you can configure a \"Magic " #~ "Keybinding\" for Kupfer. GUI configuration is not yet " #~ "supported, but edit the configuration file ~/.config/kupfer/kupfer." #~ "cfg to include the following:" #~ msgstr "" #~ "Abyste používali aplikaci Kupfer jako profesionál, můžete si " #~ "pro ni nastavit „magické klávesové zkratky“. Nastavení v grafickém " #~ "prostředí zatím není podporováno, ale můžete upravit soubor nastavení " #~ "~/.config/kupfer/kupfer.cfg, tak že do něj vložíte " #~ "následující:" #~ msgid "" #~ "\n" #~ "[Kupfer]\n" #~ "keybinding = <Control>space\n" #~ "magickeybinding = <Ctrl><Alt>space\n" #~ " " #~ msgstr "" #~ "\n" #~ "[Kupfer]\n" #~ "keybinding = <Control>space\n" #~ "magickeybinding = <Ctrl><Alt>space\n" #~ " " #~ msgid "" #~ "Now, pressing CtrlAltSpace will summon Kupfer with the current selection in " #~ "focus. Make sure you have installed Kupfer's nautilus plugin, " #~ "then both the currently selected file in Nautilus, or the currently " #~ "selected text in the front application will be selected." #~ msgstr "" #~ "Nyní stisknutí CtrlAltMezerník bude aplikace Kupfer zavolána s aktuálním výběrem v " #~ "zaměření. Ujistěte se, že máte nainstalovaný zásuvný modul Kupfer pro Nautilus, takže potom může být vybrán jak právě vybraný soubor " #~ "ve správci souborů Nautilus, tak právě vybraný text v aktivní aplikaci." #~ msgid "" #~ "Now you can select a word in, say, a web browser, use CtrlAltSpace, and select action Look " #~ "Up to look up the selected word. Or select an image file, use " #~ "CtrlAltSpace, select " #~ "action Scale with object 1000 to scale the image to " #~ "1000 pixels wide!" #~ msgstr "" #~ "Nyní můžete vybrat nějaké slovo, řekněme ve webovém prohlížeči, použít " #~ "CtrlAltMezerník a " #~ "vybrat akci Vyhledat k vyhledání vybraného slova. Nebo vybrat " #~ "nějaký soubor s obrázkem, použít CtrlAltMezerník a vybrat akci Změnit měřítko " #~ "s objektem 1000 ke změně velikosti obrázku na 1000 pixelů na " #~ "šířku." #~ msgid "" #~ "An example useful script is here which changes the rating of Rhythmbox's currently playing song; I have added five scriptlets calling " #~ "rhrating.py with numbers from 0 to 5 to my catalog to " #~ "quickly rate tracks. (This is something that might be integrated into " #~ "Kupfer later)" #~ msgstr "" #~ "Zde je " #~ "ukázkový příklad skriptu, který mění hodnocení skladby právě přehrávané v " #~ "aplikaci Rhythmbox. Když si přidáte pět skriptů nazvaných " #~ "rhrating.py s čísly od 0 do 5 do svého katalogu, můžete " #~ "rychle hodnotit skladby. (Jedná se o něco, co může být do aplikace " #~ "Kupfer později zaintegrováno.)" #~ msgid "" #~ "Kupfer is its own remote control. When Kupfer is " #~ "already running, Kupfer on the command-line will focus its " #~ "window, but there is more you can do: If you invoke kupferQUERY where QUERY is a text string or a " #~ "filename, Kupfer will focus, and select this item. This way, " #~ "you can quickly invoke Kupfer actions even on objects from a " #~ "shell-based context." #~ msgstr "" #~ "Aplikace Kupfer dělá dálkové ovládání sama sobě. Když aplikace " #~ "Kupfer již běží, předá při spuštění programu Kupfer " #~ "na příkazovém řádku zaměření svému oknu, ale umí i další věci: Když " #~ "vyvoláte kupfer DOTAZ, kde DOTAZ je textový řetězec nebo název souboru, aplikace Kupfer " #~ "získá zaměření a vybere tuto položku. Tímto způsobem můžete rychle " #~ "vyvolat akce aplikace Kupfer i pro objekty z kontextu " #~ "vycházejícího z shellu." #~ msgid "" #~ "You can also pipe the output of a command into Kupfer to send " #~ "text to the already running instance of Kupfer." #~ msgstr "" #~ "Můžete také použít na výstupu příkazu rouru napojenou na program " #~ "Kupfer a tak poslat text do již běžící instance aplikace " #~ "Kupfer." #~ msgid "Legal Information." #~ msgstr "právní informace" #~ msgid "" #~ "Kupfer is a program to change, speed up and make everything " #~ "about files and programs more fun on your computer. Kupfer is " #~ "a launcher; you typically use it to summon an application or a document " #~ "quickly by typing parts of its name. It can also do more than getting at " #~ "something quickly: there are different plugins for accessing more objects " #~ "and running custom commands." #~ msgstr "" #~ "Kupfer je program sloužící ke změnám, zrychlení práce a " #~ "provádění všeho možného se soubory a programy na vašem počítači a to vše " #~ "zábavnějším způsobem. Kupfer je spouštěč, který typicky " #~ "použijete k rychlému vyvolání aplikace nebo dokumentu tak, že začnete " #~ "psát jeho název. Umí toho ale víc, než jen rychlý přístup k souboru. Jsou " #~ "zde různé zásuvné moduly pro přístup k dalším objektům a spouštění " #~ "vlastních příkazů." #~ msgid "" #~ "Kupfer is written using Python and has a flexible " #~ "architecture; the implementation is simple and makes the easy things work " #~ "first. One goal is that new plugins can be written quickly without too " #~ "much programming." #~ msgstr "" #~ "Aplikace Kupfer je napsána v jazyce Python a má flexibilní " #~ "architekturu. Provedení je jednoduché a věci prostě pracují na poprvé. " #~ "Jedním z cílů je, aby šli rychle, bez zdlouhavého programování, psát nové " #~ "zásuvné moduly." #~ msgid "" #~ "The program is very inspired by Quicksilver." #~ msgstr "" #~ "Program je silně inspirován aplikací Quicksilver." kupfer-v208/help/de/000077500000000000000000000000001176220042200143635ustar00rootroot00000000000000kupfer-v208/help/de/de.po000066400000000000000000001652041176220042200153230ustar00rootroot00000000000000# German translation of the kupfer manual. # Mario Blättermann , 2009-2011. # msgid "" msgstr "" "Project-Id-Version: kupfer manual\n" "POT-Creation-Date: 2011-04-09 21:16+0000\n" "PO-Revision-Date: 2011-06-23 12:04+0100\n" "Last-Translator: Mario Blättermann \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: German\n" "X-Poedit-Country: GERMANY\n" #: C/plugin-websearch.page:7(desc) msgid "Using the search the web plugin." msgstr "Verwendung des Websuche-Plugins." #: C/plugin-websearch.page:10(app) msgid "Search the Web" msgstr "Websuche" #: C/plugin-websearch.page:13(title) C/plugin-triggers.page:23(title) #: C/plugin-notes.page:22(title) C/plugin-nautilusselection.page:13(title) #: C/plugin-gwibber.page:25(title) C/plugin-favorites.page:22(title) #: C/plugin-calculator.page:21(title) C/plugin-applications.page:19(title) #: C/generalusage.page:10(title) msgid "Basic Usage" msgstr "Grundlagen der Bedienung" #: C/plugin-websearch.page:15(p) msgid "Activate Kupfer and make sure it is in free-text mode (press period)" msgstr "" "Aktivieren Sie Kupfer und stellen Sich sicher, dass es sich im freien " "Textmodus befindet (drücken Sie ».«)" #: C/plugin-websearch.page:17(p) msgid "" "Type in a search query and tap Tab to switch to the action pane." msgstr "" "Geben Sie eine Suchanfrage ein und drücken Sie die Tabulatortaste, " "um zum Aktionsfenster zu wechseln." #: C/plugin-websearch.page:19(p) msgid "" "Type \"Search With\" to find Search the Web's action and tap Tab " "again to switch to the third pane (indirect object)." msgstr "" "Geben Sie »Suchen mit« ein, um zur Websuche-Aktion zu gelangen und drücken " "Sie erneut die Tabulatortatse, um zur dritten Ansicht zu wechseln " "(indirektes Objekt)." #: C/plugin-websearch.page:22(p) msgid "" "Select search engine with the arrow keys and type Return to open " "the search in a web browser." msgstr "" "Wählen Sie die Suchmaschine mit den Pfeiltasten aus und drücken Sie die " "Eingabetaste, um die Suche in einem Webbrowser zu öffnen." #: C/plugin-websearch.page:29(title) msgid "Search Engines" msgstr "Suchmaschinen" #: C/plugin-websearch.page:30(p) msgid "" "The Search the Web plugin uses Firefox' search engines, so you can " "add Search Engines directly in Firefox and Kupfer will " "find them later." msgstr "" "Das Websuche-Plugin nutzt die Suchfunktionen von Firefox. Sie " "können Suchfunktionen direkt in Firefox hinzufügen, so dass sie " "Kupfer später ebenfalls finden und nutzen kann." #: C/plugin-websearch.page:35(p) msgid "" "You can also install custom search plugins directly, only for Kupfer, in the folder:" msgstr "" "Benutzerdefinierte Suchplugins (nur für Kupfer) können sie direkt " "in folgendem Ordner installieren:" #: C/plugin-websearch.page:39(code) #, no-wrap msgid "~/.local/share/kupfer/searchplugins/" msgstr "~/.local/share/kupfer/searchplugins/" #: C/plugin-websearch.page:40(p) msgid "The search engine descriptions must written in OpenSearch format." msgstr "" "Die Beschreibungen für die Suchmaschine müssen im OpenSearch-Format angegeben " "werden." #: C/plugin-triggers.page:7(desc) msgid "Using the triggers plugin." msgstr "Verwendung des Auslöser-Plugins." #: C/plugin-triggers.page:10(app) C/keyboard.page:213(title) msgid "Triggers" msgstr "Auslöser" #: C/plugin-triggers.page:13(title) msgid "Triggers Plugin" msgstr "Auslöser-Plugin" #: C/plugin-triggers.page:14(p) msgid "" "With Triggers you can take a command you would normally perform in " "Kupfer, such as launching an application or opening a document, " "and bind a global key combination to run this command. As long as " "Kupfer is running, any application can have the current focus." msgstr "" "Mit Auslösern können Sie einen Befehl angeben, den Sie " "normalerweise in Kupfer ausführen, und diesen Befehl einer " "globalen Tastenkombination zuordnen. Beispiele dafür sind das Starten einer " "Anwendung oder das Öffnen eines Dokuments. Während Kupfer läuft, " "kann jede Anwendung aktuell fokussiert sein." #: C/plugin-triggers.page:25(title) msgid "Creating a new trigger" msgstr "Anlegen eines neuen Auslösers" #: C/plugin-triggers.page:27(p) msgid "Set up a command in Kupfer that you want to run" msgstr "" "Geben Sie in Kupfer einen Befehl an, den Sie ausführen wollen." #: C/plugin-triggers.page:32(p) msgid "" "Press CtrlReturn to create a " "composed command." msgstr "" "Drücken Sie StrgEingabetaste, um " "einen zusammengesetzten Befehl zu erstellen." #: C/plugin-triggers.page:38(p) msgid "" "Type Tab and select the action Add Trigger... and press " "Return" msgstr "" "Drücken Sie die Tabulatortaste, wählen Sie die Aktion Auslöser " "hinzufügen … und drücken Sie die Eingabetaste." #: C/plugin-triggers.page:44(p) msgid "" "Using the window that appears, press modifier keys and a letter or number key " "to set a global shortcut. An example is pressing and holding " "CtrlAlt and then pressing and " "releasing R to bind CtrlAltR." msgstr "" "Drücken Sie nun Modifikationstasten und eine Buchstaben- oder Zifferntaste, " "um ein globales Tastenkürzel festzulegen. Beispiel: Drücken Sie " "StrgAlt und halten Sie diese Tasten " "gedrückt. Dann drücken Sie R und lassen die Taste wieder los, um " "die Tastenkombination StrgAltR zu verwenden." #: C/plugin-triggers.page:54(title) msgid "Removing a trigger" msgstr "Entfernen eines Auslösers" #: C/plugin-triggers.page:56(p) msgid "" "Find the source Triggers in Kupfer and press " "to see its contents." msgstr "" "Schauen Sie in Kupfer nach den festgelegten Auslösern und " "drücken Sie , um deren Inhalt anzusehen." #: C/plugin-triggers.page:62(p) msgid "" "Find the active trigger in the list and use the action Remove Trigger." msgstr "" "Suchen Sie nach dem aktiven Auslöser in der Liste und wählen Sie Auslöser " "entfernen." #: C/plugin-triggers.page:68(p) msgid "" "Since trigger keyboard shortcuts are global, they can be used from any " "application. Select shortcuts with care so that they do not conflict with " "other functions." msgstr "" "Da die Auslöser-Tastenkombinationen globaler Natur sind, können sie aus jeder " "Anwendung heraus aufgerufen werden. Wählen Sie die Tastenkombinationen mit " "Vorsicht, damit sie nicht mit anderen Funktionen in Konflikt geraten." #: C/plugin-triggers.page:74(title) C/plugin-notes.page:60(title) #: C/plugin-gwibber.page:68(title) C/plugin-favorites.page:38(title) msgid "Power User Tips" msgstr "Profitipps" #: C/plugin-triggers.page:75(p) msgid "" "Proxy objects such as Selected Text, Selected File, Frontmost Window, Last Command et cetera allow very " "powerful triggers." msgstr "" "Proxy-Objekte wie Ausgewählter Text, Ausgewählte Datei, Vorderstes Fenster, Letzter Befehl usw. ermöglichen " "sehr mächtige Auslöser." #: C/plugin-triggers.page:79(p) msgid "" "The application action Launch is special; if you bind a trigger " "using Launch, it will start the application if it is not running, " "but focus the application when it is already running. By contrast, Start " "Again will start the application if it is running or not." msgstr "" "Die Anwendungsaktion Starten ist fallabhängig. Wenn Sie einen " "Auslöser an Starten binden, dann wird die Anwendung gestartet, " "sofern sie noch nicht läuft. Sollte sie jedoch schon laufen, erhält sie den " "Fokus. Im Gegensatz dazu startet die Aktion Erneut starten die " "Anwendung, ganz gleich, ob sie schon läuft oder nicht." #: C/plugin-triggers.page:87(title) msgid "Example Triggers" msgstr "Beispiele für Auslöser" #: C/plugin-triggers.page:90(em) msgid "Text Editor → Launch" msgstr "Texteditor → starten" #: C/plugin-triggers.page:91(p) msgid "Start Text Editor or focus its window if it is already running." msgstr "" "Starten den Texteditor oder fokussiert dessen Fenster, falls er " "schon läuft." #: C/plugin-triggers.page:97(em) msgid "Selected Text → Search With → Google" msgstr "Ausgewählter Text → Suchen mit → Google" #: C/plugin-triggers.page:98(p) msgid "Search the web using the currently selected text." msgstr "Sucht im Web nach dem aktuell ausgewählten Text." #: C/plugin-triggers.page:100(em) msgid "Selected File → Move To → (Downloads Folder)" msgstr "Ausgewählte Datei → Verschieben nach → (Download-Ordner)" #: C/plugin-triggers.page:101(p) msgid "Move the currently selected file to a specific folder" msgstr "Verschiebt die aktuell ausgewählte Datei in einem bestimmten Ordner" #: C/plugin-triggers.page:105(em) msgid "Songs → Search Contents" msgstr "Musiktitel → Inhalte durchsuchen" #: C/plugin-triggers.page:106(p) msgid "" "You may even add a trigger to open a specific subcatalog in Kupfer, for " "example Rhythmbox's songs." msgstr "" "Sie können einen Auslöser festlegen, um in Kupfer einen bestimmten " "unterkatalog zu öffnen, zum Beispiel die Titel in Rhythmbox." #: C/plugin-notes.page:7(desc) msgid "Using the notes plugin." msgstr "Verwendung des Notizen-Plugins." #: C/plugin-notes.page:10(app) C/plugin-calculator.page:37(title) msgid "Notes" msgstr "Notizen" #: C/plugin-notes.page:13(title) msgid "Notes Plugin" msgstr "Notizen-Plugin" #: C/plugin-notes.page:14(p) msgid "" "With Notes you can access or create new notes in either the " "program Gnote or Tomboy. Notes will work " "identically with either application—you can configure which one to use in the " "plugin's information pane in Kupfer Preferences." msgstr "" #: C/plugin-notes.page:24(title) msgid "Creating a new note" msgstr "Erstellen einer neuen Notiz" #: C/plugin-notes.page:26(p) msgid "" "Activate Kupfer and type . to enter text mode, then type in a note " "title" msgstr "" "Aktivieren Sie Kupfer und geben Sie . ein, um in den Textmodus zu " "gelangen. Geben Sie dann den Titel der Notiz ein" #: C/plugin-notes.page:32(p) msgid "" "Type Tab and select the action Create Note and press " "Return." msgstr "" #: C/plugin-notes.page:39(title) msgid "Finding a note by title" msgstr "Suchen nach einer Notiz anhand des Titels" #: C/plugin-notes.page:41(p) msgid "Simply search for the note title in Kupfer" msgstr "Suchen Sie einfach nach dem Titel der Notiz in Kupfer." #: C/plugin-notes.page:45(title) msgid "Finding a note by content" msgstr "Nach einer Notiz anhand des Inhalts suchen" #: C/plugin-notes.page:47(p) msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "search query" msgstr "" "Aktivieren Sie Kupfer und geben Sie . ein, um in den Textmodus zu " "gelangen. Geben Sie dann Ihre Suchanfrage ein" #: C/plugin-notes.page:53(p) msgid "" "Type Tab and select the action Get Note Search Results... " "and press Return." msgstr "" #: C/plugin-notes.page:63(p) msgid "" "You can use the Selected Text object and create a new note with the " "content of the selection." msgstr "" #: C/plugin-nautilusselection.page:7(desc) msgid "Using the selected file plugin." msgstr "Verwendung des »Ausgewählte Datei«-Plugins" #: C/plugin-nautilusselection.page:10(app) msgid "Selected File" msgstr "Ausgewählte Datei" #: C/plugin-nautilusselection.page:14(p) msgid "" "Select a file in the file manager. Open Kupfer and search for the " "object Selected File, which represents the file or files that are " "selected." msgstr "" "Wählen Sie eine Datei in der Dateiverwaltung aus. Öffnen Sie Kupfer und suchen Sie nach dem Objekt Ausgewählte Datei, welches die " "ausgewählte(n) Datei(en) repräsentiert." #: C/plugin-nautilusselection.page:19(p) msgid "" "Instead of searching, you can press CtrlG to directly focus the selected file. See " "for more information." msgstr "" "Anstelle der Suche können Sie StrgG " "drücken, um die ausgewählte Datei direkt zu fokussieren. Weitere " "Informationen hierzu finden Sie in ." #: C/plugin-nautilusselection.page:26(title) msgid "Selected File requires Nautilus" msgstr "Ausgewählte Datei benötigt Nautilus." #: C/plugin-nautilusselection.page:27(p) msgid "" "The selected file plugin works with the Nautilus file browser and " "requires that the extension kupfer_provider.py is installed (it is " "normally installed together with Kupfer). After installing it for " "the first time, Nautilus must start anew before it is active." msgstr "" "Dieses Plugin funktioniert mit der Dateiverwaltung Nautilus und " "benötigt die installierte Erweiterung kupfer_provider.py. Diese " "gehört normalerweise zu einer Kupfer-Installation. Nach der " "Erstinstallation müssen Sie Nautilus neu starten, bevor die " "Erweiterung aktiv wird." #: C/plugin-gwibber.page:7(desc) msgid "Using the Gwibber plugin." msgstr "Verwendung des Gwibber-Plugins." #: C/plugin-gwibber.page:10(app) msgid "Gwibber" msgstr "Gwibber" #: C/plugin-gwibber.page:13(title) msgid "Gwibber Plugin" msgstr "Gwibber-Plugin" #: C/plugin-gwibber.page:14(p) msgid "" "With the Gwibber plugin you can send messages to social networks " "such as Twitter or Identi.ca." msgstr "" "Mit dem Gwibber-Plugin können Sie Nachrichten an soziale Netzwerke " "wie Twitter oder Identi.ca senden." #: C/plugin-gwibber.page:18(p) msgid "" "The plugin requires that the application Gwibber is installed and " "configured for your user. Kupfer will start and use Gwibber's " "service in the background." msgstr "" "Dieses Plugin erfordert es, dass die Anwendung Gwibber installiert " "und für Ihr Benutzerkonto konfiguriert ist. Kupfer startet und " "verwendet den Gwibber-Dienst im Hintergrund." #: C/plugin-gwibber.page:27(title) msgid "Sending a message to all services" msgstr "Eine Nachricht an alle Dienste senden" #: C/plugin-gwibber.page:29(p) msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "message." msgstr "" "Aktivieren Sie Kupfer und drücken Sie die Taste ., um in den " "Textmodus zu gelangen und geben Sie anschließend Ihre Nachricht ein." #: C/plugin-gwibber.page:35(p) msgid "" "Type Tab and select the action Send Message and press " "Return." msgstr "" "Drücken Sie die Tab-Taste und wählen Sie die Aktion Nachricht " "senden. Drücken Sie anschließend die Eingabetaste." #: C/plugin-gwibber.page:42(title) msgid "Sending a message to a specific service" msgstr "Eine Nachricht an einen bestimmten Dienst senden" #: C/plugin-gwibber.page:44(p) msgid "" "Activate Kupfer and search for the service object, for example Identi.ca" msgstr "" "Aktivieren Sie Kupfer und suchen Sie nach dem Dienst, beispielsweise " "Identi.ca." #: C/plugin-gwibber.page:50(p) msgid "Type Tab and select the action Send Message." msgstr "" "Drücken Sie die Tab-Taste und wählen Sie die Aktion Nachricht " "senden." #: C/plugin-gwibber.page:55(p) msgid "" "Type Tab to select the last pane, and type in a message. Press " "Return to send." msgstr "" "Drücken Sie die Tabulatortaste, um die letzte Leiste auszuwählen " "und geben Sie Ihre Nachricht ein. Drücken Sie anschließend die " "Eingabetaste, um sie zu versenden.." #: C/plugin-gwibber.page:61(p) msgid "" "The plugin also provides a source for incoming messages, Gwibber " "Messages and more actions on messages such as Reply, Send " "Private Message etc." msgstr "" #: C/plugin-gwibber.page:71(p) msgid "" "You can use the comma trick if you want to send a message to more " "than one service, but not all, at the same time." msgstr "" #: C/plugin-favorites.page:7(desc) msgid "Using the favorites plugin." msgstr "Verwendung des Favoriten-Plugins." #: C/plugin-favorites.page:10(app) msgid "Favorites" msgstr "Favoriten" #: C/plugin-favorites.page:13(title) msgid "Favorites Plugin" msgstr "Favoriten-Plugin" #: C/plugin-favorites.page:14(p) msgid "" "With Favorites you mark objects, for example files, for quicker " "access. It is a sort of shelf on which you can store objects in Kupfer. " "Objects marked as favorites will also be ranked higher and are adorned with a " "star symbol." msgstr "" #: C/plugin-favorites.page:25(p) msgid "Find an object in Kupfer" msgstr "Ein Objekt in Kupfer suchen" #: C/plugin-favorites.page:30(p) msgid "" "Type Tab and select either the action Add to Favorites or " "Remove from Favorites." msgstr "" #: C/plugin-favorites.page:39(p) msgid "" "If you favorite an object, you can access it in more places. Not only in the " "\"Favorites\" subcatalog, but also as the indirect (secondary) object for " "some actions. For example:" msgstr "" #: C/plugin-favorites.page:45(p) msgid "Command-lines from favorites are quick to access." msgstr "" #: C/plugin-favorites.page:46(p) msgid "" "When scaling images with the Scale... action from the Image " "Tools plugin. This action needs a size description as the third object, " "like \"1024\" or \"1200x800\". If you often scale to the same size, say " "\"1200x800\", add this to favorites, and it will always appear as a " "suggestion for the action." msgstr "" #: C/plugin-favorites.page:54(p) msgid "" "Actions needing an email address as the indirect object will pick up email " "addresses from favorites as well as well." msgstr "" #: C/plugin-calculator.page:7(desc) msgid "Using the calculator plugin." msgstr "Verwendung des Taschenrechner-Plugins." #: C/plugin-calculator.page:10(app) msgid "Calculator" msgstr "Taschenrechner" #: C/plugin-calculator.page:13(title) msgid "Calculator Plugin" msgstr "Taschenrechner-Plugin" #: C/plugin-calculator.page:14(p) msgid "" "The calculator plugin lets you calculate expressions quickly. It can evaluate " "expressions entered as text starting with \"=\". Entering = from command mode " "will start text mode directly with = prefixed for quick access." msgstr "" "Mit dem Taschenrechner-Plugin können Sie Ausdrücke schnell und einfach " "berechnen lassen. Die Berechnung von Ausdrücken ist möglich, welche als Text " "eingegeben werden, beginnend mit »=«. Die Eingabe eines = im Befehlsmodus " "startet direkt den Textmodus, wobei für den schnellen Zugriff der Eingabe ein " "= vorangestellt wird." #: C/plugin-calculator.page:23(p) msgid "Activate Kupfer and type =" msgstr "Aktivieren Sie Kupfer und geben Sie = ein." #: C/plugin-calculator.page:26(p) msgid "" "Type in a mathematical expression using +,-,/,* (and ** for exponentiation)" msgstr "" "Geben Sie einen mathematischen Ausdruck mittels +,-," "/,* ein (und ** für Exponenten)." #: C/plugin-calculator.page:30(p) msgid "Press Return to get the result." msgstr "Drücken Sie die Eingabetaste, um das Ergebnis zu erhalten." #: C/plugin-calculator.page:38(p) msgid "" "The Calculator uses python's math and complex math modules, and parses " "expressions as Python expressions. You may use common mathematical functions, " "such as sqrt, sin, exp and log; " "the command =help will show a list of all defined functions and " "constants." msgstr "" "Der Taschenrechner verwendet die Mathematik- und komplexen Mathematikmodule " "aus Python. Ausdrücke werden als Python-Ausdrücke interpretiert. Sie können " "übliche mathematische Funktionen verwenden, wie beispielsweise sqrt, sin, exp und log. Der Befehl " "=help zeigt eine Liste aller definierten Funktionen und Konstanten." #: C/plugin-calculator.page:47(p) msgid "" "Notice that the power operator in Python is double stars, for example " "=3**3 will evaluate to 27." msgstr "" "Beachten Sie, dass Python als Potenzzeichen einen doppelten Asterisk " "verwendet. Beispielsweise wird die Eingabe =3**3 im Ergebnis zu 27." #: C/plugin-calculator.page:53(p) msgid "To calculate trig functions for angles, convert to radians first:" msgstr "" "Um trigonometrische Funktionen für Winkel berechnen zu lassen, wandeln Sie " "diese zunächst in Radiant um:" #: C/plugin-calculator.page:56(code) #, no-wrap msgid "sin(radians(30)) -> 0.5" msgstr "sin(radians(30)) -> 0.5" #: C/plugin-calculator.page:59(p) msgid "" "The last result is stored as the name _ (an underscore, just like in the " "Python console)." msgstr "" "Das letzte Ergebnis wird als Unterstrich gespeichert (wie in der Python-" "Konsole)." #: C/plugin-applications.page:7(desc) msgid "Using the applications plugin." msgstr "Verwendung des Anwendungen-Plugins." #: C/plugin-applications.page:10(app) msgid "Applications" msgstr "Anwendungen" #: C/plugin-applications.page:13(title) msgid "Applications Plugin" msgstr "Anwendungen-Plugin" #: C/plugin-applications.page:14(p) msgid "Applications provides all installed programs." msgstr "Anwendungen stellt alle installierten Programme bereit." #: C/plugin-applications.page:21(title) msgid "Launching an application" msgstr "Starten einer Anwendung" #: C/plugin-applications.page:23(p) msgid "Activate Kupfer and type an abbreviation of the application name" msgstr "" "Aktivieren Sie Kupfer und geben Sie eine Abkürzung des Anwendungsnamens ein." #: C/plugin-applications.page:28(p) msgid "Press Return to launch the application." msgstr "Drücken Sie die Eingabetaste, um die Anwendung zu starten." #: C/plugin-applications.page:34(title) msgid "Opening a file with a specific application" msgstr "Eine Datei mit einer bestimmten Anwendung öffnen" #: C/plugin-applications.page:36(p) msgid "Select a file in Kupfer" msgstr "Eine Datei in Kupfer auswählen" #: C/plugin-applications.page:41(p) msgid "Type Tab and select the action Open With..." msgstr "" #: C/plugin-applications.page:46(p) msgid "" "Type Tab to select the third (indirect object) pane and in it, " "select the application to open the file with." msgstr "" #: C/plugin-applications.page:53(p) msgid "" "The action Open opens files and folders with the registered default " "application for that specific file type. This can be configured using the " "action Set Default Application...." msgstr "" #: C/plugin-applications.page:58(p) msgid "" "The file type associations are provided by the desktop environment, and " "modifying them here will modify them on the desktop as well. This may not be " "true when not using GNOME or XFCE." msgstr "" #: C/plugin-applications.page:64(title) msgid "Selecting default application for a file type or folders" msgstr "Auswahl der Standardanwendung für einen Dateityp und für Ordner" #: C/plugin-applications.page:66(p) msgid "Select a file or folder in Kupfer" msgstr "Dateien oder Ordner in Kupfer auswählen" #: C/plugin-applications.page:71(p) msgid "" "Type Tab and select the action Set Default Application..." msgstr "" #: C/plugin-applications.page:77(p) msgid "" "Type Tab to select the third (indirect object) pane and in it, " "select the application to always open the file type with." msgstr "" #: C/plugin-applications.page:85(title) msgid "Configuration" msgstr "Konfiguration" #: C/plugin-applications.page:86(p) msgid "" "The configuration option Applications for Desktop Environment in the " "plugin's information pane in Kupfer Preferences determines how " "Kupfer should act with regard to the desktop environment " "configuration—certain applications request not to be shown depending on which " "desktop environment is used. By default, it behaves like GNOME." msgstr "" #: C/moreusage.page:7(desc) msgid "More advanced usage information." msgstr "Erweiterte Informationen zur Benutzung." #: C/moreusage.page:10(title) msgid "Using Kupfer in Depth" msgstr "Fortgeschrittene Verwendung von Kupfer" #: C/moreusage.page:13(title) msgid "Adding Applications and Scripts" msgstr "Eigene Anwendungen und Skripte hinzufügen" #: C/moreusage.page:14(p) msgid "" "Kupfer will show all applications that are configured visible in " "your menu editor." msgstr "" #: C/moreusage.page:18(p) msgid "" "If you want to add an application manually, you can create a new ." "desktop file and place it in one of the standard directories for " "applications, for example ~/.local/share/applications, where " "Kupfer will find it." msgstr "" "Wenn Sie eine benutzerdefinierte Anwendung hinzufügen wollen, dann können Sie " "eine neue *.desktop-Datei dafür erstellen und die Datei an einem der " "Standardorte für Anwendungen ablegen, beispielsweise ~/.local/share/" "applications, wo Kupfer ihn finden kann." #: C/moreusage.page:24(p) msgid "" "If you have a collection of scripts that you want to call from Kupfer, you can add the scripts folder as a catalog directory to Kupfer in the preferences. Scripts that you add to Kupfer's catalog " "this way can be run directly or in the terminal as long as they are " "executable." msgstr "" "Falls sie über eine Skriptsammlung verfügen, die Sie aus Kupfer " "heraus aufrufen wollen, dann können Sie den Skriptordner direkt als Katalog " "in den Einstellungen von Kupfer hinzufügen. Auf diese Weise zum " "Katalog von Kupfer hinzugefügte Skripte können direkt oder im " "Terminal aufgerufen werden, sofern Sie ausführbar sind." #: C/moreusage.page:31(p) msgid "" "You can also save command-lines by using the action Add to Favorites." msgstr "" #: C/moreusage.page:38(title) msgid "Opening Files and Folders" msgstr "Dateien und Ordner öffnen" #: C/moreusage.page:39(p) msgid "" "Using the action Open, files and folders are opened in their " "preferred application. The application associations can be changed, see ." msgstr "" #: C/moreusage.page:47(title) msgid "The Comma Trick" msgstr "Der Komma-Trick" #: C/moreusage.page:48(p) msgid "" "The comma trick allows the user to use actions on many objects at the same " "time." msgstr "" #: C/moreusage.page:52(p) msgid "" "Simply press comma , when an object is selected. The object is put " "on a \"stack\", and you can find yet another file or object, press comma to " "put it on the stack. When you subsequently invoke an action, the action is " "carried out on all of the objects at the same time." msgstr "" #: C/moreusage.page:58(p) msgid "" "Some actions are only \"multiplied\" when used with many objects, other are " "smarter than that:" msgstr "" #: C/moreusage.page:61(p) msgid "" "Selecting many files and using the Create Archive action, all files will be " "packed into the same archive." msgstr "" #: C/moreusage.page:63(p) msgid "" "If you select multiple contacts and use a Send Email action, it creates one " "email directed at all the contacts." msgstr "" #: C/moreusage.page:65(p) msgid "" "If you select multiple subcatalogs (For example Firefox Bookmarks and " "Epiphany Bookmarks) and use Search Contents.., you get a subcatalog search " "restricted to the objects of those two catalogs! You can even bind a trigger " "to this command(!)" msgstr "" #: C/moreusage.page:71(p) msgid "" "The comma trick is directly taken from Quicksilver (the " "example given in the external article should work identically in Kupfer)." msgstr "" #: C/moreusage.page:80(title) msgid "Grab Current Selection" msgstr "Aktuelle Auswahl markieren" #: C/moreusage.page:81(p) msgid "" "To use the current selected text, from any application, with Kupfer, you can configure a global keyboard shortcut for the action Show " "with Selection in Kupfer Preferences." msgstr "" #: C/moreusage.page:85(p) msgid "" "If configured, pressing the global keyboard shortcut will summon Kupfer with the current selection as the focused object." msgstr "" #: C/moreusage.page:90(p) msgid "See " msgstr "Siehe " #: C/moreusage.page:94(title) msgid "Command-line Connection" msgstr "Verbindung zur Befehlszeile" #: C/moreusage.page:95(p) msgid "" "The command kupfer on the command-line will focus Kupfer if it's already running, otherwise it will start it." msgstr "" #: C/moreusage.page:99(p) msgid "" "The command kupfer can be used to send files or text from the " "command-line to Kupfer. For example, if you are using the shell in " "a directory where you have a file called \"report.pdf\", you can focus this " "file in Kupfer by running kupfer report.pdf." msgstr "" "Der Befehl kupfer kann dazu verwendet werden, Dateien oder Text " "aus der Befehlszeile an Kupfer zu übergeben. Wenn Sie " "beispielsweise die Shell in einem Ordner verwenden, in dem sich eine Datei " "namens »report.pdf« befindet, können Sie diese Datei mittels Kupfer markieren, indem Sie kupfer report.pdf aufrufen." #: C/moreusage.page:107(p) msgid "" "You can also send text if you pipe the output of a command into kupfer." msgstr "" #: C/moreusage.page:114(title) msgid "Managing Context and Current Selection" msgstr "Verwaltung des Kontexts und der aktuellen Auswahl" #: C/moreusage.page:115(p) msgid "" "If you find the object you want to use, then invoke an action, Kupfer goes away to perform the action (for example start a program or play a " "song). When you come back to Kupfer, it will still keep the same " "object and action selected. Some actions make sense to be repeated (like " "skipping to the next song) and it can be useful to perform different actions " "on the same object." msgstr "" "Wenn Sie das Objekt gefunden haben, das Sie benötigen, dann rufen sie die " "Aktion auf, und Kupfer verschwindet, um die Aktion auszuführen, " "beispielsweise um ein Programm zu starten oder ein Lied abzuspielen. Wenn Sie " "erneut zu Kupfer zurückkehren, dann ist noch immer die gleiche " "Aktion und das gleiche Objekt ausgewählt. Bei einigen Aktionen ergibt es " "durchaus Sinn, sie zu wiederholen, wie beim Springen zum nächsten " "wiederzugebenden Lied. Es kann nützlich sein, verschiedene Aktionen mit dem " "gleichen Objekt auszuführen." #: C/moreusage.page:123(p) msgid "" "However, you always have the top level catalog reachable when you \"come back" "\" to Kupfer -- say you went into the subcatalog \"Albums\" to " "browse your albums only; you select an album to play, and play it. You come " "back with the album selected -- but your next search will still go over the " "top level catalog, not just albums." msgstr "" "Sie befinden sich für die Suche immer im Katalog der obersten Ebene, wenn Sie " "zu Kupfer »zurückkehren«. Wenn Sie in den Unterkatalog »Alben« " "abtauchen, durchsuchen Sie damit nur die Alben, wählen eines zur Wiedergabe " "aus und lassen es abspielen. Doch Ihre nächste Suche springt wieder in den " "Katalog der obersten Ebene und durchsucht nicht nur die Alben." #: C/moreusage.page:130(p) msgid "" "How to come back into the subcatalog you were in? You do that by simply " "browsing, not searching the first thing you do when you focus Kupfer again. A quick way is to press down-arrow or space to open the browse " "window; think of it as saying \"I want to stay in this subfolder\". With the " "browse window open, your next query will search the current subcatalog." msgstr "" "Wie kommen Sie nun wieder in den Unterkatalog zurück, in welchem Sie bereits " "waren? Durch einfaches Navigieren, nicht durch Suchen nach dem ersten Objekt, " "wenn Sie Kupfer wieder fokussieren. Ein einfacher Weg ist das " "Drücken der Pfeiltaste nach unten oder der Leertaste, um das " "Navigationsfenster zu öffnen. Stellen Sie sich das so vor, als ob Sie sagen " "würden: »Ich will in diesem Unterordner bleiben«. Mit geöffnetem " "Navigationsfenster wird für die Suche nur der aktuell markierte Unterkatalog " "abgefragt." #: C/moreusage.page:137(p) msgid "" "This way you can work both ways -- you can quickly drill down into folders to " "find a file, and when you come back for the next action with Kupfer you can either summon any normal toplevel object (just start typing), or " "stay around where you were, deep in that folder (press space, then type a " "query)." msgstr "" "So schlagen Sie zwei Fliegen mit einer Klappe -- Sie tauchen schnell in " "Unterordner ab, um eine Datei zu finden, und wenn Sie das nächste Mal zu " "Kupfer zurückkehren, können sie entweder jedes gewöhnliche Objekt " "der obersten Ebene erfassen (einfach eintippen!) oder Sie bleiben da, wo Sie " "sind, tief in dem jeweiligen Ordner (Leertaste drücken, dann Abfrage " "eingeben)." #: C/moreusage.page:146(title) msgid "Saving Commands as Files" msgstr "Speichern von Befehlen als Datei" #: C/moreusage.page:147(p) msgid "" "You can use keyboard shortcut for Compose Command (by default it is " "CtrlReturn) to create a command object " "out of the currently focused command in Kupfer. This object can be saved as a " "runnable file if you use the Save As... action. The resulting file " "will can be executed when opened from the file manager (it requires that " "Kupfer is already running)." msgstr "" #: C/managing-plugins.page:7(desc) msgid "Using plugins with Kupfer." msgstr "Verwendung von Plugins in Kupfer." #: C/managing-plugins.page:10(title) msgid "How to Configure Plugins" msgstr "Konfigurieren der Plugins" #: C/managing-plugins.page:12(p) msgid "" "Functionality in Kupfer is organized by extentsion modules called \"plugins" "\". Each plugin provides additional functionality, for example integration " "with an external application." msgstr "" #: C/managing-plugins.page:19(title) msgid "Configuring Plugins" msgstr "Einrichten von Plugins" #: C/managing-plugins.page:21(title) msgid "Open Kupfer Preferences to the Plugins tab" msgstr "" "Öffnen Sie die Kupfer-Einstellungen und wechseln Sie zum Plugins-" "Reiter" #: C/managing-plugins.page:23(p) msgid "Use one of the following methods:" msgstr "Verwenden Sie eine der folgenden Methoden:" #: C/managing-plugins.page:25(p) msgid "" "Click the Kupfer icon in the notification area and select the item " "Preferences" msgstr "" "Klicken Sie auf das Kupfer-Symbol im Benachrichtigungsfeld und wählen Sie den " "Eintrag Einstellungen." #: C/managing-plugins.page:25(item) msgid "." msgstr "." #: C/managing-plugins.page:29(p) msgid "" "Search for the object Kupfer Preferences in Kupfer itself. Press " "Return to open it." msgstr "" "Suchen Sie nach dem Objekt Kupfer-Einstellungen in Kupfer selbst. " "Drücken Sie die Eingabetaste zum Öffnen." #: C/managing-plugins.page:33(p) msgid "Use the keyboard shortcut Ctrl;" msgstr "" "Verwenden Sie das Tastenkürzel Strg;" #: C/managing-plugins.page:39(p) msgid "Select the tab Plugins" msgstr "Wählen Sie den Reiter Plugins." #: C/managing-plugins.page:45(p) msgid "" "Select plugins in the list to read about them, and tick the box next to its " "name to activate the plugin, or untick to deactivate." msgstr "" #: C/managing-plugins.page:49(p) msgid "" "If the plugin has any configurable parameters, they will be visible below the " "plugin information." msgstr "" #: C/managing-plugins.page:53(p) msgid "" "The plugin Kupfer Plugins allows fast access to each plugin's " "information page as well as the action \"Show Source Code\" which reveals the " "implementation." msgstr "" #: C/managing-plugins.page:59(title) msgid "If a Plugin can not be Activated" msgstr "Wenn ein Plugin nicht aktiviert werden kann" #: C/managing-plugins.page:60(p) msgid "" "If a plugin fails to activate because it requires a software module that is " "not available, its plugin information will display a message like this:" msgstr "" "Falls das Laden eines Plugins scheitert, weil ein bestimmtes benötigtes " "Softwaremodul nicht verfügbar ist, wird eine Meldung wie die folgende " "angezeigt:" #: C/managing-plugins.page:65(em) msgid "Plugin could not be read due to an error:" msgstr "Plugin kann wegen eines Fehlers nicht gelesen werden" #: C/managing-plugins.page:66(em) msgid "Python module 'gdata' is needed" msgstr "Python-Modul »gdata« wird benötigt" #: C/managing-plugins.page:67(p) msgid "" "This means that you need to install a needed python module from your " "distribution—and possibly the plugin documentation can tell you how." msgstr "" "Dies bedeutet, dass Sie ein Python-Modul aus ihrer Distribution installieren " "müssen. Die Dokumentation des Plugins gibt möglicherweise dazu nähere " "Auskünfte." #: C/managing-plugins.page:72(p) msgid "" "The plugin may also unexpectedly fail to load, and display a different error " "message. It may then be a program error in either the plugin or Kupfer." msgstr "" "Das Laden des Plugins könnte auch aus unerwartetem Grund scheitern und eine " "andere Fehlermeldung anzeigen. Es kann sich dann um einen Programmierfehler " "entweder im Plugin oder in Kupfer handeln." #: C/managing-plugins.page:79(title) msgid "Installing more Plugins" msgstr "Weitere Plugins installieren" #: C/managing-plugins.page:80(p) msgid "" "You can install custom plugins into the folder ~/.local/share/kupfer/" "plugins. Each plugin is either a single .py file or a " "python package (a folder directly containing a file called __init__.py). Plugins in the package format can include icon files. Python packages " "can even be installed as .zip files." msgstr "" "Sie können benutzerdefinierte Plugins in den Ordner ~/.local/share/" "kupfer/plugins installieren. Jedes Plugin ist entweder eine einzelne " ".py-Datei oder ein Python-Package (ein Ordner, der direkt eine " "Datei namens __init__.py enthält). Plugins im Paketformat können " "Symboldateien enthalten. Python-Pakete können auch als .zip-" "Dateien installiert werden." #: C/managing-plugins.page:88(p) msgid "" "Caution: Treat a plugin as a computer program. Do not install " "untrusted plugins." msgstr "" "Achtung: Betrachten Sie Plugins als Computerprogramme. Installieren " "Sie keine Plugins aus Quellen, die nicht vertrauenswürdig sind." #: C/managing-plugins.page:95(title) msgid "Creating Plugins" msgstr "Plugins erstellen" #: C/managing-plugins.page:96(p) msgid "" "Documentation for plugin creators is available in the file " "Documentation/Manual.rst in the source distribution on the " "webpage at Kupfer Manual. An easy way to start is to copy an existing plugin and experimenting " "with it." msgstr "" #: C/managing-plugins.page:107(title) msgid "The Catalog Tab in Preferences" msgstr "Der Katalog-Reiter in den Einstellungen" #: C/managing-plugins.page:108(p) msgid "" "Each plugin can export a number of sources which contain objects. Normally, " "all these objects are directly accessible from a top-level search. Some " "plugins export so specialized or so many objects that their catalogs should " "better not have their objects exported to the top level. To reach those " "objects, you have to first find the catalog by name, then enter the catalog " "using the action Search Contents." msgstr "" #: C/managing-plugins.page:118(p) msgid "" "In the tab Catalog in Kupfer Preferences, a ticked box " "next to each source means that its objects are exported. An unticked box " "means that its contents are hidden from the top level." msgstr "" #: C/managing-plugins.page:123(p) msgid "" "Note: Kupfer may become slow if large enough subcatalogs are " "exported to the top level." msgstr "" "Hinweis: Kupfer kann sehr langsam werden, falls größere " "Unterkataloge in die oberste Ebene exportiert werden." #: C/license.page:7(desc) msgid "You can copy, modify and share Kupfer." msgstr "Sie können Kupfer kopieren, Änderungen vornehmen und weitergeben." #: C/license.page:10(title) msgid "License" msgstr "Lizenz" #: C/license.page:12(p) msgid "" "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." msgstr "" "Dieses Programm ist freie Software. Sie können es unter den Bedingungen der " "GNU General Public License, wie von der Free Software " "Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß " "Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version." #: C/license.page:18(p) msgid "" "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." msgstr "" "Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, dass es Ihnen " "von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite " "Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. " "Details finden Sie in der GNU General Public License." #: C/license.page:24(p) msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see gnu.org/" "licenses." msgstr "" "Sie sollten eine Kopie der Allgemeinen Öffentlichen GNU-Lizenz zusammen mit " "diesem Programm erhalten haben. Falls nicht finden Sie sie hier." #: C/license.page:30(p) msgid "" "This documentation is licensed under a Creative Commons Attribution-Share Alike 3.0 " "Unported License." msgstr "" "Diese Dokumentation ist lizenziert unter einer Creative Commons Attribution-Share " "Alike 3.0 Unported License." #: C/license.page:36(p) msgid "" "As a special exception, the copyright holders give you permission to copy, " "modify, and distribute the example code contained in this document under the " "terms of your choosing, without restriction." msgstr "" "Als besondere Ausnahme erteilen Ihnen die Urheberrechtsinhaber die " "Genehmigung, den in diesem Dokument enthaltenen Beispielcode ohne " "Einschränkung unter den Bedingungen Ihrer Wahl zu verbreiten." #: C/keyboard.page:7(desc) msgid "Complete keyboard shortcuts reference." msgstr "Vollständige Referenz der Tastenkombinationen." #: C/keyboard.page:10(title) msgid "Command Keys and Accelerator Keys" msgstr "Befehlstasten und Zugriffstasten" #: C/keyboard.page:13(title) C/generalusage.page:12(title) msgid "Keyboard Interface" msgstr "Tastaturschnittstelle" #: C/keyboard.page:14(p) msgid "In command mode, the following keystrokes have special meanings:" msgstr "Im Befehlsmodus haben die folgenden Tastenkürzel besondere Bedeutungen:" #: C/keyboard.page:19(p) C/generalusage.page:34(p) msgid " or Space" msgstr " oder Leertaste" #: C/keyboard.page:20(p) C/generalusage.page:35(p) msgid "Go to the next match" msgstr "Zum nächsten Treffer gehen" #: C/keyboard.page:23(p) C/generalusage.page:38(p) msgid " or ShiftSpace" msgstr "" " oder UmschalttasteLeertaste" #: C/keyboard.page:26(p) C/generalusage.page:41(p) msgid "Go to the previous match" msgstr "Zum vorherigen Treffer gehen" #: C/keyboard.page:29(p) C/generalusage.page:44(p) msgid " or /" msgstr " oder /" #: C/keyboard.page:30(p) C/generalusage.page:45(p) msgid "Descend into an object with content" msgstr "Eintauchen in ein Objekt mit Inhalten" #: C/keyboard.page:33(key) C/generalusage.page:48(key) msgid "Backspace" msgstr "Löschtaste" #: C/keyboard.page:34(p) C/generalusage.page:49(p) msgid "Erase a character from the query. If the query is empty, go up a level" msgstr "" "Das Zeichen aus der Suche löschen. Falls die Suche leer ist, eine Ebene nach " "oben gehen." #: C/keyboard.page:39(key) C/keyboard.page:93(key) C/generalusage.page:54(key) msgid "." msgstr "." #: C/keyboard.page:40(p) C/generalusage.page:55(p) msgid "Activate free-text mode" msgstr "Aktivierung des freien Textmodus" #: C/keyboard.page:43(key) C/keyboard.page:97(key) C/generalusage.page:58(key) msgid "," msgstr "," #: C/keyboard.page:44(p) C/generalusage.page:59(p) msgid "Put selected object on the stack (\"Comma Trick\")" msgstr "Ausgewähltes Objekt zum Stapel hinzufügen (»Komma-Trick«)" #: C/keyboard.page:47(p) msgid "Quick access keys:" msgstr "Schnellzugriffe:" #: C/keyboard.page:53(key) msgid "=" msgstr "=" #: C/keyboard.page:55(p) msgid "" "Activate free-text mode with = prefix (for )" msgstr "" #: C/keyboard.page:61(key) msgid "/" msgstr "/" #: C/keyboard.page:63(p) msgid "" "Activate free-text mode (when nothing is selected) with / prefix " "(to input a rooted path)" msgstr "" #: C/keyboard.page:68(p) C/generalusage.page:62(p) msgid "Additionally:" msgstr "Zusätzlich:" #: C/keyboard.page:72(p) C/generalusage.page:66(p) msgid "" "Return activates the current selection: the command is executed." msgstr "" "Die Eingabetaste aktiviert die aktuelle Auswahl: der Befehl wird " "ausgeführt." #: C/keyboard.page:74(p) C/generalusage.page:68(p) msgid "Escape clears the current selection." msgstr "Die Esc-Taste löscht die aktuelle Auswahl." #: C/keyboard.page:75(p) C/generalusage.page:69(p) msgid "Tab switches between the object and the action pane." msgstr "" "Die Tabulatortaste schaltet zwischen dem Objekt und der " "Aktionsansicht um." #: C/keyboard.page:77(p) msgid "" "The meaning of the keys Space, ., ,, / and = can not be changed, but you can deactivate their " "special meaning with the checkbox Use single keystroke commands in " "Kupfer Preferences." msgstr "" #: C/keyboard.page:86(title) msgid "Kupfer's Keyboard Shortcuts" msgstr "Tastenkombinationen in Kupfer" #: C/keyboard.page:87(p) msgid "" "These keyboard shortcuts are used in Kupfer's interface. They have " "the following meanings and default shortcuts:" msgstr "" "Diese Tastenkürzel werden in der Benutzeroberfläche von Kupfer " "verwendet. Sie haben folgende Bedeutungen und Vorgabeeinstellungen:" #: C/keyboard.page:93(key) C/keyboard.page:97(key) C/keyboard.page:101(key) #: C/keyboard.page:105(key) C/keyboard.page:113(key) C/keyboard.page:117(key) #: C/keyboard.page:121(key) C/keyboard.page:125(key) C/keyboard.page:129(key) #: C/keyboard.page:174(key) msgid "Ctrl" msgstr "Strg" #: C/keyboard.page:94(p) msgid "Toggle text mode" msgstr "Textmodus umschalten" #: C/keyboard.page:98(p) msgid "The comma trick" msgstr "Der Komma-Trick" #: C/keyboard.page:101(key) msgid ";" msgstr ";" #: C/keyboard.page:102(p) msgid "Show preferences window" msgstr "Das Einstellungsfenster anzeigen" #: C/keyboard.page:105(key) msgid "R" msgstr "R" #: C/keyboard.page:106(p) msgid "Reset all" msgstr "Alle zurücksetzen" #: C/keyboard.page:109(key) msgid "Alt" msgstr "Alt" #: C/keyboard.page:109(key) msgid "A" msgstr "A" #: C/keyboard.page:110(p) msgid "Alternate activate" msgstr "Alternative Aktivierung" #: C/keyboard.page:113(key) msgid "Return" msgstr "Eingabe" #: C/keyboard.page:114(p) msgid "Compose command" msgstr "Compose-Befehl" #: C/keyboard.page:117(key) msgid "S" msgstr "S" #: C/keyboard.page:118(p) msgid "Switch to first pane" msgstr "Zur ersten Leiste wechseln" #: C/keyboard.page:121(key) msgid "Q" msgstr "Q" #: C/keyboard.page:122(p) msgid "Select 'Quit'" msgstr "»Beenden« wählen" #: C/keyboard.page:125(key) msgid "G" msgstr "G" #: C/keyboard.page:126(p) msgid "Select 'Selected File'" msgstr "»Ausgewählte Datei« wählen" #: C/keyboard.page:129(key) msgid "T" msgstr "T" #: C/keyboard.page:130(p) msgid "Select 'Selected Text'" msgstr "»Ausgewählter Text« wählen" #: C/keyboard.page:133(key) msgid "F1" msgstr "F1" #: C/keyboard.page:134(p) msgid "Show Help" msgstr "Hilfe anzeigen" #: C/keyboard.page:139(title) msgid "How to configure a keyboard shortcut" msgstr "Einrichtung einer Tastenkombination" #: C/keyboard.page:141(p) C/keyboard.page:185(p) msgid "Open Kupfer Preferences and go to the Keyboard tab." msgstr "" "Öffnen Sie die Kupfer-Einstellungen und wechseln Sie zum Reiter " "Tastatur." #: C/keyboard.page:147(p) msgid "" "Double-click the shorcut's row under Browser Keyboard Shortcuts." msgstr "" #: C/keyboard.page:153(p) msgid "" "Using the window that appears, press modifier keys and a letter or number key " "to set a shortcut. An example is pressing and holding Ctrl and " "then pressing and releasing T to bind CtrlT." msgstr "" #: C/keyboard.page:164(title) msgid "Global Keyboard Shortcuts" msgstr "Globale Tastenkombinationen" #: C/keyboard.page:165(p) msgid "" "Kupfer always listens to global shortcuts, even if it is not " "currently in the foreground." msgstr "" "Kupfer verfolgt stets die Verwendung globaler Tastenkürzel, selbst " "dann, wenn es sich nicht im Vordergrund befindet." #: C/keyboard.page:169(p) msgid "They have the following meanings and default shortcuts:" msgstr "" #: C/keyboard.page:174(key) msgid "Space" msgstr "Leertaste" #: C/keyboard.page:175(p) msgid "Show/hide Kupfer" msgstr "Kupfer anzeigen oder verbergen" #: C/keyboard.page:178(p) msgid "(not configured by default)" msgstr "(keine Voreinstellung)" #: C/keyboard.page:179(p) msgid "Show Kupfer with 'Selection' object focused" msgstr "" #: C/keyboard.page:183(title) msgid "How to configure a global keyboard shortcut" msgstr "Einrichtung einer globalen Tastenkombination" #: C/keyboard.page:191(p) msgid "Double-click the shorcut's row under Global Keyboard Shortcuts." msgstr "" #: C/keyboard.page:197(p) msgid "" "Using the window that appears, press modifier keys and a letter or number key " "to set a global shortcut. An example is pressing and holding Super " "and then pressing and releasing Space to bind SuperSpace." msgstr "" #: C/keyboard.page:206(p) msgid "" "Since these keyboard shortcuts are global, they can be used from any " "application. Select shortcuts with care so that they do not conflict with " "other functions." msgstr "" "Da diese Tastenkürzel globaler Natur sind, können sie von jeder Anwendung " "genutzt werden. Wählen Sie die Tastenkürzel mit Bedacht aus, so dass sie " "keine Konflikte mit anderen Funktionen verursachen." #: C/keyboard.page:214(p) msgid "" "The plugin Triggers allows to activate actions with global keyboard " "shortcuts. Trigger shortcuts do not appear in Kupfer Preferences." msgstr "" "Das Auslöser-Plugin ermöglicht die Aktivierung von Aktionen mit " "globalen Tastenkürzeln. Auslöser-Tastenkürzel werden nicht in den Kupfer-" "Einstellungen angezeigt." #: C/keyboard.page:220(p) msgid "See for more information." msgstr "Siehe für weitere Informationen." #: C/introduction.page:7(desc) msgid "Introduction to Kupfer." msgstr "Einführung in Kupfer." #: C/introduction.page:10(title) msgid "Introduction" msgstr "Einführung" #: C/introduction.page:12(p) msgid "" "Kupfer is an interface for quick and convenient access to " "applications and their documents." msgstr "" "Kupfer ist eine Schnittstelle für den bequemen und schnellen " "Zugriff auf Anwendungen und Dokumente." #: C/introduction.page:16(p) msgid "" "The most typical use is to find a specific application and launch it. We have " "tried to make Kupfer easy to extend with plugins so that this " "quick-access paradigm can be extended to many more objects than just " "applications." msgstr "" #: C/introduction.page:22(p) msgid "" "We hope that using Kupfer feels both very fun and " "different." msgstr "" #: C/introduction.page:26(p) msgid "" "For up-to-date information about Kupfer, visit its homepage." msgstr "" "Weitere Informationen über Kupfer finden Sie auf dessen Webseite." #: C/index.page:9(name) msgid "Ulrik Sverdrup" msgstr "Ulrik Sverdrup" #: C/index.page:10(email) msgid "ulrik.sverdrup@gmail.com" msgstr "ulrik.sverdrup@gmail.com" #: C/index.page:13(year) msgid "2009" msgstr "2009" #: C/index.page:14(name) msgid "Kupfer Development Team" msgstr "Kupfer-Entwicklungsteam" #: C/index.page:17(license) msgid "Creative Commons Share Alike 3.0" msgstr "Creative Commons Share Alike 3.0" #: C/index.page:21(title) msgid "Kupfer Manual" msgstr "Kupfer-Handbuch" #: C/index.page:24(title) msgid "Using Kupfer" msgstr "Kuper verwenden" #: C/index.page:27(title) msgid "About Specific Plugins" msgstr "Infos zu bestimmten Plugins" #: C/generalusage.page:7(desc) msgid "How to start using Kupfer." msgstr "Einführung in Kupfer." #: C/generalusage.page:14(p) msgid "" "Kupfer is to the largest part a keyboard-managed interface to " "applications and documents." msgstr "" "Kupfer ist zum größten Teil eine über die Tastatur bedienbare " "Schnittstelle zu Anwendungen und Dokumenten." #: C/generalusage.page:18(p) msgid "" "Kupfer's default mode is the command mode: If you type a query, kupfer will " "search for a match in its catalog." msgstr "" "Der Standardmodus von Kupfer ist der Befehlsmodus: Sobald Sie eine " "Suche eingeben, sucht Kupfer nach Treffern in seinem Katalog." #: C/generalusage.page:23(p) msgid "" "The arrow keys allow you to browse query matches quite naturally, going to " "the previous or next match, and going up and down in the subcatalogs." msgstr "" "Mit Hilfe der Pfeiltasten können Sie ganz einfach durch die Treffer " "navigieren, in dem Sie zum nächsten oder vorherigen Treffer gehen oder in den " "Unterkatalogen suchen." #: C/generalusage.page:29(p) msgid "In command mode, some keystrokes have special meanings:" msgstr "Im Befehlsmodus haben einige Tastenkürzel besondere Bedeutungen:" #: C/generalusage.page:71(p) msgid "" "By default you show Kupfer using the global keyboard shortcut " "CtrlSpace." msgstr "" "In der Standardeinstellung rufen Sie Kupfer mit der globalen " "Tastenkombination StrgLeertaste auf." #: C/generalusage.page:74(p) msgid "See for more information." msgstr "Siehe für weitere Informationen." #: C/generalusage.page:78(title) msgid "Learning Habits" msgstr "Grundlegendes Verhalten" #: C/generalusage.page:79(p) msgid "" "Kupfer remembers which objects and actions are used the most. When " "beginning to use it, you have to use the arrow keys at times to make it " "precise which object you want to find. After a few uses of that object, " "Kupfer will rank it higher. Objects marked as favorites are also ranked higher." msgstr "" #: C/generalusage.page:90(title) msgid "The Catalog" msgstr "Der Katalog" #: C/generalusage.page:91(p) msgid "" "The Catalog is the collection of objects you can access in Kupfer, such as " "documents and programs." msgstr "" "Der Katalog ist die Objektsammlung, auf die Sie in Kupfer zugreifen können, " "wie Dokumente und Programme." #: C/generalusage.page:96(p) msgid "" "Objects in the catalog that have content, like folders, are marked with an " "arrow. Pressing will enter these objects. Much of the catalog is " "composed of subcatalogs; plugin subcatalogs do in general list objects that " "are also available directly from the top level. Subcatalogs can be used for a " "narrower view or search scope, when using Kupfer." msgstr "" "Objekte im Katalog mit Inhalten, wie Ordner, werden mit einem Pfeil markiert. " "Durch Drücken der Pfeiltaste rechts öffnen Sie diese Objekte. Ein " "Großteil des Katalogs besteht aus Unterkatalogen. Das Einbinden von " "Unterkatalogen als allgemeine Listenobjekte in die oberste Ebene des " "Kataloges ist möglich. Unterkataloge können in Kupfer zur Eingrenzung der " "Ansicht oder des Suchbereichs genutzt werden." #: C/generalusage.page:105(p) msgid "" "Most subcatalogs update their content automatically. For example, the Desktop " "folder source is always up-to-date." msgstr "" "Die meisten Unterkataloge aktualisieren ihre Inhalte automatisch. " "Beispielsweise ist der Katalog für den »Arbeitsfläche«-Ordner immer auf dem " "neuesten Stand." #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/index.page:0(None) msgid "translator-credits" msgstr "Mario Blättermann , 2009-2011" kupfer-v208/help/es/000077500000000000000000000000001176220042200144025ustar00rootroot00000000000000kupfer-v208/help/es/es.po000066400000000000000000002332401176220042200153550ustar00rootroot00000000000000# translation of kupfer.help.master.po to Español # Spanish translation for kupfer. # Copyright (C) 2010 kupfer's COPYRIGHT HOLDER # This file is distributed under the same license as the kupfer package. # Jorge González , 2010, 2011. # Daniel Mustieles , 2011. # msgid "" msgstr "" "Project-Id-Version: kupfer.help.master\n" "POT-Creation-Date: 2011-04-04 17:52+0000\n" "PO-Revision-Date: 2011-04-06 19:44+0200\n" "Last-Translator: Daniel Mustieles \n" "Language-Team: Español \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: KBabel 1.11.4\n" #: C/plugin-websearch.page:7(desc) msgid "Using the search the web plugin." msgstr "Usar el complemento «Buscar en la web»." #: C/plugin-websearch.page:10(app) msgid "Search the Web" msgstr "Buscar en la web" #: C/plugin-websearch.page:13(title) C/plugin-triggers.page:23(title) #: C/plugin-notes.page:22(title) C/plugin-nautilusselection.page:13(title) #: C/plugin-gwibber.page:25(title) C/plugin-favorites.page:22(title) #: C/plugin-calculator.page:21(title) C/plugin-applications.page:19(title) #: C/generalusage.page:10(title) msgid "Basic Usage" msgstr "Uso básico" #: C/plugin-websearch.page:15(p) msgid "Activate Kupfer and make sure it is in free-text mode (press period)" msgstr "" "Active Kupfer y asegúrese de que está en modo de texto libre (pulse «.»)" #: C/plugin-websearch.page:17(p) msgid "" "Type in a search query and tap Tab to switch to the action pane." msgstr "" "Escriba una consulta de búsqueda y pulse Tab para cambiar al " "panel de acciones." #: C/plugin-websearch.page:19(p) msgid "" "Type \"Search With\" to find Search the Web's action and tap Tab " "again to switch to the third pane (indirect object)." msgstr "" "Escriba «Buscar con» para buscar la acción «Buscar en la web» y pulse " "Tab otra vez para cambiar al tercer panel (objeto indirecto)." #: C/plugin-websearch.page:22(p) msgid "" "Select search engine with the arrow keys and type Return to open " "the search in a web browser." msgstr "" "Seleccione el motor de búsqueda con las flechas y pulse Intro " "para abrir la búsqueda en un navegador web." #: C/plugin-websearch.page:29(title) msgid "Search Engines" msgstr "Motores de búsqueda" #: C/plugin-websearch.page:30(p) msgid "" "The Search the Web plugin uses Firefox' search engines, so you " "can add Search Engines directly in Firefox and Kupfer " "will find them later." msgstr "" "El complemento «Buscar en la web» usa los motores de búsqueda de " "Firefox por lo que puede añadir motores de búsqueda directamente " "en Firefox y luego Kupfer los encontrará." #: C/plugin-websearch.page:35(p) msgid "" "You can also install custom search plugins directly, only for Kupfer, in the folder:" msgstr "" "También puede instalar complementos de búsqueda personalizados directamente, " "sólo para Kupfer, en la carpeta:" #: C/plugin-websearch.page:39(code) #, no-wrap msgid "~/.local/share/kupfer/searchplugins/" msgstr "~/.local/share/kupfer/searchplugins/" #: C/plugin-websearch.page:40(p) msgid "The search engine descriptions must written in OpenSearch format." msgstr "" "Las descripciones del motor de búsqueda deben estar escritas en el formato " "OpenSearch." #: C/plugin-triggers.page:7(desc) msgid "Using the triggers plugin." msgstr "Usar el complemento «Disparadores»." #: C/plugin-triggers.page:10(app) C/keyboard.page:213(title) msgid "Triggers" msgstr "Disparadores" #: C/plugin-triggers.page:13(title) msgid "Triggers Plugin" msgstr "Complemento «Disparadores»" #: C/plugin-triggers.page:14(p) msgid "" "With Triggers you can take a command you would normally perform " "in Kupfer, such as launching an application or opening a " "document, and bind a global key combination to run this command. As long as " "Kupfer is running, any application can have the current focus." msgstr "" "Con Disparadores puede coger un comando que ejecute habitualmente " "en Kupfer, como lanzar una aplicación o abrir un documento, y " "asociarle una combinación global de teclas para ejecutarlo. Mientras " "Kupfer esté en ejecución, cualquier aplicación puede tener el " "foco actual." #: C/plugin-triggers.page:25(title) msgid "Creating a new trigger" msgstr "Crear un disparador nuevo" #: C/plugin-triggers.page:27(p) msgid "Set up a command in Kupfer that you want to run" msgstr "Configure en Kupfer el comando que quiere ejecutar" #: C/plugin-triggers.page:32(p) msgid "" "Press CtrlReturn to create a " "composed command." msgstr "" "Pulse CtrlIntro para crear un " "comando compuesto." #: C/plugin-triggers.page:38(p) msgid "" "Type Tab and select the action Add Trigger... and press " "Return" msgstr "" "Pulse Tab y seleccione la acción Añadir disparador... y " "pulse Intro." #: C/plugin-triggers.page:44(p) msgid "" "Using the window that appears, press modifier keys and a letter or number " "key to set a global shortcut. An example is pressing and holding " "CtrlAlt and then pressing and " "releasing R to bind CtrlAltR." msgstr "" "Usando la ventana que aparece, pulse las teclas modificadores y un número o " "una letra para establecer un atajo globa. Un ejemplo es pulsar y mantener " "CtrlAlt y entonces pulsar y soltar " "R para asociar CtrlAltR." #: C/plugin-triggers.page:54(title) msgid "Removing a trigger" msgstr "Quitar un disparador" #: C/plugin-triggers.page:56(p) msgid "" "Find the source Triggers in Kupfer and press to see its contents." msgstr "" "Encuentre la fuente de Disparadores en Kupfer y pulse " " para ver su contenido." #: C/plugin-triggers.page:62(p) msgid "" "Find the active trigger in the list and use the action Remove Trigger." msgstr "" "Busque el disparador activo en la lista y use la acción Quitar " "disparador." #: C/plugin-triggers.page:68(p) msgid "" "Since trigger keyboard shortcuts are global, they can be used from any " "application. Select shortcuts with care so that they do not conflict with " "other functions." msgstr "" "Ya que los disparadores de atajos de teclado son globales, se puede usar " "desde cualquier aplicación. Seleccione los atajos con cuidado para que no " "entren en conflicto con otras funciones." #: C/plugin-triggers.page:74(title) C/plugin-notes.page:60(title) #: C/plugin-gwibber.page:68(title) C/plugin-favorites.page:38(title) msgid "Power User Tips" msgstr "Consejos para usuarios avanzados" #: C/plugin-triggers.page:75(p) msgid "" "Proxy objects such as Selected Text, Selected File, Frontmost Window, Last Command et cetera allow very " "powerful triggers." msgstr "" "Los Objetos del proxy como Texto seleccionado, Archivo " "seleccionado, Ventana de primer plano, Último comando " "etc. admiten disparadores muy potentes." #: C/plugin-triggers.page:79(p) msgid "" "The application action Launch is special; if you bind a trigger " "using Launch, it will start the application if it is not running, " "but focus the application when it is already running. By contrast, Start " "Again will start the application if it is running or not." msgstr "" "La acción de aplicación Lanzar es especial; si asocia un disparador " "usando Lanzar, iniciará la aplicación si no está en ejecución, pero " "dará el foco a la aplicación cuando esté en ejecución. Por el contrario, " "Iniciar de nuevo iniciará la aplicación tanto si está ejecución " "como si no." #: C/plugin-triggers.page:87(title) msgid "Example Triggers" msgstr "Ejemplo de «Disparadores»" #: C/plugin-triggers.page:90(em) msgid "Text Editor → Launch" msgstr "Editor de texto → Lanzar" #: C/plugin-triggers.page:91(p) msgid "" "Start Text Editor or focus its window if it is already running." msgstr "" "Inicie el Editor de texto, o dé el foco a su ventana si ya está en " "ejecución." #: C/plugin-triggers.page:97(em) msgid "Selected Text → Search With → Google" msgstr "Text seleccionado → Buscar con → Google" #: C/plugin-triggers.page:98(p) msgid "Search the web using the currently selected text." msgstr "Buscar en la web usando el texto seleccionado actualmente." #: C/plugin-triggers.page:100(em) msgid "Selected File → Move To → (Downloads Folder)" msgstr "Archivo seleccionado → Mover a → (Carpeta de descargas)" #: C/plugin-triggers.page:101(p) msgid "Move the currently selected file to a specific folder" msgstr "Mover el archivo seleccionado actualmente a una carpeta específica" #: C/plugin-triggers.page:105(em) msgid "Songs → Search Contents" msgstr "Canciones → Buscar contenidos" #: C/plugin-triggers.page:106(p) msgid "" "You may even add a trigger to open a specific subcatalog in Kupfer, for " "example Rhythmbox's songs." msgstr "" "Incluso puede añadir un disparador para abrir un subcatálogo específico en " "Kupfer, por ejemplo, canciones de Rhythmbox." #: C/plugin-notes.page:7(desc) msgid "Using the notes plugin." msgstr "Usar el complemento «Notas»" #: C/plugin-notes.page:10(app) C/plugin-calculator.page:37(title) msgid "Notes" msgstr "Notas" #: C/plugin-notes.page:13(title) msgid "Notes Plugin" msgstr "Complemento «Notas»" #: C/plugin-notes.page:14(p) msgid "" "With Notes you can access or create new notes in either the " "program Gnote or Tomboy. Notes will work " "identically with either application—you can configure which one to use in " "the plugin's information pane in Kupfer Preferences." msgstr "" "Con Notas puede crear notas o acceder a ellas en Gnote " "o en Tomboy. Notas trabajará de manera idéntica con " "cada aplicación; puede configurar cuál de ellas usar en el panel de " "información del complemento en las Preferencias de Kupfer." #: C/plugin-notes.page:24(title) msgid "Creating a new note" msgstr "Crear una nota nueva" #: C/plugin-notes.page:26(p) msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "note title" msgstr "" "Active Kupfer y escriba . para entrar en modo texto, y escriba el " "título de una nota." #: C/plugin-notes.page:32(p) msgid "" "Type Tab and select the action Create Note and press " "Return." msgstr "" "Pulse Tab y seleccione la acción Crear nota y pulse " "Intro." #: C/plugin-notes.page:39(title) msgid "Finding a note by title" msgstr "Buscar una nota por título" #: C/plugin-notes.page:41(p) msgid "Simply search for the note title in Kupfer" msgstr "Simplemente busque el título de la nota en Kupfer." #: C/plugin-notes.page:45(title) msgid "Finding a note by content" msgstr "Buscar una nota por contenido" #: C/plugin-notes.page:47(p) msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "search query" msgstr "" "Active Kupfer y escriba . para entrar en modo texto, y escriba " "una consulta de búsqueda." #: C/plugin-notes.page:53(p) msgid "" "Type Tab and select the action Get Note Search Results... and press Return." msgstr "" "Pulse Tab y seleccione la acción Obtener los resultados de " "búsqueda de notas... y pulse Intro." #: C/plugin-notes.page:63(p) msgid "" "You can use the Selected Text object and create a new note with the " "content of the selection." msgstr "" "Puede usar el objeto Texto seleccionado para crear una nota nueva " "con el contenido de la selección." #: C/plugin-nautilusselection.page:7(desc) msgid "Using the selected file plugin." msgstr "Usar el complemento «Archivo seleccionado»." #: C/plugin-nautilusselection.page:10(app) msgid "Selected File" msgstr "Archivo seleccionado" #: C/plugin-nautilusselection.page:14(p) msgid "" "Select a file in the file manager. Open Kupfer and search for the " "object Selected File, which represents the file or files that are " "selected." msgstr "" "Seleccione un archivo en el gestor de archivos. Abra Kupfer y " "busque el objeto Archivo seleccionado, que representa el archivo " "o los archivos que están seleccionados." #: C/plugin-nautilusselection.page:19(p) msgid "" "Instead of searching, you can press CtrlG to directly focus the selected file. See " "for more information." msgstr "" "En vez de buscar, puede pulsar CtrlG " "para dar el foco directamente al archivo seleccionado. Consulte la para obtener más información." #: C/plugin-nautilusselection.page:26(title) msgid "Selected File requires Nautilus" msgstr "Archivo seleccionado requiere Nautilus" #: C/plugin-nautilusselection.page:27(p) msgid "" "The selected file plugin works with the Nautilus file browser and " "requires that the extension kupfer_provider.py is installed (it " "is normally installed together with Kupfer). After installing it " "for the first time, Nautilus must start anew before it is active." msgstr "" "El complemento «Archivo seleccionado» funciona con el explorador de archivos " "Nautilus y requiere que la extensión kupfer_provider.py esté instalada (normalmente se instala junto con Kupfer). " "Después de instalarla por primera vez, Nautilus debe iniciarse de " "nuevo antes de que esté activa." #: C/plugin-gwibber.page:7(desc) msgid "Using the Gwibber plugin." msgstr "Usar el complemento «Gwibber»." #: C/plugin-gwibber.page:10(app) msgid "Gwibber" msgstr "Gwibber" #: C/plugin-gwibber.page:13(title) msgid "Gwibber Plugin" msgstr "Complemento «Gwibber»" #: C/plugin-gwibber.page:14(p) msgid "" "With the Gwibber plugin you can send messages to social networks " "such as Twitter or Identi.ca." msgstr "" "Con el complemento Gwibber puede enviar mensajes a redes sociales " "como Twitter o Identi.ca." #: C/plugin-gwibber.page:18(p) msgid "" "The plugin requires that the application Gwibber is installed and " "configured for your user. Kupfer will start and use Gwibber's " "service in the background." msgstr "" "El complemento requiere que Gwibber esté instalado y configurado " "para su usuario. Kupfer iniciará y usará el servicio Gwibber en " "segundo plano." #: C/plugin-gwibber.page:27(title) msgid "Sending a message to all services" msgstr "Enviar un mensaje a todos los servicios" #: C/plugin-gwibber.page:29(p) msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "message." msgstr "" "Active Kupfer y escriba . para entrar en modo texto, y escriba un " "mensaje." #: C/plugin-gwibber.page:35(p) msgid "" "Type Tab and select the action Send Message and press " "Return." msgstr "" "Pulse Tab y seleccione la acción Enviar mensaje y pulse " "Intro." #: C/plugin-gwibber.page:42(title) msgid "Sending a message to a specific service" msgstr "Enviar un mensaje un servicio específico" #: C/plugin-gwibber.page:44(p) msgid "" "Activate Kupfer and search for the service object, for example Identi." "ca" msgstr "" "Active Kupfer y busque un objeto del servicio, por ejemplo Identi.ca" #: C/plugin-gwibber.page:50(p) msgid "Type Tab and select the action Send Message." msgstr "Pulse Tab y seleccione la acción Enviar mensaje." #: C/plugin-gwibber.page:55(p) msgid "" "Type Tab to select the last pane, and type in a message. Press " "Return to send." msgstr "" "Pulse Tab para seleccionar el último panel y escriba un mensaje. " "Pulse Intro para enviarlo." #: C/plugin-gwibber.page:61(p) msgid "" "The plugin also provides a source for incoming messages, Gwibber " "Messages and more actions on messages such as Reply, Send " "Private Message etc." msgstr "" "El complemento también proporciona una fuente para mensajes entrantes, " "Mensajes de Gwibber y más acciones sobre mensajes, tales como " "Responder, Enviar mensaje privado etc." #: C/plugin-gwibber.page:71(p) msgid "" "You can use the comma trick if you want to send a message to more " "than one service, but not all, at the same time." msgstr "" "Puede usar el truco de la coma si quiere enviar un mensaje a más de " "un servicio, pero no a todos, al mismo tiempo." #: C/plugin-favorites.page:7(desc) msgid "Using the favorites plugin." msgstr "Usar el complemento «Favoritos»." #: C/plugin-favorites.page:10(app) msgid "Favorites" msgstr "Favoritos" #: C/plugin-favorites.page:13(title) msgid "Favorites Plugin" msgstr "Complemento «Favoritos»" #: C/plugin-favorites.page:14(p) msgid "" "With Favorites you mark objects, for example files, for quicker " "access. It is a sort of shelf on which you can store objects in Kupfer. " "Objects marked as favorites will also be ranked higher and are adorned with " "a star symbol." msgstr "" "Con Favoritos marca objetos, por ejemplo archivos, para un acceso " "más rápido. Es una especie de estantería en la que puede almacenar objetos " "en Kupfer. Los objetos marcados como favoritos se puntuarán más alto y se " "adornarán con una estrella." #: C/plugin-favorites.page:25(p) msgid "Find an object in Kupfer" msgstr "Buscar un objeto en Kupfer" #: C/plugin-favorites.page:30(p) msgid "" "Type Tab and select either the action Add to Favorites " "or Remove from Favorites." msgstr "" "Pulse Tab y elija la acción Añadir a favoritos o " "Quitar de favoritos." #: C/plugin-favorites.page:39(p) msgid "" "If you favorite an object, you can access it in more places. Not only in the " "\"Favorites\" subcatalog, but also as the indirect (secondary) object for " "some actions. For example:" msgstr "" "Si convierte un objeto en favorito, puede acceder a él en más lugares. No " "sólo en el subcatálogo «Favoritos», también como objeto indirecto " "(secundario) para algunas acciones. Por ejemplo:" #: C/plugin-favorites.page:45(p) msgid "Command-lines from favorites are quick to access." msgstr "Las líneas de comandos de los favoritos permiten un acceso rápido." #: C/plugin-favorites.page:46(p) msgid "" "When scaling images with the Scale... action from the Image " "Tools plugin. This action needs a size description as the third " "object, like \"1024\" or \"1200x800\". If you often scale to the same size, " "say \"1200x800\", add this to favorites, and it will always appear as a " "suggestion for the action." msgstr "" "Cuando escala imágenes con la acción Escalar... del complemento " "Herramientas de imagen. Esta acción necesita una descripción como " "tercer objeto, similar a «1024» o «1200x800». Si habitualmente escala al " "mismo tamaño, indique «1200x800», añádalo a favoritos, y aparecerá siempre " "como una sugerencia para la acción." #: C/plugin-favorites.page:54(p) msgid "" "Actions needing an email address as the indirect object will pick up email " "addresses from favorites as well as well." msgstr "" "Las acciones que necesiten una dirección de correo-e como objeto indirecto, " "cogerán las direcciones de correo-e de los favoritos." #: C/plugin-calculator.page:7(desc) msgid "Using the calculator plugin." msgstr "Usar el complemento «Calculadora»." #: C/plugin-calculator.page:10(app) msgid "Calculator" msgstr "Calculadora" #: C/plugin-calculator.page:13(title) msgid "Calculator Plugin" msgstr "Complemento «Calculadora»" #: C/plugin-calculator.page:14(p) msgid "" "The calculator plugin lets you calculate expressions quickly. It can " "evaluate expressions entered as text starting with \"=\". Entering = from " "command mode will start text mode directly with = prefixed for quick access." msgstr "" "El complemento «Calculadora» le permite calcular expresiones rápidamente. " "Puede evaluar expresiones introducidas como texto que comiencen por «=». Si " "introduce «=» en el modo comando se iniciará directamente el modo texto con " "el prefijo «=» para un acceso rápido." #: C/plugin-calculator.page:23(p) msgid "Activate Kupfer and type =" msgstr "Active Kupfer y escriba =." #: C/plugin-calculator.page:26(p) msgid "" "Type in a mathematical expression using +,-,/,* (and ** for exponentiation)" msgstr "" "Escriba una operación matemática usando +,-,/,* (y ** para potencias)." #: C/plugin-calculator.page:30(p) msgid "Press Return to get the result." msgstr "Pulse Intro para obtener el resultado." #: C/plugin-calculator.page:38(p) msgid "" "The Calculator uses python's math and complex math modules, and parses " "expressions as Python expressions. You may use common mathematical " "functions, such as sqrt, sin, exp and " "log; the command =help will show a list of all defined " "functions and constants." msgstr "" "El complemento «Calculadora» usa módulos matemáticos de python y complejos, " "y analiza expresiones como expresiones de Python. Puede usar funciones " "matemáticas comunes, como sqrt, sin, exp y " "log»; el comando =help mostrará una lista de todas las " "funciones y constantes definidas." #: C/plugin-calculator.page:47(p) msgid "" "Notice that the power operator in Python is double stars, for example " "=3**3 will evaluate to 27." msgstr "" "Tenga en cuenta que el operador exponencial en Python son dos asteriscos, " "por ejemplo =3**3 se evaluará como 27." #: C/plugin-calculator.page:53(p) msgid "To calculate trig functions for angles, convert to radians first:" msgstr "" "Para calcular funciones trigonométricas para ángulos, convierta primero a " "radianes:" #: C/plugin-calculator.page:56(code) #, no-wrap msgid "sin(radians(30)) -> 0.5" msgstr "sin(radians(30)) -> 0.5" #: C/plugin-calculator.page:59(p) msgid "" "The last result is stored as the name _ (an underscore, just like in the " "Python console)." msgstr "" "El último resultado se guarda como el nombre «_» (guión bajo, igual que en " "la consola de Python)." #: C/plugin-applications.page:7(desc) msgid "Using the applications plugin." msgstr "Usar el complemento «Aplicaciones»." #: C/plugin-applications.page:10(app) msgid "Applications" msgstr "Aplicaciones" #: C/plugin-applications.page:13(title) msgid "Applications Plugin" msgstr "Complemento «Aplicaciones»" #: C/plugin-applications.page:14(p) msgid "Applications provides all installed programs." msgstr "Aplicaciones proporciona todos los programas instalados." #: C/plugin-applications.page:21(title) msgid "Launching an application" msgstr "Lanzar una aplicación" #: C/plugin-applications.page:23(p) msgid "Activate Kupfer and type an abbreviation of the application name" msgstr "Active Kupfer y escriba la abreviatura del nombre de una aplicación." #: C/plugin-applications.page:28(p) msgid "Press Return to launch the application." msgstr "Pulse Intro para lanzar la aplicación." #: C/plugin-applications.page:34(title) msgid "Opening a file with a specific application" msgstr "Abrir un archivo con una aplicación específica" #: C/plugin-applications.page:36(p) msgid "Select a file in Kupfer" msgstr "Seleccione un archivo en Kupfer" #: C/plugin-applications.page:41(p) msgid "Type Tab and select the action Open With..." msgstr "Pulse Tab y seleccione la acción Abrir con..." #: C/plugin-applications.page:46(p) msgid "" "Type Tab to select the third (indirect object) pane and in it, " "select the application to open the file with." msgstr "" "Pulse Tab para seleccionar el tercer panel (objeto indirecto) y, " "en él, seleccione la aplicación con la que abrir el archivo." #: C/plugin-applications.page:53(p) msgid "" "The action Open opens files and folders with the registered default " "application for that specific file type. This can be configured using the " "action Set Default Application...." msgstr "" "La acción Abrir abre archivos y carpetas con la aplicación " "predeterminada que esté registrada para ese tipo de archivo concreto. Esto " "se puede configurar usando la acción Establecer aplicación " "predeterminada...." #: C/plugin-applications.page:58(p) msgid "" "The file type associations are provided by the desktop environment, and " "modifying them here will modify them on the desktop as well. This may not be " "true when not using GNOME or XFCE." msgstr "" "Las asociaciones de tipos de archivos las proporciona el entorno de " "escritorio, y si las modifica aquí también se modificarán en el escritorio. " "Esto puede no ser cierto cuando no se usa GNOME o XFCE." #: C/plugin-applications.page:64(title) msgid "Selecting default application for a file type or folders" msgstr "" "Seleccionar la aplicación predeterminada para un tipo de archivo o carpetas" #: C/plugin-applications.page:66(p) msgid "Select a file or folder in Kupfer" msgstr "Seleccione un archivo o una carpeta en Kupfer" #: C/plugin-applications.page:71(p) msgid "" "Type Tab and select the action Set Default Application..." msgstr "" "Pulse Tab y seleccione la acción Establecer aplicación " "predeterminada..." #: C/plugin-applications.page:77(p) msgid "" "Type Tab to select the third (indirect object) pane and in it, " "select the application to always open the file type with." msgstr "" "Pulse Tab para seleccionar el tercer panel (objeto indirecto) y, " "en él, seleccione la aplicación con la que abrir siempre el tipo de archivo." #: C/plugin-applications.page:85(title) msgid "Configuration" msgstr "Configuración" #: C/plugin-applications.page:86(p) msgid "" "The configuration option Applications for Desktop Environment in " "the plugin's information pane in Kupfer Preferences determines " "how Kupfer should act with regard to the desktop environment " "configuration—certain applications request not to be shown depending on " "which desktop environment is used. By default, it behaves like GNOME." msgstr "" "La opción de configuración Aplicaciones para el entorno de escritorio en el panel de información del complemento en las Preferencias de " "Kupfer determina cómo debería actuar Kupfer respecto a la " "configuración del entorno de escritorio; algunas solicitudes de aplicaciones " "pueden no mostrarse, dependiendo de qué entorno de escritorio se use. De " "manera predeterminada, se comporta como GNOME." #: C/moreusage.page:7(desc) msgid "More advanced usage information." msgstr "Más información de uso avanzado." #: C/moreusage.page:10(title) msgid "Using Kupfer in Depth" msgstr "Usar Kupfer en profundidad" #: C/moreusage.page:13(title) msgid "Adding Applications and Scripts" msgstr "Añadir aplicaciones y scripts" #: C/moreusage.page:14(p) msgid "" "Kupfer will show all applications that are configured visible in " "your menu editor." msgstr "" "Kupfer mostrará todas las aplicaciones que están configuradas " "como visibles en su editor del menú." #: C/moreusage.page:18(p) msgid "" "If you want to add an application manually, you can create a new ." "desktop file and place it in one of the standard directories for " "applications, for example ~/.local/share/applications, where " "Kupfer will find it." msgstr "" "Si quiere añadir una aplicación manualmente, puede crear un archivo ." "desktop nuevo y colocarlo en uno de las carpetas estándar para " "aplicaciones, por ejemplo ~/.local/share/applications, donde " "Kupfer lo encontrará." #: C/moreusage.page:24(p) msgid "" "If you have a collection of scripts that you want to call from Kupfer, you can add the scripts folder as a catalog directory to Kupfer in the preferences. Scripts that you add to Kupfer's catalog " "this way can be run directly or in the terminal as long as they are " "executable." msgstr "" "Si tiene una colección de scripts a los que quiere llamar desde Kupfer, puede añadir la carpeta de los scripts como un catálogo de carpeta a " "Kupfer en las preferencias. Los scripts que añada al catálogo " "Kupfer de esta manera se puede ejecutar directamente en la " "terminal, siempre y cuando sean ejecutables." #: C/moreusage.page:31(p) msgid "" "You can also save command-lines by using the action Add to Favorites." msgstr "" "También puede guardar líneas de comandos usando la acción Añadir a " "favoritos." #: C/moreusage.page:38(title) msgid "Opening Files and Folders" msgstr "Abrir archivos y carpetas" #: C/moreusage.page:39(p) msgid "" "Using the action Open, files and folders are opened in their " "preferred application. The application associations can be changed, see " "." msgstr "" "Al usar la acción Abrir, los archivos y carpetas se abren con su " "aplicación preferida. Las asociaciones de archivos se pueden cambiar, " "consulte la ." #: C/moreusage.page:47(title) msgid "The Comma Trick" msgstr "El truco de la coma" #: C/moreusage.page:48(p) msgid "" "The comma trick allows the user to use actions on many objects at the same " "time." msgstr "" "El «truco de la coma» permite al usuario utilizar acciones en varios objetos " "a la vez." #: C/moreusage.page:52(p) msgid "" "Simply press comma , when an object is selected. The object is " "put on a \"stack\", and you can find yet another file or object, press comma " "to put it on the stack. When you subsequently invoke an action, the action " "is carried out on all of the objects at the same time." msgstr "" "Simplemente pulse , (coma) cuando un objeto esté seleccionado. El " "objeto se pone en una «pila», y puede encontrar otro archivo u objeto y " "pulsar la coma para añadirlo a la pila. Cuando posteriormente invoca una " "acción, la acción se realiza en todos los objetos al mismo tiempo." #: C/moreusage.page:58(p) msgid "" "Some actions are only \"multiplied\" when used with many objects, other are " "smarter than that:" msgstr "" "Algunas acciones sólo se «multiplican» cuando se utilizan con muchos " "objetos, otras son más inteligentes que eso:" #: C/moreusage.page:61(p) msgid "" "Selecting many files and using the Create Archive action, all files will be " "packed into the same archive." msgstr "" "Al seleccionar varios archivos usando la acción «Crear archivador», todos " "los archivos se empaquetarán en el mismo archivo." #: C/moreusage.page:63(p) msgid "" "If you select multiple contacts and use a Send Email action, it creates one " "email directed at all the contacts." msgstr "" "Si selecciona varios contactos y usa la acción «Enviar correo-e», se crea un " "único correo-e dirigido a todos los contactos." #: C/moreusage.page:65(p) msgid "" "If you select multiple subcatalogs (For example Firefox Bookmarks and " "Epiphany Bookmarks) and use Search Contents.., you get a subcatalog search " "restricted to the objects of those two catalogs! You can even bind a trigger " "to this command(!)" msgstr "" "Si selecciona varios catálogos (por ejemplo, «Marcadores de Firefox» y " "«Marcadores de Epiphany») y usa «Buscar contenido...», obtiene una búsqueda " "de subcatálogo restringida a los objetos de estos dos catálogos. También " "puede asociar un disparador a este comando." #: C/moreusage.page:71(p) msgid "" "The comma trick is directly taken from Quicksilver (the " "example given in the external article should work identically in Kupfer)." msgstr "" "El «truco de la coma» se ha tomado directamente de Quicksilver (el " "ejemplo dado en el artículo interno debería funcionar idénticamente en " "Kupfer)." #: C/moreusage.page:80(title) msgid "Grab Current Selection" msgstr "Capturar la selección actual" #: C/moreusage.page:81(p) msgid "" "To use the current selected text, from any application, with Kupfer, you can configure a global keyboard shortcut for the action Show " "with Selection in Kupfer Preferences." msgstr "" "Para usar el texto seleccionado actualmente desde cualquier aplicación con " "Kupfer, puede configurar un atajo de teclado global para la " "acción Mostrar con selección en las Preferencias de Kupfer." #: C/moreusage.page:85(p) msgid "" "If configured, pressing the global keyboard shortcut will summon " "Kupfer with the current selection as the focused object." msgstr "" "Si está configurado, al pulsar el atajo de teclado global invocará a " "Kupfer con la selección actual como el objeto con el foco." #: C/moreusage.page:90(p) msgid "See " msgstr "Consulte la " #: C/moreusage.page:94(title) msgid "Command-line Connection" msgstr "Conexión con la línea de comandos" #: C/moreusage.page:95(p) msgid "" "The command kupfer on the command-line will focus Kupfer if it's already running, otherwise it will start it." msgstr "" "El comando kupfer en la línea de comandos dará el foco a " "Kupfer si ya está en ejecución, y si no lo está lo iniciará." #: C/moreusage.page:99(p) msgid "" "The command kupfer can be used to send files or text from the " "command-line to Kupfer. For example, if you are using the shell " "in a directory where you have a file called \"report.pdf\", you can focus " "this file in Kupfer by running kupfer report.pdf." msgstr "" "El comando kupfer se puede usar para enviar archivos o texto " "desde la línea de comandos a Kupfer. Por ejemplo, si está usando " "la terminal en una carpeta donde tiene un archivo llamado «informe.pdf» " "puede dar el foco a este archivo en Kupfer ejecutando kupfer " "report.pdf." #: C/moreusage.page:107(p) msgid "" "You can also send text if you pipe the output of a command into kupfer." msgstr "" "También puede enviar texto si redirige la salida de un comando hacia " "kupfer." #: C/moreusage.page:114(title) msgid "Managing Context and Current Selection" msgstr "Gestionar el contexto y la selección actual" #: C/moreusage.page:115(p) msgid "" "If you find the object you want to use, then invoke an action, Kupfer goes away to perform the action (for example start a program or play a " "song). When you come back to Kupfer, it will still keep the same " "object and action selected. Some actions make sense to be repeated (like " "skipping to the next song) and it can be useful to perform different actions " "on the same object." msgstr "" "Si encuentra el objeto que quiere usar, y ejecuta una acción, Kupfer realizará la acción (por ejemplo, ejecutar un programa o reproducir una " "canción). Cuando regrese a Kupfer, todavía mantendrá seleccionado " "el mismo objeto y la misma acción. Algunas acciones tienden a repetirse " "(como omitir la siguiente canción) y puede ser útil realizar diferentes " "acciones sobre un mismo objeto." #: C/moreusage.page:123(p) msgid "" "However, you always have the top level catalog reachable when you \"come back" "\" to Kupfer -- say you went into the subcatalog \"Albums\" to " "browse your albums only; you select an album to play, and play it. You come " "back with the album selected -- but your next search will still go over the " "top level catalog, not just albums." msgstr "" "Sin embargo, siempre tiene el catálogo de nivel superior disponible cuando " "«regresa» a Kupfer: por ejemplo, va al subcatálogo «Álbumes» para " "explorar sólo sus álbumes; selecciona un álbum que reproducir y lo " "reproduce. Vuelve con el álbum seleccionado; pero su siguiente búsqueda " "volverá a ser sobre el nivel superior del catálogo, no sólo sobre los " "álbumes." #: C/moreusage.page:130(p) msgid "" "How to come back into the subcatalog you were in? You do that by simply " "browsing, not searching the first thing you do when you focus Kupfer again. A quick way is to press down-arrow or space to open the browse " "window; think of it as saying \"I want to stay in this subfolder\". With the " "browse window open, your next query will search the current subcatalog." msgstr "" "¿Cómo volver al subcatálogo en el que estaba? Puede hacer simplemente " "navegando, sin buscar la primera cosa que hizo cuando abrió Kupfer otra vez. Una forma rápida es pulsar ↓ o espacio para abrir la ventana " "del navegador; piense en esto diciendo «quiero estar en esta subcarpeta». " "Mientras se abre la ventana del navegador, su siguiente consulta buscará el " "subcatálogo actual." #: C/moreusage.page:137(p) msgid "" "This way you can work both ways -- you can quickly drill down into folders " "to find a file, and when you come back for the next action with Kupfer you can either summon any normal toplevel object (just start typing), " "or stay around where you were, deep in that folder (press space, then type a " "query)." msgstr "" "De este modo, puede trabajar de ambas maneras; puede descender rápidamente " "por las carpetas para encontrar un archivo, y cuando vuelve para la " "siguiente acción con Kupfer también puede llamar a un objeto " "normal del nivel superior (simplemente empiece a escribir), o mantenerse " "donde está, en esa carpeta (pulse espacio y escriba una consulta)." #: C/moreusage.page:146(title) msgid "Saving Commands as Files" msgstr "Guardar comandos como archivos" #: C/moreusage.page:147(p) msgid "" "You can use keyboard shortcut for Compose Command (by default it is " "CtrlReturn) to create a command " "object out of the currently focused command in Kupfer. This object can be " "saved as a runnable file if you use the Save As... action. The " "resulting file will can be executed when opened from the file manager (it " "requires that Kupfer is already running)." msgstr "" "Puede usar un atajo de teclado para Editar comando (el " "predeterminado es CtrlIntro) para " "crear un objeto de comando fuera del comando que actualmente tiene el foco " "en Kupfer. Este objeto se puede guardar como un archivo ejecutable si usa la " "acción Guardar como.... El archivo resultante se puede ejecutar " "cuando se abra con el gestor de archivos (necesita que Kupfer esté en " "ejecución)." #: C/managing-plugins.page:7(desc) msgid "Using plugins with Kupfer." msgstr "Usar complementos con Kupfer." #: C/managing-plugins.page:10(title) msgid "How to Configure Plugins" msgstr "Cómo configurar los complementos" #: C/managing-plugins.page:12(p) msgid "" "Functionality in Kupfer is organized by extentsion modules called \"plugins" "\". Each plugin provides additional functionality, for example integration " "with an external application." msgstr "" "La funcionalidad en Kupfer está organizada por módulos de extensiones " "llamados «complementos». Cada complemento proporciona funcionalidad " "adicional, por ejemplo, integración con una aplicación externa." #: C/managing-plugins.page:19(title) msgid "Configuring Plugins" msgstr "Configurar complementos" #: C/managing-plugins.page:21(title) msgid "Open Kupfer Preferences to the Plugins tab" msgstr "" "Abra las Preferencias de Kupfer y vaya a la pestaña " "Complementos." #: C/managing-plugins.page:23(p) msgid "Use one of the following methods:" msgstr "Use uno de los siguientes métodos:" #: C/managing-plugins.page:25(p) msgid "" "Click the Kupfer icon in the notification area and select the item " "Preferences" msgstr "" "Pulse en el icono de Kupfer en el área de notificación y seleccione el " "elemento Preferencias." #: C/managing-plugins.page:25(item) msgid "." msgstr "." #: C/managing-plugins.page:29(p) msgid "" "Search for the object Kupfer Preferences in Kupfer itself. Press " "Return to open it." msgstr "" "Busque el objetoPreferencias de Kupfer en el propio Kupfer. Pulse " "Intro para abrirlo." #: C/managing-plugins.page:33(p) msgid "Use the keyboard shortcut Ctrl;" msgstr "Use el atajo de teclado Ctrl;" #: C/managing-plugins.page:39(p) msgid "Select the tab Plugins" msgstr "Seleccione la solapa Complementos." #: C/managing-plugins.page:45(p) msgid "" "Select plugins in the list to read about them, and tick the box next to its " "name to activate the plugin, or untick to deactivate." msgstr "" "Seleccione complementos en la lista para leer sobre ellos, y marque la " "casilla junto al nombre para activar el complemento, o desmárquela para " "desactivarlo." #: C/managing-plugins.page:49(p) msgid "" "If the plugin has any configurable parameters, they will be visible below " "the plugin information." msgstr "" "Si el complemento tiene parámetros configurables, estarán visibles debajo de " "la información del complemento." #: C/managing-plugins.page:53(p) msgid "" "The plugin Kupfer Plugins allows fast access to each plugin's " "information page as well as the action \"Show Source Code\" which reveals " "the implementation." msgstr "" "El complemento Complementos de Kupfer permite un acceso rápido a " "la información de cada complemento así como la opción «Mostrar código " "fuente», que muestra su implementación." #: C/managing-plugins.page:59(title) msgid "If a Plugin can not be Activated" msgstr "Si no se puede activar un complemento" #: C/managing-plugins.page:60(p) msgid "" "If a plugin fails to activate because it requires a software module that is " "not available, its plugin information will display a message like this:" msgstr "" "Si un complemento falla al activarlo porque requiere un módulo de software " "que no está disponible, la información del complemento mostrará un mensaje " "como este:" #: C/managing-plugins.page:65(em) msgid "Plugin could not be read due to an error:" msgstr "No se pudo leer el complemento debido a un error:" #: C/managing-plugins.page:66(em) msgid "Python module 'gdata' is needed" msgstr "Se necesita el módulo de Python «gdata»" #: C/managing-plugins.page:67(p) msgid "" "This means that you need to install a needed python module from your " "distribution—and possibly the plugin documentation can tell you how." msgstr "" "Esto significa que debe instalar el módulo de Python requerido para su " "distribución; y posiblemente la documentación del complemento le diga cómo " "hacerlo." #: C/managing-plugins.page:72(p) msgid "" "The plugin may also unexpectedly fail to load, and display a different error " "message. It may then be a program error in either the plugin or Kupfer." msgstr "" "El complemento también puede fallar inesperadamente al cargarse, y mostrar " "un mensaje de error diferente. Puede ser un error de programación, tanto en " "el complemento como en Kupfer." #: C/managing-plugins.page:79(title) msgid "Installing more Plugins" msgstr "Instalar más complementos" #: C/managing-plugins.page:80(p) msgid "" "You can install custom plugins into the folder ~/.local/share/kupfer/" "plugins. Each plugin is either a single .py file or a " "python package (a folder directly containing a file called __init__." "py). Plugins in the package format can include icon files. Python " "packages can even be installed as .zip files." msgstr "" "Puede instalar complementos personalizados en la carpeta ~/.local/" "share/kupfer/plugins. Cada complemento puede ser un único archivo " ".py o un paquete de Python (una carpeta que directamente " "contiene un archivo llamado __init__.py). Los complementos en " "forma de paquete pueden incluir archivos de iconos. Los paquetes de Python " "también se pueden instalar como archivos .zip." #: C/managing-plugins.page:88(p) msgid "" "Caution: Treat a plugin as a computer program. Do not install " "untrusted plugins." msgstr "" "Precaución: considere los complementos como programas. No instale " "complementos que no sean de confianza." #: C/managing-plugins.page:95(title) msgid "Creating Plugins" msgstr "Crear complementos" #: C/managing-plugins.page:96(p) msgid "" "Documentation for plugin creators is available in the file " "Documentation/Manual.rst in the source distribution on the " "webpage at Kupfer " "Manual. An easy way to start is to copy an existing plugin and " "experimenting with it." msgstr "" "La documentación para creadores de complementos está disponible en el " "archivo Documentation/Manual.rst en la distribución fuente o en " "la página web Manual de " "Kupfer. Una manera sencilla de empezar es copiar un complemento " "existente y experimentar con él." #: C/managing-plugins.page:107(title) msgid "The Catalog Tab in Preferences" msgstr "La pestaña Catálogo en «Preferencias»" #: C/managing-plugins.page:108(p) msgid "" "Each plugin can export a number of sources which contain objects. Normally, " "all these objects are directly accessible from a top-level search. Some " "plugins export so specialized or so many objects that their catalogs should " "better not have their objects exported to the top level. To reach those " "objects, you have to first find the catalog by name, then enter the catalog " "using the action Search Contents." msgstr "" "Cada complemento puede exportar un número de fuentes que contienen objetos. " "Normalmente, todos estos objetos son accesibles directamente desde un nivel " "de búsqueda superior. Algunos complementos exportan muchos objetos o muy " "especializados que sus catálogos no debería exportar al nivel superior. Para " "alcanzar esos objetos, primero debe encontrar el catálogo por nombre, y " "entrar en el catálogo usando la acción Buscar contenido." #: C/managing-plugins.page:118(p) msgid "" "In the tab Catalog in Kupfer Preferences, a ticked box " "next to each source means that its objects are exported. An unticked box " "means that its contents are hidden from the top level." msgstr "" "En la pestaña Catálogo en las Preferencias de Kupfer, " "una casilla marcada junto a cada fuente indica que ese objeto está " "exportado. Una casilla desmarcada indica que su contenido está oculto desde " "el nivel superior." #: C/managing-plugins.page:123(p) msgid "" "Note: Kupfer may become slow if large enough subcatalogs are " "exported to the top level." msgstr "" "Nota: Kupfer puede ralentizarse si se exportar muchos catálogos " "grandes al nivel superior." #: C/license.page:7(desc) msgid "You can copy, modify and share Kupfer." msgstr "Puede copiar, modificar y compartir Kupfer." #: C/license.page:10(title) msgid "License" msgstr "Licencia" #: C/license.page:12(p) msgid "" "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." msgstr "" "Este programa es software libre; puede redistribuirlo y/o modificarlo bajo " "los términos de la Licencia Pública General GNU tal como se publica " "por la Free Software Foundation; ya sea la versión 3 de la Licencia, o (a su " "elección) cualquier versión posterior." #: C/license.page:18(p) msgid "" "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." msgstr "" "Este programa se distribuye con la esperanza de que le sea útil, pero SIN " "NINGUNA GARANTÍA; sin incluso la garantía implícita de MERCANTILIDAD o " "IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Para obtener más detalles consulte " "la Licencia Pública General GNU." #: C/license.page:24(p) msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see gnu." "org/licenses." msgstr "" "Debería haber recibido una copia de la Licencia Pública General de GNU junto " "con este programa. Si no es así, consulte gnu.org/licenses." #: C/license.page:30(p) msgid "" "This documentation is licensed under a Creative Commons Attribution-Share Alike 3.0 " "Unported License." msgstr "" "Este trabajo está licenciado bajo una Licencia Creative Commons atribución - compartir " "igual 3.0 sin soporte." #: C/license.page:36(p) msgid "" "As a special exception, the copyright holders give you permission to copy, " "modify, and distribute the example code contained in this document under the " "terms of your choosing, without restriction." msgstr "" "Como excepción especial, los poseedores de los derechos de autor le dan " "permiso para copiar, modificar y distribuir el ejemplo de código contenido " "en este documento bajo los términos que usted elija, sin restricción." #: C/keyboard.page:7(desc) msgid "Complete keyboard shortcuts reference." msgstr "Referencia completa de atajos de teclado." #: C/keyboard.page:10(title) msgid "Command Keys and Accelerator Keys" msgstr "Teclas de comandos y teclas aceleradoras" #: C/keyboard.page:13(title) C/generalusage.page:12(title) msgid "Keyboard Interface" msgstr "Interfaz de teclado" #: C/keyboard.page:14(p) msgid "In command mode, the following keystrokes have special meanings:" msgstr "" "En modo comando, las siguientes pulsaciones del teclado tienen un " "significado especial:" #: C/keyboard.page:19(p) C/generalusage.page:34(p) msgid " or Space" msgstr " o Espacio" #: C/keyboard.page:20(p) C/generalusage.page:35(p) msgid "Go to the next match" msgstr "Ir a la siguiente coincidencia" #: C/keyboard.page:23(p) C/generalusage.page:38(p) msgid " or ShiftSpace" msgstr " o MayúsEspacio" #: C/keyboard.page:26(p) C/generalusage.page:41(p) msgid "Go to the previous match" msgstr "Ir a la coincidencia anterior" #: C/keyboard.page:29(p) C/generalusage.page:44(p) msgid " or /" msgstr " o /" #: C/keyboard.page:30(p) C/generalusage.page:45(p) msgid "Descend into an object with content" msgstr "Descender a un objeto con contenido" #: C/keyboard.page:33(key) C/generalusage.page:48(key) msgid "Backspace" msgstr "Retroceso" #: C/keyboard.page:34(p) C/generalusage.page:49(p) msgid "Erase a character from the query. If the query is empty, go up a level" msgstr "" "Quitar un carácter de la consulta. Si la consulta está vacía, subir un nivel" #: C/keyboard.page:39(key) C/keyboard.page:93(key) C/generalusage.page:54(key) msgid "." msgstr "." #: C/keyboard.page:40(p) C/generalusage.page:55(p) msgid "Activate free-text mode" msgstr "Activar el modo de texto libre" #: C/keyboard.page:43(key) C/keyboard.page:97(key) C/generalusage.page:58(key) msgid "," msgstr "," #: C/keyboard.page:44(p) C/generalusage.page:59(p) msgid "Put selected object on the stack (\"Comma Trick\")" msgstr "Poner un objeto seleccionado en la pila («truco de la coma»)" #: C/keyboard.page:47(p) msgid "Quick access keys:" msgstr "Teclas de acceso rápido:" #: C/keyboard.page:53(key) msgid "=" msgstr "=" #: C/keyboard.page:55(p) msgid "" "Activate free-text mode with = prefix (for )" msgstr "" "Activar el modo de texto libre con el prefijo «=» (para la )" #: C/keyboard.page:61(key) msgid "/" msgstr "/" #: C/keyboard.page:63(p) msgid "" "Activate free-text mode (when nothing is selected) with / " "prefix (to input a rooted path)" msgstr "" "Activar el modo de texto libre (cuando no hay nada seleccionado) con el " "prefijo / (para indicar una ruta desde la raíz)" #: C/keyboard.page:68(p) C/generalusage.page:62(p) msgid "Additionally:" msgstr "Además:" #: C/keyboard.page:72(p) C/generalusage.page:66(p) msgid "" "Return activates the current selection: the command is executed." msgstr "Intro activa la selección actual: el comando se ejecuta." #: C/keyboard.page:74(p) C/generalusage.page:68(p) msgid "Escape clears the current selection." msgstr "Esc limpia la selección actual." #: C/keyboard.page:75(p) C/generalusage.page:69(p) msgid "Tab switches between the object and the action pane." msgstr "Tab cambia entre el objeto y el panel de acciones." #: C/keyboard.page:77(p) msgid "" "The meaning of the keys Space, ., ,, /" " and = can not be changed, but you can deactivate their " "special meaning with the checkbox Use single keystroke commands " "in Kupfer Preferences." msgstr "" "El significado de las teclas Espacio, ., ,, " "/ y = no se puede cambiar, pero puede desactivar su " "significado especial con la casilla Usar comandos de una sola tecla en las Preferencias de Kupfer." #: C/keyboard.page:86(title) msgid "Kupfer's Keyboard Shortcuts" msgstr "Atajos de teclado de Kupfer" #: C/keyboard.page:87(p) msgid "" "These keyboard shortcuts are used in Kupfer's interface. They " "have the following meanings and default shortcuts:" msgstr "" "Estos atajos de teclado se usan en la interfaz de Kupfer. Tienen " "el significado y los atajos siguientes:" #: C/keyboard.page:93(key) C/keyboard.page:97(key) C/keyboard.page:101(key) #: C/keyboard.page:105(key) C/keyboard.page:113(key) C/keyboard.page:117(key) #: C/keyboard.page:121(key) C/keyboard.page:125(key) C/keyboard.page:129(key) #: C/keyboard.page:174(key) msgid "Ctrl" msgstr "Ctrl" #: C/keyboard.page:94(p) msgid "Toggle text mode" msgstr "Alternar modo de texto" #: C/keyboard.page:98(p) msgid "The comma trick" msgstr "El «truco de la coma»" #: C/keyboard.page:101(key) msgid ";" msgstr ";" #: C/keyboard.page:102(p) msgid "Show preferences window" msgstr "Mostrar la ventana de preferencias" #: C/keyboard.page:105(key) msgid "R" msgstr "R" #: C/keyboard.page:106(p) msgid "Reset all" msgstr "Restablecer todo" #: C/keyboard.page:109(key) msgid "Alt" msgstr "Alt" #: C/keyboard.page:109(key) msgid "A" msgstr "A" #: C/keyboard.page:110(p) msgid "Alternate activate" msgstr "Activación alternativa" #: C/keyboard.page:113(key) msgid "Return" msgstr "Devolver" #: C/keyboard.page:114(p) msgid "Compose command" msgstr "Componer comando" #: C/keyboard.page:117(key) msgid "S" msgstr "S" #: C/keyboard.page:118(p) msgid "Switch to first pane" msgstr "Cambiar al primer panel" #: C/keyboard.page:121(key) msgid "Q" msgstr "Q" #: C/keyboard.page:122(p) msgid "Select 'Quit'" msgstr "Seleccionar «Salir»" #: C/keyboard.page:125(key) msgid "G" msgstr "G" #: C/keyboard.page:126(p) msgid "Select 'Selected File'" msgstr "Seleccionar «Archivo seleccionado»" #: C/keyboard.page:129(key) msgid "T" msgstr "T" #: C/keyboard.page:130(p) msgid "Select 'Selected Text'" msgstr "Seleccionar «Texto seleccionado»" #: C/keyboard.page:133(key) msgid "F1" msgstr "F1" #: C/keyboard.page:134(p) msgid "Show Help" msgstr "Mostrar ayuda" #: C/keyboard.page:139(title) msgid "How to configure a keyboard shortcut" msgstr "Cómo configurar un atajo de teclado" #: C/keyboard.page:141(p) C/keyboard.page:185(p) msgid "Open Kupfer Preferences and go to the Keyboard tab." msgstr "" "Abra las Preferencias de Kupfer y vaya a la pestaña Teclado." #: C/keyboard.page:147(p) msgid "" "Double-click the shorcut's row under Browser Keyboard Shortcuts." msgstr "" "Doble pulsación en la fila del atajo, en Atajos de teclado del " "examinador." #: C/keyboard.page:153(p) msgid "" "Using the window that appears, press modifier keys and a letter or number " "key to set a shortcut. An example is pressing and holding Ctrl " "and then pressing and releasing T to bind CtrlT." msgstr "" "Usando la ventana que aparece, pulse las teclas modificadoras y un número o " "una letra para establecer un atajo. Un ejemplo es pulsar y mantener " "Ctrl y entonces pulsar y soltar T para asociar " "CtrlT." #: C/keyboard.page:164(title) msgid "Global Keyboard Shortcuts" msgstr "Atajos de teclado globales" #: C/keyboard.page:165(p) msgid "" "Kupfer always listens to global shortcuts, even if it is not " "currently in the foreground." msgstr "" "Kupfer siempre escucha los atajos globales, aunque actualmente no " "esté en primer plano." #: C/keyboard.page:169(p) msgid "They have the following meanings and default shortcuts:" msgstr "" "Tienen el siguiente significado y los siguientes atajos predeterminados:" #: C/keyboard.page:174(key) msgid "Space" msgstr "Espacio" #: C/keyboard.page:175(p) msgid "Show/hide Kupfer" msgstr "Mostrar/ocultar Kupfer" #: C/keyboard.page:178(p) msgid "(not configured by default)" msgstr "(no configurado de manera predeterminada)" #: C/keyboard.page:179(p) msgid "Show Kupfer with 'Selection' object focused" msgstr "Mostrar Kupfer con el foco en el objeto «Selección»." #: C/keyboard.page:183(title) msgid "How to configure a global keyboard shortcut" msgstr "Cómo configurar un atajo de teclado global" #: C/keyboard.page:191(p) msgid "" "Double-click the shorcut's row under Global Keyboard Shortcuts." msgstr "" "Doble pulsación en la fila del atajo, en Atajos de teclado globales." #: C/keyboard.page:197(p) msgid "" "Using the window that appears, press modifier keys and a letter or number " "key to set a global shortcut. An example is pressing and holding Super and then pressing and releasing Space to bind " "SuperSpace." msgstr "" "Usando la ventana que aparece, pulse las teclas modificadoras y un número o " "una letra para establecer un atajo global. Un ejemplo es pulsar y mantener " "Super y entonces pulsar y soltar Espacio para asociar " "SuperEspacio." #: C/keyboard.page:206(p) msgid "" "Since these keyboard shortcuts are global, they can be used from any " "application. Select shortcuts with care so that they do not conflict with " "other functions." msgstr "" "Ya que estos atajos de teclado son globales, se puede usar desde cualquier " "aplicación. Seleccione los atajos con cuidado para que no entren en " "conflicto con otras funciones." #: C/keyboard.page:214(p) msgid "" "The plugin Triggers allows to activate actions with global keyboard " "shortcuts. Trigger shortcuts do not appear in Kupfer Preferences." msgstr "" "El complemento Disparadores permite activar acciones con atajos de " "teclado globales. Los atajos del disparador no aparecen en las " "Preferencias de Kupfer." #: C/keyboard.page:220(p) msgid "See for more information." msgstr "" "Consulte la para obtener más información." #: C/introduction.page:7(desc) msgid "Introduction to Kupfer." msgstr "Introducción a Kupfer." #: C/introduction.page:10(title) msgid "Introduction" msgstr "Introducción" #: C/introduction.page:12(p) msgid "" "Kupfer is an interface for quick and convenient access to " "applications and their documents." msgstr "" "Kupfer es una interfaz para acceder rápida y cómodamente a " "aplicaciones y a sus documentos." #: C/introduction.page:16(p) msgid "" "The most typical use is to find a specific application and launch it. We " "have tried to make Kupfer easy to extend with plugins so that " "this quick-access paradigm can be extended to many more objects than just " "applications." msgstr "" "El uso más común es para encontrar un aplicación específica y lanzarla. Se " "ha intentado que Kupfer sea fácil de extender con complementos, " "por lo que este paradigma de acceso rápido se puede extender a muchos más " "objetos que sólo aplicaciones." #: C/introduction.page:22(p) msgid "" "We hope that using Kupfer feels both very fun and " "different." msgstr "" "Se espera que usar Kupfer seamuy divertido y " "diferente." #: C/introduction.page:26(p) msgid "" "For up-to-date information about Kupfer, visit its homepage." msgstr "" "Para obtener información actualizada sobre Kupfer visite su página web." #: C/index.page:9(name) msgid "Ulrik Sverdrup" msgstr "Ulrik Sverdrup" #: C/index.page:10(email) msgid "ulrik.sverdrup@gmail.com" msgstr "ulrik.sverdrup@gmail.com" #: C/index.page:13(year) msgid "2009" msgstr "2009" #: C/index.page:14(name) msgid "Kupfer Development Team" msgstr "Equipo de desarrollo de Kupfer" #: C/index.page:17(license) msgid "Creative Commons Share Alike 3.0" msgstr "Creative Commons Share Alike 3.0" #: C/index.page:21(title) msgid "Kupfer Manual" msgstr "Manual de Kupfer" #: C/index.page:24(title) msgid "Using Kupfer" msgstr "Usar Kupfer" #: C/index.page:27(title) msgid "About Specific Plugins" msgstr "Acerca de los complementos específicos" #: C/generalusage.page:7(desc) msgid "How to start using Kupfer." msgstr "Cómo empezar a usar Kupfer." #: C/generalusage.page:14(p) msgid "" "Kupfer is to the largest part a keyboard-managed interface to " "applications and documents." msgstr "" "Kupfer es la parte más grande de una interfaz gestionada por " "teclado de aplicaciones y documentos." #: C/generalusage.page:18(p) msgid "" "Kupfer's default mode is the command mode: If you type a query, kupfer will " "search for a match in its catalog." msgstr "" "El modo predeterminado de Kupfer es en modo comandos: si escribe una " "consulta, Kupfer buscará una coincidencia en su catálogo." #: C/generalusage.page:23(p) msgid "" "The arrow keys allow you to browse query matches quite naturally, going to " "the previous or next match, and going up and down in the subcatalogs." msgstr "" "Las teclas de flechas le permiten examinar las coincidencias de las " "consultas de manera más natural, yendo a la coincidencia anterior o a la " "siguiente, y yendo arriba y abajo en los subcatálogos." #: C/generalusage.page:29(p) msgid "In command mode, some keystrokes have special meanings:" msgstr "" "En modo comando, algunas pulsaciones del teclado tienen un significado " "especial:" #: C/generalusage.page:71(p) msgid "" "By default you show Kupfer using the global keyboard shortcut " "CtrlSpace." msgstr "" "De manera predeterminada, muestre Kupfer usando el atajo de " "teclado global CtrlEspacio." #: C/generalusage.page:74(p) msgid "See for more information." msgstr "Consulte la para obtener más información." #: C/generalusage.page:78(title) msgid "Learning Habits" msgstr "Hábitos de aprendizaje" #: C/generalusage.page:79(p) msgid "" "Kupfer remembers which objects and actions are used the most. " "When beginning to use it, you have to use the arrow keys at times to make it " "precise which object you want to find. After a few uses of that object, " "Kupfer will rank it higher. Objects marked as favorites are also ranked higher." msgstr "" "Kupfer recuerda qué objetos y qué acciones se usan más. Cuando " "empieza a usarlo, a veces tiene que usar las flechas para precisar qué " "objeto quiere encontrar. Después de usar varias veces ese objeto, Kupfer lo " "puntuará más alto. Los objetos marcados como favoritos también se puntúan alto." #: C/generalusage.page:90(title) msgid "The Catalog" msgstr "El catálogo" #: C/generalusage.page:91(p) msgid "" "The Catalog is the collection of objects you can access in Kupfer, such as " "documents and programs." msgstr "" "El catálogo es la colección de objetos a la que puede acceder en Kupfer, " "como documentos y programas." #: C/generalusage.page:96(p) msgid "" "Objects in the catalog that have content, like folders, are marked with an " "arrow. Pressing will enter these objects. Much of the catalog " "is composed of subcatalogs; plugin subcatalogs do in general list objects " "that are also available directly from the top level. Subcatalogs can be used " "for a narrower view or search scope, when using Kupfer." msgstr "" "Los objetos del catálogo que tienen contenidos, como las carpetas, se marcan " "con una flecha. Pulsando entrará en estos objetos. La mayoría " "de los catálogos se componen de subcatálogos; los subcatálogos de " "complementos, en general, listan objetos que también están disponibles " "directamente desde el nivel superior. Al usar Kupfer, se pueden usar los " "subcatálogos para una vista estrecha o un rango de búsqueda." #: C/generalusage.page:105(p) msgid "" "Most subcatalogs update their content automatically. For example, the " "Desktop folder source is always up-to-date." msgstr "" "La mayoría de subcatálogos actualizan su contenido automáticamente. Por " "ejemplo, el catálogo de la carpeta «Escritorio» siempre está actualizado." #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/index.page:0(None) msgid "translator-credits" msgstr "" "Daniel Mustieles , 2011\n" "Jorge González , 2010" #~ msgid "Open Terminal Here" #~ msgstr "Abrir terminal aquí" #~| msgid "" #~| "Open terminal first calls xdg-terminal, then gnome-" #~| "terminal. xdg-terminal is a script to find the user's configured " #~| "terminal program for his/her Desktop Environment. Install xdg-" #~| "terminal if you need this (or install a symlink called " #~| "xdg-terminal)." #~ msgid "" #~ "Open terminal first calls xdg-terminal, then gnome-" #~ "terminal. xdg-terminal is a script to find the user's configured " #~ "terminal program for their Desktop Environment. Install xdg-" #~ "terminal if you need this (or install a symlink called xdg-" #~ "terminal)." #~ msgstr "" #~ "Al abrir una terminal se llama a xdg-terminal, y luego a " #~ "gnome-terminal. «xdg-terminal» es un script para encontrar el " #~ "programa de terminal configurado por el usuario para su entorno de " #~ "escritorio. Instale xdg-terminal si lo necesita (o cree un " #~ "enlace simbólico llamado «xdg-terminal»)." #~ msgid "" #~ "An example useful script is here which changes the rating of Rhythmbox's currently playing song; I have added five scriptlets calling " #~ "rhrating.py with numbers from 0 to 5 to my catalog to " #~ "quickly rate tracks. (This is something that might be integrated into " #~ "Kupfer later)" #~ msgstr "" #~ "Aquí hay un " #~ "ejemplo de script útil, que cambia la valoración de la canción que " #~ "actualmente se está reproduciendo en Rhythmbox; se han añadido " #~ "cinco scriptlets que llaman a rhrating.py con números de 0 a " #~ "5 para valorar canciones rápidamente. (Esto es algo que se debe integrar " #~ "en Kupfer más adelante)" #~ msgid "" #~ "Kupfer is its own remote control. When Kupfer is " #~ "already running, Kupfer on the command-line will focus its " #~ "window, but there is more you can do: If you invoke kupferQUERY where QUERY is a text string or a " #~ "filename, Kupfer will focus, and select this item. This way, " #~ "you can quickly invoke Kupfer actions even on objects from a " #~ "shell-based context." #~ msgstr "" #~ "Kupfer es su propio control remoto. Cuando Kupfer " #~ "ya está en ejecución, Kupfer en la línea de comandos enfocará " #~ "a su ventana, pero hay algo más que puede hacer: si ejecuta " #~ "kupferCONSULTA, donde CONSULTA es una cadena de texto o un nombre de archivo, Kupfer " #~ "enfocará y seleccionará este elemento. De este modo, puede ejecutar " #~ "acciones de Kupfer rápidamente incluso en objetos desde una " #~ "terminal." #~ msgid "" #~ "You can also pipe the output of a command into Kupfer to send " #~ "text to the already running instance of Kupfer." #~ msgstr "" #~ "También puede redirigir la salida de un comando hacia Kupfer " #~ "para enviar texto a la instancia de Kupfer en ejecución." #~ msgid "Additional Keyboard Shortcuts" #~ msgstr "Atajos de teclado adicionales" #, fuzzy #~| msgid "" #~| "The Triggers plugin allows to configure actions to be activated by " #~| "global shortcuts, but triggers can only be configured in that plugin." #~ msgid "" #~ "The plugin Triggers allows to " #~ "configure actions to be activated by global shortcuts, but triggers can " #~ "only be configured in that plugin." #~ msgstr "" #~ "El complemento «Triggers» le permite configurar acciones que se activarán " #~ "con atajos globales, pero los disparadores sólo se pueden configurar en " #~ "ese complemento." #~ msgid "Using Kupfer more conveniently." #~ msgstr "Usar Kupfer de una forma más conveniente." #~ msgid "" #~ "Kupfer listens to global shortcuts, even if Kupfer is not currently in " #~ "the foreground. The most important global shortcut is the shortcut to " #~ "show and hide Kupfer's command window which by default is " #~ "CtrlSpace." #~ msgstr "" #~ "Kupfer escucha los atajos globales, aunque no esté actualmente en primer " #~ "plano. El atajo global más importante es el que muestra y oculta la " #~ "ventana de comandos de Kupfer, que de manera predeterminada es " #~ "CtrlEspacio." #~ msgid "Global Keyboard Shortcuts are configured in Kupfer's preferences." #~ msgstr "" #~ "Los atajos globales de teclado están configurados en las preferencias de " #~ "Kupfer." #~ msgid "" #~ "Install custom plugins in the folder ~/.local/share/kupfer/plugins/" #~ "" #~ msgstr "" #~ "Instale los complementos personalizados en la carpeta ~/.local/" #~ "share/kupfer/plugins/" #~ msgid "" #~ "Kupfer cache, config and data are located in the directories ~/." #~ "cache/kupfer, ~/.config/kupfer and ~/.local/" #~ "share/kupfer." #~ msgstr "" #~ "La caché de Kupfer, la configuración y los datos se ubican en las " #~ "carpetas ~/.cache/kupfer, ~/.config/kupfer y " #~ "~/.local/share/kupfer." #~ msgid "" #~ "You can install custom plugins into ~/.local/share/kupfer/plugins; adding " #~ "to Kupfer's object knowledge can be surprisingly easy, just " #~ "look at the default plugins if you want to create new." #~ msgstr "" #~ "Puede instalar complementos personalizados en ~/.local/share/kupfer/" #~ "plugins; añadirlos al conocimiento de objetos de Kupfer puede " #~ "ser sorprendentemente fácil, simplemente mire los complementos " #~ "predeterminados si quiere crear uno nuevo." #~ msgid "" #~ "To use Kupfer like a pro, you can configure a \"Magic " #~ "Keybinding\" for Kupfer. GUI configuration is not yet " #~ "supported, but edit the configuration file ~/.config/kupfer/kupfer." #~ "cfg to include the following:" #~ msgstr "" #~ "Para usar Kupfer como un profesional, puede configurar una " #~ "«asociación de teclas mágica» para Kupfer. La configuración de " #~ "la IGU todavía no está soportada, pero edite el archivo de configuración " #~ "~/.config/kupfer/kupfer.cfg para incluir lo siguiente:" #~ msgid "" #~ "\n" #~ "[Kupfer]\n" #~ "keybinding = <Control>space\n" #~ "magickeybinding = <Ctrl><Alt>space\n" #~ " " #~ msgstr "" #~ "\n" #~ "[Kupfer]\n" #~ "keybinding = <Control>space\n" #~ "magickeybinding = <Ctrl><Alt>space\n" #~ " " #~ msgid "" #~ "Now, pressing CtrlAltSpace will summon Kupfer with the current selection in " #~ "focus. Make sure you have installed Kupfer's nautilus plugin, " #~ "then both the currently selected file in Nautilus, or the currently " #~ "selected text in the front application will be selected." #~ msgstr "" #~ "Ahora, pulsando CtrlAltEspacio se ejecutará Kupfer con el foco en la selección " #~ "actual. Asegúrese de que tiene instalado el complemento de Kupfer para Nautilus, y entonces se seleccionarán el archivo seleccionado " #~ "en Nautilus, o el texto seleccionado en la aplicación." #~ msgid "" #~ "Now you can select a word in, say, a web browser, use CtrlAltSpace, and select action Look " #~ "Up to look up the selected word. Or select an image file, use " #~ "CtrlAltSpace, select " #~ "action Scale with object 1000 to scale the image to " #~ "1000 pixels wide!" #~ msgstr "" #~ "Ahora puede seleccionar una palabra en, por ejemplo, un navegador web. " #~ "Use CtrlAltEspacio y " #~ "elija la acción Buscar para buscar la palabra seleccionada. O " #~ "seleccione un archivo de imagen, use CtrlAltEspacio, elija la acción Escalar con " #~ "el objeto 1000 para escalar la imagen a 1000 píxeles de " #~ "anchura." #~ msgid "Legal Information." #~ msgstr "Información legal." #~ msgid "" #~ "Kupfer is a program to change, speed up and make everything " #~ "about files and programs more fun on your computer. Kupfer is " #~ "a launcher; you typically use it to summon an application or a document " #~ "quickly by typing parts of its name. It can also do more than getting at " #~ "something quickly: there are different plugins for accessing more objects " #~ "and running custom commands." #~ msgstr "" #~ "Kupfer es un programa para cambiar, acelerar y hacer todo lo " #~ "referente a archivos y programas más ameno en su equioi. Kupfer es un lanzador; generalmente lo usa para lanzar un aplicación o un " #~ "documento rápidamente escribiendo partes de su nombre. También puede " #~ "hacer algo más que acelerar las cosas: hay diferentes complementos para " #~ "acceder a más objetos y ejecutar comandos personalizados." #~ msgid "" #~ "Kupfer is written using Python and has a flexible " #~ "architecture; the implementation is simple and makes the easy things work " #~ "first. One goal is that new plugins can be written quickly without too " #~ "much programming." #~ msgstr "" #~ "Kupfer está escrito en Python y tiene una arquitectura " #~ "flexible; la implementación es sencilla y hace que primero funcionen las " #~ "cosas fáciles. Un objetivo es que los complementos nuevos se puedan " #~ "escribir rápidamente sin demasiada programación." #~ msgid "" #~ "The program is very inspired by Quicksilver." #~ msgstr "" #~ "El programa está muy inspirado en Quicksilver." kupfer-v208/help/fr/000077500000000000000000000000001176220042200144025ustar00rootroot00000000000000kupfer-v208/help/fr/fr.po000066400000000000000000002142301176220042200153530ustar00rootroot00000000000000# French translation for kupfer help. # Copyright (C) 2010-12 kupfer's COPYRIGHT HOLDER # This file is distributed under the same license as the kupfer package. # # AlainLojewski , 2010. # Julien Hardelin , 2011. # Bruno Brouard , 2012. msgid "" msgstr "" "Project-Id-Version: kupfer help master\n" "POT-Creation-Date: 2012-02-17 20:31+0000\n" "PO-Revision-Date: 2012-02-18 12:50+0100\n" "Last-Translator: Bruno Brouard \n" "Language-Team: GNOME French Team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: C/plugin-websearch.page:7(desc) msgid "Using the search the web plugin." msgstr "Utiliser le greffon « Rechercher sur le Web »." #: C/plugin-websearch.page:10(app) msgid "Search the Web" msgstr "Rechercher sur le Web" #: C/plugin-websearch.page:13(title) C/plugin-triggers.page:23(title) #: C/plugin-notes.page:22(title) C/plugin-nautilusselection.page:13(title) #: C/plugin-gwibber.page:25(title) C/plugin-favorites.page:22(title) #: C/plugin-calculator.page:21(title) C/plugin-applications.page:19(title) #: C/generalusage.page:10(title) msgid "Basic Usage" msgstr "Utilisation de base" #: C/plugin-websearch.page:15(p) msgid "Activate Kupfer and make sure it is in free-text mode (press period)" msgstr "" "Activez Kupfer et assurez-vous qu'il est en mode texte libre (appuyez sur la " "touche « point »)" #: C/plugin-websearch.page:17(p) msgid "" "Type in a search query and tap Tab to switch to the action pane." msgstr "" "Saisissez une demande de recherche et appuyez sur Tab pour passer " "dans le volet action." #: C/plugin-websearch.page:19(p) msgid "" "Type \"Search With\" to find Search the Web's action and tap Tab " "again to switch to the third pane (indirect object)." msgstr "" "Saisissez « rechercher avec » pour trouver l'action rechercher sur le Web et " "appuyez à nouveau sur Tab pour passer dans le troisième volet " "(objet indirect)." #: C/plugin-websearch.page:22(p) msgid "" "Select search engine with the arrow keys and type Return to open " "the search in a web browser." msgstr "" "Sélectionnez le moteur de recherche avec les touches fléchées et appuyez sur " "Entrée pour ouvrir la recherche dans un navigateur Web." #: C/plugin-websearch.page:29(title) msgid "Search Engines" msgstr "Moteurs de recherche" #: C/plugin-websearch.page:30(p) msgid "" "The Search the Web plugin uses Firefox' search engines, so you " "can add Search Engines directly in Firefox and Kupfer " "will find them later." msgstr "" "Le greffon « Rechercher sur le Web » utilise les moteurs de recherche de " "Firefox, de sorte que si vous ajoutez des moteurs de recherche " "directement dans Firefox, Kupfer les trouvera " "ultérieurement." #: C/plugin-websearch.page:35(p) msgid "" "You can also install custom search plugins directly, only for Kupfer, in the folder:" msgstr "" "Vous pouvez aussi placer des greffons de recherche personnalisés développés " "spécialement pour Kupfer directement dans le dossier :" #: C/plugin-websearch.page:39(code) #, no-wrap msgid "~/.local/share/kupfer/searchplugins/" msgstr "~/.local/share/kupfer/searchplugins/" #: C/plugin-websearch.page:40(p) msgid "The search engine descriptions must written in OpenSearch format." msgstr "" "Les descriptions du moteur de recherche doivent être écrites dans le format " "OpenSearch." #: C/plugin-triggers.page:7(desc) msgid "Using the triggers plugin." msgstr "Utiliser le greffon Raccourcis déclencheurs." #: C/plugin-triggers.page:10(app) C/keyboard.page:213(title) msgid "Triggers" msgstr "Raccourcis déclencheurs" #: C/plugin-triggers.page:13(title) msgid "Triggers Plugin" msgstr "Greffon « Raccourcis déclencheurs »" #: C/plugin-triggers.page:14(p) msgid "" "With Triggers you can take a command you would normally perform " "in Kupfer, such as launching an application or opening a " "document, and bind a global key combination to run this command. As long as " "Kupfer is running, any application can have the current focus." msgstr "" "Avec les Raccourcis déclencheurs, vous pouvez associer une " "combinaison de touches à une action que vous lanceriez normalement dans " "Kupfer, comme démarrer une application ou ouvrir un document. " "Tant que Kupfer est actif, toute application peut être au premier " "plan." #: C/plugin-triggers.page:25(title) msgid "Creating a new trigger" msgstr "Création d'un nouveau raccourci déclencheur" #: C/plugin-triggers.page:27(p) msgid "Set up a command in Kupfer that you want to run" msgstr "Configurez une commande que vous voulez lancer dans Kupfer." #: C/plugin-triggers.page:32(p) msgid "" "Press CtrlReturn to create a " "composed command." msgstr "" "Appuyez sur CtrlEntrée pour créer une " "commande composée." #: C/plugin-triggers.page:38(p) msgid "" "Type Tab and select the action Add Trigger... and press " "Return" msgstr "" "Appuyez sur Tab, sélectionnez l'action Ajouter un raccourci " "déclencheur... et appuyez sur Entrée." #: C/plugin-triggers.page:44(p) msgid "" "Using the window that appears, press modifier keys and a letter or number " "key to set a global shortcut. An example is pressing and holding " "CtrlAlt and then pressing and " "releasing R to bind CtrlAltR." msgstr "" "Dans la boîte de dialogue qui s'affiche, appuyez sur les touches de " "modification et sur une touche lettre ou chiffre pour définir un raccourci " "global (par exemple en maintenant la pression sur CtrlAlt puis en pressant et relâchant la touche R pour lier CtrlAltR)." #: C/plugin-triggers.page:54(title) msgid "Removing a trigger" msgstr "Suppression d'un raccourci déclencheur" #: C/plugin-triggers.page:56(p) msgid "" "Find the source Triggers in Kupfer and press to see its contents." msgstr "" "Recherchez les raccourcis déclencheurs sources dans Kupfer et appuyez sur pour afficher leurs contenus." #: C/plugin-triggers.page:62(p) msgid "" "Find the active trigger in the list and use the action Remove Trigger." msgstr "" "Recherchez le raccourci déclencheur actif dans la liste et utilisez l'action " "Supprimer le raccourci déclencheur." #: C/plugin-triggers.page:68(p) msgid "" "Since trigger keyboard shortcuts are global, they can be used from any " "application. Select shortcuts with care so that they do not conflict with " "other functions." msgstr "" "Puisque les raccourcis clavier déclencheurs sont globaux, on peut les " "utiliser à partir de n'importe quelle application. Choisissez les raccourcis " "avec soin, de façon à ce qu'ils n'entrent pas en conflit avec d'autres " "fonctions." #: C/plugin-triggers.page:74(title) C/plugin-notes.page:60(title) #: C/plugin-gwibber.page:68(title) C/plugin-favorites.page:38(title) msgid "Power User Tips" msgstr "Astuces utilisateur très puissantes" #: C/plugin-triggers.page:75(p) msgid "" "Proxy objects such as Selected Text, Selected File, Frontmost Window, Last Command et cetera allow very " "powerful triggers." msgstr "" "Les Objets de procuration comme Texte sélectionné, " "Fichier sélectionné, Fenêtre au premier plan, Dernière " "commande etc. permettent de très puissants raccourcis déclencheurs." #: C/plugin-triggers.page:79(p) msgid "" "The application action Launch is special; if you bind a trigger " "using Launch, it will start the application if it is not running, " "but focus the application when it is already running. By contrast, Start " "Again will start the application if it is running or not." msgstr "" "L'action Lancer est spéciale ; si vous constituez un raccourci " "déclencheur utilisant Lancer, il démarrera l'application si elle " "n'est pas encore effective, mais mettra l'application au premier plan si " "elle est déjà lancée. Par contre, Lancer à nouveau démarrera " "l'application qu'elle soit déjà en cours ou non." #: C/plugin-triggers.page:87(title) msgid "Example Triggers" msgstr "Exemples de raccourcis déclencheurs" #: C/plugin-triggers.page:90(em) msgid "Text Editor → Launch" msgstr "Éditeur de texte → Lancer" #: C/plugin-triggers.page:91(p) msgid "" "Start Text Editor or focus its window if it is already running." msgstr "" "Démarrer l'Éditeur de texte ou le mettre au premier plan s'il est " "déjà en cours." #: C/plugin-triggers.page:97(em) msgid "Selected Text → Search With → Google" msgstr "Texte sélectionné → Rechercher avec → Google" #: C/plugin-triggers.page:98(p) msgid "Search the web using the currently selected text." msgstr "Explorer le Web en utilisant le texte actuellement sélectionné." #: C/plugin-triggers.page:100(em) msgid "Selected File → Move To → (Downloads Folder)" msgstr "Fichier sélectionné → Déplacer vers → (Dossier Téléchargements)" #: C/plugin-triggers.page:101(p) msgid "Move the currently selected file to a specific folder" msgstr "" "Déplacer le fichier actuellement sélectionné vers un dossier particulier." #: C/plugin-triggers.page:105(em) msgid "Songs → Search Contents" msgstr "Chansons → Recherche de contenus" #: C/plugin-triggers.page:106(p) msgid "" "You may even add a trigger to open a specific subcatalog in Kupfer, for " "example Rhythmbox's songs." msgstr "" "Vous pouvez même ajouter un raccourci déclencheur pour ouvrir un sous-" "catalogue particulier dans Kupfer, par exemple les chansons de Rhythmbox." #: C/plugin-notes.page:7(desc) msgid "Using the notes plugin." msgstr "Utiliser le greffon « Notes »." #: C/plugin-notes.page:10(app) C/plugin-calculator.page:37(title) msgid "Notes" msgstr "Notes" #: C/plugin-notes.page:13(title) msgid "Notes Plugin" msgstr "Le greffon « Notes »" #: C/plugin-notes.page:14(p) msgid "" "With Notes you can access or create new notes in either the " "program Gnote or Tomboy. Notes will work " "identically with either application—you can configure which one to use in " "the plugin's information pane in Kupfer Preferences." msgstr "" "Avec Notes, vous pouvez accéder à (ou créer) de nouvelles notes " "avec les applications Gnote ou Tomboy. Notes fonctionne indifféremment avec l'une ou l'autre. Vous pouvez définir " "celle que vous souhaitez utiliser à partir du volet d'informations du " "greffon dans les Préférences de Kupfer." #: C/plugin-notes.page:24(title) msgid "Creating a new note" msgstr "Création d'une nouvelle note" #: C/plugin-notes.page:26(p) msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "note title" msgstr "" "Activez Kupfer et appuyez sur . pour passer en mode texte, puis " "saisissez un titre de note." #: C/plugin-notes.page:32(p) msgid "" "Type Tab and select the action Create Note and press " "Return." msgstr "" "Appuyez sur Tab, sélectionnez l'action Notes et appuyez " "sur Entrée." #: C/plugin-notes.page:39(title) msgid "Finding a note by title" msgstr "Recherche d'une note à partir de son titre" #: C/plugin-notes.page:41(p) msgid "Simply search for the note title in Kupfer" msgstr "Recherchez simplement le titre de la note dans Kupfer" #: C/plugin-notes.page:45(title) msgid "Finding a note by content" msgstr "Recherche d'une note à partir de son contenu" #: C/plugin-notes.page:47(p) msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "search query" msgstr "" "Activez Kupfer, appuyez sur . pour passer en mode " "texte, puis saisissez une demande de recherche" #: C/plugin-notes.page:53(p) msgid "" "Type Tab and select the action Get Note Search Results... and press Return." msgstr "" "Appuyez sur Tab, sélectionnez l'action Obtenir le résultat de " "la recherche dans les notes... et appuyez sur Entrée." #: C/plugin-notes.page:63(p) msgid "" "You can use the Selected Text object and create a new note with the " "content of the selection." msgstr "" "Vous pouvez utiliser l'objet Texte sélectionné et créer une " "nouvelle note avec le contenu de la sélection." #: C/plugin-nautilusselection.page:7(desc) msgid "Using the selected file plugin." msgstr "Utiliser le greffon « Fichier sélectionné »." #: C/plugin-nautilusselection.page:10(app) msgid "Selected File" msgstr "Fichier sélectionné" #: C/plugin-nautilusselection.page:14(p) msgid "" "Select a file in the file manager. Open Kupfer and search for the " "object Selected File, which represents the file or files that are " "selected." msgstr "" "Sélectionnez un fichier dans le gestionnaire de fichiers. Ouvrez " "Kupfer et recherchez l'objet Fichier Sélectionné qui " "représente le ou les fichiers sélectionnés." #: C/plugin-nautilusselection.page:19(p) msgid "" "Instead of searching, you can press CtrlG to directly focus the selected file. See " "for more information." msgstr "" "Au lieu de rechercher, vous pouvez appuyer sur CtrlG pour mettre le focus directement sur le fichier " "sélectionné. Consultez pour de plus amples " "informations." #: C/plugin-nautilusselection.page:26(title) msgid "Selected File requires Nautilus" msgstr "Fichier sélectionné a besoin de Nautilus" #: C/plugin-nautilusselection.page:27(p) msgid "" "The selected file plugin works with the Nautilus file browser and " "requires that the extension kupfer_provider.py is installed (it " "is normally installed together with Kupfer). After installing it " "for the first time, Nautilus must start anew before it is active." msgstr "" "Le greffon « Fichier sélectionné » fonctionne avec le navigateur de fichiers " "Nautilus et nécessite que le greffon kupfer_provider.py soit installé (il l'est normalement en même temps que Kupfer). Si vous l'installez pour la première fois, vous devez redémarrer " "Nautilus pour qu'il soit pris en compte." #: C/plugin-gwibber.page:7(desc) msgid "Using the Gwibber plugin." msgstr "Utiliser le greffon « Gwibber »." #: C/plugin-gwibber.page:10(app) msgid "Gwibber" msgstr "Gwibber" #: C/plugin-gwibber.page:13(title) msgid "Gwibber Plugin" msgstr "Le greffon « Gwibber »" #: C/plugin-gwibber.page:14(p) msgid "" "With the Gwibber plugin you can send messages to social networks " "such as Twitter or Identi.ca." msgstr "" "Le greffon Gwibber rend possible l'envoi de messages aux réseaux " "sociaux comme Twitter ou Identi.ca." #: C/plugin-gwibber.page:18(p) msgid "" "The plugin requires that the application Gwibber is installed and " "configured for your user. Kupfer will start and use Gwibber's " "service in the background." msgstr "" "Le greffon exige queGwibber soit installé et configuré avec votre " "compte utilisateur. Kupfer démarre et utilise les services de " "« Gwibber » en arrière-plan." #: C/plugin-gwibber.page:27(title) msgid "Sending a message to all services" msgstr "Envoi d'un message à tous les services" #: C/plugin-gwibber.page:29(p) msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "message." msgstr "" "Activez Kupfer, appuyez sur . pour passer en mode texte, puis " "saisissez un message." #: C/plugin-gwibber.page:35(p) msgid "" "Type Tab and select the action Send Message and press " "Return." msgstr "" "Appuyez sur Tab, sélectionnez l'action Envoyer un message et appuyez sur Entrée." #: C/plugin-gwibber.page:42(title) msgid "Sending a message to a specific service" msgstr "Envoi d'un message à un service particulier" #: C/plugin-gwibber.page:44(p) msgid "" "Activate Kupfer and search for the service object, for example Identi." "ca" msgstr "" "Activez Kupfer et recherchez l'objet service, par exemple " "Identi.ca." #: C/plugin-gwibber.page:50(p) msgid "Type Tab and select the action Send Message." msgstr "" "Appuyez sur Tab et sélectionnez l'action Envoyer un message." #: C/plugin-gwibber.page:55(p) msgid "" "Type Tab to select the last pane, and type in a message. Press " "Return to send." msgstr "" "Appuyez sur Tab pour aller au dernier volet et saisissez-y un " "message. Appuyez sur Entrée pour l'envoyer." #: C/plugin-gwibber.page:61(p) msgid "" "The plugin also provides a source for incoming messages, Gwibber " "Messages and more actions on messages such as Reply, Send " "Private Message etc." msgstr "" "Le greffon fournit également une source pour les messages entrants, les " "Messages Gwibber et d'autres actions sur les messages telles que " "Répondre, Envoyer un message privé, etc." #: C/plugin-gwibber.page:71(p) msgid "" "You can use the comma trick if you want to send a message to more " "than one service, but not all, at the same time." msgstr "" "Utilisez l'Astuce virgule pour envoyer un message à plus d'un " "service, mais pas à tous, en même temps." #: C/plugin-favorites.page:7(desc) msgid "Using the favorites plugin." msgstr "Utiliser le greffon « Favoris »." #: C/plugin-favorites.page:10(app) msgid "Favorites" msgstr "Favoris" #: C/plugin-favorites.page:13(title) msgid "Favorites Plugin" msgstr "Le greffon « Favoris »" #: C/plugin-favorites.page:14(p) msgid "" "With Favorites you mark objects, for example files, for quicker " "access. It is a sort of shelf on which you can store objects in Kupfer. " "Objects marked as favorites will also be ranked higher and are adorned with " "a star symbol." msgstr "" "Avec Favoris vous marquez des objets, par exemple des fichiers, " "pour y accéder plus rapidement. C'est une sorte d'étagère sur laquelle vous " "rangez des objets dans Kupfer. Les objets marqués comme favoris sont aussi " "classés plus haut et sont ornés d'un symbole en forme d'étoile." #: C/plugin-favorites.page:25(p) msgid "Find an object in Kupfer" msgstr "Recherchez un objet dans Kupfer" #: C/plugin-favorites.page:30(p) msgid "" "Type Tab and select either the action Add to Favorites " "or Remove from Favorites." msgstr "" "Appuyez sur Tab et sélectionnez Ajouter aux favoris ou " "Supprimer des favoris." #: C/plugin-favorites.page:39(p) msgid "" "If you favorite an object, you can access it in more places. Not only in the " "\"Favorites\" subcatalog, but also as the indirect (secondary) object for " "some actions. For example:" msgstr "" "Si vous avez marqué un objet comme favori, vous pouvez le retrouver à " "plusieurs endroits ; pas seulement dans le sous-catalogue « Favoris », mais " "aussi comme objet indirect (secondaire) pour certaines actions. Par exemple :" #: C/plugin-favorites.page:45(p) msgid "Command-lines from favorites are quick to access." msgstr "Accès rapide aux lignes de commande des favoris." #: C/plugin-favorites.page:46(p) msgid "" "When scaling images with the Scale... action from the Image " "Tools plugin. This action needs a size description as the third " "object, like \"1024\" or \"1200x800\". If you often scale to the same size, " "say \"1200x800\", add this to favorites, and it will always appear as a " "suggestion for the action." msgstr "" "Mise à l'échelle d'images avec l'action Mise à l'échelle... du " "greffon Outils d'image. Cette action nécessite une définition de " "la taille de l'objet tiers, comme « 1024 » ou « 1200x800 ». Si vous mettez " "souvent à l'échelle à la même taille, disons « 1200x800 », ajoutez-la aux " "favoris et ainsi elle s'affichera toujours en suggestion pour cette action." #: C/plugin-favorites.page:54(p) msgid "" "Actions needing an email address as the indirect object will pick up email " "addresses from favorites as well as well." msgstr "" "Les actions qui nécessitent une adresse courriel comme objet indirect " "peuvent aussi bien la récupérer dans les favoris." #: C/plugin-calculator.page:7(desc) msgid "Using the calculator plugin." msgstr "Utiliser le greffon « Calculateur »." #: C/plugin-calculator.page:10(app) msgid "Calculator" msgstr "Calculateur" #: C/plugin-calculator.page:13(title) msgid "Calculator Plugin" msgstr "Le greffon « Calculateur »" #: C/plugin-calculator.page:14(p) msgid "" "The calculator plugin lets you calculate expressions quickly. It can " "evaluate expressions entered as text starting with \"=\". Entering = from " "command mode will start text mode directly with = prefixed for quick access." msgstr "" "Le greffon « Calculateur » vous permet de calculer rapidement des " "expressions. Il sait reconnaître les textes commençant par « = » comme une " "expression. Saisir « = » en ligne de commande démarre le mode texte avec le " "préfixe « = » pour un accès rapide." #: C/plugin-calculator.page:23(p) msgid "Activate Kupfer and type =" msgstr "Activez Kupfer et appuyez sur =" #: C/plugin-calculator.page:26(p) msgid "" "Type in a mathematical expression using +,-,/,* (and ** for exponentiation)" msgstr "" "Saisissez une expression mathématique avec +,-,/,* (et ** pour l'exponentiation)" #: C/plugin-calculator.page:30(p) msgid "Press Return to get the result." msgstr "Appuyez sur Entrée pour obtenir le résultat." #: C/plugin-calculator.page:38(p) msgid "" "The Calculator uses python's math and complex math modules, and parses " "expressions as Python expressions. You may use common mathematical " "functions, such as sqrt, sin, exp and " "log; the command =help will show a list of all defined " "functions and constants." msgstr "" "Le calculateur utilise les modules mathématiques et mathématiques complexes " "du langage Python et analyse les expressions comme étant des expressions " "Python. Vous pouvez utiliser les fonctions mathématiques standards, comme " "sqrt, sin, exp et log ; la " "commande =help affiche une liste de toutes les fonctions et de " "toutes les constantes disponibles." #: C/plugin-calculator.page:47(p) msgid "" "Notice that the power operator in Python is double stars, for example " "=3**3 will evaluate to 27." msgstr "" "Veuillez noter que l'opérateur de mise à la puissance en Python est deux " "étoiles ; par exemple, =3**3 donne 27." #: C/plugin-calculator.page:53(p) msgid "To calculate trig functions for angles, convert to radians first:" msgstr "" "Pour calculer les fonctions trigonométriques des angles, vous devez d'abord " "les convertir en radians :" #: C/plugin-calculator.page:56(code) #, no-wrap msgid "sin(radians(30)) -> 0.5" msgstr "sin(radians(30)) -> 0.5" #: C/plugin-calculator.page:59(p) msgid "" "The last result is stored as the name _ (an underscore, just like in the " "Python console)." msgstr "" "Le dernier résultat obtenu est enregistré dans la variable portant le nom _ " "(le caractère souligné, comme dans la console Python)." #: C/plugin-applications.page:7(desc) msgid "Using the applications plugin." msgstr "Utiliser le greffon « Applications »." #: C/plugin-applications.page:10(app) msgid "Applications" msgstr "Applications" #: C/plugin-applications.page:13(title) msgid "Applications Plugin" msgstr "Le greffon « Applications »" #: C/plugin-applications.page:14(p) msgid "Applications provides all installed programs." msgstr "Applications donne accès à tous les programmes installés." #: C/plugin-applications.page:21(title) msgid "Launching an application" msgstr "Lancement d'une application" #: C/plugin-applications.page:23(p) msgid "Activate Kupfer and type an abbreviation of the application name" msgstr "" "Activez Kupfer et saisissez les premières lettres du nom de " "l'application" #: C/plugin-applications.page:28(p) msgid "Press Return to launch the application." msgstr "Appuyez sur Entrée pour lancer l'application." #: C/plugin-applications.page:34(title) msgid "Opening a file with a specific application" msgstr "Ouverture d'un fichier avec une application particulière" #: C/plugin-applications.page:36(p) msgid "Select a file in Kupfer" msgstr "Sélectionnez un fichier dans Kupfer" #: C/plugin-applications.page:41(p) msgid "Type Tab and select the action Open With..." msgstr "" "Appuyez sur Tab et sélectionnez l'action Ouvrir avec..." #: C/plugin-applications.page:46(p) msgid "" "Type Tab to select the third (indirect object) pane and in it, " "select the application to open the file with." msgstr "" "Appuyez sur Tab pour aller au troisième volet (objet indirect) et " "sélectionnez l'application qui servira à ouvrir le fichier." #: C/plugin-applications.page:53(p) msgid "" "The action Open opens files and folders with the registered default " "application for that specific file type. This can be configured using the " "action Set Default Application...." msgstr "" "L'action Ouvrir ouvre des fichiers et des dossiers avec " "l'application enregistrée par défaut pour ce type particulier de fichiers. " "Vous pouvez la configurer avec l'action Définir l'application par " "défaut...." #: C/plugin-applications.page:58(p) msgid "" "The file type associations are provided by the desktop environment, and " "modifying them here will modify them on the desktop as well. This may not be " "true when not using GNOME or XFCE." msgstr "" "Les associations de type de fichiers sont fournies par l'environnement du " "bureau et leur modification ici les modifie aussi sur le bureau. Cela n'est " "peut-être pas le cas si vous n'utilisez pas GNOME ou XFCE." #: C/plugin-applications.page:64(title) msgid "Selecting default application for a file type or folders" msgstr "" "Sélection de l'application par défaut pour un type de fichiers ou de dossiers" #: C/plugin-applications.page:66(p) msgid "Select a file or folder in Kupfer" msgstr "Sélectionnez un fichier ou un dossier dans Kupfer" #: C/plugin-applications.page:71(p) msgid "" "Type Tab and select the action Set Default Application..." msgstr "" "Appuyez sur Tab et sélectionnez l'action Définir " "l'application par défaut..." #: C/plugin-applications.page:77(p) msgid "" "Type Tab to select the third (indirect object) pane and in it, " "select the application to always open the file type with." msgstr "" "Appuyez sur Tab pour aller au troisième volet (objet indirect) et " "sélectionnez l'application qui servira systématiquement à ouvrir ce type de " "fichiers." #: C/plugin-applications.page:85(title) msgid "Configuration" msgstr "Configuration" #: C/plugin-applications.page:86(p) msgid "" "The configuration option Applications for Desktop Environment in " "the plugin's information pane in Kupfer Preferences determines " "how Kupfer should act with regard to the desktop environment " "configuration—certain applications request not to be shown depending on " "which desktop environment is used. By default, it behaves like GNOME." msgstr "" "L'option de configuration Applications pour le bureau dans le volet " "d'informations sur les greffons dans les Préférences de Kupfer " "détermine comment Kupfer doit agir en fonction de la " "configuration du bureau. Selon le bureau utilisé, certaines applications ne " "doivent pas être affichées. Par défaut, le comportement est celui de GNOME." #: C/moreusage.page:7(desc) msgid "More advanced usage information." msgstr "Informations d'utilisation avancée." #: C/moreusage.page:10(title) msgid "Using Kupfer in Depth" msgstr "Utilisation de Kupfer de façon approfondie" #: C/moreusage.page:13(title) msgid "Adding Applications and Scripts" msgstr "Ajout d'applications et de scripts" #: C/moreusage.page:14(p) msgid "" "Kupfer will show all applications that are configured visible in " "your menu editor." msgstr "" "Kupfer affiche toutes les applications configurées comme visibles " "dans votre éditeur de menu." #: C/moreusage.page:18(p) msgid "" "If you want to add an application manually, you can create a new ." "desktop file and place it in one of the standard directories for " "applications, for example ~/.local/share/applications, where " "Kupfer will find it." msgstr "" "Si vous souhaitez ajouter une application manuellement, vous pouvez créer un " "nouveau fichier .desktop et le mettre dans un des répertoires " "standards dédiés aux applications comme, par exemple, dans ~/.local/" "share/applications, où Kupfer pourra le trouver." #: C/moreusage.page:24(p) msgid "" "If you have a collection of scripts that you want to call from Kupfer, you can add the scripts folder as a catalog directory to Kupfer in the preferences. Scripts that you add to Kupfer's catalog " "this way can be run directly or in the terminal as long as they are " "executable." msgstr "" "Si vous possédez une collection de scripts que vous souhaitez exécuter à " "partir de Kupfer, vous pouvez les placer dans un dossier en tant " "que répertoire catalogue dans les préférences de Kupfer. Les " "scripts que vous ajoutez de cette façon au catalogue de Kupfer " "peuvent être directement lancés dans un terminal pour autant qu'ils soient " "exécutables." #: C/moreusage.page:31(p) msgid "" "You can also save command-lines by using the action Add to Favorites." msgstr "" "Vous pouvez aussi enregistrer des lignes de commande avec l'action " "Ajouter aux favoris." #: C/moreusage.page:38(title) msgid "Opening Files and Folders" msgstr "Ouverture de fichiers et de dossiers" #: C/moreusage.page:39(p) msgid "" "Using the action Open, files and folders are opened in their " "preferred application. The application associations can be changed, see " "." msgstr "" "En utilisant l'action Ouvrir, les fichiers et les dossiers sont " "ouverts avec l'application associée. Les associations aux applications " "peuvent être modifiées ; consultez la section ." #: C/moreusage.page:47(title) msgid "The Comma Trick" msgstr "L'Astuce virgule" #: C/moreusage.page:48(p) msgid "" "The comma trick allows the user to use actions on many objects at the same " "time." msgstr "" "L'astuce virgule permet à l'utilisateur d'avoir recours à des actions sur " "plusieurs objets en même temps." #: C/moreusage.page:52(p) msgid "" "Simply press comma , when an object is selected. The object is " "put on a \"stack\", and you can find yet another file or object, press comma " "to put it on the stack. When you subsequently invoke an action, the action " "is carried out on all of the objects at the same time." msgstr "" "Sélectionnez un objet et appuyez sur la touche virgule ,. L'objet " "se retrouve sur une « pile » sur laquelle vous pouvez ajouter d'autres objets " "ou fichiers en appuyant sur virgule. Si par la suite vous appelez une " "action, elle s'appliquera à tous les objets de la pile en même temps." #: C/moreusage.page:58(p) msgid "" "Some actions are only \"multiplied\" when used with many objects, other are " "smarter than that:" msgstr "" "Certaines actions ne sont que « répétées » si elles sont utilisées avec " "plusieurs objets, d'autres sont plus intelligentes :" #: C/moreusage.page:61(p) msgid "" "Selecting many files and using the Create Archive action, all files will be " "packed into the same archive." msgstr "" "En sélectionnant plusieurs fichiers et en utilisant l'action Créer une " "archive, tous les fichiers sont regroupés dans la même archive." #: C/moreusage.page:63(p) msgid "" "If you select multiple contacts and use a Send Email action, it creates one " "email directed at all the contacts." msgstr "" "Si vous sélectionnez plusieurs contacts et que vous utilisez l'action " "Envoyer un courriel, un courriel adressé à tous les contacts est créé." #: C/moreusage.page:65(p) msgid "" "If you select multiple subcatalogs (For example Firefox Bookmarks and " "Epiphany Bookmarks) and use Search Contents.., you get a subcatalog search " "restricted to the objects of those two catalogs! You can even bind a trigger " "to this command(!)" msgstr "" "Si vous sélectionnez plusieurs sous-catalogues (par exemple les marque-pages " "de Firefox et d'Epiphany), l'action Rechercher le contenu... effectue une " "recherche de sous-catalogues limitée aux objets de ces deux catalogues ! " "Vous pouvez même associer un raccourci déclencheur à cette commande." #: C/moreusage.page:71(p) msgid "" "The comma trick is directly taken from Quicksilver (the " "example given in the external article should work identically in Kupfer)." msgstr "" "L'astuce virgule est directement tirée de Quicksilver " "(l'exemple donné dans l'article externe devrait fonctionner de la même " "manière dans Kupfer)." #: C/moreusage.page:80(title) msgid "Grab Current Selection" msgstr "Obtention de la sélection en cours" #: C/moreusage.page:81(p) msgid "" "To use the current selected text, from any application, with Kupfer, you can configure a global keyboard shortcut for the action Show " "with Selection in Kupfer Preferences." msgstr "" "Pour utiliser le texte sélectionné en cours à partir de n'importe quelle " "application avec Kupfer, vous pouvez configurer un raccourci " "clavier global dédié à l'action Afficher avec sélection dans les " "Préférences de Kupfer." #: C/moreusage.page:85(p) msgid "" "If configured, pressing the global keyboard shortcut will summon " "Kupfer with the current selection as the focused object." msgstr "" "S'il est configuré, le raccourci clavier appelle Kupfer avec la " "sélection en cours comme objet en premier plan." #: C/moreusage.page:90(p) msgid "See " msgstr "Consultez la section " #: C/moreusage.page:94(title) msgid "Command-line Connection" msgstr "Connexion en ligne de commande" #: C/moreusage.page:95(p) msgid "" "The command kupfer on the command-line will focus Kupfer if it's already running, otherwise it will start it." msgstr "" "La commande kupfer en ligne de commande met Kupfer au " "premier plan s'il est déjà lancé, sinon elle le démarre." #: C/moreusage.page:99(p) msgid "" "The command kupfer can be used to send files or text from the " "command-line to Kupfer. For example, if you are using the shell " "in a directory where you have a file called \"report.pdf\", you can focus " "this file in Kupfer by running kupfer report.pdf." msgstr "" "La commande kupfer peut être utilisée pour envoyer à Kupfer des fichiers ou du texte en ligne de commande. Par exemple, si vous " "utilisez l'interpréteur (le shell) dans un répertoire où il y a un fichier " "nommé « rapport.pdf », vous pouvez mettre le focus sur ce fichier dans " "Kupfer en exécutant kupfer rapport.pdf." #: C/moreusage.page:107(p) msgid "" "You can also send text if you pipe the output of a command into kupfer." msgstr "" "Vous pouvez aussi envoyer du texte si vous redirigez la sortie d'une " "commande vers kupfer." #: C/moreusage.page:114(title) msgid "Managing Context and Current Selection" msgstr "Gestion du contexte et de la sélection actuelle" #: C/moreusage.page:115(p) msgid "" "If you find the object you want to use, then invoke an action, Kupfer goes away to perform the action (for example start a program or play a " "song). When you come back to Kupfer, it will still keep the same " "object and action selected. Some actions make sense to be repeated (like " "skipping to the next song) and it can be useful to perform different actions " "on the same object." msgstr "" "Recherchez l'objet que vous souhaitez utiliser, sollicitez une action et " "Kupfer ouvre l'application correspondante (par exemple lancer un " "programme ou diffuser une chanson). Quand vous retournez dans Kupfer, il garde l'objet et l'application sélectionnés. La répétition de " "certaines actions (comme lire le morceau suivant) va de soi et il peut être " "utile d'appliquer différentes actions au même objet." #: C/moreusage.page:123(p) msgid "" "However, you always have the top level catalog reachable when you \"come back" "\" to Kupfer -- say you went into the subcatalog \"Albums\" to " "browse your albums only; you select an album to play, and play it. You come " "back with the album selected -- but your next search will still go over the " "top level catalog, not just albums." msgstr "" "Cependant, le haut du catalogue est toujours disponible pour l'accession aux " "objets quand vous retournez dans Kupfer : disons, par exemple, " "que vous étiez dans le sous-catalogue « Albums » pour seulement consulter vos " "albums ; vous choisissez un album et vous l'écoutez. Vous revenez dans " "Kupfer et votre album est toujours sélectionné, mais votre prochaine " "recherche passera quand même par le haut du catalogue, pas seulement par les " "albums." #: C/moreusage.page:130(p) msgid "" "How to come back into the subcatalog you were in? You do that by simply " "browsing, not searching the first thing you do when you focus Kupfer again. A quick way is to press down-arrow or space to open the browse " "window; think of it as saying \"I want to stay in this subfolder\". With the " "browse window open, your next query will search the current subcatalog." msgstr "" "Comment revenir dans le sous-catalogue où vous étiez ? Simplement en " "naviguant et non pas en recherchant, ce que vous faites habituellement en " "premier quand vous activez Kupfer. La méthode la plus rapide est " "de presser la touche flèche vers le bas, ou la barre d'espace pour ouvrir la " "fenêtre du navigateur ; pensez-y si vous « souhaitez rester dans ce sous-" "catalogue ». Une fois la fenêtre du navigateur ouverte, recherchez le sous-" "catalogue actuel." #: C/moreusage.page:137(p) msgid "" "This way you can work both ways -- you can quickly drill down into folders " "to find a file, and when you come back for the next action with Kupfer you can either summon any normal toplevel object (just start typing), " "or stay around where you were, deep in that folder (press space, then type a " "query)." msgstr "" "De cette façon, vous pouvez travailler de deux façons : vous pouvez explorer " "rapidement les dossiers à la recherche d'un fichier, et quand vous revenez " "dans Kupfer pour l'action suivante, vous pouvez soit appeler " "n'importe quel objet de premier plan (saisissez simplement votre demande), " "soit rester où vous étiez, dans les profondeurs de ce dossier (appuyez sur " "la barre d'espace et saisissez votre demande)." #: C/moreusage.page:146(title) msgid "Saving Commands as Files" msgstr "Enregistrement de commandes en tant que fichiers exécutables" #: C/moreusage.page:147(p) msgid "" "You can use keyboard shortcut for Compose Command (by default it is " "CtrlReturn) to create a command " "object out of the currently focused command in Kupfer. This object can be " "saved as a runnable file if you use the Save As... action. The " "resulting file will can be executed when opened from the file manager (it " "requires that Kupfer is already running)." msgstr "" "Vous pouvez utiliser un raccourci clavier de Composition de commande (par défaut, CtrlEntrée) pour " "créer un objet commande à partir de la commande actuellement active dans " "Kupfer. Cet objet peut être enregistré en tant que fichier " "exécutable si vous utilisez l'action Enregistrer sous.... Le " "fichier résultant peut être exécuté en l'ouvrant à partir du gestionnaire de " "fichiers (Kupfer doit être en cours d'exécution)." #: C/managing-plugins.page:7(desc) msgid "Using plugins with Kupfer." msgstr "Utiliser des greffons avec Kupfer." #: C/managing-plugins.page:10(title) msgid "How to Configure Plugins" msgstr "Configuration des greffons" #: C/managing-plugins.page:12(p) msgid "" "Functionality in Kupfer is organized by extentsion modules called \"plugins" "\". Each plugin provides additional functionality, for example integration " "with an external application." msgstr "" "Les fonctions de Kupfer sont organisées en modules d'extensions appelés " "« greffons » ou « extensions » ou encore « plugins ». Chaque greffon fournit " "une fonction supplémentaire, par exemple l'intégration dans une application " "externe." #: C/managing-plugins.page:19(title) msgid "Configuring Plugins" msgstr "Configuration des greffons" #: C/managing-plugins.page:21(title) msgid "Open Kupfer Preferences to the Plugins tab" msgstr "Ouverture des Préférences de Kupfer à l'onglet « Greffons »." #: C/managing-plugins.page:23(p) msgid "Use one of the following methods:" msgstr "Utilisez l'une des méthodes suivantes :" #: C/managing-plugins.page:25(p) msgid "" "Click the Kupfer icon in the notification area and select the item " "Preferences" msgstr "" "Cliquez sur l'icône « Kupfer » dans la zone de notification et sélectionnez " "l'élément Préférences" #: C/managing-plugins.page:25(item) msgid "." msgstr "." #: C/managing-plugins.page:29(p) msgid "" "Search for the object Kupfer Preferences in Kupfer itself. Press " "Return to open it." msgstr "" "Recherchez l'objet Préférences de Kupfer dans Kupfer lui-même. " "Appuyez sur Entrée pour l'ouvrir." #: C/managing-plugins.page:33(p) msgid "Use the keyboard shortcut Ctrl;" msgstr "" "Utilisez le raccourci clavier Ctrl;" #: C/managing-plugins.page:39(p) msgid "Select the tab Plugins" msgstr "Sélectionnez l'onglet Extensions" #: C/managing-plugins.page:45(p) msgid "" "Select plugins in the list to read about them, and tick the box next to its " "name to activate the plugin, or untick to deactivate." msgstr "" "Sélectionnez un greffon dans la liste pour afficher les informations le " "concernant et cochez la case adjacente pour l'activer. Décochez la case pour " "le désactiver." #: C/managing-plugins.page:49(p) msgid "" "If the plugin has any configurable parameters, they will be visible below " "the plugin information." msgstr "" "Si le greffon possède des paramètres, ils sont visibles en dessous des " "informations concernant le greffon." #: C/managing-plugins.page:53(p) msgid "" "The plugin Kupfer Plugins allows fast access to each plugin's " "information page as well as the action \"Show Source Code\" which reveals " "the implementation." msgstr "" "Le greffon Greffons Kupfer permet un accès rapide à chaque page " "d'informations sur les greffons ainsi qu'à l'action « Afficher le code " "source » qui laisse voir la mise en œuvre." #: C/managing-plugins.page:59(title) msgid "If a Plugin can not be Activated" msgstr "Impossibilité d'activer un greffon" #: C/managing-plugins.page:60(p) msgid "" "If a plugin fails to activate because it requires a software module that is " "not available, its plugin information will display a message like this:" msgstr "" "Si l'activation d'un greffon échoue à cause de l'absence d'un module " "logiciel, les informations du greffon affichent un message de ce type :" #: C/managing-plugins.page:65(em) msgid "Plugin could not be read due to an error:" msgstr "Le greffon n'a pas pu être lu à cause d'une erreur :" #: C/managing-plugins.page:66(em) msgid "Python module 'gdata' is needed" msgstr "Le module Python « gdata » est requis" #: C/managing-plugins.page:67(p) msgid "" "This means that you need to install a needed python module from your " "distribution—and possibly the plugin documentation can tell you how." msgstr "" "Cela signifie que vous devez installer un module python indispensable en " "fonction de votre distribution. La documentation du greffon vous indiquera " "probablement comment procéder." #: C/managing-plugins.page:72(p) msgid "" "The plugin may also unexpectedly fail to load, and display a different error " "message. It may then be a program error in either the plugin or Kupfer." msgstr "" "Le chargement du greffon peut aussi échouer de façon inattendue et afficher " "un message d'erreur différent. Il peut s'agir d'une erreur de programme dans " "le greffon ou dans Kupfer." #: C/managing-plugins.page:79(title) msgid "Installing more Plugins" msgstr "Installation de greffons supplémentaires" #: C/managing-plugins.page:80(p) msgid "" "You can install custom plugins into the folder ~/.local/share/kupfer/" "plugins. Each plugin is either a single .py file or a " "python package (a folder directly containing a file called __init__." "py). Plugins in the package format can include icon files. Python " "packages can even be installed as .zip files." msgstr "" "Vous pouvez installer des greffons personnalisés dans le dossier ~/." "local/share/kupfer/plugins. Chaque greffon est soit un simple fichier " ".py, soit un paquet Python (un dossier contenant un fichier " "appelé __init__.py). Les greffons sous forme de paquet peuvent " "inclure des fichiers d'icônes. Les paquets Python peuvent même être " "installés en tant que fichiers .zip." #: C/managing-plugins.page:88(p) msgid "" "Caution: Treat a plugin as a computer program. Do not install " "untrusted plugins." msgstr "" "Attention : traitez les greffons comme des programmes d'ordinateur. " "N'installez pas de greffons d'origine douteuse." #: C/managing-plugins.page:95(title) msgid "Creating Plugins" msgstr "Création de greffons" #: C/managing-plugins.page:96(p) msgid "" "Documentation for plugin creators is available in the file " "Documentation/Manual.rst in the source distribution on the " "webpage at Kupfer " "Manual. An easy way to start is to copy an existing plugin and " "experimenting with it." msgstr "" "La documentation pour les créateurs de greffons se trouve dans le fichier " "Documentation/Manual.rst de la distribution source sur la page " "Web du Manuel de " "Kupfer. Une manière facile de démarrer est de copier un greffon " "existant et de s'entraîner avec." #: C/managing-plugins.page:107(title) msgid "The Catalog Tab in Preferences" msgstr "L'onglet Catalogue dans les Préférences" #: C/managing-plugins.page:108(p) msgid "" "Each plugin can export a number of sources which contain objects. Normally, " "all these objects are directly accessible from a top-level search. Some " "plugins export so specialized or so many objects that their catalogs should " "better not have their objects exported to the top level. To reach those " "objects, you have to first find the catalog by name, then enter the catalog " "using the action Search Contents." msgstr "" "Chaque greffon peut exporter de nombreuses sources contenant des objets. " "Normalement, tous ces objets sont directement accessibles par une recherche " "dans le haut du catalogue. Certains greffons exportent des objets si " "spécialisés ou si nombreux qu'il vaut mieux qu'ils ne soient pas exportés " "vers le haut du catalogue. Dès lors, pour atteindre ces objets, vous devez " "d'abord rechercher le catalogue par son nom, puis l'ouvrir par l'action " "Recherche de contenu." #: C/managing-plugins.page:118(p) msgid "" "In the tab Catalog in Kupfer Preferences, a ticked box " "next to each source means that its objects are exported. An unticked box " "means that its contents are hidden from the top level." msgstr "" "Dans l'onglet Catalogue des Préférences de Kupfer, une " "case cochée à côté de chaque source signifie que ses objets sont exportés. " "Une case non cochée signifie que son contenu est masqué dans le haut du " "catalogue." #: C/managing-plugins.page:123(p) msgid "" "Note: Kupfer may become slow if large enough subcatalogs are " "exported to the top level." msgstr "" "Note : Kupfer peut ralentir si de trop gros sous-catalogues sont " "exportés vers le haut du catalogue." #: C/license.page:7(desc) msgid "You can copy, modify and share Kupfer." msgstr "Vous pouvez copier, modifier et partager Kupfer." #: C/license.page:10(title) msgid "License" msgstr "Licence" #: C/license.page:12(p) msgid "" "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." msgstr "" "Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou le " "modifier au titre des clauses de la Licence Publique Générale GNU, telle que " "publiée par la Free Software Foundation ; soit la version 2 de la Licence, " "ou (à votre discrétion) une version ultérieure quelconque." #: C/license.page:18(p) msgid "" "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." msgstr "" "Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE " "GARANTIE ; sans même une garantie implicite de COMMERCIABILITÉ ou DE " "CONFORMITÉ À UNE UTILISATION PARTICULIÈRE. Voir la Licence Publique Générale " "GNU pour plus de détails." #: C/license.page:24(p) msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see gnu." "org/licenses." msgstr "" "Vous devriez avoir reçu un exemplaire de la Licence Publique Générale GNU " "avec ce programme ; si ce n'est pas le cas, écrivez à la Free Software " "Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA." #: C/license.page:30(p) msgid "" "This documentation is licensed under a Creative Commons Attribution-Share Alike 3.0 " "Unported License." msgstr "" "Ce document est publié sous licence Creative Commons Paternité-Partage des " "Conditions Initiales à l'Identique 3.0 Unported." #: C/license.page:36(p) msgid "" "As a special exception, the copyright holders give you permission to copy, " "modify, and distribute the example code contained in this document under the " "terms of your choosing, without restriction." msgstr "" "À titre exceptionnel, les détenteurs des droits vous autorisent à copier, " "modifier et distribuer les exemples de code contenus dans ce document selon " "vos propres termes, sans restriction." #: C/keyboard.page:7(desc) msgid "Complete keyboard shortcuts reference." msgstr "Référence complète des raccourcis clavier." #: C/keyboard.page:10(title) msgid "Command Keys and Accelerator Keys" msgstr "Touches de commande et touches d'accélération" #: C/keyboard.page:13(title) C/generalusage.page:12(title) msgid "Keyboard Interface" msgstr "Interface du clavier" #: C/keyboard.page:14(p) msgid "In command mode, the following keystrokes have special meanings:" msgstr "En ligne de commande, les touches suivantes ont un sens particulier :" #: C/keyboard.page:19(p) C/generalusage.page:34(p) msgid " or Space" msgstr " ou Espace" #: C/keyboard.page:20(p) C/generalusage.page:35(p) msgid "Go to the next match" msgstr "va à la proposition suivante" #: C/keyboard.page:23(p) C/generalusage.page:38(p) msgid " or ShiftSpace" msgstr " ou MajEspace" #: C/keyboard.page:26(p) C/generalusage.page:41(p) msgid "Go to the previous match" msgstr "va à la proposition précédente" #: C/keyboard.page:29(p) C/generalusage.page:44(p) msgid " or /" msgstr " ou /" #: C/keyboard.page:30(p) C/generalusage.page:45(p) msgid "Descend into an object with content" msgstr "descend dans un objet avec un contenu" #: C/keyboard.page:33(key) C/generalusage.page:48(key) msgid "Backspace" msgstr "Retour Arrière" #: C/keyboard.page:34(p) C/generalusage.page:49(p) msgid "Erase a character from the query. If the query is empty, go up a level" msgstr "" "efface un caractère de la question. Si la question est vide, remonte d'un " "niveau" #: C/keyboard.page:39(key) C/keyboard.page:93(key) C/generalusage.page:54(key) msgid "." msgstr "." #: C/keyboard.page:40(p) C/generalusage.page:55(p) msgid "Activate free-text mode" msgstr "active le mode texte libre" #: C/keyboard.page:43(key) C/keyboard.page:97(key) C/generalusage.page:58(key) msgid "," msgstr "," #: C/keyboard.page:44(p) C/generalusage.page:59(p) msgid "Put selected object on the stack (\"Comma Trick\")" msgstr "dépose les objets sélectionnés sur la pile (« Astuce virgule »)" #: C/keyboard.page:47(p) msgid "Quick access keys:" msgstr "Touches d'accès rapide :" #: C/keyboard.page:53(key) msgid "=" msgstr "=" #: C/keyboard.page:55(p) msgid "" "Activate free-text mode with = prefix (for )" msgstr "" "active le mode texte libre avec le préfixe = (pour le greffon " ")." #: C/keyboard.page:61(key) msgid "/" msgstr "/" #: C/keyboard.page:63(p) msgid "" "Activate free-text mode (when nothing is selected) with / " "prefix (to input a rooted path)" msgstr "" "active le mode texte libre (quand rien n'est sélectionné) avec le préfixe " "/ (pour saisir un nom de chemin commençant à la racine)" #: C/keyboard.page:68(p) C/generalusage.page:62(p) msgid "Additionally:" msgstr "En outre :" #: C/keyboard.page:72(p) C/generalusage.page:66(p) msgid "" "Return activates the current selection: the command is executed." msgstr "" "La touche Entrée active la sélection en cours : la commande est " "exécutée." #: C/keyboard.page:74(p) C/generalusage.page:68(p) msgid "Escape clears the current selection." msgstr "La touche Échap supprime la sélection en cours." #: C/keyboard.page:75(p) C/generalusage.page:69(p) msgid "Tab switches between the object and the action pane." msgstr "" "La touche Tab bascule entre le volet objet et le volet action." #: C/keyboard.page:77(p) msgid "" "The meaning of the keys Space, ., ,, /" " and = can not be changed, but you can deactivate their " "special meaning with the checkbox Use single keystroke commands " "in Kupfer Preferences." msgstr "" "La signification des touches Espace, ., ,, " "/ et = ne peut être modifiée, mais vous pouvez " "désactiver leur signification spéciale avec la case à cocher Utiliser " "les commandes à l'aide d'une seule touche dans les Préférences de " "Kupfer." #: C/keyboard.page:86(title) msgid "Kupfer's Keyboard Shortcuts" msgstr "Raccourcis clavier de Kupfer" #: C/keyboard.page:87(p) msgid "" "These keyboard shortcuts are used in Kupfer's interface. They " "have the following meanings and default shortcuts:" msgstr "" "Ces raccourcis clavier sont utilisés dans l'interface de Kupfer. " "Ils ont les significations suivantes :" #: C/keyboard.page:93(key) C/keyboard.page:97(key) C/keyboard.page:101(key) #: C/keyboard.page:105(key) C/keyboard.page:113(key) C/keyboard.page:117(key) #: C/keyboard.page:121(key) C/keyboard.page:125(key) C/keyboard.page:129(key) #: C/keyboard.page:174(key) msgid "Ctrl" msgstr "Ctrl" #: C/keyboard.page:94(p) msgid "Toggle text mode" msgstr "bascule en mode texte" #: C/keyboard.page:98(p) msgid "The comma trick" msgstr "l'astuce virgule" #: C/keyboard.page:101(key) msgid ";" msgstr ";" #: C/keyboard.page:102(p) msgid "Show preferences window" msgstr "affiche la boîte de dialogue préférences" #: C/keyboard.page:105(key) msgid "R" msgstr "R" #: C/keyboard.page:106(p) msgid "Reset all" msgstr "réinitialise tout" #: C/keyboard.page:109(key) msgid "Alt" msgstr "Alt" #: C/keyboard.page:109(key) msgid "A" msgstr "A" #: C/keyboard.page:110(p) msgid "Alternate activate" msgstr "activation alternative" #: C/keyboard.page:113(key) msgid "Return" msgstr "Entrée" #: C/keyboard.page:114(p) msgid "Compose command" msgstr "commande de composition" #: C/keyboard.page:117(key) msgid "S" msgstr "S" #: C/keyboard.page:118(p) msgid "Switch to first pane" msgstr "passe au premier volet" #: C/keyboard.page:121(key) msgid "Q" msgstr "Q" #: C/keyboard.page:122(p) msgid "Select 'Quit'" msgstr "sélectionne « Quitter »" #: C/keyboard.page:125(key) msgid "G" msgstr "G" #: C/keyboard.page:126(p) msgid "Select 'Selected File'" msgstr "sélectionne « Fichier sélectionné »" #: C/keyboard.page:129(key) msgid "T" msgstr "T" #: C/keyboard.page:130(p) msgid "Select 'Selected Text'" msgstr "sélectionne « Texte sélectionné »" #: C/keyboard.page:133(key) msgid "F1" msgstr "F1" #: C/keyboard.page:134(p) msgid "Show Help" msgstr "affiche l'aide" #: C/keyboard.page:139(title) msgid "How to configure a keyboard shortcut" msgstr "Configuration d'un raccourci clavier" #: C/keyboard.page:141(p) C/keyboard.page:185(p) msgid "Open Kupfer Preferences and go to the Keyboard tab." msgstr "" "Ouvrez les Préférences de Kupfer et allez à l'onglet Clavier." #: C/keyboard.page:147(p) msgid "" "Double-click the shorcut's row under Browser Keyboard Shortcuts." msgstr "" "Faites un double clic sur la ligne du raccourci au-dessous de Raccourcis " "clavier du navigateur." #: C/keyboard.page:153(p) msgid "" "Using the window that appears, press modifier keys and a letter or number " "key to set a shortcut. An example is pressing and holding Ctrl " "and then pressing and releasing T to bind CtrlT." msgstr "" "Dans la boîte de dialogue qui s'affiche, appuyez sur les touches de " "modification et une touche lettre ou chiffre pour définir un raccourci. Par " "exemple, maintenez l'appui sur la touche Ctrl et appuyez puis " "relâchez la touche T pour lier CtrlT." #: C/keyboard.page:164(title) msgid "Global Keyboard Shortcuts" msgstr "Raccourcis clavier généraux" #: C/keyboard.page:165(p) msgid "" "Kupfer always listens to global shortcuts, even if it is not " "currently in the foreground." msgstr "" "Kupfer écoute en permanence les raccourcis clavier, même s'il est " "actuellement en arrière plan." #: C/keyboard.page:169(p) msgid "They have the following meanings and default shortcuts:" msgstr "Voici les raccourcis par défaut et leur signification :" #: C/keyboard.page:174(key) msgid "Space" msgstr "barre d'espace" #: C/keyboard.page:175(p) msgid "Show/hide Kupfer" msgstr "affiche/masque Kupfer" #: C/keyboard.page:178(p) msgid "(not configured by default)" msgstr "(non configuré par défaut)" #: C/keyboard.page:179(p) msgid "Show Kupfer with 'Selection' object focused" msgstr "affiche Kupfer avec l'objet « Sélection » au premier plan" #: C/keyboard.page:183(title) msgid "How to configure a global keyboard shortcut" msgstr "Configuration d'un raccourci clavier global" #: C/keyboard.page:191(p) msgid "" "Double-click the shorcut's row under Global Keyboard Shortcuts." msgstr "" "Faites un double clic sur la ligne du raccourci au-dessous de Raccourcis " "clavier globaux." #: C/keyboard.page:197(p) msgid "" "Using the window that appears, press modifier keys and a letter or number " "key to set a global shortcut. An example is pressing and holding Super and then pressing and releasing Space to bind " "SuperSpace." msgstr "" "Dans la boîte de dialogue qui s'affiche, appuyez sur les touches de " "modification et une touche lettre ou chiffre pour définir un raccourci " "global. Par exemple, en maintenant la pression sur Super puis en " "pressant et relâchant la barre d'espace pour lier " "Superbarre d'espace." #: C/keyboard.page:206(p) msgid "" "Since these keyboard shortcuts are global, they can be used from any " "application. Select shortcuts with care so that they do not conflict with " "other functions." msgstr "" "Puisque ces raccourcis clavier sont globaux, il est possible de les utiliser " "à partir de n'importe quelle application. Choisissez les raccourcis avec " "soin, de façon à ce qu'ils n'entrent pas en conflit avec d'autres fonctions." #: C/keyboard.page:214(p) msgid "" "The plugin Triggers allows to activate actions with global keyboard " "shortcuts. Trigger shortcuts do not appear in Kupfer Preferences." msgstr "" "Le greffon Raccourcis déclencheurs permet d'activer des actions " "avec des raccourcis clavier globaux. Les raccourcis déclencheurs " "n'apparaissent pas dans les Préférences de Kupfer." #: C/keyboard.page:220(p) msgid "See for more information." msgstr "" "Consultez la section pour plus " "d'informations." #: C/introduction.page:7(desc) msgid "Introduction to Kupfer." msgstr "Introduction à Kupfer." #: C/introduction.page:10(title) msgid "Introduction" msgstr "Introduction" #: C/introduction.page:12(p) msgid "" "Kupfer is an interface for quick and convenient access to " "applications and their documents." msgstr "" "Kupfer est une interface pour un accès rapide et pratique aux " "applications et à leurs documents." #: C/introduction.page:16(p) msgid "" "The most typical use is to find a specific application and launch it. We " "have tried to make Kupfer easy to extend with plugins so that " "this quick-access paradigm can be extended to many more objects than just " "applications." msgstr "" "Son usage le plus courant est la recherche d'une application particulière et " "son lancement. Nous nous sommes efforcés de rendre Kupfer facile " "à compléter avec des greffons pour que ce paradigme d'accès rapide puisse " "s'étendre à bien d'autres objets que les applications." #: C/introduction.page:22(p) msgid "" "We hope that using Kupfer feels both very fun and " "different." msgstr "" "Nous espérons que l'utilisation de Kupfer vous semble très " "amusante et différente." #: C/introduction.page:26(p) msgid "" "For up-to-date information about Kupfer, visit its homepage." msgstr "" "Pour obtenir des informations actualisées sur Kupfer, allez sur " "sa page d'accueil." #: C/index.page:9(name) msgid "Ulrik Sverdrup" msgstr "Ulrik Sverdrup" #: C/index.page:10(email) msgid "ulrik.sverdrup@gmail.com" msgstr "ulrik.sverdrup@gmail.com" #: C/index.page:13(year) msgid "2009" msgstr "2009" #: C/index.page:14(name) msgid "Kupfer Development Team" msgstr "Équipe de développement de Kupfer" #: C/index.page:17(license) msgid "Creative Commons Share Alike 3.0" msgstr "Creative Commons Partage des Conditions Initiales à l'Identique 3.0" #: C/index.page:21(title) msgid "Kupfer Manual" msgstr "Manuel de Kupfer" #: C/index.page:24(title) msgid "Using Kupfer" msgstr "Utilisation de Kupfer" #: C/index.page:27(title) msgid "About Specific Plugins" msgstr "À propos de greffons particuliers" #: C/generalusage.page:7(desc) msgid "How to start using Kupfer." msgstr "Comment débuter avec Kupfer." #: C/generalusage.page:14(p) msgid "" "Kupfer is to the largest part a keyboard-managed interface to " "applications and documents." msgstr "" "Kupfer est majoritairement une interface clavier qui gère les " "applications et les documents." #: C/generalusage.page:18(p) msgid "" "Kupfer's default mode is the command mode: If you type a query, kupfer will " "search for a match in its catalog." msgstr "" "Le mode par défaut de Kupfer est la ligne de commande : si vous saisissez " "une demande, Kupfer cherche une correspondance dans son catalogue." #: C/generalusage.page:23(p) msgid "" "The arrow keys allow you to browse query matches quite naturally, going to " "the previous or next match, and going up and down in the subcatalogs." msgstr "" "Les touches de direction vous permettent de naviguer tout naturellement " "parmi les réponses proposées, allant de la précédente à la suivante et de " "haut en bas dans les sous-catalogues." #: C/generalusage.page:29(p) msgid "In command mode, some keystrokes have special meanings:" msgstr "En ligne de commande, certaines touches ont un sens particulier :" #: C/generalusage.page:71(p) msgid "" "By default you show Kupfer using the global keyboard shortcut " "CtrlSpace." msgstr "" "Par défaut, vous affichez Kupfer avec le raccourci clavier " "CtrlEspace." #: C/generalusage.page:74(p) msgid "See for more information." msgstr "" "Consultez la section pour plus d'informations." #: C/generalusage.page:78(title) msgid "Learning Habits" msgstr "Apprentissage" #: C/generalusage.page:79(p) msgid "" "Kupfer remembers which objects and actions are used the most. " "When beginning to use it, you have to use the arrow keys at times to make it " "precise which object you want to find. After a few uses of that object, " "Kupfer will rank it higher. Objects marked as favorites are also ranked higher." msgstr "" "Kupfer se souvient des objets et des actions les plus utilisés. " "Au début de son utilisation, vous devez vous servir des touches fléchées " "souvent pour préciser quel objet vous recherchez dans une liste. Après " "quelques appels de cet objet, Kupfer le classera à un rang " "supérieur. Les objets marqués comme favoris ont aussi un rang supérieur." #: C/generalusage.page:90(title) msgid "The Catalog" msgstr "Le catalogue" #: C/generalusage.page:91(p) msgid "" "The Catalog is the collection of objects you can access in Kupfer, such as " "documents and programs." msgstr "" "Le catalogue est la collection d'objets auxquels vous pouvez accéder dans " "Kupfer, comme des documents et des programmes." #: C/generalusage.page:96(p) msgid "" "Objects in the catalog that have content, like folders, are marked with an " "arrow. Pressing will enter these objects. Much of the catalog " "is composed of subcatalogs; plugin subcatalogs do in general list objects " "that are also available directly from the top level. Subcatalogs can be used " "for a narrower view or search scope, when using Kupfer." msgstr "" "Les objets du catalogue qui ont un contenu, tels que des dossiers, sont " "marqués d'une flèche. Appuyer sur la touche ouvre ces objets. " "La plus grande partie du catalogue est constituée de sous-catalogues ; les " "sous-catalogues des greffons énumèrent des objets qui sont disponibles " "directement depuis le haut du catalogue. Les sous-catalogues sont utiles " "pour obtenir une vision plus restreinte ou une recherche limitée lors de " "l'utilisation de Kupfer." #: C/generalusage.page:105(p) msgid "" "Most subcatalogs update their content automatically. For example, the " "Desktop folder source is always up-to-date." msgstr "" "La plupart des sous-catalogues mettent automatiquement à jour leur contenu. " "Par exemple, la source du dossier Bureau est toujours maintenue à jour." #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/index.page:0(None) msgid "translator-credits" msgstr "" "Alain Lojewski , 2010, 2012\n" "Julien Hardelin , 2011\n" "Bruno Brouard , 2012" kupfer-v208/help/it/000077500000000000000000000000001176220042200144075ustar00rootroot00000000000000kupfer-v208/help/it/it.po000066400000000000000000000671651176220042200154020ustar00rootroot00000000000000# Italian translation for the kupfer help # Copyright (C) 2009 Ulrik Sverdrup # This file is distributed under the same license as the kupfer package. (GPLv3) # Francesco Marella , 2010. # msgid "" msgstr "" "Project-Id-Version: kupfer beta\n" "POT-Creation-Date: 2010-07-11 16:18+0000\n" "PO-Revision-Date: 2010-08-19 09:51+0200\n" "Last-Translator: Francesco Marella \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: C/tips.page:7(desc) msgid "Using Kupfer more conveniently." msgstr "Usare Kupfer opportunamente." #: C/tips.page:10(title) msgid "Basic Usage" msgstr "Uso di base" #: C/tips.page:13(title) msgid "The Catalog" msgstr "Il catalogo" #: C/tips.page:14(p) msgid "" "The Catalog is the collection of objects you can access in Kupfer, such as " "documents and programs." msgstr "" "Il catalogo è la raccolta di oggetti a cui puoi accedere in Kupfer, ad " "esempio documenti e programmi." #: C/tips.page:19(p) msgid "" "Objects in the catalog that have content, like folders, are marked with an " "arrow. Pressing right-arrow will enter these objects. Much of the " "catalog is composed of subcatalogs; plugin subcatalogs do in general list " "objects that are also available directly from the top level. Subcatalogs can " "be used for a narrower view or search scope, when using Kupfer." msgstr "" "Gli oggetti nel catalogo che hanno contenuto, come le cartelle, sono " "contrassegnati con una freccia. Premendo si entra nell'oggetto. " "Gran parte del catalogo è composta da sotto cataloghi; il plugin sotto " "catalogo generalmente cataloga oggetti che sono anche disponibili " "direttamente dal livello superiore. I sotto cataloghi possono essere usati " "per una vista o ambito di ricerca ristretto, quando si utilizza Kupfer." #: C/tips.page:28(p) msgid "" "Most subcatalogs update their content automatically. For example, the " "Desktop folder catalog is always uptodate." msgstr "" "La maggior parte dei sotto cataloghi aggiorna il loro contenuto " "automaticamente. Per esempio, il catalogo per la cartella Scrivania è sempre " "aggiornato." #: C/tips.page:35(title) msgid "Keyboard Interface" msgstr "Interfaccia da tastiera" #: C/tips.page:37(p) msgid "" "Kupfer is to the largest part a keyboard-managed interface to " "applications and documents." msgstr "" "Kupfer è grosso modo una interfaccia, gestita da tastiera, ad " "applicazioni e documenti." #: C/tips.page:41(p) msgid "" "Kupfer's default mode is the command mode: If you type a query, kupfer will " "search for a match in its catalog." msgstr "" "La modalità predefinita di Kupfer è quella a comando: se viene digitata " "l'interrogazione, Kupfer cercherà una corrispondenza nel suo catalogo." #: C/tips.page:46(p) msgid "" "The arrow keys allow you to browse query matches quite naturally, going to " "the previous or next match, and going up and down in the subcatalogs." msgstr "" "I tasti freccia permettono di scorrere tra i risultati dell'interrogazione " "naturalmente, andando alla corrispondenza precedente o a quella successiva e " "andando su e giù nei sotto cataloghi." #: C/tips.page:52(p) msgid "In command mode, some keystrokes have special meanings:" msgstr "" "In modalità comando, la pressione di alcuni tasti ha un significato speciale:" #: C/tips.page:57(p) msgid " or Space" msgstr " o Spazio" #: C/tips.page:58(p) msgid "Go to the next match" msgstr "Va alla prossima corrispondenza" #: C/tips.page:61(p) msgid " or ShiftSpace" msgstr " o MaiuscSpazio" #: C/tips.page:64(p) msgid "Go to the previous match" msgstr "Va alla precedente corrispondenza" #: C/tips.page:67(p) msgid " or /" msgstr " o /" #: C/tips.page:68(p) msgid "Descend into an object with content" msgstr "Discende in un oggetto con contenuto" #: C/tips.page:71(key) msgid "Backspace" msgstr "Backspace" #: C/tips.page:72(p) msgid "Erase a character from the query. If the query is empty, go up a level" msgstr "" "Elimina un carattere dall'interrogazione. Se l'interrogazione è vuota, " "salire di un livello" #: C/tips.page:77(key) msgid "." msgstr "." #: C/tips.page:78(p) msgid "Activate free-text mode" msgstr "Attiva la modalità testo libero" #: C/tips.page:81(key) msgid "," msgstr "," #: C/tips.page:82(p) msgid "Put selected object on the stack (\"Comma Trick\")" msgstr "Mette l'oggetto selezionato sulla pila (\"Comma Trick\")" #: C/tips.page:85(p) msgid "" "Additionally, the key Return activates the current selection: the " "command is executed. Escape clears the current selection." msgstr "" "Inoltre, il tasto Invio attiva la selezione corrente: il comando " "viene eseguito. Esc cancella la selezione corrente." #: C/tips.page:91(title) msgid "Global Keyboard Shortcuts" msgstr "Scorciatoie da tastiera globali" #: C/tips.page:92(p) msgid "" "Kupfer listens to global shortcuts, even if Kupfer is not currently in the " "foreground. The most important global shortcut is the shortcut to show and " "hide Kupfer's command window which by default is CtrlSpace." msgstr "" "Kupfer resta in ascolto per le scorciatoie globali, anche se Kupfer non è " "attualmente in primo piano. La scorciatoia globale più importante è quella " "per mostrare e nascondere la finestra di comando di Kupfer che in maniera " "predefinita è CtrlSpazio." #: C/tips.page:98(p) msgid "Global Keyboard Shortcuts are configured in Kupfer's preferences." msgstr "" "Collegamenti da tastiera globali vengono configurati nelle preferenze di " "Kupfer." #: C/tips.page:101(p) msgid "" "The Triggers plugin allows to configure actions to be activated by global " "shortcuts, but triggers can only be configured in that plugin." msgstr "" "Il plugin Trigger permette di configurare azioni da attivare con scorciatoie " "globali, ma i trigger possono essere solo configurati in questo plugin." #: C/tips.page:108(title) msgid "Additional Keyboard Shortcuts" msgstr "Scorciatoie da tastiera aggiuntive" #: C/tips.page:109(p) msgid "" "Additional keyboard shortcuts that work with Kupfer when it is in the " "foreground can be configured in Kupfer's preferences." msgstr "" "Scorciatoie da tastiera aggiuntive che funzionano con Kupfer quando esso è " "in primo piano possono essere configurate nelle preferenze di Kupfer." #: C/tips.page:119(title) msgid "Configuration files and paths" msgstr "File di configurazione e percorsi" #: C/tips.page:120(p) msgid "" "Install custom plugins in the folder ~/.local/share/kupfer/plugins/" msgstr "" "Installare plugin personalizzati nella cartella ~/.local/share/kupfer/" "plugins/" #: C/tips.page:124(p) msgid "" "Kupfer cache, config and data are located in the directories ~/.cache/" "kupfer, ~/.config/kupfer and ~/.local/share/" "kupfer." msgstr "" "La cache di Kupfer, configurazione e dati sono presenti nelle cartelle " "~/.cache/kupfer, ~/.config/kupfer e ~/.local/" "share/kupfer." #: C/plugins.page:7(desc) msgid "Using Kupfer plugins." msgstr "Utilizzo dei plugin di Kupfer." #: C/plugins.page:10(title) msgid "Plugins" msgstr "Plugin" #: C/plugins.page:12(p) msgid "" "You can install custom plugins into ~/.local/share/kupfer/plugins; adding to " "Kupfer's object knowledge can be surprisingly easy, just look at " "the default plugins if you want to create new." msgstr "" "Si possono installare plugin personalizzati in ~/.local/share/kupfer/" "plugins; aggiungere conoscenza agli oggetti di Kupfer può essere " "sorprendentemente facile, basta dare un'occhiata ai plugin predefiniti se si " "vuole crearne di nuovi." #: C/plugins.page:19(title) msgid "Search the Web Search Engines" msgstr "Motore di ricerca per il Web" #: C/plugins.page:20(p) msgid "" "The Search the Web plugin uses Firefox' search engines, so you " "can add Search Engines directly in Firefox and Kupfer " "will find them later." msgstr "" "Il plugin per la ricerca sul Web utilizza i motori di ricerca di " "Firefox, quindi si possono aggiungere motori di ricerca " "direttamente in Firefox e Kupfer li troverà in seguito." #: C/plugins.page:25(p) msgid "" "You can also install custom search plugins directly, only for Kupfer, in the folder:" msgstr "" "Si possono installare direttamente plugin per la ricerca personalizzata, " "solo per Kupfer, nella cartella:" #: C/plugins.page:29(code) #, no-wrap msgid "~/.local/share/kupfer/searchplugins/" msgstr "~/.local/share/kupfer/searchplugins/" #: C/plugins.page:34(title) msgid "Open Terminal Here" msgstr "Apri terminale qui" #: C/plugins.page:35(p) msgid "" "Open terminal first calls xdg-terminal, then gnome-terminal. xdg-terminal is a script to find the user's configured terminal " "program for his/her Desktop Environment. Install xdg-terminal if " "you need this (or install a symlink called xdg-terminal)." msgstr "" "Apri terminale interroga prima xdg-terminal, quindi gnome-" "terminal. xdg-terminal è uno script per individuare il terminale " "configurato dall'utente per il suo ambiente desktop. Installare xdg-" "terminal se necessario (oppure installare un collegamento con " "nome xdg-terminal)." #: C/plugins.page:44(title) msgid "Grab current selection" msgstr "Cattura la selezione corrente" #: C/plugins.page:45(p) msgid "" "To use Kupfer like a pro, you can configure a \"Magic Keybinding" "\" for Kupfer. GUI configuration is not yet supported, but edit " "the configuration file ~/.config/kupfer/kupfer.cfg to include " "the following:" msgstr "" "Per utilizzare Kupfer in modo professionale, si può configurare " "una \"associazione di tasti magica\" per Kupfer. Una " "configurazione grafica non è ancora supportata, ma è possibile modificare il " "file di configurazione ~/.config/kupfer/kupfer.cfg e includere " "quanto segue:" #: C/plugins.page:51(code) #, no-wrap msgid "" "\n" "[Kupfer]\n" "keybinding = <Control>space\n" "magickeybinding = <Ctrl><Alt>space\n" " " msgstr "" "\n" "[Kupfer]\n" "keybinding = <Control>space\n" "magickeybinding = <Ctrl><Alt>space\n" " " #: C/plugins.page:57(p) msgid "" "Now, pressing CtrlAltSpace " "will summon Kupfer with the current selection in focus. Make sure " "you have installed Kupfer's nautilus plugin, then both the " "currently selected file in Nautilus, or the currently selected text in the " "front application will be selected." msgstr "" "Ora, premendo CtrlAltSpazio verrà richiamato Kupfer con la selezione corrente in " "primo piano. Assicurarsi di avere installato il plugin per Nautilus di " "Kupfer, quindi sia il file attualmente selezionato in Nautilus, " "che il testo attualmente selezionato nell'applicazione in primo piano sarà " "selezionato." #: C/plugins.page:64(p) msgid "" "Now you can select a word in, say, a web browser, use CtrlAltSpace, and select action Look Up to look up the selected word. Or select an image file, use " "CtrlAltSpace, select " "action Scale with object 1000 to scale the image to " "1000 pixels wide!" msgstr "" "Ora si può selezionare una parola, ad esempio in un browser web usare " "CtrlAltSpazio, e " "selezionare l'azione Cerca per cercare la parola selezionata. " "Altrimenti selezionare un file immagine, usare CtrlAltSpazio, selezionare l'azione " "Scala con l'oggetto 1000 per scalare l'immagine a 1000 " "pixel di larghezza!" #: C/plugins.page:74(title) msgid "Adding your actions and scripts" msgstr "Aggiungere azioni e script personali" #: C/plugins.page:75(p) msgid "" "If you want to add a custom application, or an application called with " "special options, you can create a new launcher for it and place it in one of " "the standard places for applications, for example ~/.local/share/" "applications, where Kupfer will find it." msgstr "" "Se si vuole aggiungere una applicazione personalizzata, o una applicazione " "chiamata con opzioni speciali, si può creare un nuovo lanciatore e " "posizionarlo in una delle posizioni predefinite per le applicazioni, per " "esempio ~/.local/share/applications, dove Kupfer " "potrà trovarlo." #: C/plugins.page:81(p) msgid "" "If you have a collection of scripts that you want to call from Kupfer, you can add the scripts folder as a catalog directory to Kupfer in the preferences. Scripts that you add to Kupfer's catalog " "this way can be run directly or in the terminal as long as they are " "executable." msgstr "" "Se si ha una raccolta di script che si vuole chiamare da Kupfer, " "si può aggiungere la cartella degli script come un directory di cataloghi a " "Kupfer nelle preferenze. Gli script che vengono aggiunti nel " "catalogo di Kupfer in questo modo possono essere eseguiti " "direttamente o nel terminale a condizione che siano eseguibili." #: C/plugins.page:87(p) msgid "" "An example useful script is here which changes the rating of Rhythmbox's " "currently playing song; I have added five scriptlets calling rhrating." "py with numbers from 0 to 5 to my catalog to quickly rate tracks. " "(This is something that might be integrated into Kupfer later)" msgstr "" "Uno script di esempio utile è qui il quale cambia il giudizio di un brano " "attualmente in ascolto in Rhythmbox; ho aggiunto cinque scriptlet " "che chiamano rhrating.py con numeri da 0 a 5 per giudicare " "velocemente le tracce nel catalogo. (Questo potrebbe essere integrato in " "Kupfer successivamente)" #: C/plugins.page:97(title) msgid "Calculator Plugin" msgstr "Plugin calcolatrice" #: C/plugins.page:98(p) msgid "" "The calculator plugin lets you calculate expressions quickly. It can " "evaluate expressions entered as text starting with \"=\". Entering = from " "command mode will start text mode directly with = prefixed for quick access." msgstr "" "Il plugin calcolatrice permette di calcolare espressioni velocemente. Può " "valutare espressioni inserite come testo che iniziano con \"=\". Digitando = " "in modalità comando si entra direttamente in modalità testo con il prefisso " "= per l'accesso veloce." #: C/plugins.page:103(p) msgid "" "The Calculator uses python's math and complex math modules, and parses " "expressions as Python expressions. You may use common mathematical " "functions, such as sqrt, sin, exp and log; the command =help will " "show a list of all defined functions and constants." msgstr "" "La calcolatrice utilizza i moduli di matematica e matematica complessa di " "Python e analizza le espressioni come espressioni di Python. Si possono " "utilizzare funzioni matematiche comuni, come sqrt, sin, exp e log; il " "comando =help mostra una lista di tutte le funzioni e costanti " "definite." #: C/plugins.page:111(p) msgid "" "Notice that the power operator in Python is double stars, for example =3**3 " "will evaluate to 27." msgstr "" "Notare che l'operatore elevamento a potenza in Python è la doppia stella, " "per esempio =3**3 sarà valutato come 27." #: C/plugins.page:117(p) msgid "To calculate trig functions for angles, convert to radians first:" msgstr "" "Per calcolare le funzioni trigonometriche per gli angoli, prima convertire " "in radianti:" #: C/plugins.page:120(code) #, no-wrap msgid "sin(radians(30)) -> 0.5" msgstr "sin(radians(30)) -> 0.5" #: C/plugins.page:123(p) msgid "" "The last result is stored as the name _ (an underscore, just like in the " "Python console)." msgstr "" "L'ultimo risultato è memorizzato con il nome _ (un trattino basso, così come " "avviene in una console di Python)." #: C/plugins.page:133(title) msgid "Command line connection" msgstr "Connessione alla linea di comando" #: C/plugins.page:134(p) msgid "" "Kupfer is its own remote control. When Kupfer is " "already running, Kupfer on the command-line will focus its " "window, but there is more you can do: If you invoke kupferQUERY where QUERY is a text string or a " "filename, Kupfer will focus, and select this item. This way, you " "can quickly invoke Kupfer actions even on objects from a shell-" "based context." msgstr "" "Kupfer controlla a distanza se stesso. Quando Kupfer è " "già in esecuzione, Kupfer da riga di comando porta in primo piano " "la sua finestra, ma è possibile ottenere di più: se viene invocato " "kupferQUERY dove QUERY è una " "stringa di testo o il nome di un file, Kupfer porterà in primo " "piano e selezionerà questo elemento. In questo modo, si possono invocare " "velocemente le azioni di Kupfer persino su oggetti provenienti da " "un contesto basato su shell." #: C/plugins.page:142(p) msgid "" "For example, if you are using the shell in a directory where you have a file " "called \"report.pdf\", you can focus this file in Kupfer by " "running kupfer report.pdf." msgstr "" "Per esempio, se si utilizza la shell in una cartella in cui è presente un " "file chiamato \"report.pdf\", si può evidenziare questo file in Kupfer eseguendo kupfer report.pdf." #: C/plugins.page:147(p) msgid "" "You can also pipe the output of a command into Kupfer to send " "text to the already running instance of Kupfer." msgstr "" "Si può anche passare l'output di un comando in Kupfer per inviare " "il testo all'istanza in esecuzione di Kupfer." #: C/plugins.page:154(title) msgid "Managing Context and Current Selection" msgstr "Gestione del contesto e della selezione corrente" #: C/plugins.page:155(p) msgid "" "If you find the object you want to use, then invoke an action, Kupfer goes away to perform the action (for example start a program or play a " "song). When you come back to Kupfer, it will still keep the same " "object and action selected. Some actions make sense to be repeated (like " "skipping to the next song) and it can be useful to perform different actions " "on the same object." msgstr "" "Se è stato individuato l'oggetto da utilizzare, quindi si richiama " "un'azione, Kupfer scompare per eseguire l'azione (per esempio " "avviare un programma o riprodurre un brano). Quando si ritorna a " "Kupfer, verrà mantenuto lo stesso oggetto e l'azione selezionata. " "Alcune azioni hanno senso di essere ripetute (come saltare ad un brano " "successivo) e può essere utile eseguire azioni differenti sullo stesso " "oggetto." #: C/plugins.page:163(p) msgid "" "However, you always have the top level catalog reachable when you \"come back" "\" to Kupfer -- say you went into the subcatalog \"Albums\" to " "browse your albums only; you select and album to play, and play it. You come " "back with the album selected -- but your next search will still go over the " "top level catalog, not just albums." msgstr "" "Tuttavia, è sempre disponibile il livello superiore del catalogo " "raggiungibile quando \"si ritorna\" a Kupfer — per esempio si " "entra nel sotto catalogo \"Album\" per scorrere solo l'album selezionato; " "una volta selezionato l'album, esso viene riprodotto. Si ritorna all'album " "selezionato — ma la ricerca successiva andrà ancora al livello superiore del " "catalogo, non tra gli album." #: C/plugins.page:170(p) msgid "" "How to come back into the subcatalog you were in? You do that by simply " "browsing, not searching the first thing you do when you focus Kupfer again. A quick way is to press down-arrow or space to open the browse " "window; think of it as saying \"I want to stay in this subfolder\". With the " "browse window open, your next query will search the current subcatalog." msgstr "" "Come tornare nel sotto catalogo in cui si era in precedenza? Si può fare " "semplicemente sfogliando e non cercando nuovamente l'elemento in " "Kupfer. Un modo veloce è quello di premere la freccia verso il " "basso o spazio per aprire la finestra di navigazione; è come dire \"Voglio " "restare in questa sotto cartella\". Con la finestra di navigazione aperta, " "la prossima interrogazione cercherà nel sotto catalogo corrente." #: C/plugins.page:177(p) msgid "" "This way you can work both ways -- you can quickly drill down into folders " "to find a file, and when you come back for the next action with Kupfer you can either summon any normal toplevel object (just start typing), " "or stay around where you were, deep in that folder (press space, then type a " "query)." msgstr "" "In questo modo si può lavorare in entrambi i modi — si può rapidamente " "scendere nelle cartelle per trovare un file e quando si torna indietro per " "la prossima azione con Kupfer si può sia richiamare un oggetto " "qualsiasi dal livello superiore (iniziando a digitare), oppure rimanendo " "dove si era, scendendo in quella cartella (premere spazio, quindi digitare " "una interrogazione)." #: C/license.page:7(desc) msgid "Legal Information." msgstr "Informazioni legali." #: C/license.page:10(title) msgid "License" msgstr "Licenza" #: C/license.page:12(p) msgid "" "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." msgstr "" "Questo programma è software libero: è possibile ridistribuirlo o modificarlo " "secondo i termini della licenza GNU General Public License così " "come pubblicata dalla Free Software Foundation, nella versione 3 della " "Licenza, o (a vostra discrezione) successive." #: C/license.page:18(p) msgid "" "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." msgstr "" "Questo programma è distribuito con la speranza si dimostri utile, ma SENZA " "ALCUNA GARANZIA; si esclude anche l'implicita garanzia di COMMERCIABILITÀ o " "IDONEITÀ A UN PARTICOLARE SCOPO. Si consulti la licenza GNU General " "Public License per ulteriori dettagli." #: C/license.page:24(p) msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see gnu." "org/licenses." msgstr "" "Si dovrebbe ricevere una copia della licenza GNU General Public License con " "questo programma. In caso contrario, consultare gnu.org/licenses.\n" "La traduzione in Italiano di questa licenza non è ufficiale e da considerare " "solo a fini informativi." #: C/license.page:30(p) msgid "" "This documentation is licensed under a Creative Commons Attribution-Share Alike 3.0 " "Unported License." msgstr "" "Questa documentazione è sotto una licenza Creative Commons Attribution-Share " "Alike 3.0 Unported License." #: C/license.page:36(p) msgid "" "As a special exception, the copyright holders give you permission to copy, " "modify, and distribute the example code contained in this document under the " "terms of your choosing, without restriction." msgstr "" "Come eccezione, i detentori del copyright concedono il permesso di copiare, " "modificare e distribuire il codice di esempio contenuto in questo documento " "nei termini di tua scelta, senza restrizioni." #: C/introduction.page:7(desc) msgid "Introduction to Kupfer." msgstr "Introduzione a Kupfer." #: C/introduction.page:10(title) msgid "Introduction" msgstr "Introduzione" #: C/introduction.page:12(p) msgid "" "Kupfer is a program to change, speed up and make everything about " "files and programs more fun on your computer. Kupfer is a " "launcher; you typically use it to summon an application or a document " "quickly by typing parts of its name. It can also do more than getting at " "something quickly: there are different plugins for accessing more objects " "and running custom commands." msgstr "" "Kupfer è un programma per modificare, velocizzare e operare su " "file e programmi in modo più divertente sul tuo computer. Kupfer " "è un lanciatore; tipicamente viene utilizzato per richiamare un'applicazione " "o un documento velocemente digitando parti del suo nome. Può fare anche di " "più che ottenere qualcosa rapidamente: sono disponibili diversi plugin per " "accedere a più oggetti ed eseguire comandi personalizzati." #: C/introduction.page:22(p) msgid "" "Kupfer is written using Python and has a flexible architecture; " "the implementation is simple and makes the easy things work first. One goal " "is that new plugins can be written quickly without too much programming." msgstr "" "Kupfer è scritto in Python e ha una architettura flessibile; " "l'implementazione è semplice e fa funzionare prima le cose facili. " "L'obbiettivo principale è rendere la scrittura dei nuovi plugin veloce senza " "troppe conoscenze di programmazione." #: C/introduction.page:28(p) msgid "" "The program is very inspired by Quicksilver." msgstr "" "Il programma si ispira molto a Quicksilver." #: C/introduction.page:33(p) msgid "" "For more information about Kupfer, visit its homepage." msgstr "" "Per maggiori informazioni su Kupfer, visita la sua pagina web." #: C/index.page:9(name) msgid "Ulrik Sverdrup" msgstr "Ulrik Sverdrup" #: C/index.page:10(email) msgid "ulrik.sverdrup@gmail.com" msgstr "ulrik.sverdrup@gmail.com" #: C/index.page:13(year) msgid "2009" msgstr "2009" #: C/index.page:14(name) msgid "Kupfer Development Team" msgstr "Team di sviluppo di Kupfer" #: C/index.page:17(license) msgid "Creative Commons Share Alike 3.0" msgstr "Creative Commons Share Alike 3.0" #: C/index.page:21(title) msgid "Kupfer manual" msgstr "Manuale di Kupfer" #: C/index.page:24(title) msgid "Using Kupfer" msgstr "Utilizzo di Kupfer" #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/index.page:0(None) msgid "translator-credits" msgstr "Francesco Marella , 2010" kupfer-v208/help/kupfer.omf.in000066400000000000000000000004461176220042200164030ustar00rootroot00000000000000 manual kupfer-v208/help/pl/000077500000000000000000000000001176220042200144065ustar00rootroot00000000000000kupfer-v208/help/pl/pl.po000066400000000000000000002052371176220042200153720ustar00rootroot00000000000000# Polish translation for the kupfer help. # Copyright (C) Karol Będkowski , 2010. # This file is distributed under the same license as the kupfer package. (GPLv3) # Karol Będkowski , 2010, 2011. # msgid "" msgstr "" "Project-Id-Version: Kupfer\n" "POT-Creation-Date: 2011-03-12 21:08+0100\n" "PO-Revision-Date: 2011-03-13 21:27+0100\n" "Last-Translator: Karol Będkowski \n" "Language-Team: Polish <>\n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" msgid "Using the search the web plugin." msgstr "Użycie wtyczki przeszukiwania web" msgid "Search the Web" msgstr "Przeszukiwanie web" msgid "Basic Usage" msgstr "Podstawy obsługi" msgid "Activate Kupfer and make sure it is in free-text mode (press period)" msgstr "" "Aktywacja Kupfera i upewnienie się, że znajduje się w trybie tekstowym " "(naciśnięcie kropki)" msgid "" "Type in a search query and tap Tab to switch to the action pane." msgstr "" "Wpisanie szukanego zapytania i naciśnięcie klawisza Tab aby " "przełączyć się do panelu akcji." msgid "" "Type \"Search With\" to find Search the Web's action and tap Tab " "again to switch to the third pane (indirect object)." msgstr "" "Wpisanie \"Szukaj za pomocą\" aby znaleźć akcję \"Przeszukaj sieć..\" oraz " "naciśnięcie Tab aby przejść do trzeciego panelu (obiekt " "pośrednik)." msgid "" "Select search engine with the arrow keys and type Return to open " "the search in a web browser." msgstr "" "Wybranie wyszukiwarki za pomocą klawiszy strzałek i naciśnięcie klawisza " "Return w celu otwarcia wyników wyszukiwania w przeglądarce WWW." msgid "Search Engines" msgstr "Wyszukiwarki" msgid "" "The Search the Web plugin uses Firefox' search engines, so you " "can add Search Engines directly in Firefox and Kupfer " "will find them later." msgstr "" "Wtyczka \"Przeszukaj sieć WWW\" używa wyszukiwarek zdefiniowanych w " "programie Firefox. Dodanie nowej wyszukiwarki do programu " "Firefox pozwoli na ich późniejsze używanie w programie " "Kupfer." msgid "" "You can also install custom search plugins directly, only for Kupfer, in the folder:" msgstr "" "Dodatkowe wyszukiwarki mogą zostać zainstalowane bezpośrednio, tylko dla " "programu Kupfer, w katalogu:" #, no-wrap msgid "~/.local/share/kupfer/searchplugins/" msgstr "~/.local/share/kupfer/searchplugins/" msgid "The search engine descriptions must written in OpenSearch format." msgstr "Definicje wyszukiwarek muszą być zapisane w formacie OpenSearch." msgid "Using the triggers plugin." msgstr "Użycie wtyczki wyzwalaczy." msgid "Triggers" msgstr "Wyzwalacze" msgid "Triggers Plugin" msgstr "Wtyczka wyzwalaczy" msgid "" "With Triggers you can take a command you would normally perform " "in Kupfer, such as launching an application or opening a " "document, and bind a global key combination to run this command. As long as " "Kupfer is running, any application can have the current focus." msgstr "" "Za pomocą wyzwalaczy możliwe jest wywoływanie poleceń normalnie " "uruchamianych w Kupferze, takich jak uruchamianie programów lub " "otwieranie dokumentów, za pomocą zdefiniowanych, globalnych skrótów " "klawiszowych. Jak długo Kupfer jest uruchomiony, wyzwalacze będą " "działać niezależnie od aktualnie aktywnej aplikacji." msgid "Creating a new trigger" msgstr "Tworzenie nowego wyzwalacza" msgid "Set up a command in Kupfer that you want to run" msgstr "Wskazanie polecenia w Kupferze które ma być uruchamiane" msgid "" "Press CtrlReturn to create a " "composed command." msgstr "" "Naciśnięcie CtrlReturn w celu " "stworzenia skomponowanego polecenia" msgid "" "Type Tab and select the action Add Trigger... and press " "Return" msgstr "" "Naciśnięcie Tab, wybór akcji Dodaj wyzwalacz... i " "naciśnięcie Return" msgid "" "Using the window that appears, press modifier keys and a letter or number " "key to set a global shortcut. An example is pressing and holding " "CtrlAlt and then pressing and " "releasing R to bind CtrlAltR." msgstr "" "W oknie, które zostanie wyświetlone, naciśnięcie klawisza modyfikatora oraz " "litery lub cyfry w celu ustawienia globalnego skrótu. Przykładowo - " "naciśnięcie i przytrzymanie CtrlAlt i " "naciśnięcie i puszczenie R w celu przypisania CtrlAltR." msgid "Removing a trigger" msgstr "Usuwanie wyzwalaczy" msgid "" "Find the source Triggers in Kupfer and press to see its contents." msgstr "" "Znalezienie źródła Wyzwalacze w programie Kupfer i " "naciśnięcie klawisza w celu wyświetlenia zawartości." msgid "" "Find the active trigger in the list and use the action Remove Trigger." msgstr "" "Znalezienie aktywnego wyzwalacza na liście i użycie akcji Usuń " "wyzwalacz" msgid "" "Since trigger keyboard shortcuts are global, they can be used from any " "application. Select shortcuts with care so that they do not conflict with " "other functions." msgstr "" "Skróty klawiszowe wyzwalaczy są globalne - mogą by używane z poziomu innych " "programów. Skróty należy wybierać z rozwagą, tak aby nie powstały konflikty " "z innymi funkcjami." msgid "Power User Tips" msgstr "Porady dla zaawansowanych użytkowników" msgid "" "Proxy objects such as Selected Text, Selected File, Frontmost Window, Last Command et cetera allow very " "powerful triggers." msgstr "" "Obiekty pośredniczące takie jak zaznaczony tekst, " "wybrany plik, pierwszoplanowe okno, ostatnie " "polecenie itp pozwalają na tworzenie bardzo użytecznych wyzwalaczy." msgid "" "The application action Launch is special; if you bind a trigger " "using Launch, it will start the application if it is not running, " "but focus the application when it is already running. By contrast, Start " "Again will start the application if it is running or not." msgstr "" "Akcja programów uruchom jest specjalna. Utworzenie wyzwalacza z " "użyciem uruchom spowoduje uruchomienie programu jeżeli nie jest " "uruchomiony lub uaktywnienie jego okna gdy jest już uruchomiony. W " "przeciwieństwie uruchom ponownie uruchomi program niezależnie czy " "jest uruchomiony czy nie." msgid "Example Triggers" msgstr "Przykładowe wyzwalacze" msgid "Text Editor → Launch" msgstr "Edytor tekstu → Uruchom" msgid "" "Start Text Editor or focus its window if it is already running." msgstr "" "Uruchamia edytor tekstu lub uaktywnia jego okno gdy jest już " "uruchomiony." msgid "Selected Text → Search With → Google" msgstr "Zaznaczony tekst → Szukaj za pomocą... → Google" msgid "Search the web using the currently selected text." msgstr "Przeszukuje sieć używając aktualnie zaznaczonego tekstu." msgid "Selected File → Move To → (Downloads Folder)" msgstr "Wybrany plik → Przenieś do → (Pobrane)" msgid "Move the currently selected file to a specific folder" msgstr "Przeniesienie zaznaczonego pliku do wskazanego katalogu" msgid "Songs → Search Contents" msgstr "Utwory → Przeszukaj zawartość" msgid "" "You may even add a trigger to open a specific subcatalog in Kupfer, for " "example Rhythmbox's songs." msgstr "" "Możliwe jest dodanie wyzwalacza w celu otwierania określonego podkatalogu w " "Kupferze, na przykład utworów w Rhythmboxie." msgid "Using the notes plugin." msgstr "Użycie wtyczki notatek" msgid "Notes" msgstr "Notatki" msgid "Notes Plugin" msgstr "Wtyczka notatek" msgid "" "With Notes you can access or create new notes in either the " "program Gnote or Tomboy. Notes will work " "identically with either application—you can configure which one to use in " "the plugin's information pane in Kupfer Preferences." msgstr "" "Wtyczka Notatki umożliwia dostęp i tworzenie nowych notatek w " "programie Gnote lub Tomboy. Notatki " "działają identycznie w obu programach - wskazanie programu który ma być " "użyty możliwe jest na panelu informacyjnym wtyczki, w Ustawieniach " "Kupfera" msgid "Creating a new note" msgstr "Tworzenie nowej notatki" msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "note title" msgstr "" "Aktywacja Kupfera i naciśnięcie . w celu przejścia do trybu " "tekstowego. Następnie wpisanie tytułu notatki." msgid "" "Type Tab and select the action Create Note and press " "Return." msgstr "" "Naciśnięcie Tab, wybranie akcji Utwórz notatkę i " "naciśnięcie Return." msgid "Finding a note by title" msgstr "Szukanie notatek według tytułu" msgid "Simply search for the note title in Kupfer" msgstr "" "Wyszukanie odbywa się przez proste wyszukanie tytułu notatki w " "Kupferze" msgid "Finding a note by content" msgstr "Szukanie notatek według zawartości" msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "search query" msgstr "" "Aktywacje Kupfera, naciśnięcie . w celu przejścia do " "trybu tekstowego a następnie wpisanie szukanego tekstu." msgid "" "Type Tab and select the action Get Note Search Results... and press Return." msgstr "" "Naciśnięcie Tab, wybranie akcji Wyszukaj wśród notatek .. i naciśnięcie Return." msgid "" "You can use the Selected Text object and create a new note with the " "content of the selection." msgstr "" "Istnieje możliwość użycia obiektu Zaznaczony tekst i stworzenie nowej " "notatki z zaznaczeniem jako zawartością." msgid "Using the selected file plugin." msgstr "Użycie wtyczki \"wybrany plik\"" msgid "Selected File" msgstr "Wybrany plik" msgid "" "Select a file in the file manager. Open Kupfer and search for the " "object Selected File, which represents the file or files that are " "selected." msgstr "" "Zaznaczenie pliku w menadżerze plików, a następnie otwarcie Kupfera " "i wybranie obiektu Wybrany plik reprezentującego zaznaczony wcześniej " "plik lub pliki." msgid "" "Instead of searching, you can press CtrlG to directly focus the selected file. See " "for more information." msgstr "" "Zamiast wyszukiwać obiekt, możliwe jest jego bezpośrednie wybranie przez " "naciśnięcie CtrlG. Więcej informacji " "można znaleźć w ." msgid "Selected File requires Nautilus" msgstr "Wtyczka Wybrany plik wymaga programu Nautilus" msgid "" "The selected file plugin works with the Nautilus file browser and " "requires that the extension kupfer_provider.py is installed (it " "is normally installed together with Kupfer). After installing it " "for the first time, Nautilus must start anew before it is active." msgstr "" "Wtyczka Wybrany plik działa z menadżerem plików Nautilius i wymaga rozszerzenia kupfer_provider.py, które jest " "standardowo instalowane z Kupferem. Po pierwszej instalacji " "Nautilus musi zostać zrestartowany w celu włączenia rozszerzenia." msgid "Using the Gwibber plugin." msgstr "Użycie wtyczki Gwibber" msgid "Gwibber" msgstr "Gwibber" msgid "Gwibber Plugin" msgstr "Wtyczka Gwibber" msgid "" "With the Gwibber plugin you can send messages to social networks " "such as Twitter or Identi.ca." msgstr "" "Wtyczka Gwibber umożliwia wysyłanie wiadomości do sieci " "społecznościowych takich jak Twitter czy Identi.ca." msgid "" "The plugin requires that the application Gwibber is installed and " "configured for your user. Kupfer will start and use Gwibber's " "service in the background." msgstr "" "Wtyczka wymaga zainstalowanej i skonfigurowanej aplikacji Gwibber. Kupfer podczas pracy uruchamia i używa w tle serwisu " "Gwibbera." msgid "Sending a message to all services" msgstr "Wysyłanie wiadomości do wszystkich serwisów" msgid "" "Activate Kupfer and type . to enter text mode, then type in a " "message." msgstr "" "Aktywacja Kupfera i naciśnięcie . w celu przejścia do trybu " "tekstowego. Następnie wpisanie wiadomości." msgid "" "Type Tab and select the action Send Message and press " "Return." msgstr "" "Naciśnięcie Tab, wybór akcji Wyślij wiadomość i " "naciśnięcie Return" msgid "Sending a message to a specific service" msgstr "Wysyłanie wiadomości do określonego serwisu" msgid "" "Activate Kupfer and search for the service object, for example Identi." "ca" msgstr "" "Aktywacja Kupfera i wyszukanie obiektu serwisu - na przykład Identi.ca" msgid "Type Tab and select the action Send Message." msgstr "Naciśnięcie Tab, wybór akcji Wyślij wiadomość." msgid "" "Type Tab to select the last pane, and type in a message. Press " "Return to send." msgstr "" "Naciśnięcie Tab w celu wybrania ostatniego panelu a następnie " "wpisanie wiadomości. Naciśnięcie Return wysyła wiadomość." msgid "" "The plugin also provides a source for incoming messages, Gwibber " "Messages and more actions on messages such as Reply, Send " "Private Message etc." msgstr "" "Wtyczka dostarcza także przychodzące wiadomości (Wiadomości Gwibber) oraz więcej akcji dla wiadomości, takich jak Odpowiedz, " "Wyślij prywatną wiadomość itd." msgid "" "You can use the comma trick if you want to send a message to more " "than one service, but not all, at the same time." msgstr "" "Jest możliwe użycie triku z przecinkiem w celu wysłania wiadomości " "od razu do więcej niż jednego serwisu." msgid "Using the favorites plugin." msgstr "Użycie wtyczki \"ulubione\"" msgid "Favorites" msgstr "Ulubione" msgid "Favorites Plugin" msgstr "Wtyczka ulubione" msgid "" "With Favorites you mark objects, for example files, for quicker " "access. It is a sort of shelf on which you can store objects in Kupfer. " "Objects marked as favorites will also be ranked higher and are adorned with " "a star symbol." msgstr "" "Wtyczka Ulubione umożliwia zaznaczenie obiektów, na przykład " "plików, w celu szybszego do nich dostępu. Jest to swego rodzaju półki na " "której można umieścić obiekty w Kupferze. Dodatkowo obiekty oznaczone jako " "ulubione umieszczane są wyżej w rankingu wyszukanych obiektów oraz oznaczane " "symbolem gwiazdki." msgid "Find an object in Kupfer" msgstr "Znalezienie obiektu w Kupferze" msgid "" "Type Tab and select either the action Add to Favorites " "or Remove from Favorites." msgstr "" "Naciśnięcie Tab i wybranie akcie Dodaj do ulubionych lub " "Usuń z ulubionych." msgid "" "If you favorite an object, you can access it in more places. Not only in the " "\"Favorites\" subcatalog, but also as the indirect (secondary) object for " "some actions. For example:" msgstr "" "Obiekty oznaczone jako ulubione dostępne są w wielu miejscach - nie tylko w " "podkatalogu \"Ulubione\", ale także jako obiekty pośrednika (drugie) dla " "niektórych akcji. Na przykład:" msgid "Command-lines from favorites are quick to access." msgstr "Dostęp do ulubionych poleceń linii komend jest szybszy." msgid "" "When scaling images with the Scale... action from the Image " "Tools plugin. This action needs a size description as the third " "object, like \"1024\" or \"1200x800\". If you often scale to the same size, " "say \"1200x800\", add this to favorites, and it will always appear as a " "suggestion for the action." msgstr "" "Podczas skalowania obrazów z użyciem akcji Przeskaluj z wtyczki " "Narzędzia do obrazów, akcja ta wymaga podania rozmiaru jako " "trzeci obiekt, np \"1024\" lub \"1200x800\". Jeżeli skalowanie odbywa się " "często do tego samego rozmiaru, na przykład \"1200x800\", dodanie go do " "ulubionych spowoduje, że będzie pojawiać się jako sugerowany dla tej akcji." msgid "" "Actions needing an email address as the indirect object will pick up email " "addresses from favorites as well as well." msgstr "" "Akcje wymagające adresu email jako dodatkowego obiektu będą także pobierać " "adresy z ulubionych." msgid "Using the calculator plugin." msgstr "Użycie wtyczki kalkulator" msgid "Calculator" msgstr "Kalkulator" msgid "Calculator Plugin" msgstr "Wtyczka kalkulator" msgid "" "The calculator plugin lets you calculate expressions quickly. It can " "evaluate expressions entered as text starting with \"=\". Entering = from " "command mode will start text mode directly with = prefixed for quick access." msgstr "" "Wtyczka \"Kalkulator\" umożliwia szybkie wykonywanie obliczeń, poprzez " "obliczanie wartości wyrażeń wpisanych jako ciągi rozpoczynające się od znaki " "\"=\". Dla szybszego dostępu wprowadzenie znaku \"=\" w trybie komend " "rozpoczyna od razu tryb tekstowy." msgid "Activate Kupfer and type =" msgstr "Aktywacja Kupfera i naciśnięcie =" msgid "" "Type in a mathematical expression using +,-,/,* (and ** for exponentiation)" msgstr "" "Wpisanie wyrażenie matematycznego używającego +,-," "/,* (dla ** dla potęgowania)" msgid "Press Return to get the result." msgstr "Naciśnięcie Return w celu obliczenia rezultatu." msgid "" "The Calculator uses python's math and complex math modules, and parses " "expressions as Python expressions. You may use common mathematical " "functions, such as sqrt, sin, exp and " "log; the command =help will show a list of all defined " "functions and constants." msgstr "" "Kalkulator używa modułów pythonowych \"math\" i \"complex math\" oraz " "interpretuje wyrażenia Pythona. Wtyczka umożliwia stosowanie standardowych " "funkcji matematycznych, takich jak sqrt, sin, exp oraz log. Komenda =help wyświetla listę " "wszystkich dostępnych funkcji i stałych." msgid "" "Notice that the power operator in Python is double stars, for example " "=3**3 will evaluate to 27." msgstr "" "Proszę zauważyć, że operatorem potęgowania w Pytonie jest podwójna gwiazdka, " "na przykład wyrażenie =3**3 zostanie obliczone jako 27." msgid "To calculate trig functions for angles, convert to radians first:" msgstr "" "Aby obliczyć wartości funkcji trygonometrycznych dla kątów, muszą one zostać " "najpierw zamienione na radiany:" #, no-wrap msgid "sin(radians(30)) -> 0.5" msgstr "sin(radians(30)) -> 0.5" msgid "" "The last result is stored as the name _ (an underscore, just like in the " "Python console)." msgstr "" "Ostatni wynik jest zapisywany pod nazwą _ (podkreślenie, tak ja w konsoli " "pythonowej)" msgid "Using the applications plugin." msgstr "Użycie wtyczki programów" msgid "Applications" msgstr "Programy" msgid "Applications Plugin" msgstr "Wtyczka programy" msgid "Applications provides all installed programs." msgstr "" "Wtyczka Programy dostarcza listę wszystkich zainstalowanych " "programów." msgid "Launching an application" msgstr "Uruchamianie programu" msgid "Activate Kupfer and type an abbreviation of the application name" msgstr "Aktywacja Kupfera i wpisanie skrótu nazwy programu." msgid "Press Return to launch the application." msgstr "Naciśnięcie Return w celu uruchomienia programu." msgid "Opening a file with a specific application" msgstr "Otwieranie pliku z użyciem określonej aplikacji." msgid "Select a file in Kupfer" msgstr "Wybranie pliku w Kupferze" msgid "Type Tab and select the action Open With..." msgstr "Naciśnięcie Tab, wybór akcji Otwórz za pomocą." msgid "" "Type Tab to select the third (indirect object) pane and in it, " "select the application the file with." msgstr "" "Naciśnięcie Tab w celu przejścia do trzeciego panelu (obiekt " "pośrednik), a następnie wybranie programy dla pliku." msgid "Configuration" msgstr "Konfiguracja" msgid "" "The configuration option Applications for Desktop Environment in " "the plugin's information pane in Kupfer Preferences determines " "how Kupfer should act with regard to the desktop environment " "configuration—certain applications request not to be shown depending on " "which desktop environment is used. By default, it behaves like GNOME." msgstr "" "Parametr konfiguracyjny Programy środowiska graficznego w panelu " "informacyjnym wtyczki w Ustawieniach Kupfera określa jak " "Kupfer powinien zachowywać się przy pobieraniu konfiguracji " "środowiska graficznego - wiele aplikacji nie powinno być pokazywanych w " "zależności od aktualnie używanego środowiska graficznego. Domyślnym " "ustawieniem jest środowisko GNOME." msgid "More advanced usage information." msgstr "Informacje o zaawansowanym użyciu" msgid "Using Kupfer in Depth" msgstr "Zaawansowane używanie Kupfera>" msgid "Adding Applications and Scripts" msgstr "Dodawanie programów i skryptów" msgid "" "Kupfer will show all applications that are configured visible in " "your menu editor." msgstr "" "Kupfera będzie pokazywał wszystkie programy, które są oznaczone " "jako widoczne w edytorze menu." msgid "" "If you want to add an application manually, you can create a new ." "desktop file and place it in one of the standard directories for " "applications, for example ~/.local/share/applications, where " "Kupfer will find it." msgstr "" "W przypadku potrzeby ręcznego dodania programu użytkownik może utworzyć nowy " "plik .desktop i umieścić go w jednym ze standardowych miejsc " "dla programów, np w ~/.local/share/applications. " msgid "" "If you have a collection of scripts that you want to call from Kupfer, you can add the scripts folder as a catalog directory to Kupfer in the preferences. Scripts that you add to Kupfer's catalog " "this way can be run directly or in the terminal as long as they are " "executable." msgstr "" "Jeżeli użytkownik posiada kolekcję skryptów, które mają być uruchamiane " "poprzez Kupfera, katalog ze skryptami może zostać dodany " "bezpośrednio do Kupfera w oknie ustawień. Skrypty dodane w ten " "sposób do Kupfera mogą być uruchamiana bezpośrednio lub w " "terminalu pod warunkiem, że są one wykonywalne." msgid "" "You can also save command-lines by using the action Add to Favorites." msgstr "" "Istnieje także możliwość zapisania poleceń linii komend używając akcji " "Dodaj do ulubionych." msgid "The Comma Trick" msgstr "Trik z przecinkiem" msgid "" "The comma trick allows the user to use actions on many objects at the same " "time." msgstr "" "Trik z przecinkiem umożliwia użytkownikowi użycie akcji od razu dla wielu " "obiektów." msgid "" "Simply press comma , when an object is selected. The object is " "put on a \"stack\", and you can find yet another file or object, press comma " "to put it on the stack. When you subsequently invoke an action, the action " "is carried out on all of the objects at the same time." msgstr "" "Naciśnięcie przecinka , spowoduje umieszczenie zaznaczonego obiektu " "na \"stosie\". Kupfer umożliwia znalezienie kolejnego " "obiektu i dodanie go na stos przez ponowne naciśnięcie przecinka. Późniejsze " "wywołanie akcji uwzględni wszystkie obiekty umieszczone na stosie." msgid "" "Some actions are only \"multiplied\" when used with many objects, other are " "smarter than that:" msgstr "" "Niektóre akcje są jedynie wywoływane wielokrotnie gdy są uruchomione dla wielu " "obiektów. Inne są sprytniejsze:" msgid "" "Selecting many files and using the Create Archive action, all files will be " "packed into the same archive." msgstr "" "Zaznaczenie wielu plików i użycie akcji \"Utwórz archiwum\" spowoduje " "dodanie wszystkich plików do jednego archiwum." msgid "" "If you select multiple contacts and use a Send Email action, it creates one " "email directed at all the contacts." msgstr "" "Zaznaczenie wielu kontaktów i użycie akcji \"Wyślij Email\" utworzy jeden " "email do wszystkich wybranych kontaktów." msgid "" "If you select multiple subcatalogs (For example Firefox Bookmarks and " "Epiphany Bookmarks) and use Search Contents.., you get a subcatalog search " "restricted to the objects of those two catalogs! You can even bind a trigger " "to this command(!)" msgstr "" "Zaznaczenie wielu podkatalogów (np. Zakładki Firefox i Zakładki Epiphany) i " "użycie akcji \"Przeszukaj zawartość\" spowoduje umożliwi przeszukanie " "podkatalogu zbudowanego z obiektów pochodzących z tych dwóch katalogów. Kupfer " "umożliwia także przypisanie wyzwalacza do takiej komendy." msgid "" "The comma trick is directly taken from Quicksilver (the " "example given in the external article should work identically in Kupfer)." msgstr "" "Trik z kropką jest wzorowany bezpośrednio na programie " "Quicksilver (przykłady podane w zewnętrznym artykule powinny działać " "identycznie w Kupferze)." msgid "Grab Current Selection" msgstr "Przechwyć aktualne zaznaczenie" msgid "" "To use the current selected text, from any application, with Kupfer, you can configure a global keyboard shortcut for the action Show " "with Selection in Kupfer Preferences." msgstr "" "W celu użycia aktualnie zaznaczonego tekstu z dowolnego programu " "Kupfer umożliwia skonfigurowanie globalnego skrótu klawiszowego " "dla akcji Wyświetlenie zaznaczenia w ustawieniach Kupfera." msgid "" "If configured, pressing the global keyboard shortcut will summon " "Kupfer with the current selection as the focused object." msgstr "" "Po skonfigurowaniu, naciśnięcie globalnego skrótu klawiszowego wywoła " "Kupfera z zaznaczeniem jako wybranym obiektem." msgid "See " msgstr "Więcej informacji: " msgid "Open Terminal Here" msgstr "Uruchom terminal w tym miejscu" msgid "" "Open terminal first calls xdg-terminal, then gnome-terminal. xdg-terminal is a script to find the user's configured terminal " "program for their Desktop Environment. Install xdg-terminal if " "you need this (or install a symlink called xdg-terminal)." msgstr "" "\"Uruchom terminal\" w pierwszej kolejności próbuje uruchomić xdg-" "terminal, potem gnome-terminal. xdg-terminal jest skryptem, " "który uruchamia skonfigurowany przez użytkownika program terminala dla " "środowiska graficznego. Jeżeli istnieje taka potrzeba należy zainstalować " "xdg-terminal (lub utworzyć łącze symboliczne o nazwie " "xdg-teminal)." msgid "Command-line Connection" msgstr "Powiązania z linią komend" msgid "" "The command kupfer on the command-line will focus Kupfer if it's already running, otherwise it will start it." msgstr "" "Komenda kupfer wykonana w linii poleceń wyświetli Kupfera jeżeli jest już uruchomi. W przeciwnym wypadku - Kupfer " "zostanie uruchomiony." msgid "" "The command kupfer can be used to send files or text from the " "command-line to Kupfer. For example, if you are using the shell " "in a directory where you have a file called \"report.pdf\", you can focus " "this file in Kupfer by running kupfer report.pdf." msgstr "" "Komenda kupfer może być użyta do przesyłania plików lub tekstu z " "programów uruchamianych z linii komend do Kupfera. Dla przykładu, " "jeżeli podczas pracy w powłoce w katalogu znajduje się plik \"raport.pdf\", " "możliwe jest wybranie tego pliku w Kupferze przez uruchomienie " "kupfer raport.pdf." msgid "" "You can also send text if you pipe the output of a command into kupfer." msgstr "" "Istnieje możliwość przesłania wyniku wywołania programu do polecenia " "kupfer." msgid "Managing Context and Current Selection" msgstr "Zarządzanie kontekstem i aktualnym zaznaczeniem" msgid "" "If you find the object you want to use, then invoke an action, Kupfer goes away to perform the action (for example start a program or play a " "song). When you come back to Kupfer, it will still keep the same " "object and action selected. Some actions make sense to be repeated (like " "skipping to the next song) and it can be useful to perform different actions " "on the same object." msgstr "" "Po znalezieniu obiektu do użycia i wywołaniu akcji Kupfer znika w " "celu jej przeprowadzania (na przykład uruchomienie programu lub odtworzenie " "utworu). Po powrocie do Kupfera poprzednio wybrany obiekt i akcja " "nadal pozostają wybrane. Pozwala to na szybkie powtórzenie ostatnich akcji " "(dla akcji dla których to ma sens - na przykład przeskoczenie do kolejnego " "utworu muzycznego) a także może być użyteczne przy przeprowadzaniu innej " "akcji na tym samym obiekcie." msgid "" "However, you always have the top level catalog reachable when you \"come back" "\" to Kupfer -- say you went into the subcatalog \"Albums\" to " "browse your albums only; you select an album to play, and play it. You come " "back with the album selected -- but your next search will still go over the " "top level catalog, not just albums." msgstr "" "Jednakże, kiedy użytkownik powraca do Kupfera ma zawsze dostępny " "najwyższy poziom katalogu. Przykładowo po wejściu do podkatalogu \"Albumy\" " "w celu przejrzenia albumów, użytkownik może wybrać album i włączyć jego " "odtwarzanie. Kiedy powróci do Kupfera album pozostanie wybrany, " "ale wyszukiwanie będzie odbywało się na najwyższym poziomie katalogu a nie " "albumu." msgid "" "How to come back into the subcatalog you were in? You do that by simply " "browsing, not searching the first thing you do when you focus Kupfer again. A quick way is to press down-arrow or space to open the browse " "window; think of it as saying \"I want to stay in this subfolder\". With the " "browse window open, your next query will search the current subcatalog." msgstr "" "Aby powrócić do podkatalogu, który został poprzednio wybrany, należy wykonać " "najpierw przeglądanie katalogu (nie rozpoczynać od wyszukiwania). " "Najszybszym sposobem jest naciśniecie klawisza strzałki w dół lub spacji w " "celu otwarcia okna przeglądarki. Gdy okno przeglądarki zostanie otwarte, " "kolejne wyszukiwanie będzie odbywało się w aktualnym podkatalogu." msgid "" "This way you can work both ways -- you can quickly drill down into folders " "to find a file, and when you come back for the next action with Kupfer you can either summon any normal toplevel object (just start typing), " "or stay around where you were, deep in that folder (press space, then type a " "query)." msgstr "" "Tym sposobem istnieje możliwość pracy na oba sposoby - można szybko zagłębić " "się w katalogi w celu znalezienia pliku, a po wykonaniu akcji i powrocie " "można albo dotrzeć do każdego, pierwszopoziomowego obiektów (przez " "rozpoczęcie pisania) lub pozostać w miejscu gdzie się było poprzednio, w " "zagnieżdżonym katalogu (przez naciśnięcie spacji, a później pisanie)." msgid "Saving Commands as Files" msgstr "Zapisywanie poleceń jako pliki" msgid "" "You can use keyboard shortcut for Compose Command (by default it is " "CtrlReturn) to create a command " "object out of the currently focused command in Kupfer. This object can be " "saved as a runnable file if you use the Save As... action. The " "resulting file will can be executed when opened from the file manager (it " "requires that Kupfer is already running)." msgstr "" "Kupfer umożliwia użycie skrótu klawiszowego dla komendy " "komponuj (domyślnie CtrlReturn) w celu utworzenia obiektu komendy na podstawie aktualnie " "podświetlonego polecenia w Kupferze. Obiekt taki może być zapisany jako " "uruchamialny plik przez użycie akcji Zapisz jako.... Plik, który w " "rezultacie zostanie utworzony, może zostać otwarty przez menadżer plików " "(wymaga uruchomionego Kupfera)." msgid "Using plugins with Kupfer." msgstr "Używanie wtyczek w Kupfera" msgid "How to Configure Plugins" msgstr "Konfiguracja wtyczek" msgid "" "Functionality in Kupfer is organized by extentsion modules called \"plugins" "\". Each plugin provides additional functionality, for example integration " "with an external application." msgstr "" "Funkcje w Kupferze są umieszczone w modułach rozszerzających zwanych " "\"wtyczkami\". Każda wtyczka dostarcza dodatkowe funkcje, na przykład - " "integrację z zewnętrznymi programami." msgid "Configuring Plugins" msgstr "Konfiguracja wtyczek" msgid "Open Kupfer Preferences to the Plugins tab" msgstr "Otwarcie Ustawienia Kupfera i zakładki \"Wtyczki\"." msgid "Use one of the following methods:" msgstr "Otwarcie okna ustawień jest możliwe poprzez:" msgid "" "Click the Kupfer icon in the notification area and select the item " "Preferences" msgstr "" "Kliknięcie ikony Kupfera w obszarze powiadamiania i wybranie Ustawienia" msgid "" "Search for the object Kupfer Preferences in Kupfer itself. Press " "Return to open it." msgstr "" "Znalezienie obiektu Ustawienia Kupfera w Kupferze. Naciśnięcie " "klawisza Return otwiera okno ustawień." msgid "Use the keyboard shortcut Ctrl;" msgstr "" "Użycie skrótu klawiszowego Ctrl;" msgid "Select the tab Plugins" msgstr "Wybranie zakładki Wtyczki" msgid "" "Select plugins in the list to read about them, and tick the box next to its " "name to activate the plugin, or untick to deactivate." msgstr "" "Zaznaczenie wtyczki na liście wyświetli informacje o niej. Zaznaczenie pola " "obok nazwy wtyczki aktywuje ją, odznaczenie - wyłącza ją." msgid "" "If the plugin has any configurable parameters, they will be visible below " "the plugin information." msgstr "" "Jeżeli wtyczka posiada konfigurowalne parametry, zostaną one wyświetlone " "poniżej informacji o wtyczce." msgid "" "The plugin Kupfer Plugins allows fast access to each plugin's " "information page as well as the action \"Show Source Code\" which reveals " "the implementation." msgstr "" "Wtyczka Wtyczki Kupfera pozwala na szybki dostęp do informacji na " "temat poszczególnych wtyczek, a także udostępnia akcję \"Wyświetl kod " "źródłowy\" umożliwiającą podgląd implementacji." msgid "If a Plugin can not be Activated" msgstr "Problemy z aktywacją wtyczki" msgid "" "If a plugin fails to activate because it requires a software module that is " "not available, its plugin information will display a message like this:" msgstr "" "Jeżeli wtyczka nie może zostać włączona z powodu braku wymaganego, " "zewnętrznego modułu na panelu informacyjnym pokazuje się odpowiednia " "informacja, na przykład:" msgid "Plugin could not be read due to an error:" msgstr "Wtyczka nie może być wczytana ze względu na błąd:" msgid "Python module 'gdata' is needed" msgstr "Wymagany jest moduł Pythona 'gdata'." msgid "" "This means that you need to install a needed python module from your " "distribution—and possibly the plugin documentation can tell you how." msgstr "" "Komunikat taki oznacza, że należy zainstalować wymagany moduł Pythona - " "prawdopodobnie dokumentacja wtyczki dostarcza więcej informacji jak to " "zrobić." msgid "" "The plugin may also unexpectedly fail to load, and display a different error " "message. It may then be a program error in either the plugin or Kupfer." msgstr "" "Podczas ładowania wtyczki może także wystąpić nieoczekiwany błąd i pojawić " "się inny komunikat błędu. Może to oznaczać błąd programistyczny we wtyczce " "lub w Kupferze." msgid "Installing more Plugins" msgstr "Instalacja kolejnych wtyczek" msgid "" "You can install custom plugins into the folder ~/.local/share/kupfer/" "plugins. Each plugin is either a single .py file or a " "python package (a folder directly containing a file called __init__." "py). Plugins in the package format can include icon files. Python " "packages can even be installed as .zip files." msgstr "" "Użytkownik ma możliwość instalacji dodatkowych wtyczek w katalogu ~/." "local/share/kupfer/plugins. Każda wtyczka jest w postaci pojedynczego " "pliku .py lub w postaci pakietu pythona (katalog zawierający " "przynajmniej plik __init__.py). Wtyczki w postaci pakietów mogą " "zawierać pliki ikon. Pakiety pythona mogą być instalowane jako pliki ." "zip." msgid "" "Caution: Treat a plugin as a computer program. Do not install " "untrusted plugins." msgstr "" "Uwaga: Wtyczki są programami komputerowymi. Nie należy instalować " "wtyczek z niezaufanych źródeł." msgid "Creating Plugins" msgstr "Tworzenie wtyczek" msgid "" "Documentation for plugin creators is available in the file " "Documentation/Manual.rst in the source distribution on the " "webpage at Kupfer " "Manual. An easy way to start is to copy an existing plugin and " "experimenting with it." msgstr "" "Dokumentacja dla twórców wtyczek jest dostępna w pliku Documentation/" "Manual.rst dostarczanym ze źródłami programu na stronie Kupfera. Najprostszą metodą " "na rozpoczęcie pracy jest skopiowanie istniejącej wtyczki i " "eksperymentowanie z nią." msgid "The Catalog Tab in Preferences" msgstr "Zakładka Katalog w oknie ustawień" msgid "" "Each plugin can export a number of sources which contain objects. Normally, " "all these objects are directly accessible from a top-level search. Some " "plugins export so specialized or so many objects that their catalogs should " "better not have their objects exported to the top level. To reach those " "objects, you have to first find the catalog by name, then enter the catalog " "using the action Search Contents." msgstr "" "Każda wtyczka ma możliwość eksportowania pewnej ilości źródeł zawierających " "obiekty. W normalnej sytuacji, wszystkie z tych obiektów są bezpośrednio " "dostępne na najwyższym poziomie listy wyszukiwania. Niektóre wtyczki " "eksportują bardzo wyspecjalizowane obiektu lub bardzo dużą ich ilość i " "niekoniecznie powinny być wyświetlone na najwyższym poziomie listy. Aby " "dostać się do tych obiektów należy najpierw wyszukać katalog na podstawie " "jego nazwy, a następnie wejść do niego używając akcji Przeszukaj " "zawartość." msgid "" "In the tab Catalog in Kupfer Preferences, a ticked box " "next to each source means that its objects are exported. An unticked box " "means that its contents are hidden from the top level." msgstr "" "W zakładce Katalog w ustawieniach Kupfera zaznaczenie " "pola przy poszczególnych źródłach oznacza, że jego obiekt będą eksportowane. " "Odznaczenie pola oznacza, że obiekty danego źródła są ukryte na najwyższym " "poziomie listy." msgid "" "Note: Kupfer may become slow if large enough subcatalogs are " "exported to the top level." msgstr "" "Uwaga: Kupfer może zachowywać się wolno jeżeli znacząca ilość " "podkatalogów jest eksportowana na najwyższy poziom listy." msgid "You can copy, modify and share Kupfer." msgstr "Użytkownik może kopiować, modyfikować i dzielić się Kupferem." msgid "License" msgstr "Licencja" msgid "" "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." msgstr "" "Niniejszy program jest wolnym oprogramowaniem; możesz go rozprowadzać dalej " "i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU<.em>, " "wydanej przez Fundację Wolnego Oprogramowania - według wersji 3 tej Licencji " "lub (według twojego wyboru) którejś z późniejszych wersji." msgid "" "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." msgstr "" "Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - " "jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI " "HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. W celu uzyskania " "bliższych informacji sięgnij do Powszechnej Licencji Publicznej GNU." msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see gnu." "org/licenses." msgstr "" "Z pewnością wraz z niniejszym programem otrzymałeś też egzemplarz " "Powszechnej Licencji Publicznej GNU (GNU General Public License); jeśli nie " "- wejdź na ." msgid "" "This documentation is licensed under a Creative Commons Attribution-Share Alike 3.0 " "Unported License." msgstr "" "Ta dokumentacja jest licencjonowana na zasadach Creative Commons Attribution-Share " "Alike 3.0 Unported License." msgid "" "As a special exception, the copyright holders give you permission to copy, " "modify, and distribute the example code contained in this document under the " "terms of your choosing, without restriction." msgstr "" "Jak specjalny wyjątek właściciel praw autorskich zezwala na kopiowanie, " "modyfikację i dystrybucję przykładowych kodów źródłowych zawartych w " "niniejszej dokumentacji pod dowolnie wybranymi warunkami, bez ograniczeń," msgid "Complete keyboard shortcuts reference." msgstr "Kompletna lista skrótów klawiszowych." msgid "Command Keys and Accelerator Keys" msgstr "Klawisze poleceń oraz klawisze akceleratorów" msgid "Keyboard Interface" msgstr "Klawiatura" msgid "In command mode, the following keystrokes have special meanings:" msgstr "W trybie komend następujące klawisze posiadają specjalne znaczenie:" msgid " or Space" msgstr " lub Spacja" msgid "Go to the next match" msgstr "Przejście do następnego znalezionego obiektu" msgid " or ShiftSpace" msgstr " lub ShiftSpacja" msgid "Go to the previous match" msgstr "Przejście do poprzedniego znalezionego elementu" msgid " or /" msgstr " lub /" msgid "Descend into an object with content" msgstr "Wejście do obiektu posiadającego zawartość" msgid "Backspace" msgstr "Backspace" msgid "Erase a character from the query. If the query is empty, go up a level" msgstr "" "Usunięcie znaku z zapytania. Jeżeli zapytanie jest puste - przejście na " "wyższy poziom." msgid "." msgstr "." msgid "Activate free-text mode" msgstr "Aktywacja trybu \"tekstowego\"" msgid "," msgstr "," msgid "Put selected object on the stack (\"Comma Trick\")" msgstr "Odłożenie zaznaczonego obiektu na stosie (\"trik z przecinkiem\")" msgid "Quick access keys:" msgstr "Klawisze szybkiego dostępu:" msgid "=" msgstr "=" msgid "" "Activate free-text mode with = prefix (for )" msgstr "" "Aktywacja trybu tekstowego z prefiksem = (dla )" msgid "/" msgstr "/" msgid "" "Activate free-text mode (when nothing is selected) with / " "prefix (to input a rooted path)" msgstr "" "Aktywacja trybu tekstowego (gdy nic nie jest zaznaczone) z prefiksem /" " (dla wprowadzania ścieżki względem korzenia /)." msgid "Additionally:" msgstr "Dodatkowo:" msgid "" "Return activates the current selection: the command is executed." msgstr "" "Return aktywuje zaznaczony obiekt - polecenie jest wykonywane." msgid "Escape clears the current selection." msgstr "Escape usuwa aktualne zaznaczenie." msgid "Tab switches between the object and the action pane." msgstr "Tab przełącza między obiektem i panelem akcji." msgid "" "The meaning of the keys Space, ., ,, /" " and = can not be changed, but you can deactivate their " "special meaning with the checkbox Use single keystroke commands " "in Kupfer Preferences." msgstr "" "Znaczenie klawiszy Spacja, ., ,, / oraz = może być zmienione, ale w tym celu należy najpierw " "wyłączyć ich specjalne działanie przez odznaczenie pola Włączenie jedno-" "klawiszowych poleceń w ustawieniach Kupfera." msgid "Kupfer's Keyboard Shortcuts" msgstr "Skróty klawiszowe Kupfera" msgid "" "These keyboard shortcuts are used in Kupfer's interface. They " "have the following meanings and default shortcuts:" msgstr "" "Poniższe skróty klawiszowe są użyte w interfejsie Kupfera i " "posiadają one domyślnie następujące znaczenie:" msgid "Ctrl" msgstr "Ctrl" msgid "Toggle text mode" msgstr "Przełączenie trybu tekstowego" msgid "The comma trick" msgstr "Trik z przecinkiem" msgid ";" msgstr ";" msgid "Show preferences window" msgstr "Wyświetlenie okna ustawień" msgid "R" msgstr "R" msgid "Reset all" msgstr "Resetuj wszystko" msgid "Alt" msgstr "Alt" msgid "A" msgstr "A" msgid "Alternate activate" msgstr "Alternatywna aktywacja" msgid "Return" msgstr "Return" msgid "Compose command" msgstr "Polecenie \"komponuj\"" msgid "S" msgstr "S" msgid "Switch to first pane" msgstr "Przełączenie do pierwszego panelu" msgid "Q" msgstr "Q" msgid "Select 'Quit'" msgstr "Wybranie \"Zakończ\"" msgid "G" msgstr "G" msgid "Select 'Selected File'" msgstr "Wybranie \"Wybrany plik\"" msgid "T" msgstr "T" msgid "Select 'Selected Text'" msgstr "Wybranie \"Zaznaczony tekst\"" msgid "F1" msgstr "F1" msgid "Show Help" msgstr "Wyświetlenie pomocy" msgid "How to configure a keyboard shortcut" msgstr "Konfiguracja skrótów klawiszowych" msgid "Open Kupfer Preferences and go to the Keyboard tab." msgstr "" "Otwarcie ustawień Kupfera i przejście do zakładki Klawiatura." msgid "" "Double-click the shorcut's row under Browser Keyboard Shortcuts." msgstr "" "Dwukrotne kliknięcie wiersza ze skrótem pod Skróty klawiszowe listy " "elementów." msgid "" "Using the window that appears, press modifier keys and a letter or number " "key to set a global shortcut. An example is pressing and holding Ctrl and then pressing and releasing T to bind CtrlT." msgstr "" "Za pomocą okna, które zostanie wyświetlone, nacisnąć klawisz modyfikatora i " "klawisz litery lub cyfry w celu ustawienia skrótu. Przykładowo naciskając i " "przytrzymując klawisz Ctrl oraz naciskając i puszczając klawisz " "T zostanie przypisany skrót CtrlT." msgid "Global Keyboard Shortcuts" msgstr "Globalne skróty klawiszowe" msgid "" "Kupfer always listens to global shortcuts, even if it is not " "currently in the foreground." msgstr "" "Kupfer zawsze reaguje na globalne skróty klawiszowe, nawet gdy " "nie jest w danej chwili aktywny." msgid "They have the following meanings and default shortcuts:" msgstr "" "Globalne skróty klawiszowe obejmują następujące akcje i posiadają domyślne " "przypisania:" msgid "Space" msgstr "Spacja" msgid "Show/hide Kupfer" msgstr "Pokaż / ukryj Kupfera" msgid "(not configured by default)" msgstr "(domyślnie nieskonfigurowane)" msgid "Show Kupfer with 'Selection' object focused" msgstr "Pokazanie Kupfera z wybranym obiektem \"Zaznaczenie\"." msgid "How to configure a global keyboard shortcut" msgstr "Konfiguracja globalnych skrótów klawiszowych" msgid "" "Double-click the shorcut's row under Global Keyboard Shortcuts." msgstr "" "Dwukrotne kliknięcie wiersza skrótu pod Globalne skróty klawiszowe." msgid "" "Using the window that appears, press modifier keys and a letter or number " "key to set a global shortcut. An example is pressing and holding Super and then pressing and releasing Space to bind " "SuperSpace." msgstr "" "Za pomocą okna, które zostanie wyświetlone, nacisnąć klawisz modyfikatora i " "klawisz litery lub cyfry w celu ustawienia skrótu. Przykładowo naciskając i " "przytrzymując klawisz Super oraz naciskając i puszczając klawisz " "Spacja zostanie przypisany skrót SuperSpacja." msgid "" "Since these keyboard shortcuts are global, they can be used from any " "application. Select shortcuts with care so that they do not conflict with " "other functions." msgstr "" "Skróty klawiszowe są globalne co oznacza, że mogą być użyte z dowolnego " "programu. Należy uważnie wybierać skróty klawiszowe, tak aby nie spowodowały " "one problemów z innymi funkcjami." msgid "" "The plugin Triggers allows to activate actions with global keyboard " "shortcuts. Trigger shortcuts do not appear in Kupfer Preferences." msgstr "" "Wtyczka Wyzwalacze pozwala na aktywację akcji za pomocą globalnych " "skrótów klawiszowych. Skróty klawiszowe wtyczki wyzwalaczy nie są " "wyświetlane w oknie Ustawienia Kupfera." msgid "See for more information." msgstr "Więcej informacji można znaleźć w ." msgid "Introduction to Kupfer." msgstr "Wprowadzenie do Kupfera" msgid "Introduction" msgstr "Wprowadzenie" msgid "" "Kupfer is an interface for quick and convenient access to " "applications and their documents." msgstr "" "Kupfer jest interfejsem umożliwiającym szybki i wygodny dostęp " "dla programów i dokumentów." msgid "" "The most typical use is to find a specific application and launch it. We " "have tried to make Kupfer easy to extend with plugins so that " "this quick-access paradigm can be extended to many more objects than just " "applications." msgstr "" "Najbardziej podstawowym użyciem jest znalezienie określonego programu i " "uruchomienie go. Kupfer został zaprojektowany w sposób " "umożliwiający łatwe rozszerzanie go przez wtyczki, więc szybki dostęp może " "dotyczyć wielu różnych obiektów - nie tylko programów." msgid "" "We hope that using Kupfer feels both very fun and " "different." msgstr "" "Autorzy mają nadzieję, że używanie Kupfera sprawi dużo " "przyjemności i ułatwi życie użytkownikowi." msgid "" "For up-to-date information about Kupfer, visit its homepage." msgstr "" "Najświeższe informacje na temat Kupfera można znaleźć na jego " "stronie domowej." msgid "Ulrik Sverdrup" msgstr "Ulrik Sverdrup" msgid "ulrik.sverdrup@gmail.com" msgstr "ulrik.sverdrup@gmail.com" msgid "2009" msgstr "2009" msgid "Kupfer Development Team" msgstr "Kupfer Development Team" msgid "Creative Commons Share Alike 3.0" msgstr "Creative Commons Share Alike 3.0" msgid "Kupfer Manual" msgstr "Podręcznik Kupfera" msgid "Using Kupfer" msgstr "Używanie Kupfera" msgid "About Specific Plugins" msgstr "Informacje o niektórych wtyczkach" msgid "How to start using Kupfer." msgstr "Rozpoczęcie pracy z Kupferem" msgid "" "Kupfer is to the largest part a keyboard-managed interface to " "applications and documents." msgstr "" "Kupfer jest głównie \"klawiaturowym interfejsem\" dla programów i " "dokumentów." msgid "" "Kupfer's default mode is the command mode: If you type a query, kupfer will " "search for a match in its catalog." msgstr "" "Domyślnym trybem pracy Kupfera jest tryb komend - wpisanie ciągu znaków " "spowoduje, że Kufer wyszuka pasujące obiekty w jego katalogu." msgid "" "The arrow keys allow you to browse query matches quite naturally, going to " "the previous or next match, and going up and down in the subcatalogs." msgstr "" "Klawisz strzałek pozwalają na przeglądanie wyszukanych elementów, " "przechodząc do poprzedniego lub następnego znalezionego obiektu oraz " "poruszając się w górę i w dół podkatalogu." msgid "In command mode, some keystrokes have special meanings:" msgstr "W trybie komend pewne klawisze posiadają specjalne znaczenie:" msgid "" "By default you show Kupfer using the global keyboard shortcut " "CtrlSpace." msgstr "" "Domyślnie wyświetlenie okna Kupfera następuje po naciśnięciu " "klawiszy CtrlSpacja." msgid "See for more information." msgstr "Więcej informacji można znaleźć w ." msgid "Learning Habits" msgstr "Nauka przyzwyczajeń" msgid "" "Kupfer remembers which objects and actions are used the most. " "When beginning to use it, you have to use the arrow keys at times to make it " "precise which object you want to find. After a few uses of that object, " "Kupfer will rank it higher. Objects marked as favorites are also ranked higher." msgstr "" "Kupfer zapamiętuje które obiekty i akcje są używane najczęściej. " "Na początku używania konieczne będzie wielokrotne używanie klawiszy strzałek " "w celu znalezienia szukanego obiektu. Po kilku użyciach danego obiektu " "Kupfer umieści go wyżej na swojej liście. Obiekty zaznaczone jako ulubione również są umieszczane wyżej." msgid "The Catalog" msgstr "Katalog" msgid "" "The Catalog is the collection of objects you can access in Kupfer, such as " "documents and programs." msgstr "" "Katalog jest kolekcją obiektów, do których Kupfer umożliwia dostęp, takich " "jak dokumenty i programy." msgid "" "Objects in the catalog that have content, like folders, are marked with an " "arrow. Pressing will enter these objects. Much of the catalog " "is composed of subcatalogs; plugin subcatalogs do in general list objects " "that are also available directly from the top level. Subcatalogs can be used " "for a narrower view or search scope, when using Kupfer." msgstr "" "Obiekty w katalogu, które posiadają zawartość (tak jak foldery), są " "oznaczone strzałką. Naciśnięcie pokazuje zawartość tych " "obiektów. Wiele z katalogów składa się z podkatalogów; wtyczka \"podkatalogi" "\" tworzy ogólną listę obiektów, które są także bezpośrednio dostępne na " "najwyższym poziomie. Podkatalogi mogą być użyte do zawężenia wyświetlania " "lub wyszukiwania elementów podczas używania Kupfera." msgid "" "Most subcatalogs update their content automatically. For example, the " "Desktop folder source is always up-to-date." msgstr "" "Większość podkatalogów aktualizuje swoją zawartość automatycznie. Na " "przykład katalog \"Pulpit\" jest zawsze aktualny." #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 msgid "translator-credits" msgstr "Karol Będkowski , 2010" #~ msgid "Using Kupfer more conveniently." #~ msgstr "Wygodniejsze używani\te Kupfera" #~ msgid "" #~ "Kupfer listens to global shortcuts, even if Kupfer is not currently in " #~ "the foreground. The most important global shortcut is the shortcut to " #~ "show and hide Kupfer's command window which by default is " #~ "CtrlSpace." #~ msgstr "" #~ "Kupfer reaguje na globalne skróty klawiszowe nawet, gdy jego okno jest " #~ "aktualnie ukryte. Najważniejszym skrótem klawiszowym jest polecenie " #~ "pokazania i ukrycia okna Kupfera - domyślnie jest to CtrlSpacja." #~ msgid "Global Keyboard Shortcuts are configured in Kupfer's preferences." #~ msgstr "" #~ "Globalne skróty klawiszowe są konfigurowane w oknie ustawień Kupfera." #~ msgid "" #~ "The Triggers plugin allows to configure actions to be activated by global " #~ "shortcuts, but triggers can only be configured in that plugin." #~ msgstr "" #~ "Wtyczka \"Wyzwalacze\" pozawala na konfigurację akcji, które mogą być " #~ "uruchamiane przez globalne skróty klawiszowe. Wyzwalacze mogę być " #~ "konfigurowane jedynie poprzez tę wtyczkę." #~ msgid "" #~ "Additional keyboard shortcuts that work with Kupfer when it is in the " #~ "foreground can be configured in Kupfer's preferences." #~ msgstr "" #~ "Dodatkowe skróty klawiszowe, które działają gdy okno Kupfera jest na " #~ "pierwszym planie, mogą być konfigurowane w oknie ustawień Kupfera." #~ msgid "" #~ "Install custom plugins in the folder ~/.local/share/kupfer/plugins/" #~ "" #~ msgstr "" #~ "Dodatkowe wtyczki mogą zostać umieszczone w ~/.local/share/kupfer/" #~ "plugins/" #~ msgid "" #~ "Kupfer cache, config and data are located in the directories ~/." #~ "cache/kupfer, ~/.config/kupfer and ~/.local/" #~ "share/kupfer." #~ msgstr "" #~ "Pamięć podręczna, konfiguracja i pliki danych są umieszczane w katalogach " #~ "~/.cache/kupfer, ~/.config/kupfer i ~/." #~ "local/share/kupfer." #~ msgid "" #~ "You can install custom plugins into ~/.local/share/kupfer/plugins; adding " #~ "to Kupfer's object knowledge can be surprisingly easy, just " #~ "look at the default plugins if you want to create new." #~ msgstr "" #~ "Użytkownik może zainstalować dodatkowe wtyczki w katalogu ~/.local/share/" #~ "kupfer/plugins. Dodawanie do Kupfera dodatkowych źródeł " #~ "obiektów jest zaskakująco proste - podstawę do ich stworzenia mogą " #~ "stanowić domyślne wtyczki." #~ msgid "" #~ "To use Kupfer like a pro, you can configure a \"Magic " #~ "Keybinding\" for Kupfer. GUI configuration is not yet " #~ "supported, but edit the configuration file ~/.config/kupfer/kupfer." #~ "cfg to include the following:" #~ msgstr "" #~ "Aby używać Kupfera jak zawodowiec, użytkownik może " #~ "skonfigurować \"magiczne skróty klawiszowe\" dla programu Kupfer. Konfiguracja ta nie jest wspierana przez interfejs programu, ale " #~ "użytkownik może edytować plik konfiguracyjny ~/.config/kupfer/" #~ "kupfer.cfg, który zawiera:" #~ msgid "" #~ "\n" #~ "[Kupfer]\n" #~ "keybinding = <Control>space\n" #~ "magickeybinding = <Ctrl><Alt>space\n" #~ " " #~ msgstr "" #~ "\n" #~ "[Kupfer]\n" #~ "keybinding = <Control>space\n" #~ "magickeybinding = <Ctrl><Alt>space\n" #~ " " #~ msgid "" #~ "Now, pressing CtrlAltSpace will summon Kupfer with the current selection in " #~ "focus. Make sure you have installed Kupfer's nautilus plugin, " #~ "then both the currently selected file in Nautilus, or the currently " #~ "selected text in the front application will be selected." #~ msgstr "" #~ "Naciśnięcie CtrlAltSpacja wywoła program Kupfer z wybranym aktualnym " #~ "zaznaczeniem. W przypadku zainstalowania wtyczki dla Nautilusa " #~ "zaznaczenia pliku w Nautilusie spowoduje jego wybranie w Kupferrze." #~ msgid "" #~ "Now you can select a word in, say, a web browser, use CtrlAltSpace, and select action Look " #~ "Up to look up the selected word. Or select an image file, use " #~ "CtrlAltSpace, select " #~ "action Scale with object 1000 to scale the image to " #~ "1000 pixels wide!" #~ msgstr "" #~ "Użytkownik ma możliwość zaznaczenia słowa na przykład w przeglądarce " #~ "internetowej, a poprzez nazciśnięcie CtrlAltSpace i wybranie akcji \"Znajdź\" " #~ "znaleźć wybrane słowo. Inny przykład - po zaznaczeniu pliku obrazu " #~ "użytkownik może użyć CtrlAltSpacja, wybrać akcję Skaluj z obiektem 1000 " #~ "aby przeskalować obraz do szerokości 1000 pikseli." #~ msgid "" #~ "An example useful script is here which changes the rating of Rhythmbox's currently playing song; I have added five scriptlets calling " #~ "rhrating.py with numbers from 0 to 5 to my catalog to " #~ "quickly rate tracks. (This is something that might be integrated into " #~ "Kupfer later)" #~ msgstr "" #~ "Przykładowy, użyteczny skryptem pozwala na zmianę oceny aktualnie odtwarzanego " #~ "przez Rhytmbox utworu. Po dodaniu pięciu skryptletów zwanych " #~ "rhrating.py z numerami od 0 do 5 do katalogu możliwe jest " #~ "szybkie ocenianie utworów. (Być może zostanie to zintegrowane z " #~ "Kupferem w późniejszym czasie)." #~ msgid "" #~ "Kupfer is its own remote control. When Kupfer is " #~ "already running, Kupfer on the command-line will focus its " #~ "window, but there is more you can do: If you invoke kupferQUERY where QUERY is a text string or a " #~ "filename, Kupfer will focus, and select this item. This way, " #~ "you can quickly invoke Kupfer actions even on objects from a " #~ "shell-based context." #~ msgstr "" #~ "Kupfer może zdalnie sterować sam sobą. Kiedy Kupfer " #~ "jest już uruchomiony uruchomienie Kupfera z linii komend " #~ "przywoła jego okno na pierwszy plan lub - gdy zostanie wywołany jako " #~ "kupfer ZAPYTANIE, gdzie ZAPYTANIE jest napisem lub nazwą plików - zostanie wyświetlone okno " #~ "Kupfera oraz zaznaczony odpowiedni obiekt. W ten sposób można " #~ "szybko wywoływać w Kupferze akcję dla obiektów podczas pracy z " #~ "powłoką." #~ msgid "" #~ "You can also pipe the output of a command into Kupfer to send " #~ "text to the already running instance of Kupfer." #~ msgstr "" #~ "Istnieje także możliwość przesłania wyniku komendy do Kupfera " #~ "w celu przesłania tekstu do już uruchomionej instancji Kupfera." #~ msgid "Legal Information." #~ msgstr "Informacje prawne." #~ msgid "" #~ "Kupfer is a program to change, speed up and make everything " #~ "about files and programs more fun on your computer. Kupfer is " #~ "a launcher; you typically use it to summon an application or a document " #~ "quickly by typing parts of its name. It can also do more than getting at " #~ "something quickly: there are different plugins for accessing more objects " #~ "and running custom commands." #~ msgstr "" #~ "Kupfer jest programem który zmienia, przyśpiesza i robi " #~ "wszystko co związane z plikami i programami bardziej przyjemnym. " #~ "Kupfer jest aktywatorem, użytkownicy zwykle używają go aby " #~ "wywołać programy lub dokumenty szybko, przez wpisanie części ich nazwy. " #~ "Potrafi także zrobić dużo więcej niż wybieranie czegoś szybko - istnieje " #~ "wiele różnych wtyczek dostarczających wiele obiektów i uruchamiające " #~ "specjalne polecenia." #~ msgid "" #~ "Kupfer is written using Python and has a flexible " #~ "architecture; the implementation is simple and makes the easy things work " #~ "first. One goal is that new plugins can be written quickly without too " #~ "much programming." #~ msgstr "" #~ "Kupfer jest napisany z życiem Pythona i posiada elastyczną " #~ "architekturę - implementacja jest prosta i sprawia, że proste rzeczy " #~ "działają od razu. Jednym z celów jest umożliwienie szybkiego tworzenia " #~ "nowych wtyczek bez większego programowania." #~ msgid "" #~ "The program is very inspired by Quicksilver." #~ msgstr "" #~ "Inspiracją dla tego programu jest Quicksilver." kupfer-v208/help/sl/000077500000000000000000000000001176220042200144115ustar00rootroot00000000000000kupfer-v208/help/sl/sl.po000066400000000000000000002210201176220042200153640ustar00rootroot00000000000000# Slovenian translation for kupfer help. # Copyright (C) 2010 kupfer's COPYRIGHT HOLDER # This file is distributed under the same license as the kupfer package. # # Andrej Žnidaršič , 2010 - 2011. # msgid "" msgstr "" "Project-Id-Version: kupfer help master\n" "POT-Creation-Date: 2011-05-16 19:30+0000\n" "PO-Revision-Date: 2011-06-02 17:12+0100\n" "Last-Translator: Andrej Žnidaršič \n" "Language-Team: Slovenian GNOME Translation Team \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-Country: SLOVENIA\n" "X-Poedit-Language: Slovenian\n" "X-Poedit-SourceCharset: utf-8\n" #: C/plugin-websearch.page:7(desc) msgid "Using the search the web plugin." msgstr "Uporaba vstavka spletnega brskanja." #: C/plugin-websearch.page:10(app) msgid "Search the Web" msgstr "Iskanje po spletu" #: C/plugin-websearch.page:13(title) #: C/plugin-triggers.page:23(title) #: C/plugin-notes.page:22(title) #: C/plugin-nautilusselection.page:13(title) #: C/plugin-gwibber.page:25(title) #: C/plugin-favorites.page:22(title) #: C/plugin-calculator.page:21(title) #: C/plugin-applications.page:19(title) #: C/generalusage.page:10(title) msgid "Basic Usage" msgstr "Osnovna uporaba" #: C/plugin-websearch.page:15(p) msgid "Activate Kupfer and make sure it is in free-text mode (press period)" msgstr "Omogočite Kupfer in se prepričajte, da ste v načinu prostega besedila (pritisnite piko)." #: C/plugin-websearch.page:17(p) msgid "Type in a search query and tap Tab to switch to the action pane." msgstr "Vnesite iskalno poizvedbo in pritisnite Tabulator za preklop na pladenj dejanj." #: C/plugin-websearch.page:19(p) msgid "Type \"Search With\" to find Search the Web's action and tap Tab again to switch to the third pane (indirect object)." msgstr "Vpišite \"Išči z\" za dejanje Išči po spletu in ponovno pritisnite Tabulator za preklop na tretji pladenj (posredni predmet)." #: C/plugin-websearch.page:22(p) msgid "Select search engine with the arrow keys and type Return to open the search in a web browser." msgstr "Izberite iskalnik s smernimi tipkami in pritisnite Enter za odprtje iskanja v spletnem brskalniku." #: C/plugin-websearch.page:29(title) msgid "Search Engines" msgstr "Iskalniki" #: C/plugin-websearch.page:30(p) msgid "The Search the Web plugin uses Firefox' search engines, so you can add Search Engines directly in Firefox and Kupfer will find them later." msgstr "Vstavek Išči po spletu uporablja iskalnike Firefox zato lahko iskalnike dodate neposredno v Firefox, saj jih bo Kupfer našel." #: C/plugin-websearch.page:35(p) msgid "You can also install custom search plugins directly, only for Kupfer, in the folder:" msgstr "Vstavke po meri lahko namestite neposredno samo za Kupfer v mapo:" #: C/plugin-websearch.page:39(code) #, no-wrap msgid "~/.local/share/kupfer/searchplugins/" msgstr "~/.local/share/kupfer/searchplugins/" #: C/plugin-websearch.page:40(p) msgid "The search engine descriptions must written in OpenSearch format." msgstr "Opisi iskalnika morajo biti napisani v obliki OpenSearch." #: C/plugin-triggers.page:7(desc) msgid "Using the triggers plugin." msgstr "Uporaba vstavka sprožilcev." #: C/plugin-triggers.page:10(app) #: C/keyboard.page:213(title) msgid "Triggers" msgstr "Sprožilci" #: C/plugin-triggers.page:13(title) msgid "Triggers Plugin" msgstr "Vstavek sprožilcev" #: C/plugin-triggers.page:14(p) msgid "With Triggers you can take a command you would normally perform in Kupfer, such as launching an application or opening a document, and bind a global key combination to run this command. As long as Kupfer is running, any application can have the current focus." msgstr "S Sprožilci lahko vzamete ukaz, ki bi ga ponavadi izvedli v Kupferju kot je zagon programa ali odpiranje dokumenta in na ta ukaz vežete splošno tipkovno bližnjico. Dokler se Kupfer izvaja je lahko v žarišču katerikoli program." #: C/plugin-triggers.page:25(title) msgid "Creating a new trigger" msgstr "Ustvarjanje novega sprožilca" #: C/plugin-triggers.page:27(p) msgid "Set up a command in Kupfer that you want to run" msgstr "Nastavitev ukaza, ki ga želite pognati v Kupferju" #: C/plugin-triggers.page:32(p) msgid "Press CtrlReturn to create a composed command." msgstr "Pritisnite CtrlEnter za ustvarjanje sestavljenega ukaza." #: C/plugin-triggers.page:38(p) msgid "Type Tab and select the action Add Trigger... and press Return" msgstr "Pritisnite Tabulator in izberite dejanje Dodaj sprožilec ... in pritisnite Enter." #: C/plugin-triggers.page:44(p) msgid "Using the window that appears, press modifier keys and a letter or number key to set a global shortcut. An example is pressing and holding CtrlAlt and then pressing and releasing R to bind CtrlAltR." msgstr "V oknu, ki se pojavi, za nastavitev tipkovne bližnjice pritisnite spremenilne tipke in črko ali številko. Primer je pritisk in držanje CtrlAlt in nato pritisk in spust R za vezavo CtrlAltR." #: C/plugin-triggers.page:54(title) msgid "Removing a trigger" msgstr "Odstranjevanje sprožilca" #: C/plugin-triggers.page:56(p) msgid "Find the source Triggers in Kupfer and press to see its contents." msgstr "Najdite vir Sprožilci v Kupfer in pritisnite za ogled njegove vsebine." #: C/plugin-triggers.page:62(p) msgid "Find the active trigger in the list and use the action Remove Trigger." msgstr "Na seznamu najdite dejavni sprožilec in uporabite dejanje Odstrani sprožilec. " #: C/plugin-triggers.page:68(p) msgid "Since trigger keyboard shortcuts are global, they can be used from any application. Select shortcuts with care so that they do not conflict with other functions." msgstr "Ker so tipkovne bližnjice sprožilca splošne, jih lahko uporabite iz kateregakoli programa. Bližnjice izberite previdno, da ne bodo v sporu z drugimi zmožnostmi." #: C/plugin-triggers.page:74(title) #: C/plugin-notes.page:60(title) #: C/plugin-gwibber.page:68(title) #: C/plugin-favorites.page:38(title) msgid "Power User Tips" msgstr "Namigi za napredne uporabnike" #: C/plugin-triggers.page:75(p) msgid "Proxy objects such as Selected Text, Selected File, Frontmost Window, Last Command et cetera allow very powerful triggers." msgstr "Posredniški predmeti kot so Izbrano besedilo, Izbrana datoteka, Sprednje okno, Zadnji ukaz in tako naprej omogočajo zelo zmogljive sprožilce." #: C/plugin-triggers.page:79(p) msgid "The application action Launch is special; if you bind a trigger using Launch, it will start the application if it is not running, but focus the application when it is already running. By contrast, Start Again will start the application if it is running or not." msgstr "Dejanje programa Zaženi je posebno. V primeru da vežete in sprožite z Zaženi, bo zagnal program, če se ne izvaja, v nasprotnem primeru pa bo preklopil na izvajajoči se program. Ukaz Zaženi znova bo zagnal program ne glede na to ali se izvaja ali ne." #: C/plugin-triggers.page:87(title) msgid "Example Triggers" msgstr "Primeri sprožilcev" #: C/plugin-triggers.page:90(em) msgid "Text Editor → Launch" msgstr "Urejevalnik besedil → zaženi" #: C/plugin-triggers.page:91(p) msgid "Start Text Editor or focus its window if it is already running." msgstr "Zaženite Urejevalnik besedila ali se osredotočite na njegovo okno, če se že izvaja." #: C/plugin-triggers.page:97(em) msgid "Selected Text → Search With → Google" msgstr "Izbrano besedilo → išči z → Google" #: C/plugin-triggers.page:98(p) msgid "Search the web using the currently selected text." msgstr "Iskanje po spletu z uporabo trenutno izbranega besedila." #: C/plugin-triggers.page:100(em) msgid "Selected File → Move To → (Downloads Folder)" msgstr "Izbrana datoteka → Premakni v → (Mapa prejemov)" #: C/plugin-triggers.page:101(p) msgid "Move the currently selected file to a specific folder" msgstr "Premakne trenutno izbrano datoteko v določeno mapo" #: C/plugin-triggers.page:105(em) msgid "Songs → Search Contents" msgstr "Skladbe → vsebine iskanja" #: C/plugin-triggers.page:106(p) msgid "You may even add a trigger to open a specific subcatalog in Kupfer, for example Rhythmbox's songs." msgstr "Dodate lahko celo sprožilec za odprtje določenega podkataloga v Kupferju na primer skladbe Rhythmbox." #: C/plugin-notes.page:7(desc) msgid "Using the notes plugin." msgstr "Uporaba vstavka sporočilc." #: C/plugin-notes.page:10(app) #: C/plugin-calculator.page:37(title) msgid "Notes" msgstr "Sporočilca" #: C/plugin-notes.page:13(title) msgid "Notes Plugin" msgstr "Vstavek sporočilc" #: C/plugin-notes.page:14(p) msgid "With Notes you can access or create new notes in either the program Gnote or Tomboy. Notes will work identically with either application—you can configure which one to use in the plugin's information pane in Kupfer Preferences." msgstr "S Sporočilci lahko dostopate do ali ustvarite nova sporočilca v programu Gnote ali Tomboy. Sporočilca bodo z obema programoma delovala enako -- katerega želite uporabiti lahko nastavite v Možnostih Kupfer." #: C/plugin-notes.page:24(title) msgid "Creating a new note" msgstr "Ustvarjanje novega sporočilca" #: C/plugin-notes.page:26(p) msgid "Activate Kupfer and type . to enter text mode, then type in a note title" msgstr "Omogočite Kupfer in vpišite . za vstop v besedilni način in nato vnesite naziv sporočilca" #: C/plugin-notes.page:32(p) msgid "Type Tab and select the action Create Note and press Return." msgstr "Vnesite Tabulator in izberite dejanje Ustvari sporočilce in pritisnite Enter." #: C/plugin-notes.page:39(title) msgid "Finding a note by title" msgstr "Iskanje sporočilca po naslovu" #: C/plugin-notes.page:41(p) msgid "Simply search for the note title in Kupfer" msgstr "Enostavno iskanje naziva sporočilca v Kupferju" #: C/plugin-notes.page:45(title) msgid "Finding a note by content" msgstr "Iskanje sporočilca po vsebini" #: C/plugin-notes.page:47(p) msgid "Activate Kupfer and type . to enter text mode, then type in a search query" msgstr "Omogočite Kupfer in vnesite . za vstop v besedilni način in nato vnesite iskalno poizvedbo" #: C/plugin-notes.page:53(p) msgid "Type Tab and select the action Get Note Search Results... and press Return." msgstr "Pritisnite Tabulator in izberite dejanje Dobi rezultate iskanja sporočilca ... in pritisnite Enter." #: C/plugin-notes.page:63(p) msgid "You can use the Selected Text object and create a new note with the content of the selection." msgstr "Uporabite lahko predmet Izbrano besedilo in ustvarite novo sporočilce z vsebino izbire." #: C/plugin-nautilusselection.page:7(desc) msgid "Using the selected file plugin." msgstr "Uporaba izbranega vstavka datoteke." #: C/plugin-nautilusselection.page:10(app) msgid "Selected File" msgstr "Izbrana datoteka" #: C/plugin-nautilusselection.page:14(p) msgid "Select a file in the file manager. Open Kupfer and search for the object Selected File, which represents the file or files that are selected." msgstr "Izberite datoteko v upravljalniku datotek. Odprite Kupfer in najdite predmet Izbrana datoteka, ki predstavlja izbrano datoteko ali datoteke." #: C/plugin-nautilusselection.page:19(p) msgid "Instead of searching, you can press CtrlG to directly focus the selected file. See for more information." msgstr "Namesto iskanje lahko pritisnete CtrlG za neposredno osredotočenje na izbrano datoteko. Za več podrobnosti si oglejte ." #: C/plugin-nautilusselection.page:26(title) msgid "Selected File requires Nautilus" msgstr "Izbrana datoteka zahteva Nautilus" #: C/plugin-nautilusselection.page:27(p) msgid "The selected file plugin works with the Nautilus file browser and requires that the extension kupfer_provider.py is installed (it is normally installed together with Kupfer). After installing it for the first time, Nautilus must start anew before it is active." msgstr "Vstavek izbrane datoteke deluje z brskalnikom datotek Nautilus in zahteva nameščeno razširitev kupfer_provider.py (običajno je nameščena skupaj s programom Kupfer). Po prvi namestitvi vstavka morate Nautilus znova zagnati, preden vstavek postane dejaven." #: C/plugin-gwibber.page:7(desc) msgid "Using the Gwibber plugin." msgstr "Uporaba vstavka Gwibber" #: C/plugin-gwibber.page:10(app) msgid "Gwibber" msgstr "Gwibber" #: C/plugin-gwibber.page:13(title) msgid "Gwibber Plugin" msgstr "Vstavek Gwibber" #: C/plugin-gwibber.page:14(p) msgid "With the Gwibber plugin you can send messages to social networks such as Twitter or Identi.ca." msgstr "Z vstavkom Gwibber lahko pošljete sporočila na družabna omrežja kot sta Twitter in Identi.ca." #: C/plugin-gwibber.page:18(p) msgid "The plugin requires that the application Gwibber is installed and configured for your user. Kupfer will start and use Gwibber's service in the background." msgstr "Vstavek zahteva, da je Gwibber nameščen in nastavljen za vašega uporabnika. Kupfer bo zagnal in uporabil Gwibberjevo storitev v ozadju." #: C/plugin-gwibber.page:27(title) msgid "Sending a message to all services" msgstr "Pošiljanje sporočila vsem storitvam" #: C/plugin-gwibber.page:29(p) msgid "Activate Kupfer and type . to enter text mode, then type in a message." msgstr "Omogočite Kupfer in vpišite . za vstop v besedilni način in nato vpišite sporočilo." #: C/plugin-gwibber.page:35(p) msgid "Type Tab and select the action Send Message and press Return." msgstr "Pritisnite Tabulator in izberite dejanje Pošlji sporočilo in pritisnite Enter." #: C/plugin-gwibber.page:42(title) msgid "Sending a message to a specific service" msgstr "Pošiljanje sporočila na določeno storitev" #: C/plugin-gwibber.page:44(p) msgid "Activate Kupfer and search for the service object, for example Identi.ca" msgstr "Omogočite Kupfer in iščite za predmet storitve, na primer Identi.ca" #: C/plugin-gwibber.page:50(p) msgid "Type Tab and select the action Send Message." msgstr "Pritisnite Tabulator in izberite dejanje Pošlji sporočilo." #: C/plugin-gwibber.page:55(p) msgid "Type Tab to select the last pane, and type in a message. Press Return to send." msgstr "Pritisnite Tabulator za izbiro zadnjega pladnja in vpišite sporočilo. Za pošiljanje pritisnite Enter." #: C/plugin-gwibber.page:61(p) msgid "The plugin also provides a source for incoming messages, Gwibber Messages and more actions on messages such as Reply, Send Private Message etc." msgstr "Vstavek vsebuje tudi vir za dohodna sporočila, Sporočila Gwibber in več dejanj za sporočila kot so Odgovori, Pošlji zasebno sporočilo itd." #: C/plugin-gwibber.page:71(p) msgid "You can use the comma trick if you want to send a message to more than one service, but not all, at the same time." msgstr "Če želite poslati sporočilo na več kot eno storitev, vendar ne na vse hkrati, uporabite trik z vejico." #: C/plugin-favorites.page:7(desc) msgid "Using the favorites plugin." msgstr "Uporaba vstavka priljubljenih." #: C/plugin-favorites.page:10(app) msgid "Favorites" msgstr "Priljubljene" #: C/plugin-favorites.page:13(title) msgid "Favorites Plugin" msgstr "Vstavek priljubljenih" #: C/plugin-favorites.page:14(p) msgid "With Favorites you mark objects, for example files, for quicker access. It is a sort of shelf on which you can store objects in Kupfer. Objects marked as favorites will also be ranked higher and are adorned with a star symbol." msgstr "S Priljubljenimi lahko označite predmete kot so na primer datoteke za hiter dostop. To je neke vrste polica na kateri lahko v Kupferju shranjujete dokumente. Predmeti označeni kot priljubljeni bodo ocenjeni višje in imeli poleg simbol zvezdice." #: C/plugin-favorites.page:25(p) msgid "Find an object in Kupfer" msgstr "Najdite predmet v programu Kupfer." #: C/plugin-favorites.page:30(p) msgid "Type Tab and select either the action Add to Favorites or Remove from Favorites." msgstr "Pritisnite Tabulator in izberite dejanje Dodaj med priljubljene ali Odstrani iz priljubljenih." #: C/plugin-favorites.page:39(p) msgid "If you favorite an object, you can access it in more places. Not only in the \"Favorites\" subcatalog, but also as the indirect (secondary) object for some actions. For example:" msgstr "V primeru da je predmet priljubljen, lahko do njega dostopate na več mestih. Pojavil se bo ne le v podkatalogu \"Priljubljene\" ampak tudi v posrednem (drugem) predmetu za nekatera dejanja. Na primer:" #: C/plugin-favorites.page:45(p) msgid "Command-lines from favorites are quick to access." msgstr "Do ukaznih vrstic iz priljubljenih lahko hitro dostopate." #: C/plugin-favorites.page:46(p) msgid "When scaling images with the Scale... action from the Image Tools plugin. This action needs a size description as the third object, like \"1024\" or \"1200x800\". If you often scale to the same size, say \"1200x800\", add this to favorites, and it will always appear as a suggestion for the action." msgstr "Velikost lahko spremenite z dejanjem Spremeni velikost... iz vstavka Slikovna orodja. To dejanje kot tretji predmet potrebuje opis velikosti kot je \"1024\" ali \"1200x800\". V primeru da velikost pogosto spremenite na isto vrednost kot je \"1200x800\", jo dodajte med priljubljene. Potem se bo vedno pojavila kot predlog za dejanje." #: C/plugin-favorites.page:54(p) msgid "Actions needing an email address as the indirect object will pick up email addresses from favorites as well as well." msgstr "Dejanja, ki kot neposredni predmet potrebujejo naslove e-pošte, jih bodo pobrale tudi iz priljubljenih. " #: C/plugin-calculator.page:7(desc) msgid "Using the calculator plugin." msgstr "Uporaba vstavka računala." #: C/plugin-calculator.page:10(app) msgid "Calculator" msgstr "Računalo" #: C/plugin-calculator.page:13(title) msgid "Calculator Plugin" msgstr "Vstavek računala" #: C/plugin-calculator.page:14(p) msgid "The calculator plugin lets you calculate expressions quickly. It can evaluate expressions entered as text starting with \"=\". Entering = from command mode will start text mode directly with = prefixed for quick access." msgstr "Vstavek računalo vam omogoča hiter izračun izrazov. Oceni lahko izraze, vnesene kot besedilo, ki se začne z \"=\". Vnos = v načinu ukaza bo začel besedilni način neposredno s predpono = za hiter dostop." #: C/plugin-calculator.page:23(p) msgid "Activate Kupfer and type =" msgstr "Omogočite Kupfer in pritisnite =" #: C/plugin-calculator.page:26(p) msgid "Type in a mathematical expression using +,-,/,* (and ** for exponentiation)" msgstr "Vnesite matematični izraz z uporabo +,-,/,* (in ** za potenco)" #: C/plugin-calculator.page:30(p) msgid "Press Return to get the result." msgstr "Za rezultat pritisnite Enter." #: C/plugin-calculator.page:38(p) msgid "The Calculator uses python's math and complex math modules, and parses expressions as Python expressions. You may use common mathematical functions, such as sqrt, sin, exp and log; the command =help will show a list of all defined functions and constants." msgstr "Računalo uporablja pythonove module matematike in kompleksne matematike in izraze razčleni kot izraze Python. Uporabite lahko pogoste matematične funkcije kot so sqrt, sin, exp in log. Ukaz =help vam bo prikazal seznam vseh definiranih funkcij in konstant." #: C/plugin-calculator.page:47(p) msgid "Notice that the power operator in Python is double stars, for example =3**3 will evaluate to 27." msgstr "Operator potenc v Pythonu so dvojne zvezdice. Vrednost izraza =3**3 je na primer 27." #: C/plugin-calculator.page:53(p) msgid "To calculate trig functions for angles, convert to radians first:" msgstr "Za izračun trigonometrijskih funkcij kote najprej pretvorite v radiane:" #: C/plugin-calculator.page:56(code) #, no-wrap msgid "sin(radians(30)) -> 0.5" msgstr "sin(radians(30)) -> 0.5" #: C/plugin-calculator.page:59(p) msgid "The last result is stored as the name _ (an underscore, just like in the Python console)." msgstr "Zadnji rezultat je shranjen kot ime _ (podčrtaj, takšen kot v konzoli Python)." #: C/plugin-applications.page:7(desc) msgid "Using the applications plugin." msgstr "Uporaba vstavka programov." #: C/plugin-applications.page:10(app) msgid "Applications" msgstr "Programi" #: C/plugin-applications.page:13(title) msgid "Applications Plugin" msgstr "Vstavek programov" #: C/plugin-applications.page:14(p) msgid "Applications provides all installed programs." msgstr "Applications zagotavlja vse nameščene programe." #: C/plugin-applications.page:21(title) msgid "Launching an application" msgstr "Zaganjanje programa" #: C/plugin-applications.page:23(p) msgid "Activate Kupfer and type an abbreviation of the application name" msgstr "Omogočite Kupfer in vtipkajte okrajšavo imena programa" #: C/plugin-applications.page:28(p) msgid "Press Return to launch the application." msgstr "Za zagon programa pritisnite EnterKupfer" msgstr "Izbor datoteke v Kupferju." #: C/plugin-applications.page:41(p) msgid "Type Tab and select the action Open With..." msgstr "Pritisnite Tabulator in izberite dejanje Odpri z ..." #: C/plugin-applications.page:46(p) msgid "Type Tab to select the third (indirect object) pane and in it, select the application to open the file with." msgstr "Pritisnite Tabulator za izbiro tretjega (neposrednega predmeta) pladnja in v njem izberite program s katerim želite odpreti datoteko." #: C/plugin-applications.page:53(p) msgid "The action Open opens files and folders with the registered default application for that specific file type. This can be configured using the action Set Default Application...." msgstr "Dejanje Odpri odpre datoteke in mape z vpisanimi privzetimi programi za določeno vrsto datotek. To lahko nastavite z dejanjem Nastavi privzeti program ...." #: C/plugin-applications.page:58(p) msgid "The file type associations are provided by the desktop environment, and modifying them here will modify them on the desktop as well. This may not be true when not using GNOME or XFCE." msgstr "Povezave vrst datotek zagotavlja namizno okolje in njihova sprememba tukaj jih bo spremenila tudi na namizju. To morda ne bo res pri uporabi GNOME ali XFCE." #: C/plugin-applications.page:64(title) msgid "Selecting default application for a file type or folders" msgstr "Izbira privzetega programa za vrsto datoteke ali mape" #: C/plugin-applications.page:66(p) msgid "Select a file or folder in Kupfer" msgstr "Izbor datoteke ali mape v Kupferju." #: C/plugin-applications.page:71(p) msgid "Type Tab and select the action Set Default Application..." msgstr "Pritisnite Tabulator in izberite dejanje Nastavi privzeti program ..." #: C/plugin-applications.page:77(p) msgid "Type Tab to select the third (indirect object) pane and in it, select the application to always open the file type with." msgstr "Vpišite Tabulator za izbiro tretjega (neposredni predlet) pladnja in v njem izberite program s katerim želite vedno odpreti to vrsto datoteke." #: C/plugin-applications.page:85(title) msgid "Configuration" msgstr "Nastavitev" #: C/plugin-applications.page:86(p) msgid "The configuration option Applications for Desktop Environment in the plugin's information pane in Kupfer Preferences determines how Kupfer should act with regard to the desktop environment configuration—certain applications request not to be shown depending on which desktop environment is used. By default, it behaves like GNOME." msgstr "Nastavitvena možnost Programi in namizno okolje v pladnju podrobnosti vstavka v Možnostih Kupfer določi, kako se naj Kupfer obnaša glede na nastavitev namiznega okolja—določeni programi zahtevajo, da niso prikazani glede na uporabljeno namizno okolje. Privzeto se obnaša kot GNOME." #: C/moreusage.page:7(desc) msgid "More advanced usage information." msgstr "Podati o naprednejši uporabi." #: C/moreusage.page:10(title) msgid "Using Kupfer in Depth" msgstr "Podrobnejša uporaba Kupferja." #: C/moreusage.page:13(title) msgid "Adding Applications and Scripts" msgstr "Dodajanje programov in skriptov" #: C/moreusage.page:14(p) msgid "Kupfer will show all applications that are configured visible in your menu editor." msgstr "Kupfer bo v urejevalniku menija prikazal vse programe, ki so nastavljeni kot vidni." #: C/moreusage.page:18(p) msgid "If you want to add an application manually, you can create a new .desktop file and place it in one of the standard directories for applications, for example ~/.local/share/applications, where Kupfer will find it." msgstr "Če želite dodati program ročno, lahko ustvarite novo datoteko .desktop in jo postavite v eno od standardnih mest za programe, na primer ~/.local/share/applications, kjer jo bo Kupfer našel." #: C/moreusage.page:24(p) msgid "If you have a collection of scripts that you want to call from Kupfer, you can add the scripts folder as a catalog directory to Kupfer in the preferences. Scripts that you add to Kupfer's catalog this way can be run directly or in the terminal as long as they are executable." msgstr "Če imate zbirko skriptov, ki jih želite poklicati v Kupferju, lahko v možnostih dodate mapo skriptov kot mapo katalogov v Kupfer. Skripte, ki jih dodate v Kupferjev katalog na ta način, je mogoče zagnati neposredno v terminalu, če so izvedljivi. " #: C/moreusage.page:31(p) msgid "You can also save command-lines by using the action Add to Favorites." msgstr "Ukazne vrstice lahko shranite z uporabo dejanja Dodaj med priljubljene." #: C/moreusage.page:38(title) msgid "Opening Files and Folders" msgstr "Odpiranje datotek in map" #: C/moreusage.page:39(p) msgid "Using the action Open, files and folders are opened in their preferred application. The application associations can be changed, see ." msgstr "Uporaba dejanja Odpri odpre datoteke in mape na njihovem prednostnem mestu. Povezave programov je mogoče spremeniti, oglejte si ." #: C/moreusage.page:47(title) msgid "The Comma Trick" msgstr "Trik z vejico" #: C/moreusage.page:48(p) msgid "The comma trick allows the user to use actions on many objects at the same time." msgstr "Trik z vejico uporabniku omogoča uporabo dejanj na več predmetih hkrati." #: C/moreusage.page:52(p) msgid "Simply press comma , when an object is selected. The object is put on a \"stack\", and you can find yet another file or object, press comma to put it on the stack. When you subsequently invoke an action, the action is carried out on all of the objects at the same time." msgstr "Pritisnite na ,, ko je predmet izbran. Predmet je postavljen na \"sklad\" in lahko najdete še eno datoteko ali predmet in pritisnete brskalnik za postavitev nazaj v sklad. Ko prikličete dejanje, je izvedeno na vseh predmetih hkrati." #: C/moreusage.page:58(p) msgid "Some actions are only \"multiplied\" when used with many objects, other are smarter than that:" msgstr "Nekatera dejanja so pri uporabi z več predmeti le večkrat izvedena, druga pa so pametnejša:" #: C/moreusage.page:61(p) msgid "Selecting many files and using the Create Archive action, all files will be packed into the same archive." msgstr "Izbira veliko datotek in uporaba dejanja Ustvari arhiv bo vse datoteke zapakirala v isti arhiv." #: C/moreusage.page:63(p) msgid "If you select multiple contacts and use a Send Email action, it creates one email directed at all the contacts." msgstr "V primeru da izberete več stikov in uporabite dejanje Pošlji e-pošto, ustvari eno e-pošto, ki je usmerjena k vsem stikom." #: C/moreusage.page:65(p) msgid "If you select multiple subcatalogs (For example Firefox Bookmarks and Epiphany Bookmarks) and use Search Contents.., you get a subcatalog search restricted to the objects of those two catalogs! You can even bind a trigger to this command(!)" msgstr "V primeru da izberete več podkatalogov (na primer zaznamke Firefox ali zaznamke Epiphany) in uporabite Vsebino iskanja ..., lahko dobite podkatalog iskanja, ki je omejen na predmete teh dveh podkatalogov! Na ta ukaz lahko celo vežete sprožitec(!)." #: C/moreusage.page:71(p) msgid "The comma trick is directly taken from Quicksilver (the example given in the external article should work identically in Kupfer)." msgstr "Trik z vejico je vzet neposredno iz programa Quicksilver (primer v zunanjem članku, bi moral v Kupferju delovati enako)." #: C/moreusage.page:80(title) msgid "Grab Current Selection" msgstr "Zgrabi trenutno izbiro" #: C/moreusage.page:81(p) msgid "To use the current selected text, from any application, with Kupfer, you can configure a global keyboard shortcut for the action Show with Selection in Kupfer Preferences." msgstr "Za uporabo trenutno izbranega besedila iz katregakoli programa s programom Kupfer lahko nastavite splošno tipkovno bližnjico za dejanje Pokaži z izbiro v Možnostih Kupfer." #: C/moreusage.page:85(p) msgid "If configured, pressing the global keyboard shortcut will summon Kupfer with the current selection as the focused object." msgstr "V primeru da je nastavljena, bo splošna tipkovna bližnjica priklicala Kupfer s trenutno izbiro kot predmetom v žarišču. " #: C/moreusage.page:90(p) msgid "See " msgstr "Oglejte si " #: C/moreusage.page:94(title) msgid "Command-line Connection" msgstr "Povezava z ukazno vrstico" #: C/moreusage.page:95(p) msgid "The command kupfer on the command-line will focus Kupfer if it's already running, otherwise it will start it." msgstr "Ukaz kupfer v ukazni vrstici bo v žarišču na Kupfer, če že teče. V nasprotnem primeru ga bo zagnal." #: C/moreusage.page:99(p) msgid "The command kupfer can be used to send files or text from the command-line to Kupfer. For example, if you are using the shell in a directory where you have a file called \"report.pdf\", you can focus this file in Kupfer by running kupfer report.pdf." msgstr "Ukaz kupfer lahko uporabite za pošiljanje datotek ali besedila iz ukazne vrstice programu Kupfer. Na primer, če uporabljate lupino v mapi, kjer imate datoteko \"poročilo.pdf\", lahko v Kupferju to datoteko spravite v žarišče s poganjanjem kupfer porocilo.pdf." #: C/moreusage.page:107(p) msgid "You can also send text if you pipe the output of a command into kupfer." msgstr "Besedilo lahko izberete tudi, če izhod ukaza vpišete v kupfer." #: C/moreusage.page:114(title) msgid "Managing Context and Current Selection" msgstr "Upravljanje vsebine in trenutne izbire" #: C/moreusage.page:115(p) msgid "If you find the object you want to use, then invoke an action, Kupfer goes away to perform the action (for example start a program or play a song). When you come back to Kupfer, it will still keep the same object and action selected. Some actions make sense to be repeated (like skipping to the next song) and it can be useful to perform different actions on the same object." msgstr "V primeru, da najdete predmet, ki ga želite uporabiti, prikličite dejanje. Kupfer bo odšel stran za izvedbo dejanja (na primer zagnal program ali predvajal skladbo). Ko pridete nazaj v Kupfer, bo le-ta obdržal izbiro istega predmeta in dejanja. Nekatera dejanja je smiselno ponavljati (na primer preskok na naslednjo skladbo), uporabno pa je lahko tudi izvajanje različnih dejanj na istem predmetu." #: C/moreusage.page:123(p) msgid "However, you always have the top level catalog reachable when you \"come back\" to Kupfer -- say you went into the subcatalog \"Albums\" to browse your albums only; you select an album to play, and play it. You come back with the album selected -- but your next search will still go over the top level catalog, not just albums." msgstr "Vendar pa je katalog zgornje ravni dosegljiv vedno, ko \"pridete nazaj\" h programu Kupfer -- recimo, da greste v podkatalog \"Albumi\" za brskanje le vaših albumov, izberete album za predvajanje in ga predvajate. Prišli ste nazaj z izbranim albumom -- toda vaše naslednje iskanje bo še vedno izvedeno na katalogu gornje ravni, ne samo v albumih. " #: C/moreusage.page:130(p) msgid "How to come back into the subcatalog you were in? You do that by simply browsing, not searching the first thing you do when you focus Kupfer again. A quick way is to press down-arrow or space to open the browse window; think of it as saying \"I want to stay in this subfolder\". With the browse window open, your next query will search the current subcatalog." msgstr "Kako priti nazaj v podkatalog v katerem ste bili? To lahko storite z enostavnim brskanjem in ne iskanje, ko je Kupfer znova v žarišču. Hiter način je pritisk na puščico navzdol ali preslednico za odprtje okna brskalnika. O tem mislite kot da bi rekli \"Želim ostati v tej podmapi\". Ko se odpre okno brskanja, bo vaša naslednja poizvedba iskala po trenutnem podkatalogu." #: C/moreusage.page:137(p) msgid "This way you can work both ways -- you can quickly drill down into folders to find a file, and when you come back for the next action with Kupfer you can either summon any normal toplevel object (just start typing), or stay around where you were, deep in that folder (press space, then type a query)." msgstr "Na ta način lahko delate na oba načina - hitro lahko raziščete mape za iskanje datoteke in ko pridete nazaj za naslednje dejanje s Kupferjem lahko pokličete katerikoli predmet zgornje ravni ali pa ostanete, kjer ste bili globoko v tisti mapi (pritisnite presledek in nato vpišite poizvedbo)." #: C/moreusage.page:146(title) msgid "Saving Commands as Files" msgstr "Shranjevanje ukazov kot datoteke" #: C/moreusage.page:147(p) msgid "You can use keyboard shortcut for Compose Command (by default it is CtrlReturn) to create a command object out of the currently focused command in Kupfer. This object can be saved as a runnable file if you use the Save As... action. The resulting file will can be executed when opened from the file manager (it requires that Kupfer is already running)." msgstr "Za ustvarjanje predmeta ukaza iz ukaza, ki je trenutno v žarišču v Kupferju, lahko uporabite tipkovno bližnjico Sestavi ukaz (privzeto je CtrlEnter). Ta predmet lahko shranite kot izvedljivo datoteko, če uporabite dejanje Shrani kot .... Nastala datoteka bo izvedena bo odprtju iz upravljalnika datotek (zahteva, da se Kupfer že izvaja)." #: C/managing-plugins.page:7(desc) msgid "Using plugins with Kupfer." msgstr "Uporaba vtavkov v programu Kupfer." #: C/managing-plugins.page:10(title) msgid "How to Configure Plugins" msgstr "Kako nastaviti vstavke" #: C/managing-plugins.page:12(p) msgid "Functionality in Kupfer is organized by extentsion modules called \"plugins\". Each plugin provides additional functionality, for example integration with an external application." msgstr "Zmožnost v Kupferju je organizirana po modulih razširitev, ki se imenujejo \"vstavki\". Vsak vstavek zagotavlja dodatno zmožnost na primer vključitev v zunanji program." #: C/managing-plugins.page:19(title) msgid "Configuring Plugins" msgstr "Nastavljanje vstavkov" #: C/managing-plugins.page:21(title) msgid "Open Kupfer Preferences to the Plugins tab" msgstr "Odprite zavihek Vstavki v Možnostih Kupfer" #: C/managing-plugins.page:23(p) msgid "Use one of the following methods:" msgstr "Uporabite enega od naslednjih načinov:" #: C/managing-plugins.page:25(p) msgid "Click the Kupfer icon in the notification area and select the item Preferences" msgstr "Kliknite na ikono Kupfer v obvestilnem področju in izberite predmet Možnosti" #: C/managing-plugins.page:25(item) msgid "." msgstr "." #: C/managing-plugins.page:29(p) msgid "Search for the object Kupfer Preferences in Kupfer itself. Press Return to open it." msgstr "Iščite predmet Možnosti Kupfer v Kupferju. Pritisnite Enter za odprtje." #: C/managing-plugins.page:33(p) msgid "Use the keyboard shortcut Ctrl;" msgstr "Uporabite tipkovno bližnjico Ctrl;" #: C/managing-plugins.page:39(p) msgid "Select the tab Plugins" msgstr "Izberite zavihek Vstavki" #: C/managing-plugins.page:45(p) msgid "Select plugins in the list to read about them, and tick the box next to its name to activate the plugin, or untick to deactivate." msgstr "Izberite vstavke s seznama za branje o njih in izberite polje poleg njegovega imena za njegovo omogočitev ali oznako odstranite za onemogočitev." #: C/managing-plugins.page:49(p) msgid "If the plugin has any configurable parameters, they will be visible below the plugin information." msgstr "V primeru da ima vstavek nastavljive parametre, bodo vidni pod podatki o vstavku." #: C/managing-plugins.page:53(p) msgid "The plugin Kupfer Plugins allows fast access to each plugin's information page as well as the action \"Show Source Code\" which reveals the implementation." msgstr "Vstavek Vstavki Kupfer omogoča hiter dostop do strani s podatki o vstavkih kot tudi do dejanja \"Pokaži izvorno kodo\", ki prikaže izvedbo." #: C/managing-plugins.page:59(title) msgid "If a Plugin can not be Activated" msgstr "V primeru da vstavka ni mogoče omogočiti" #: C/managing-plugins.page:60(p) msgid "If a plugin fails to activate because it requires a software module that is not available, its plugin information will display a message like this:" msgstr "V primeru da vstavka ni mogoče omogočiti, ker zahteva programski modul, ki ni na voljo, bodo podatki o vstavku prikazali sporočilo kot je:" #: C/managing-plugins.page:65(em) msgid "Plugin could not be read due to an error:" msgstr "Vstavka ni mogoče prebrati zaradi napake:" #: C/managing-plugins.page:66(em) msgid "Python module 'gdata' is needed" msgstr "Zahtevan je modul Python 'gdata'" #: C/managing-plugins.page:67(p) msgid "This means that you need to install a needed python module from your distribution—and possibly the plugin documentation can tell you how." msgstr "To pomeni, da morate namestiti zahtevan modul python s svoje distribucije -- morda vam dokumentacija vstavka lahko pove kako." #: C/managing-plugins.page:72(p) msgid "The plugin may also unexpectedly fail to load, and display a different error message. It may then be a program error in either the plugin or Kupfer." msgstr "Nalaganje vstavka lahko tudi nepričakovano spodleti in prikaže durgačno sporočilo o napaki. To je lahko programska napaka v vstavku ali v Kupferju." #: C/managing-plugins.page:79(title) msgid "Installing more Plugins" msgstr "Nameščanje več vstavkov" #: C/managing-plugins.page:80(p) msgid "You can install custom plugins into the folder ~/.local/share/kupfer/plugins. Each plugin is either a single .py file or a python package (a folder directly containing a file called __init__.py). Plugins in the package format can include icon files. Python packages can even be installed as .zip files." msgstr "Vstavke po meri lahko namestite v mapo ~/.local/share/kupfer/plugins. Vsak vstavek je ena datoteka .py ali paket python (mapa, ki vsebuje datoteko z imenom __init__.py). Vstavki v obliki paketa lahko vključujejo datoteke ikone. Pakete Python lahko namestite tudi kot datoteke .zip." #: C/managing-plugins.page:88(p) msgid "Caution: Treat a plugin as a computer program. Do not install untrusted plugins." msgstr "Pozor: Vstavek obravnavajte kot računalniški program. Vstavkov, ki jim ne zaupajte, ne nameščajte." #: C/managing-plugins.page:95(title) msgid "Creating Plugins" msgstr "Ustvarjanje vstavkov" #: C/managing-plugins.page:96(p) msgid "Documentation for plugin creators is available in the file Documentation/Manual.rst in the source distribution on the webpage at Kupfer Manual. An easy way to start is to copy an existing plugin and experimenting with it." msgstr "Dokumentacija za ustvarjalce vstavkov je na voljo v datoteki Documentation/Manual.rst v izvorni distribuciji na spletni strani priročnika Kupfer. Enostaven način za začetek je kopiranje obstoječega vstavka in njegovo preizkušanje." #: C/managing-plugins.page:107(title) msgid "The Catalog Tab in Preferences" msgstr "Zavihek Katalog v možnostih" #: C/managing-plugins.page:108(p) msgid "Each plugin can export a number of sources which contain objects. Normally, all these objects are directly accessible from a top-level search. Some plugins export so specialized or so many objects that their catalogs should better not have their objects exported to the top level. To reach those objects, you have to first find the catalog by name, then enter the catalog using the action Search Contents." msgstr "Vsak vstavek lahko izvozi številne vire, ki vsebujejo predmete. Običajno lahko do teh predmetov dostopate neposredno iz iskanja vrhne ravni. Nekateri vstavki izvozijo specializirane ali tako veliko predmetov, da je boljše, da njihovi katalogi predmetov ne izvažajo na vrhnjo raven. " #: C/managing-plugins.page:118(p) msgid "In the tab Catalog in Kupfer Preferences, a ticked box next to each source means that its objects are exported. An unticked box means that its contents are hidden from the top level." msgstr "V zavihku Katalog v Možnostih Kupfer je poleg vsakega vira izbrano polje, ki pomeni, da so njegovi predmeti izvoženi. Neizbrano polje pomeni, da je vsebina na vrhnji ravni skrita." #: C/managing-plugins.page:123(p) msgid "Note: Kupfer may become slow if large enough subcatalogs are exported to the top level." msgstr "Opomba: Kupfer lahko postane počasen, če v vrhnjo raven izvozite dovolj velike podkataloge." #: C/license.page:7(desc) msgid "You can copy, modify and share Kupfer." msgstr "Kupfer lahko kopirate, spreminjate in delite z drugimi." #: C/license.page:10(title) msgid "License" msgstr "Dovoljenje" #: C/license.page:12(p) msgid "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." msgstr "Ta program je prosta programska oprema; lahko ga širite in/ali spreminjate pod pogoji GNU General Public License, kot ga je objavila ustanova Free Software Foundation; bodisi različice 3 ali (po vaši izbiri) katerekoli poznejše različice." #: C/license.page:18(p) msgid "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." msgstr "Program je na voljo v upanju, da bo uporaben, vendar je BREZ VSAKRŠNEGA JAMSTVA; tudi brez jamstva o USTREZNOSTI ZA PRODAJO ali PRIMERNOSTI ZA DOLOČEN NAMEN. Za več podrobnosti si oglejte GNU General Public License." #: C/license.page:24(p) msgid "You should have received a copy of the GNU General Public License along with this program. If not, see gnu.org/licenses." msgstr "Kopijo GNU General Public License bi morali prejeti skupaj s tem programom. Če je niste, si oglejte gnu.org/licenses." #: C/license.page:30(p) msgid "This documentation is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License." msgstr "Ta dokument je licenciran pod licenco Dovoljenje Creative Commons - priznanje avtorstva - deljenje pod istimi pogoji 3.0 brez prenosa." #: C/license.page:36(p) msgid "As a special exception, the copyright holders give you permission to copy, modify, and distribute the example code contained in this document under the terms of your choosing, without restriction." msgstr "Kot posebno izjemo vam lastniki avtorskih pravic dajejo dovoljenje za kopiranje, spreminjanje in distribuiranje kode primerov, ki jo vsebuje ta dokument, pod svojimi pogoji brez omejitev." #: C/keyboard.page:7(desc) msgid "Complete keyboard shortcuts reference." msgstr "Celotna referenca tipkovnih bližnjic" #: C/keyboard.page:10(title) msgid "Command Keys and Accelerator Keys" msgstr "Tipke ukazov in pospeševalnikov" #: C/keyboard.page:13(title) #: C/generalusage.page:12(title) msgid "Keyboard Interface" msgstr "Vmesnik tipkovnice" #: C/keyboard.page:14(p) msgid "In command mode, the following keystrokes have special meanings:" msgstr "V načinu ukaza imajo nekatere tipke poseben pomen:" #: C/keyboard.page:19(p) #: C/generalusage.page:34(p) msgid " or Space" msgstr " ali Preslednica" #: C/keyboard.page:20(p) #: C/generalusage.page:35(p) msgid "Go to the next match" msgstr "Pojdi na naslednji zadetek" #: C/keyboard.page:23(p) #: C/generalusage.page:38(p) msgid " or ShiftSpace" msgstr " ali ShiftPreslednica" #: C/keyboard.page:26(p) #: C/generalusage.page:41(p) msgid "Go to the previous match" msgstr "Pojdi na predhodni zadetek" #: C/keyboard.page:29(p) #: C/generalusage.page:44(p) msgid " or /" msgstr " ali /" #: C/keyboard.page:30(p) #: C/generalusage.page:45(p) msgid "Descend into an object with content" msgstr "Spusti se v predmet z vsebino" #: C/keyboard.page:33(key) #: C/generalusage.page:48(key) msgid "Backspace" msgstr "Vračalka" #: C/keyboard.page:34(p) #: C/generalusage.page:49(p) msgid "Erase a character from the query. If the query is empty, go up a level" msgstr "Izbriše znak iz poizvedbe. Če je poizvedba prazna, gre eno raven navzgor" #: C/keyboard.page:39(key) #: C/keyboard.page:93(key) #: C/generalusage.page:54(key) msgid "." msgstr "." #: C/keyboard.page:40(p) #: C/generalusage.page:55(p) msgid "Activate free-text mode" msgstr "Omogočite način prostega besedila" #: C/keyboard.page:43(key) #: C/keyboard.page:97(key) #: C/generalusage.page:58(key) msgid "," msgstr "," #: C/keyboard.page:44(p) #: C/generalusage.page:59(p) msgid "Put selected object on the stack (\"Comma Trick\")" msgstr "Postavi izbran predmet v sklad (\"Trik z vejico\")" #: C/keyboard.page:47(p) msgid "Quick access keys:" msgstr "Tipke hitrega dostopa:" #: C/keyboard.page:53(key) msgid "=" msgstr "=" #: C/keyboard.page:55(p) msgid "Activate free-text mode with = prefix (for )" msgstr "Omogoči način prostega besedila s predpono = (za )" #: C/keyboard.page:61(key) msgid "/" msgstr "/" #: C/keyboard.page:63(p) msgid "Activate free-text mode (when nothing is selected) with / prefix (to input a rooted path)" msgstr "Omogoči način prostega besedila (ko ni nič izbrano) s predpono / (za vnos korenske poti)" #: C/keyboard.page:68(p) #: C/generalusage.page:62(p) msgid "Additionally:" msgstr "Dodatno:" #: C/keyboard.page:72(p) #: C/generalusage.page:66(p) msgid "Return activates the current selection: the command is executed." msgstr "Enter omogoči trenutno izbiro: ukaz je izveden." #: C/keyboard.page:74(p) #: C/generalusage.page:68(p) msgid "Escape clears the current selection." msgstr "Escape počisti trenutno izbiro." #: C/keyboard.page:75(p) #: C/generalusage.page:69(p) msgid "Tab switches between the object and the action pane." msgstr "Tab preklopi med predmetom in pladnjem dejanj." #: C/keyboard.page:77(p) msgid "The meaning of the keys Space, ., ,, / and = can not be changed, but you can deactivate their special meaning with the checkbox Use single keystroke commands in Kupfer Preferences." msgstr "Pomena tipk Preslednica, ., ,, / and = ne morete spremeniti, vendar lahko onemogočite njihov poseben pomen z izbirnim polje Uporabi posamezne ukaze pritiskov tipk v Možnostih Kupfer." #: C/keyboard.page:86(title) msgid "Kupfer's Keyboard Shortcuts" msgstr "Tipkovne bližnjice Kupfer" #: C/keyboard.page:87(p) msgid "These keyboard shortcuts are used in Kupfer's interface. They have the following meanings and default shortcuts:" msgstr "Te tipkovne bližnjice se uporabljajo v vmesniku Kupfer. Imajo naslednje pomene in privzete bližnjice:" #: C/keyboard.page:93(key) #: C/keyboard.page:97(key) #: C/keyboard.page:101(key) #: C/keyboard.page:105(key) #: C/keyboard.page:113(key) #: C/keyboard.page:117(key) #: C/keyboard.page:121(key) #: C/keyboard.page:125(key) #: C/keyboard.page:129(key) #: C/keyboard.page:174(key) msgid "Ctrl" msgstr "Ctrl" #: C/keyboard.page:94(p) msgid "Toggle text mode" msgstr "Preklopi besedilni način" #: C/keyboard.page:98(p) msgid "The comma trick" msgstr "Trik z vejico" #: C/keyboard.page:101(key) msgid ";" msgstr ";" #: C/keyboard.page:102(p) msgid "Show preferences window" msgstr "Pokaže okno zmožnosti" #: C/keyboard.page:105(key) msgid "R" msgstr "R" #: C/keyboard.page:106(p) msgid "Reset all" msgstr "Ponastavi vse" #: C/keyboard.page:109(key) msgid "Alt" msgstr "Alt" #: C/keyboard.page:109(key) msgid "A" msgstr "A" #: C/keyboard.page:110(p) msgid "Alternate activate" msgstr "Dodatno omogoči" #: C/keyboard.page:113(key) msgid "Return" msgstr "Enter" #: C/keyboard.page:114(p) msgid "Compose command" msgstr "Sestavi ukaz" #: C/keyboard.page:117(key) msgid "S" msgstr "S" #: C/keyboard.page:118(p) msgid "Switch to first pane" msgstr "Preklopi na prvi pladenj" #: C/keyboard.page:121(key) msgid "Q" msgstr "Q" #: C/keyboard.page:122(p) msgid "Select 'Quit'" msgstr "Izberi 'končaj'" #: C/keyboard.page:125(key) msgid "G" msgstr "G" #: C/keyboard.page:126(p) msgid "Select 'Selected File'" msgstr "Izberi 'izbrano datoteko'" #: C/keyboard.page:129(key) msgid "T" msgstr "T" #: C/keyboard.page:130(p) msgid "Select 'Selected Text'" msgstr "Izberi 'izbrano besedilo'" #: C/keyboard.page:133(key) msgid "F1" msgstr "F1" #: C/keyboard.page:134(p) msgid "Show Help" msgstr "Pokaži pomoč" #: C/keyboard.page:139(title) msgid "How to configure a keyboard shortcut" msgstr "Kako nastaviti tipkovno bližnjico" #: C/keyboard.page:141(p) #: C/keyboard.page:185(p) msgid "Open Kupfer Preferences and go to the Keyboard tab." msgstr "Odprite Možnosti Kupfer in pojdite v zavihek Tipkovnica." #: C/keyboard.page:147(p) msgid "Double-click the shorcut's row under Browser Keyboard Shortcuts." msgstr "Dvokliknite na vrstico bližnjice pod Tipkovne bližnjice brskalnika." #: C/keyboard.page:153(p) msgid "Using the window that appears, press modifier keys and a letter or number key to set a shortcut. An example is pressing and holding Ctrl and then pressing and releasing T to bind CtrlT." msgstr "V oknu, ki se pojavi, za nastavitev splošne bližnjice pritisnite na spremenilne tipke in črko ali število. Primer je pritisk in držanje na tipko Ctrl in nato pritisk in izpust tipke T za vezavo CtrlT." #: C/keyboard.page:164(title) msgid "Global Keyboard Shortcuts" msgstr "Splošne tipkovne bližnjice" #: C/keyboard.page:165(p) msgid "Kupfer always listens to global shortcuts, even if it is not currently in the foreground." msgstr "Kupfer vedno posluša za splošne bližnjice, tudi če ni v ospredju." #: C/keyboard.page:169(p) msgid "They have the following meanings and default shortcuts:" msgstr "Imajo naslednje pomene in privzete bližnjice:" #: C/keyboard.page:174(key) msgid "Space" msgstr "Preslednica" #: C/keyboard.page:175(p) msgid "Show/hide Kupfer" msgstr "Pokaže/skrije Kupfer." #: C/keyboard.page:178(p) msgid "(not configured by default)" msgstr "(ni privzeto nastavljeno)" #: C/keyboard.page:179(p) msgid "Show Kupfer with 'Selection' object focused" msgstr "Pokaže Kupfer s predmetom 'Izbira' v žarišču" #: C/keyboard.page:183(title) msgid "How to configure a global keyboard shortcut" msgstr "Kako nastaviti splošno tipkovno bližnjico" #: C/keyboard.page:191(p) msgid "Double-click the shorcut's row under Global Keyboard Shortcuts." msgstr "Dvokliknite na vrstico bližnjice pod Splošne tipkovne bližnjice." #: C/keyboard.page:197(p) msgid "Using the window that appears, press modifier keys and a letter or number key to set a global shortcut. An example is pressing and holding Super and then pressing and releasing Space to bind SuperSpace." msgstr "V oknu, ki se pojavi, za nastavitev splošne bližnjice pritisnite na spremenilne tipke in črko ali število. Primer je pritisk in držanje na tipko Super in nato pritisk in izpust tipke Preslednica za vezavo SuperPreslednica." #: C/keyboard.page:206(p) msgid "Since these keyboard shortcuts are global, they can be used from any application. Select shortcuts with care so that they do not conflict with other functions." msgstr "Ker so te tipkovne bližnjice splošne, jih lahko uporabite v kateremkoli programu. Bližnjice izberite previdno, da ne bodo v sporu z drugimi zmožnostmi." #: C/keyboard.page:214(p) msgid "The plugin Triggers allows to activate actions with global keyboard shortcuts. Trigger shortcuts do not appear in Kupfer Preferences." msgstr "Vstavek Sprožilci vam omogoča omogočitev dejanj s splošnimi tipkovnimi bližnjicami. Bližnjice sprožilca se ne pojavijo v Možnostih Kupfer." #: C/keyboard.page:220(p) msgid "See for more information." msgstr "Za več podrobnosti si oglejte ." #: C/introduction.page:7(desc) msgid "Introduction to Kupfer." msgstr "Uvod v Kupfer." #: C/introduction.page:10(title) msgid "Introduction" msgstr "Uvod" #: C/introduction.page:12(p) msgid "Kupfer is an interface for quick and convenient access to applications and their documents." msgstr "Kupfer je vmesnik za hiter in priročen dostop programov in njihovih dokumentov." #: C/introduction.page:16(p) msgid "The most typical use is to find a specific application and launch it. We have tried to make Kupfer easy to extend with plugins so that this quick-access paradigm can be extended to many more objects than just applications." msgstr "Najbolj običajna uporaba je iskanje določenega program in njegov zagon. Kupfer lahko enostavno razširite z vstavki zato lahko paradigmo hitrega dostopa razširite na več predmetov kot samo programe." #: C/introduction.page:22(p) msgid "We hope that using Kupfer feels both very fun and different." msgstr "Upamo, da se vam zdi uporaba Kupferja tako zelo zabavna kot drugačna." #: C/introduction.page:26(p) msgid "For up-to-date information about Kupfer, visit its homepage." msgstr "Za več podrobnosti o programu Kupfer obiščite njegovo domačo stran." #: C/index.page:9(name) msgid "Ulrik Sverdrup" msgstr "Ulrik Sverdrup" #: C/index.page:10(email) msgid "ulrik.sverdrup@gmail.com" msgstr "ulrik.sverdrup@gmail.com" #: C/index.page:13(year) msgid "2009" msgstr "2009" #: C/index.page:14(name) msgid "Kupfer Development Team" msgstr "Razvijalska ekipa Kupfer" #: C/index.page:17(license) msgid "Creative Commons Share Alike 3.0" msgstr "Dovoljenje Creative Commons - priznanje avtorstva - deljenje pod istimi pogoji 3.0" #: C/index.page:21(title) msgid "Kupfer Manual" msgstr "Priročnik Kupfer" #: C/index.page:24(title) msgid "Using Kupfer" msgstr "Uporabljanje programa Kupfer" #: C/index.page:27(title) msgid "About Specific Plugins" msgstr "O določenih vstavkih" #: C/generalusage.page:7(desc) msgid "How to start using Kupfer." msgstr "Uvod v Kupfer." #: C/generalusage.page:14(p) msgid "Kupfer is to the largest part a keyboard-managed interface to applications and documents." msgstr "Kupfer je večinoma s tipkovnico upravljan vmesnik do programov in dokumentov." #: C/generalusage.page:18(p) msgid "Kupfer's default mode is the command mode: If you type a query, kupfer will search for a match in its catalog." msgstr "Privzeti način Kupferja je način ukaza: če vnesete poizvedbo, bo kupfer iskal ujemanje v svojem katalogu." #: C/generalusage.page:23(p) msgid "The arrow keys allow you to browse query matches quite naturally, going to the previous or next match, and going up and down in the subcatalogs." msgstr "Smerne tipke vam omogočajo naravno brskanje ujemajočih poizvedb, premik na predhodno ali naslednje ujemanja in navzgor ali navzdol po podkatalogih." #: C/generalusage.page:29(p) msgid "In command mode, some keystrokes have special meanings:" msgstr "V načinu ukaza imajo nekatere tipke poseben pomen:" #: C/generalusage.page:71(p) msgid "By default you show Kupfer using the global keyboard shortcut CtrlSpace." msgstr "Privzeto lahko Kupfer prikažete s splošno tipkovno bližnjico CtrlPreslednica." #: C/generalusage.page:74(p) msgid "See for more information." msgstr "Za več podrobnosti si oglejte ." #: C/generalusage.page:78(title) msgid "Learning Habits" msgstr "Učenje navad" #: C/generalusage.page:79(p) msgid "Kupfer remembers which objects and actions are used the most. When beginning to use it, you have to use the arrow keys at times to make it precise which object you want to find. After a few uses of that object, Kupfer will rank it higher. Objects marked as favorites are also ranked higher." msgstr "Kupfer si zapomni katere predmete in dejanja največkrat uporabljate. Ko ga boste začeli uporabljati, boste morali včasih uporabiti smerne tipke, da bo natančen s predmeti, ki jih želite najti. Po nekaj uporabah tega predmeta ga bo Kupfer višje ocenil. Višje so ocenjeni tudi predmeti označeni kot priljubljeni." #: C/generalusage.page:90(title) msgid "The Catalog" msgstr "Katalog" #: C/generalusage.page:91(p) msgid "The Catalog is the collection of objects you can access in Kupfer, such as documents and programs." msgstr "Katalog je zbirka predmetov do katerih lahko dostopate v Kupferju, kot so dokumenti in programi." #: C/generalusage.page:96(p) msgid "Objects in the catalog that have content, like folders, are marked with an arrow. Pressing will enter these objects. Much of the catalog is composed of subcatalogs; plugin subcatalogs do in general list objects that are also available directly from the top level. Subcatalogs can be used for a narrower view or search scope, when using Kupfer." msgstr "Predmeti v katalogu, ki imajo vsebino (kot na primer mape) so označeni s puščico. Pritiskanje bo vneslo te predmete. Večina kataloga je sestavljena iz podkatalogov, vstavki podkatalogov v splošnem naštejejo predmete, ki so na voljo tudi neposredno iz zgornje ravni. Podkataloge je mogoče uporabiti za ožji pogled ali iskalni obseg pri uporabi Kupferja." #: C/generalusage.page:105(p) msgid "Most subcatalogs update their content automatically. For example, the Desktop folder source is always up-to-date." msgstr "Večina podkatalogov svojo vsebino samodejno posodobi. Na primer, katalog mape Namizje se vedno samodejno posodablja." #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/index.page:0(None) msgid "translator-credits" msgstr "Andrej Žnidaršič" #~ msgid "Using Kupfer more conveniently." #~ msgstr "Priročnejša uporaba Kupferja." #~ msgid "" #~ "Kupfer listens to global shortcuts, even if Kupfer is not currently in " #~ "the foreground. The most important global shortcut is the shortcut to " #~ "show and hide Kupfer's command window which by default is " #~ "CtrlSpace." #~ msgstr "" #~ "Kupfer čaka na splošne bližnjice tudi če trenutni ni v ospredju. Najbolj " #~ "pomembna splošna bližnjica je bližnjica za prikaz in skritje Kupferjevega " #~ "okna ukazov, ki je privzeto CtrlPreslednica." #~ msgid "Global Keyboard Shortcuts are configured in Kupfer's preferences." #~ msgstr "" #~ "Splošne tipkovne bližnjice je mogoče nastaviti v možnostih Kupferja." #~ msgid "" #~ "The Triggers plugin allows to configure actions to be activated by global " #~ "shortcuts, but triggers can only be configured in that plugin." #~ msgstr "" #~ "Vstavek sprožilci omogoča nastavitev dejanj, ki jih sprožijo splošne " #~ "bližnjice, vendar jih je mogoče nastaviti le v tem vstavku." #~ msgid "" #~ "Additional keyboard shortcuts that work with Kupfer when it is in the " #~ "foreground can be configured in Kupfer's preferences." #~ msgstr "" #~ "Dodatne tipkovne bližnjice, ki delujejo s Kupferjem kadar je v ospredju " #~ "in jih je mogoče nastaviti v možnostih Kupferja." #~ msgid "" #~ "Install custom plugins in the folder ~/.local/share/kupfer/plugins/" #~ "" #~ msgstr "" #~ "Namestite vstavke po meri v mapo ~/.local/share/kupfer/plugins/" #~ msgid "" #~ "Kupfer cache, config and data are located in the directories ~/." #~ "cache/kupfer, ~/.config/kupfer and ~/.local/" #~ "share/kupfer." #~ msgstr "" #~ "Predpomnilnik Kupfer, nastavitve in podatki so v mapah ~/.cache/" #~ "kupfer, ~/.config/kupfer in ~/.local/share/" #~ "kupfer." #~ msgid "" #~ "You can install custom plugins into ~/.local/share/kupfer/plugins; adding " #~ "to Kupfer's object knowledge can be surprisingly easy, just " #~ "look at the default plugins if you want to create new." #~ msgstr "" #~ "Vstavke po meri lahko namestite v ~/.local/share/kupfer/plugins. " #~ "Dodajanje Kupferjevemu poznavanju predmetov je lahko " #~ "presenetljivo enostavno. Če želite ustvariti nove vstavke, si poglejte " #~ "kako delujejo privzeti vstavki." #~ msgid "Open Terminal Here" #~ msgstr "Odpri terminal tukaj" #~ msgid "" #~ "Open terminal first calls xdg-terminal, then gnome-" #~ "terminal. xdg-terminal is a script to find the user's configured " #~ "terminal program for his/her Desktop Environment. Install xdg-" #~ "terminal if you need this (or install a symlink called xdg-" #~ "terminal)." #~ msgstr "" #~ "Ukaz odpri terminal najprej pokliče xdg-terminal, nato pa " #~ "gnome-terminal. xdg-terminal je skript za iskanje uporabniško " #~ "določenega programa terminala za njegovo/njeno namizno okolje. Če to " #~ "potrebujete, namestite xdg-terminal (ali namestite simbolno " #~ "povezavo z imenom xdg-terminal)." #~ msgid "" #~ "To use Kupfer like a pro, you can configure a \"Magic " #~ "Keybinding\" for Kupfer. GUI configuration is not yet " #~ "supported, but edit the configuration file ~/.config/kupfer/kupfer." #~ "cfg to include the following:" #~ msgstr "" #~ "Za uporabo Kupferja kot profesionalec lahko za Kupfer nastavite \"Čarobno tipkovno bližnjico\". Grafična nastavitev še ni " #~ "podprta, zato morate urediti nastavitveno datoteko ~/.config/kupfer/" #~ "kupfer.cfg tako, da bo vključevala naslednje:" #~ msgid "" #~ "\n" #~ "[Kupfer]\n" #~ "keybinding = <Control>space\n" #~ "magickeybinding = <Ctrl><Alt>space\n" #~ " " #~ msgstr "" #~ "\n" #~ "[Kupfer]\n" #~ "tipkovna bližnica = <Control>preslednica\n" #~ "čarobna tipkovna bližnica = <Ctrl><Alt>preslednica\n" #~ " " #~ msgid "" #~ "Now, pressing CtrlAltSpace will summon Kupfer with the current selection in " #~ "focus. Make sure you have installed Kupfer's nautilus plugin, " #~ "then both the currently selected file in Nautilus, or the currently " #~ "selected text in the front application will be selected." #~ msgstr "" #~ "Sedaj pritisnite CtrlAltPreslednica, ki bo priklicala Kupfer s trenutno izbiro v " #~ "žarišču. Prepričajte se, da imate nameščen Kupferjev vstavek " #~ "nautilus. V tem primeru, bosta tako izbrana datoteka v Nautilusu ali " #~ "trenutno izbrano besedilo v sprednjem programu izbrana. " #~ msgid "" #~ "Now you can select a word in, say, a web browser, use CtrlAltSpace, and select action Look " #~ "Up to look up the selected word. Or select an image file, use " #~ "CtrlAltSpace, select " #~ "action Scale with object 1000 to scale the image to " #~ "1000 pixels wide!" #~ msgstr "" #~ "Sedaj lahko izberete besedo, na primer v spletnem brskalniku, uporabite " #~ "CtrlAltPreslednica in " #~ "izberete dejanje Poišči za iskanje izbrane besede. Ali pa " #~ "izberite slikovno datoteko, uporabite CtrlAltPreslednica, izberite Prilagodi velikost s predmetom 1000 za spremembo velikosti slike na širino " #~ "1000 točk. " #~ msgid "" #~ "An example useful script is here which changes the rating of Rhythmbox's currently playing song; I have added five scriptlets calling " #~ "rhrating.py with numbers from 0 to 5 to my catalog to " #~ "quickly rate tracks. (This is something that might be integrated into " #~ "Kupfer later)" #~ msgstr "" #~ "Primer uporabnega skripta je tukaj, ki spremeni oceno trenutno predvajajoče se " #~ "skladbe v programu Rhythmbox. Dodanih je bilo pet majhnih " #~ "skript rhrating.py s števili od 0 to 5 za hitro ocenjevanje " #~ "skladb. (To bo morda kasneje vključeno v Kupfer)" #~ msgid "" #~ "Kupfer is its own remote control. When Kupfer is " #~ "already running, Kupfer on the command-line will focus its " #~ "window, but there is more you can do: If you invoke kupferQUERY where QUERY is a text string or a " #~ "filename, Kupfer will focus, and select this item. This way, " #~ "you can quickly invoke Kupfer actions even on objects from a " #~ "shell-based context." #~ msgstr "" #~ "Kupfer je svoj lasten daljinski upravljalnik. Ko Kupfer že teče, bo Kupfer v ukazni vrstici spravil njegovo okno " #~ "v žarišče. Storite pa lahko še več: če prikličete kupferPOIZVEDBA, kjer je POIZVEDBA besedilni " #~ "niz ali ime datoteke, bo Kupfer prišel v žarišče in izbral ta " #~ "predmet. Na ta način lahko hitro prikličete dejanja Kupfer na " #~ "predmetih tudi iz lupine." #~ msgid "" #~ "You can also pipe the output of a command into Kupfer to send " #~ "text to the already running instance of Kupfer." #~ msgstr "" #~ "Izhod ukaza lahko preusmerite v Kupfer za pošiljanje besedila " #~ "že delujočemu primerku programa Kupfer." #~ msgid "Legal Information." #~ msgstr "Pravne podrobnosti." #~ msgid "" #~ "Kupfer is a program to change, speed up and make everything " #~ "about files and programs more fun on your computer. Kupfer is " #~ "a launcher; you typically use it to summon an application or a document " #~ "quickly by typing parts of its name. It can also do more than getting at " #~ "something quickly: there are different plugins for accessing more objects " #~ "and running custom commands." #~ msgstr "" #~ "Kupfer je program za spreminjanje, pohitritev in delanje " #~ "datotek in programov na vašem računalniku bolj zabavnih. Kupfer je zaganjalnik. Običajno ga uporabite za hiter zagon programa ali " #~ "dokumenta s tipkanjem dela njegovega imena. Naredi lahko veliko več kot " #~ "nekaj hitro zažene - obstajajo različni vstavki za dostop do več " #~ "predmetov in zagon ukazov po meri." #~ msgid "" #~ "Kupfer is written using Python and has a flexible " #~ "architecture; the implementation is simple and makes the easy things work " #~ "first. One goal is that new plugins can be written quickly without too " #~ "much programming." #~ msgstr "" #~ "Kupfer je napisan v Pythonu in ima prilagodljivo arhitekturo. " #~ "Podpora je enostavna in najprej omogoča delovanje enostavnih stvari. Eden " #~ "od ciljev programa je možnost hitrega pisanja novih vstavkov brez preveč " #~ "programiranja." #~ msgid "" #~ "The program is very inspired by Quicksilver." #~ msgstr "" #~ "Ta program je močno navdihnil Quicksilver." kupfer-v208/help/wscript000066400000000000000000000052161176220042200154150ustar00rootroot00000000000000#!/usr/bin/env python # Mallard waf adaptor written by Ulrik Sverdrup # may be distributed, changed, used, etc freely for any purpose ## Mallard functionality definitions ## import os from waflib import Task, TaskGen, Utils # FIXME: Support for figures def _read_makefile_am(filename): "read a Makefile.am file for DOC_* variable definitions, return a dict" varstring = open(filename).read() varstring = varstring.replace("\\\n", " ") varlines = [L for L in varstring.splitlines() if L.startswith("DOC")] return dict(tuple(map(str.strip, var.split("=", 1))) for var in varlines) def init_mallard(self): mf_am = self.path.find_resource(self.variable_definitions) DOC_VAR = _read_makefile_am(mf_am.abspath()) require_vars = "DOC_ID DOC_LINGUAS DOC_PAGES".split() have_vars = set(var for var in DOC_VAR if DOC_VAR[var]) missing_vars = set(require_vars).difference(have_vars) if missing_vars: print("Missing DOC variable declarations in %s:" % (mf_am.abspath())) print("\n".join(missing_vars)) self.bld.env.update(DOC_VAR) self.default_install_path='${PREFIX}/share/gnome/help/${DOC_ID}' def apply_mallard(self): bld = self.bld lst = self.to_list(bld.env["DOC_LINGUAS"]) cnode = self.path.find_dir("C") pages = cnode.ant_glob("*.page") self.install_path = Utils.subst_vars(self.default_install_path, self.env) # Check if the declared page list is consistent declared_pages = self.to_list(bld.env["DOC_PAGES"]) missing_pages = set([str(p) for p in pages]).difference(declared_pages) if missing_pages: print("Warning: Some pages not declared:") print("\n".join([str(p) for p in missing_pages])) for lang in lst: node = self.path.find_resource("%s/%s.po" % (lang, lang)) for page in pages: tsk = self.create_task('xml2po') out = self.path.find_or_declare('%s/%s' % (lang, page)) src = self.path.find_resource('C/%s' % page) tsk.set_inputs([node,src]) tsk.set_outputs(out) bld.install_files(os.path.join(self.install_path, lang), tsk.outputs) for page in pages: instdir = os.path.join(self.install_path, "C") bld.install_files(instdir, page) Task.simple_task_type('xml2po', '${XML2PO} ${XML2POFLAGS} ${SRC} > ${TGT}', color='BLUE') TaskGen.feature("mallard")(init_mallard) TaskGen.feature("mallard")(apply_mallard) TaskGen.after('init_mallard')(apply_mallard) ## End Mallard functionality ## # Build Configuration def options(opt): pass def configure(ctx): try: ctx.find_program('xml2po', var='XML2PO') ctx.env['XML2POFLAGS'] = '-mmallard -p' except ctx.errors.ConfigurationError: pass def build(bld): if bld.env["XML2PO"]: task = bld(features="mallard", variable_definitions="Makefile.am", ) kupfer-v208/kupfer-run000077700000000000000000000000001176220042200174532bin/kupfer.inustar00rootroot00000000000000kupfer-v208/kupfer.doap000066400000000000000000000013261176220042200152060ustar00rootroot00000000000000 kupfer Convenient command and access tool Ulrik Sverdrup usverdrup kupfer-v208/kupfer.py000066400000000000000000000014401176220042200147100ustar00rootroot00000000000000""" kupfer A convenient access and command tool Copyright 2007--2010 Ulrik Sverdrup 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 . """ if __name__ == '__main__': from kupfer import main main.main() kupfer-v208/kupfer/000077500000000000000000000000001176220042200143375ustar00rootroot00000000000000kupfer-v208/kupfer/__init__.py000066400000000000000000000000001176220042200164360ustar00rootroot00000000000000kupfer-v208/kupfer/commandexec.py000066400000000000000000000005071176220042200171760ustar00rootroot00000000000000""" This file only exists for backwards compatibility! For new plugins, you probably should not use ``commandexec`` at all, but instead implement ``Action.wants_context()`` """ from kupfer.core.commandexec import * import warnings warnings.warn(FutureWarning("%s is deprecated. See Documentation/PluginAPI.rst" % __name__)) kupfer-v208/kupfer/config.py000066400000000000000000000054571176220042200161710ustar00rootroot00000000000000""" Module for confiugration and misc things """ import xdg.BaseDirectory as base import os PACKAGE_NAME="kupfer" class ResourceLookupError (StandardError): pass def has_capability(cap): return not bool(os.getenv("KUPFER_NO_%s" % cap, False)) def get_cache_home(): """ Directory where cache files should be put Guaranteed to exist """ cache_home = base.xdg_cache_home or os.path.expanduser("~/.cache") cache_dir = os.path.join(cache_home, PACKAGE_NAME) if not os.path.exists(cache_dir): try: os.makedirs(cache_dir, mode=0700) except OSError, e: print e return None return cache_dir def get_cache_file(path=()): cache_home = base.xdg_cache_home or os.path.expanduser("~/.cache") cache_dir = os.path.join(cache_home, *path) if not os.path.exists(cache_dir): return None return cache_dir def get_data_file(filename, package=PACKAGE_NAME): """ Return path to @filename if it exists anywhere in the data paths, else raise ResourceLookupError. """ data_paths = [] try: from . import version_subst except ImportError: first_datadir = "./data" else: first_datadir = os.path.join(version_subst.DATADIR, package) data_paths.append(first_datadir) for data_path in base.load_data_paths(package): if not data_path in data_paths: data_paths.append(data_path) for direc in data_paths: file_path = os.path.join(direc, filename) if os.path.exists(file_path): return file_path if package == PACKAGE_NAME: raise ResourceLookupError("Resource %s not found" % filename) else: raise ResourceLookupError("Resource %s in package %s not found" % (filename, package)) def save_data_file(filename): """ Return filename in the XDG data home directory, where the directory is guaranteed to exist """ direc = base.save_data_path(PACKAGE_NAME) if not direc: return None filepath = os.path.join(direc, filename) return filepath def get_data_home(): """ Directory where data is to be saved Guaranteed to exist """ return base.save_data_path(PACKAGE_NAME) def get_data_dirs(name="", package=PACKAGE_NAME): """ Iterate over all data dirs of @name that exist """ return base.load_data_paths(os.path.join(package, name)) def get_config_file(filename, package=PACKAGE_NAME): """ Return path to @package/@filename if it exists anywhere in the config paths, else return None """ return base.load_first_config(package, filename) def get_config_files(filename): """ Iterator to @filename in all config paths, with most important (takes precendence) files first """ return base.load_config_paths(PACKAGE_NAME, filename) or () def save_config_file(filename): """ Return filename in the XDG data home directory, where the directory is guaranteed to exist """ direc = base.save_config_path(PACKAGE_NAME) if not direc: return None filepath = os.path.join(direc, filename) return filepath kupfer-v208/kupfer/conspickle.py000066400000000000000000000041231176220042200170430ustar00rootroot00000000000000import fnmatch import io import pickle import sys class universalset (object): def __contains__(self, item): return True class ConservativeUnpickler (pickle.Unpickler): """An Unpickler that refuses to import new modules >>> import pickle >>> import kupfer.objects >>> ConservativeUnpickler.loads(pickle.dumps(kupfer.objects.FileLeaf("A"))) >>> ConservativeUnpickler.loads(pickle.dumps(eval)) Traceback (most recent call last): ... UnpicklingError: Refusing unsafe __builtin__.eval >>> import sys >>> import kupfer.obj.base >>> pdata = pickle.dumps(kupfer.obj.base.Leaf(1, "A")) >>> del sys.modules["kupfer.obj.base"] >>> ConservativeUnpickler.loads(pdata) Traceback (most recent call last): ... UnpicklingError: Refusing to load module kupfer.obj.base """ safe_modules = { "__builtin__" : set(["set", "sum", "object"]), "copy_reg" : set(["_reconstructor"]), "kupfer.*" : universalset(), } @classmethod def is_safe_symbol(cls, module, name): for pattern in cls.safe_modules: if fnmatch.fnmatchcase(module, pattern): return name in cls.safe_modules[pattern] return False def find_class(self, module, name): if module not in sys.modules: raise pickle.UnpicklingError("Refusing to load module %s" % module) if not self.is_safe_symbol(module, name): raise pickle.UnpicklingError("Refusing unsafe %s.%s" % (module, name)) return pickle.Unpickler.find_class(self, module, name) @classmethod def loads(cls, pickledata): unpickler = cls(io.BytesIO(pickledata)) return unpickler.load() class BasicUnpickler (ConservativeUnpickler): """An Unpickler that can only unpickle persistend ids and select builtins >>> import pickle >>> import kupfer.objects >>> BasicUnpickler.loads(pickle.dumps(kupfer.objects.FileLeaf("A"))) Traceback (most recent call last): ... UnpicklingError: Refusing unsafe kupfer.obj.objects.FileLeaf """ safe_modules = { "__builtin__" : set(["object"]), "copy_reg" : set(["_reconstructor"]), "kupfer.puid" : set(["SerializedObject"]), } if __name__ == '__main__': import doctest doctest.testmod() kupfer-v208/kupfer/core/000077500000000000000000000000001176220042200152675ustar00rootroot00000000000000kupfer-v208/kupfer/core/__init__.py000066400000000000000000000000001176220042200173660ustar00rootroot00000000000000kupfer-v208/kupfer/core/actioncompat.py000066400000000000000000000027531176220042200203310ustar00rootroot00000000000000 def _get_leaf_members(leaf): """ Return an iterator to members of @leaf, if it is a multiple leaf """ try: return leaf.get_multiple_leaf_representation() except AttributeError: return (leaf, ) def action_valid_for_item(action, leaf): return all(action.valid_for_item(L) for L in _get_leaf_members(leaf)) def actions_for_item(leaf, sourcecontroller): if leaf is None: return [] actions = None for L in _get_leaf_members(leaf): l_actions = set(L.get_actions()) l_actions.update(sourcecontroller.get_actions_for_leaf(L)) if actions is None: actions = l_actions else: actions.intersection_update(l_actions) return actions def iobject_source_for_action(action, for_item): for leaf in _get_leaf_members(for_item): return action.object_source(leaf) def iobjects_valid_for_action(action, for_item): """ Return a filtering *function* that will let through those leaves that are good iobjects for @action and @for_item. """ def valid_object(leaf, for_item): _valid_object = action.valid_object for L in _get_leaf_members(leaf): for I in _get_leaf_members(for_item): if not _valid_object(L, for_item=I): return False return True types = tuple(action.object_types()) def type_obj_check(iobjs): for i in iobjs: if (isinstance(i, types) and valid_object(i, for_item=for_item)): yield i def type_check(itms): for i in itms: if isinstance(i, types): yield i if hasattr(action, "valid_object"): return type_obj_check else: return type_check kupfer-v208/kupfer/core/commandexec.py000066400000000000000000000311361176220042200201300ustar00rootroot00000000000000""" The main logic for executing constructed commands. A command is normally a tuple of (object, action, indirect object). Where, of course, the indirect object is often not needed (in this module we then pass None in its stead). This code was once a shining machine; While adding the "comma trick" and support for "multiple dispatch" was easy in the rest of the program, it shed its casualties here: While the main process is simple, we deal here with all the exceptions that are, at the moment, tacked on. The ActionExecutionContext (ACE) keeps track of its nested invocation, so that we can catch the results of commands executed inside other commands. The delegation mechanism allows a user of the ACE to indicate that the result of the command should be passed on from the earlier (more nested) invocation. Multiple dispatch is straightforward if the action implements the multiple dispatch protocol. Is the protocol not implemented, the command is simply "multiplied out": executed once for each object, or once for each combination of object and indirect object. With multiple command execution (and delegation), we must then process and merge multiple return values. """ from __future__ import with_statement import collections import contextlib import itertools import sys import gobject from kupfer import pretty from kupfer import task from kupfer import uiutils from kupfer.objects import OperationError from kupfer.obj.objects import SourceLeaf from kupfer.obj.sources import MultiSource from kupfer.obj.compose import MultipleLeaf RESULT_NONE, RESULT_OBJECT, RESULT_SOURCE, RESULT_ASYNC = (1, 2, 3, 4) RESULTS_SYNC = (RESULT_OBJECT, RESULT_SOURCE) _MAX_LAST_RESULTS = 10 _action_exec_context = None def DefaultActionExecutionContext(): global _action_exec_context if _action_exec_context is None: _action_exec_context = ActionExecutionContext() return _action_exec_context class ActionExecutionError (Exception): pass def _get_leaf_members(leaf): """ Return an iterator to members of @leaf, if it is a multiple leaf """ # NOTE : This function duplicates one in core/actionlogic.py try: return leaf.get_multiple_leaf_representation() except AttributeError: return (leaf, ) def _is_multiple(leaf): return hasattr(leaf, "get_multiple_leaf_representation") def _wants_context(action): return action.wants_context() def activate_action(context, obj, action, iobj): """ Activate @action in simplest manner """ kwargs = {} if _wants_context(action): kwargs['ctx'] = context if not _is_multiple(obj) and not _is_multiple(iobj): return _activate_action_single(obj, action, iobj, kwargs) else: return _activate_action_multiple(obj, action, iobj, kwargs) def _activate_action_single(obj, action, iobj, kwargs): if action.requires_object(): ret = action.activate(obj, iobj, **kwargs) else: ret = action.activate(obj, **kwargs) return ret def _activate_action_multiple(obj, action, iobj, kwargs): if not hasattr(action, "activate_multiple"): iobjs = (None, ) if iobj is None else _get_leaf_members(iobj) return _activate_action_multiple_multiplied(_get_leaf_members(obj), action, iobjs, kwargs) if action.requires_object(): ret = action.activate_multiple(_get_leaf_members(obj), _get_leaf_members(iobj), **kwargs) else: ret = action.activate_multiple(_get_leaf_members(obj), **kwargs) return ret def _activate_action_multiple_multiplied(objs, action, iobjs, kwargs): """ Multiple dispatch by "mulitplied" invocation of the simple activation Return an iterable of the return values. """ rets = [] for L in objs: for I in iobjs: ret = _activate_action_single(L, action, I, kwargs) rets.append(ret) ctx = DefaultActionExecutionContext() ret = ctx._combine_action_result_multiple(action, rets) return ret def parse_action_result(action, ret): """Return result type for @action and return value @ret""" def valid_result(ret): return ret and (not hasattr(ret, "is_valid") or ret.is_valid()) # handle actions returning "new contexts" res = RESULT_NONE if action.is_factory() and valid_result(ret): res = RESULT_SOURCE if action.has_result() and valid_result(ret): res = RESULT_OBJECT elif action.is_async() and valid_result(ret): res = RESULT_ASYNC return res class ExecutionToken (object): """ A token object that an ``Action`` carries with it from ``activate``. Must be used for access to current execution context, and to access the environment. """ def __init__(self, aectx, async_token, ui_ctx): self._aectx = aectx self._token = async_token self._ui_ctx = ui_ctx def register_late_result(self, result_object, show=True): self._aectx.register_late_result(self._token, result_object, show=show, ctxenv=self._ui_ctx) def register_late_error(self, exc_info=None): self._aectx.register_late_error(self._token, exc_info) def delegated_run(self, *objs): return self._aectx.run(*objs, delegate=True, ui_ctx=self._ui_ctx) @property def environment(self): """This is a property for the current environment, acess env variables like this:: ctx.environment.get_timestamp() Raises RuntimeError when not available. """ if self._ui_ctx is not None: return self._ui_ctx else: raise RuntimeError("Environment Context not available") class ActionExecutionContext (gobject.GObject, pretty.OutputMixin): """ command-result (result_type, result) Emitted when a command is carried out, with its resulting value """ __gtype_name__ = "ActionExecutionContext" def __init__(self): gobject.GObject.__init__(self) self.task_runner = task.TaskRunner(end_on_finish=False) self._nest_level = 0 self._delegate = False self._command_counter = itertools.count() self.last_command_id = -1 self.last_command = None self.last_executed_command = None self.last_results = collections.deque([], _MAX_LAST_RESULTS) def check_valid(self, obj, action, iobj): pass @contextlib.contextmanager def _nesting(self): try: self._nest_level += 1 self._delegate = False yield finally: self._nest_level -= 1 def _is_nested(self): return self._nest_level @contextlib.contextmanager def _error_conversion(self, *cmdtuple): try: yield except OperationError: self._do_error_conversion(cmdtuple, sys.exc_info()) def _do_error_conversion(self, cmdtuple, exc_info): if not self.operation_error(exc_info, cmdtuple): raise etype, value, tb = exc_info raise ActionExecutionError, value, tb def get_async_token(self): """Get an action execution for current execution Return a token for the currently active command execution. The token must be used for posting late results or late errors. """ return (self.last_command_id, self.last_executed_command) def make_execution_token(self, ui_ctx): """ Return an ExecutionToken for @self and @ui_ctx """ return ExecutionToken(self, self.get_async_token(), ui_ctx) def operation_error(self, exc_info, cmdtuple): "Error when executing action. Return True when error was handled" if self._is_nested(): return etype, value, tb = exc_info obj, action, iobj = cmdtuple # TRANS: When an error occurs in an action to be carried out, # TRANS: then this is the heading of the error notification return uiutils.show_notification( _("Could not to carry out '%s'") % action, unicode(value), icon_name="kupfer") def register_late_error(self, token, exc_info=None): "Register an error in exc_info. The error must be an OperationError" if exc_info is None: exc_info = sys.exc_info() if isinstance(exc_info, Exception): exc_info = (type(exc_info), exc_info, None) command_id, cmdtuple = token self._do_error_conversion(cmdtuple, exc_info) def register_late_result(self, token, result, show=True, ctxenv=None): """Register a late result Result must be a Leaf (as in result object, not factory or async) If @show, possibly display the result to the user. """ self.output_debug("Late result", repr(result), "for", token) command_id, (_ign1, action, _ign2) = token if result is None: raise ActionExecutionError("Late result from %s was None" % action) res_name = unicode(result) res_desc = result.get_description() if res_desc: description = "%s (%s)" % (res_name, res_desc) else: description = res_name uiutils.show_notification(_('"%s" produced a result') % action, description) # If only registration was requsted, remove the command id info if not show: command_id = -1 self.emit("late-command-result", command_id, RESULT_OBJECT, result, ctxenv) self._append_result(RESULT_OBJECT, result) def _append_result(self, res_type, result): if res_type == RESULT_OBJECT: self.last_results.append(result) def run(self, obj, action, iobj, delegate=False, ui_ctx=None): """ Activate the command (obj, action, iobj), where @iobj may be None Return a tuple (DESCRIPTION; RESULT) If a command carries out another command as part of its execution, and wishes to delegate to it, pass True for @delegate. """ self.last_command_id = self._command_counter.next() self.last_executed_command = (obj, action, iobj) if not action or not obj: raise ActionExecutionError("Primary Object and Action required") if iobj is None and action.requires_object(): raise ActionExecutionError("%s requires indirect object" % action) # The execution token object for the current invocation execution_token = self.make_execution_token(ui_ctx) with self._error_conversion(obj, action, iobj): with self._nesting(): ret = activate_action(execution_token, obj, action, iobj) # remember last command, but not delegated commands. if not delegate: self.last_command = self.last_executed_command # Delegated command execution was previously requested: we take # the result of the nested execution context if self._delegate: res, ret = ret return self._return_result(res, ret, ui_ctx) res = parse_action_result(action, ret) if res == RESULT_ASYNC: # Register the task then "clear" the result self.output_debug("Registering async task", ret) self.task_runner.add_task(ret) res, ret = RESULT_NONE, None # Delegated command execution was requested: we pass # through the result of the action to the parent execution context if delegate and self._is_nested(): self._delegate = True return self._return_result(res, ret, ui_ctx) def _return_result(self, res, ret, ui_ctx): if not self._is_nested(): self._append_result(res, ret) self.emit("command-result", res, ret, ui_ctx) return res, ret def _combine_action_result_multiple(self, action, retvals): self.output_debug("Combining", repr(action), retvals, "delegate=%s" % self._delegate) def _make_retvalue(res, values): "Construct a return value for type res" if res == RESULT_SOURCE: return values[0] if len(values) == 1 else MultiSource(values) if res == RESULT_OBJECT: return values[0] if len(values) == 1 else MultipleLeaf(values) if res == RESULT_ASYNC: # Register all tasks now, and return None upwards for task in values: self.output_debug("Registering async task", task) self.task_runner.add_task(task) return None if not self._delegate: values = [] res = RESULT_NONE for ret in retvals: res_type = parse_action_result(action, ret) if res_type != RESULT_NONE: values.append(ret) res = res_type return _make_retvalue(res, values) else: # Re-parse result values res = RESULT_NONE resmap = {} for ret in retvals: if ret is None: continue res_type, ret_obj = ret if res_type != RESULT_NONE: res = res_type resmap.setdefault(res_type, []).append(ret_obj) # register tasks tasks = resmap.pop(RESULT_ASYNC, []) _make_retvalue(RESULT_ASYNC, tasks) if len(resmap) == 1: # Return the only of the Source or Object case key, values = resmap.items()[0] return key, _make_retvalue(key, values) elif len(resmap) > 1: # Put the source in a leaf and return a multiple leaf source = _make_retvalue(RESULT_SOURCE, resmap[RESULT_SOURCE]) objects = resmap[RESULT_OBJECT] objects.append(SourceLeaf(source)) return RESULT_OBJECT, _make_retvalue(RESULT_OBJECT, objects) return RESULT_NONE, None # Signature: Action result type, action result, gui_context gobject.signal_new("command-result", ActionExecutionContext, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_INT, gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT)) # Signature: Command ID, Action result type, action result, gui_context gobject.signal_new("late-command-result", ActionExecutionContext, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_INT, gobject.gobject.TYPE_INT, gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT)) kupfer-v208/kupfer/core/data.py000066400000000000000000000742121176220042200165600ustar00rootroot00000000000000from __future__ import with_statement import itertools import operator import os import sys import gobject gobject.threads_init() from kupfer.obj import base, sources, compose from kupfer import pretty, scheduler from kupfer import datatools from kupfer.core import actioncompat from kupfer.core import commandexec from kupfer.core import execfile from kupfer.core import pluginload from kupfer.core import qfurl from kupfer.core import search, learn from kupfer.core import settings from kupfer.core.sources import GetSourceController # "Enums" # Which pane SourcePane, ActionPane, ObjectPane = (1,2,3) # In two-pane or three-pane mode SourceActionMode, SourceActionObjectMode = (1,2) DATA_SAVE_INTERVAL_S = 3660 def identity(x): return x def is_iterable(obj): return hasattr(obj, "__iter__") def dress_leaves(seq, action): """yield items of @seq "dressed" by the source controller""" sc = GetSourceController() for itm in seq: sc.decorate_object(itm.object, action=action) yield itm def peekfirst(seq): """This function will return (firstitem, iter) where firstitem is the first item of @seq or None if empty, and iter an equivalent copy of @seq """ seq = iter(seq) for itm in seq: old_iter = itertools.chain((itm, ), seq) return (itm, old_iter) return (None, seq) class Searcher (object): """ This class searches KupferObjects efficiently, and stores searches in a cache for a very limited time (*) (*) As of this writing, the cache is used when the old key is a prefix of the search key. """ def __init__(self): self._source_cache = {} self._old_key = None def search(self, sources, key, score=True, item_check=None, decorator=None): """ @sources is a sequence listing the inputs, which should be Sources, TextSources or sequences of KupferObjects If @score, sort by rank. filters (with identity() as default): @item_check: Check items before adding to search pool @decorator: Decorate items before access Return (first, match_iter), where first is the first match, and match_iter an iterator to all matches, including the first match. """ if not self._old_key or not key.startswith(self._old_key): self._source_cache.clear() self._old_key = key if not item_check: item_check = identity if not decorator: decorator = identity match_iters = [] for src in sources: fixedrank = 0 can_cache = True rankables = None if is_iterable(src): items = item_check(src) can_cache = False else: # Look in source cache for stored rankables try: rankables = self._source_cache[src] except KeyError: try: items = item_check(src.get_text_items(key)) fixedrank = src.get_rank() can_cache = False except AttributeError: items = item_check(src.get_leaves()) if not rankables: rankables = search.make_rankables(items) if score: if fixedrank: rankables = search.add_rank_objects(rankables, fixedrank) elif key: rankables = search.score_objects(rankables, key) matches = search.bonus_objects(rankables, key) if can_cache: # we fork off a copy of the iterator to save matches, self._source_cache[src] = itertools.tee(matches) else: # we only want to list them matches = rankables match_iters.append(matches) matches = itertools.chain(*match_iters) if score: matches = sorted(matches, key=operator.attrgetter("rank"), reverse=True) def as_set_iter(seq): key = operator.attrgetter("object") return datatools.UniqueIterator(seq, key=key) def valid_check(seq): """yield items of @seq that are valid""" for itm in seq: obj = itm.object if (not hasattr(obj, "is_valid")) or obj.is_valid(): yield itm # Check if the items are valid as the search # results are accessed through the iterators unique_matches = as_set_iter(matches) match, match_iter = peekfirst(decorator(valid_check(unique_matches))) return match, match_iter def rank_actions(self, objects, key, leaf, item_check=None, decorator=None): """ rank @objects, which should be a sequence of KupferObjects, for @key, with the action ranker algorithm. @leaf is the Leaf the action is going to be invoked on Filters and return value like .score(). """ if not item_check: item_check = identity if not decorator: decorator = identity rankables = search.make_rankables(item_check(objects)) if key: rankables = search.score_objects(rankables, key) matches = search.bonus_objects(rankables, key) else: matches = search.score_actions(rankables, leaf) matches = sorted(matches, key=operator.attrgetter("rank"), reverse=True) match, match_iter = peekfirst(decorator(matches)) return match, match_iter class Pane (gobject.GObject): """ signals: search-result (match, match_iter, context) """ __gtype_name__ = "Pane" def __init__(self): super(Pane, self).__init__() self.selection = None self.latest_key = None self.outstanding_search = -1 self.outstanding_search_id = -1 self.searcher = Searcher() def select(self, item): self.selection = item def get_selection(self): return self.selection def reset(self): self.selection = None def get_latest_key(self): return self.latest_key def get_can_enter_text_mode(self): return False def get_should_enter_text_mode(self): return False def emit_search_result(self, match, match_iter, context): self.emit("search-result", match, match_iter, context) gobject.signal_new("search-result", Pane, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT)) class LeafPane (Pane, pretty.OutputMixin): __gtype_name__ = "LeafPane" def __init__(self): super(LeafPane, self).__init__() self.source_stack = [] self.source = None self.object_stack = [] def _load_source(self, src): """Try to get a source from the SourceController, if it is already loaded we get it from there, else returns @src""" sc = GetSourceController() return sc.get_canonical_source(src) def get_source(self): return self.source def source_rebase(self, src): self.source_stack = [] self.source = self._load_source(src) self.refresh_data() def push_source(self, src): self.source_stack.append(self.source) self.source = self._load_source(src) self.refresh_data() def pop_source(self): """Return True if succeeded""" if not len(self.source_stack): return False self.source = self.source_stack.pop() return True def is_at_source_root(self): """Return True if we have no source stack""" return not self.source_stack def object_stack_push(self, obj): self.object_stack.append(obj) def object_stack_pop(self): return self.object_stack.pop() def get_can_enter_text_mode(self): return self.is_at_source_root() def get_should_enter_text_mode(self): return False def refresh_data(self): self.emit("new-source", self.source) def browse_up(self): """Try to browse up to previous sources, from current source""" succ = self.pop_source() if not succ: if self.source.has_parent(): self.source_rebase(self.source.get_parent()) succ = True if succ: self.refresh_data() return succ def browse_down(self, alternate=False): """Browse into @leaf if it's possible and save away the previous sources in the stack if @alternate, use the Source's alternate method""" leaf = self.get_selection() if leaf and leaf.has_content(): self.push_source(leaf.content_source(alternate=alternate)) return True return False def reset(self): """Pop all sources and go back to top level""" Pane.reset(self) while self.pop_source(): pass self.refresh_data() def soft_reset(self): Pane.reset(self) while self.pop_source(): pass return self.source def search(self, key=u"", context=None, text_mode=False): """ filter for action @item """ self.latest_key = key sources = [ self.get_source() ] if not text_mode else [] if key and self.is_at_source_root(): # Only use text sources when we are at root catalog sc = GetSourceController() textsrcs = sc.get_text_sources() sources.extend(textsrcs) decorator = lambda seq: dress_leaves(seq, action=None) match, match_iter = self.searcher.search(sources, key, score=bool(key), decorator=decorator) self.emit_search_result(match, match_iter, context) gobject.signal_new("new-source", LeafPane, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_PYOBJECT,)) class PrimaryActionPane (Pane): def __init__(self): super(PrimaryActionPane, self).__init__() self.set_item(None) def set_item(self, item): """Set which @item we are currently listing actions for""" self.current_item = item self._action_valid_cache = {} def search(self, key=u"", context=None, text_mode=False): """Search: Register the search method in the event loop using @key, promising to return @context in the notification about the result, having selected @item in SourcePane If we already have a call to search, we remove the "source" so that we always use the most recently requested search.""" self.latest_key = key leaf = self.current_item actions = actioncompat.actions_for_item(leaf, GetSourceController()) def is_valid_cached(action): """Check if @action is valid for current item""" cache = self._action_valid_cache valid = cache.get(action) if valid is None: valid = actioncompat.action_valid_for_item(action, leaf) cache[action] = valid return valid def valid_decorator(seq): """Check if actions are valid before access""" for obj in seq: if is_valid_cached(obj.object): yield obj match, match_iter = self.searcher.rank_actions(actions, key, leaf, decorator=valid_decorator) self.emit_search_result(match, match_iter, context) class SecondaryObjectPane (LeafPane): __gtype_name__ = "SecondaryObjectPane" def __init__(self): LeafPane.__init__(self) self.current_item = None self.current_action = None def reset(self): LeafPane.reset(self) self.searcher = Searcher() def set_item_and_action(self, item, act): self.current_item = item self.current_action = act if item and act: ownsrc = actioncompat.iobject_source_for_action(act, item) if ownsrc: self.source_rebase(ownsrc) else: sc = GetSourceController() self.source_rebase(sc.root_for_types(act.object_types())) else: self.reset() def get_can_enter_text_mode(self): """Check if there are any reasonable text sources for this action""" atroot = self.is_at_source_root() types = tuple(self.current_action.object_types()) sc = GetSourceController() textsrcs = sc.get_text_sources() return (atroot and any(sc.good_source_for_types(s, types) for s in textsrcs)) def get_should_enter_text_mode(self): return (self.is_at_source_root() and hasattr(self.get_source(), "get_text_items")) def search(self, key=u"", context=None, text_mode=False): """ filter for action @item """ self.latest_key = key sources = [] if not text_mode or hasattr(self.get_source(), "get_text_items"): sources.append(self.get_source()) if key and self.is_at_source_root(): # Only use text sources when we are at root catalog sc = GetSourceController() textsrcs = sc.get_text_sources() sources.extend(textsrcs) item_check = actioncompat.iobjects_valid_for_action(self.current_action, self.current_item) decorator = lambda seq: dress_leaves(seq, action=self.current_action) match, match_iter = self.searcher.search(sources, key, score=True, item_check=item_check, decorator=decorator) self.emit_search_result(match, match_iter, context) class DataController (gobject.GObject, pretty.OutputMixin): """ Sources <-> Actions controller The data controller must be created before main program commences, so it can register itself at the scheduler correctly. """ __gtype_name__ = "DataController" def __init__(self): super(DataController, self).__init__() self.source_pane = LeafPane() self.object_pane = SecondaryObjectPane() self.source_pane.connect("new-source", self._new_source) self.object_pane.connect("new-source", self._new_source) self.action_pane = PrimaryActionPane() self._panectl_table = { SourcePane : self.source_pane, ActionPane : self.action_pane, ObjectPane : self.object_pane, } for pane, ctl in self._panectl_table.items(): ctl.connect("search-result", self._pane_search_result, pane) self.mode = None self._search_ids = itertools.count(1) self._latest_interaction = -1 self._execution_context = commandexec.DefaultActionExecutionContext() self._execution_context.connect("command-result", self._command_execution_result) self._execution_context.connect("late-command-result", self._late_command_execution_result) self._save_data_timer = scheduler.Timer() sch = scheduler.GetScheduler() sch.connect("load", self._load) sch.connect("display", self._display) sch.connect("finish", self._finish) def register_text_sources(self, plugin_id, srcs): """Pass in text sources as @srcs we register text sources """ sc = GetSourceController() sc.add_text_sources(plugin_id, srcs) def register_action_decorators(self, plugin_id, actions): # Keep a mapping: Decorated Leaf Type -> List of actions decorate_types = {} for action in actions: for appl_type in action.item_types(): decorate_types.setdefault(appl_type, []).append(action) if not decorate_types: return sc = GetSourceController() sc.add_action_decorators(plugin_id, decorate_types) def register_content_decorators(self, plugin_id, contents): """ Register the sequence of classes @contents as potential content decorators. Classes not conforming to the decoration protocol (most importantly, ``.decorates_type()``) will be skipped """ # Keep a mapping: # Decorated Leaf Type -> Set of content decorator types decorate_item_types = {} for c in contents: try: applies = c.decorates_type() except AttributeError: continue decorate_item_types.setdefault(applies, set()).add(c) if not decorate_item_types: return sc = GetSourceController() sc.add_content_decorators(plugin_id, decorate_item_types) def register_action_generators(self, plugin_id, generators): sc = GetSourceController() for generator in generators: sc.add_action_generator(plugin_id, generator) def _load(self, sched): """Begin Data Controller work when we get application 'load' signal Load the data model from saved configuration and caches """ setctl = settings.GetSettingsController() setctl.connect("plugin-enabled-changed", self._plugin_enabled) setctl.connect("plugin-toplevel-changed", self._plugin_catalog_changed) self._load_all_plugins() D_s, d_s = self._get_directory_sources() sc = GetSourceController() sc.add(None, D_s, toplevel=True) sc.add(None, d_s, toplevel=False) sc.initialize() learn.load() def _display(self, sched): self._reload_source_root() self._save_data_timer.set(DATA_SAVE_INTERVAL_S, self._save_data) def _get_directory_sources(self): """ Return a tuple of S_sources, s_sources for directory sources directly included and for catalog inclusion respectively """ s_sources = [] S_sources = [] setctl = settings.GetSettingsController() source_config = setctl.get_config def dir_source(opt): return sources.DirectorySource(opt) def file_source(opt, depth=1): abs = os.path.abspath(os.path.expanduser(opt)) return sources.FileSource((abs,), depth) for coll, direct in zip((s_sources, S_sources), (False, True)): for item in setctl.get_directories(direct): if not os.path.isdir(item): continue coll.append(dir_source(item)) dir_depth = source_config("DeepDirectories", "Depth") for item in source_config("DeepDirectories","Catalog"): s_sources.append(file_source(item, dir_depth)) for item in source_config("DeepDirectories", "Direct"): S_sources.append(file_source(item, dir_depth)) return S_sources, s_sources def _load_all_plugins(self): """ Insert all plugin sources into the catalog """ from kupfer.core import plugins setctl = settings.GetSettingsController() for item in sorted(plugins.get_plugin_ids()): if not setctl.get_plugin_enabled(item): continue sources = self._load_plugin(item) self._insert_sources(item, sources, initialize=False) def _load_plugin(self, plugin_id): """ Load @plugin_id, register all its Actions, Content and TextSources. Return its sources. """ with pluginload.exception_guard(plugin_id): plugin = pluginload.load_plugin(plugin_id) self.register_text_sources(plugin_id, plugin.text_sources) self.register_action_decorators(plugin_id, plugin.action_decorators) self.register_content_decorators(plugin_id, plugin.content_decorators) self.register_action_generators(plugin_id, plugin.action_generators) return set(plugin.sources) return set() def _plugin_enabled(self, setctl, plugin_id, enabled): from kupfer.core import plugins if enabled and not plugins.is_plugin_loaded(plugin_id): sources = self._load_plugin(plugin_id) self._insert_sources(plugin_id, sources, initialize=True) elif not enabled: self._remove_plugin(plugin_id) def _remove_plugin(self, plugin_id): sc = GetSourceController() if sc.remove_objects_for_plugin_id(plugin_id): self._reload_source_root() pluginload.remove_plugin(plugin_id) def _reload_source_root(self): self.output_debug("Reloading source root") sc = GetSourceController() self.source_pane.source_rebase(sc.root) def _plugin_catalog_changed(self, setctl, plugin_id, toplevel): self._reload_source_root() def _insert_sources(self, plugin_id, sources, initialize=True): if not sources: return sc = GetSourceController() setctl = settings.GetSettingsController() for src in sources: is_toplevel = setctl.get_source_is_toplevel(plugin_id, src) sc.add(plugin_id, (src, ), toplevel=is_toplevel, initialize=initialize) if initialize: self._reload_source_root() def _finish(self, sched): "Close down the data model, save user data, and write caches to disk" GetSourceController().finalize() self._save_data(final_invocation=True) self.output_info("Saving cache...") GetSourceController().save_cache() def _save_data(self, final_invocation=False): """Save Learning data and User's configuration data in sources (Recurring timer) """ self.output_info("Saving data...") learn.save() GetSourceController().save_data() if not final_invocation: self._save_data_timer.set(DATA_SAVE_INTERVAL_S, self._save_data) def _new_source(self, ctr, src): if ctr is self.source_pane: pane = SourcePane elif ctr is self.object_pane: pane = ObjectPane root = ctr.is_at_source_root() self.emit("source-changed", pane, src, root) def reset(self): self.source_pane.reset() self.action_pane.reset() def soft_reset(self, pane): if pane is ActionPane: return panectl = self._panectl_table[pane] return panectl.soft_reset() def cancel_search(self, pane=None): """Cancel any outstanding search, or the search for @pane""" panes = (pane, ) if pane else iter(self._panectl_table) for pane in panes: ctl = self._panectl_table[pane] if ctl.outstanding_search > 0: gobject.source_remove(ctl.outstanding_search) ctl.outstanding_search = -1 def search(self, pane, key=u"", context=None, interactive=False, lazy=False, text_mode=False): """Search: Register the search method in the event loop Will search in @pane's base using @key, promising to return @context in the notification about the result. if @interactive, the search result will return immediately if @lazy, will slow down search result reporting """ self.cancel_search(pane) self._latest_interaction = self._execution_context.last_command_id ctl = self._panectl_table[pane] ctl.outstanding_search_id = self._search_ids.next() wrapcontext = (ctl.outstanding_search_id, context) if interactive: ctl.search(key, wrapcontext, text_mode) else: timeout = 300 if lazy else 0 if not key else 50//len(key) ctl.outstanding_search = gobject.timeout_add(timeout, ctl.search, key, wrapcontext, text_mode) def _pane_search_result(self, panectl, match,match_iter, wrapcontext, pane): search_id, context = wrapcontext if not search_id is panectl.outstanding_search_id: self.output_debug("Skipping late search", match, context) return True self.emit("search-result", pane, match, match_iter, context) def select(self, pane, item): """Select @item in @pane to self-update relevant places""" # If already selected, do nothing panectl = self._panectl_table[pane] if item == panectl.get_selection(): return self.cancel_search() panectl.select(item) if pane is SourcePane: assert not item or isinstance(item, base.Leaf), \ "Selection in Source pane is not a Leaf!" # populate actions citem = self._get_pane_object_composed(self.source_pane) self.action_pane.set_item(citem) self.search(ActionPane, interactive=True) if self.mode == SourceActionObjectMode: self.object_stack_clear(ObjectPane) self._populate_third_pane() elif pane is ActionPane: assert not item or isinstance(item, base.Action), \ "Selection in Source pane is not an Action!" self.object_stack_clear(ObjectPane) if item and item.requires_object(): newmode = SourceActionObjectMode else: newmode = SourceActionMode if newmode != self.mode: self.mode = newmode self.emit("mode-changed", self.mode, item) if self.mode == SourceActionObjectMode: self._populate_third_pane() elif pane is ObjectPane: assert not item or isinstance(item, base.Leaf), \ "Selection in Object pane is not a Leaf!" def _populate_third_pane(self): citem = self._get_pane_object_composed(self.source_pane) action = self.action_pane.get_selection() self.object_pane.set_item_and_action(citem, action) self.search(ObjectPane, lazy=True) def get_can_enter_text_mode(self, pane): panectl = self._panectl_table[pane] return panectl.get_can_enter_text_mode() def get_should_enter_text_mode(self, pane): panectl = self._panectl_table[pane] return panectl.get_should_enter_text_mode() def validate(self): """Check if all selected items are still valid (for example after being spawned again, old item still focused) This will trigger .select() with None if items are not valid.. """ def valid_check(obj): return not (hasattr(obj, "is_valid") and not obj.is_valid()) for pane, panectl in self._panectl_table.items(): sel = panectl.get_selection() if not valid_check(sel): self.emit("pane-reset", pane, None) self.select(pane, None) if self._has_object_stack(pane): new_stack = [o for o in panectl.object_stack if valid_check(o)] if new_stack != panectl.object_stack: self._set_object_stack(pane, new_stack) def browse_up(self, pane): """Try to browse up to previous sources, from current source""" if pane is SourcePane: return self.source_pane.browse_up() if pane is ObjectPane: return self.object_pane.browse_up() def browse_down(self, pane, alternate=False): """Browse into @leaf if it's possible and save away the previous sources in the stack if @alternate, use the Source's alternate method""" if pane is ActionPane: return # record used object if we browse down panectl = self._panectl_table[pane] sel, key = panectl.get_selection(), panectl.get_latest_key() if panectl.browse_down(alternate=alternate): learn.record_search_hit(sel, key) def activate(self, ui_ctx): """ Activate current selection @ui_ctx: GUI environment context object """ leaf, action, sobject = self._get_current_command_objects() # register search to learning database learn.record_search_hit(leaf, self.source_pane.get_latest_key()) learn.record_search_hit(action, self.action_pane.get_latest_key()) if sobject and self.mode is SourceActionObjectMode: learn.record_search_hit(sobject, self.object_pane.get_latest_key()) try: ctx = self._execution_context res, ret = ctx.run(leaf, action, sobject, ui_ctx=ui_ctx) except commandexec.ActionExecutionError: self.output_exc() return if res not in commandexec.RESULTS_SYNC: self.emit("launched-action") def execute_file(self, filepath, ui_ctx, on_error): try: cmd_objs = execfile.parse_kfcom_file(filepath) ctx = self._execution_context ctx.run(*cmd_objs, ui_ctx=ui_ctx) return True except commandexec.ActionExecutionError: self.output_exc() return except execfile.ExecutionError: on_error(sys.exc_info()) return False def _insert_object(self, pane, obj): "Insert @obj in @pane: prepare the object, then emit pane-reset" self._decorate_object(obj) self.emit("pane-reset", pane, search.wrap_rankable(obj)) def _decorate_object(self, *objects): sc = GetSourceController() for obj in objects: sc.decorate_object(obj) def insert_objects(self, pane, objects): "Select @objects in @pane" if pane != SourcePane: raise ValueError("Can only insert in first pane") self._decorate_object(objects[:-1]) self._set_object_stack(pane, objects[:-1]) self._insert_object(pane, objects[-1]) def _command_execution_result(self, ctx, result_type, ret, uictx): if result_type == commandexec.RESULT_SOURCE: self.object_stack_clear_all() self.source_pane.push_source(ret) elif result_type == commandexec.RESULT_OBJECT: self.object_stack_clear_all() self._insert_object(SourcePane, ret) else: return self.emit("command-result", result_type, uictx) def _late_command_execution_result(self, ctx, id_, result_type, ret, uictx): "Receive late command result" if self._latest_interaction < id_: self._command_execution_result(ctx, result_type, ret, uictx) def find_object(self, url): """Find object with URI @url and select it in the first pane""" sc = GetSourceController() qf = qfurl.qfurl(url=url) found = qf.resolve_in_catalog(sc.sources) if found and not found == self.source_pane.get_selection(): self._insert_object(SourcePane, found) def mark_as_default(self, pane): """ Make the object selected on @pane as default for the selection in previous pane. """ if pane is SourcePane or pane is ObjectPane: raise RuntimeError("Setting default on pane 1 or 3 not supported") obj = self.source_pane.get_selection() act = self.action_pane.get_selection() assert obj and act learn.set_correlation(act, obj) def get_object_has_affinity(self, pane): """ Return ``True`` if we have any recorded affinity for the object selected in @pane """ panectl = self._panectl_table[pane] selection = panectl.get_selection() if not selection: return None return learn.get_object_has_affinity(selection) def erase_object_affinity(self, pane): """ Erase all learned and configured affinity for the selection of @pane """ panectl = self._panectl_table[pane] selection = panectl.get_selection() if not selection: return None return learn.erase_object_affinity(selection) def compose_selection(self): leaf, action, iobj = self._get_current_command_objects() if leaf is None: return self.object_stack_clear_all() obj = compose.ComposedLeaf(leaf, action, iobj) self._insert_object(SourcePane, obj) def _get_pane_object_composed(self, pane): objects = list(pane.object_stack) sel = pane.get_selection() if sel and sel not in objects: objects.append(sel) if not objects: return None elif len(objects) == 1: return objects[0] else: return compose.MultipleLeaf(objects) def _get_current_command_objects(self): """ Return a tuple of current (obj, action, iobj) """ objects = self._get_pane_object_composed(self.source_pane) action = self.action_pane.get_selection() if objects is None or action is None: return (None, None, None) iobjects = self._get_pane_object_composed(self.object_pane) if self.mode == SourceActionObjectMode: if not iobjects: return (None, None, None) else: iobjects = None return (objects, action, iobjects) def _has_object_stack(self, pane): return pane in (SourcePane, ObjectPane) def _set_object_stack(self, pane, newstack): panectl = self._panectl_table[pane] panectl.object_stack[:] = list(newstack) self.emit("object-stack-changed", pane) def object_stack_push(self, pane, object_): """ Push @object_ onto the stack """ if not self._has_object_stack(pane): return panectl = self._panectl_table[pane] if object_ not in panectl.object_stack: panectl.object_stack_push(object_) self.emit("object-stack-changed", pane) return True def object_stack_pop(self, pane): if not self._has_object_stack(pane): return panectl = self._panectl_table[pane] obj = panectl.object_stack_pop() self._insert_object(pane, obj) self.emit("object-stack-changed", pane) return True def object_stack_clear(self, pane): if not self._has_object_stack(pane): return panectl = self._panectl_table[pane] panectl.object_stack[:] = [] self.emit("object-stack-changed", pane) def object_stack_clear_all(self): """ Clear the object stack for all panes """ for pane in self._panectl_table: self.object_stack_clear(pane) def get_object_stack(self, pane): if not self._has_object_stack(pane): return () panectl = self._panectl_table[pane] return panectl.object_stack # pane cleared or set with new item # pane, item gobject.signal_new("pane-reset", DataController, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_INT, gobject.TYPE_PYOBJECT,)) # pane, match, iter to matches, context gobject.signal_new("search-result", DataController, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_INT, gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT)) gobject.signal_new("source-changed", DataController, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (int, object, bool)) # mode, None(?) gobject.signal_new("mode-changed", DataController, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_INT, gobject.TYPE_PYOBJECT,)) # object stack update signal # arguments: pane gobject.signal_new("object-stack-changed", DataController, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_INT, )) # when an command returned a result # arguments: result type, gui_context gobject.signal_new("command-result", DataController, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_INT, gobject.TYPE_PYOBJECT)) # when an action was launched # arguments: none gobject.signal_new("launched-action", DataController, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, ()) kupfer-v208/kupfer/core/execfile.py000066400000000000000000000054411176220042200174310ustar00rootroot00000000000000import hashlib import pickle import os import gio import glib from kupfer import pretty from kupfer import puid from kupfer import conspickle KUPFER_COMMAND_SHEBANG="#!/usr/bin/env kupfer-exec\n" class ExecutionError (Exception): pass def parse_kfcom_file(filepath): """Extract the serialized command inside @filepath The file must be executable (comparable to a shell script) >>> parse_kfcom_file(__file__) # doctest: +ELLIPSIS Traceback (most recent call last): ... ExecutionError: ... (not executable) Return commands triple """ fobj = open(filepath, "rb") if not os.access(filepath, os.X_OK): raise ExecutionError(_('No permission to run "%s" (not executable)') % glib.filename_display_basename(filepath)) # strip shebang away data = fobj.read() if data.startswith("#!") and "\n" in data: shebang, data = data.split("\n", 1) try: id_ = conspickle.BasicUnpickler.loads(data) command_object = puid.resolve_unique_id(id_) except pickle.UnpicklingError, err: raise ExecutionError("Could not parse: %s" % unicode(err)) except Exception: raise ExecutionError('"%s" is not a saved command' % os.path.basename(filepath)) if command_object is None: raise ExecutionError(_('Command in "%s" is not available') % glib.filename_display_basename(filepath)) try: return tuple(command_object.object) except (AttributeError, TypeError): raise ExecutionError('"%s" is not a saved command' % os.path.basename(filepath)) finally: glib.idle_add(update_icon, command_object, filepath) def save_to_file(command_leaf, filename): fd = os.open(filename, os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o777) wfile = os.fdopen(fd, "wb") try: wfile.write(KUPFER_COMMAND_SHEBANG) pickle.dump(puid.get_unique_id(command_leaf), wfile, 0) finally: wfile.close() def _write_thumbnail(gfile, pixbuf): uri = gfile.get_uri() hashname = hashlib.md5(uri).hexdigest() thumb_dir = os.path.expanduser("~/.thumbnails/normal") if not os.path.exists(thumb_dir): os.makedirs(thumb_dir, 0700) thumb_filename = os.path.join(thumb_dir, hashname + ".png") pixbuf.save(thumb_filename, "png") return thumb_filename def update_icon(kobj, filepath): "Give @filepath a custom icon taken from @kobj" icon_key = "metadata::custom-icon" icon_namespace = icon_key.split(":")[0] gfile = gio.File(filepath) finfo = gfile.query_info(icon_key) custom_icon_uri = finfo.get_attribute_string(icon_key) if custom_icon_uri and gio.File(custom_icon_uri).query_exists(): return if icon_namespace in (N.name for N in gfile.query_writable_namespaces()): pretty.print_debug(__name__, "Updating icon for", filepath) thumb_filename = _write_thumbnail(gfile, kobj.get_pixbuf(128)) gfile.set_attribute_string(icon_key, gio.File(thumb_filename).get_uri()) if __name__ == '__main__': import doctest doctest.testmod() kupfer-v208/kupfer/core/learn.py000066400000000000000000000123641176220042200167500ustar00rootroot00000000000000import cPickle as pickle import os from kupfer import config from kupfer import conspickle from kupfer import pretty mnemonics_filename = "mnemonics.pickle" CORRELATION_KEY = 'kupfer.bonus.correlation' ## this is a harmless default _default_actions = { '': '', '': '', } _register = {} _favorites = set() class Mnemonics (object): """ Class to describe a collection of mnemonics as well as the total count """ def __init__(self): self.mnemonics = dict() self.count = 0 def __repr__(self): return "<%s %d %s>" % (self.__class__.__name__, self.count, "".join(["%s: %d, " % (m,c) for m,c in self.mnemonics.iteritems()])) def increment(self, mnemonic=None): if mnemonic: mcount = self.mnemonics.get(mnemonic, 0) self.mnemonics[mnemonic] = mcount + 1 self.count += 1 def decrement(self): """Decrement total count and the least mnemonic""" if self.mnemonics: key = min(self.mnemonics, key=lambda k: self.mnemonics[k]) if self.mnemonics[key] <= 1: del self.mnemonics[key] else: self.mnemonics[key] -= 1 self.count = max(self.count -1, 0) def __nonzero__(self): return self.count def get_count(self): return self.count def get_mnemonics(self): return self.mnemonics class Learning (object): @classmethod def _unpickle_register(cls, pickle_file): try: pfile = open(pickle_file, "rb") except IOError, e: return None try: data = conspickle.ConservativeUnpickler.loads(pfile.read()) assert isinstance(data, dict), "Stored object not a dict" pretty.print_debug(__name__, "Reading from %s" % (pickle_file, )) except (pickle.PickleError, Exception), e: data = None pretty.print_error(__name__, "Error loading %s: %s" % (pickle_file, e)) finally: pfile.close() return data @classmethod def _pickle_register(self, reg, pickle_file): ## Write to tmp then rename over for atomicity tmp_pickle_file = "%s.%s" % (pickle_file, os.getpid()) pretty.print_debug(__name__, "Saving to %s" % (pickle_file, )) with open(tmp_pickle_file, "wb") as output: output.write(pickle.dumps(reg, pickle.HIGHEST_PROTOCOL)) os.rename(tmp_pickle_file, pickle_file) return True def record_search_hit(obj, key=u""): """ Record that KupferObject @obj was used, with the optional search term @key recording """ name = repr(obj) if name not in _register: _register[name] = Mnemonics() _register[name].increment(key) def get_record_score(obj, key=u""): """ Get total score for KupferObject @obj, bonus score is given for @key matches """ name = repr(obj) fav = 7 * (name in _favorites) if name not in _register: return fav mns = _register[name] if not key: cnt = mns.get_count() return fav + 50 * (1 - 1.0/(cnt + 1)) stats = mns.get_mnemonics() closescr = sum(stats[m] for m in stats if m.startswith(key)) mnscore = 30 * (1 - 1.0/(closescr + 1)) exact = stats.get(key, 0) mnscore += 50 * (1 - 1.0/(exact + 1)) return fav + mnscore def get_correlation_bonus(obj, for_leaf): """ Get the bonus rank for @obj when used with @for_leaf """ if _register.setdefault(CORRELATION_KEY, {}).get(repr(for_leaf)) == repr(obj): return 50 else: return 0 def set_correlation(obj, for_leaf): """ Register @obj to get a bonus when used with @for_leaf """ _register.setdefault(CORRELATION_KEY, {})[repr(for_leaf)] = repr(obj) def _get_mnemonic_items(in_register): return [(k,v) for k,v in in_register.items() if k != CORRELATION_KEY] def get_object_has_affinity(obj): """ Return if @obj has any positive score in the register """ return bool(_register.get(repr(obj)) or _register.get(CORRELATION_KEY, {}).get(repr(obj))) def erase_object_affinity(obj): """ Remove all track of affinity for @obj """ _register.pop(repr(obj), None) _register.get(CORRELATION_KEY, {}).pop(repr(obj), None) def _prune_register(): """ Remove items with chance (len/25000) Assuming homogenous records (all with score one) we keep: x_n+1 := x_n * (1 - chance) To this we have to add the expected number of added mnemonics per invocation, est. 10, and we can estimate a target number of saved mnemonics. """ import random random.seed() rand = random.random goalitems = 500 flux = 2.0 alpha = flux/goalitems**2 chance = min(0.1, len(_register)*alpha) for leaf, mn in _get_mnemonic_items(_register): if rand() > chance: continue mn.decrement() if not mn: del _register[leaf] l = len(_register) pretty.print_debug(__name__, "Pruned register (%d mnemonics)" % l) def load(): """ Load learning database """ global _register filepath = config.get_config_file(mnemonics_filename) if filepath: _register = Learning._unpickle_register(filepath) if not _register: _register = {} if CORRELATION_KEY not in _register: _register[CORRELATION_KEY] = _default_actions def save(): """ Save the learning record """ if not _register: pretty.print_debug(__name__, "Not writing empty register") return if len(_register) > 100: _prune_register() filepath = config.save_config_file(mnemonics_filename) Learning._pickle_register(_register, filepath) def add_favorite(obj): _favorites.add(repr(obj)) def remove_favorite(obj): _favorites.discard(repr(obj)) def is_favorite(obj): return repr(obj) in _favorites kupfer-v208/kupfer/core/pluginload.py000066400000000000000000000040621176220042200200010ustar00rootroot00000000000000import contextlib from kupfer import pretty from kupfer.core import plugins from kupfer.core.plugins import (load_plugin_sources, sources_attribute, action_decorators_attribute, text_sources_attribute, content_decorators_attribute, action_generators_attribute, initialize_plugin) class PluginDescription (object): text_sources = () action_decorators = () content_decorators = () action_generators = () sources = () def load_plugin(plugin_id): """ @S_sources are to be included directly in the catalog, @s_souces as just as subitems """ sources = [] text_sources = [] action_decorators = [] content_decorators = [] action_generators = [] item = plugin_id initialize_plugin(item) if not plugins.is_plugin_loaded(item): return PluginDescription() text_sources.extend(load_plugin_sources(item, text_sources_attribute)) action_decorators.extend(load_plugin_sources(item, action_decorators_attribute)) action_generators.extend(load_plugin_sources(item, action_generators_attribute)) # Register all Sources as (potential) content decorators content_decorators.extend(load_plugin_sources(item, sources_attribute, instantiate=False)) content_decorators.extend(load_plugin_sources(item, content_decorators_attribute, instantiate=False)) sources.extend(load_plugin_sources(item)) desc = PluginDescription() desc.text_sources = text_sources desc.action_decorators = action_decorators desc.content_decorators = content_decorators desc.sources = sources desc.action_generators = action_generators return desc @contextlib.contextmanager def exception_guard(name, callback=None, *args): "Guard for exceptions, print traceback and call @callback if any is raised" try: yield except Exception: import traceback pretty.print_error(__name__, "Loading %s raised an exception:" % name) traceback.print_exc() pretty.print_error(__name__, "This error is probably a bug in", name) pretty.print_error(__name__, "Please file a bug report") if callback is not None: callback(*args) def remove_plugin(plugin_id): plugins.unimport_plugin(plugin_id) kupfer-v208/kupfer/core/plugins.py000066400000000000000000000265471176220042200173400ustar00rootroot00000000000000import pkgutil import sys from kupfer import pretty from kupfer.core import settings # import kupfer.icons on demand later sources_attribute = "__kupfer_sources__" text_sources_attribute = "__kupfer_text_sources__" content_decorators_attribute = "__kupfer_contents__" action_decorators_attribute = "__kupfer_actions__" action_generators_attribute = "__kupfer_action_generators__" settings_attribute = "__kupfer_settings__" initialize_attribute = "initialize_plugin" finalize_attribute = "finalize_plugin" info_attributes = [ "__kupfer_name__", "__version__", "__description__", "__author__", ] class NotEnabledError (Exception): "Plugin may not be imported since it is not enabled" def get_plugin_ids(): """Enumerate possible plugin ids; return a sequence of possible plugin ids, not guaranteed to be plugins""" from kupfer import plugin def is_plugname(plug): return plug != "__init__" and not plug.endswith("_support") for importer, modname, ispkg in pkgutil.iter_modules(plugin.__path__): if is_plugname(modname): yield modname class FakePlugin (object): def __init__(self, plugin_id, attributes, exc_info): self.is_fake_plugin = True self.exc_info = exc_info self.__name__ = plugin_id vars(self).update(attributes) def __repr__(self): return "<%s %s>" % (type(self).__name__, self.__name__) def get_plugin_info(): """Generator, yields dictionaries of plugin descriptions with at least the fields: name localized_name version description author """ for plugin_name in sorted(get_plugin_ids()): try: plugin = import_plugin_any(plugin_name) if not plugin: continue plugin = vars(plugin) except ImportError, e: pretty.print_error(__name__, "import plugin '%s':" % plugin_name, e) continue localized_name = plugin.get("__kupfer_name__", None) desc = plugin.get("__description__", "") vers = plugin.get("__version__", "") author = plugin.get("__author__", "") # skip false matches; # all plugins have to have @localized_name if localized_name is None: continue yield { "name": plugin_name, "localized_name": localized_name, "version": vers, "description": desc or u"", "author": author, "provides": (), } def get_plugin_desc(): """Return a formatted list of plugins suitable for printing to terminal""" import textwrap infos = list(get_plugin_info()) verlen = max(len(r["version"]) for r in infos) idlen = max(len(r["name"]) for r in infos) maxlen = 78 left_margin = 2 + idlen + 1 + verlen + 1 desc = [] for rec in infos: # Wrap the description and align continued lines wrapped = textwrap.wrap(rec["description"], maxlen - left_margin) description = (u"\n" + u" "*left_margin).join(wrapped) desc.append(" %s %s %s" % ( rec["name"].ljust(idlen), rec["version"].ljust(verlen), description, )) return "\n".join(desc) _imported_plugins = {} _plugin_hooks = {} def _truncate_code(code, find_attributes): "Truncate @code where all of @find_attributes have been stored." import dis import types found_info_attributes = set(find_attributes) def _new_code(c, codestring): newcode = types.CodeType(c.co_argcount, c.co_nlocals, c.co_stacksize, c.co_flags, codestring, c.co_consts, c.co_names, c.co_varnames, c.co_filename, c.co_name, c.co_firstlineno, c.co_lnotab) return newcode none_index = list(code.co_consts).index(None) i = 0 end = len(code.co_code) while i < end: if not found_info_attributes: # Insert an instruction to return [None] right here # then truncate the code at this point endinstr = [ dis.opmap["LOAD_CONST"], none_index & 255, none_index >> 8, dis.opmap["RETURN_VALUE"], ] c = list(code.co_code) c[i:] = map(chr, endinstr) ncode = _new_code(code, ''.join(c)) return ncode op = ord(code.co_code[i]) name = dis.opname[op] if op >= dis.HAVE_ARGUMENT: b1 = ord(code.co_code[i+1]) b2 = ord(code.co_code[i+2]) num = b2 * 256 + b1 if name == 'STORE_NAME': global_name = code.co_names[num] found_info_attributes.discard(global_name) i += 3 else: i += 1 pretty.print_debug(__name__, "Code used until end:", code) return code def _import_plugin_fake(modpath, error=None): """ Return an object that has the plugin info attributes we can rescue from a plugin raising on import. @error: If applicable, a tuple of exception info """ loader = pkgutil.get_loader(modpath) if not loader: return None code = loader.get_code(modpath) if not code: return None try: filename = loader.get_filename() except AttributeError: try: filename = loader.archive + loader.prefix except AttributeError: filename = "<%s>" % modpath env = { "__name__": modpath, "__file__": filename, } code = _truncate_code(code, info_attributes) try: eval(code, env) except Exception, exc: pretty.print_debug(__name__, "Loading", modpath, exc) attributes = dict((k, env.get(k)) for k in info_attributes) attributes.update((k, env.get(k)) for k in ["__name__", "__file__"]) return FakePlugin(modpath, attributes, error) def _import_hook_fake(pathcomps): modpath = ".".join(pathcomps) return _import_plugin_fake(modpath) def _import_hook_true(pathcomps): """@pathcomps path components to the import""" path = ".".join(pathcomps) fromlist = pathcomps[-1:] try: setctl = settings.GetSettingsController() if not setctl.get_plugin_enabled(pathcomps[-1]): raise NotEnabledError("%s is not enabled" % pathcomps[-1]) plugin = __import__(path, fromlist=fromlist) except ImportError, exc: # Try to find a fake plugin if it exists plugin = _import_plugin_fake(path, error=sys.exc_info()) if not plugin: raise pretty.print_error(__name__, "Could not import plugin '%s': %s" % (plugin.__name__, exc)) else: pretty.print_debug(__name__, "Loading %s" % plugin.__name__) pretty.print_debug(__name__, " from %s" % plugin.__file__) return plugin def _import_plugin_true(name): """Try to import the plugin from the package, and then from our plugin directories in $DATADIR """ plugin = None try: plugin = _staged_import(name, _import_hook_true) except ImportError: # Reraise to send this up raise except NotEnabledError: raise except Exception: # catch any other error for plugins and write traceback import traceback traceback.print_exc() pretty.print_error(__name__, "Could not import plugin '%s'" % name) return plugin def _staged_import(name, import_hook): "Import plugin @name using @import_hook" plugin = None try: plugin = import_hook(_plugin_path(name)) except ImportError, e: if name not in e.args[0]: raise return plugin def import_plugin(name): if is_plugin_loaded(name): return _imported_plugins[name] plugin = None try: plugin = _import_plugin_true(name) except NotEnabledError: plugin = _staged_import(name, _import_hook_fake) finally: # store nonexistant plugins as None here _imported_plugins[name] = plugin return plugin def import_plugin_any(name): if name in _imported_plugins: return _imported_plugins[name] return _staged_import(name, _import_hook_fake) def _plugin_path(name): return ("kupfer", "plugin", name) # Plugin Attributes def get_plugin_attributes(plugin_name, attrs, warn=False): """Generator of the attributes named @attrs to be found in plugin @plugin_name if the plugin is not found, we write an error and yield nothing. if @warn, we print a warning if a plugin does not have a requested attribute """ try: plugin = import_plugin(plugin_name) except ImportError, e: pretty.print_info(__name__, "Skipping plugin %s: %s" % (plugin_name, e)) return for attr in attrs: try: obj = getattr(plugin, attr) except AttributeError, e: if warn: pretty.print_info(__name__, "Plugin %s: %s" % (plugin_name, e)) yield None else: yield obj def get_plugin_attribute(plugin_name, attr): """Get single plugin attribute""" attrs = tuple(get_plugin_attributes(plugin_name, (attr,))) obj, = (attrs if attrs else (None, )) return obj def load_plugin_sources(plugin_name, attr=sources_attribute, instantiate=True): sources = get_plugin_attribute(plugin_name, attr) if not sources: return for source in get_plugin_attributes(plugin_name, sources, warn=True): if source: if instantiate: yield source() else: yield source else: pretty.print_info(__name__, "Source not found for %s" % plugin_name) # Plugin Initialization & Error def is_plugin_loaded(plugin_name): return (plugin_name in _imported_plugins and not getattr(_imported_plugins[plugin_name], "is_fake_plugin", None)) def _loader_hook(modpath): modname = ".".join(modpath) loader = pkgutil.find_loader(modname) if not loader: raise ImportError("No loader found for %s" % modname) if not loader.is_package(modname): raise ImportError("Is not a package") return loader PLUGIN_ICON_FILE = "icon-list" icons = None def _load_icons(plugin_name): global icons if icons is None: from kupfer import icons try: loader = _staged_import(plugin_name, _loader_hook) except ImportError, exc: return modname = ".".join(_plugin_path(plugin_name)) try: icon_file = pkgutil.get_data(modname, PLUGIN_ICON_FILE) except IOError as exc: # icon-list file just missing, let is pass silently return def get_icon_data(basename): return pkgutil.get_data(modname, basename) icons.parse_load_icon_list(icon_file, get_icon_data, plugin_name) def initialize_plugin(plugin_name): """Initialize plugin. Find settings attribute if defined, and initialize it """ _load_icons(plugin_name) settings_dict = get_plugin_attribute(plugin_name, settings_attribute) if settings_dict: settings_dict.initialize(plugin_name) initialize = get_plugin_attribute(plugin_name, initialize_attribute) if initialize: initialize(plugin_name) finalize = get_plugin_attribute(plugin_name, finalize_attribute) if finalize: register_plugin_unimport_hook(plugin_name, finalize, plugin_name) def unimport_plugin(plugin_name): """Remove @plugin_name from the plugin list and dereference its python modules. """ # Run unimport hooks if plugin_name in _plugin_hooks: try: for callback, args in reversed(_plugin_hooks[plugin_name]): callback(*args) except: pretty.print_error(__name__, "Error finalizing", plugin_name) pretty.print_exc(__name__) del _plugin_hooks[plugin_name] del _imported_plugins[plugin_name] plugin_module_name = ".".join(_plugin_path(plugin_name)) pretty.print_debug(__name__, "Dereferencing module", plugin_module_name) if plugin_module_name in sys.modules: sys.modules.pop(plugin_module_name) for mod in list(sys.modules): if mod.startswith(plugin_module_name + "."): pretty.print_debug(__name__, "Dereferencing module", mod) sys.modules.pop(mod) def register_plugin_unimport_hook(plugin_name, callback, *args): if plugin_name not in _imported_plugins: raise ValueError("No such plugin %s" % plugin_name) _plugin_hooks.setdefault(plugin_name, []).append((callback, args)) def get_plugin_error(plugin_name): """ Return None if plugin is loaded without error, else return a tuple of exception information """ try: plugin = import_plugin(plugin_name) if getattr(plugin, "is_fake_plugin", None): return plugin.exc_info except ImportError: return sys.exc_info() kupfer-v208/kupfer/core/qfurl.py000066400000000000000000000060271176220042200167770ustar00rootroot00000000000000import urlparse from urlparse import urlparse as _urlparse from urlparse import urlunparse as _urlunparse from kupfer import pretty QFURL_SCHEME = "qpfer" # One would hope that there was a better way to do this urlparse.uses_netloc.append(QFURL_SCHEME) urlparse.uses_fragment.append(QFURL_SCHEME) class QfurlError (Exception): pass class qfurl (object): """A qfurl is a URI to locate unique objects in kupfer's catalog. The qfurl is built up as follows: ``qpfer://mother/qfid#module_and_type_hint`` The mother part is a mother source identifier and is optional. The module_and_type_hint is optional. A short url looks like the following: ``qpfer:identifier`` This class provides methods to get the qfurl for an object, and resolve the object in a catalog. >>> class Object (object): ... qf_id = "token" ... >>> q = qfurl(Object()) >>> qfurl.reduce_url(q.url) 'qpfer:token' >>> class Source (object): ... def get_leaves(self): ... yield Object() ... def provides(self): ... yield Object ... >>> q.resolve_in_catalog((Source(), )) # doctest: +ELLIPSIS <__main__.Object object at 0x...> """ def __init__(self, obj=None, url=None): """Create a new qfurl for object @obj""" if obj: typname = "%s.%s" % (type(obj).__module__, type(obj).__name__) try: qfid = obj.qf_id except AttributeError: raise QfurlError("%s has no qfurl" % obj) self.url = _urlunparse((QFURL_SCHEME, "", qfid, "", "", typname)) else: self.url = url def __str__(self): return self.url def __hash__(self): return hash(self.url) def __eq__(self, other): return self.reduce_url(self.url) == self.reduce_url(other.url) @classmethod def reduce_url(cls, url): """ >>> url = "qpfer://mother/qfid#module_and_type_hint" >>> qfurl.reduce_url(url) 'qpfer://mother/qfid' """ return urlparse.urldefrag(url)[0].replace("///", "", 1) @classmethod def _parts_mother_id_typename(cls, url): """ >>> murl = "qpfer://mother/qfid#module_and_type_hint" >>> qfurl._parts_mother_id_typename(murl) ('mother', 'qfid', 'module_and_type_hint') """ scheme, mother, qfid, _ign, _ore, typname = _urlparse(url) if scheme != QFURL_SCHEME: raise QfurlError("Wrong scheme: %s" % scheme) qfid = qfid.lstrip("/") return mother, qfid, typname def resolve_in_catalog(self, catalog): """Resolve self in a catalog of sources Return *immediately* on match found""" mother, qfid, typname = self._parts_mother_id_typename(self.url) module, name = typname.rsplit(".", 1) if typname else (None, None) for src in catalog: if name: if name not in (pt.__name__ for pt in src.provides()) and \ name not in (t.__name__ for pt in src.provides() for t in pt.__subclasses__()): continue for obj in src.get_leaves(): if not hasattr(obj, "qf_id"): continue try: if self == qfurl(obj): return obj except QfurlError: pass pretty.print_debug(__name__, "No match found for", self) return None if __name__ == '__main__': import doctest doctest.testmod() kupfer-v208/kupfer/core/relevance.py000066400000000000000000000151421176220042200176100ustar00rootroot00000000000000# Copyright (C) 2009 Ulrik Sverdrup # 2008 Christian Hergert # 2007 Chris Halse Rogers, DR Colkitt # David Siegel, James Walker # Jason Smith, Miguel de Icaza # Rick Harding, Thomsen Anders # Volker Braun, Jonathon Anderson # # 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 . """ This module provides relevance matching and formatting of related strings based on the relevance. It originates in Gnome-Do. * Python port by Christian Hergert * Module updated by Ulrik Sverdrup to clean up and dramatically speed up the code, by using more pythonic constructs as well as doing less work. Compatibility: Python 2.4 and later, including Python 3 """ from __future__ import division # This module is compatible with both Python 2 and Python 3; # we need the iterator form of range for either version, stored in range() try: range = xrange except NameError: pass def formatCommonSubstrings(s, query, format_clean=None, format_match=None): """ Creates a new string highlighting matching substrings. Returns: a formatted string >>> formatCommonSubstrings('hi there dude', 'hidude', ... format_match=lambda m: "%s" % m) 'hi there dude' >>> formatCommonSubstrings('parallelism', 'lsm', format_match=str.upper) 'paralleLiSM' """ format_clean = format_clean or (lambda x: x) format_match = format_match or (lambda x: x) format = lambda x: x and format_clean(x) if not query: return format(s) ls = s.lower() # find overall range of match first, last = _findBestMatch(ls, query) if first == -1: return format(s) # find longest perfect match, put in slc for slc in range(len(query), 0, -1): if query[:slc] == ls[first:first+slc]: break key, nextkey = query[:slc], query[slc:] head = s[:first] match = s[first: first+slc] matchtail = s[first+slc: last] tail = s[last:] # we use s[0:0], which is "" or u"" return s[0:0].join(( format(head), format_match(match), formatCommonSubstrings(matchtail, nextkey, format_clean, format_match), format(tail), )) def score(s, query): """ A relevancy score for the string ranging from 0 to 1 @s: a string to be scored @query: a string query to score against `s' is treated case-insensitively while `query' is interpreted literally, including case and whitespace. Returns: a float between 0 and 1 >>> print(score('terminal', 'trml')) 0.735098684211 >>> print(score('terminal', 'term')) 0.992302631579 >>> print(score('terminal', 'try')) 0.0 >>> print(score('terminal', '')) 1.0 """ if not query: return 1.0 ls = s.lower() # Find the shortest possible substring that matches the query # and get the ration of their lengths for a base score first, last = _findBestMatch(ls, query) if first == -1: return .0 score = len(query) / (last - first) # Now we weight by string length so shorter strings are better score *= .7 + len(query) / len(s) * .3 # Bonus points if the characters start words good = 0 bad = 1 firstCount = 0 for i in range(first, last-1): if ls[i] in " -": if ls[i + 1] in query: firstCount += 1 else: bad += 1 # A first character match counts extra if query[0] == ls[0]: firstCount += 2 # The longer the acronym, the better it scores good += firstCount * firstCount * 4 # Better yet if the match itself started there if first == 0: good += 2 # Super duper bonus if it is a perfect match if query == ls: good += last * 2 + 4 score = (score + 3 * good / (good + bad)) / 4 # This fix makes sure that perfect matches always rank higher # than split matches. Perfect matches get the .9 - 1.0 range # everything else lower if last - first == len(query): score = .9 + .1 * score else: score = .9 * score return score def _findBestMatch(s, query): """ Finds the shortest substring of @s that contains all characters of query in order. @s: a string to search @query: a string query to search for Returns: a two-item tuple containing the start and end indicies of the match. No match returns (-1,-1). >>> _findBestMatch('terminal', 'trml') (0, 8) >>> _findBestMatch('total told', 'tl') (2, 5) >>> _findBestMatch('terminal', 'yl') (-1, -1) """ bestMatch = -1, -1 # Find the last instance of the last character of the query # since we never need to search beyond that lastChar = s.rfind(query[-1]) # No instance of the character? if lastChar == -1: return bestMatch # Loop through each instance of the first character in query index = s.find(query[0]) queryLength = len(query) lastIndex = lastChar - len(query) + 1 while 0 <= index <= lastIndex: # See if we can fit the whole query in the tail # We know the first char matches, so we dont check it. cur = index + 1 qcur = 1 while qcur < queryLength: # find where in the string the next query character is # if not found, we are done cur = s.find(query[qcur], cur, lastChar + 1) if cur == -1: return bestMatch cur += 1 qcur += 1 # take match if it is shorter # if perfect match, we are done if bestMatch[0] == -1 or (cur - index) < (bestMatch[1] - bestMatch[0]): bestMatch = (index, cur) if cur - index == queryLength: break index = s.find(query[0], index + 1) return bestMatch if __name__ == '__main__': import doctest doctest.testmod() kupfer-v208/kupfer/core/search.py000066400000000000000000000047471176220042200171220ustar00rootroot00000000000000# -*- coding: UTF-8 -*- from kupfer.core import learn, relevance def make_rankables(itr, rank=0): return (Rankable(unicode(obj), obj, rank) for obj in itr) def wrap_rankable(obj, rank=0): return Rankable(unicode(obj), obj, rank) class Rankable (object): """ Rankable has an object (represented item), value (determines rank) and an associated rank Rankable has __hash__ and __eq__ of the object so that a Rankable's rank doesn't matter, Rankables can still be equal """ # To save memory with (really) many Rankables __slots__ = ("rank", "value", "object", "aliases") def __init__(self, value, obj, rank=0): self.rank = rank self.value = value self.object = obj self.aliases = getattr(obj, "name_aliases", ()) def __hash__(self): return hash(self.object) def __eq__(self, other): return (self.object == self.object) def __str__(self): return "%s: %s" % (self.rank, self.value) def __repr__(self): return "" % (str(self), repr(self.object), id(self)) def bonus_objects(rankables, key): """generator of @rankables that have mnemonics for @key rank is added to prev rank, all items are yielded""" key = key.lower() get_record_score = learn.get_record_score for obj in rankables: obj.rank += get_record_score(obj.object, key) obj.rank += obj.object.rank_adjust yield obj def add_rank_objects(rankables, rank): for obj in rankables: obj.rank += rank yield obj def score_objects(rankables, key): """Return @rankables that pass with a >0 rank for @key, rank is added to previous rank, if not @key, then all items are returned""" _score = relevance.score key = key.lower() for rb in rankables: # Rank object rank = _score(rb.value, key)*100 if rank < 90: for alias in rb.aliases: # consider aliases and change rb.value if alias is better # aliases rank lower so that value is chosen when close arank = _score(alias, key)*95 if arank > rank: rank = arank rb.value = alias if rank: rb.rank = rank yield rb def score_actions(rankables, for_leaf): """Alternative (rigid) scoring mechanism for objects, putting much more weight in rank_adjust """ get_record_score = learn.get_record_score for obj in rankables: ra = obj.object.rank_adjust ra += learn.get_correlation_bonus(obj.object, for_leaf) if ra > 0: obj.rank = 50 + ra + get_record_score(obj.object)//2 elif ra == 0: obj.rank = get_record_score(obj.object) else: obj.rank = -50 + ra + get_record_score(obj.object) yield obj kupfer-v208/kupfer/core/settings.py000066400000000000000000000352451176220042200175120ustar00rootroot00000000000000from __future__ import with_statement import ConfigParser import copy import os import glib import gobject from kupfer import config, pretty, scheduler def strbool(value, default=False): """Coerce bool from string value or bool""" if value in (True, False): return value value = str(value).lower() if value in ("no", "false"): return False if value in ("yes", "true"): return True return default class SettingsController (gobject.GObject, pretty.OutputMixin): __gtype_name__ = "SettingsController" config_filename = "kupfer.cfg" defaults_filename = "defaults.cfg" sep = ";" default_directories = ("~/", "~/Desktop", ) # Minimal "defaults" to define all fields # Read defaults defined in a defaults.cfg file defaults = { "Kupfer": { "keybinding" : "" , "magickeybinding": "", "showstatusicon" : True, "usecommandkeys" : True, }, "Directories" : { "direct" : default_directories, "catalog" : (), }, "DeepDirectories" : { "direct" : (), "catalog" : (), "depth" : 1, }, 'Keybindings': {}, "Tools": {}, } def __init__(self): gobject.GObject.__init__(self) self._defaults_path = None self._config = self._read_config() self._save_timer = scheduler.Timer(True) self._alternatives = {} self._alternative_validators = {} def _update_config_save_timer(self): self._save_timer.set(60, self._save_config) def _read_config(self, read_config=True): """ Read cascading config files default -> then config (in all XDG_CONFIG_DIRS) """ parser = ConfigParser.SafeConfigParser() def fill_parser(parser, defaults): for secname, section in defaults.iteritems(): if not parser.has_section(secname): parser.add_section(secname) for key, default in section.iteritems(): if isinstance(default, (tuple, list)): default = self.sep.join(default) elif isinstance(default, int): default = str(default) parser.set(secname, key, default) # Set up defaults confmap = copy.deepcopy(self.defaults) fill_parser(parser, confmap) # Read all config files config_files = [] try: defaults_path = config.get_data_file(self.defaults_filename) except config.ResourceLookupError: print "Error: no default config file %s found!" % self.defaults_filename else: self._defaults_path = defaults_path config_files += (defaults_path, ) if read_config: config_path = config.get_config_file(self.config_filename) if config_path: config_files += (config_path, ) for config_file in config_files: try: with open(config_file, "r") as fil: parser.readfp(fil) except IOError, e: print "Error reading configuration file %s: %s", (config_file, e) # Read parsed file into the dictionary again for secname in parser.sections(): if secname not in confmap: confmap[secname] = {} for key in parser.options(secname): value = parser.get(secname, key) retval = value if secname in self.defaults and key in self.defaults[secname]: defval = self.defaults[secname][key] if isinstance(defval, (tuple, list)): if not value: retval = () else: retval = [p.strip() for p in value.split(self.sep) if p] elif isinstance(defval, bool): retval = strbool(value) elif isinstance(defval, int): retval = type(defval)(value) else: retval = str(value) confmap[secname][key] = retval return confmap def _save_config(self, scheduler=None): self.output_debug("Saving config") config_path = config.save_config_file(self.config_filename) if not config_path: self.output_info("Unable to save settings, can't find config dir") return # read in just the default values default_confmap = self._read_config(read_config=False) def confmap_difference(config, defaults): """Extract the non-default keys to write out""" difference = dict() for secname, section in config.items(): if secname not in defaults: difference[secname] = dict(section) continue difference[secname] = {} for key, config_val in section.items(): if (secname in defaults and key in defaults[secname]): if defaults[secname][key] == config_val: continue difference[secname][key] = config_val if not difference[secname]: del difference[secname] return difference parser = ConfigParser.SafeConfigParser() def fill_parser(parser, defaults): for secname, section in defaults.iteritems(): if not parser.has_section(secname): parser.add_section(secname) for key, default in section.iteritems(): if isinstance(default, (tuple, list)): default = self.sep.join(default) elif isinstance(default, int): default = str(default) parser.set(secname, key, default) confmap = confmap_difference(self._config, default_confmap) fill_parser(parser, confmap) ## Write to tmp then rename over for it to be atomic temp_config_path = "%s.%s" % (config_path, os.getpid()) with open(temp_config_path, "w") as out: parser.write(out) os.rename(temp_config_path, config_path) def get_config(self, section, key): """General interface, but section must exist""" key = key.lower() value = self._config[section].get(key) if section in self.defaults: return value raise KeyError("Invalid settings section: %s" % section) def _set_config(self, section, key, value): """General interface, but section must exist""" self.output_debug("Set", section, key, "to", value) key = key.lower() oldvalue = self._config[section].get(key) if section in self.defaults: value_type = type(oldvalue) if oldvalue is not None else str self._config[section][key] = value_type(value) self._emit_value_changed(section, key, value) self._update_config_save_timer() return True raise KeyError("Invalid settings section: %s" % section) def _emit_value_changed(self, section, key, value): suffix = "%s.%s" % (section.lower(), key.lower()) self.emit("value-changed::"+suffix, section, key, value) def _get_raw_config(self, section, key): """General interface, but section must exist""" key = key.lower() value = self._config[section].get(key) return value def _set_raw_config(self, section, key, value): """General interface, but will create section""" self.output_debug("Set", section, key, "to", value) key = key.lower() if section not in self._config: self._config[section] = {} self._config[section][key] = str(value) self._update_config_save_timer() return False def get_from_defaults(self, section, option=None): """Load values from default configuration file. If @option is None, return all section items as (key, value) """ if self._defaults_path is None: print 'Defaults not found' return parser = ConfigParser.SafeConfigParser() parser.read(self._defaults_path) if option is None: return parser.items(section) else: return parser.get(section, option.lower()) def get_plugin_enabled(self, plugin_id): """Convenience: if @plugin_id is enabled""" return self.get_plugin_config(plugin_id, "kupfer_enabled", value_type=strbool, default=False) def set_plugin_enabled(self, plugin_id, enabled): """Convenience: set if @plugin_id is enabled""" ret = self.set_plugin_config(plugin_id, "kupfer_enabled", enabled, value_type=strbool) self.emit("plugin-enabled-changed", plugin_id, enabled) return ret def get_plugin_is_hidden(self, plugin_id): """Convenience: if @plugin_id is hidden""" return self.get_plugin_config(plugin_id, "kupfer_hidden", value_type=strbool, default=False) @classmethod def _source_config_repr(self, obj): name = type(obj).__name__ return "".join([(c if c.isalnum() else '_') for c in name]) def get_source_is_toplevel(self, plugin_id, src): key = "kupfer_toplevel_" + self._source_config_repr(src) default = not getattr(src, "source_prefer_sublevel", False) return self.get_plugin_config(plugin_id, key, value_type=strbool, default=default) def set_source_is_toplevel(self, plugin_id, src, value): key = "kupfer_toplevel_" + self._source_config_repr(src) self.emit("plugin-toplevel-changed", plugin_id, value) return self.set_plugin_config(plugin_id, key, value, value_type=strbool) def get_keybinding(self): """Convenience: Kupfer keybinding as string""" return self.get_config("Kupfer", "keybinding") def set_keybinding(self, keystr): """Convenience: Set Kupfer keybinding as string""" return self._set_config("Kupfer", "keybinding", keystr) def get_magic_keybinding(self): """Convenience: Kupfer alternate keybinding as string""" return self.get_config("Kupfer", "magickeybinding") def set_magic_keybinding(self, keystr): """Convenience: Set alternate keybinding as string""" return self._set_config("Kupfer", "magickeybinding", keystr) def get_global_keybinding(self, key): M = { "keybinding": self.get_keybinding, "magickeybinding": self.get_magic_keybinding, } return M[key]() def set_global_keybinding(self, key, val): M = { "keybinding": self.set_keybinding, "magickeybinding": self.set_magic_keybinding, } return M[key](val) def get_use_command_keys(self): return self.get_config("Kupfer", "usecommandkeys") def set_use_command_keys(self, enabled): return self._set_config("Kupfer", "usecommandkeys", enabled) def get_show_status_icon(self): """Convenience: Show icon in notification area as bool""" return strbool(self.get_config("Kupfer", "showstatusicon")) def set_show_status_icon(self, enabled): """Set config value and return success""" return self._set_config("Kupfer", "showstatusicon", enabled) def get_directories(self, direct=True): """Yield directories to use as directory sources""" specialdirs = dict((k, getattr(glib, k)) for k in dir(glib) if k.startswith("USER_DIRECTORY_")) def get_special_dir(opt): if opt in specialdirs: return glib.get_user_special_dir(specialdirs[opt]) level = "Direct" if direct else "Catalog" for direc in self.get_config("Directories", level): dpath = get_special_dir(direc) yield dpath or os.path.abspath(os.path.expanduser(direc)) def set_directories(self, dirs): return self._set_config("Directories", "direct", dirs) def get_plugin_config(self, plugin, key, value_type=str, default=None): """Return setting @key for plugin names @plugin, try to coerce to type @value_type. Else return @default if does not exist, or can't be coerced """ plug_section = "plugin_%s" % plugin if not plug_section in self._config: return default val = self._get_raw_config(plug_section, key) if val is None: return default if hasattr(value_type, "load"): val_obj = value_type() val_obj.load(plugin, key, val) return val_obj else: if value_type is bool: value_type = strbool try: val = value_type(val) except ValueError, err: self.output_info("Error for stored value %s.%s" % (plug_section, key), err) return default return val def set_plugin_config(self, plugin, key, value, value_type=str): """Try set @key for plugin names @plugin, coerce to @value_type first. """ plug_section = "plugin_%s" % plugin self._emit_value_changed(plug_section, key, value) if hasattr(value_type, "save"): value_repr = value.save(plugin, key) else: value_repr = value_type(value) return self._set_raw_config(plug_section, key, value_repr) def get_accelerator(self, name): return self.get_config("Keybindings", name) def set_accelerator(self, name, key): return self._set_config("Keybindings", name, key) def get_accelerators(self): return self._config['Keybindings'] def reset_keybindings(self): self.set_keybinding(self.get_from_defaults('Kupfer', 'keybinding')) self.set_magic_keybinding( self.get_from_defaults('Kupfer', 'magickeybinding')) def reset_accelerators(self): for key, value in self.get_from_defaults('Keybindings'): self._set_config('Keybindings', key, value) def get_preferred_tool(self, tool_id): """ Get preferred ID for a @tool_id Supported: 'terminal' """ return self.get_config("Tools", tool_id) def set_preferred_tool(self, tool_id, value): return self._set_config("Tools", tool_id, value) ## Alternatives section ## Provide alternatives for each category ## for example the category "terminal" def get_valid_alternative_ids(self, category_key): """ Get a list of (id_, name) tuples for the given @category_key """ validator = self._alternative_validators[category_key] for (id_, alternative) in self._alternatives[category_key].iteritems(): name = alternative["name"] if not validator or validator(alternative): yield (id_, name) def get_all_alternatives(self, category_key): return self._alternatives[category_key] def get_preferred_alternative(self, category_key): """ Get preferred alternative dict for @category_key """ tool_id = self.get_preferred_tool(category_key) alternatives = self._alternatives[category_key] alt = alternatives.get(tool_id) if not alt: self.output_debug("Warning, no configuration for", category_key) return alt or next(alternatives.itervalues(), None) def _update_alternatives(self, category_key, alternatives, validator): self._alternatives[category_key] = alternatives self._alternative_validators[category_key] = validator self.emit("alternatives-changed::"+category_key, category_key) # Arguments: Section, Key, Value # Detailed by 'section.key' in lowercase gobject.signal_new("value-changed", SettingsController, gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_DETAILED, gobject.TYPE_BOOLEAN, (gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_PYOBJECT)) # Arguments: Plugin ID, Value gobject.signal_new("plugin-enabled-changed", SettingsController, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_STRING, gobject.TYPE_INT)) # Arguments: Plugin ID, Value gobject.signal_new("plugin-toplevel-changed", SettingsController, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_STRING, gobject.TYPE_INT)) # Arguments: Alternative-category # Detailed by: category key, in lowercase gobject.signal_new("alternatives-changed", SettingsController, gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_DETAILED, gobject.TYPE_BOOLEAN, (gobject.TYPE_STRING, )) _settings_controller = None def GetSettingsController(): global _settings_controller if _settings_controller is None: _settings_controller = SettingsController() return _settings_controller class ExtendedSetting(object): """ Abstract class for defining non-simple configuration option """ def load(self, plugin_id, key, config_value): ''' load value for @plugin_id and @key, @config_value is value stored in regular Kupfer config for plugin/key''' pass def save(self, plugin_id, key): ''' Save value for @plugin_id and @key. @Return value that should be stored in Kupfer config for plugin/key (string)''' return None kupfer-v208/kupfer/core/sources.py000066400000000000000000000440711176220042200173320ustar00rootroot00000000000000from __future__ import with_statement import gzip import hashlib import itertools import cPickle as pickle import os import threading import time import weakref from kupfer import config, pretty, scheduler from kupfer import conspickle from kupfer.obj import base, sources from kupfer.core import pluginload class InternalError (Exception): pass class PeriodicRescanner (pretty.OutputMixin): """ Periodically rescan a @catalog of sources Do first rescan after @startup seconds, then followup with rescans in @period. Each campaign of rescans is separarated by @campaign seconds """ def __init__(self, period=5, startup=10, campaign=3600): self.startup = startup self.period = period self.campaign=campaign self.timer = scheduler.Timer() # Source -> time mapping self.latest_rescan_time = weakref.WeakKeyDictionary() self._min_rescan_interval = campaign//4 def set_catalog(self, catalog): self.catalog = catalog self.cur = iter(self.catalog) self.output_debug("Registering new campaign, in %d s" % self.startup) self.timer.set(self.startup, self._new_campaign) def _new_campaign(self): self.output_info("Starting new campaign, interval %d s" % self.period) self.cur = iter(self.catalog) self.timer.set(self.period, self._periodic_rescan_helper) def _periodic_rescan_helper(self): # Advance until we find a source that was not recently rescanned for next in self.cur: oldtime = self.latest_rescan_time.get(next, 0) if (time.time() - oldtime) > self._min_rescan_interval: self.timer.set(self.period, self._periodic_rescan_helper) self._start_source_rescan(next) return # No source to scan found self.output_info("Campaign finished, pausing %d s" % self.campaign) self.timer.set(self.campaign, self._new_campaign) def rescan_now(self, source, force_update=False): "Rescan @source immediately" if force_update: # if forced update, we know that it was brought up to date self.latest_rescan_time[source] = time.time() self.rescan_source(source, force_update=force_update) def _start_source_rescan(self, source): self.latest_rescan_time[source] = time.time() if not source.is_dynamic(): thread = threading.Thread(target=self.rescan_source, args=(source,)) thread.setDaemon(True) thread.start() def rescan_source(self, source, force_update=True): list(source.get_leaves(force_update=force_update)) class SourcePickler (pretty.OutputMixin): """ Takes care of pickling and unpickling Kupfer Sources. """ pickle_version = 4 name_template = "k%s-v%d.pickle.gz" def __init__(self): self.open = lambda f,mode: gzip.open(f, mode, compresslevel=3) def should_use_cache(self): return config.has_capability("CACHE") def rm_old_cachefiles(self): """Checks if there are old cachefiles from last version, and deletes those """ for dpath, dirs, files in os.walk(config.get_cache_home()): # Look for files matching beginning and end of # name_template, with the previous file version chead, ctail = self.name_template.split("%s") ctail = ctail % ((self.pickle_version -1),) obsolete_files = [] for cfile in files: if cfile.startswith(chead) and cfile.endswith(ctail): cfullpath = os.path.join(dpath, cfile) obsolete_files.append(cfullpath) if obsolete_files: self.output_info("Removing obsolete cache files:", sep="\n", *obsolete_files) for fpath in obsolete_files: # be overly careful assert fpath.startswith(config.get_cache_home()) assert "kupfer" in fpath os.unlink(fpath) def get_filename(self, source): """Return cache filename for @source""" # make sure we take the source name into account # so that we get a "break" when locale changes source_id = "%s%s%s" % (repr(source), str(source), source.version) bytes = hashlib.md5(source_id).digest() hashstr = bytes.encode("base64").rstrip("\n=").replace("/", "-") filename = self.name_template % (hashstr, self.pickle_version) return os.path.join(config.get_cache_home(), filename) def unpickle_source(self, source): if not self.should_use_cache(): return None cached = self._unpickle_source(self.get_filename(source)) if not cached: return None # check consistency if source == cached: return cached else: self.output_debug("Cached version mismatches", source) return None def _unpickle_source(self, pickle_file): try: pfile = self.open(pickle_file, "rb") except IOError, e: return None try: source = pickle.loads(pfile.read()) assert isinstance(source, base.Source), "Stored object not a Source" sname = os.path.basename self.output_debug("Loading", source, "from", sname(pickle_file)) except (pickle.PickleError, Exception), e: source = None self.output_info("Error loading %s: %s" % (pickle_file, e)) return source def pickle_source(self, source): if not self.should_use_cache(): return None return self._pickle_source(self.get_filename(source), source) def _pickle_source(self, pickle_file, source): """ When writing to a file, use pickle.dumps() and then write the file in one go -- if the file is a gzip file, pickler's thousands of small writes are very slow """ output = self.open(pickle_file, "wb") sname = os.path.basename self.output_debug("Storing", source, "as", sname(pickle_file)) output.write(pickle.dumps(source, pickle.HIGHEST_PROTOCOL)) output.close() return True class SourceDataPickler (pretty.OutputMixin): """ Takes care of pickling and unpickling Kupfer Sources' configuration or data. The SourceDataPickler requires a protocol of three methods: config_save_name() Return an ascii name to be used as a token/key for the configuration config_save() Return an object to be saved as configuration config_restore(obj) Receive the configuration object `obj' to load """ pickle_version = 1 name_template = "config-%s-v%d.pickle" def __init__(self): self.open = open @classmethod def get_filename(cls, source): """Return filename for @source""" name = source.config_save_name() filename = cls.name_template % (name, cls.pickle_version) return config.save_config_file(filename) @classmethod def source_has_config(self, source): return getattr(source, "config_save_name", None) def load_source(self, source): data = self._load_data(self.get_filename(source)) if not data: return True source.config_restore(data) def _load_data(self, pickle_file): try: pfile = self.open(pickle_file, "rb") except IOError, e: return None try: data = conspickle.BasicUnpickler.loads(pfile.read()) sname = os.path.basename(pickle_file) self.output_debug("Loaded configuration from", sname) # self.output_debug(data) except (pickle.PickleError, Exception), e: data = None self.output_error("Loading %s: %s" % (pickle_file, e)) return data def save_source(self, source): return self._save_data(self.get_filename(source), source) def _save_data(self, pickle_file, source): sname = os.path.basename(pickle_file) obj = source.config_save() try: data = pickle.dumps(obj, pickle.HIGHEST_PROTOCOL) except pickle.PickleError: import traceback self.output_error("Unable to save configuration for", source) self.output_error("Saving configuration raised an exception:") traceback.print_exc() self.output_error("Please file a bug report") data = None if data: self.output_debug("Storing configuration for", source, "as", sname) ## Write to temporary and rename into place tmp_pickle_file = "%s.%s" % (pickle_file, os.getpid()) output = self.open(tmp_pickle_file, "wb") output.write(data) output.close() os.rename(tmp_pickle_file, pickle_file) return True class SourceController (pretty.OutputMixin): """Control sources; loading, pickling, rescanning Call .add() to add sources. Call .initialize() before use commences. """ def __init__(self): self.rescanner = PeriodicRescanner(period=3) self.sources = set() self.toplevel_sources = set() self.text_sources = set() self.content_decorators = {} self.action_decorators = {} self.action_generators = [] self.plugin_object_map = weakref.WeakKeyDictionary() self.loaded_successfully = False self.did_finalize_sources = False self._pre_root = None def add(self, plugin_id, srcs, toplevel=False, initialize=False): self._invalidate_root() sources = set(self._try_restore(srcs)) sources.update(srcs) self.sources.update(sources) if toplevel: self.toplevel_sources.update(sources) if initialize: self._initialize_sources(sources) self._cache_sources(sources) self.rescanner.set_catalog(self.sources) if plugin_id: self._register_plugin_objects(plugin_id, *sources) def set_toplevel(self, src, toplevel): assert src in self.sources, "Source is not tracked in SourceController" self._invalidate_root() if toplevel: self.toplevel_sources.add(src) else: self.toplevel_sources.discard(src) def _register_plugin_objects(self, plugin_id, *objects): "Register a plugin id mapping for @objects" for obj in objects: self.plugin_object_map[obj] = plugin_id pretty.print_debug(__name__, "Add", repr(obj)) def _remove(self, src): self._invalidate_root() self.toplevel_sources.discard(src) self.sources.discard(src) self.rescanner.set_catalog(self.sources) self._finalize_source(src) pretty.print_debug(__name__, "Remove", repr(src)) def get_plugin_id_for_object(self, obj): id_ = self.plugin_object_map.get(obj) #self.output_debug("Object", repr(obj), "has id", id_, id(obj)) return id_ def remove_objects_for_plugin_id(self, plugin_id): """Remove all objects for @plugin_id Return True if the catalog configuration changed """ removed_source = False self.output_debug("Removing objects for plugin:", plugin_id) # sources for src in list(self.sources): if self.get_plugin_id_for_object(src) == plugin_id: self._remove(src) removed_source = True # all other objects def remove_matching_objects(collection, plugin_id): for obj in list(collection): if self.get_plugin_id_for_object(obj) == plugin_id: collection.remove(obj) pretty.print_debug(__name__, "Remove", repr(obj)) remove_matching_objects(self.text_sources, plugin_id) for typ in self.content_decorators: remove_matching_objects(self.content_decorators[typ], plugin_id) for typ in self.action_decorators: remove_matching_objects(self.action_decorators[typ], plugin_id) remove_matching_objects(self.action_generators, plugin_id) return removed_source def get_sources(self): return self.sources def add_text_sources(self, plugin_id, srcs): self.text_sources.update(srcs) self._register_plugin_objects(plugin_id, *srcs) def get_text_sources(self): return self.text_sources def add_content_decorators(self, plugin_id, decos): for typ in decos: self.content_decorators.setdefault(typ, set()).update(decos[typ]) self._register_plugin_objects(plugin_id, *decos[typ]) def add_action_decorators(self, plugin_id, decos): for typ in decos: self.action_decorators.setdefault(typ, set()).update(decos[typ]) self._register_plugin_objects(plugin_id, *decos[typ]) for typ in self.action_decorators: self._disambiguate_actions(self.action_decorators[typ]) def add_action_generator(self, plugin_id, agenerator): self.action_generators.append(agenerator) self._register_plugin_objects(plugin_id, agenerator) def _disambiguate_actions(self, actions): """Rename actions by the same name (adding a suffix)""" # FIXME: Disambiguate by plugin name, not python module name names = {} renames = set() for action in actions: name = unicode(action) if name in names: renames.add(names[name]) renames.add(action) else: names[name] = action for action in renames: self.output_debug("Disambiguate Action %s" % (action, )) action.name += " (%s)" % (type(action).__module__.split(".")[-1],) def __contains__(self, src): return src in self.sources def __getitem__(self, src): if not src in self: raise KeyError for s in self.sources: if s == src: return s @property def root(self): """Get the root source of catalog""" if len(self.sources) == 1: root_catalog, = self.sources elif len(self.sources) > 1: firstlevel = self._firstlevel root_catalog = sources.MultiSource(firstlevel) else: root_catalog = None return root_catalog def _invalidate_root(self): "The source root needs to be recalculated" self._pre_root = None @property def _firstlevel(self): if self._pre_root: return self._pre_root sourceindex = set(self.sources) kupfer_sources = sources.SourcesSource(self.sources) sourceindex.add(kupfer_sources) # Make sure firstlevel is ordered # So that it keeps the ordering.. SourcesSource first firstlevel = [] firstlevel.append(sources.SourcesSource(sourceindex)) firstlevel.extend(set(self.toplevel_sources)) self._pre_root = firstlevel return firstlevel @classmethod def good_source_for_types(cls, s, types): """return whether @s provides good leaves for @types """ provides = list(s.provides()) if not provides: return True for t in provides: if issubclass(t, types): return True def root_for_types(self, types): """ Get root for a flat catalog of all catalogs providing at least Leaves of @types Take all sources which: Provide a type T so that it is a subclass to one in the set of types we want """ types = tuple(types) firstlevel = set() # include the Catalog index since we want to include # the top of the catalogs (like $HOME) catalog_index = (sources.SourcesSource(self.sources), ) for s in itertools.chain(self.sources, catalog_index): if self.good_source_for_types(s, types): firstlevel.add(s) return sources.MultiSource(firstlevel) def get_canonical_source(self, source): "Return the canonical instance for @source" # check if we already have source, then return that if source in self: return self[source] else: source.initialize() return source def get_contents_for_leaf(self, leaf, types=None): """Iterator of content sources for @leaf, providing @types (or None for all)""" for typ in self.content_decorators: if not isinstance(leaf, typ): continue for content in self.content_decorators[typ]: dsrc = content.decorate_item(leaf) if dsrc: if types and not self.good_source_for_types(dsrc, types): continue yield self.get_canonical_source(dsrc) def get_actions_for_leaf(self, leaf): for typ in self.action_decorators: if isinstance(leaf, typ): for act in self.action_decorators[typ]: yield act for agenerator in self.action_generators: for action in agenerator.get_actions_for_leaf(leaf): yield action def decorate_object(self, obj, action=None): if hasattr(obj, "has_content"): types = tuple(action.object_types()) if action else () contents = list(self.get_contents_for_leaf(obj, types)) content = contents[0] if contents else None if len(contents) > 1: content = sources.SourcesSource(contents, name=unicode(obj), use_reprs=False) obj.add_content(content) def finalize(self): "Finalize all sources, equivalent to deactivating all sources" for src in self.sources: src.finalize() self.did_finalize_sources = True def save_cache(self): "Save all caches (non-important data)" if not self.did_finalize_sources: raise InternalError("Called save_cache without finalize!") if self.loaded_successfully: self._pickle_sources(self.sources) else: self.output_debug("Not writing cache on failed load") def save_data(self): "Save (important) user data/configuration" if not self.loaded_successfully: self.output_info("Not writing configuration on failed load") return configsaver = SourceDataPickler() for source in self.sources: if configsaver.source_has_config(source): self._save_source(source, pickler=configsaver) @classmethod def _save_source(self, source, pickler=None): configsaver = pickler or SourceDataPickler() configsaver.save_source(source) def _finalize_source(self, source): "Either save config, or save cache for @source" source.finalize() if SourceDataPickler.source_has_config(source): self._save_source(source) elif not source.is_dynamic(): self._pickle_source(source) def _pickle_sources(self, sources): sourcepickler = SourcePickler() sourcepickler.rm_old_cachefiles() for source in sources: if (source.is_dynamic() or SourceDataPickler.source_has_config(source)): continue self._pickle_source(source, pickler=sourcepickler) @classmethod def _pickle_source(self, source, pickler=None): sourcepickler = pickler or SourcePickler() sourcepickler.pickle_source(source) def _try_restore(self, sources): """ Try to restore the source that is equivalent to the "dummy" instance @source, from cache, or from saved configuration. yield the instances that succeed. """ sourcepickler = SourcePickler() configsaver = SourceDataPickler() for source in set(sources): if configsaver.source_has_config(source): configsaver.load_source(source) else: source = sourcepickler.unpickle_source(source) if source: yield source def _remove_source(self, source): "Oust @source from catalog if any exception is raised" self.sources.discard(source) self.toplevel_sources.discard(source) source_type = type(source) for typ in self.content_decorators: self.content_decorators[typ].discard(source_type) def initialize(self): "Initialize all sources and cache toplevel sources" self._initialize_sources(self.sources) self.rescanner.set_catalog(self.sources) self._cache_sources(self.toplevel_sources) self.loaded_successfully = True def _initialize_sources(self, sources): for src in set(sources): with pluginload.exception_guard(src, self._remove_source, src): src.initialize() def _cache_sources(self, sources): # Make sure that the toplevel sources are chached # either newly rescanned or the cache is fully loaded for src in set(sources): with pluginload.exception_guard(src, self._remove_source, src): self.rescanner.rescan_now(src, force_update=False) _source_controller = None def GetSourceController(): global _source_controller if _source_controller is None: _source_controller = SourceController() return _source_controller kupfer-v208/kupfer/datatools.py000066400000000000000000000125211176220042200167040ustar00rootroot00000000000000import itertools try: from collections import OrderedDict except ImportError: from UserDict import DictMixin OrderedDict = None class SavedIterable (object): """Wrap an iterable and cache it. The SavedIterable can be accessed streamingly, while still being incrementally cached. Later attempts to iterate it will access the whole of the sequence. When it has been cached to its full extent once, it reduces to a thin wrapper of a sequence iterator. The SavedIterable will pickle into a list. >>> s = SavedIterable(xrange(5)) >>> iter(s).next() 0 >>> list(s) [0, 1, 2, 3, 4] >>> iter(s) # doctest: +ELLIPSIS >>> import pickle >>> pickle.loads(pickle.dumps(s)) [0, 1, 2, 3, 4] >>> u = SavedIterable(xrange(5)) >>> one, two = iter(u), iter(u) >>> one.next(), two.next() (0, 0) >>> list(two) [1, 2, 3, 4] >>> list(one) [1, 2, 3, 4] >>> SavedIterable(range(3)) [0, 1, 2] """ def __new__(cls, iterable): if isinstance(iterable, list): return iterable return object.__new__(cls) def __init__(self, iterable): self.iterator = iter(iterable) self.data = [] def __iter__(self): if self.iterator is None: return iter(self.data) return self._incremental_caching_iter() def _incremental_caching_iter(self): indices = itertools.count() while True: idx = indices.next() try: yield self.data[idx] except IndexError: pass else: continue if self.iterator is None: return try: x = self.iterator.next() self.data.append(x) yield x except StopIteration: self.iterator = None def __reduce__(self): # pickle into a list with __reduce__ # (callable, args, state, listitems) return (list, (), None, iter(self)) def UniqueIterator(seq, key=None): """ yield items of @seq with set semantics; no duplicates >>> list(UniqueIterator([1, 2, 3, 3, 5, 1])) [1, 2, 3, 5] >>> list(UniqueIterator([1, -2, 3, -3, -5, 2], key=abs)) [1, -2, 3, -5] """ coll = set() if key is None: for obj in seq: if obj not in coll: yield obj coll.add(obj) return else: for obj in seq: K = key(obj) if K not in coll: yield obj coll.add(K) if not OrderedDict: """ The following is: http://code.activestate.com/recipes/576693/ Created by Raymond Hettinger on Wed, 18 Mar 2009 (MIT) Licensed under the MIT License """ class OrderedDict(dict, DictMixin): def __init__(self, *args, **kwds): if len(args) > 1: raise TypeError('expected at most 1 arguments, got %d' % len(args)) try: self.__end except AttributeError: self.clear() self.update(*args, **kwds) def clear(self): self.__end = end = [] end += [None, end, end] # sentinel node for doubly linked list self.__map = {} # key --> [key, prev, next] dict.clear(self) def __setitem__(self, key, value): if key not in self: end = self.__end curr = end[1] curr[2] = end[1] = self.__map[key] = [key, curr, end] dict.__setitem__(self, key, value) def __delitem__(self, key): dict.__delitem__(self, key) key, prev, next = self.__map.pop(key) prev[2] = next next[1] = prev def __iter__(self): end = self.__end curr = end[2] while curr is not end: yield curr[0] curr = curr[2] def __reversed__(self): end = self.__end curr = end[1] while curr is not end: yield curr[0] curr = curr[1] def popitem(self, last=True): if not self: raise KeyError('dictionary is empty') if last: key = reversed(self).next() else: key = iter(self).next() value = self.pop(key) return key, value def __reduce__(self): items = [[k, self[k]] for k in self] tmp = self.__map, self.__end del self.__map, self.__end inst_dict = vars(self).copy() self.__map, self.__end = tmp if inst_dict: return (self.__class__, (items,), inst_dict) return self.__class__, (items,) def keys(self): return list(self) setdefault = DictMixin.setdefault update = DictMixin.update pop = DictMixin.pop values = DictMixin.values items = DictMixin.items iterkeys = DictMixin.iterkeys itervalues = DictMixin.itervalues iteritems = DictMixin.iteritems def __repr__(self): if not self: return '%s()' % (self.__class__.__name__,) return '%s(%r)' % (self.__class__.__name__, self.items()) def copy(self): return self.__class__(self) @classmethod def fromkeys(cls, iterable, value=None): d = cls() for key in iterable: d[key] = value return d def __eq__(self, other): if isinstance(other, OrderedDict): return len(self)==len(other) and self.items() == other.items() return dict.__eq__(self, other) def __ne__(self, other): return not self == other class LruCache (object): """ Least-recently-used cache mapping of size @maxsiz """ def __init__(self, maxsiz): self.d = OrderedDict() self.maxsiz = maxsiz def __contains__(self, key): return key in self.d def __setitem__(self, key, value): self.d.pop(key, None) self.d[key] = value if len(self.d) > self.maxsiz: # remove the first item (was inserted longest time ago) lastkey = next(iter(self.d)) self.d.pop(lastkey) def __getitem__(self, key): try: value = self.d.pop(key) except KeyError: raise # reinsert the value, puts it "last" in the order self.d[key] = value return value if __name__ == '__main__': import doctest doctest.testmod() kupfer-v208/kupfer/dbuscompat.py000077500000000000000000000061341176220042200170610ustar00rootroot00000000000000"""Support code for implementing D-Bus services via GObjects.""" # Copyright (C) 2007 Collabora Ltd. # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation # files (the "Software"), to deal in the Software without # restriction, including without limitation the rights to use, copy, # modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. import gobject import dbus.service class ExportedGObjectType(gobject.GObjectMeta, dbus.service.InterfaceType): """A metaclass which inherits from both GObjectMeta and `dbus.service.InterfaceType`. Used as the metaclass for `ExportedGObject`. """ def __init__(cls, name, bases, dct): gobject.GObjectMeta.__init__(cls, name, bases, dct) dbus.service.InterfaceType.__init__(cls, name, bases, dct) class ExportedGObject(gobject.GObject, dbus.service.Object): """A GObject which is exported on the D-Bus. Because GObject and `dbus.service.Object` both have custom metaclasses, the naive approach using simple multiple inheritance won't work. This class has `ExportedGObjectType` as its metaclass, which is sufficient to make it work correctly. """ __metaclass__ = ExportedGObjectType def __init__(self, conn=None, object_path=None, **kwargs): """Initialize an exported GObject. :Parameters: `conn` : dbus.connection.Connection The D-Bus connection or bus `object_path` : str The object path at which to register this object. :Keywords: `bus_name` : dbus.service.BusName A bus name to be held on behalf of this object, or None. `gobject_properties` : dict GObject properties to be set on the constructed object. Any unrecognised keyword arguments will also be interpreted as GObject properties. """ bus_name = kwargs.pop('bus_name', None) gobject_properties = kwargs.pop('gobject_properties', None) if gobject_properties is not None: kwargs.update(gobject_properties) gobject.GObject.__init__(self, **kwargs) dbus.service.Object.__init__(self, conn=conn, object_path=object_path, bus_name=bus_name) kupfer-v208/kupfer/desktop_launch.py000066400000000000000000000277301176220042200177250ustar00rootroot00000000000000import os import pygtk pygtk.require('2.0') import glib import gio import gtk import xdg.DesktopEntry import xdg.Exceptions from kupfer import desktop_parse from kupfer import kupferstring from kupfer import pretty from kupfer import terminal __all__ = ['launch_app_info', 'spawn_app', 'spawn_app_id'] STARTUP_ENV = "DESKTOP_STARTUP_ID" # TODO: Broadcast Gio's launched message on dbus # NOTE: GDK's startup notification things that we use # are really only sending xmessages. (roughly). def debug_log(*args): pretty.print_debug(__name__, *args) warning_log = debug_log def error_log(*args): pretty.print_error(__name__, *args) def exc_log(): pretty.print_exc(__name__) class SpawnError (Exception): "Error starting application" class ResourceLookupError (Exception): "Unable to find resource" class ResourceReadError (Exception): "Unable to open resource" def gtk_to_unicode(gtkstring): """Return unicode for a GTK/GLib string (bytestring or unicode)""" if isinstance(gtkstring, unicode): return gtkstring return gtkstring.decode("UTF-8", "ignore") def find_desktop_file(desk_id): """Find file for @desk_id or raise ResourceLookupError Desktop files are found by appending /applications/ to $XDG_DATA_DIRS, but if they are located in subdirs of that, then additional 'subdirectory-' prefixes are used. """ if not desk_id: raise ResourceLookupError("Empty id") try: return next(xdg.BaseDirectory.load_data_paths("applications", desk_id)) except StopIteration: ## it was not found as an immediate child of the data paths, ## so we split by the hyphens and search deeper file_id = desk_id directories = ['applications'] def lookup(path): """Return location for @path if exists, else none""" return next(xdg.BaseDirectory.load_data_paths(*path), None) def get_dir_id_depth(desk_id, depth): "split 'hyph-example-id' at the nth hyphen" parts = desk_id.split('-', depth) return '-'.join(parts[:depth]), '-'.join(parts[depth:]) while 1: ## try the first parts of the id to see if it matches a directory for x in xrange(1,4): dirname, rest_id = get_dir_id_depth(file_id, x) if rest_id and lookup(directories + [dirname]): file_id = rest_id directories.append(dirname) break else: ## we did not reach break break desktop_file_path = lookup(directories + [file_id]) if desktop_file_path: return desktop_file_path raise ResourceLookupError("Cannot locate '%s'" % (desk_id,)) def read_desktop_info(desktop_file): """ Get the keys StartupNotify, Terminal, Exec, Path, Icon Return dict with bool and unicode values """ # Return values in unicode try: de = xdg.DesktopEntry.DesktopEntry(desktop_file) except xdg.Exceptions.Error: raise ResourceReadError if not de.getExec(): raise ResourceReadError("Invalid data: empty Exec key") return { "Terminal": de.getTerminal(), "StartupNotify": de.getStartupNotify(), "Exec": gtk_to_unicode(de.getExec()), "Path": gtk_to_unicode(de.getPath()), "Icon": gtk_to_unicode(de.getIcon()), "Name": gtk_to_unicode(de.getName()), } def create_desktop_info(commandline, name, icon, work_dir, in_terminal, startup_notify): return { "Terminal": in_terminal, "StartupNotify": startup_notify, "Exec": commandline, "Path": work_dir, "Icon": icon, "Name": name, } def replace_format_specs(argv, location, desktop_info, gfilelist): """ http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s06.html Replace format specifiers %% literal % %f file %F list of files %u URL %U list of URLs %i --icon %c Translated name %k location of .desktop file deprecated are removed: %d %D %n %N %v %m apart from those, all other.. stay and are ignored Like other implementations, we do actually insert a local path for %u and %U if it exists. Return (supports_single, added_at_end, argv) supports_single: Launcher only supports a single file caller has to re-call for each file added_at_end: No format found for the file, it was added at the end """ supports_single_file = False files_added_at_end = False class Flags(object): did_see_small_f = False did_see_large_f = False fileiter = iter(gfilelist) def get_file_path(gfile): if not gfile: return "" return gfile.get_path() or gfile.get_uri() def get_next_file_path(): try: f = next(fileiter) except StopIteration: return "" return get_file_path(f) def replace_single_code(key): "Handle all embedded format codes, including those to be removed" deprecated = set(['%d', '%D', '%n', '%N', '%v', '%m']) if key in deprecated: return "" if key == "%%": return "%" if key == "%f" or key == "%u": if Flags.did_see_large_f or Flags.did_see_small_f: warning_log("Warning, multiple file format specs!") return "" Flags.did_see_small_f = True return get_next_file_path() if key == "%c": return gtk_to_unicode(desktop_info["Name"] or location) if key == "%k": return location else: return None def replace_array_format(elem): """ Handle array format codes -- only recognized as single arguments Return flag, arglist where flag is true if something was replaced """ if elem == "%U" or elem == "%F": if Flags.did_see_large_f or Flags.did_see_small_f: warning_log("Warning, multiple file format specs!") return True, [] Flags.did_see_large_f = True return True, filter(bool,[get_file_path(f) for f in gfilelist]) if elem == "%i": if desktop_info["Icon"]: return True, ["--icon", desktop_info["Icon"]] return True, [] else: return False, elem def two_part_unescaper(s, repfunc): """ Handle embedded format codes Scan @s two characters at a time and replace using @repfunc """ if not s: return s def _inner(): it = iter(zip(s, s[1:])) for cur, nex in it: key = cur+nex rep = repfunc(key) if rep is not None: yield rep # skip a step in the iter try: it.next() except StopIteration: return else: yield cur yield s[-1] return ''.join(_inner()) new_argv = [] for x in argv: if not x: # the arg is an empty string, we don't need extra processing new_argv.append(x) continue succ, newargs = replace_array_format(x) if succ: new_argv.extend(newargs) else: arg = two_part_unescaper(x, replace_single_code) if arg: new_argv.append(arg) if len(gfilelist) > 1 and not Flags.did_see_large_f: supports_single_file = True if not Flags.did_see_small_f and not Flags.did_see_large_f and len(gfilelist): files_added_at_end = True new_argv.append(get_next_file_path()) return supports_single_file, files_added_at_end, new_argv def _file_for_app_info(app_info): try: desktop_file = find_desktop_file(app_info.get_id()) except ResourceLookupError: exc_log() desktop_file = None return desktop_file def _info_for_desktop_file(desktop_file): if not desktop_file: return None try: desktop_info = read_desktop_info(desktop_file) except ResourceReadError: desktop_info = None exc_log() return desktop_info def launch_app_info(app_info, gfiles=[], in_terminal=None, timestamp=None, desktop_file=None, launch_cb=None, screen=None): """ Launch @app_info, opening @gfiles @in_terminal: override Terminal flag @timestamp: override timestamp @desktop_file: specify location of desktop file @launch_cb: Called once per launched process, like ``spawn_app`` Will pass on exceptions from spawn_app """ desktop_file = desktop_file or _file_for_app_info(app_info) desktop_info = _info_for_desktop_file(desktop_file) if not desktop_file or not desktop_info: # Allow in-memory app_info creations (without id or desktop file) desktop_file = "" desktop_info = create_desktop_info(app_info.get_commandline() or "", app_info.get_name(), "", "", False, False) # in this case, the command line is already primarily escaped argv = desktop_parse.parse_argv(desktop_info["Exec"]) else: # In the normal case, we must first escape one round argv = desktop_parse.parse_unesc_argv(desktop_info["Exec"]) assert argv and argv[0] # Now Resolve the %f etc format codes multiple_needed, missing_format, launch_argv = \ replace_format_specs(argv, desktop_file, desktop_info, gfiles) if not multiple_needed: # Launch 1 process launch_records = [(launch_argv, gfiles)] else: # Launch one process per file launch_records = [(launch_argv, [gfiles[0]])] for f in gfiles[1:]: _ignore1, _ignore2, launch_argv = \ replace_format_specs(argv, desktop_file, desktop_info, [f]) launch_records.append((launch_argv, [f])) notify = desktop_info["StartupNotify"] workdir = desktop_info["Path"] or None if in_terminal is None: in_terminal = desktop_info["Terminal"] if in_terminal: term = terminal.get_configured_terminal() notify = notify or term["startup_notify"] for argv, gfiles in launch_records: if in_terminal: term = terminal.get_configured_terminal() targv = list(term["argv"]) if term["exearg"]: targv.append(term["exearg"]) argv = targv + argv ret = spawn_app(app_info, argv, gfiles, workdir, notify, timestamp=timestamp, launch_cb=launch_cb, screen=screen) if not ret: return False return True def spawn_app_id(app_id, argv, workdir=None, startup_notify=True, screen=None): """ Spawn @argv trying to notify it as if it is app_id """ try: app_info = get_info_for_id(app_id) except RuntimeError: app_info = None startup_notify = False return spawn_app(app_info, argv, [], workdir, startup_notify, screen=screen) def spawn_app(app_info, argv, filelist, workdir=None, startup_notify=True, timestamp=None, launch_cb=None, screen=None): """ Spawn app. @argv: argument list including files @workdir: where to set workdir if not cwd @app_info: Used for startup notification, if @startup_notify is True @filelist: Used for startup notification @startup_notify: Use startup notification @timestamp: Event timestamp @launch_cb: Called if successful with (argv, pid, notify_id, filelist, timestamp) @screen: GdkScreen on which to put the application return pid if successful raise SpawnError on error """ notify_id = None if startup_notify: ctx = gtk.gdk.AppLaunchContext() ctx.set_timestamp(timestamp or gtk.get_current_event_time()) if screen: ctx.set_screen(screen) # This not only returns the string ID but # it actually starts the startup notification! notify_id = ctx.get_startup_notify_id(app_info, filelist) child_env_add = {STARTUP_ENV: notify_id} else: child_env_add = {} if screen: child_env_add["DISPLAY"]=screen.make_display_name() if not workdir or not os.path.exists(workdir): workdir = "." argv = list(locale_encode_argv(argv)) try: (pid, _ig1, _ig2, _ig3) = glib.spawn_async(argv, working_directory=workdir, flags=glib.SPAWN_SEARCH_PATH, child_setup=child_setup, user_data=child_env_add) debug_log("Launched", argv, notify_id, "pid:", pid) except glib.GError as exc: error_log("Error Launching ", argv, unicode(exc)) if notify_id: gtk.gdk.notify_startup_complete_with_id(notify_id) raise SpawnError(unicode(exc)) if launch_cb: launch_cb(argv, pid, notify_id, filelist, timestamp) return pid def child_setup(add_environ): """Called to setup the child process before exec() @add_environ is a dict for extra env variables """ for key in add_environ: os.putenv(key, add_environ[key]) def locale_encode_argv(argv): for x in argv: if isinstance(x, unicode): yield kupferstring.tolocale(x) else: yield x def get_info_for_id(id_): return gio.unix.DesktopAppInfo(id_) if __name__ == '__main__': while True: id_ = raw_input("Give me an App ID > ") launch_app_info(get_info_for_id(id_ + ".desktop"), []) #launch_app_info(gio.AppInfo("gvim"), [gio.File(".")]) kupfer-v208/kupfer/desktop_parse.py000066400000000000000000000105131176220042200175540ustar00rootroot00000000000000 """ Implementation of unescaping and unquoting of the Exec= key in the Desktop Entry Specification (As of March 2011, version 1.1-draft) http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s06.html http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.1.html#exec-variables The unescaping we are doing is only one way.. so we unescape according to the rules, but we accept everything, if validly quoted or not. """ import shlex # This is the "string" type encoding escapes # this is unescaped before we process anything.. escape_table = { r'\s': ' ', r'\n': '\n', r'\t': '\t', r'\r': '\r', '\\\\': '\\', } # quoted are those chars that need a backslash in front # (inside a double-quoted section, that is) quoted = r""" " ` $ \ """.split() quoted_table = { r'\"': '"', r'\`': '`', r'\$': '$', '\\\\': '\\', } ''' # reserved are those that need to be inside quotes # note that all the quoted are also reserved, of course We don't use these at all reserved = r""" " ' \ > < ~ | & ; $ * ? # ( ) ` """.split() reserved.extend([' ', '\t', '\n']) ''' def two_part_unescaper(s, reptable): "Scan @s two characters at a time and replace using @reptable" if not s: return s def _inner(): it = iter(zip(s, s[1:])) for cur, nex in it: key = cur+nex if key in reptable: yield reptable[key] try: it.next() except StopIteration: return else: yield cur yield s[-1] return ''.join(_inner()) def custom_shlex_split(s, comments=False, posix=True): """ Wrapping shlex.split """ if isinstance(s, unicode): is_unicode = True s = s.encode("UTF-8") else: is_unicode = False lex = shlex.shlex(s, posix=posix) lex.whitespace_split = True if not comments: lex.commenters = '' try: lex_output = list(lex) except ValueError: lex_output = [s] ## extra-unescape ` and $ that are not handled by shlex quoted_shlex = {r'\`': '`', r'\$':'$'} lex_output[:] = [two_part_unescaper(x, quoted_shlex) for x in lex_output] if is_unicode: return [x.decode("UTF-8") for x in lex_output] else: return lex_output def unescape(s): "Primary unescape of control sequences" return two_part_unescaper(s, escape_table) def test_unescape(): r""" >>> t = r'"This \\$ \\\\ \s\\\\"' >>> unescape(t) '"This \\$ \\\\ \\\\"' >>> unescape(r'\t\s\\\\') '\t \\\\' """ pass def parse_argv(instr): r""" Parse quoted @instr into an argv This is according to the spec >>> parse_argv('env "VAR=is good" ./program') ['env', 'VAR=is good', './program'] >>> parse_argv('env "VAR=\\\\ \\$ @ x" ./program') ['env', 'VAR=\\ $ @ x', './program'] >>> parse_argv('"\\$" "\\`" "\\""') ['$', '`', '"'] >>> parse_argv('/usr/bin/x-prog -q %F') ['/usr/bin/x-prog', '-q', '%F'] >>> parse_argv('env LANG=en_US.UTF-8 freeciv-gtk2') ['env', 'LANG=en_US.UTF-8', 'freeciv-gtk2'] >>> parse_argv('emacsclient -a "" -c %f') ['emacsclient', '-a', '', '-c', '%f'] == Below this we need quirks mode == The following style is common but not supported in spec >>> parse_argv('env VAR="is broken" ./program') ['env', 'VAR=is broken', './program'] The following is just completely broken >>> parse_argv('./program unquoted\\\\argument') ['./program', 'unquoted\\argument'] The following is just completely broken >>> parse_argv('./program No\\ Space') ['./program', 'No Space'] The following is just insanely broken >>> parse_argv("'/opt'/now/'This is broken/'") ['/opt/now/This is broken/'] This is broken #>>> parse_argv('\\$') #['$'] #>>> parse_argv('\\$ \\` \\"') #['$', '`', '"'] Unmatched quote, normal mode (just testing that it does not raise) >>> parse_argv('"hi there') ['"hi there'] Unmatched quote, quirks mode (just testing that it does not raise) >>> parse_argv('A\\\\BC "hi there') ['A\\\\BC "hi there'] """ return custom_shlex_split(instr) def parse_unesc_argv(instr): r""" Parse quoted @instr into an argv after unescaping it >>> parse_unesc_argv(r'stuff "C:\\\\suck\\\\start.exe"') ['stuff', 'C:\\suck\\start.exe'] == Below this we need quirks mode == >>> parse_unesc_argv(r'stuff C:\\\\suck\\\\start.exe') ['stuff', 'C:\\suck\\start.exe'] >>> parse_unesc_argv("'/usr'/bin/gnome-terminal -x gvim 'Insanely Broken'Yes") ['/usr/bin/gnome-terminal', '-x', 'gvim', 'Insanely BrokenYes'] """ return custom_shlex_split(unescape(instr)) if __name__ == "__main__": import doctest doctest.testmod() kupfer-v208/kupfer/icons.py000066400000000000000000000306501176220042200160300ustar00rootroot00000000000000import os import gtk from gtk import ICON_LOOKUP_USE_BUILTIN, ICON_LOOKUP_FORCE_SIZE from gtk.gdk import pixbuf_new_from_file_at_size from gio import Icon, ThemedIcon, FileIcon, File from gio import FILE_ATTRIBUTE_STANDARD_ICON, FILE_ATTRIBUTE_THUMBNAIL_PATH from gobject import GError from kupfer import config from kupfer import datatools from kupfer import pretty from kupfer import scheduler icon_cache = {} # number of elements in icon lru cache (per icon size) ICON_CACHE_SIZE = 15 LARGE_SZ = 128 SMALL_SZ = 24 gtk.icon_size_register("kupfer-large", LARGE_SZ, LARGE_SZ) gtk.icon_size_register("kupfer-small", SMALL_SZ, SMALL_SZ) ## default fallbacks for our themable icons kupfer_icon_fallbacks = { 'kupfer-execute': 'gtk-execute', 'kupfer-object': 'gtk-file', 'kupfer-object-multiple': 'gtk-file', 'kupfer-catalog': 'folder-saved-search', } kupfer_locally_installed_names = set() def _icon_theme_changed(theme): pretty.print_info(__name__, "Icon theme changed, clearing cache") global icon_cache icon_cache = {} _default_theme = gtk.icon_theme_get_default() _default_theme.connect("changed", _icon_theme_changed) _local_theme = gtk.IconTheme() _local_theme.set_search_path([]) def parse_load_icon_list(icon_list_data, get_data_func, plugin_name=None): """ @icon_list_data: A bytestring whose lines identify icons @get_data_func: A function to return the data for a relative filename @plugin_name: plugin id, if applicable """ for line in icon_list_data.splitlines(): # ignore '#'-comments if line.startswith("#") or not line.strip(): continue fields = map(str.strip, line.split('\t')) if len(fields) < 2: pretty.print_error(__name__, "Malformed icon-list line %r from %r" % (line, plugin_name)) continue icon_name, basename = fields[:2] override = ('!override' in fields) def wrap_get_data(): return get_data_func(basename) load_icon_from_func(plugin_name, icon_name, wrap_get_data, override) def load_icon_from_func(plugin_name, icon_name, get_data_func, override=False): """ Load icon from @icon_data into the name @icon_name @get_data_func: function to retrieve the data if needed @override: override the icon theme """ if not override and icon_name in kupfer_locally_installed_names: pretty.print_debug(__name__, "Skipping existing", icon_name) return if not override and _default_theme.has_icon(icon_name): pretty.print_debug(__name__, "Skipping themed icon", icon_name) return try: icon_data = get_data_func() except: pretty.print_error(__name__, "Error loading icon %r for %r" % (icon_name, plugin_name)) pretty.print_exc(__name__) return for size in (SMALL_SZ, LARGE_SZ): pixbuf = get_pixbuf_from_data(icon_data, size, size) gtk.icon_theme_add_builtin_icon(icon_name, size, pixbuf) pretty.print_debug(__name__, "Loading icon", icon_name, "at", size, "for", plugin_name) kupfer_locally_installed_names.add(icon_name) def get_icon(key, icon_size): """ try retrieve icon in cache is a generator so it can be concisely called with a for loop """ try: rec = icon_cache[icon_size][key] except KeyError: return yield rec def store_icon(key, icon_size, icon): """ Store an icon in cache. It must not have been stored before """ assert icon, "icon %s may not be %s" % (key, icon) icon_rec = icon if icon_size not in icon_cache: icon_cache[icon_size] = datatools.LruCache(ICON_CACHE_SIZE) icon_cache[icon_size][key] = icon_rec def _get_icon_dwim(icon, icon_size): """Make an icon at @icon_size where @icon can be either an icon name, or a gicon """ if isinstance(icon, Icon): return get_icon_for_gicon(icon, icon_size) elif icon: return get_icon_for_name(icon, icon_size) return None class ComposedIcon (Icon): """ A composed icon, which kupfer will render to pixbuf as background icon with the decorating icon as emblem """ class Implementation (object): """Base class for the internal implementation @minimum_icon_size is the minimum size for the composition to be drawn""" minimum_icon_size = 48 def __init__(self, baseicon, emblem): self.baseicon = baseicon self.emblemicon = emblem class _ThemedIcon (Implementation, ThemedIcon): def __init__(self, fallback, baseicon, emblem): ComposedIcon.Implementation.__init__(self, baseicon, emblem) if isinstance(fallback, basestring): names = (fallback, ) else: names = fallback.get_names() ThemedIcon.__init__(self, names) class _FileIcon (Implementation, FileIcon): def __init__(self, fallback, baseicon, emblem): ComposedIcon.Implementation.__init__(self, baseicon, emblem) FileIcon.__init__(self, fallback.get_file()) def __new__(cls, baseicon, emblem, emblem_is_fallback=False): """Contstuct a composed icon from @baseicon and @emblem, which may be GIcons or icon names (strings) """ fallback = emblem if emblem_is_fallback else baseicon if isinstance(fallback, (basestring, ThemedIcon)): return cls._ThemedIcon(fallback, baseicon, emblem) if isinstance(fallback, FileIcon): return cls._FileIcon(fallback, baseicon, emblem) return None def ComposedIconSmall(baseicon, emblem, **kwargs): """Create composed icon for leaves with emblem visible on browser list""" ci = ComposedIcon(baseicon, emblem, **kwargs) ci.minimum_icon_size = SMALL_SZ return ci def _render_composed_icon(composed_icon, icon_size): # If it's too small, render as fallback icon if icon_size < composed_icon.minimum_icon_size: return _get_icon_for_standard_gicon(composed_icon, icon_size) emblemicon = composed_icon.emblemicon baseicon = composed_icon.baseicon toppbuf = _get_icon_dwim(emblemicon, icon_size) bottompbuf = _get_icon_dwim(baseicon, icon_size) if not toppbuf or not bottompbuf: return _get_icon_for_standard_gicon(composed_icon, icon_size) dest = bottompbuf.copy() # @fr is the scale fr = 0.6 dcoord = int((1-fr)*icon_size) dsize = int(fr*icon_size) # http://library.gnome.org/devel/gdk-pixbuf/unstable//gdk-pixbuf-scaling.html toppbuf.composite(dest, dcoord, dcoord, dsize, dsize, dcoord, dcoord, fr, fr, gtk.gdk.INTERP_BILINEAR, 255) return dest def get_thumbnail_for_file(uri, width=-1, height=-1): """ Return a Pixbuf thumbnail for the file at the @uri, which can be *either* and uri or a path size is @width x @height return None if not found """ gfile = File(uri) if not gfile.query_exists(): return None finfo = gfile.query_info(FILE_ATTRIBUTE_THUMBNAIL_PATH) thumb_path = finfo.get_attribute_byte_string(FILE_ATTRIBUTE_THUMBNAIL_PATH) return get_pixbuf_from_file(thumb_path, width, height) def get_pixbuf_from_file(thumb_path, width=-1, height=-1): """ Return a Pixbuf thumbnail for the file at @thumb_path sized @width x @height For non-icon pixbufs: We might cache these, but on different terms than the icon cache if @thumb_path is None, return None """ if not thumb_path: return None try: icon = pixbuf_new_from_file_at_size(thumb_path, width, height) return icon except GError, e: # this error is not important, the program continues on fine, # so we put it in debug output. pretty.print_debug(__name__, "get_pixbuf_from_file file:", thumb_path, "error:", e) def get_gicon_for_file(uri): """ Return a GIcon representing the file at the @uri, which can be *either* and uri or a path return None if not found """ gfile = File(uri) if not gfile.query_exists(): return None finfo = gfile.query_info(FILE_ATTRIBUTE_STANDARD_ICON) gicon = finfo.get_attribute_object(FILE_ATTRIBUTE_STANDARD_ICON) # very manually override generic folder icon name if isinstance(gicon, ThemedIcon): if gicon.get_names()[0] == "inode-directory": return ThemedIcon("folder") return gicon def get_icon_for_gicon(gicon, icon_size): """ Return a pixbuf of @icon_size for the @gicon NOTE: Currently only the following can be rendered: gio.ThemedIcon gio.FileIcon kupfer.icons.ComposedIcon """ # FIXME: We can't load any general GIcon if not gicon: return None if isinstance(gicon, ComposedIcon.Implementation): return _render_composed_icon(gicon, icon_size) return _get_icon_for_standard_gicon(gicon, icon_size) def _get_icon_for_standard_gicon(gicon, icon_size): """Render ThemedIcon and FileIcon""" if isinstance(gicon, FileIcon): ifile = gicon.get_file() return get_icon_from_file(ifile.get_path(), icon_size) if isinstance(gicon, ThemedIcon): names = gicon.get_names() return get_icon_for_name(names[0], icon_size, names) print "get_icon_for_gicon, could not load", gicon return None def _setup_icon_renderer(sched): from kupfer.core import settings setctl = settings.GetSettingsController() setctl.connect("alternatives-changed::icon_renderer", _icon_render_change) setctl.connect("value-changed::tools.icon_renderer", _icon_render_change) _icon_render_change(setctl) def _icon_render_change(setctl, *arguments): global _IconRenderer renderer_dict = setctl.get_preferred_alternative('icon_renderer') renderer = renderer_dict.get("renderer") if not renderer or renderer is _IconRenderer: return pretty.print_debug(__name__, "Using", renderer) _icon_theme_changed(None) _IconRenderer = renderer scheduler.GetScheduler().connect("loaded", _setup_icon_renderer) class IconRenderer (object): """ Default GTK+ implementation """ @classmethod def pixbuf_for_name(cls, icon_name, icon_size): if icon_name in kupfer_locally_installed_names: try: return _local_theme.load_icon(icon_name, icon_size, ICON_LOOKUP_USE_BUILTIN | ICON_LOOKUP_FORCE_SIZE) except GError: pass try: return _default_theme.load_icon(icon_name, icon_size, ICON_LOOKUP_USE_BUILTIN | ICON_LOOKUP_FORCE_SIZE) except GError: pass @classmethod def pixbuf_for_file(cls, file_path, icon_size): try: icon = gtk.gdk.pixbuf_new_from_file_at_size(file_path, icon_size, icon_size) return icon except GError: pretty.print_exc(__name__) _IconRenderer = IconRenderer def get_icon_for_name(icon_name, icon_size, icon_names=[]): for i in get_icon(icon_name, icon_size): return i if not icon_names: icon_names = (icon_name,) # Try the whole list of given names for load_name in icon_names: try: icon = _IconRenderer.pixbuf_for_name(load_name, icon_size) if icon: break elif icon_name in kupfer_icon_fallbacks: fallback_name = kupfer_icon_fallbacks[icon_name] icon = _IconRenderer.pixbuf_for_name(fallback_name, icon_size) if icon: break except Exception: pretty.print_exc(__name__) icon = None else: # if we did not reach 'break' in the loop return None # We store the first icon in the list, even if the match # found was later in the chain store_icon(icon_name, icon_size, icon) return icon def get_icon_from_file(icon_file, icon_size): # try to load from cache for icon in get_icon(icon_file, icon_size): return icon icon = _IconRenderer.pixbuf_for_file(icon_file, icon_size) if icon is not None: store_icon(icon_file, icon_size, icon) return icon def is_good(gicon): """Return True if it is likely that @gicon will load a visible icon (icon name exists in theme, or icon references existing file) """ if not gicon: return False if isinstance(gicon, ThemedIcon): return bool(get_good_name_for_icon_names(gicon.get_names())) if isinstance(gicon, FileIcon): ifile = gicon.get_file() return ifile.query_exists() # Since we can't load it otherwise (right now, see above) return False def get_gicon_with_fallbacks(gicon, names): if not is_good(gicon): for name in names: gicon = ThemedIcon(name) if is_good(gicon): return gicon return ThemedIcon(name) return gicon def get_good_name_for_icon_names(names): """Return first name in @names that exists in current icon theme, or None """ for name in names: if _default_theme.has_icon(name): return name return None def get_gicon_for_names(*names): return ThemedIcon(names) def get_pixbuf_from_data(data, width=None, height=None): """Create pixbuf object from data with optional scaling @data: picture as raw data @width, @heigh: optional destination size """ def set_size(img, img_width, img_height): scale = min(width/float(img_width), height/float(img_height)) new_width, new_height = int(img_width*scale), int(img_height*scale) img.set_size(new_width, new_height) ploader = gtk.gdk.PixbufLoader() if width and height: ploader.connect("size-prepared", set_size) ploader.write(data) ploader.close() return ploader.get_pixbuf() kupfer-v208/kupfer/interface.py000066400000000000000000000042721176220042200166560ustar00rootroot00000000000000import gtk class TextRepresentation (object): """ Kupfer Objects that implement this interface have a plain text representation that can be used for Copy & Paste etc """ def get_text_representation(self): """The default implementation returns the represented object""" return self.object class UriListRepresentation (object): """ Kupfer Objects that implement this interface have a uri-list representation that can be used for Copy & Paste etc get_urilist_representation should return a sequence of bytestring URIs. """ def get_urilist_representation(self): """The default implementation raises notimplementederror """ raise NotImplementedError def get_text_representation(obj): try: return obj.get_text_representation() except AttributeError: return None def copy_to_clipboard(obj, clipboard): """ Copy @obj to @clipboard, a gtk.Clipboard Return True if successful """ ## support copying text to clipboard ## as well as files in both the general uri-list representation ## and in nautilus' file copy clipboard type target_ids = (uri_id, text_id, nautilus_id) = (80, 81, 82) nautilus_target = 'x-special/gnome-copied-files' # udata is the data dict def store(clipboard, sdata, info, udata): if info == uri_id: sdata.set_uris(udata[uri_id]) if info == text_id: sdata.set_text(udata[text_id]) if info == nautilus_id: str_data_format = 8 sdata.set(nautilus_target, str_data_format, udata[nautilus_id]) def clear(clipboard, udata): pass targets = [] data = {} try: urilist = obj.get_urilist_representation() except AttributeError: pass else: if urilist: targets = gtk.target_list_add_uri_targets(targets, uri_id) targets.append((nautilus_target, 0, nautilus_id)) data[uri_id] = urilist data[nautilus_id] = 'copy\n' + '\n'.join(urilist) try: text = obj.get_text_representation() except AttributeError: pass else: targets = gtk.target_list_add_text_targets(targets, text_id) data[text_id] = text if data: clipboard.set_with_data(targets, store, clear, data) # store all targets clipboard.set_can_store(targets) return True return False def get_fileleaf_for_path(pth): import kupfer.objects return kupfer.objects.FileLeaf(pth) kupfer-v208/kupfer/keyrelay.py000066400000000000000000000031541176220042200165410ustar00rootroot00000000000000""" This is a program of its own, that does not integrate with the Kupfer process. """ import __builtin__ import os import gtk import keybinder import dbus from dbus.mainloop.glib import DBusGMainLoop SERV = "se.kaizer.kupfer" OBJ = "/interface" IFACE = "se.kaizer.kupfer.Listener" if not hasattr(__builtin__, '_'): def _(x): return x def get_all_keys(): try: bus = dbus.Bus() obj = bus.get_object(SERV, OBJ) iface = dbus.Interface(obj, IFACE) return iface.GetBoundKeys(byte_arrays=True) except dbus.DBusException as exc: print exc print "Waiting for Kupfer to start.." return [] def rebind_key(keystring, is_bound): if is_bound: print "binding", keystring keybinder.bind(keystring, relay_key, keystring) else: print "unbinding", keystring keybinder.unbind(keystring) def relay_key(key): print "Relaying", key time = keybinder.get_current_event_time() s_id = "kupfer-%d_TIME%s" % (os.getpid(), time) bus = dbus.Bus() obj = bus.get_object(SERV, OBJ, introspect=False) iface = dbus.Interface(obj, IFACE) iface.RelayKeysFromDisplay(key, os.getenv("DISPLAY", ":0"), s_id) def main(): DBusGMainLoop(set_as_default=True) relayed_keys = list(get_all_keys()) for key in relayed_keys: rebind_key(key, True) bus = dbus.Bus() bus.add_signal_receiver(rebind_key, 'BoundKeyChanged', dbus_interface=IFACE) sicon = gtk.status_icon_new_from_icon_name("kupfer") display = os.getenv("DISPLAY", ":0") sicon.set_tooltip(_("Keyboard relay is active for display %s") % display) sicon.set_visible(True) try: gtk.main() except KeyboardInterrupt: raise SystemExit(0) if __name__ == '__main__': main() kupfer-v208/kupfer/kupferstring.py000066400000000000000000000040501176220042200174330ustar00rootroot00000000000000# -*- encoding: UTF-8 -*- import locale from unicodedata import normalize, category def _folditems(): _folding_table = { # general non-decomposing characters # FIXME: This is not complete u"ł" : u"l", u"œ" : u"oe", u"ð" : u"d", u"þ" : u"th", u"ß" : u"ss", # germano-scandinavic canonical transliterations u"ü" : u"ue", u"å" : u"aa", u"ä" : u"ae", u"æ" : u"ae", u"ö" : u"oe", u"ø" : u"oe", } for c, rep in _folding_table.iteritems(): yield (ord(c.upper()), rep.title()) yield (ord(c), rep) folding_table = dict(_folditems()) def tounicode(utf8str): """Return `unicode` from UTF-8 encoded @utf8str This is to use the same error handling etc everywhere """ if isinstance(utf8str, unicode): return utf8str return utf8str.decode("UTF-8", "replace") if utf8str is not None else u"" def toutf8(ustr): """Return UTF-8 `str` from unicode @ustr This is to use the same error handling etc everywhere if ustr is `str`, just return it """ if isinstance(ustr, str): return ustr return ustr.encode("UTF-8") def fromlocale(lstr): """Return a unicode string from locale bytestring @lstr""" assert isinstance(lstr, str) enc = locale.getpreferredencoding(do_setlocale=False) return lstr.decode(enc, "replace") def tolocale(ustr): """Return a locale-encoded bytestring from unicode @ustr""" assert isinstance(ustr, unicode) enc = locale.getpreferredencoding(do_setlocale=False) return ustr.encode(enc) def tofolded(ustr): u"""Fold @ustr Return a unicode string where composed characters are replaced by their base, and extended latin characters are replaced by similar basic latin characters. >>> tofolded(u"Wyłącz") u'Wylacz' >>> tofolded(u"naïveté") u'naivete' Characters from other scripts are not transliterated. >>> print tofolded(u"Ἑλλάς") Ελλας """ srcstr = normalize("NFKD", ustr.translate(folding_table)) return u"".join([c for c in srcstr if category(c) != 'Mn']) if __name__ == '__main__': import sys reload(sys) sys.setdefaultencoding("UTF-8") import doctest doctest.testmod() kupfer-v208/kupfer/kupferui.py000066400000000000000000000035571176220042200165550ustar00rootroot00000000000000""" Access functions of Kupfer's Interface """ import gtk from kupfer import utils, version def _get_time(ctxenv): return ctxenv.get_timestamp() if ctxenv else \ gtk.get_current_event_time() def show_help(ctxenv=None): """ Show Kupfer help pages, if possible """ if not utils.show_help_url("ghelp:%s" % version.PACKAGE_NAME): utils.show_url(version.HELP_WEBSITE) _about_dialog = None def show_about_dialog(ctxenv=None): """ create an about dialog and show it """ # Use only one instance, stored in _about_dialog global _about_dialog if _about_dialog: ab = _about_dialog else: ab = gtk.AboutDialog() ab.set_program_name(version.PROGRAM_NAME) ab.set_icon_name(version.ICON_NAME) ab.set_logo_icon_name(version.ICON_NAME) ab.set_version(version.VERSION) ab.set_comments(version.SHORT_DESCRIPTION) ab.set_copyright(version.COPYRIGHT) ab.set_website(version.WEBSITE) ab.set_license(version.LICENSE) ab.set_authors(version.AUTHORS) if version.DOCUMENTERS: ab.set_documenters(version.DOCUMENTERS) if version.TRANSLATOR_CREDITS: ab.set_translator_credits(version.TRANSLATOR_CREDITS) if version.ARTISTS: ab.set_artists(version.ARTISTS) ab.connect("response", _response_callback) # do not delete window on close ab.connect("delete-event", lambda *ign: True) _about_dialog = ab if ctxenv: ctxenv.present_window(ab) else: ab.present() def _response_callback(dialog, response_id): dialog.hide() def show_preferences(ctxenv): from kupfer.ui import preferences win = preferences.GetPreferencesWindowController() if ctxenv: win.show_on_screen(ctxenv.get_timestamp(), ctxenv.get_screen()) else: win.show(_get_time(ctxenv)) def show_plugin_info(plugin_id, ctxenv=None): from kupfer.ui import preferences prefs = preferences.GetPreferencesWindowController() prefs.show_focus_plugin(plugin_id, _get_time(ctxenv)) kupfer-v208/kupfer/launch.py000066400000000000000000000233411176220042200161660ustar00rootroot00000000000000from time import time import os import cPickle as pickle import gio import gobject from kupfer import pretty, config from kupfer import scheduler from kupfer import desktop_launch from kupfer.ui import uievents from kupfer import terminal from kupfer.desktop_launch import SpawnError ## NOTE: SpawnError *should* be imported from this module try: import wnck wnck.set_client_type(wnck.CLIENT_TYPE_PAGER) except ImportError, e: pretty.print_info(__name__, "Disabling window tracking:", e) wnck = None default_associations = { "evince" : "Document Viewer", "file-roller" : "File Roller", #"gedit" : "Text Editor", "gnome-keyring-manager" : "Keyring Manager", "nautilus-browser" : "File Manager", "rhythmbox" : "Rhythmbox Music Player", } def application_id(app_info, desktop_file=None): """Return an application id (string) for GAppInfo @app_info""" app_id = app_info.get_id() if not app_id: app_id = desktop_file or "" if app_id.endswith(".desktop"): app_id = app_id[:-len(".desktop")] return app_id def launch_application(app_info, files=(), uris=(), paths=(), track=True, activate=True, desktop_file=None, screen=None): """ Launch @app_rec correctly, using a startup notification you may pass in either a list of gio.Files in @files, or a list of @uris or @paths if @track, it is a user-level application if @activate, activate rather than start a new version @app_rec is either an GAppInfo or (GAppInfo, desktop_file_path) tuple Raises SpawnError on failed program start. """ assert app_info if paths: files = [gio.File(p) for p in paths] if uris: files = [gio.File(p) for p in uris] svc = GetApplicationsMatcherService() app_id = application_id(app_info, desktop_file) if activate and svc.application_is_running(app_id): svc.application_to_front(app_id) return True # An launch callback closure for the @app_id def application_launch_callback(argv, pid, notify_id, files, timestamp): is_terminal = terminal.is_known_terminal_executable(argv[0]) if not is_terminal: svc.launched_application(app_id, pid) if track: launch_callback = application_launch_callback else: launch_callback = None try: desktop_launch.launch_app_info(app_info, files, timestamp=uievents.current_event_time(), desktop_file=desktop_file, launch_cb=launch_callback, screen=screen) except SpawnError: raise return True def application_is_running(app_id): svc = GetApplicationsMatcherService() return svc.application_is_running(app_id) def application_close_all(app_id): svc = GetApplicationsMatcherService() return svc.application_close_all(app_id) class ApplicationsMatcherService (pretty.OutputMixin): """Handle launching applications and see if they still run. This is a learning service, since we have no first-class application object on the Linux desktop """ def __init__(self): self.register = {} self._get_wnck_screen_windows_stacked() scheduler.GetScheduler().connect("finish", self._finish) self._load() @classmethod def _get_wnck_screen_windows_stacked(cls): if not wnck: return () screen = wnck.screen_get_default() return screen.get_windows_stacked() def _get_filename(self): # Version 1: Up to incl v203 # Version 2: Do not track terminals version = 2 return os.path.join(config.get_cache_home(), "application_identification_v%d.pickle" % version) def _load(self): reg = self._unpickle_register(self._get_filename()) self.register = reg if reg else default_associations # pretty-print register to debug if self.register: self.output_debug("Learned the following applications") self.output_debug("\n{\n%s\n}" % "\n".join( (" %-30s : %s" % (k,v) for k,v in self.register.iteritems()) )) def _finish(self, sched): self._pickle_register(self.register, self._get_filename()) def _unpickle_register(self, pickle_file): try: pfile = open(pickle_file, "rb") except IOError, e: return None try: source = pickle.loads(pfile.read()) assert isinstance(source, dict), "Stored object not a dict" self.output_debug("Reading from %s" % (pickle_file, )) except (pickle.PickleError, Exception), e: source = None self.output_info("Error loading %s: %s" % (pickle_file, e)) return source def _pickle_register(self, reg, pickle_file): output = open(pickle_file, "wb") self.output_debug("Saving to %s" % (pickle_file, )) output.write(pickle.dumps(reg, pickle.HIGHEST_PROTOCOL)) output.close() return True def _store(self, app_id, window): # FIXME: Store the 'res_class' name? application = window.get_application() store_name = application.get_name() self.register[app_id] = store_name self.output_debug("storing application", app_id, "as", store_name) def _has_match(self, app_id): return app_id in self.register def _is_match(self, app_id, window): application = window.get_application() res_class = window.get_class_group().get_res_class() reg_name = self.register.get(app_id) if reg_name and reg_name in (application.get_name(), res_class): return True if app_id in (application.get_name().lower(), res_class.lower()): return True return False def launched_application(self, app_id, pid): if self._has_match(app_id): return timeout = time() + 15 gobject.timeout_add_seconds(2, self._find_application, app_id, pid, timeout) # and once later gobject.timeout_add_seconds(30, self._find_application, app_id, pid, timeout) def _find_application(self, app_id, pid, timeout): if self._has_match(app_id): return False #self.output_debug("Looking for window for application", app_id) for w in self._get_wnck_screen_windows_stacked(): app = w.get_application() app_pid = app.get_pid() if not app_pid: app_pid = w.get_pid() if app_pid == pid: self._store(app_id, w) return False if time() > timeout: return False return True def application_name(self, app_id): if not self._has_match(app_id): return None return self.register[app_id] def application_is_running(self, app_id): for w in self._get_wnck_screen_windows_stacked(): if (w.get_application() and self._is_match(app_id, w) and w.get_window_type() == wnck.WINDOW_NORMAL): return True return False def get_application_windows(self, app_id): application_windows = [] for w in self._get_wnck_screen_windows_stacked(): if (w.get_application() and self._is_match(app_id, w) and w.get_window_type() == wnck.WINDOW_NORMAL): application_windows.append(w) return application_windows def application_to_front(self, app_id): application_windows = self.get_application_windows(app_id) if not application_windows: return False etime = uievents.current_event_time() # if True, focus app's all windows on the same workspace # if False, focus only one window (in cyclical manner) focus_all = True if focus_all: return self._to_front_application_style(application_windows, etime) else: return self._to_front_single(application_windows, etime) def _to_front_application_style(self, application_windows, evttime): workspaces = {} cur_screen = application_windows[0].get_screen() cur_workspace = cur_screen.get_active_workspace() def visible_window(window): return (window.get_window_type() == wnck.WINDOW_NORMAL and window.is_visible_on_workspace(cur_workspace)) def normal_window(window): return window.get_window_type() == wnck.WINDOW_NORMAL ## get all visible windows in stacking order vis_windows = filter(visible_window, self._get_wnck_screen_windows_stacked()) ## sort windows into "bins" by workspace for w in filter(normal_window, application_windows): wspc = w.get_workspace() or cur_workspace workspaces.setdefault(wspc, []).append(w) cur_wspc_windows = workspaces.get(cur_workspace, []) # make a rotated workspace list, with current workspace first idx = cur_workspace.get_number() all_workspaces = cur_screen.get_workspaces() all_workspaces[:] = all_workspaces[idx:] + all_workspaces[:idx] # check if the application's window on current workspace # are the topmost focus_windows = [] if (cur_wspc_windows and set(vis_windows[-len(cur_wspc_windows):]) != set(cur_wspc_windows)): focus_windows = cur_wspc_windows ## if the topmost window is already active, take another if focus_windows[-1:] == vis_windows[-1:]: focus_windows[:] = focus_windows[:-1] else: # all windows are focused, find on next workspace for wspc in all_workspaces[1:]: focus_windows = workspaces.get(wspc, []) if focus_windows: break else: # no windows on other workspaces, so we rotate among # the local ones focus_windows = cur_wspc_windows[:1] self._focus_windows(focus_windows, evttime) def _to_front_single(self, application_windows, evttime): # bring the first window to front for window in application_windows: self._focus_windows([window], evttime) return def _focus_windows(self, windows, evttime): for window in windows: # we special-case the desktop # only show desktop if it's the only window if window.get_name() == "x-nautilus-desktop": if len(windows) == 1: screen = wnck.screen_get_default() screen.toggle_showing_desktop(True) else: continue wspc = window.get_workspace() if wspc: wspc.activate(evttime) window.activate_transient(evttime) def application_close_all(self, app_id): application_windows = self.get_application_windows(app_id) evttime = uievents.current_event_time() for w in application_windows: if not w.is_skip_tasklist(): w.close(evttime) _appl_match_service = None def GetApplicationsMatcherService(): """Get the (singleton) ApplicationsMatcherService""" global _appl_match_service if not _appl_match_service: _appl_match_service = ApplicationsMatcherService() return _appl_match_service kupfer-v208/kupfer/main.py000066400000000000000000000104751176220042200156440ustar00rootroot00000000000000import gettext import locale import sys _debug = False def setup_locale_and_gettext(): """Set up localization with gettext""" package_name = "kupfer" localedir = "./locale" try: from kupfer import version_subst except ImportError: pass else: package_name = version_subst.PACKAGE_NAME localedir = version_subst.LOCALEDIR # Install _() builtin for gettext; always returning unicode objects # also install ngettext() gettext.install(package_name, localedir=localedir, unicode=True, names=("ngettext",)) # For gtk.Builder, we need to call the C library gettext functions # As well as set the codeset to avoid locale-dependent translation # of the message catalog locale.bindtextdomain(package_name, localedir) locale.bind_textdomain_codeset(package_name, "UTF-8") # to load in current locale properly for sorting etc try: locale.setlocale(locale.LC_ALL, "") except locale.Error: pass setup_locale_and_gettext() def prt(*args): enc = locale.getpreferredencoding(do_setlocale=False) print (u" ".join(args)).encode(enc, "replace") def get_options(): """Return a list of other application flags with --* prefix included.""" program_options = [ ("no-splash", _("do not present main interface on launch")), ("list-plugins", _("list available plugins")), ("debug", _("enable debug info")), ("relay", ""), # TRANS: --exec-helper=HELPER is an internal command # TRANS: that executes a helper program that is part of kupfer ("exec-helper=", _("run plugin helper")), ] misc_options = [ ("help", _("show usage help")), ("version", _("show version information")), ] import getopt def make_help_text(): usage_string = _("Usage: kupfer [ OPTIONS | FILE ... ]") def format_options(opts): return "\n".join(" --%-15s %s" % (o,h) for o,h in opts) options_string = u"%s\n\n%s\n\n%s\n" % (usage_string, format_options(program_options), format_options(misc_options)) return options_string def make_plugin_list(): from kupfer.core import plugins plugin_header = _("Available plugins:") plugin_list = plugins.get_plugin_desc() return "\n".join((plugin_header, plugin_list)) # Fix sys.argv that can be None in exceptional cases if sys.argv[0] is None: sys.argv[0] = "kupfer" try: opts, args = getopt.getopt(sys.argv[1:], "", [o for o,h in program_options] + [o for o,h in misc_options]) except getopt.GetoptError as exc: prt(unicode(exc)) prt(make_help_text()) raise SystemExit for k, v in opts: if k == "--list-plugins": prt(make_plugin_list()) raise SystemExit if k == "--help": prt(make_help_text()) raise SystemExit if k == "--version": print_version() prt() print_banner() raise SystemExit if k == "--debug": global _debug _debug = True if k == "--relay": prt("WARNING: --relay is deprecated!") exec_helper('kupfer.keyrelay') raise SystemExit if k == "--exec-helper": exec_helper(v) raise SystemExit(1) # return list first of tuple pair return [tupl[0] for tupl in opts] def print_version(): from kupfer import version prt(version.PACKAGE_NAME, version.VERSION) def print_banner(): from kupfer import version banner = _( "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" " %(COPYRIGHT)s\n" " %(WEBSITE)s\n") % vars(version) prt(banner) def _set_process_title_linux(): try: import ctypes except ImportError: return try: libc = ctypes.CDLL("libc.so.6") libc.prctl(15, "kupfer") except (AttributeError, OSError): pass def _set_process_title(): try: import setproctitle except ImportError: if sys.platform == "linux2": _set_process_title_linux() else: setproctitle.setproctitle("kupfer") def exec_helper(helpername): import runpy runpy.run_module(helpername, run_name='__main__', alter_sys=True) raise SystemExit def gtkmain(quiet): import pygtk pygtk.require('2.0') import gtk if not gtk.gdk.screen_get_default(): print >>sys.stderr, "No Screen Found, Exiting..." sys.exit(1) from kupfer.ui import browser w = browser.WindowController() w.main(quiet=quiet) def main(): # parse commandline before importing UI cli_opts = get_options() print_banner() from kupfer import pretty if _debug: pretty.debug = _debug try: import debug debug.install() except ImportError: pass sys.excepthook = sys.__excepthook__ _set_process_title() quiet = ("--no-splash" in cli_opts) gtkmain(quiet) kupfer-v208/kupfer/obj/000077500000000000000000000000001176220042200151115ustar00rootroot00000000000000kupfer-v208/kupfer/obj/__init__.py000066400000000000000000000000001176220042200172100ustar00rootroot00000000000000kupfer-v208/kupfer/obj/apps.py000066400000000000000000000025431176220042200164320ustar00rootroot00000000000000from kupfer.obj.base import InvalidDataError, Source from kupfer.obj.helplib import PicklingHelperMixin, FilesystemWatchMixin from kupfer.obj.objects import AppLeaf class AppLeafContentMixin (object): """ Mixin for Source that correspond one-to-one with a AppLeaf This Mixin sees to that the Source is set as content for the application with id 'cls.appleaf_content_id', which may also be a sequence of ids. Source has to define the attribute appleaf_content_id and must inherit this mixin BEFORE the Source This Mixin defines: get_leaf_repr decorates_type, decorates_item """ @classmethod def get_leaf_repr(cls): if not hasattr(cls, "_cached_leaf_repr"): cls._cached_leaf_repr = cls.__get_leaf_repr() return cls._cached_leaf_repr @classmethod def __get_appleaf_id_iter(cls): if hasattr(cls.appleaf_content_id, "__iter__"): ids = iter(cls.appleaf_content_id) else: ids = (cls.appleaf_content_id, ) return ids @classmethod def __get_leaf_repr(cls): for appleaf_id in cls.__get_appleaf_id_iter(): try: return AppLeaf(app_id=appleaf_id) except InvalidDataError: pass @classmethod def decorates_type(cls): return AppLeaf @classmethod def decorate_item(cls, leaf): if leaf == cls.get_leaf_repr(): return cls() class ApplicationSource(AppLeafContentMixin, Source, PicklingHelperMixin, FilesystemWatchMixin): pass kupfer-v208/kupfer/obj/base.py000066400000000000000000000314641176220042200164050ustar00rootroot00000000000000from kupfer import datatools from kupfer import icons from kupfer import pretty from kupfer.utils import locale_sort from kupfer.kupferstring import tounicode, toutf8, tofolded __all__ = [ "Error", "InvalidDataError", "OperationError", "InvalidLeafError", "KupferObject", "Leaf", "Action", "Source", "TextSource", ] # If no gettext function is loaded at this point, we load a substitute, # so that testing code can still work import __builtin__ if not hasattr(__builtin__, "_"): def identity(x): return x __builtin__._ = identity class Error (Exception): pass class InvalidDataError (Error): "The data is wrong for the given Leaf" class OperationError (Error): "Command execution experienced an error" class InvalidLeafError (OperationError): "The Leaf passed to an Action is invalid" _builtin_modules = frozenset([ "kupfer.obj.objects", "kupfer.obj.base", "kupfer.obj.sources", "kupfer.obj.fileactions", ]) class _BuiltinObject (type): def __new__(mcls, name, bases, dict): dict["_is_builtin"] = dict["__module__"] in _builtin_modules return type.__new__(mcls, name, bases, dict) class KupferObject (object): """ Base class for kupfer data model This class provides a way to get at an object's: * icon with get_thumbnail, get_pixbuf and get_icon * name with unicode() or str() * description with get_description @rank_adjust should be used _very_ sparingly: Default actions should have +5 or +1 Destructive (dangerous) actions should have -5 or -10 @fallback_icon_name is a class attribute for the last fallback icon; it must always be accessible. """ __metaclass__ = _BuiltinObject rank_adjust = 0 fallback_icon_name = "kupfer-object" def __init__(self, name=None): """ Init kupfer object with, where @name *should* be a unicode object but *may* be a UTF-8 encoded `str` """ if not name: name = self.__class__.__name__ self.name = tounicode(name) folded_name = tofolded(self.name) self.kupfer_add_alias(folded_name) def kupfer_add_alias(self, alias): if alias != unicode(self): if not hasattr(self, "name_aliases"): self.name_aliases = set() self.name_aliases.add(alias) def __str__(self): return toutf8(self.name) def __unicode__(self): """Return a `unicode` representation of @self """ return self.name def __repr__(self): key = self.repr_key() keys = " %s" % (key, ) if key else "" if self._is_builtin: return "" % (self.__class__.__name__, keys) return "<%s.%s%s>" % (self.__module__, self.__class__.__name__, keys) def repr_key(self): """ Return an object whose str() will be used in the __repr__, self is returned by default. This value is used to recognize objects, for example learning commonly used objects. """ return self def get_description(self): """Return a description of the specific item which *should* be a unicode object """ return None def get_thumbnail(self, width, height): """Return pixbuf of size @width x @height if available Most objects will not implement this """ return None def get_pixbuf(self, icon_size): """ Returns an icon in pixbuf format with dimension @icon_size Subclasses should implement: get_gicon and get_icon_name, if they make sense. The methods are tried in that order. """ gicon = self.get_gicon() pbuf = gicon and icons.get_icon_for_gicon(gicon, icon_size) if pbuf: return pbuf icon_name = self.get_icon_name() icon = icon_name and icons.get_icon_for_name(icon_name, icon_size) if icon: return icon return icons.get_icon_for_name(self.fallback_icon_name, icon_size) def get_icon(self): """ Returns an icon in GIcon format Subclasses should implement: get_gicon and get_icon_name, if they make sense. The methods are tried in that order. """ gicon = self.get_gicon() if gicon and icons.is_good(gicon): return gicon icon_name = self.get_icon_name() if icon_name and icons.get_good_name_for_icon_names((icon_name, )): return icons.get_gicon_for_names(icon_name) return icons.get_gicon_for_names(self.fallback_icon_name) def get_gicon(self): """Return GIcon, if there is one""" return None def get_icon_name(self): """Return icon name. All items should have at least a generic icon name to return. """ return self.fallback_icon_name def aslist(seq): """Return a list out of @seq, or seq if it is a list""" if not isinstance(seq, type([])) and not isinstance(seq, type(())): seq = list(seq) return seq class _NonpersistentToken (object): "Goes None when pickled" __slots__ = "object" def __init__(self, object_): self.object = object_ def __nonzero__(self): return bool(self.object) def __reduce__(self): return (sum, ((), None)) class Leaf (KupferObject): """ Base class for objects Leaf.object is the represented object (data) All Leaves should be hashable (__hash__ and __eq__) """ def __init__(self, obj, name): """Represented object @obj and its @name""" super(Leaf, self).__init__(name) self.object = obj self._content_source = None def __hash__(self): return hash(unicode(self)) def __eq__(self, other): return (type(self) == type(other) and self.object == other.object) def add_content(self, content): """Register content source @content with Leaf""" self._content_source = content and _NonpersistentToken(content) def has_content(self): return self._content_source def content_source(self, alternate=False): """Content of leaf. it MAY alter behavior with @alternate, as easter egg/extra mode""" return self._content_source and self._content_source.object def get_actions(self): """Default (builtin) actions for this Leaf""" return () class Action (KupferObject): ''' Base class for all actions Implicit interface: valid_object will be called once for each (secondary) object to see if it applies. If it is not defined, all objects are assumed ok (within the other type/source constraints) def valid_object(self, obj, for_item): """Whether @obj is good for secondary obj, where @for_item is passed in as a hint for which it should be applied to """ return True ''' fallback_icon_name = "kupfer-execute" def __hash__(self): return hash(repr(self)) def __eq__(self, other): return (type(self) == type(other) and repr(self) == repr(other) and unicode(self) == unicode(other)) def repr_key(self): """by default, actions of one type are all the same""" return "" def activate(self, obj, iobj=None, ctx=None): """Use this action with @obj and @iobj @obj: the direct object (Leaf) @iobj: the indirect object (Leaf), if ``self.requires_object`` returns ``False`` if ``self.wants_context`` returns ``True``, then the action also receives an execution context object as ``ctx``. Also, ``activate_multiple(self, objects, iobjects=None, ctx=None)`` is called if it is defined and the action gets either multiple objects or iobjects. """ pass def wants_context(self): """Return ``True`` if ``activate`` should receive the ActionExecutionContext as the keyword argument context Defaults to ``False`` in accordance with the old protocol """ return False def is_factory(self): """Return whether action may return a result collection as a Source""" return False def has_result(self): """Return whether action may return a result item as a Leaf""" return False def is_async(self): """If this action runs asynchronously, return True. Then activate(..) must return an object from the kupfer.task module, which will be queued to run by Kupfer's task scheduler. """ return False def item_types(self): """Yield types this action may apply to. This is used only when this action is specified in __kupfer_actions__ to "decorate" """ return () def valid_for_item(self, item): """Whether action can be used with exactly @item""" return True def requires_object(self): """If this action requires a secondary object to complete is action, return True """ return False def object_source(self, for_item=None): """Source to use for object or None, to use the catalog (flat and filtered for @object_types) """ return None def object_types(self): """Yield types this action may use as indirect objects, if the action requrires it. """ return () class Source (KupferObject, pretty.OutputMixin): """ Source: Data provider for a kupfer browser All Sources should be hashable and treated as equal if their @repr are equal! @source_user_reloadable if True source get "Reload" action without debug mode. @source_prefer_sublevel if True, the source by default exports its contents in a subcatalog, not to the toplevel. NOTE: *Almost never* use this: let the user decide, default to toplevel. """ fallback_icon_name = "kupfer-object-multiple" source_user_reloadable = False source_prefer_sublevel = False def __init__(self, name): KupferObject.__init__(self, name) self.cached_items = None self._version = 1 @property def version(self): """version is for pickling (save and restore from cache), subclasses should increase self._version when changing""" return self._version def __eq__(self, other): return (type(self) == type(other) and repr(self) == repr(other) and self.version == other.version) def __hash__(self ): return hash(repr(self)) def toplevel_source(self): return self def initialize(self): """ Called when a Source enters Kupfer's system for real This method is called at least once for any "real" Source. A Source must be able to return an icon name for get_icon_name as well as a description for get_description, even if this method was never called. """ pass def finalize(self): """ Called before a source is deactivated. """ pass def repr_key(self): return "" def get_items(self): """ Internal method to compute and return the needed items Subclasses should use this method to return a sequence or iterator to the leaves it contains """ return [] def get_items_forced(self): """ Force compute and return items for source. Default - call get_items method. """ return self.get_items() def is_dynamic(self): """ Whether to recompute contents each time it is accessed """ return False def mark_for_update(self): """ Mark source as changed it should be reloaded on next used (if normally cached) """ self.cached_items = None def should_sort_lexically(self): """ Sources should return items by most relevant order (most relevant first). If this is True, Source will sort items from get_item() in locale lexical order """ return False def get_leaves(self, force_update=False): """ Return a list of all leaves. Subclasses should implement get_items, so that Source can handle sorting and caching. if @force_update, ignore cache, print number of items loaded """ if self.should_sort_lexically(): # sort in locale order sort_func = locale_sort else: sort_func = lambda x: x if self.is_dynamic(): if force_update: return sort_func(self.get_items_forced()) else: return sort_func(self.get_items()) if self.cached_items is None or force_update: if force_update: self.cached_items = aslist(sort_func(self.get_items_forced())) self.output_debug("Loaded %d items" % len(self.cached_items)) else: self.cached_items = \ datatools.SavedIterable(sort_func(self.get_items())) self.output_debug("Loaded items") return self.cached_items def has_parent(self): return False def get_parent(self): return None def get_leaf_repr(self): """Return, if appicable, another object to take the source's place as Leaf""" return None def provides(self): """A seq of the types of items it provides; empty is taken as anything -- however most sources should set this to exactly the type they yield """ return () class TextSource (KupferObject): """TextSource base class implementation, this is a psedo Source""" def __init__(self, name=None): if not name: name = _("Text") KupferObject.__init__(self, name) def __eq__(self, other): return (type(self) == type(other) and repr(self).__eq__(repr(other))) def __hash__(self ): return hash(repr(self)) def initialize(self): pass def get_rank(self): """All items are given this rank""" return 20 def get_items(self, text): return () def get_text_items(self, text): """Get leaves for unicode string @text""" return self.get_items(text) def has_parent(self): return False def provides(self): """A seq of the types of items it provides""" yield Leaf def get_icon_name(self): return "edit-select-all" class ActionGenerator (object): """A "source" for actions NOTE: The ActionGenerator should not perform any expensive computation, and not access any slow media (files, network) when returning actions. Such expensive checks must be performed in each Action's valid_for_item method. """ def get_actions_for_leaf(self, leaf): '''Return actions appropriate for given leaf. ''' return [] kupfer-v208/kupfer/obj/compose.py000066400000000000000000000071671176220042200171430ustar00rootroot00000000000000# encoding: utf-8 from kupfer import icons from kupfer import pretty from kupfer import utils from kupfer import datatools from kupfer import puid from kupfer.obj.base import Leaf, Action, Source, InvalidDataError from kupfer.obj.objects import Perform, RunnableLeaf, TextLeaf class TimedPerform (Perform): """A timed (delayed) version of Run (Perform) """ def __init__(self): Action.__init__(self, _("Run after Delay...")) def activate(self, leaf, iobj, ctx): from kupfer import scheduler # make a timer that will fire when Kupfer exits interval = utils.parse_time_interval(iobj.object) pretty.print_debug(__name__, "Run %s in %s seconds" % (leaf, interval)) timer = scheduler.Timer(True) args = (ctx,) if leaf.wants_context() else () timer.set(interval, leaf.run, *args) def requires_object(self): return True def object_types(self): yield TextLeaf def valid_object(self, iobj, for_item=None): interval = utils.parse_time_interval(iobj.object) return interval > 0 def get_description(self): return _("Perform command after a specified time interval") class ComposedLeaf (RunnableLeaf): serializable = 1 def __init__(self, obj, action, iobj=None): object_ = (obj, action, iobj) # A slight hack: We remove trailing ellipsis and whitespace format = lambda o: unicode(o).strip(".… ") name = u" → ".join([format(o) for o in object_ if o is not None]) RunnableLeaf.__init__(self, object_, name) def __getstate__(self): state = dict(vars(self)) state["object"] = [puid.get_unique_id(o) for o in self.object] return state def __setstate__(self, state): vars(self).update(state) objid, actid, iobjid = state["object"] obj = puid.resolve_unique_id(objid) act = puid.resolve_action_id(actid, obj) iobj = puid.resolve_unique_id(iobjid) if (not obj or not act) or (iobj is None) != (iobjid is None): raise InvalidDataError("Parts of %s not restored" % unicode(self)) self.object[:] = [obj, act, iobj] def get_actions(self): yield Perform() yield TimedPerform() def repr_key(self): return self def wants_context(self): return True def run(self, ctx): obj, action, iobj = self.object return ctx.delegated_run(obj, action, iobj) def get_gicon(self): obj, action, iobj = self.object return icons.ComposedIcon(obj.get_icon(), action.get_icon()) class _MultipleLeafContentSource (Source): def __init__(self, leaf): Source.__init__(self, unicode(leaf)) self.leaf = leaf def get_items(self): return self.leaf.object class MultipleLeaf (Leaf): """ A Leaf for the direct representation of many leaves. It is not a container or "source", it *is* the many leaves itself. The represented object is a sequence of Leaves """ serializable = 1 def __init__(self, obj, name=_("Multiple Objects")): # modifying the list of objects is strictly forbidden robj = list(datatools.UniqueIterator(obj)) Leaf.__init__(self, robj, name) def get_multiple_leaf_representation(self): return self.object def __getstate__(self): state = dict(vars(self)) state["object"] = [puid.get_unique_id(o) for o in self.object] return state def __setstate__(self, state): vars(self).update(state) objects = [] for id_ in state["object"]: obj = puid.resolve_unique_id(id_) if obj is None: raise InvalidDataError("%s could not be restored!" % (id_, )) objects.append(obj) self.object[:] = objects def has_content(self): return True def content_source(self, alternate=False): return _MultipleLeafContentSource(self) def get_description(self): n = len(self.object) return ngettext("%s object", "%s objects", n) % (n, ) def get_icon_name(self): return "kupfer-object-multiple" kupfer-v208/kupfer/obj/contacts.py000066400000000000000000000137761176220042200173170ustar00rootroot00000000000000# -*- encoding: utf-8 -*- """ Kupfer's Contacts API Main definition and *constructor* classes. Constructor classes such as EmailContact are used to conveniently construct contacts with common traits. To *use* contacts, always use ContactLeaf, asking for specific slots to be filled. """ import re from kupfer import icons from kupfer.obj.grouping import GroupingLeaf __author__ = ("Ulrik Sverdrup , " "Karol Będkowski ", "Adi Sieker ", ) EMAIL_KEY = "EMAIL" NAME_KEY = "NAME" PHONE_KEY = "PHONE" ADDRESS_KEY = "ADDRESS" LABEL_KEY = "LABEL" JABBER_JID_KEY = "JID" JABBER_STATUS_KEY = "JABBER_STATUS" JABBER_RESOURCE_KEY = "JABBER_RESOURCE" AIM_KEY = "AIM" GOOGLE_TALK_KEY = "GOOGLE_TALK" ICQ_KEY = "ICQ" MSN_KEY = "MSN" QQ_KEY = "QQ" SKYPE_KEY = "SKYPE" YAHOO_KEY = "YAHOO" class ContactLeaf(GroupingLeaf): grouping_slots = (NAME_KEY, ) def __init__(self, obj, name, image=None): self.image = image GroupingLeaf.__init__(self, obj, name) def get_icon_name(self): return "stock_person" def get_text_representation(self): return self.get_description() def get_thumbnail(self, width, height): if self.image: return icons.get_pixbuf_from_data(self.image, width, height) return GroupingLeaf.get_thumbnail(self, width, height) ## E-mail convenience and constructors def _get_email_from_url(url): ''' convert http://foo@bar.pl -> foo@bar.pl ''' sep = url.find('://') return url[sep + 3:] if sep > -1 else url # FIXME: Find a more robust (less strict?) approach than regex _CHECK_EMAIL_RE = re.compile(r"^[a-z0-9\._%-+]+\@[a-z0-9._%-]+\.[a-z]{2,}$") def is_valid_email(email): ''' simple email check ''' return len(email) > 7 and _CHECK_EMAIL_RE.match(email.lower()) is not None def email_from_leaf(leaf): """ Return an email address string if @leaf has a valid email address. @leaf may also be a TextLeaf or UrlLeaf. Return a false value if no valid email is found. """ if isinstance(leaf, ContactLeaf): return EMAIL_KEY in leaf and leaf[EMAIL_KEY] email = _get_email_from_url(leaf.object) return is_valid_email(email) and email class EmailContact (ContactLeaf): grouping_slots = ContactLeaf.grouping_slots + (EMAIL_KEY, ) def __init__(self, email, name, image=None): slots = {EMAIL_KEY: email, NAME_KEY: name} ContactLeaf.__init__(self, slots, name, image) def repr_key(self): return self.object[EMAIL_KEY] def get_description(self): return self.object[EMAIL_KEY] def get_gicon(self): return icons.ComposedIconSmall(self.get_icon_name(), "stock_mail") class IMContact (ContactLeaf): grouping_slots = ContactLeaf.grouping_slots + (EMAIL_KEY, ) def __init__(self, im_id_kind, im_id, name, label=None, other_slots=None, image=None): self.im_id_kind = im_id_kind slots = {im_id_kind: im_id, NAME_KEY: name, LABEL_KEY: label} if other_slots: slots.update(other_slots) ContactLeaf.__init__(self, slots, name, image) self.kupfer_add_alias(im_id) def repr_key(self): return self.object[self.im_id_kind] def get_description(self): return self.object[LABEL_KEY] or self.object[self.im_id_kind] class JabberContact (IMContact): ''' Minimal class for all Jabber contacts. ''' grouping_slots = IMContact.grouping_slots + (JABBER_JID_KEY, ) def __init__(self, jid, name, status=None, resource=None, slots=None, image=None): IMContact.__init__(self, JABBER_JID_KEY, jid, name or jid, other_slots=slots, image=image) self._description = _("[%(status)s] %(userid)s/%(service)s") % \ { "status": status or _("unknown"), "userid": jid, "service": resource or u"", } def get_description(self): return self._description class AIMContact(IMContact): grouping_slots = IMContact.grouping_slots + (AIM_KEY, ) def __init__(self, id_, name, slots=None, image=None): IMContact.__init__(self, AIM_KEY, id_, name, _("Aim"), slots, image) class GoogleTalkContact(IMContact): grouping_slots = IMContact.grouping_slots + (GOOGLE_TALK_KEY, ) def __init__(self, id_, name, slots=None, image=None): IMContact.__init__(self, GOOGLE_TALK_KEY, id_, name, _("Google Talk"), slots, image) class ICQContact(IMContact): grouping_slots = IMContact.grouping_slots + (ICQ_KEY, ) def __init__(self, id_, name, slots=None, image=None): IMContact.__init__(self, ICQ_KEY, id_, name, _("ICQ"), slots, image) class MSNContact(IMContact): grouping_slots = IMContact.grouping_slots + (MSN_KEY, ) def __init__(self, id_, name, slots=None, image=None): IMContact.__init__(self, MSN_KEY, id_, name, _("MSN"), slots, image) class QQContact(IMContact): grouping_slots = IMContact.grouping_slots + (QQ_KEY, ) def __init__(self, id_, name, slots=None, image=None): IMContact.__init__(self, QQ_KEY, id_, name, _("QQ"), slots, image) class YahooContact(IMContact): grouping_slots = IMContact.grouping_slots + (YAHOO_KEY, ) def __init__(self, id_, name, slots=None, image=None): IMContact.__init__(self, YAHOO_KEY, id_, name, _("Yahoo"), slots, image) class SkypeContact(IMContact): grouping_slots = IMContact.grouping_slots + (SKYPE_KEY, ) def __init__(self, id_, name, slots=None, image=None): IMContact.__init__(self, SKYPE_KEY, id_, name, _("Skype"), slots, image) class PhoneContact(ContactLeaf): grouping_slots = ContactLeaf.grouping_slots + (EMAIL_KEY, ) def __init__(self, number, name, label, slots=None, image=None): pslots = {PHONE_KEY: number, NAME_KEY: name, LABEL_KEY: label} if slots: pslots.update(slots) ContactLeaf.__init__(self, pslots, name, image) def repr_key(self): return self.object[PHONE_KEY] def get_description(self): return '%s: %s' % (self.object[LABEL_KEY], self.object[PHONE_KEY]) class AddressContact(ContactLeaf): grouping_slots = ContactLeaf.grouping_slots + (EMAIL_KEY, ) def __init__(self, address, name, label, slots=None, image=None): aslots = {ADDRESS_KEY: address, NAME_KEY: name, LABEL_KEY: label} if slots: aslots.update(slots) ContactLeaf.__init__(self, aslots, name, image) def repr_key(self): return self.object[ADDRESS_KEY] kupfer-v208/kupfer/obj/exceptions.py000066400000000000000000000013051176220042200176430ustar00rootroot00000000000000from kupfer import kupferstring from kupfer.obj.base import OperationError class LocaleOperationError (OperationError): """ User-visible error created from locale-encoded error message (for example OSError) """ def __init__(self, s): OperationError.__init__(self, kupferstring.fromlocale(s)) class NotAvailableError (OperationError): """ User-visible error message when an external tool is the wrong version """ def __init__(self, toolname): OperationError.__init__(self, _("%s does not support this operation") % toolname) class NoMultiError (OperationError): def __init__(self): OperationError.__init__(self, _("Can not be used with multiple objects")) kupfer-v208/kupfer/obj/fileactions.py000066400000000000000000000071111176220042200177630ustar00rootroot00000000000000import os import gio from kupfer import utils from kupfer import launch from kupfer.obj.base import Action, OperationError class NoDefaultApplicationError (OperationError): pass def is_good_executable(fileleaf): if not fileleaf._is_executable(): return False ctype, uncertain = gio.content_type_guess(fileleaf.object, None, True) return uncertain or gio.content_type_can_be_executable(ctype) def get_actions_for_file(fileleaf): acts = [RevealFile(), ] if fileleaf.is_dir(): acts.append(OpenTerminal()) elif fileleaf.is_valid(): if is_good_executable(fileleaf): acts.extend((Execute(), Execute(in_terminal=True))) return [Open()] + acts class Open (Action): """ Open with default application """ rank_adjust = 5 def __init__(self, name=_("Open")): Action.__init__(self, name) @classmethod def default_application_for_leaf(cls, leaf): content_attr = gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE gfile = gio.File(leaf.object) info = gfile.query_info(content_attr) content_type = info.get_attribute_string(content_attr) def_app = gio.app_info_get_default_for_type(content_type, False) if not def_app: apps_for_type = gio.app_info_get_all_for_type(content_type) raise NoDefaultApplicationError( (_("No default application for %(file)s (%(type)s)") % {"file": unicode(leaf), "type": content_type}) + "\n" + _('Please use "%s"') % _("Set Default Application...") ) return def_app def wants_context(self): return True def activate(self, leaf, ctx): self.activate_multiple((leaf, ), ctx) def activate_multiple(self, objects, ctx): appmap = {} leafmap = {} for obj in objects: app = self.default_application_for_leaf(obj) id_ = app.get_id() appmap[id_] = app leafmap.setdefault(id_, []).append(obj) for id_, leaves in leafmap.iteritems(): app = appmap[id_] launch.launch_application(app, paths=[L.object for L in leaves], activate=False, screen=ctx and ctx.environment.get_screen()) def get_description(self): return _("Open with default application") class RevealFile (Action): def __init__(self, name=_("Reveal")): super(RevealFile, self).__init__(name) def activate(self, leaf): fileloc = leaf.object parent = os.path.normpath(os.path.join(fileloc, os.path.pardir)) utils.show_path(parent) def get_description(self): return _("Open parent folder") def get_icon_name(self): return "folder-open" class OpenTerminal (Action): def __init__(self, name=_("Open Terminal Here")): super(OpenTerminal, self).__init__(name) def wants_context(self): return True def activate(self, leaf, ctx): try: utils.spawn_terminal(leaf.object, ctx.environment.get_screen()) except utils.SpawnError as exc: raise OperationError(exc) def get_description(self): return _("Open this location in a terminal") def get_icon_name(self): return "terminal" class Execute (Action): """ Execute executable file (FileLeaf) """ rank_adjust = 10 def __init__(self, in_terminal=False, quoted=True): name = _("Run in Terminal") if in_terminal else _("Run (Execute)") super(Execute, self).__init__(name) self.in_terminal = in_terminal self.quoted = quoted def repr_key(self): return (self.in_terminal, self.quoted) def activate(self, leaf): if self.quoted: argv = [leaf.object] else: argv = utils.argv_for_commandline(leaf.object) if self.in_terminal: utils.spawn_in_terminal(argv) else: utils.spawn_async(argv) def get_description(self): if self.in_terminal: return _("Run this program in a Terminal") else: return _("Run this program") kupfer-v208/kupfer/obj/grouping.py000066400000000000000000000120521176220042200173150ustar00rootroot00000000000000# -*- encoding: UTF-8 -*- """ Classes used to provide grouping leaves mechanism. """ import copy import itertools import time import weakref from kupfer.objects import Leaf, Source from kupfer import utils __author__ = ("Karol Będkowski , " "Ulrik Sverdrup " ) class GroupingLeaf (Leaf): """ A Leaf that groups with other leaves inside Grouping Sources The represented object of a GroupedLeaf is a dictionary of (slot, value) pairs, where slot identifies the slot, and the value is something that must be equal to be grouped. The GroupingLeaf must have a value for all @grouping_slots, but values of None will not be grouped with others. """ grouping_slots = () def __init__(self, obj, name): Leaf.__init__(self, obj, name) self.links = [self] def slots(self): return self.object def has_content(self): return len(self.links) > 1 def content_source(self, alternate=False): return _GroupedItemsSource(self) def __len__(self): return len(self.links) def __contains__(self, key): "Return True if GroupedLeaf has value for @key" return any(key in leaf.object for leaf in self.links) def __getitem__(self, key): "Get first (canonical) value for key" try: return iter(self.all(key)).next() except StopIteration: raise KeyError("%s has no slot %s" % (self, key)) def all(self, key): "Return iterator of all values for @key" return (leaf.object[key] for leaf in self.links if key in leaf.object) def check_key(self, key): ''' check if GroupedLeaf has non empty value for @key ''' return any(bool(leaf.object.get(key)) for leaf in self.links) class GroupingSource (Source): def __init__(self, name, sources): Source.__init__(self, name) self.sources = sources def get_leaves(self, force_update=False): starttime = time.time() # map (slot, value) -> group groups = {} non_group_leaves = [] for src in self.sources: leaves = Source.get_leaves(src, force_update) for leaf in leaves: try: slots = leaf.slots() except AttributeError: # Let through Non-grouping leaves non_group_leaves.append(leaf) continue slots = leaf.slots() for slot in leaf.grouping_slots: value = slots.get(slot) if value: groups.setdefault((slot, value), set()).add(leaf) if not leaf.grouping_slots: self.output_error("GroupingLeaf has no grouping slots", repr(leaf)) # Keep track of keys that are only duplicate references redundant_keys = set() def merge_groups(key1, key2): if groups[key1] is groups[key2]: return groups[key1].update(groups[key2]) groups[key2] = groups[key1] redundant_keys.add(key2) # Find all (slot, value) combinations that have more than one leaf # and merge those groups for (slot, value), leaves in groups.iteritems(): if len(leaves) <= 1: continue for leaf in list(leaves): for slot2 in leaf.grouping_slots: for value2 in leaf.all(slot2): if not value2: continue merge_groups((slot, value), (slot2, value2)) if self.should_sort_lexically(): sort_func = utils.locale_sort else: sort_func = lambda x: x keys = set(groups) keys.difference_update(redundant_keys) leaves = sort_func(self._make_group_leader(groups[K]) for K in keys) mergetime = time.time() - starttime if mergetime > 0.05: self.output_debug("Warning(?): merged in %s seconds" % mergetime) return itertools.chain(non_group_leaves, leaves) def repr_key(self): # Distinguish when used as GroupingSource if type(self) is GroupingSource: return unicode(self) return Source.repr_key(self) @classmethod def _make_group_leader(cls, leaves): if len(leaves) == 1: (leaf, ) = leaves return leaf obj = copy.copy(iter(leaves).next()) obj.links = list(leaves) for other in leaves: obj.kupfer_add_alias(unicode(other)) # adding the other's aliases can be misleading # since the matched email address might not be # what we are e-mailing # obj.name_aliases.update(other.name_aliases) return obj class ToplevelGroupingSource (GroupingSource): """ Sources of this type group their leaves with others in the toplevel of the catalog. """ _sources = {} def __init__(self, name, category): GroupingSource.__init__(self, name, [self]) self.category = category def toplevel_source(self): if self.category not in self._sources: return self sources = self._sources[self.category].keys() return GroupingSource(self.category, sources) def initialize(self): if not self.category in self._sources: self._sources[self.category] = weakref.WeakKeyDictionary() self._sources[self.category][self] = 1 self.output_debug("Register %s source %s" % (self.category, self)) def finalize(self): del self._sources[self.category][self] self.output_debug("Unregister %s source %s" % (self.category, self)) class _GroupedItemsSource(Source): def __init__(self, leaf): Source.__init__(self, unicode(leaf)) self._leaf = leaf def get_items(self): for leaf in self._leaf.links: yield leaf def repr_key(self): return repr(self._leaf) kupfer-v208/kupfer/obj/helplib.py000066400000000000000000000075101176220042200171050ustar00rootroot00000000000000""" This module contains Helper constructs This module is a part of the program Kupfer, see the main program file for more information. """ import gio class PicklingHelperMixin (object): """ This pickling helper will define __getstate__/__setstate__ acting simply on the class dictionary; it is up to the inheriting class to set up: pickle_prepare: Modify the instance dict to remove any unpickleable attributes, the resulting dict will be pickled unpickle_finish: Finish unpickling by restoring nonpickled attributes from the saved class dict, or setting up change callbacks or similar """ def pickle_prepare(self): pass def unpickle_finish(self): pass def __getstate__(self): """On pickle, getstate will call self.pickle_prepare(), then it will return the class' current __dict__ """ self.pickle_prepare() return self.__dict__ def __setstate__(self, state): """On unpickle, setstate will restore the class' __dict__, then call self.unpickle_finish() """ self.__dict__.update(state) self.unpickle_finish() class NonpersistentToken (PicklingHelperMixin): """A token will keep a reference until pickling, when it is deleted""" def __init__(self, data): self.data = data def __nonzero__(self): return self.data def pickle_prepare(self): self.data = None class FilesystemWatchMixin (object): """A mixin for Sources watching directories""" def monitor_directories(self, *directories, **kwargs): """Register @directories for monitoring; On changes, the Source will be marked for update. This method returns a monitor token that has to be stored for the monitor to be active. The token will be a false value if nothing could be monitored. Nonexisting directories are skipped, if not passing the kwarg @force """ tokens = [] force = kwargs.get('force', False) for directory in directories: gfile = gio.File(directory) if not force and not gfile.query_exists(): continue monitor = gfile.monitor_directory(gio.FILE_MONITOR_NONE, None) if monitor: monitor.connect("changed", self.__directory_changed) tokens.append(monitor) return NonpersistentToken(tokens) def monitor_include_file(self, gfile): """Return whether @gfile should trigger an update event by default, files beginning with "." are ignored """ return not (gfile and gfile.get_basename().startswith(".")) def __directory_changed(self, monitor, file1, file2, evt_type): if (evt_type in (gio.FILE_MONITOR_EVENT_CREATED, gio.FILE_MONITOR_EVENT_DELETED) and self.monitor_include_file(file1)): self.mark_for_update() def reverse_action(action, rank=0): """Return a reversed version a three-part action @action: the action class @rank: the rank_adjust to give the reversed action A three-part action requires a direct object (item) and an indirect object (iobj). In general, the item must be from the Catalog, while the iobj can be from one, specified special Source. If this is used, and the action will be reversed, the base action must be the one specifying a source for the iobj. The reversed action will always take both item and iobj from the Catalog, filtered by type. If valid_object(iobj, for_leaf=None) is used, it will always be called with only the new item as the first parameter when reversed. """ class ReverseAction (action): rank_adjust = rank def activate(self, leaf, iobj): return action.activate(self, iobj, leaf) def item_types(self): return action.object_types(self) def valid_for_item(self, leaf): try: return action.valid_object(self, leaf) except AttributeError: return True def object_types(self): return action.item_types(self) def valid_object(self, obj, for_item=None): return action.valid_for_item(self, obj) def object_source(self, for_item=None): return None ReverseAction.__name__ = "Reverse" + action.__name__ return ReverseAction kupfer-v208/kupfer/obj/hosts.py000066400000000000000000000024151176220042200166250ustar00rootroot00000000000000# -*- encoding: utf-8 -*- """ Kupfer's Hosts API Main definition and *constructor* classes. """ from kupfer.obj.grouping import GroupingLeaf __author__ = ("Ulrik Sverdrup , " "Karol Będkowski " ) HOST_NAME_KEY = "HOST_NAME" HOST_ADDRESS_KEY = "HOST_ADDRESS" HOST_SERVICE_NAME_KEY = "HOST_SERVICE_NAME" HOST_SERVICE_PORT_KEY = "HOST_SERVICE_PORT" HOST_SERVICE_USER_KEY = "HOST_SERVICE_USER" HOST_SERVICE_PASS_KEY = "HOST_SERVICE_PASS" HOST_SERVICE_REMOTE_PATH_KEY = "HOST_SERVICE_REMOTE_PATH" class HostLeaf(GroupingLeaf): grouping_slots = (HOST_NAME_KEY, HOST_ADDRESS_KEY) def get_icon_name(self): return "computer" class HostServiceLeaf(HostLeaf): ''' Leaf dedicated for well known services like ftp, ssh, vnc ''' def __init__(self, name, address, service, description, port=None, user=None, password=None, slots=None): _slots = { HOST_NAME_KEY: name, HOST_ADDRESS_KEY: address, HOST_SERVICE_NAME_KEY: service, HOST_SERVICE_PORT_KEY: port, HOST_SERVICE_USER_KEY: user, HOST_SERVICE_PASS_KEY: password, } if slots: _slots.update(slots) HostLeaf.__init__(self, _slots, name or address) self._description = description def get_description(self): return self._description kupfer-v208/kupfer/obj/objects.py000066400000000000000000000300731176220042200171170ustar00rootroot00000000000000# -*- coding: UTF-8 -*- """ Copyright 2007--2009 Ulrik Sverdrup This file is a part of the program kupfer, which is released under GNU General Public License v3 (or any later version), see the main program file, and COPYING for details. """ import os from os import path import gio import gobject from kupfer import icons, launch, utils from kupfer import pretty from kupfer.obj.base import Leaf, Action from kupfer.obj.base import InvalidDataError, OperationError from kupfer.obj import fileactions from kupfer.interface import TextRepresentation from kupfer.kupferstring import tounicode def ConstructFileLeafTypes(): """ Return a seq of the Leaf types returned by ConstructFileLeaf""" yield FileLeaf yield AppLeaf def ConstructFileLeaf(obj): """ If the path in @obj points to a Desktop Item file, return an AppLeaf, otherwise return a FileLeaf """ root, ext = path.splitext(obj) if ext == ".desktop": try: return AppLeaf(init_path=obj) except InvalidDataError: pass return FileLeaf(obj) def _directory_content(dirpath, show_hidden): from kupfer.obj.sources import DirectorySource return DirectorySource(dirpath, show_hidden) class FileLeaf (Leaf, TextRepresentation): """ Represents one file: the represented object is a bytestring (important!) """ serializable = 1 def __init__(self, obj, name=None, alias=None): """Construct a FileLeaf The display name of the file is normally derived from the full path, and @name should normally be left unspecified. @obj: byte string (file system encoding) @name: unicode name or None for using basename """ if obj is None: raise InvalidDataError("File path for %s may not be None" % name) # Use glib filename reading to make display name out of filenames # this function returns a `unicode` object if not name: name = gobject.filename_display_basename(obj) super(FileLeaf, self).__init__(obj, name) if alias: self.kupfer_add_alias(alias) def __eq__(self, other): try: return (type(self) == type(other) and unicode(self) == unicode(other) and path.samefile(self.object, other.object)) except OSError, exc: pretty.print_debug(__name__, exc) return False def repr_key(self): return self.object def canonical_path(self): """Return the true path of the File (without symlinks)""" return path.realpath(self.object) def is_valid(self): return os.access(self.object, os.R_OK) def _is_executable(self): return os.access(self.object, os.R_OK | os.X_OK) def is_dir(self): return path.isdir(self.object) def get_text_representation(self): return gobject.filename_display_name(self.object) def get_urilist_representation(self): return [gio.File(path=self.object).get_uri()] def get_description(self): return utils.get_display_path_for_bytestring(self.canonical_path()) def get_actions(self): return fileactions.get_actions_for_file(self) def has_content(self): return self.is_dir() or Leaf.has_content(self) def content_source(self, alternate=False): if self.is_dir(): return _directory_content(self.object, alternate) else: return Leaf.content_source(self) def get_thumbnail(self, width, height): if self.is_dir(): return None return icons.get_thumbnail_for_file(self.object, width, height) def get_gicon(self): return icons.get_gicon_for_file(self.object) def get_icon_name(self): if self.is_dir(): return "folder" else: return "text-x-generic" class SourceLeaf (Leaf): def __init__(self, obj, name=None): """Create SourceLeaf for source @obj""" if not name: name = unicode(obj) Leaf.__init__(self, obj, name) def has_content(self): return True def repr_key(self): return repr(self.object) def content_source(self, alternate=False): return self.object def get_description(self): return self.object.get_description() @property def fallback_icon_name(self): return self.object.fallback_icon_name def get_gicon(self): return self.object.get_gicon() def get_icon_name(self): return self.object.get_icon_name() class AppLeaf (Leaf): def __init__(self, item=None, init_path=None, app_id=None, require_x=True): """Try constructing an Application for GAppInfo @item, for file @path or for package name @app_id. @require_x: require executable file """ self.init_item = item self.init_path = init_path self.init_item_id = app_id and app_id + ".desktop" # finish will raise InvalidDataError on invalid item self.finish(require_x) Leaf.__init__(self, self.object, self.object.get_name()) self._add_aliases() def _add_aliases(self): # find suitable alias # use package name: non-extension part of ID lowername = unicode(self).lower() package_name = self._get_package_name() if package_name and package_name not in lowername: self.kupfer_add_alias(package_name) def __hash__(self): return hash(unicode(self)) def __eq__(self, other): return (isinstance(other, type(self)) and self.get_id() == other.get_id()) def __getstate__(self): self.init_item_id = self.object and self.object.get_id() state = dict(vars(self)) state["object"] = None state["init_item"] = None return state def __setstate__(self, state): vars(self).update(state) self.finish() def finish(self, require_x=False): """Try to set self.object from init's parameters""" item = None if self.init_item: item = self.init_item else: # Construct an AppInfo item from either path or item_id from gio.unix import DesktopAppInfo, desktop_app_info_new_from_filename if self.init_path and ( not require_x or os.access(self.init_path, os.X_OK)): # serilizable if created from a "loose file" self.serializable = 1 item = desktop_app_info_new_from_filename(self.init_path) elif self.init_item_id: try: item = DesktopAppInfo(self.init_item_id) except RuntimeError: pretty.print_debug(__name__, "Application not found:", self.init_item_id) self.object = item if not self.object: raise InvalidDataError def repr_key(self): return self.get_id() def _get_package_name(self): return gobject.filename_display_basename(self.get_id()) def launch(self, files=(), paths=(), activate=False, ctx=None): """ Launch the represented applications @files: a seq of GFiles (gio.File) @paths: a seq of bytestring paths @activate: activate instead of start new """ try: return launch.launch_application(self.object, files=files, paths=paths, activate=activate, desktop_file=self.init_path, screen=ctx and ctx.environment.get_screen()) except launch.SpawnError as exc: raise OperationError(exc) def get_id(self): """Return the unique ID for this app. This is the GIO id "gedit.desktop" minus the .desktop part for system-installed applications. """ return launch.application_id(self.object, self.init_path) def get_actions(self): if launch.application_is_running(self.get_id()): yield Launch(_("Go To"), is_running=True) yield CloseAll() else: yield Launch() yield LaunchAgain() def get_description(self): # Use Application's description, else use executable # for "file-based" applications we show the path app_desc = tounicode(self.object.get_description()) ret = tounicode(app_desc if app_desc else self.object.get_executable()) if self.init_path: app_path = utils.get_display_path_for_bytestring(self.init_path) return u"(%s) %s" % (app_path, ret) return ret def get_gicon(self): return self.object.get_icon() def get_icon_name(self): return "exec" class OpenUrl (Action): rank_adjust = 5 def __init__(self, name=None): if not name: name = _("Open URL") super(OpenUrl, self).__init__(name) def activate(self, leaf): url = leaf.object self.open_url(url) def open_url(self, url): utils.show_url(url) def get_description(self): return _("Open URL with default viewer") def get_icon_name(self): return "forward" class Launch (Action): """ Launches an application (AppLeaf) """ rank_adjust = 5 def __init__(self, name=None, is_running=False, open_new=False): """ If @is_running, style as if the app is running (Show application) If @open_new, always start a new instance. """ if not name: name = _("Launch") Action.__init__(self, name) self.is_running = is_running self.open_new = open_new def wants_context(self): return True def activate(self, leaf, ctx): leaf.launch(activate=not self.open_new, ctx=ctx) def get_description(self): if self.is_running: return _("Show application window") return _("Launch application") def get_icon_name(self): if self.is_running: return "go-jump" return "kupfer-launch" class LaunchAgain (Launch): rank_adjust = 0 def __init__(self, name=None): if not name: name = _("Launch Again") Launch.__init__(self, name, open_new=True) def item_types(self): yield AppLeaf def valid_for_item(self, leaf): return launch.application_is_running(leaf.get_id()) def get_description(self): return _("Launch another instance of this application") class CloseAll (Action): """Attempt to close all application windows""" rank_adjust = -10 def __init__(self): Action.__init__(self, _("Close")) def activate(self, leaf): return launch.application_close_all(leaf.get_id()) def item_types(self): yield AppLeaf def valid_for_item(self, leaf): return launch.application_is_running(leaf.get_id()) def get_description(self): return _("Attempt to close all application windows") def get_icon_name(self): return "window-close" class UrlLeaf (Leaf, TextRepresentation): def __init__(self, obj, name): super(UrlLeaf, self).__init__(obj, name) def get_actions(self): return (OpenUrl(), ) def get_description(self): return self.object def get_icon_name(self): return "text-html" class RunnableLeaf (Leaf): """Leaf where the Leaf is basically the action itself, for items such as Quit, Log out etc. """ def __init__(self, obj=None, name=None): Leaf.__init__(self, obj, name) def get_actions(self): yield Perform() def run(self, ctx=None): raise NotImplementedError def wants_context(self): """ Return ``True`` if you want the actions' execution context passed as ctx= in RunnableLeaf.run """ return False def repr_key(self): return "" def get_gicon(self): iname = self.get_icon_name() if iname: return icons.get_gicon_with_fallbacks(None, (iname, )) return icons.ComposedIcon("kupfer-object", "kupfer-execute") def get_icon_name(self): return "" class Perform (Action): """Perform the action in a RunnableLeaf""" rank_adjust = 5 def __init__(self, name=None): # TRANS: 'Run' as in Perform a (saved) command if not name: name = _("Run") super(Perform, self).__init__(name=name) def wants_context(self): return True def activate(self, leaf, ctx): if leaf.wants_context(): return leaf.run(ctx) else: return leaf.run() def get_description(self): return _("Perform command") class TextLeaf (Leaf, TextRepresentation): """Represent a text query The represented object is a unicode string """ serializable = 1 def __init__(self, text, name=None): """@text *must* be unicode or UTF-8 str""" text = tounicode(text) if not name: name = self.get_first_text_line(text) if len(text) == 0 or not name: name = _("(Empty Text)") Leaf.__init__(self, text, name) def get_actions(self): return () def repr_key(self): return hash(self.object) @classmethod def get_first_text_line(cls, text): firstline = None firstnl = text.find("\n") if firstnl != -1: firstline = text[:firstnl].strip() if not firstline: splut = text.split(None, 1) firstline = splut[0] if splut else text else: firstline = text if not firstline: firstline = text.strip("\n") return firstline def get_description(self): numlines = self.object.count("\n") + 1 desc = self.get_first_text_line(self.object) # TRANS: This is description for a TextLeaf, a free-text search # TRANS: The plural parameter is the number of lines %(num)d return ngettext('"%(text)s"', '(%(num)d lines) "%(text)s"', numlines) % {"num": numlines, "text": desc } def get_icon_name(self): return "edit-select-all" kupfer-v208/kupfer/obj/sources.py000066400000000000000000000111711176220042200171470ustar00rootroot00000000000000import itertools import os from os import path import gobject from kupfer import datatools from kupfer import icons from kupfer import utils from kupfer.obj.base import Source from kupfer.obj.helplib import PicklingHelperMixin, FilesystemWatchMixin from kupfer.obj.objects import FileLeaf, SourceLeaf from kupfer.obj.objects import ConstructFileLeaf, ConstructFileLeafTypes class FileSource (Source): def __init__(self, dirlist, depth=0): """ @dirlist: Directories as byte strings """ name = gobject.filename_display_basename(dirlist[0]) if len(dirlist) > 1: name = _("%s et. al.") % name super(FileSource, self).__init__(name) self.dirlist = dirlist self.depth = depth def __repr__(self): return "%s.%s((%s, ), depth=%d)" % (self.__class__.__module__, self.__class__.__name__, ', '.join('"%s"' % d for d in sorted(self.dirlist)), self.depth) def get_items(self): iters = [] def mkleaves(directory): files = utils.get_dirlist(directory, depth=self.depth, exclude=self._exclude_file) return (ConstructFileLeaf(f) for f in files) for d in self.dirlist: iters.append(mkleaves(d)) return itertools.chain(*iters) def should_sort_lexically(self): return True def _exclude_file(self, filename): return filename.startswith(".") def get_description(self): return (_("Recursive source of %(dir)s, (%(levels)d levels)") % {"dir": self.name, "levels": self.depth}) def get_icon_name(self): return "folder-saved-search" def provides(self): return ConstructFileLeafTypes() class DirectorySource (Source, PicklingHelperMixin, FilesystemWatchMixin): def __init__(self, dir, show_hidden=False): # Use glib filename reading to make display name out of filenames # this function returns a `unicode` object name = gobject.filename_display_basename(dir) super(DirectorySource, self).__init__(name) self.directory = dir self.show_hidden = show_hidden def __repr__(self): return "%s.%s(\"%s\", show_hidden=%s)" % (self.__class__.__module__, self.__class__.__name__, str(self.directory), self.show_hidden) def initialize(self): self.monitor = self.monitor_directories(self.directory) def finalize(self): self.monitor = None def monitor_include_file(self, gfile): return self.show_hidden or not gfile.get_basename().startswith('.') def get_items(self): try: for fname in os.listdir(self.directory): if self.show_hidden or not fname.startswith("."): yield ConstructFileLeaf(path.join(self.directory, fname)) except OSError, exc: self.output_error(exc) def should_sort_lexically(self): return True def _parent_path(self): return path.normpath(path.join(self.directory, path.pardir)) def has_parent(self): return not path.samefile(self.directory , self._parent_path()) def get_parent(self): if not self.has_parent(): return super(DirectorySource, self).has_parent(self) return DirectorySource(self._parent_path()) def get_description(self): return _("Directory source %s") % self.directory def get_gicon(self): return icons.get_gicon_for_file(self.directory) def get_icon_name(self): return "folder" def get_leaf_repr(self): if os.path.isdir(self.directory) and \ os.path.samefile(self.directory, os.path.expanduser("~")): alias = _("Home Folder") else: alias = None return FileLeaf(self.directory, alias=alias) def provides(self): return ConstructFileLeafTypes() class SourcesSource (Source): """ A source whose items are SourceLeaves for @source """ def __init__(self, sources, name=None, use_reprs=True): if not name: name = _("Catalog Index") super(SourcesSource, self).__init__(name) self.sources = sources self.use_reprs = use_reprs def get_items(self): """Ask each Source for a Leaf substitute, else yield a SourceLeaf """ for s in self.sources: yield (self.use_reprs and s.get_leaf_repr()) or SourceLeaf(s) def should_sort_lexically(self): return True def get_description(self): return _("An index of all available sources") def get_icon_name(self): return "folder-saved-search" class MultiSource (Source): """ A source whose items are the combined items of all @sources """ fallback_icon_name = "kupfer-catalog" def __init__(self, sources): super(MultiSource, self).__init__(_("Catalog")) self.sources = sources def is_dynamic(self): """ MultiSource should be dynamic so some of its content also can be """ return True def get_items(self): iterators = [] ui = datatools.UniqueIterator(S.toplevel_source() for S in self.sources) for S in ui: it = S.get_leaves() iterators.append(it) return itertools.chain(*iterators) def get_description(self): return _("Root catalog") kupfer-v208/kupfer/obj/special.py000066400000000000000000000015061176220042200171050ustar00rootroot00000000000000__version__ = '2010-01-21' from kupfer.obj.objects import RunnableLeaf from kupfer import kupferui class PleaseConfigureLeaf(RunnableLeaf): """ Show information and allow to open preferences for given plugin """ message = _("Please Configure Plugin") description = _("Plugin %s is not configured") def __init__(self, plugin_id, plugin_name): plugin_id = plugin_id.split('.')[-1] RunnableLeaf.__init__(self, plugin_id, self.message) self.plugin_name = plugin_name def wants_context(self): return True def run(self, ctx): kupferui.show_plugin_info(self.object, ctx.environment) def get_icon_name(self): return "preferences-desktop" def get_description(self): return self.description % self.plugin_name class InvalidCredentialsLeaf(PleaseConfigureLeaf): description = _("Invalid user credentials for %s") kupfer-v208/kupfer/objects.py000066400000000000000000000003621176220042200163430ustar00rootroot00000000000000from kupfer.obj.base import * from kupfer.obj.exceptions import * from kupfer.obj.objects import FileLeaf, AppLeaf, UrlLeaf, TextLeaf from kupfer.obj.objects import RunnableLeaf, SourceLeaf # Show everything here in help(..) __all__ = dir() kupfer-v208/kupfer/plugin/000077500000000000000000000000001176220042200156355ustar00rootroot00000000000000kupfer-v208/kupfer/plugin/__init__.py000066400000000000000000000013031176220042200177430ustar00rootroot00000000000000 def _extend_path(): # Inside a function to not leak variables to module namespace import os from kupfer import config from kupfer import pretty if not config.has_capability("CUSTOM_PLUGINS"): return # Add plugins in data directories __path__.extend(config.get_data_dirs("plugins")) # Add .zip files in plugins directories for directory in list(__path__): try: filenames = os.listdir(directory) except OSError, error: pretty.print_error(__name__, error) continue zipnames = [f for f in filenames if f.endswith(".zip")] if zipnames: pretty.print_debug(__name__, "Adding", directory, zipnames) __path__.extend(os.path.join(directory, z) for z in zipnames) _extend_path() kupfer-v208/kupfer/plugin/abiword.py000066400000000000000000000051031176220042200176350ustar00rootroot00000000000000__kupfer_name__ = _("Abiword") __kupfer_sources__ = ("RecentsSource", ) __description__ = _("Recently used documents in Abiword") __version__ = "" __author__ = "Ulrik Sverdrup " import os import xml.etree.cElementTree as ElementTree import gio from kupfer.objects import Source, FileLeaf, UrlLeaf from kupfer.obj.helplib import PicklingHelperMixin from kupfer.obj.apps import AppLeafContentMixin def get_abiword_files(xmlpth, application="abiword"): """ Yield URLs to abiword's recent files from XML file @xmlpth """ inside = False for event, entry in ElementTree.iterparse(xmlpth, events=("start", "end")): if entry.tag == "AbiPreferences" and entry.get("app") == application: if event == "start": inside = True elif not inside and event != "end": continue if entry.tag == "Recent": return (entry.get(a) for a in entry.attrib if a.startswith("name")) class RecentsSource (AppLeafContentMixin, Source, PicklingHelperMixin): appleaf_content_id = "abiword" def __init__(self, name=None): if not name: name = _("Abiword Recent Items") super(RecentsSource, self).__init__(name) self.unpickle_finish() def pickle_prepare(self): # monitor is not pickleable self.monitor = None def unpickle_finish(self): """Set up change monitor""" abifile = self._get_abiword_file() if not abifile: return gfile = gio.File(abifile) self.monitor = gfile.monitor_file(gio.FILE_MONITOR_NONE, None) if self.monitor: self.monitor.connect("changed", self._changed) def _changed(self, monitor, file1, file2, evt_type): """Change callback; something changed""" if evt_type in (gio.FILE_MONITOR_EVENT_CREATED, gio.FILE_MONITOR_EVENT_DELETED, gio.FILE_MONITOR_EVENT_CHANGED): self.mark_for_update() def _get_abiword_file(self): abifile = os.path.expanduser("~/.AbiSuite/AbiWord.Profile") if not os.path.exists(abifile): return None return abifile def get_items(self): abifile = self._get_abiword_file() if not abifile: self.output_debug("Abiword profile not found at", abifile) return try: uris = list(get_abiword_files(abifile)) except EnvironmentError, exc: self.output_error(exc) return for uri in uris: gfile = gio.File(uri) if not gfile.query_exists(): continue if gfile.get_path(): leaf = FileLeaf(gfile.get_path()) else: leaf = UrlLeaf(gfile.get_uri(), gfile.get_basename()) yield leaf def get_description(self): return _("Recently used documents in Abiword") def get_icon_name(self): return "document-open-recent" def provides(self): yield FileLeaf yield UrlLeaf kupfer-v208/kupfer/plugin/applications.py000066400000000000000000000066631176220042200207100ustar00rootroot00000000000000 __kupfer_name__ = _("Applications") __kupfer_sources__ = ("AppSource", ) __kupfer_actions__ = ( "OpenWith", "SetDefaultApplication", ) __description__ = _("All applications and preferences") __version__ = "" __author__ = "Ulrik Sverdrup " import gio from gio import app_info_get_all from gio.unix import desktop_app_info_set_desktop_env from kupfer.objects import Action, Source, AppLeaf, FileLeaf from kupfer.obj.helplib import FilesystemWatchMixin from kupfer import config, plugin_support __kupfer_settings__ = plugin_support.PluginSettings( { "key" : "desktop_type", "label": _("Applications for Desktop Environment"), "type": str, "value": "GNOME", "alternatives": ("GNOME", "KDE", "LXDE", "ROX", "XFCE") }, ) class AppSource (Source, FilesystemWatchMixin): """ Applications source This Source contains all user-visible applications (as given by the desktop files) """ def __init__(self): super(AppSource, self).__init__(_("Applications")) def initialize(self): application_dirs = config.get_data_dirs("", "applications") self.monitor_token = self.monitor_directories(*application_dirs) def get_items(self): # If we set proper desktop environment # We get exactly the apps shown in the menu, # as well as the preference panes desktop_type = __kupfer_settings__["desktop_type"] desktop_app_info_set_desktop_env(desktop_type) # Add this to the default whitelist = set([ # if you set/reset default handler for folders it is useful "nautilus-folder-handler.desktop", # we think that these are useful to show "eog.desktop", "evince.desktop", "gnome-about.desktop", "gstreamer-properties.desktop", "notification-properties.desktop", ]) blacklist = set([ "nautilus-home.desktop", ]) for item in app_info_get_all(): id_ = item.get_id() if id_ in whitelist or (item.should_show() and not id_ in blacklist): yield AppLeaf(item) def should_sort_lexically(self): return True def get_description(self): return _("All applications and preferences") def get_icon_name(self): return "applications-office" def provides(self): yield AppLeaf class OpenWith (Action): def __init__(self): Action.__init__(self, _("Open With...")) def _activate(self, app_leaf, paths, ctx): app_leaf.launch(paths=paths, ctx=ctx) def wants_context(self): return True def activate(self, leaf, iobj, ctx): self._activate(iobj, (leaf.object, ), ctx) def activate_multiple(self, objects, iobjects, ctx): # for each application, launch all the files for iobj_app in iobjects: self._activate(iobj_app, [L.object for L in objects], ctx) def item_types(self): yield FileLeaf def requires_object(self): return True def object_types(self): yield AppLeaf def get_description(self): return _("Open with any application") class SetDefaultApplication (Action): def __init__(self): Action.__init__(self, _("Set Default Application...")) def activate(self, leaf, obj): gfile = gio.File(leaf.object) info = gfile.query_info(gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE) content_type = info.get_attribute_string(gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE) print content_type, gfile desktop_item = obj.object desktop_item.set_as_default_for_type(content_type) def item_types(self): yield FileLeaf def requires_object(self): return True def object_types(self): yield AppLeaf def get_description(self): return _("Set default application to open this file type") kupfer-v208/kupfer/plugin/apt_tools.py000066400000000000000000000104671176220042200202230ustar00rootroot00000000000000__kupfer_name__ = _("APT") __kupfer_sources__ = () __kupfer_text_sources__ = () __kupfer_actions__ = ( "ShowPackageInfo", "SearchPackageName", "InstallPackage", ) __description__ = _("Interface with the package manager APT") __version__ = "" __author__ = ("Martin Koelewijn , " "Ulrik Sverdrup ") import os from kupfer.objects import Action, Source, Leaf from kupfer.objects import TextLeaf from kupfer import icons, kupferstring, task, uiutils, utils from kupfer import plugin_support __kupfer_settings__ = plugin_support.PluginSettings( { "key" : "installation_method", "label": _("Installation method"), "type": str, "value": "gksu -- apt-get install --yes", }, ) class InfoTask(task.Task): def __init__(self, text): super(InfoTask, self).__init__() self.text = text self.aptitude = None self.apt_cache = None def start(self, finish_callback): self._finish_callback = finish_callback timeout = 60 AC = utils.AsyncCommand AC(["aptitude", "show", self.text], self.aptitude_finished, timeout) AC(["apt-cache", "policy", self.text], self.aptcache_finished, timeout) def aptitude_finished(self, acommand, stdout, stderr): self.aptitude = stderr self.aptitude += stdout self._check_end() def aptcache_finished(self, acommand, stdout, stderr): self.apt_cache = stderr self.apt_cache += stdout self._check_end() def _check_end(self): if self.aptitude is not None and self.apt_cache is not None: self.finish(u"".join(kupferstring.fromlocale(s) for s in (self.aptitude, self.apt_cache))) def finish(self, text): uiutils.show_text_result(text, title=_("Show Package Information")) self._finish_callback(self) class ShowPackageInfo (Action): def __init__(self): Action.__init__(self, _("Show Package Information")) def is_async(self): return True def activate(self, leaf): return InfoTask(leaf.object.strip()) def item_types(self): yield TextLeaf yield Package def valid_for_item(self, item): # check if it is a single word text = item.object return len(text.split(None, 1)) == 1 def get_gicon(self): return icons.ComposedIcon("dialog-information", "package-x-generic") class InstallPackage (Action): def __init__(self): Action.__init__(self, _("Install")) def activate(self, leaf): self.activate_multiple((leaf, )) def activate_multiple(self, objs): program = (__kupfer_settings__["installation_method"]) pkgs = [o.object.strip() for o in objs] prog_argv = utils.argv_for_commandline(program) utils.spawn_in_terminal(prog_argv + pkgs) def item_types(self): yield Package yield TextLeaf def get_description(self): return _("Install package using the configured method") def get_icon_name(self): return "document-save" class Package (Leaf): def __init__(self, package, desc): Leaf.__init__(self, package, package) self.desc = desc def get_text_representation(self): return self.object def get_description(self): return self.desc def get_icon_name(self): return "package-x-generic" class PackageSearchSource (Source): def __init__(self, query): self.query = query Source.__init__(self, _('Packages matching "%s"') % query) def repr_key(self): return self.query def get_items(self): package = kupferstring.tolocale(self.query) c_in, c_out_err = os.popen4(['apt-cache', 'search', '--names-only', package]) try: c_in.close() acp_out = c_out_err.read() for line in kupferstring.fromlocale(acp_out).splitlines(): if not line.strip(): continue if not " - " in line: self.output_error("apt-cache: ", line) continue package, desc = line.split(" - ", 1) yield Package(package, desc) finally: c_out_err.close() def should_sort_lexically(self): return True def provides(self): yield TextLeaf def get_icon_name(self): return "system-software-install" class SearchPackageName (Action): def __init__(self): Action.__init__(self, _("Search Package Name...")) def is_factory(self): return True def activate(self, leaf): package = leaf.object.strip() return PackageSearchSource(package) def item_types(self): yield TextLeaf def valid_for_item(self, item): # check if it is a single word text = item.object return len(text.split(None, 1)) == 1 def get_icon_name(self): return "system-software-install" kupfer-v208/kupfer/plugin/archiveinside.py000066400000000000000000000103171176220042200210260ustar00rootroot00000000000000""" A test project to see if we can make a plugin that allows us to drill down into compressed archives. So far we only support .zip and .tar, .tar.gz, .tar.bz2, using Python's standard library. """ __kupfer_name__ = _("Deep Archives") __kupfer_contents__ = ("ArchiveContent", ) __description__ = _("Allow browsing inside compressed archive files") __version__ = "" __author__ = "Ulrik Sverdrup " import hashlib import os import shutil import tarfile import zipfile from kupfer.objects import Source, FileLeaf from kupfer.obj.sources import DirectorySource from kupfer import pretty from kupfer import scheduler # Limit this to archives of a couple of megabytes MAX_ARCHIVE_BYTE_SIZE = 15 * 1024**2 # Wait a year, or until program shutdown for cleaning up # archive files VERY_LONG_TIME_S = 3600*24*365 class UnsafeArchiveError (Exception): def __init__(self, path): Exception.__init__(self, "Refusing to extract unsafe path: %s" % path) def is_safe_to_unarchive(path): "return whether @path is likely a safe path to unarchive" npth = os.path.normpath(path) return not os.path.isabs(npth) and not npth.startswith(os.path.pardir) class ArchiveContent (Source): extractors = [] unarchived_files = [] end_timer = scheduler.Timer(True) def __init__(self, fileleaf, unarchive_func): Source.__init__(self, _("Content of %s") % fileleaf) self.path = fileleaf.object self.unarchiver = unarchive_func def repr_key(self): return self.path def get_items(self): # always use the same destination for the same file and mtime basename = os.path.basename(os.path.normpath(self.path)) root, ext = os.path.splitext(basename) mtime = os.stat(self.path).st_mtime fileid = hashlib.sha1("%s%s" % (self.path, mtime)).hexdigest() pth = os.path.join("/tmp", "kupfer-%s-%s" % (root, fileid, )) if not os.path.exists(pth): self.output_debug("Extracting with %s" % (self.unarchiver, )) self.unarchiver(self.path, pth) self.unarchived_files.append(pth) self.end_timer.set(VERY_LONG_TIME_S, self.clean_up_unarchived_files) files = list(DirectorySource(pth, show_hidden=True).get_leaves()) if len(files) == 1 and files[0].has_content(): return files[0].content_source().get_leaves() return files def get_description(self): return None @classmethod def decorates_type(cls): return FileLeaf @classmethod def decorate_item(cls, leaf): basename = os.path.basename(leaf.object).lower() for extractor in cls.extractors: if any(basename.endswith(ext) for ext in extractor.extensions): if extractor.predicate(leaf.object): return cls._source_for_path(leaf, extractor) @classmethod def _source_for_path(cls, leaf, extractor): byte_size = os.stat(leaf.object).st_size if byte_size < MAX_ARCHIVE_BYTE_SIZE: return cls(leaf, extractor) return None @classmethod def clean_up_unarchived_files(cls): if not cls.unarchived_files: return pretty.print_info(__name__, "Removing extracted archives..") for filetree in set(cls.unarchived_files): pretty.print_debug(__name__, "Removing", os.path.basename(filetree)) shutil.rmtree(filetree, onerror=cls._clean_up_error_handler) cls.unarchived_files = [] @classmethod def _clean_up_error_handler(cls, func, path, exc_info): pretty.print_error(__name__, "Error in %s deleting %s:" % (func, path)) pretty.print_error(__name__, exc_info) @classmethod def extractor(cls, extensions, predicate): def decorator(func): func.extensions = extensions func.predicate = predicate cls.extractors.append(func) return func return decorator @ArchiveContent.extractor((".tar", ".tar.gz", ".tgz", ".tar.bz2"), tarfile.is_tarfile) def extract_tarfile(filepath, destpath): zf = tarfile.TarFile.open(filepath, 'r') try: for member in zf.getnames(): if not is_safe_to_unarchive(member): raise UnsafeArchiveError(member) zf.extractall(path=destpath) finally: zf.close() # ZipFile only supports extractall since Python 2.6 @ArchiveContent.extractor((".zip", ), zipfile.is_zipfile) def extract_zipfile(filepath, destpath): zf = zipfile.ZipFile(filepath, 'r') try: for member in zf.namelist(): if not is_safe_to_unarchive(member): raise UnsafeArchiveError(member) zf.extractall(path=destpath) finally: zf.close() kupfer-v208/kupfer/plugin/archivemanager.py000066400000000000000000000071001176220042200211610ustar00rootroot00000000000000__kupfer_name__ = _("Archive Manager") __kupfer_sources__ = () __kupfer_text_sources__ = () __kupfer_actions__ = ( "UnpackHere", "CreateArchive", "CreateArchiveIn", ) __description__ = _("Use Archive Manager actions") __version__ = "" __author__ = "Ulrik" import os import re # since "path" is a very generic name, you often forget.. from os import path as os_path from kupfer.objects import Action, FileLeaf from kupfer import utils from kupfer import plugin_support from kupfer import runtimehelper __kupfer_settings__ = plugin_support.PluginSettings( { "key" : "archive_type", "label": _("Compressed archive type for 'Create Archive In'"), "type": str, "value": ".tar.gz", "alternatives": ( ".7z", ".rar", ".tar", ".tar.gz", ".tar.bz2", ".tar.xz", ".zip", ) }, ) class UnpackHere (Action): def __init__(self): Action.__init__(self, _("Extract Here")) self.extensions_set = set(( ".rar", ".7z", ".zip", ".gz", ".tgz", ".tar", ".lzma", ".bz2", ".tbz2", ".tzo", ".lzo", ".xz", ".ar", ".cbz", ".Z", ".taz", ".lz", ".bz", ".tbz", ".lzh", )) def activate(self, leaf): utils.spawn_async_notify_as("file-roller.desktop", ["file-roller", "--extract-here", leaf.object]) def valid_for_item(self, item): tail, ext = os.path.splitext(item.object) # FIXME: Make this detection smarter # check for standard extension or a multi-part rar extension return (ext.lower() in self.extensions_set or re.search(r".r\d+$", ext.lower()) is not None) def item_types(self): yield FileLeaf def get_description(self): return _("Extract compressed archive") def get_icon_name(self): return "extract-archive" class CreateArchive (Action): def __init__(self): Action.__init__(self, _("Create Archive")) @classmethod def _make_archive(cls, filepaths): cmd = ["file-roller", "--add"] cmd.extend(filepaths) utils.spawn_async_notify_as("file-roller.desktop", cmd) def activate(self, leaf): self._make_archive((leaf.object, )) def activate_multiple(self, objs): self._make_archive([L.object for L in objs]) def item_types(self): yield FileLeaf def get_description(self): return _("Create a compressed archive from folder") def get_icon_name(self): return "add-files-to-archive" class CreateArchiveIn (Action): def __init__(self): Action.__init__(self, _("Create Archive In...")) @classmethod def _make_archive(cls, ctx, basename, dirpath, filepaths): archive_type = __kupfer_settings__["archive_type"] archive_path = \ utils.get_destpath_in_directory(dirpath, basename, archive_type) cmd = ["file-roller", "--add-to=%s" % (archive_path, )] cmd.extend(filepaths) runtimehelper.register_async_file_result(ctx, archive_path) utils.spawn_async_notify_as("file-roller.desktop", cmd) return archive_path def wants_context(self): return True def activate(self, leaf, iobj, ctx): dirpath = iobj.object basename = os_path.basename(leaf.object) self._make_archive(ctx, basename, dirpath, (leaf.object, )) def activate_multiple(self, objs, iobjs, ctx): # TRANS: Default filename (no extension) for 'Create Archive In...' basename = _("Archive") for iobj in iobjs: self._make_archive(ctx, basename, iobj.object, [L.object for L in objs]) def item_types(self): yield FileLeaf def requires_object(self): return True def object_types(self): yield FileLeaf def valid_object(self, obj, for_item=None): return utils.is_directory_writable(obj.object) def get_description(self): return _("Create a compressed archive from folder") def get_icon_name(self): return "add-files-to-archive" kupfer-v208/kupfer/plugin/asciiunicodeiconset.py000066400000000000000000000247701176220042200222450ustar00rootroot00000000000000# encoding: utf-8 # don't panic! This is just because it's crazy and fun! ツ __kupfer_name__ = _("Ascii & Unicode Icon Set") __kupfer_sources__ = () __description__ = _("Provides the Ascii and Unicode icon sets that" " use letters and symbols to produce icons for" " the objects found in Kupfer.") __version__ = "" __author__ = "Ulrik Sverdrup" import io import weakref import cairo import gtk from kupfer import plugin_support def initialize_plugin(name): plugin_support.register_alternative(__name__, 'icon_renderer', 'ascii', name=_("Ascii"), renderer=AsciiIconRenderer()) plugin_support.register_alternative(__name__, 'icon_renderer', 'unicode', name=_("Unicode"), renderer=UnicodeIconRenderer()) def text_color(): "color as triple or None" settings = gtk.settings_get_default() s = gtk.rc_get_style_by_paths(settings, "kupfer.*", None, None) if not s: e = gtk.Invisible() e.realize() s = e.style c = s.fg[gtk.STATE_NORMAL] return (1.0*c.red/0xffff, 1.0*c.green/0xffff, 1.0*c.blue/0xffff) class AsciiIconRenderer (object): glyph_pixbuf_cache = weakref.WeakValueDictionary() def __init__(self): settings = gtk.settings_get_default() settings.connect("notify::gtk-color-scheme", self._theme_change) @classmethod def _theme_change(cls, *ignored): cls.glyph_pixbuf_cache.clear() @classmethod def pixbuf_for_name(cls, icon_name, size): """Return pixbuf at @size or None""" icon_glyph = ascii_icon_map.get(icon_name) if not icon_glyph: return None pixbuf = cls.glyph_pixbuf_cache.get((icon_glyph, size)) if not pixbuf: pixbuf = get_glyph_pixbuf(icon_glyph, size, False, text_color()) cls.glyph_pixbuf_cache[(icon_glyph, size)] = pixbuf return pixbuf @classmethod def pixbuf_for_file(cls, file_path, icon_size): return None class UnicodeIconRenderer (object): glyph_pixbuf_cache = weakref.WeakValueDictionary() def __init__(self): settings = gtk.settings_get_default() settings.connect("notify::gtk-color-scheme", self._theme_change) @classmethod def _theme_change(cls, *ignored): cls.glyph_pixbuf_cache.clear() @classmethod def pixbuf_for_name(cls, icon_name, size): """Return pixbuf at @size or None""" icon_glyph = unicode_icon_map.get(icon_name) if not icon_glyph: return None pixbuf = cls.glyph_pixbuf_cache.get((icon_glyph, size)) if not pixbuf: pixbuf = get_glyph_pixbuf(icon_glyph, size, False, text_color()) cls.glyph_pixbuf_cache[(icon_glyph, size)] = pixbuf return pixbuf @classmethod def pixbuf_for_file(cls, file_path, icon_size): return None ascii_icon_map = { "kupfer": "k", "kupfer-object-multiple": "O", "kupfer-object": "O", "gtk-execute": "o", ## filetypes "folder-saved-search": u"/", "folder": "/", "exec": "$", "text-x-script": "$", "audio-x-generic": u"s", "text-x-generic": "a", "text-html": "@", "image-x-generic": "c", "video-x-generic": "v", "application-x-executable": "$", "application-x-generic": "f", #"gnome-mime-application-pdf": "f", #"x-office-document": "f", ## actions "document-open-recent": "1", "applications-office": "$", "applications-internet": "S", "edit-select-all": u"\"", "forward": u">", "go-jump": u">", "format-text-bold": u"A", "help-contents": u"?", "list-add": u"+", "list-remove": u"--", "preferences-desktop-locale": u"L", "help-about": u"?", "dialog-information": u"?", "application-exit": u"X", "window-close": u"X", "gnome-window-manager": "]", "system-shutdown": u"X", "system-lock-screen": u"#", "system-log-out": u"[", "preferences-desktop": u"&", "user-trash-full": u"X", "user-home": u"~", "emblem-favorite": "*", #"document-open-recent": u"\N{WATCH}", "key_bindings": u"3", "mail-message-new": u"@", "edit-copy": "C", "edit-paste": "P", "edit-clear": "x", "edit-undo": "<", "view-refresh": "r", "drive-removable-media": u"=", "media-skip-backward": u"<", "media-skip-forward": u">", "media-playback-pause": '"', "media-playback-start": u">", "package-x-generic": u"=", "user-info": "p", "stock_person": "p", ## Applications "rhythmbox": "R", "terminal": "$", "banshee": "B", "audacious": u"a", "totem": "t", "vlc": u"V", "stellarium": u"*", "preferences-desktop-keyboard": "&", "preferences-desktop-keyboard-shortcuts": "&", "session-properties": "&", "utilities-system-monitor": "#", "synaptic": "#", "gnome-power-manager": u"=", "xine": u"x", "docky": "d", "empathy": u"@", "pidgin": u"@", "skype": u"@", "accessories-calculator": "=", "dia": "D", "mypaint": "y", "liferea": "L", "freeciv-client": "C", "qbittorrent": "q", "gnome-display-properties" : "]", "preferences-desktop-screensaver": "]", #"Thunar": u"\N{MALE SIGN}", "claws-mail": "@", "icedove": "@", "gajim": "@", "iceweasel": "@", "firefox": "@", "tomboy": "T", "gnome-specimen" : "Q", "accessories-text-editor": "g", "openofficeorg3-writer": "W", "openofficeorg3-draw": u"D", "openofficeorg3-impress": u"M", "openofficeorg3-calc": u"$", "libreoffice-writer": "W", "libreoffice-draw": u"D", "libreoffice-impress": u"M", "libreoffice-calc": u"$", "abiword_48": "W", "abiword": "W", "gnumeric": u"$", "geany": "g", "vim": "v", "zim": u"Z", "gimp": "G", "inkscape": "N", "accessories-dictionary": u"A", "accessories-character-map": u"z", "preferences-desktop-theme": u"&", "help-browser": u"?", "preferences-desktop-accessibility": u"&", "gconf-editor": "&", # "ALEMBIC" "gwibber": u"@", } unicode_icon_map = { "kupfer": u"\N{FEMALE SIGN}", "gtk-execute": u"\N{GEAR}", "folder-saved-search": u"/", "exec": u"\N{HAMMER AND PICK}", "text-x-script": u"\N{HAMMER AND PICK}", "audio-x-generic": u"s", "text-x-generic": "a", "text-html": "@", "image-x-generic": "c", "video-x-generic": "v", "application-x-executable": u"\N{HAMMER AND PICK}", "application-x-generic": "f", "applications-office": u"\N{HAMMER AND PICK}", "applications-science": u"\N{STAFF OF AESCULAPIUS}", "edit-select-all": u"\N{HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT}", "forward": u"\N{RIGHTWARDS ARROW}", "go-jump": u"\N{CLOCKWISE TOP SEMICIRCLE ARROW}", "format-text-bold": u"\N{MATHEMATICAL DOUBLE-STRUCK CAPITAL A}", "help-contents": u"\N{DOUBLE QUESTION MARK}", "list-add": u"+", "list-remove": u"\N{MINUS SIGN}", "preferences-desktop-locale": u"\N{WHITE FLAG}", "test" : u"\N{RADIOACTIVE SIGN}", "audio-x-generic": u"\N{EIGHTH NOTE}", "help-about": u"\N{INFORMATION SOURCE}", "dialog-information": u"\N{INFORMATION SOURCE}", "dialog-error": u"\N{WARNING SIGN}", "application-exit": u"\N{SKULL AND CROSSBONES}", "window-close": u"\N{SKULL AND CROSSBONES}", "system-shutdown": u"\N{SKULL AND CROSSBONES}", "system-log-out": u"\N{LEFTWARDS ARROW}", "system-lock-screen": u"\N{CHIRON}", #"system-log-out": u"\N{APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW}", "preferences-desktop": u"\N{BALLOT BOX WITH CHECK}", "user-trash-full": u"\N{BLACK UNIVERSAL RECYCLING SYMBOL}", "user-trash": u"\N{UNIVERSAL RECYCLING SYMBOL}", "user-home": u"\N{TILDE OPERATOR}", #"emblem-favorite": u"\N{BLACK STAR}", "emblem-favorite": u"\N{HEAVY BLACK HEART}", "kupfer-object-multiple": u"\N{DOTTED SQUARE}", "kupfer-object": u"\N{DOTTED SQUARE}", "document-open-recent": u"\N{WATCH}", "key_bindings": u"\N{KEYBOARD}", "mail-message-new": u"\N{ENVELOPE}", "edit-copy": u"\N{BLACK SCISSORS}", "edit-undo": u"\N{UNDO SYMBOL}", "view-refresh": u"\N{CLOCKWISE OPEN CIRCLE ARROW}", "folder": u"\N{STRICTLY EQUIVALENT TO}", "drive-removable-media": u"\N{TAPE DRIVE}", "media-optical": u"\N{TAPE DRIVE}", # ok these are stretching it.. "media-skip-backward": u"\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}", "media-skip-forward": u"\N{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}", "media-playback-pause": u"\N{MIDDLE DOT}", "media-playback-start": u"\N{TRIANGULAR BULLET}", "package-x-generic": u"\N{WHITE DRAUGHTS KING}", ## Applications "user-info": u"\N{BLACK CHESS PAWN}", "stock_person": u"\N{BLACK CHESS PAWN}", "rhythmbox": u"\N{BEAMED EIGHTH NOTES}", "banshee": u"\N{BEAMED EIGHTH NOTES}", "audacious": u"\N{BEAMED EIGHTH NOTES}", "totem": u"\N{BEAMED EIGHTH NOTES}", "vlc": u"\N{BEAMED EIGHTH NOTES}", "stellarium": u"\N{ASTERISM}", "preferences-desktop-keyboard": u"\N{KEYBOARD}", "preferences-desktop-keyboard-shortcuts": u"\N{KEYBOARD}", "utilities-system-monitor": u"\N{ATOM SYMBOL}", "gnome-power-manager": u"\N{HIGH VOLTAGE SIGN}", "freeciv-client": u"\N{CROSSED SWORDS}", "xboard": u"\N{BLACK CHESS ROOK}", "application-games": u"\N{BLACK CHESS ROOK}", "empathy": u"\N{WHITE SMILING FACE}", "pidgin": u"\N{WHITE SMILING FACE}", "skype": u"\N{BLACK TELEPHONE}", "Thunar": u"\N{MALE SIGN}", "claws-mail": u"\N{ENVELOPE}", "icedove": u"\N{ENVELOPE}", "accessories-text-editor": u"\N{WRITING HAND}", "openofficeorg3-writer": u"\N{WRITING HAND}", "libreoffice-writer": u"\N{WRITING HAND}", "geany": u"\N{WRITING HAND}", "zim": u"\N{WRITING HAND}", "gimp": u"\N{PENCIL}", "openofficeorg3-draw": u"\N{PENCIL}", "libreoffice-draw": u"\N{PENCIL}", "openofficeorg3-calc": u"\N{GREEK CAPITAL LETTER SIGMA}", "libreoffice-calc": u"\N{GREEK CAPITAL LETTER SIGMA}", "accessories-calculator": u"\N{GREEK CAPITAL LETTER SIGMA}", "abiword_48": u"\N{WRITING HAND}", "abiword": u"\N{WRITING HAND}", "accessories-dictionary": u"\N{MATHEMATICAL DOUBLE-STRUCK CAPITAL A}", "accessories-character-map": u"á", "preferences-desktop-theme": u"\N{EIGHT PETALLED OUTLINED BLACK FLORETTE}", "help-browser": u"?", "preferences-desktop-accessibility": u"\N{WHEELCHAIR SYMBOL}", #"ALEMBIC" "vim": u"\N{MATHEMATICAL DOUBLE-STRUCK CAPITAL V}", "gvim": u"\N{MATHEMATICAL DOUBLE-STRUCK CAPITAL V}", "gnome-volume-control": u"\N{EIGHTH NOTE}", "gnumeric": u"\N{GREEK CAPITAL LETTER SIGMA}", #"gwibber": u"\N{FACSIMILE SIGN}", "gwibber": u"\N{ENVELOPE}", ### marker "default": u"O", } def get_glyph_pixbuf(text, sz, center_vert=True, color=None): """Return pixbuf for @text if @center_vert, then center completely vertically """ margin = sz * 0.1 ims = cairo.ImageSurface(cairo.FORMAT_ARGB32, sz, sz) cc = cairo.Context(ims) cc.move_to(margin, sz-margin) cc.set_font_size(sz) if color is None: cc.set_source_rgba(0,0,0,1) else: cc.set_source_rgb(*color) cc.text_path(text) x1, y1, x2, y2 =cc.path_extents() skew_horiz = ((sz-x2) - (x1))/2.0 skew_vert = ((sz-y2) - (y1))/2.0 if not center_vert: skew_vert = skew_vert*0.2 - margin*0.5 cc.new_path() cc.move_to(margin+skew_horiz, sz-margin+skew_vert) cc.text_path(text) cc.fill() ims.flush() f = io.BytesIO() ims.write_to_png(f) loader = gtk.gdk.PixbufLoader() loader.write(f.getvalue()) loader.close() return loader.get_pixbuf() kupfer-v208/kupfer/plugin/audacious.py000066400000000000000000000134041176220042200201660ustar00rootroot00000000000000__kupfer_name__ = _("Audacious") __kupfer_sources__ = ("AudaciousSource", ) __description__ = _("Control Audacious playback and playlist") __version__ = "2009-12-15" __author__ = "Horia V. Corcalciuc " import subprocess from kupfer.objects import Leaf, Source, Action from kupfer.objects import RunnableLeaf, SourceLeaf from kupfer.obj.apps import AppLeafContentMixin from kupfer import icons, utils from kupfer import plugin_support from kupfer import kupferstring __kupfer_settings__ = plugin_support.PluginSettings( { "key": "playlist_toplevel", "label": _("Include songs in top level"), "type": bool, "value": True, }, ) AUDTOOL = "audtool" AUDACIOUS = "audacious" def enqueue_song(info): utils.spawn_async((AUDTOOL, "playqueue-add", "%d" % info)) def dequeue_song(info): utils.spawn_async((AUDTOOL, "playqueue-remove", "%d" % info)) def play_song(info): utils.spawn_async((AUDTOOL, "playlist-jump", "%d" % info)) utils.spawn_async((AUDTOOL, "playback-play")) def get_playlist_songs(): """Yield tuples of (position, name) for playlist songs""" toolProc = subprocess.Popen([AUDTOOL, "playlist-display"], stdout=subprocess.PIPE) stdout, stderr = toolProc.communicate() for line in stdout.splitlines(): if not line.count('|') >= 2: continue position, rest = line.split('|', 1) songname, rest = rest.rsplit('|', 1) pos = int(position.strip()) nam = kupferstring.fromlocale(songname.strip()) yield (pos, nam) def clear_queue(): utils.spawn_async((AUDTOOL, "playqueue-clear")) class Enqueue (Action): def __init__(self): Action.__init__(self, _("Enqueue")) def activate(self, leaf): enqueue_song(leaf.object) def get_description(self): return _("Add track to the Audacious play queue") def get_gicon(self): return icons.ComposedIcon("gtk-execute", "media-playback-start") def get_icon_name(self): return "media-playback-start" class Dequeue (Action): def __init__(self): Action.__init__(self, _("Dequeue")) def activate(self, leaf): dequeue_song(leaf.object) def get_description(self): return _("Remove track from the Audacious play queue") def get_gicon(self): return icons.ComposedIcon("gtk-execute", "media-playback-stop") def get_icon_name(self): return "media-playback-stop" class JumpToSong(Action): def __init__(self): Action.__init__(self, _("Play")) def activate(self, leaf): play_song(leaf.object) def get_description(self): return _("Jump to track in Audacious") def get_icon_name(self): return "media-playback-start" class Play (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, name=_("Play")) def run(self): utils.spawn_async((AUDTOOL, "playback-play")) def get_description(self): return _("Resume playback in Audacious") def get_icon_name(self): return "media-playback-start" class Pause (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, name=_("Pause")) def run(self): utils.spawn_async((AUDTOOL, "playback-pause")) def get_description(self): return _("Pause playback in Audacious") def get_icon_name(self): return "media-playback-pause" class Next (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, name=_("Next")) def run(self): utils.spawn_async((AUDTOOL, "playlist-advance")) def get_description(self): return _("Jump to next track in Audacious") def get_icon_name(self): return "media-skip-forward" class Previous (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, name=_("Previous")) def run(self): utils.spawn_async((AUDTOOL, "playlist-reverse")) def get_description(self): return _("Jump to previous track in Audacious") def get_icon_name(self): return "media-skip-backward" class ClearQueue (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, name=_("Clear Queue")) def run(self): clear_queue() def get_description(self): return _("Clear the Audacious play queue") def get_icon_name(self): return "edit-clear" class Shuffle (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, name=_("Shuffle")) def run(self): utils.spawn_async((AUDTOOL, "playlist-shuffle-toggle")) def get_description(self): return _("Toggle shuffle in Audacious") def get_icon_name(self): return "media-playlist-shuffle" class Repeat (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, name=_("Repeat")) def run(self): utils.spawn_async((AUDTOOL, "playlist-repeat-toggle")) def get_description(self): return _("Toggle repeat in Audacious") def get_icon_name(self): return "media-playlist-repeat" class SongLeaf (Leaf): """The SongLeaf's represented object is the Playlist index""" def get_actions(self): yield JumpToSong() yield Enqueue() yield Dequeue() def get_icon_name(self): return "audio-x-generic" class AudaciousSongsSource (Source): def __init__(self, library): Source.__init__(self, _("Playlist")) self.library = library def get_items(self): for song in self.library: yield SongLeaf(*song) def get_gicon(self): return icons.ComposedIcon(AUDACIOUS, "audio-x-generic", emblem_is_fallback=True) def provides(self): yield SongLeaf class AudaciousSource (AppLeafContentMixin, Source): appleaf_content_id = AUDACIOUS source_user_reloadable = True def __init__(self): Source.__init__(self, _("Audacious")) def get_items(self): yield Play() yield Pause() yield Next() yield Previous() yield ClearQueue() # Commented as these seem to have no effect #yield Shuffle() #yield Repeat() songs = list(get_playlist_songs()) songs_source = AudaciousSongsSource(songs) yield SourceLeaf(songs_source) if __kupfer_settings__["playlist_toplevel"]: for leaf in songs_source.get_leaves(): yield leaf def get_description(self): return __description__ def get_icon_name(self): return AUDACIOUS def provides(self): yield RunnableLeaf kupfer-v208/kupfer/plugin/calculator.py000066400000000000000000000065421176220042200203470ustar00rootroot00000000000000from __future__ import division __kupfer_name__ = _("Calculator") __kupfer_actions__ = ("Calculate", ) __description__ = _("Calculate expressions starting with '='") __version__ = "" __author__ = "Ulrik Sverdrup " import cmath import math from kupfer.objects import Action, TextLeaf from kupfer import pretty class IgnoreResultException (Exception): pass class KupferSurprise (float): """kupfer cleverness to the inf**inf """ def __call__(self, *args): from kupfer import utils, version utils.show_url(version.WEBSITE) raise IgnoreResultException class DummyResult (object): def __unicode__(self): return u"" class Help (object): """help() Show help about the calculator """ def __call__(self): import textwrap from kupfer import uiutils environment = make_environment(last_result=DummyResult()) docstrings = [] for attr in sorted(environment): if attr != "_" and attr.startswith("_"): continue val = environment[attr] if not callable(val): docstrings.append(u"%s = %s" % (attr, val)) continue try: docstrings.append(val.__doc__) except AttributeError: pass formatted = [] maxlen = 72 left_margin = 4 for docstr in docstrings: # Wrap the description and align continued lines docsplit = docstr.split("\n", 1) if len(docsplit) < 2: formatted.append(docstr) continue wrapped_lines = textwrap.wrap(docsplit[1].strip(), maxlen - left_margin) wrapped = (u"\n" + u" "*left_margin).join(wrapped_lines) formatted.append("%s\n %s" % (docsplit[0], wrapped)) uiutils.show_text_result("\n\n".join(formatted), _("Calculator")) raise IgnoreResultException def __complex__(self): return self() def make_environment(last_result=None): "Return a namespace for the calculator's expressions to be executed in." environment = dict(vars(math)) environment.update(vars(cmath)) # define some constants missing if last_result is not None: environment["_"] = last_result environment["help"] = Help() environment["kupfer"] = KupferSurprise("inf") # make the builtins inaccessible environment["__builtins__"] = {} return environment def format_result(res): cres = complex(res) parts = [] if cres.real: parts.append(u"%s" % cres.real) if cres.imag: parts.append(u"%s" % complex(0, cres.imag)) return u"+".join(parts) or u"%s" % res class Calculate (Action): # since it applies only to special queries, we can up the rank rank_adjust = 10 def __init__(self): Action.__init__(self, _("Calculate")) self.last_result = None def has_result(self): return True def activate(self, leaf): expr = leaf.object.lstrip("= ") # try to add missing parantheses brackets_missing = expr.count("(") - expr.count(")") if brackets_missing > 0: expr += ")"*brackets_missing environment = make_environment(self.last_result) pretty.print_debug(__name__, "Evaluating", repr(expr)) try: result = eval(expr, environment) resultstr = format_result(result) self.last_result = result except IgnoreResultException: return except Exception, exc: pretty.print_error(__name__, type(exc).__name__, exc) resultstr = unicode(exc) return TextLeaf(resultstr) def item_types(self): yield TextLeaf def valid_for_item(self, leaf): text = leaf.object return text and text.startswith("=") def get_description(self): return None kupfer-v208/kupfer/plugin/chromium.py000066400000000000000000000026441176220042200200400ustar00rootroot00000000000000__kupfer_name__ = _("Chromium Bookmarks") __kupfer_sources__ = ("BookmarksSource", ) __description__ = _("Index of Chromium bookmarks") __version__ = "" __author__ = "Francesco Marella " from kupfer.objects import Source from kupfer.objects import UrlLeaf from kupfer import config from kupfer.obj.apps import AppLeafContentMixin class BookmarksSource (AppLeafContentMixin, Source): appleaf_content_id = ("chromium-browser") def __init__(self): super(BookmarksSource, self).__init__(_("Chromium Bookmarks")) def _get_chromium_items(self, fpath): """Parse Chromium' bookmarks backups""" from kupfer.plugin import chromium_support self.output_debug("Parsing", fpath) bookmarks = chromium_support.get_bookmarks(fpath) for book in bookmarks: yield UrlLeaf(book["url"], book["name"]) def get_items(self): fpath = config.get_config_file("Bookmarks", package="chromium/Default") # If there is no chromium bookmarks file, look for a google-chrome one if not fpath: fpath = config.get_config_file("Bookmarks",package="google-chrome/Default") if fpath: try: return self._get_chromium_items(fpath) except Exception, exc: self.output_error(exc) self.output_error("No Chromium bookmarks file found") return [] def get_description(self): return _("Index of Chromium bookmarks") def get_icon_name(self): return "chromium-browser" def provides(self): yield UrlLeaf kupfer-v208/kupfer/plugin/chromium_support.py000066400000000000000000000023521176220042200216300ustar00rootroot00000000000000# -*- coding: UTF-8 -*- from __future__ import with_statement import os try: import cjson json_decoder = cjson.decode except ImportError: import json json_decoder = json.loads def get_bookmarks(bookmarks_file): # construct and configure the parser if not bookmarks_file: return [] with open(bookmarks_file) as f: content = f.read().decode("UTF-8") root = json_decoder(content) # make a dictionary of unique bookmarks bmap = {} def bmap_add(bmark, bmap): if bmark["id"] not in bmap: bmap[bmark["id"]] = bmark CONTAINER = "folder" UNWANTED_SCHEME = ("data", "place", "javascript") def is_container(ch): return ch["type"] == CONTAINER def is_bookmark(ch): return ch.get("url") def is_good(ch): return not ch["url"].split(":", 1)[0] in UNWANTED_SCHEME folders = [] # add some folders folders.extend(root['roots']['bookmark_bar']['children']) folders.extend(root['roots']['other']['children']) for item in folders: if is_bookmark(item) and is_good(item): bmap_add(item, bmap) if is_container(item): folders.extend(item["children"]) return bmap.values() if __name__ == "__main__": fpath = os.path.expanduser("~/.config/chromium/Default/") print "Parsed # bookmarks:", len(list(get_bookmarks(fpath))) kupfer-v208/kupfer/plugin/clawsmail.py000066400000000000000000000122341176220042200201650ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("Claws Mail") __kupfer_sources__ = ("ClawsContactsSource", ) __kupfer_actions__ = ("NewMailAction", "SendFileByMail") __description__ = _("Claws Mail Contacts and Actions") __version__ = "2010-05-19" __author__ = "Karol Będkowski " import os from xml.dom import minidom import xml from kupfer.objects import Action from kupfer.objects import TextLeaf, UrlLeaf, RunnableLeaf, FileLeaf from kupfer import utils from kupfer.obj.apps import AppLeafContentMixin from kupfer.obj.helplib import FilesystemWatchMixin from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj.contacts import ContactLeaf, EmailContact, email_from_leaf class ComposeMail(RunnableLeaf): ''' Create new mail without recipient ''' def __init__(self): RunnableLeaf.__init__(self, name=_("Compose New Email")) def run(self): utils.spawn_async(['claws-mail','--compose']) def get_description(self): return _("Compose a new message in Claws Mail") def get_icon_name(self): return "mail-message-new" class ReceiveMail(RunnableLeaf): ''' Receive all new mail from all accounts ''' def __init__(self): RunnableLeaf.__init__(self, name=_("Receive All Email")) def run(self): utils.spawn_async(['claws-mail', '--receive-all']) def get_description(self): return _("Receive new messages from all accounts in ClawsMail") def get_icon_name(self): return "mail-send-receive" class NewMailAction(Action): ''' Create new mail to selected leaf''' def __init__(self): Action.__init__(self, _('Compose Email')) def activate(self, leaf): self.activate_multiple((leaf, )) def activate_multiple(self, objects): recipients = ",".join(email_from_leaf(L) for L in objects) utils.spawn_async(["claws-mail", "--compose", recipients]) def get_icon_name(self): return "mail-message-new" def item_types(self): yield ContactLeaf # we can enter email yield TextLeaf yield UrlLeaf def valid_for_item(self, item): return bool(email_from_leaf(item)) class SendFileByMail (Action): '''Create new e-mail and attach selected file''' def __init__(self): Action.__init__(self, _('Send in Email To...')) def activate(self, obj, iobj): self.activate_multiple((obj, ), (iobj, )) def activate_multiple(self, objects, iobjects): recipients = ",".join(email_from_leaf(I) for I in iobjects) attachlist = ["--attach"] + [L.object for L in objects] utils.spawn_async(["claws-mail", "--compose", recipients] + attachlist) def item_types(self): yield FileLeaf def valid_for_item(self, item): return not item.is_dir() def requires_object(self): return True def object_types(self): yield ContactLeaf # we can enter email yield TextLeaf yield UrlLeaf def valid_object(self, iobj, for_item=None): return bool(email_from_leaf(iobj)) def get_description(self): return _("Compose new message in Claws Mail and attach file") def get_icon_name(self): return "document-send" class ClawsContactsSource(AppLeafContentMixin, ToplevelGroupingSource, FilesystemWatchMixin): appleaf_content_id = 'claws-mail' def __init__(self, name=_("Claws Mail Address Book")): super(ClawsContactsSource, self).__init__(name, "Contacts") #Source.__init__(self, name) self._claws_addrbook_dir = os.path.expanduser('~/.claws-mail/addrbook') self._claws_addrbook_index = os.path.join(self._claws_addrbook_dir, \ "addrbook--index.xml") self._version = 4 def initialize(self): ToplevelGroupingSource.initialize(self) if not os.path.isdir(self._claws_addrbook_dir): return self.monitor_token = self.monitor_directories(self._claws_addrbook_dir) def monitor_include_file(self, gfile): # monitor only addrbook-*.xml files return gfile and gfile.get_basename().endswith('.xml') and \ gfile.get_basename().startswith("addrbook-") def get_items(self): if os.path.isfile(self._claws_addrbook_index): for addrbook_file in self._load_address_books(): addrbook_filepath = os.path.join(self._claws_addrbook_dir, addrbook_file) if not os.path.exists(addrbook_filepath): continue try: dtree = minidom.parse(addrbook_filepath) persons = dtree.getElementsByTagName('person') for person in persons: cn = person.getAttribute('cn') addresses = person.getElementsByTagName('address') for address in addresses: email = address.getAttribute('email') yield EmailContact(email, cn) except (StandardError, xml.parsers.expat.ExpatError), err: self.output_error(err) yield ComposeMail() yield ReceiveMail() def should_sort_lexically(self): # since it is a grouping source, grouping and non-grouping will be # separate and only grouping leaves will be sorted return True def get_description(self): return _("Contacts from Claws Mail Address Book") def get_icon_name(self): return "claws-mail" def provides(self): yield RunnableLeaf yield ContactLeaf def _load_address_books(self): ''' load list of address-book files ''' try: dtree = minidom.parse(self._claws_addrbook_index) for book in dtree.getElementsByTagName('book'): yield book.getAttribute('file') except (StandardError, xml.parsers.expat.ExpatError), err: self.output_error(err) kupfer-v208/kupfer/plugin/clipboard.py000066400000000000000000000131541176220042200201520ustar00rootroot00000000000000__kupfer_name__ = _("Clipboards") __kupfer_sources__ = ("ClipboardSource", ) __kupfer_actions__ = ("ClearClipboards", ) __description__ = _("Recent clipboards and clipboard proxy objects") __version__ = "" __author__ = "Ulrik Sverdrup " from collections import deque import gio import gtk from kupfer.objects import Source, TextLeaf, Action, SourceLeaf from kupfer.objects import FileLeaf from kupfer.obj.compose import MultipleLeaf from kupfer import plugin_support from kupfer.weaklib import gobject_connect_weakly from kupfer import kupferstring __kupfer_settings__ = plugin_support.PluginSettings( { "key" : "max", "label": _("Number of recent clipboards to remember"), "type": int, "value": 10, }, { "key" : "use_selection", "label": _("Include selected text in clipboard history"), "type": bool, "value": False, }, { "key" : "sync_selection", "label": _("Copy selected text to primary clipboard"), "type": bool, "value": False, }, ) URI_TARGET="text/uri-list" class SelectedText (TextLeaf): qf_id = "selectedtext" def __init__(self, text): TextLeaf.__init__(self, text, _('Selected Text')) def __repr__(self): return "<%s %s>" % (__name__, self.qf_id) class ClipboardText (TextLeaf): def get_description(self): numlines = self.object.count("\n") + 1 desc = self.get_first_text_line(self.object) return ngettext('Clipboard "%(desc)s"', 'Clipboard with %(num)d lines "%(desc)s"', numlines) % {"num": numlines, "desc": desc } class CurrentClipboardText (ClipboardText): qf_id = "clipboardtext" def __init__(self, text): ClipboardText.__init__(self, text, _('Clipboard Text')) def __repr__(self): return "<%s %s>" % (__name__, self.qf_id) class CurrentClipboardFile (FileLeaf): "represents the *unique* current clipboard file" qf_id = "clipboardfile" def __init__(self, filepath): """@filepath is a filesystem byte string `str`""" FileLeaf.__init__(self, filepath, _('Clipboard File')) def __repr__(self): return "<%s %s>" % (__name__, self.qf_id) class CurrentClipboardFiles (MultipleLeaf): "represents the *unique* current clipboard if there are many files" qf_id = "clipboardfile" def __init__(self, paths): files = [FileLeaf(path) for path in paths] MultipleLeaf.__init__(self, files, _("Clipboard Files")) def __repr__(self): return "<%s %s>" % (__name__, self.qf_id) class ClearClipboards(Action): def __init__(self): Action.__init__(self, _("Clear")) def activate(self, leaf): leaf.object.clear() def item_types(self): yield SourceLeaf def valid_for_item(self, leaf): return isinstance(leaf.object, ClipboardSource) def get_description(self): return _("Remove all recent clipboards") def get_icon_name(self): return "edit-clear" class ClipboardSource (Source): def __init__(self): Source.__init__(self, _("Clipboards")) self.clipboards = deque() def initialize(self): clip = gtk.clipboard_get(gtk.gdk.SELECTION_CLIPBOARD) gobject_connect_weakly(clip, "owner-change", self._clipboard_changed) clip = gtk.clipboard_get(gtk.gdk.SELECTION_PRIMARY) gobject_connect_weakly(clip, "owner-change", self._clipboard_changed) self.clipboard_uris = [] self.clipboard_text = None self.selected_text = None def finalize(self): self.clipboard_uris = [] self.clipboard_text = None self.selected_text = None self.mark_for_update() def _clipboard_changed(self, clip, event, *args): is_selection = (event.selection == gtk.gdk.SELECTION_PRIMARY) max_len = __kupfer_settings__["max"] # receive clipboard as gtk text newtext = kupferstring.tounicode(clip.wait_for_text()) is_valid = bool(newtext and newtext.strip()) is_sync_selection = (is_selection and __kupfer_settings__["sync_selection"]) if not is_selection or __kupfer_settings__["use_selection"]: if is_valid: self._add_to_history(newtext, is_selection) if is_sync_selection and is_valid: gtk.clipboard_get(gtk.gdk.SELECTION_CLIPBOARD).set_text(newtext) if is_selection: self.selected_text = newtext if not is_selection or is_sync_selection: self.clipboard_text = newtext if clip.wait_is_target_available(URI_TARGET): sdata = clip.wait_for_contents(URI_TARGET) self.clipboard_uris = list(sdata.get_uris()) else: self.clipboard_uris = [] self._prune_to_length(max_len) self.mark_for_update() def _add_to_history(self, cliptext, is_selection): if cliptext in self.clipboards: self.clipboards.remove(cliptext) # if the previous text is a prefix of the new selection, supercede it if (is_selection and self.clipboards and (cliptext.startswith(self.clipboards[-1]) or cliptext.endswith(self.clipboards[-1]))): self.clipboards.pop() self.clipboards.append(cliptext) def _prune_to_length(self, max_len): while len(self.clipboards) > max_len: self.clipboards.popleft() def get_items(self): # selected text if self.selected_text: yield SelectedText(self.selected_text) # produce the current clipboard files if any paths = filter(None, [gio.File(uri=uri).get_path() for uri in self.clipboard_uris]) if len(paths) == 1: yield CurrentClipboardFile(paths[0]) if len(paths) > 1: yield CurrentClipboardFiles(paths) # put out the current clipboard text if self.clipboard_text: yield CurrentClipboardText(self.clipboard_text) # put out the clipboard history for t in reversed(self.clipboards): yield ClipboardText(t) def get_description(self): return __description__ def get_icon_name(self): return "edit-paste" def provides(self): yield TextLeaf yield FileLeaf yield MultipleLeaf def clear(self): self.clipboards.clear() self.mark_for_update() kupfer-v208/kupfer/plugin/commands.py000066400000000000000000000137211176220042200200140ustar00rootroot00000000000000__kupfer_name__ = _("Shell Commands") __kupfer_sources__ = () __kupfer_actions__ = ( "PassToCommand", "FilterThroughCommand", "WriteToCommand", ) __kupfer_text_sources__ = ("CommandTextSource",) __description__ = _(u"Run command-line programs. Actions marked with" u" the symbol %s run in a subshell.") % u"\N{GEAR}" __version__ = "" __author__ = "Ulrik Sverdrup " import os import gobject from kupfer.objects import TextSource, TextLeaf, Action, FileLeaf from kupfer.objects import OperationError from kupfer.obj.fileactions import Execute from kupfer import utils, icons from kupfer import kupferstring from kupfer import pretty def finish_command(ctx, acommand, stdout, stderr, post_result=True): """Show async error if @acommand returns error output & error status. Else post async result if @post_result. """ max_error_msg=512 pretty.print_debug(__name__, "Exited:", acommand) if acommand.exit_status != 0 and not stdout and stderr: errstr = kupferstring.fromlocale(stderr)[:max_error_msg] ctx.register_late_error(OperationError(errstr)) elif post_result: leaf = TextLeaf(kupferstring.fromlocale(stdout)) ctx.register_late_result(leaf) class GetOutput (Action): def __init__(self): Action.__init__(self, _("Run (Get Output)")) def wants_context(self): return True def activate(self, leaf, ctx): if isinstance(leaf, Command): argv = ['sh', '-c', leaf.object, '--'] else: argv = [leaf.object] def finish_callback(acommand, stdout, stderr): finish_command(ctx, acommand, stdout, stderr) pretty.print_debug(__name__, "Spawning with timeout 15 seconds") utils.AsyncCommand(argv, finish_callback, 15) def get_description(self): return _("Run program and return its output") + u" \N{GEAR}" class PassToCommand (Action): def __init__(self): # TRANS: The user starts a program (command) and the text # TRANS: is an argument to the command Action.__init__(self, _("Pass to Command...")) def wants_context(self): return True def activate(self, leaf, iobj, ctx): self.activate_multiple((leaf,),(iobj, ), ctx) def _run_command(self, objs, iobj, ctx): if isinstance(iobj, Command): argv = ['sh', '-c', iobj.object + ' "$@"', '--'] else: argv = [iobj.object] def finish_callback(acommand, stdout, stderr): finish_command(ctx, acommand, stdout, stderr, False) argv.extend([o.object for o in objs]) pretty.print_debug(__name__, "Spawning without timeout") utils.AsyncCommand(argv, finish_callback, None) def activate_multiple(self, objs, iobjs, ctx): for iobj in iobjs: self._run_command(objs, iobj, ctx) def item_types(self): yield TextLeaf yield FileLeaf def requires_object(self): return True def object_types(self): yield FileLeaf yield Command def valid_object(self, iobj, for_item=None): if isinstance(iobj, Command): return True return not iobj.is_dir() and os.access(iobj.object, os.X_OK | os.R_OK) def get_description(self): return _("Run program with object as an additional parameter") + \ u" \N{GEAR}" class WriteToCommand (Action): def __init__(self): # TRANS: The user starts a program (command) and # TRANS: the text is written on stdin Action.__init__(self, _("Write to Command...")) self.post_result = False def wants_context(self): return True def activate(self, leaf, iobj, ctx): if isinstance(iobj, Command): argv = ['sh', '-c', iobj.object] else: argv = [iobj.object] def finish_callback(acommand, stdout, stderr): finish_command(ctx, acommand, stdout, stderr, self.post_result) pretty.print_debug(__name__, "Spawning without timeout") utils.AsyncCommand(argv, finish_callback, None, stdin=leaf.object) def item_types(self): yield TextLeaf def requires_object(self): return True def object_types(self): yield FileLeaf yield Command def valid_object(self, iobj, for_item=None): if isinstance(iobj, Command): return True return not iobj.is_dir() and os.access(iobj.object, os.X_OK | os.R_OK) def get_description(self): return _("Run program and supply text on the standard input") + \ u" \N{GEAR}" class FilterThroughCommand (WriteToCommand): def __init__(self): # TRANS: The user starts a program (command) and # TRANS: the text is written on stdin, and we # TRANS: present the output (stdout) to the user. Action.__init__(self, _("Filter through Command...")) self.post_result = True def get_description(self): return _("Run program and supply text on the standard input") + \ u" \N{GEAR}" class Command (TextLeaf): def __init__(self, exepath, name): TextLeaf.__init__(self, name, name) self.exepath = exepath def get_actions(self): yield Execute(quoted=False) yield Execute(in_terminal=True, quoted=False) yield GetOutput() def get_description(self): args = u" ".join(unicode(self).split(None, 1)[1:]) return u"%s %s" % (self.exepath, args) def get_gicon(self): return icons.get_gicon_for_file(self.exepath) def get_icon_name(self): return "exec" class CommandTextSource (TextSource): """Yield path and command text items """ def __init__(self): TextSource.__init__(self, name=_("Shell Commands")) def get_rank(self): return 80 def get_text_items(self, text): if not text.strip(): return if '\n' in text: return ## check for absolute path with arguments firstwords = text.split() ## files are handled elsewhere if firstwords[0].startswith("/") and len(firstwords) == 1: return ## absolute paths come out here since ## os.path.join with two abspaths returns the latter firstword = firstwords[0] # iterate over $PATH directories PATH = os.environ.get("PATH", os.defpath) for execdir in PATH.split(os.pathsep): exepath = os.path.join(execdir, firstword) # use filesystem encoding here exepath = gobject.filename_from_utf8(exepath) if os.access(exepath, os.R_OK|os.X_OK) and os.path.isfile(exepath): yield Command(exepath, text) break def get_description(self): return _("Run command-line programs") kupfer-v208/kupfer/plugin/core/000077500000000000000000000000001176220042200165655ustar00rootroot00000000000000kupfer-v208/kupfer/plugin/core/COPYING000066400000000000000000000027131176220042200176230ustar00rootroot00000000000000object.svg: Derived from insert-object.svg in gnome's default icon theme. The whole package's copyright file is as follows: ---- It was downloaded from Copyright © 2002-2008: Ulisse Perusin Riccardo Buzzotta Josef Vybíral Hylke Bons Ricardo González Lapo Calamandrei Rodney Dawes Luca Ferretti Tuomas Kuosmanen Andreas Nilsson Jakub Steiner Copyright: This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991. This package 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 package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. On Debian GNU/Linux systems, the complete text of the GNU General Public License can be found in `/usr/share/common-licenses/GPL-2'. ---- kupfer-v208/kupfer/plugin/core/__init__.py000066400000000000000000000075121176220042200207030ustar00rootroot00000000000000__kupfer_name__ = u"Core" # The following attributes are updated later __kupfer_sources__ = () __kupfer_text_sources__ = () __kupfer_contents__ = () __kupfer_actions__ = ( "SearchInside", "CopyToClipboard", "Rescan", ) __description__ = u"Core actions and items" __version__ = "" __author__ = "Ulrik Sverdrup " import gtk from kupfer.objects import Leaf, Action from kupfer.obj.sources import MultiSource from kupfer import objects from kupfer.obj.base import InvalidLeafError from kupfer import interface from kupfer import pretty from kupfer import task def _is_debug(): # Return True if Kupfer is in debug mode return pretty.debug def register_subplugin(module): attrs = ( "__kupfer_sources__", "__kupfer_actions__", "__kupfer_text_sources__", "__kupfer_contents__" ) for attr in attrs: object_names = getattr(module, attr, ()) globals()[attr] += object_names globals().update((sym, getattr(module, sym)) for sym in object_names) from kupfer.plugin.core import contents, text, internal, commands register_subplugin(contents) register_subplugin(text) register_subplugin(internal) register_subplugin(commands) if _is_debug(): from kupfer.plugin.core import debug register_subplugin(debug) def initialize_plugin(x): from kupfer.plugin.core import alternatives alternatives.initialize_alternatives(__name__) class _MultiSource (MultiSource): def is_dynamic(self): return False class SearchInside (Action): """Return the content source for a Leaf""" def __init__(self): super(SearchInside, self).__init__(_("Search Contents")) def is_factory(self): return True def activate(self, leaf): if not leaf.has_content(): raise InvalidLeafError("Must have content") return leaf.content_source() def activate_multiple(self, objects): return _MultiSource([L.content_source() for L in objects]) def item_types(self): yield Leaf def valid_for_item(self, leaf): return leaf.has_content() def get_description(self): return _("Search inside this catalog") def get_icon_name(self): return "search" class CopyToClipboard (Action): # rank down since it applies everywhere rank_adjust = -2 def __init__(self): Action.__init__(self, _("Copy")) def wants_context(self): return True def activate(self, leaf, ctx): clip = gtk.Clipboard(selection=gtk.gdk.SELECTION_CLIPBOARD, display=ctx.environment.get_screen().get_display()) interface.copy_to_clipboard(leaf, clip) def item_types(self): yield Leaf def valid_for_item(self, leaf): try: return bool(interface.get_text_representation(leaf)) except AttributeError: pass def get_description(self): return _("Copy to clipboard") def get_icon_name(self): return "edit-copy" class RescanActionTask(task.ThreadTask): def __init__(self, source, async_token, retval): task.ThreadTask.__init__(self) self.source = source self.async_token = async_token self.retval = retval def thread_do(self): self.source.get_leaves(force_update=True) def thread_finish(self): self.async_token.register_late_result(self.retval) class Rescan (Action): """A source action: Rescan a source! """ rank_adjust = -5 def __init__(self): Action.__init__(self, _("Rescan")) def wants_context(self): return True def activate(self, leaf, ctx): if not leaf.has_content(): raise InvalidLeafError("Must have content") source = leaf.content_source() return RescanActionTask(source, ctx, leaf) def is_async(self): return True def get_description(self): return _("Force reindex of this source") def get_icon_name(self): return "view-refresh" def item_types(self): yield objects.AppLeaf yield objects.SourceLeaf def valid_for_item(self, item): if not item.has_content(): return False if item.content_source().is_dynamic(): return False return _is_debug() or item.content_source().source_user_reloadable kupfer-v208/kupfer/plugin/core/alternatives.py000066400000000000000000000025151176220042200216430ustar00rootroot00000000000000from kupfer import plugin_support from kupfer import icons def initialize_alternatives(__name__): plugin_support.register_alternative(__name__, 'icon_renderer', 'gtk', **{ 'name': _("GTK+"), 'renderer': icons.IconRenderer, }) plugin_support.register_alternative(__name__, 'terminal', 'gnome-terminal', **{ 'name': _("GNOME Terminal"), 'argv': ['gnome-terminal'], 'exearg': '-x', 'desktopid': "gnome-terminal.desktop", 'startup_notify': True, }) plugin_support.register_alternative(__name__, 'terminal', 'xfce4-terminal', **{ 'name': _("XFCE Terminal"), 'argv': ['xfce4-terminal'], 'exearg': '-x', 'desktopid': "xfce4-terminal.desktop", 'startup_notify': True, }) plugin_support.register_alternative(__name__, 'terminal', 'lxterminal', **{ 'name': _("LXTerminal"), 'argv': ['lxterminal'], 'exearg': '-e', 'desktopid': "lxterminal.desktop", 'startup_notify': False, }) plugin_support.register_alternative(__name__, 'terminal', 'xterm', **{ 'name': _("X Terminal"), 'argv': ['xterm'], 'exearg': '-e', 'desktopid': "xterm.desktop", 'startup_notify': False, }) plugin_support.register_alternative(__name__, 'terminal', 'urxvt', **{ 'name': _("Urxvt"), 'argv': ['urxvt'], 'exearg': '-e', 'desktopid': "urxvt.desktop", 'startup_notify': False, }) kupfer-v208/kupfer/plugin/core/commands.py000066400000000000000000000027441176220042200207470ustar00rootroot00000000000000__kupfer_actions__ = ("SaveToFile", ) import os from kupfer.objects import Action, FileLeaf, TextLeaf, TextSource from kupfer.obj.compose import ComposedLeaf from kupfer import kupferstring from kupfer.core import execfile class SaveToFile (Action): def __init__(self): Action.__init__(self, _("Save As...")) def has_result(self): return True def activate(self, obj, iobj): filepath = kupferstring.tolocale(iobj.object) execfile.save_to_file(obj, filepath) execfile.update_icon(obj, iobj.object) return FileLeaf(os.path.abspath(filepath)) def item_types(self): yield ComposedLeaf def requires_object(self): return True def object_types(self): yield TextLeaf def object_source(self, for_item=None): return NameSource(_("Save As..."), ".kfcom") class NameSource (TextSource): """A source for new names for a file; here we "autopropose" the source file's extension, but allow overriding it as well as renaming to without extension (selecting the normal TextSource-returned string). """ def __init__(self, name, extension, sourcefile=None): TextSource.__init__(self, name) self.sourcefile = sourcefile self.extension = extension def get_rank(self): return 100 def get_items(self, text): if not text: return t_root, t_ext = os.path.splitext(text) yield TextLeaf(text) if t_ext else TextLeaf(t_root + self.extension) def get_gicon(self): return self.sourcefile and self.sourcefile.get_gicon() def get_icon_name(self): return "text-x-generic" kupfer-v208/kupfer/plugin/core/contents.py000066400000000000000000000053551176220042200210040ustar00rootroot00000000000000import gtk from kupfer.objects import Source, RunnableLeaf from kupfer.obj.apps import AppLeafContentMixin from kupfer import pretty from kupfer import kupferui __kupfer_sources__ = ("KupferSource", ) __kupfer_actions__ = () __author__ = "Ulrik Sverdrup " __all__ = __kupfer_sources__ + __kupfer_actions__ def _is_debug(): # Return True if Kupfer is in debug mode return pretty.debug class DebugRestart (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, None, u"Restart Kupfer") @classmethod def _exec_new_kupfer(cls, executable, argv): import os os.execvp(executable, [executable] + argv) def run(self): import atexit import sys gtk.main_quit() atexit.register(self._exec_new_kupfer, sys.executable, sys.argv) def get_description(self): return u"Restart Kupfer quickly (for internal kupfer use)" def get_icon_name(self): return "view-refresh" class Quit (RunnableLeaf): qf_id = "quit" def __init__(self, name=None): if not name: name = _("Quit") super(Quit, self).__init__(name=name) def run(self): gtk.main_quit() def get_description(self): return _("Quit Kupfer") def get_icon_name(self): return "application-exit" class About (RunnableLeaf): def __init__(self, name=None): if not name: name = _("About Kupfer") super(About, self).__init__(name=name) def wants_context(self): return True def run(self, ctx): kupferui.show_about_dialog(ctx.environment) def get_description(self): return _("Show information about Kupfer authors and license") def get_icon_name(self): return "help-about" class Help (RunnableLeaf): def __init__(self, name=None): if not name: name = _("Kupfer Help") super(Help, self).__init__(name=name) def wants_context(self): return True def run(self, ctx): kupferui.show_help(ctx.environment) def get_description(self): return _("Get help with Kupfer") def get_icon_name(self): return "help-contents" class Preferences (RunnableLeaf): def __init__(self, name=None): if not name: name = _("Kupfer Preferences") super(Preferences, self).__init__(name=name) def wants_context(self): return True def run(self, ctx): kupferui.show_preferences(ctx.environment) def get_description(self): return _("Show preferences window for Kupfer") def get_icon_name(self): return "preferences-desktop" class KupferSource (AppLeafContentMixin, Source): appleaf_content_id = "kupfer" def __init__(self, name=_("Kupfer")): Source.__init__(self, name) def is_dynamic(self): return True def get_items(self): yield Preferences() yield Help() yield About() yield Quit() if _is_debug(): yield DebugRestart() def get_description(self): return None def get_icon_name(self): return "search" def provides(self): yield RunnableLeaf kupfer-v208/kupfer/plugin/core/debug.py000066400000000000000000000120301176220042200202210ustar00rootroot00000000000000""" This module contains internal and / or experimental Kupfer features. These are not meant to be useful to "normal" users of Kupfer -- if they are, they can be tested here before they migrate to a fitting plugin. """ from kupfer.obj.base import Action, Leaf, Source from kupfer.obj.compose import ComposedLeaf from kupfer import pretty __kupfer_sources__ = () __kupfer_contents__ = ( "ComposedSource", ) __kupfer_actions__ = ( "DebugInfo", "Forget", ) __description__ = __doc__ __author__ = "Ulrik Sverdrup " class DebugInfo (Action): """ Print debug info to terminal """ rank_adjust = -50 def __init__(self): Action.__init__(self, u"Debug Info") def activate(self, leaf): import StringIO # NOTE: Core imports from kupfer.core import qfurl from kupfer import uiutils from kupfer import puid output = StringIO.StringIO() def print_func(*args): print >>output, " ".join(unicode(a) for a in args) pretty.print_debug("debug", *args) print_func("Debug info about", leaf) print_func(leaf, repr(leaf)) def get_qfurl(leaf): try: return qfurl.qfurl(leaf) except qfurl.QfurlError: pass def get_object_fields(leaf): return { "repr" : leaf, "description": leaf.get_description(), "thumb" : leaf.get_thumbnail(32, 32), "gicon" : leaf.get_gicon(), "icon" : leaf.get_icon(), "icon-name": leaf.get_icon_name(), "type" : type(leaf), "module" : leaf.__module__, "aliases" : getattr(leaf, "name_aliases", None), "qfurl" : get_qfurl(leaf), "puid" : puid.get_unique_id(leaf), } def get_leaf_fields(leaf): base = get_object_fields(leaf) base.update( { "object" : leaf.object, "object-type" : type(leaf.object), "content" : leaf.content_source(), "content-alt" : leaf.content_source(alternate=True), "builtin-actions": list(leaf.get_actions()), } ) return base def get_source_fields(src): base = get_object_fields(src) base.update({ "dynamic" : src.is_dynamic(), "sort" : src.should_sort_lexically(), "parent" : src.get_parent(), "leaf" : src.get_leaf_repr(), "provides" : list(src.provides()), "cached_items": type(src.cached_items), "len": isinstance(src.cached_items, list) and len(src.cached_items), } ) return base def print_fields(fields): for field in sorted(fields): val = fields[field] rep = repr(val) print_func("%-15s:" % field, rep) if str(val) not in rep: print_func("%-15s:" % field, val) leafinfo = get_leaf_fields(leaf) print_fields(leafinfo) if leafinfo["content"]: print_func("Content ============") print_fields(get_source_fields(leafinfo["content"])) if leafinfo["content"] != leafinfo["content-alt"]: print_func("Content-Alt ========") print_fields(get_source_fields(leafinfo["content-alt"])) uiutils.show_text_result(output.getvalue()) def get_description(self): return u"Print debug output (for interal kupfer use)" def get_icon_name(self): return "emblem-system" def item_types(self): yield Leaf class Forget (Action): rank_adjust = -10 def __init__(self): Action.__init__(self, u"Forget") def activate(self, leaf): # NOTE: Core imports from kupfer.core import learn # FIXME: This is a large, total, utter HACK if isinstance(leaf, ComposedLeaf): for o in leaf.object: learn._register.pop(repr(o), None) if isinstance(leaf, ActionLeaf): learn._register.pop(repr(leaf.object), None) else: learn._register.pop(repr(leaf), None) def item_types(self): yield Leaf def get_description(self): return u"Let Kupfer forget about this object" class ActionLeaf (Leaf): def __init__(self, action): Leaf.__init__(self, action, unicode(action)) def get_actions(self): act = self.object if not (hasattr(act, "requires_object") and act.requires_object()): yield Apply(act) def get_description(self): return self.object.get_description() def get_icon_name(self): return self.object.get_icon_name() class Apply (Action): rank_adjust = 5 def __init__(self, action): Action.__init__(self, u"Apply To...") self.action = action def is_factory(self): return self.action.is_factory() def has_result(self): return self.action.has_result() def is_async(self): return self.action.is_async() def requires_object(self): return True def object_types(self): return self.action.item_types() def valid_object(self, obj, for_item=None): return self.action.valid_for_item(obj) def activate(self, leaf, iobj): return self.action.activate(iobj) class ComposedSource (Source): """ Decorated ComposedLeaf with a Source that shows the contents of Composed Commands """ def __init__(self, leaf): Source.__init__(self, u"Composed Command") self.leaf = leaf def get_items(self): obj = self.leaf.object yield self.leaf.object[0] yield ActionLeaf(obj[1]) if self.leaf.object[2] is not None: yield self.leaf.object[2] def repr_key(self): return self.leaf.repr_key() @classmethod def decorates_type(cls): return ComposedLeaf @classmethod def decorate_item(cls, leaf): return cls(leaf) kupfer-v208/kupfer/plugin/core/icon-list000066400000000000000000000002421176220042200204070ustar00rootroot00000000000000# IconName File # the fields must be tab-separated # icons are used if not existing in the icon theme kupfer-object object.svg kupfer-object-multiple objects.svg kupfer-v208/kupfer/plugin/core/internal.py000066400000000000000000000037201176220042200207550ustar00rootroot00000000000000 from kupfer.objects import Source, Leaf from kupfer.objects import RunnableLeaf from kupfer.core import commandexec __kupfer_sources__ = ("KupferInterals", "CommandResults", ) __author__ = "Ulrik Sverdrup " class LastCommand (RunnableLeaf): "Represented object is the command tuple to run" qf_id = "lastcommand" def __init__(self, obj): RunnableLeaf.__init__(self, obj, _("Last Command")) def wants_context(self): return True def run(self, ctx): obj, action, iobj = self.object return ctx.delegated_run(obj, action, iobj) class KupferInterals (Source): def __init__(self): Source.__init__(self, _("Internal Kupfer Objects")) def is_dynamic(self): return True def get_items(self): ctx = commandexec.DefaultActionExecutionContext() if ctx.last_command is None: return yield LastCommand(ctx.last_command) def provides(self): yield LastCommand class LastResultObject (Leaf): "dummy superclass" def _make_first_result_object(leaf): global LastResultObject class LastResultObject (LastResultObject): qf_id = "lastresult" def __init__(self, leaf): Leaf.__init__(self, leaf.object, _("Last Result")) vars(self).update(vars(leaf)) self.name = _("Last Result") self.__orignal_leaf = leaf self.__class__.__bases__ = (leaf.__class__, Leaf) def get_gicon(self): return None def get_icon_name(self): return Leaf.get_icon_name(self) def get_thumbnail(self, w, h): return None def get_description(self): return unicode(self.__orignal_leaf) return LastResultObject(leaf) class CommandResults (Source): def __init__(self): Source.__init__(self, _("Command Results")) def is_dynamic(self): return True def get_items(self): ctx = commandexec.DefaultActionExecutionContext() for x in reversed(ctx.last_results): yield x try: leaf = ctx.last_results[-1] except IndexError: return yield _make_first_result_object(leaf) def provides(self): yield Leaf yield LastResultObject kupfer-v208/kupfer/plugin/core/object.svg000066400000000000000000000173541176220042200205660ustar00rootroot00000000000000 image/svg+xml insert-object 04-07-07 Lapo Calamandrei stock insert object kupfer-v208/kupfer/plugin/core/objects.svg000066400000000000000000000555151176220042200207520ustar00rootroot00000000000000 kupfer-v208/kupfer/plugin/core/text.py000066400000000000000000000063451176220042200201330ustar00rootroot00000000000000import os import urlparse import urllib import gobject from kupfer.objects import TextSource, TextLeaf, FileLeaf, UrlLeaf from kupfer.obj.objects import OpenUrl from kupfer import utils __kupfer_name__ = u"Free-text Queries" __kupfer_sources__ = () __kupfer_text_sources__ = ("BasicTextSource", "PathTextSource", "URLTextSource",) __kupfer_actions__ = ("OpenTextUrl", ) __description__ = u"Basic support for free-text queries" __version__ = "2009-12-16" __author__ = "Ulrik Sverdrup " class BasicTextSource (TextSource): """The most basic TextSource yields one TextLeaf""" def __init__(self): TextSource.__init__(self, name=_("Text")) def get_text_items(self, text): if not text: return yield TextLeaf(text) def provides(self): yield TextLeaf class PathTextSource (TextSource): """Return existing full paths if typed""" def __init__(self): TextSource.__init__(self, name=u"Filesystem Text Matches") def get_rank(self): return 80 def get_text_items(self, text): # Find directories or files prefix = os.path.expanduser(u"~/") ufilepath = text if os.path.isabs(text) else os.path.join(prefix, text) # use filesystem encoding here filepath = gobject.filename_from_utf8(os.path.normpath(ufilepath)) if os.access(filepath, os.R_OK): yield FileLeaf(filepath) def provides(self): yield FileLeaf def is_url(text): """If @text is an URL, return a cleaned-up URL, else return None""" text = text.strip() components = list(urlparse.urlparse(text)) domain = "".join(components[1:]) dotparts = domain.rsplit(".") # 1. Domain name part is one word (without spaces) # 2. Urlparse parses a scheme (http://), else we apply heuristics if len(domain.split()) == 1 and (components[0] or ("." in domain and len(dotparts) >= 2 and len(dotparts[-1]) >= 2 and any(char.isalpha() for char in domain) and all(part[:1].isalnum() for part in dotparts))): if not components[0]: url = "http://" + "".join(components[1:]) else: url = text name = ("".join(components[1:3])).strip("/") if name: return url def try_unquote_url(url): """Try to turn an URL-escaped string into a Unicode string Where we assume UTF-8 encoding; and return the original url if any step fails. """ # check that it is ascii only try: burl = url.encode("ascii") except UnicodeEncodeError: return url try: return urllib.unquote(burl).decode("UTF-8") except UnicodeDecodeError: return url class OpenTextUrl (OpenUrl): rank_adjust = 1 def activate(self, leaf): url = is_url(leaf.object) utils.show_url(url) def item_types(self): yield TextLeaf def valid_for_item(self, leaf): return is_url(leaf.object) class URLTextSource (TextSource): """detect URLs and webpages""" def __init__(self): TextSource.__init__(self, name=u"URL Text Matches") def get_rank(self): return 75 def get_text_items(self, text): # Only detect "perfect" URLs text = text.strip() components = list(urlparse.urlparse(text)) domain = "".join(components[1:]) # If urlparse parses a scheme (http://), it's an URL if len(domain.split()) <= 1 and components[0]: url = text name = ("".join(components[1:3])).strip("/") name = try_unquote_url(name) or url yield UrlLeaf(url, name=name) def provides(self): yield UrlLeaf kupfer-v208/kupfer/plugin/custom_terminal.py000066400000000000000000000021041176220042200214110ustar00rootroot00000000000000__kupfer_name__ = _("Custom Terminal") __description__ = _("Configure a custom terminal emulator") __version__ = "" __author__ = "Ulrik Sverdrup" from kupfer import plugin_support from kupfer import utils __kupfer_settings__ = plugin_support.PluginSettings( { "key": "command", "label": _("Command"), "type": str, "value": "", }, { "key": "exearg", "label": _("Execute flag"), "type": str, "value": "-e", "tooltip": ("The flag which makes the terminal execute" " everything following it in the argument string. ") }, ) def initialize_plugin(name): __kupfer_settings__.connect_settings_changed_cb(_update_alternative) _update_alternative() def _update_alternative(*args): command = __kupfer_settings__["command"] exearg = __kupfer_settings__["exearg"] argv = utils.argv_for_commandline(command) if not argv or not utils.lookup_exec_path(argv[0]): return plugin_support.register_alternative(__name__, 'terminal', 'custom1', name=_("Custom Terminal"), argv=argv, exearg=exearg, desktopid="", startup_notify=True) kupfer-v208/kupfer/plugin/customtheme.py000066400000000000000000000074151176220042200205530ustar00rootroot00000000000000__kupfer_name__ = _("Custom Theme") __kupfer_sources__ = () __description__ = _("Use a custom color theme") __version__ = "" __author__ = "" import os import gtk from kupfer import config from kupfer import plugin_support """ Kupfer's UI can be themed by using the normal GtkRc style language Theming can change colors and some pre-defined parameters, but not the layout. See also Documentation/GTKTheming.rst or http://kaizer.se/wiki/kupfer/GTKTheming.html For general information about GTK+ styles, please see http://live.gnome.org/GnomeArt/Tutorials/GtkThemes """ SQUARE_STYLE = """ style "square" { MatchView :: corner-radius = 0 MatchView :: opacity = 100 Search :: list-opacity = 100 KupferWindow :: corner-radius = 0 KupferWindow :: opacity = 100 KupferWindow :: decorated = 0 KupferWindow :: border-width = 4 } ## The main window is kupfer widget "kupfer" style "square" widget "kupfer.*" style "square" ## The result list is kupfer-list widget "kupfer-list.*" style "square" """ DARK_STYLE = """ style "dark" { ## bg: background color bg[NORMAL] = "#333" bg[SELECTED] = "#000" bg[ACTIVE] = "#222" bg[PRELIGHT] = "#222" bg[INSENSITIVE] = "#333" ## fg: foreground text color fg[NORMAL] = "#DDD" fg[SELECTED] = "#EEE" fg[ACTIVE] = "#EEE" fg[PRELIGHT] = "#EEE" fg[INSENSITIVE] = "#DDD" ## text: text color in input widget and treeview text[NORMAL] = "#EEE" text[SELECTED] = "#EEE" text[ACTIVE] = "#EEE" ## base: background color in input widget and treeview base[NORMAL] = "#777" base[SELECTED] = "#100" base[ACTIVE] = "#112" ## These are UI Widget style properties with their approximate ## default values. These can all be overidden in the theme. ## MatchView :: corner-radius = 15 MatchView :: opacity = 90 ## Search :: list-opacity = 93 ## KupferWindow :: corner-radius = 15 KupferWindow :: opacity = 90 ## KupferWindow :: decorated = 0 ## KupferWindow :: border-width = 8 } ## The main window is kupfer widget "kupfer" style "dark" widget "kupfer.*" style "dark" ## The result list is kupfer-list widget "kupfer-list.*" style "dark" ## The menu button is *.kupfer-menu-button ## widget "*.kupfer-menu-button" style "dark" ## The description text is *.kupfer-description ## widget "*.kupfer-description" style "dark" ## The context menu is GtkWindow.kupfer-menu ## widget "*.kupfer-menu" style "dark" """ all_styles = { 'default': None, 'square': SQUARE_STYLE, 'dark': DARK_STYLE, } __kupfer_settings__ = plugin_support.PluginSettings( { "key": "theme", "label": _("Theme:"), "type": str, "value": 'default', "alternatives": all_styles.keys(), }, ) def cache_filename(): return os.path.join(config.get_cache_home(), __name__) def re_read_theme(): ## force re-read theme ## FIXME: re-read on all screens settings = gtk.settings_get_default() gtk.rc_reparse_all_for_settings(settings, True) def initialize_plugin(name): """ Theme changes are only reversible if we add and remove gtkrc files. """ use_theme(all_styles.get(__kupfer_settings__['theme'])) __kupfer_settings__.connect_settings_changed_cb(on_change_theme) def on_change_theme(sender, key, value): if key == 'theme': use_theme(all_styles.get(__kupfer_settings__[key])) def use_theme(style_str): """ Use the GTK+ style in @style_str, or unset if it is None """ filename = cache_filename() if style_str is None: filename = cache_filename() gtk.rc_set_default_files([f for f in gtk.rc_get_default_files() if f != filename]) else: with open(filename, "wb") as rcfile: rcfile.write(style_str) gtk.rc_add_default_file(filename) re_read_theme() def finalize_plugin(name): use_theme(None) re_read_theme() ## remove cache file filename = cache_filename() assert ("kupfer" in filename) try: os.unlink(filename) except OSError: pass kupfer-v208/kupfer/plugin/defaultmail.py000066400000000000000000000035321176220042200205010ustar00rootroot00000000000000__kupfer_name__ = _("Default Email Client") __kupfer_actions__ = ( "NewMailAction", "SendFileByMail", ) __description__ = _("Compose email using the system's default mailto: handler") __version__ = "2010-01-12" __author__ = "Ulrik Sverdrup " from kupfer.objects import Action from kupfer.objects import TextLeaf, UrlLeaf, FileLeaf from kupfer.obj.contacts import ContactLeaf, email_from_leaf from kupfer import utils class NewMailAction(Action): def __init__(self): Action.__init__(self, _('Compose Email')) def activate(self, leaf): email = email_from_leaf(leaf) utils.show_url("mailto:%s" % email) def activate_multiple(self, objects): recipients = ",".join(email_from_leaf(L) for L in objects) url = "mailto:" + recipients utils.show_url(url) def item_types(self): yield ContactLeaf yield TextLeaf yield UrlLeaf def valid_for_item(self, item): return bool(email_from_leaf(item)) def get_description(self): return __description__ def get_icon_name(self): return "mail-message-new" class SendFileByMail (Action): def __init__(self): Action.__init__(self, _('Send in Email To...')) def activate(self, obj, iobj): self.activate_multiple((obj, ), (iobj, )) def activate_multiple(self, objects, iobjects): # FIXME: revisit for unicode email addresses recipients = ",".join(email_from_leaf(I) for I in iobjects) attachlist = "?attach=" + "&attach=".join(L.object for L in objects) url = "mailto:" + recipients + attachlist utils.show_url(url) def item_types(self): yield FileLeaf def valid_for_item(self, item): return not item.is_dir() def requires_object(self): return True def object_types(self): yield ContactLeaf yield TextLeaf yield UrlLeaf def valid_object(self, iobj, for_item=None): return bool(email_from_leaf(iobj)) def get_icon_name(self): return "document-send" kupfer-v208/kupfer/plugin/devhelp.py000066400000000000000000000012161176220042200176360ustar00rootroot00000000000000__kupfer_name__ = _("Devhelp") __kupfer_actions__ = ("LookUp", ) __description__ = _("Search in Devhelp") __version__ = "" __author__ = "Ulrik Sverdrup " from kupfer.objects import Action, TextLeaf from kupfer import utils class LookUp (Action): def __init__(self): Action.__init__(self, _("Search in Devhelp")) def activate(self, leaf): text = leaf.object utils.spawn_async(['devhelp', '--search=%s' % text]) def item_types(self): yield TextLeaf def valid_for_item(self, leaf): text = leaf.object return '\n' not in text def get_description(self): return None def get_icon_name(self): return "devhelp" kupfer-v208/kupfer/plugin/dictionary.py000066400000000000000000000024771176220042200203660ustar00rootroot00000000000000__kupfer_name__ = _("Dictionary") __kupfer_actions__ = ("LookUp", ) __description__ = _("Look up word in dictionary") __version__ = "" __author__ = "Ulrik" from kupfer.objects import Action, TextLeaf, OperationError from kupfer import utils from kupfer import plugin_support from kupfer import kupferstring dictionaries = { 'gnome-dictionary': ['gnome-dictionary', '--look-up='], 'purple': ['purple', '--define='], 'xfce4-dict': ['xfce4-dict', '--dict', ''], } __kupfer_settings__ = plugin_support.PluginSettings( { "key" : "dictionary", "label": _("Dictionary"), "type": str, "alternatives": dictionaries.keys(), "value": 'gnome-dictionary', } ) class LookUp (Action): def __init__(self): Action.__init__(self, _("Look Up")) def activate(self, leaf): text = leaf.object dict_id = __kupfer_settings__["dictionary"] dict_argv = list(dictionaries[dict_id]) dict_argv[-1] = dict_argv[-1] + kupferstring.tolocale(text) try: utils.spawn_async_notify_as(dict_id + ".desktop", dict_argv) except utils.SpawnError as exc: raise OperationError(exc) def item_types(self): yield TextLeaf def valid_for_item(self, leaf): text = leaf.object return len(text.split("\n", 1)) <= 1 def get_description(self): return _("Look up word in dictionary") def get_icon_name(self): return "accessories-dictionary" kupfer-v208/kupfer/plugin/documents.py000066400000000000000000000106051176220042200202120ustar00rootroot00000000000000__kupfer_name__ = _("Documents") __kupfer_sources__ = ("RecentsSource", "PlacesSource", ) __kupfer_contents__ = ("ApplicationRecentsSource", ) __description__ = _("Recently used documents and bookmarked folders") __version__ = "" __author__ = "Ulrik Sverdrup " from os import path import gio from gtk import recent_manager_get_default from kupfer.objects import Source, AppLeaf, FileLeaf, UrlLeaf from kupfer import icons from kupfer import launch from kupfer import plugin_support from kupfer.weaklib import gobject_connect_weakly __kupfer_settings__ = plugin_support.PluginSettings( { "key" : "max_days", "label": _("Max recent document days"), "type": int, "value": 28, }, ) class RecentsSource (Source): def __init__(self, name=None): if not name: name = _("Recent Items") super(RecentsSource, self).__init__(name) def initialize(self): """Set up change callback""" manager = recent_manager_get_default() gobject_connect_weakly(manager, "changed", self._recent_changed) def _recent_changed(self, *args): # FIXME: We don't get single item updates, might this be # too many updates? self.mark_for_update() def get_items(self): max_days = __kupfer_settings__["max_days"] #self.output_info("Items younger than", max_days, "days") items = self._get_items(max_days) return items @classmethod def _get_items(cls, max_days, for_application_named=None): manager = recent_manager_get_default() items = manager.get_items() item_leaves = [] for item in items: if for_application_named: low_apps = [A.lower() for A in item.get_applications()] if for_application_named.lower() not in low_apps: continue day_age = item.get_age() if max_days >= 0 and day_age > max_days: continue if not item.exists(): continue uri = item.get_uri() name = item.get_short_name() if item.is_local(): leaf = FileLeaf(gio.File(uri).get_path()) else: leaf = UrlLeaf(uri, name) item_leaves.append((leaf, item.get_modified())) for lf, date in sorted(item_leaves, key=lambda t: t[1], reverse=True): yield lf def get_description(self): return _("Recently used documents") def get_icon_name(self): return "document-open-recent" def provides(self): yield FileLeaf yield UrlLeaf class ApplicationRecentsSource (RecentsSource): def __init__(self, application): name = _("%s Documents") % unicode(application) super(ApplicationRecentsSource, self).__init__(name) self.application = application def repr_key(self): return self.application.repr_key() def get_items(self): svc = launch.GetApplicationsMatcherService() app_name = svc.application_name(self.application.get_id()) max_days = -1 self.output_info("Items for", app_name) items = self._get_items(max_days, app_name) return items @classmethod def has_items_for_application(cls, name): for item in cls._get_items(-1, name): return True return False def get_gicon(self): return icons.ComposedIcon(self.get_icon_name(), self.application.get_icon()) def get_description(self): return _("Recently used documents for %s") % unicode(self.application) @classmethod def decorates_type(cls): return AppLeaf @classmethod def decorate_item(cls, leaf): svc = launch.GetApplicationsMatcherService() app_name = svc.application_name(leaf.get_id()) if app_name and cls.has_items_for_application(app_name): return cls(leaf) return None class PlacesSource (Source): """ Source for items from nautilus bookmarks """ def __init__(self): super(PlacesSource, self).__init__(_("Places")) self.places_file = "~/.gtk-bookmarks" def get_items(self): """ gtk-bookmarks: each line has url and optional title file:///path/to/that.end [title] """ fileloc = path.expanduser(self.places_file) if not path.exists(fileloc): return () return self._get_places(fileloc) def _get_places(self, fileloc): for line in open(fileloc): if not line.strip(): continue items = line.split() uri = items[0] gfile = gio.File(uri) if len(items) > 1: title = items[1] else: disp = gfile.get_parse_name() title = path.basename(disp) locpath = gfile.get_path() if locpath: yield FileLeaf(locpath, title) else: yield UrlLeaf(gfile.get_uri(), title) def get_description(self): return _("Bookmarked folders") def get_icon_name(self): return "file-manager" def provides(self): yield FileLeaf yield UrlLeaf kupfer-v208/kupfer/plugin/duckduckgo.py000066400000000000000000000015251176220042200203350ustar00rootroot00000000000000""" This is a DuckDuckGo search plugin based on the Wikipedia search plugin """ __kupfer_name__ = _("DuckDuckGo Search") __kupfer_sources__ = () __kupfer_actions__ = ("DuckDuckGoSearch",) __description__ = _("Search the web securely with DuckDuckGo") __version__ = "1.0" __author__ = "Isaac Aggrey " import urllib from kupfer.objects import Action, TextLeaf from kupfer import utils class DuckDuckGoSearch (Action): def __init__(self): Action.__init__(self, _("DuckDuckGo Search")) def activate(self, leaf): search_url = "https://duckduckgo.com/" query_url = search_url + "?" + urllib.urlencode({"q" : leaf.object}) utils.show_url(query_url) def item_types(self): yield TextLeaf def get_description(self): return _("Search the web securely with DuckDuckGo") def get_icon_name(self): return "edit-find" kupfer-v208/kupfer/plugin/empathy.py000066400000000000000000000201471176220042200176620ustar00rootroot00000000000000# -*- coding: UTF-8 -*- # vim: set noexpandtab ts=8 sw=8: __kupfer_name__ = _("Empathy") __kupfer_sources__ = ("ContactsSource", ) __kupfer_actions__ = ("ChangeStatus", 'OpenChat') __description__ = _("Access to Empathy Contacts") __version__ = "2010-10-17" __author__ = "Jakh Daven " import dbus import time from kupfer import icons from kupfer import plugin_support from kupfer.objects import Leaf, Action, Source, AppLeaf from kupfer.weaklib import dbus_signal_connect_weakly from kupfer.obj.helplib import PicklingHelperMixin from kupfer.obj.apps import AppLeafContentMixin from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj.contacts import ContactLeaf, JabberContact, JABBER_JID_KEY __kupfer_settings__ = plugin_support.PluginSettings( { "key" : "show_offline", "label": _("Show offline contacts"), "type": bool, "value": False, }, ) plugin_support.check_dbus_connection() _STATUSES = { 'available': _('Available'), 'away': _('Away'), 'dnd': _('Busy'), 'xa': _('Not Available'), 'hidden': _('Invisible'), 'offline': _('Offline') } _ATTRIBUTES = { 'alias': 'org.freedesktop.Telepathy.Connection.Interface.Aliasing/alias', 'presence': 'org.freedesktop.Telepathy.Connection.Interface.SimplePresence/presence', 'contact_caps': 'org.freedesktop.Telepathy.Connection.Interface.ContactCapabilities.DRAFT/caps', 'jid': 'org.freedesktop.Telepathy.Connection/contact-id', 'caps': 'org.freedesktop.Telepathy.Connection.Interface.Capabilities/caps', } ACCOUNTMANAGER_PATH = "/org/freedesktop/Telepathy/AccountManager" ACCOUNTMANAGER_IFACE = "org.freedesktop.Telepathy.AccountManager" ACCOUNT_IFACE = "org.freedesktop.Telepathy.Account" CHANNEL_GROUP_IFACE = "org.freedesktop.Telepathy.Channel.Interface.Group" CONTACT_IFACE = "org.freedesktop.Telepathy.Connection.Interface.Contacts" SIMPLE_PRESENCE_IFACE = "org.freedesktop.Telepathy.Connection.Interface.SimplePresence" DBUS_PROPS_IFACE = "org.freedesktop.DBus.Properties" CHANNELDISPATCHER_IFACE = "org.freedesktop.Telepathy.ChannelDispatcher" CHANNELDISPATCHER_PATH = "/org/freedesktop/Telepathy/ChannelDispatcher" CHANNEL_TYPE = "org.freedesktop.Telepathy.Channel.ChannelType" CHANNEL_TYPE_TEXT = "org.freedesktop.Telepathy.Channel.Type.Text" CHANNEL_TARGETHANDLE = "org.freedesktop.Telepathy.Channel.TargetHandle" CHANNEL_TARGETHANDLETYPE = "org.freedesktop.Telepathy.Channel.TargetHandleType" EMPATHY_CLIENT_IFACE = "org.freedesktop.Telepathy.Client.Empathy" EMPATHY_ACCOUNT_KEY = "EMPATHY_ACCOUNT" EMPATHY_CONTACT_ID = "EMPATHY_CONTACT_ID" def _create_dbus_connection(): sbus = dbus.SessionBus() proxy_obj = sbus.get_object(ACCOUNTMANAGER_IFACE, ACCOUNTMANAGER_PATH) dbus_iface = dbus.Interface(proxy_obj, DBUS_PROPS_IFACE) return dbus_iface class EmpathyContact(JabberContact): def __init__(self, jid, name, status, resources, account, contact_id): empathy_slots= { EMPATHY_ACCOUNT_KEY: account, EMPATHY_CONTACT_ID: contact_id } JabberContact.__init__(self, jid, name, status, resources, empathy_slots) def repr_key(self): return "".join((self.object[JABBER_JID_KEY], self.object[EMPATHY_ACCOUNT_KEY])) def get_gicon(self): return icons.ComposedIconSmall(self.get_icon_name(), "empathy") class AccountStatus(Leaf): pass class OpenChat(Action): def __init__(self): Action.__init__(self, _('Open Chat')) def activate(self, leaf): bus = dbus.SessionBus() jid = JABBER_JID_KEY in leaf and leaf[JABBER_JID_KEY] account = bus.get_object(ACCOUNTMANAGER_IFACE, leaf[EMPATHY_ACCOUNT_KEY]) contact_id = leaf[EMPATHY_CONTACT_ID] channel_dispatcher_iface = bus.get_object(CHANNELDISPATCHER_IFACE, CHANNELDISPATCHER_PATH) ticks = dbus.Int64(time.time()) channel_request_params = dbus.Dictionary() channel_request_params[CHANNEL_TYPE] = dbus.String(CHANNEL_TYPE_TEXT, variant_level=1) channel_request_params[CHANNEL_TARGETHANDLETYPE] = dbus.UInt32(1, variant_level=1) channel_request_params[CHANNEL_TARGETHANDLE] = contact_id message_channel_path = channel_dispatcher_iface.EnsureChannel(account, channel_request_params, ticks, EMPATHY_CLIENT_IFACE) channel_request = bus.get_object(ACCOUNTMANAGER_IFACE, message_channel_path) channel_request.Proceed() def get_icon_name(self): return 'empathy' def item_types(self): yield ContactLeaf def valid_for_item(self, item): return EMPATHY_ACCOUNT_KEY in item and item[EMPATHY_ACCOUNT_KEY] class ChangeStatus(Action): ''' Change global status ''' def __init__(self): Action.__init__(self, _('Change Global Status To...')) def activate(self, leaf, iobj): bus = dbus.SessionBus() interface = _create_dbus_connection() for valid_account in interface.Get(ACCOUNTMANAGER_IFACE, "ValidAccounts"): account = bus.get_object(ACCOUNTMANAGER_IFACE, valid_account) connection_status = account.Get(ACCOUNT_IFACE, "ConnectionStatus") if connection_status != 0: continue if iobj.object == "offline": false = dbus.Boolean(0, variant_level=1) account.Set(ACCOUNT_IFACE, "Enabled", false) else: connection_path = account.Get(ACCOUNT_IFACE, "Connection") connection_iface = connection_path.replace("/", ".")[1:] connection = bus.get_object(connection_iface, connection_path) simple_presence = dbus.Interface(connection, SIMPLE_PRESENCE_IFACE) simple_presence.SetPresence(iobj.object, _STATUSES.get(iobj.object)) def item_types(self): yield AppLeaf def valid_for_item(self, leaf): return leaf.get_id() == 'empathy' def requires_object(self): return True def object_types(self): yield AccountStatus def object_source(self, for_item=None): return StatusSource() class ContactsSource(AppLeafContentMixin, ToplevelGroupingSource, PicklingHelperMixin): ''' Get contacts from all on-line accounts in Empathy via DBus ''' appleaf_content_id = 'empathy' def __init__(self, name=_('Empathy Contacts')): super(ContactsSource, self).__init__(name, "Contacts") self._version = 2 self.unpickle_finish() def pickle_prepare(self): self._contacts = [] def unpickle_finish(self): self.mark_for_update() self._contacts = [] def initialize(self): ToplevelGroupingSource.initialize(self) def get_items(self): interface = _create_dbus_connection() if interface is not None: self._contacts = list(self._find_all_contacts(interface)) else: self._contacts = [] return self._contacts def _find_all_contacts(self, interface): show_offline = __kupfer_settings__["show_offline"] bus = dbus.SessionBus() for valid_account in interface.Get(ACCOUNTMANAGER_IFACE, "ValidAccounts"): account = bus.get_object(ACCOUNTMANAGER_IFACE, valid_account) connection_status = account.Get(ACCOUNT_IFACE, "ConnectionStatus") if connection_status != 0: continue connection_path = account.Get(ACCOUNT_IFACE, "Connection") connection_iface = connection_path.replace("/", ".")[1:] connection = bus.get_object(connection_iface, connection_path) channels = connection.ListChannels() for channel in channels: contact_group = bus.get_object(connection_iface, channel[0]) contacts = contact_group.Get(CHANNEL_GROUP_IFACE, "Members") if contacts: contacts = [c for c in contacts] contact_attributes = connection.Get(CONTACT_IFACE, "ContactAttributeInterfaces") contact_attributes = [str(a) for a in contact_attributes] contact_details = connection.GetContactAttributes(contacts, contact_attributes, False) for contact, details in contact_details.iteritems(): status_code = details[_ATTRIBUTES.get("presence")][1] if not show_offline and status_code == 'offline': continue yield EmpathyContact( details[_ATTRIBUTES.get("jid")], details[_ATTRIBUTES.get("alias")], _STATUSES.get(status_code), '', # empathy does not provide resource here AFAIK valid_account, contact) def get_icon_name(self): return 'empathy' def provides(self): yield ContactLeaf class StatusSource(Source): def __init__(self): Source.__init__(self, _("Empathy Account Status")) def get_items(self): for status, name in _STATUSES.iteritems(): yield AccountStatus(status, name) def provides(self): yield AccountStatus kupfer-v208/kupfer/plugin/epiphany.py000066400000000000000000000021451176220042200200260ustar00rootroot00000000000000__kupfer_name__ = _("Epiphany Bookmarks") __kupfer_sources__ = ("EpiphanySource", ) __description__ = _("Index of Epiphany bookmarks") __version__ = "" __author__ = "Ulrik Sverdrup " import os from kupfer.objects import Source from kupfer.objects import UrlLeaf from kupfer.obj.apps import AppLeafContentMixin from kupfer.plugin import epiphany_support class EpiphanySource (AppLeafContentMixin, Source): appleaf_content_id = "epiphany" def __init__(self): super(EpiphanySource, self).__init__(_("Epiphany Bookmarks")) def get_items(self): fpath = os.path.expanduser(epiphany_support.EPHY_BOOKMARKS_FILE) if not os.path.exists(fpath): self.output_debug("Epiphany bookmarks file not found:", fpath) return () try: bookmarks = list(epiphany_support.parse_epiphany_bookmarks(fpath)) except EnvironmentError, exc: self.output_error(exc) return () return (UrlLeaf(href, title) for title, href in bookmarks) def get_description(self): return _("Index of Epiphany bookmarks") def get_icon_name(self): return "web-browser" def provides(self): yield UrlLeaf kupfer-v208/kupfer/plugin/epiphany_support.py000066400000000000000000000022271176220042200216230ustar00rootroot00000000000000""" Parse Epiphany's bookmarks file Inspired by the Epiphany handler from the deskbar project """ __author__ = "Ulrik Sverdrup " import xml.etree.cElementTree as ElementTree EPHY_BOOKMARKS_FILE = "~/.gnome2/epiphany/bookmarks.rdf" def parse_epiphany_bookmarks(filename): """ Yield a sequence of bookmarks """ UNWANTED_SCHEME = set(("data", "javascript")) ns = u"{http://purl.org/rss/1.0/}" ITEM_NAME = ns + "item" HREF_NAME = ns + "link" TITLE_NAME = ns + "title" def get_item(entry): """Return a bookmarks item or None if not good""" title, href = None, None for child in entry.getchildren(): if child.tag == HREF_NAME: href = child.text if not href or href.split(":", 1)[0].lower() in UNWANTED_SCHEME: return None if child.tag == TITLE_NAME: title = child.text return title and href and (title, href) for event, entry in ElementTree.iterparse(filename): if entry.tag != ITEM_NAME: continue item = get_item(entry) if item: yield item if __name__ == '__main__': import os f = os.path.expanduser(EPHY_BOOKMARKS_FILE) print "Got ET # bookmarks:", len(list(parse_epiphany_bookmarks(f))) kupfer-v208/kupfer/plugin/evolution.py000066400000000000000000000064301176220042200202360ustar00rootroot00000000000000# -*- coding: UTF-8 -*- from __future__ import absolute_import __kupfer_name__ = _("Evolution") __kupfer_sources__ = ("ContactsSource", ) __kupfer_actions__ = ("NewMailAction", "SendFileByMail") __description__ = _("Evolution contacts") __version__ = "2010-02-14" __author__ = "Francesco Marella, Karol Będkowski" import evolution from kupfer.objects import Action from kupfer.objects import TextLeaf, UrlLeaf, RunnableLeaf, FileLeaf from kupfer import utils from kupfer.obj.apps import AppLeafContentMixin from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj.contacts import ContactLeaf, EmailContact, email_from_leaf class ComposeMail(RunnableLeaf): ''' Create new mail without recipient ''' def __init__(self): RunnableLeaf.__init__(self, name=_("Compose New Email")) def run(self): utils.spawn_async_notify_as("evolution.desktop", ['evolution', 'mailto:']) def get_description(self): return _("Compose a new message in Evolution") def get_icon_name(self): return "mail-message-new" class NewMailAction(Action): ''' Create new mail to selected leaf''' def __init__(self): Action.__init__(self, _('Compose Email')) def activate(self, leaf): self.activate_multiple((leaf, )) def activate_multiple(self, objects): recipients = ",".join(email_from_leaf(L) for L in objects) utils.spawn_async(["evolution", "mailto:%s" % recipients]) def get_icon_name(self): return "mail-message-new" def item_types(self): yield ContactLeaf # we can enter email yield TextLeaf yield UrlLeaf def valid_for_item(self, item): return bool(email_from_leaf(item)) class SendFileByMail (Action): '''Create new e-mail and attach selected file''' def __init__(self): Action.__init__(self, _('Send in Email To...')) def activate(self, obj, iobj): self.activate_multiple((obj, ), (iobj, )) def activate_multiple(self, objects, iobjects): recipients = ",".join(email_from_leaf(I) for I in iobjects) attachlist = ["attach=%s" % L.object for L in objects] utils.spawn_async(["evolution", "mailto:%s?%s" % (recipients, "&".join(attachlist))]) def item_types(self): yield FileLeaf def valid_for_item(self, item): return not item.is_dir() def requires_object(self): return True def object_types(self): yield ContactLeaf # we can enter email yield TextLeaf yield UrlLeaf def valid_object(self, iobj, for_item=None): return bool(email_from_leaf(iobj)) def get_description(self): return _("Compose new message in Evolution and attach file") def get_icon_name(self): return "document-send" class ContactsSource(AppLeafContentMixin, ToplevelGroupingSource): appleaf_content_id = 'evolution' def __init__(self, name=_("Evolution Address Book")): super(ContactsSource, self).__init__(name, "Contacts") def get_items(self): ebook_ = evolution.ebook.open_addressbook("default") if not ebook_: return for contact in ebook_.get_all_contacts(): name = contact.get_property("full-name") email = contact.get_property("email-1") if email: yield EmailContact(email, name) yield ComposeMail() def should_sort_lexically(self): return True def get_description(self): return _("Evolution contacts") def get_icon_name(self): return "evolution" def provides(self): yield RunnableLeaf yield ContactLeaf kupfer-v208/kupfer/plugin/favorites.py000066400000000000000000000101601176220042200202070ustar00rootroot00000000000000__kupfer_name__ = _("Favorites") __kupfer_sources__ = ("FavoritesSource", ) __kupfer_actions__ = ("AddFavorite", "RemoveFavorite", ) __description__ = _("Mark commonly used items and store objects for later use") __version__ = "2009-12-30" __author__ = "Ulrik Sverdrup " import weakref from kupfer.objects import Leaf, Source, Action from kupfer import puid # NOTE: core import from kupfer.core import learn class FavoritesSource (Source): """Keep a list of Leaves that the User may add and remove from""" instance = None def __init__(self): Source.__init__(self, _("Favorites")) ## these are default favorites for new users self.references = [ '', '', ] def config_save(self): references = [puid.get_unique_id(F) for F in self.favorites] return {"favorites": references, "version": self.version} def config_save_name(self): return __name__ def config_restore(self, state): self.references = state["favorites"] def _lookup_item(self, id_): itm = puid.resolve_unique_id(id_, excluding=self) if itm is None: return None return itm def _valid_item(self, itm): if hasattr(itm, "is_valid") and not itm.is_valid(): return False return True def _find_item(self, id_): itm = self._lookup_item(id_) if itm is None or not self._valid_item(itm): return None if puid.is_reference(id_): self.reference_table[id_] = itm else: self.persist_table[id_] = itm return itm def initialize(self): FavoritesSource.instance = self self.favorites = [] self.persist_table = {} self.reference_table = weakref.WeakValueDictionary() self.mark_for_update() def _update_items(self): self.favorites = [] self.mark_for_update() for id_ in self.references: if id_ in self.persist_table: self.favorites.append(self.persist_table[id_]) continue if id_ in self.reference_table: self.favorites.append(self.reference_table[id_]) continue itm = self._find_item(id_) if itm is None: self.output_debug("MISSING:", id_) else: self.favorites.append(itm) @classmethod def add(cls, itm): cls.instance._add(itm) def _add(self, itm): if self._has_item(itm): self._remove(itm) learn.add_favorite(itm) self.favorites.append(itm) self.references.append(puid.get_unique_id(itm)) self.mark_for_update() @classmethod def has_item(cls, itm): return cls.instance._has_item(itm) def _has_item(self, itm): return itm in set(self.favorites) @classmethod def remove(cls, itm): if cls.has_item(itm): cls.instance._remove(itm) def _remove(self, itm): learn.remove_favorite(itm) self.favorites.remove(itm) id_ = puid.get_unique_id(itm) if id_ in self.references: self.references.remove(id_) else: for key, val in self.persist_table.iteritems(): if val == itm: self.references.remove(key) self.persist_table.pop(key) break self.mark_for_update() def get_items(self): self._update_items() for fav in self.favorites: learn.add_favorite(fav) return reversed(self.favorites) def get_description(self): return _('Shelf of "Favorite" items') def get_icon_name(self): return "emblem-favorite" def provides(self): # returning nothing means it provides anything return () class AddFavorite (Action): # Rank down, since it applies everywhere rank_adjust = -15 def __init__(self): Action.__init__(self, _("Add to Favorites")) def activate(self, leaf): FavoritesSource.add(leaf) def item_types(self): return (Leaf, ) def valid_for_item(self, item): return not FavoritesSource.has_item(item) def get_description(self): return _("Add item to favorites shelf") def get_icon_name(self): return "list-add" class RemoveFavorite (Action): rank_adjust = -15 def __init__(self): Action.__init__(self, _("Remove from Favorites")) def activate(self, leaf): FavoritesSource.remove(leaf) def item_types(self): return (Leaf, ) def valid_for_item(self, item): return FavoritesSource.has_item(item) def get_description(self): return _("Remove item from favorites shelf") def get_icon_name(self): return "list-remove" kupfer-v208/kupfer/plugin/fileactions.py000066400000000000000000000117631176220042200205170ustar00rootroot00000000000000__kupfer_name__ = _("File Actions") __kupfer_sources__ = () __kupfer_text_sources__ = () __kupfer_actions__ = ( "MoveTo", "Rename", "CopyTo", ) __description__ = _("More file actions") __version__ = "" __author__ = "Ulrik" import gio import os # since "path" is a very generic name, you often forget.. from os import path as os_path from kupfer.objects import Action, FileLeaf, TextLeaf, TextSource from kupfer.objects import OperationError from kupfer import pretty def _good_destination(dpath, spath): """If directory path @dpath is a valid destination for file @spath to be copied or moved to. """ if not os_path.isdir(dpath): return False spath = os_path.normpath(spath) dpath = os_path.normpath(dpath) if not os.access(dpath, os.R_OK | os.W_OK | os.X_OK): return False cpfx = os_path.commonprefix((spath, dpath)) if os_path.samefile(dpath, spath) or cpfx == spath: return False return True class MoveTo (Action, pretty.OutputMixin): def __init__(self): Action.__init__(self, _("Move To...")) def has_result(self): return True def activate(self, leaf, obj): sfile = gio.File(leaf.object) bname = sfile.get_basename() dfile = gio.File(os_path.join(obj.object, bname)) try: ret = sfile.move(dfile, flags=gio.FILE_COPY_ALL_METADATA) self.output_debug("Move %s to %s (ret: %s)" % (sfile, dfile, ret)) except gio.Error, exc: raise OperationError(unicode(exc)) else: return FileLeaf(dfile.get_path()) def valid_for_item(self, item): return os.access(item.object, os.R_OK | os.W_OK) def requires_object(self): return True def item_types(self): yield FileLeaf def object_types(self): yield FileLeaf def valid_object(self, obj, for_item): return _good_destination(obj.object, for_item.object) def get_description(self): return _("Move file to new location") def get_icon_name(self): return "go-next" class RenameSource (TextSource): """A source for new names for a file; here we "autopropose" the source file's extension, but allow overriding it as well as renaming to without extension (either using a terminating space, or selecting the normal TextSource-returned string). """ def __init__(self, sourcefile): self.sourcefile = sourcefile name = _("Rename To...").rstrip(".") TextSource.__init__(self, name) def get_rank(self): # this should rank high return 100 def get_items(self, text): if not text: return basename = os_path.basename(self.sourcefile.object) root, ext = os_path.splitext(basename) t_root, t_ext = os_path.splitext(text) if text.endswith(u" "): yield TextLeaf(text.rstrip()) else: yield TextLeaf(text) if t_ext else TextLeaf(t_root + ext) def get_gicon(self): return self.sourcefile.get_gicon() class Rename (Action, pretty.OutputMixin): def __init__(self): Action.__init__(self, _("Rename To...")) def has_result(self): return True def activate(self, leaf, obj): sfile = gio.File(leaf.object) dest = os_path.join(os_path.dirname(leaf.object), obj.object) dfile = gio.File(dest) try: ret = sfile.move(dfile) self.output_debug("Move %s to %s (ret: %s)" % (sfile, dfile, ret)) except gio.Error, exc: raise OperationError(unicode(exc)) else: return FileLeaf(dfile.get_path()) def activate_multiple(self, objs, iobjs): raise NotImplementedError def item_types(self): yield FileLeaf def valid_for_item(self, item): return os.access(item.object, os.R_OK | os.W_OK) def requires_object(self): return True def object_types(self): yield TextLeaf def valid_object(self, obj, for_item): dest = os_path.join(os_path.dirname(for_item.object), obj.object) return os_path.exists(os_path.dirname(dest)) and \ not os_path.exists(dest) def object_source(self, for_item): return RenameSource(for_item) def get_description(self): return None class CopyTo (Action, pretty.OutputMixin): def __init__(self): Action.__init__(self, _("Copy To...")) def has_result(self): return True def _finish_callback(self, gfile, result, data): self.output_debug("Finished copying", gfile) dfile, ctx = data try: gfile.copy_finish(result) except gio.Error: ctx.register_late_error() else: ctx.register_late_result(FileLeaf(dfile.get_path())) def wants_context(self): return True def activate(self, leaf, iobj, ctx): sfile = gio.File(leaf.object) dpath = os_path.join(iobj.object, os_path.basename(leaf.object)) dfile = gio.File(dpath) try: ret = sfile.copy_async(dfile, self._finish_callback, user_data=(dfile, ctx), flags=gio.FILE_COPY_ALL_METADATA) self.output_debug("Copy %s to %s (ret: %s)" % (sfile, dfile, ret)) except gio.Error, exc: raise OperationError(unicode(exc)) def item_types(self): yield FileLeaf def valid_for_item(self, item): return (not item.is_dir()) and os.access(item.object, os.R_OK) def requires_object(self): return True def object_types(self): yield FileLeaf def valid_object(self, obj, for_item): return _good_destination(obj.object, for_item.object) def get_description(self): return _("Copy file to a chosen location") kupfer-v208/kupfer/plugin/filezilla.py000066400000000000000000000103461176220042200201660ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("Filezilla") __kupfer_sources__ = ("SitesSource", ) __kupfer_actions__ = ('OpeninFilezilla', ) __description__ = _("Show sites and handle ftp addresses by Filezilla") __version__ = "2010-04-13" __author__ = "Karol Będkowski " import os from xml.etree import cElementTree as ElementTree from kupfer.obj.apps import AppLeafContentMixin from kupfer.obj.base import Action from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj.helplib import FilesystemWatchMixin from kupfer.obj.objects import UrlLeaf, TextLeaf from kupfer.obj import hosts from kupfer import utils, icons _SITEMANAGER_DIR = os.path.expanduser("~/.filezilla/") _SITEMANAGER_FILE = "sitemanager.xml" FILEZILLA_SITE_KEY = "FILEZILLA_SITE" class Site(hosts.HostServiceLeaf): def __init__(self, name, host, descr, port, user, passwd, remotedir, entry_type): slots = {FILEZILLA_SITE_KEY: name, hosts.HOST_SERVICE_REMOTE_PATH_KEY: remotedir} hosts.HostServiceLeaf.__init__(self, name, host, 'ftp', descr, port, user, passwd, slots) self.entry_type = entry_type def get_gicon(self): return icons.ComposedIconSmall(self.get_icon_name(), "filezilla") class OpeninFilezilla(Action): def __init__(self): Action.__init__(self, _("Open Site with Filezilla")) def activate(self, leaf, iobj=None): if isinstance(leaf, (UrlLeaf, TextLeaf)): utils.spawn_async(['filezilla', leaf.object]) elif leaf.check_key(FILEZILLA_SITE_KEY): sessname = leaf.entry_type + '/' + leaf[hosts.HOST_NAME_KEY] utils.spawn_async(['filezilla', '-c', sessname]) else: url = ['ftp://'] if leaf.check_key(hosts.HOST_SERVICE_USER_KEY): url.append(leaf[hosts.HOST_SERVICE_USER_KEY]) if leaf.check_key(hosts.HOST_SERVICE_PASS_KEY): url.append(':') url.append(leaf[hosts.HOST_SERVICE_PASS_KEY]) url.append('@') url.append(leaf[hosts.HOST_ADDRESS_KEY]) if leaf.check_key(hosts.HOST_SERVICE_PORT_KEY): url.append(':') url.append(leaf[hosts.HOST_SERVICE_PORT_KEY]) if leaf.check_key(hosts.HOST_SERVICE_REMOTE_PATH_KEY): url.append(leaf[hosts.HOST_SERVICE_REMOTE_PATH_KEY]) utils.spawn_async(['filezilla', ''.join(url)]) def get_icon_name(self): return "filezilla" def item_types(self): yield hosts.HostLeaf yield UrlLeaf yield TextLeaf def valid_for_item(self, item): if isinstance(item, (UrlLeaf, TextLeaf)): return item.object.startswith('ftp') if item.check_key(hosts.HOST_SERVICE_NAME_KEY): if item[hosts.HOST_SERVICE_NAME_KEY] == 'ftp': return True return item.check_key(FILEZILLA_SITE_KEY) class SitesSource (AppLeafContentMixin, ToplevelGroupingSource, FilesystemWatchMixin): appleaf_content_id = "filezilla" def __init__(self, name=_("Filezilla Sites")): ToplevelGroupingSource.__init__(self, name, "hosts") def initialize(self): ToplevelGroupingSource.initialize(self) self.monitor_token = self.monitor_directories(_SITEMANAGER_DIR) def monitor_include_file(self, gfile): return gfile and gfile.get_basename() == _SITEMANAGER_FILE def get_items(self): sm_file_path = os.path.join(_SITEMANAGER_DIR, _SITEMANAGER_FILE) if not os.path.isfile(sm_file_path): return try: tree = ElementTree.parse(sm_file_path) for server in tree.find('Servers').findall('Server'): host = get_xml_element_text(server, 'Host') if not host: continue port = get_xml_element_text(server, 'Port') etype = get_xml_element_text(server, 'Type') user = get_xml_element_text(server, 'User') passwd = get_xml_element_text(server, 'Pass') name = get_xml_element_text(server, 'Name') descr = get_xml_element_text(server, 'Comments') remote = get_xml_element_text(server, 'RemoteDir') if not descr: descr = '%s@%s' % (user, host) if user else host yield Site(name, host, descr, port, user, passwd, remote, etype) except StandardError, err: self.output_error(err) def get_description(self): return _("Sites from Filezilla") def get_icon_name(self): return "filezilla" def provides(self): yield Site def get_xml_element_text(node, tag): '''Find @tag in childs of @node and return text from it. If @tag is not found - return None''' child = node.find(tag) if child is None: return None return child.text kupfer-v208/kupfer/plugin/firefox.py000066400000000000000000000073711176220042200176610ustar00rootroot00000000000000# encoding: utf-8 from __future__ import with_statement __kupfer_name__ = _("Firefox Bookmarks") __kupfer_sources__ = ("BookmarksSource", ) __description__ = _("Index of Firefox bookmarks") __version__ = "2010-05-14" __author__ = "Ulrik, William Friesen, Karol Będkowski" from contextlib import closing import os import itertools import sqlite3 from kupfer import plugin_support from kupfer.objects import Source from kupfer.objects import UrlLeaf from kupfer.obj.apps import AppLeafContentMixin from kupfer.obj.helplib import FilesystemWatchMixin from kupfer.plugin import firefox_support __kupfer_settings__ = plugin_support.PluginSettings( { "key": "load_history", "label": _("Include visited sites"), "type": bool, "value": True, }, ) class BookmarksSource (AppLeafContentMixin, Source, FilesystemWatchMixin): appleaf_content_id = ("firefox", "iceweasel") def __init__(self): super(BookmarksSource, self).__init__(_("Firefox Bookmarks")) self._history = [] self._version = 2 def initialize(self): ff_home = firefox_support.get_firefox_home_file('') self.monitor_token = self.monitor_directories(ff_home) def monitor_include_file(self, gfile): return gfile and gfile.get_basename() == 'lock' def _get_ffx3_history(self): """Query the firefox places database""" max_history_items = 25 fpath = firefox_support.get_firefox_home_file("places.sqlite") if not (fpath and os.path.isfile(fpath)): return try: self.output_debug("Reading history from", fpath) with closing(sqlite3.connect(fpath, timeout=1)) as conn: c = conn.cursor() c.execute("""SELECT DISTINCT(url), title FROM moz_places ORDER BY visit_count DESC LIMIT ?""", (max_history_items,)) return [UrlLeaf(url, title) for url, title in c] except sqlite3.Error: # Something is wrong with the database self.output_exc() def _get_ffx3_bookmarks(self, fpath): """Parse Firefox' .json bookmarks backups""" from kupfer.plugin import firefox3_support self.output_debug("Parsing", fpath) bookmarks = firefox3_support.get_bookmarks(fpath) for book in bookmarks: yield UrlLeaf(book["uri"], book["title"]) def _get_ffx2_bookmarks(self, fpath): """Parse Firefox' bookmarks.html""" self.output_debug("Parsing", fpath) bookmarks = firefox_support.get_bookmarks(fpath) for book in bookmarks: yield UrlLeaf(book["href"], book["title"]) def get_items(self): # try to update the history file if __kupfer_settings__['load_history']: history_items = self._get_ffx3_history() if history_items is not None: self._history = history_items else: self._history = [] # now try reading JSON bookmark backups, # with html bookmarks as backup dirloc = firefox_support.get_firefox_home_file("bookmarkbackups") fpath = None if dirloc: files = os.listdir(dirloc) if files: latest_file = (files.sort() or files)[-1] fpath = os.path.join(dirloc, latest_file) if fpath and os.path.splitext(fpath)[-1].lower() == ".json": try: json_bookmarks = list(self._get_ffx3_bookmarks(fpath)) except Exception: # Catch JSON parse errors # different exception for cjson and json self.output_exc() else: return itertools.chain(self._history, json_bookmarks) fpath = firefox_support.get_firefox_home_file("bookmarks.html") if fpath: html_bookmarks = self._get_ffx2_bookmarks(fpath) else: self.output_error("No firefox bookmarks file found") html_bookmarks = [] return itertools.chain(self._history, html_bookmarks) def get_description(self): return _("Index of Firefox bookmarks") def get_gicon(self): return self.get_leaf_repr() and self.get_leaf_repr().get_gicon() def get_icon_name(self): return "web-browser" def provides(self): yield UrlLeaf kupfer-v208/kupfer/plugin/firefox3_support.py000066400000000000000000000045771176220042200215450ustar00rootroot00000000000000from __future__ import with_statement try: import cjson json_decoder = cjson.decode except ImportError: import json json_decoder = json.loads def get_bookmarks(bookmarks_file): # construct and configure the parser if not bookmarks_file: return [] with open(bookmarks_file) as f: content = f.read().decode("UTF-8") # HACK: Firefox' JSON writer leaves a trailing comma # HACK: at the end of the array, which no parser accepts if content.endswith(u"}]},]}"): content = content[:-6] + u"}]}]}" root = json_decoder(content) # make a dictionary of unique bookmarks bmap = {} def bmap_add(bmark, bmap): if bmark["id"] not in bmap: bmap[bmark["id"]] = bmark def bmap_add_tag(id_, tag, bmap): if not "tags" in bmap[id_]: bmap[id_]["tags"] = [] else: print "Already in, gets tag:", tag bmap[id_]["tags"].append(tag) MOZ_CONTAINER = "text/x-moz-place-container" MOZ_PLACE = "text/x-moz-place" UNWANTED_SCHEME = ("data", "place", "javascript") def is_container(ch): return ch["type"] == MOZ_CONTAINER def is_bookmark(ch): return ch["type"] == MOZ_PLACE and ch.get("uri") def is_good(ch): return not ch["uri"].split(":", 1)[0] in UNWANTED_SCHEME # find toplevel subfolders and tag folders catalogs = [] tagcatalogs = [] for child in root["children"]: if child.get("root") == "tagsFolder": tagcatalogs.extend(child["children"]) elif child.get("root"): catalogs.append(child) # visit all subfolders recursively visited = set() while catalogs: next = catalogs.pop() if next["id"] in visited: continue for child in next["children"]: if is_container(child): catalogs.append(child) tagcatalogs.append(child) elif is_bookmark(child) and is_good(child): bmap_add(child, bmap) visited.add(next["id"]) # visit all tag folders for tag in tagcatalogs: for bmark in tag["children"]: if is_bookmark(bmark) and is_good(bmark): bmap_add(bmark, bmap) bmap_add_tag(bmark["id"], tag["title"], bmap) return bmap.values() if __name__ == '__main__': import os import firefox_support dirloc = firefox_support.get_firefox_home_file("bookmarkbackups") fpath = None if dirloc: files = os.listdir(dirloc) if files: latest_file = (files.sort() or files)[-1] fpath = os.path.join(dirloc, latest_file) if fpath and os.path.splitext(fpath)[-1].lower() == ".json": print "Parsed # bookmarks:", len(list(get_bookmarks(fpath))) kupfer-v208/kupfer/plugin/firefox_support.py000066400000000000000000000077741176220042200214640ustar00rootroot00000000000000# -*- coding: UTF-8 -*- """ Original file much thanks to http://www.kylo.net/deli.py.txt Modifications released under GPL v2 (or any later) Ulrik Sverdrup """ import os from ConfigParser import RawConfigParser from HTMLParser import HTMLParser def get_firefox_home_file(needed_file): for firefox_dir in (os.path.expanduser(p) for p in ("~/.mozilla/firefox-3.5/", "~/.mozilla/firefox/")): if os.path.exists(firefox_dir): break else: # no break return None # here we leak firefox_dir config = RawConfigParser({"Default" : 0}) config.read(os.path.join(firefox_dir, "profiles.ini")) path = None for section in config.sections(): if config.has_option(section, "Default") and config.get(section, "Default") == "1": path = config.get (section, "Path") break elif path == None and config.has_option(section, "Path"): path = config.get (section, "Path") if path == None: return "" if path.startswith("/"): return os.path.join(path, needed_file) return os.path.join(firefox_dir, path, needed_file) class BookmarksParser(HTMLParser): def __init__(self): # this is python: explicitly invoke base class constructor HTMLParser.__init__(self) self.inH3 = False self.inA = False self.tagCount = 0 self.tags = [] self.currentTag = "" self.href = "" self.description = "" self.ignore = "" self.debug = False self.all_items = [] def setBaseTag(self, baseTag): self.tags.append(baseTag) def setIgnoreUrls(self, ignore): self.ignore = ignore # remove white space # remove apostrophes, quote, double-quotes, colons, commas def normalizeText(self, text): text = text.replace('\'', '') text = text.replace('"', '') text = text.replace('`', '') text = text.replace(':', '') text = text.replace(',', '') text = text.replace(' ', '') text = text.replace(' ', '') return text def handle_starttag(self, tag, attrs): if tag == "a": self.inA = True for attr in attrs: if attr[0] == "href": self.href = attr[1] if tag == "h3": self.inH3 = True self.tagCount += 1 if tag == "dl": pass #print "Entering folder list; tags are", self.tags def handle_endtag(self, tag): if tag == "h3": self.tags.append(self.currentTag) self.currentTag = "" self.inH3 = False if tag == "a": if self.debug == True: print print "href =", self.href print "description =", self.description print "tags =", self.tags # validate href validHref = True if len(self.href) == 0: validHref = False if not self.href.split(":")[0] in ["http", "https", "news", "ftp"]: validHref = False if self.href in self.ignore: validHref = False # actually post here, make sure there's a url to post if validHref: bookmark = { "href" : self.href, "title": self.description, "tags" : self.tags } self.all_items.append(bookmark) self.href = "" self.description = "" self.inA = False # exiting a dl means end of a bookmarks folder, pop the last tag off if tag == "dl": self.tags = self.tags[:-1] # handle any data: note that this will miss the "escaped" stuff # fix this by adding handle_charref, etc methods def handle_data(self, data): if self.inH3: self.currentTag += self.normalizeText(data) if self.inA: self.description += data def get_bookmarks(bookmarks_file): """ Return a list of bookmarks (dictionaries) each bookmark has the keys: href: URL title: description tags: list of tags/the folder """ # construct and configure the parser if not bookmarks_file: return [] parser = BookmarksParser() # initiate the parse; this will submit requests to delicious parser.feed(open(bookmarks_file).read()) # cleanup parser.close() return parser.all_items def main(): # go forth fileloc = get_firefox_home_file("bookmarks.html") print fileloc print get_bookmarks(fileloc) if __name__ == "__main__": main() kupfer-v208/kupfer/plugin/gajim.py000066400000000000000000000132171176220042200173020ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("Gajim") __kupfer_sources__ = ("ContactsSource", ) __kupfer_actions__ = ("ChangeStatus", 'OpenChat') __description__ = _("Access to Gajim Contacts") __version__ = "2011-05-12" __author__ = "Karol Będkowski " import dbus from kupfer import icons from kupfer import plugin_support from kupfer import pretty from kupfer.objects import Leaf, Action, Source, AppLeaf from kupfer.weaklib import dbus_signal_connect_weakly from kupfer.obj.helplib import PicklingHelperMixin from kupfer.obj.apps import AppLeafContentMixin from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj.contacts import ContactLeaf, JabberContact, JABBER_JID_KEY plugin_support.check_dbus_connection() _STATUSES = { 'online': _('Available'), 'chat': _('Free for Chat'), 'away': _('Away'), 'xa': _('Not Available'), 'dnd': _('Busy'), 'invisible':_('Invisible'), 'offline': _('Offline') } _SERVICE_NAME = 'org.gajim.dbus' _OBJECT_NAME = '/org/gajim/dbus/RemoteObject' _IFACE_NAME = 'org.gajim.dbus.RemoteInterface' GAJIM_ACCOUNT_KEY = "GAJIM_ACCOUNT" def _create_dbus_connection(activate=False): ''' Create dbus connection to Gajim @activate: true=starts gajim if not running ''' interface = None sbus = dbus.SessionBus() try: #check for running gajim (code from note.py) proxy_obj = sbus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(proxy_obj, 'org.freedesktop.DBus') if activate or dbus_iface.NameHasOwner('org.gajim.dbus'): obj = sbus.get_object('org.gajim.dbus', '/org/gajim/dbus/RemoteObject') if obj: interface = dbus.Interface(obj, 'org.gajim.dbus.RemoteInterface') except dbus.exceptions.DBusException, err: pretty.print_debug(err) return interface def _check_gajim_version(conn): ''' get gajim version. return list lika [0.12.5] ''' prefs = conn.prefs_list() version = prefs['version'] tversion = map(int, version.split('.')) if len(tversion) == 2: tversion += [0] elif len(tversion) > 3: # i.e. daily builds tversion = tversion[:3] return tversion class GajimContact(JabberContact): def __init__(self, jid, name, status, resources, account): gajim_slots = { GAJIM_ACCOUNT_KEY: account } JabberContact.__init__(self, jid, name, status, resources, gajim_slots) def repr_key(self): return "".join((self.object[JABBER_JID_KEY], self.object[GAJIM_ACCOUNT_KEY])) def get_gicon(self): return icons.ComposedIconSmall(self.get_icon_name(), "gajim") class AccountStatus(Leaf): pass class OpenChat(Action): def __init__(self): Action.__init__(self, _('Open Chat')) def activate(self, leaf): interface = _create_dbus_connection() jid = JABBER_JID_KEY in leaf and leaf[JABBER_JID_KEY] account = leaf[GAJIM_ACCOUNT_KEY] if interface is not None: vmaj,vmin,vbuild = _check_gajim_version(interface) if vmaj == 0 and vmin < 13: interface.open_chat(jid, account) else: interface.open_chat(jid, account, '') def get_icon_name(self): return 'gajim' def item_types(self): yield ContactLeaf def valid_for_item(self, item): return GAJIM_ACCOUNT_KEY in item and item[GAJIM_ACCOUNT_KEY] class ChangeStatus(Action): ''' Change global status ''' rank_adjust = 5 def __init__(self): Action.__init__(self, _('Change Global Status To...')) def activate(self, leaf, iobj): interface = _create_dbus_connection((iobj.object != 'offline')) if interface: interface.change_status(iobj.object, '', '') def item_types(self): yield AppLeaf def valid_for_item(self, leaf): return leaf.get_id() == 'gajim' def requires_object(self): return True def object_types(self): yield AccountStatus def object_source(self, for_item=None): return StatusSource() class ContactsSource(AppLeafContentMixin, ToplevelGroupingSource, PicklingHelperMixin): ''' Get contacts from all on-line accounts in Gajim via DBus ''' appleaf_content_id = 'gajim' def __init__(self, name=_('Gajim Contacts')): super(ContactsSource, self).__init__(name, "Contacts") self._version = 2 self.unpickle_finish() def pickle_prepare(self): self._contacts = [] def unpickle_finish(self): self.mark_for_update() self._contacts = [] def initialize(self): ToplevelGroupingSource.initialize(self) # listen to d-bus signals for updates signals = [ "ContactAbsence", "ContactPresence", "ContactStatus", "AccountPresence", "Roster", "RosterInfo", ] session_bus = dbus.Bus() for signal in signals: dbus_signal_connect_weakly(session_bus, signal, self._signal_update, dbus_interface=_IFACE_NAME) def _signal_update(self, *args): """catch all notifications to mark for update""" self.mark_for_update() def get_items(self): interface = _create_dbus_connection() if interface is not None: self._contacts = list(self._find_all_contacts(interface)) else: self._contacts = [] return self._contacts def _find_all_contacts(self, interface): for account in interface.list_accounts(): if interface.get_status(account) == 'offline': continue for contact in interface.list_contacts(account): name = contact['name'] or contact['jid'] resources = contact['resources'][0][0] if contact['resources'] else u'' jc = GajimContact(contact['jid'], name, \ _STATUSES.get(contact['show'], contact['show']), \ resources, account) yield jc def get_icon_name(self): return 'gajim' def provides(self): yield ContactLeaf class StatusSource(Source): def __init__(self): Source.__init__(self, _("Gajim Account Status")) def get_items(self): for status, name in _STATUSES.iteritems(): yield AccountStatus(status, name) def provides(self): yield AccountStatus kupfer-v208/kupfer/plugin/glob.py000066400000000000000000000033601176220042200171340ustar00rootroot00000000000000from __future__ import absolute_import # TRANS: "Glob" is the matching files like a shell with "*.py" etc. __kupfer_name__ = _("Glob") __kupfer_actions__ = ("Glob",) __description__ = "" __version__ = "" __author__ = "Ulrik" import fnmatch import re from kupfer.objects import Action, TextLeaf, TextSource, Leaf, OperationError from kupfer.obj.compose import MultipleLeaf class Glob (Action): def __init__(self): Action.__init__(self, _("Glob")) def activate(self, obj, iobj): return self.activate_multiple((obj,), (iobj, )) def activate_multiple(self, objects, iobjects): ## Do case-insentive matching ## As a special case, understand '**/' prefix as recurive def get_subcatalog_matches(subcatalog, pat, recursive, paths): if len(paths) > 1000: raise OperationError("Globbing wayy too many objects") for content in subcatalog.content_source().get_leaves(): if recursive and content.has_content(): get_subcatalog_matches(content, pat, recursive, paths) else: if re.match(pat, unicode(content), flags=re.I): paths.append(content) paths = [] for iobj in iobjects: glob = iobj.object if glob.startswith('**/'): glob = glob[3:] recursive = True else: recursive = False pat = fnmatch.translate(glob) for obj in objects: get_subcatalog_matches(obj, pat, recursive, paths) if paths: return MultipleLeaf(paths) def has_result(self): return True def item_types(self): yield Leaf def valid_for_item(self, item): return item.has_content() def requires_object(self): return True def object_types(self): yield TextLeaf def object_source(self, for_item=None): return TextSource() def valid_object(self, iobj, for_item): return (u'*' in iobj.object) or (u'?' in iobj.object) kupfer-v208/kupfer/plugin/gmail/000077500000000000000000000000001176220042200167265ustar00rootroot00000000000000kupfer-v208/kupfer/plugin/gmail/COPYING000066400000000000000000000002521176220042200177600ustar00rootroot00000000000000gmail.svg Downloaded from: http://unit66.deviantart.com/art/Tango-Google-Icon-Set-66470842 Author: ~Unit66 License: Creative Commons Attribution-Share Alike 3.0 License. kupfer-v208/kupfer/plugin/gmail/__init__.py000066400000000000000000000203621176220042200210420ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("Gmail") __kupfer_sources__ = ("GoogleContactsSource", ) __kupfer_actions__ = ('NewMailAction', ) __description__ = _("Load contacts and compose new email in Gmail") __version__ = "2011-03-06" __author__ = ("Karol Będkowski , " "Adi Sieker ") import urllib import time import gdata.service import gdata.contacts.service from kupfer.objects import Action, TextLeaf, UrlLeaf from kupfer.obj.special import PleaseConfigureLeaf, InvalidCredentialsLeaf from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj import contacts from kupfer import plugin_support, pretty, utils, icons, kupferstring plugin_support.check_keyring_support() __kupfer_settings__ = plugin_support.PluginSettings( { 'key': 'userpass', 'label': '', 'type': plugin_support.UserNamePassword, 'value': '', }, { 'key': 'loadicons', 'label': _("Load contacts' pictures"), 'type': bool, 'value': True, }, { 'key': 'loadadditional', 'label': _("Load additional information"), 'type': bool, 'value': True, }, ) GMAIL_NEW_MAIL_URL = \ "https://mail.google.com/mail/?view=cm&ui=2&tf=0&to=%(emails)s&fs=1" GMAIL_EDIT_CONTACT_URL = "https://mail.google.com/mail/#contact/%(contact)s" REL_LIST_EMAIL = {gdata.contacts.REL_WORK: _("Work email"), gdata.contacts.REL_HOME: _("Home email"), gdata.contacts.REL_OTHER: _("Other email"), } REL_LIST_ADDRESS = {gdata.contacts.REL_WORK: _("Work address"), gdata.contacts.REL_HOME: _("Home address"), gdata.contacts.REL_OTHER: _("Other address"), } REL_LIST_PHONE = {gdata.contacts.PHONE_CAR: _("Car phone"), gdata.contacts.PHONE_FAX: _("Fax"), gdata.contacts.PHONE_GENERAL: _("General"), gdata.contacts.PHONE_HOME: _("Home phone"), gdata.contacts.PHONE_HOME_FAX: _("Home fax"), gdata.contacts.PHONE_INTERNAL: _("Internal phone"), gdata.contacts.PHONE_MOBILE: _("Mobile"), gdata.contacts.PHONE_OTHER: _("Other"), gdata.contacts.PHONE_VOIP: _("VOIP"), gdata.contacts.PHONE_WORK: _("Work phone"), gdata.contacts.PHONE_WORK_FAX: _("Work fax"), } REL_LIST_IM = {gdata.contacts.IM_AIM: contacts.AIMContact, gdata.contacts.IM_GOOGLE_TALK: contacts.GoogleTalkContact, gdata.contacts.IM_ICQ: contacts.ICQContact, gdata.contacts.IM_JABBER: contacts.JabberContact, gdata.contacts.IM_MSN: contacts.MSNContact, gdata.contacts.IM_QQ: contacts.QQContact, gdata.contacts.IM_YAHOO: contacts.YahooContact, } # older version of gdata don't have IM_SKYPE if hasattr(gdata.contacts, 'IM_SKYPE'): REL_LIST_IM[gdata.contacts.IM_SKYPE] = contacts.SkypeContact def is_plugin_configured(): ''' Check if plugin is configured (user name and password is configured) ''' upass = __kupfer_settings__['userpass'] return bool(upass and upass.username and upass.password) class NewMailAction(Action): ''' Create new mail to selected leaf''' def __init__(self): Action.__init__(self, _('Compose Email in Gmail')) def activate(self, obj): self.activate_multiple((obj, )) def activate_multiple(self, objects): recipients = ",".join(urllib.quote(contacts.email_from_leaf(L)) for L in objects) url = GMAIL_NEW_MAIL_URL % dict(emails=recipients) utils.show_url(url) def get_gicon(self): return icons.ComposedIcon("mail-message-new", "gmail") def item_types(self): yield contacts.ContactLeaf # we can enter email yield TextLeaf yield UrlLeaf def valid_for_item(self, item): return bool(contacts.email_from_leaf(item)) def get_description(self): return _("Open web browser and compose new email in Gmail") class EditContactAction(Action): ''' Edit contact in Gmail''' def __init__(self): Action.__init__(self, _('Edit Contact in Gmail')) def activate(self, obj): url = GMAIL_EDIT_CONTACT_URL % dict(contact=obj.google_contact_id) utils.show_url(url) def get_icon_name(self): return 'document-properties' def get_description(self): return _("Open web browser and edit contact in Gmail") def get_gclient(): ''' create gdata client object and login do google service ''' if not is_plugin_configured(): return None upass = __kupfer_settings__['userpass'] gd_client = gdata.contacts.service.ContactsService() gd_client.email = upass.username gd_client.password = upass.password gd_client.source = 'kupfer.gmail' gd_client.ProgrammaticLogin() return gd_client def get_contacts(): ''' load all contacts ''' pretty.print_debug(__name__, 'get_contacts start') start_time = time.time() num_contacts = 0 try: gd_client = get_gclient() if gd_client is None: return query = gdata.contacts.service.ContactsQuery() query.max_results = 9999 # load all contacts for entry in gd_client.GetContactsFeed(query.ToUri()).entry: if not entry.email: # skip contacts without email continue num_contacts += 1 common_name = kupferstring.tounicode(entry.title.text) primary_mail_key = {contacts.EMAIL_KEY: entry.email[0].address} contact_id = None try: contact_id = entry.id.text.split('/')[-1] except: pass image = None if __kupfer_settings__['loadicons']: # Sometimes GetPhoto can't find appropriate image (404) try: image = gd_client.GetPhoto(entry) except: pass for email in entry.email: if email.address: email_str = email.address yield GoogleContact(email_str, common_name or email_str, image, contact_id, REL_LIST_EMAIL.get(email.rel)) if not __kupfer_settings__['loadadditional']: continue for phone in entry.phone_number: if phone.text: yield contacts.PhoneContact(phone.text, common_name, REL_LIST_PHONE.get(phone.rel), slots=primary_mail_key, image=image) for address in entry.postal_address: if address.text: yield contacts.AddressContact(address.text, common_name, REL_LIST_PHONE.get(address.rel), slots=primary_mail_key, image=image) for im in entry.im: im_id = im.text or im.address protocol = im.protocol or im.rel if im_id and protocol in REL_LIST_IM: yield REL_LIST_IM[protocol](im_id, common_name, slots=primary_mail_key, image=image) except (gdata.service.BadAuthentication, gdata.service.CaptchaRequired), err: pretty.print_error(__name__, 'get_contacts error', 'authentication error', err) yield InvalidCredentialsLeaf(__name__, __kupfer_name__) except gdata.service.Error, err: pretty.print_error(__name__, 'get_contacts error', err) else: pretty.print_debug(__name__, 'get_contacts finished; load contacts:', num_contacts, 'in:', time.time() - start_time, 'load_icons:', __kupfer_settings__['loadicons']) class GoogleContact(contacts.EmailContact): def __init__(self, email, name, image, contact_id, email_type): contacts.EmailContact.__init__(self, email, name, image) self.email_type = email_type self.google_contact_id = contact_id def get_description(self): if self.email_type: return '%s: %s' % (self.email_type, self.object[contacts.EMAIL_KEY]) return contacts.EmailContact.get_description(self) def get_actions(self): if self.google_contact_id: yield EditContactAction() class GoogleContactsSource(ToplevelGroupingSource): source_user_reloadable = True def __init__(self, name=_("Gmail")): super(GoogleContactsSource, self).__init__(name, "Contacts") self._version = 5 self._contacts = [] def initialize(self): ToplevelGroupingSource.initialize(self) __kupfer_settings__.connect("plugin-setting-changed", self._changed) def _changed(self, settings, key, value): if key == "userpass": self._contacts = [] self.mark_for_update() def get_items(self): if is_plugin_configured(): return self._contacts return [PleaseConfigureLeaf(__name__, __kupfer_name__)] def get_items_forced(self): if is_plugin_configured(): self._contacts = list(get_contacts()) return self._contacts return [PleaseConfigureLeaf(__name__, __kupfer_name__)] def should_sort_lexically(self): return True def get_description(self): return _("Contacts from Google services (Gmail)") def get_icon_name(self): return "gmail" kupfer-v208/kupfer/plugin/gmail/gmail.svg000066400000000000000000000421261176220042200205450ustar00rootroot00000000000000 image/svg+xml kupfer-v208/kupfer/plugin/gmail/icon-list000066400000000000000000000000321176220042200205450ustar00rootroot00000000000000# ID File gmail gmail.svg kupfer-v208/kupfer/plugin/gnome_terminal.py000066400000000000000000000032571176220042200212160ustar00rootroot00000000000000__kupfer_name__ = _("GNOME Terminal Profiles") __kupfer_sources__ = ("SessionsSource", ) __description__ = _("Launch GNOME Terminal profiles") __version__ = "" __author__ = "Chmouel Boudjnah " import os import gconf import glib from kupfer.objects import Leaf, Action from kupfer.obj.apps import ApplicationSource from kupfer import utils, icons GCONF_KEY = "/apps/gnome-terminal/profiles" class Terminal(Leaf): """ Leaf represent profile saved in GNOME Terminal""" def __init__(self, name): Leaf.__init__(self, name, name) def get_actions(self): yield OpenSession() def get_icon_name(self): return "terminal" class OpenSession(Action): """ Opens GNOME Terminal profile """ def __init__(self): Action.__init__(self, _("Open")) def wants_context(self): return True def activate(self, leaf, ctx): utils.spawn_async(["gnome-terminal", "--profile=%s" % leaf.object, "--display=%s" % ctx.environment.get_display()], in_dir=os.path.expanduser("~")) def get_gicon(self): return icons.ComposedIcon("gtk-execute", "terminal") class SessionsSource(ApplicationSource): """ Yield GNOME Terminal profiles """ appleaf_content_id = 'gnome-terminal' def __init__(self): ApplicationSource.__init__(self, name=_("GNOME Terminal Profiles")) def get_items(self): gc = gconf.client_get_default() try: if not gc.dir_exists(GCONF_KEY): return for entry in gc.all_dirs(GCONF_KEY): yield Terminal(gc.get_string("%s/visible_name" % entry)) except glib.GError, err: self.output_error(err) def should_sort_lexically(self): return True def get_icon_name(self): return "terminal" def provides(self): yield Terminal kupfer-v208/kupfer/plugin/google_picasa/000077500000000000000000000000001176220042200204315ustar00rootroot00000000000000kupfer-v208/kupfer/plugin/google_picasa/COPYING000066400000000000000000000002541176220042200214650ustar00rootroot00000000000000picasa.svg Downloaded from: http://unit66.deviantart.com/art/Tango-Google-Icon-Set-66470842 Author: ~Unit66 License: Creative Commons Attribution-Share Alike 3.0 License. kupfer-v208/kupfer/plugin/google_picasa/__init__.py000066400000000000000000000305671176220042200225550ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("Google Picasa") __kupfer_sources__ = ("PicasaUsersSource", ) __kupfer_actions__ = ('UploadFileToPicasa', 'UploadDirToPicasa') __description__ = _("Show albums and upload files to Picasa") __version__ = "2010-04-06" __author__ = "Karol Będkowski " import os.path import time import gdata.service import gdata.photos.service from kupfer.objects import Action, FileLeaf, TextLeaf from kupfer.objects import UrlLeaf, Source from kupfer.obj.special import PleaseConfigureLeaf, InvalidCredentialsLeaf from kupfer import plugin_support, pretty, icons from kupfer.ui.progress_dialog import ProgressDialogController from kupfer import kupferstring from kupfer import utils from kupfer import task plugin_support.check_keyring_support() __kupfer_settings__ = plugin_support.PluginSettings( { 'key': 'userpass', 'label': '', 'type': plugin_support.UserNamePassword, 'value': "", }, { 'key': 'showusers', 'label': _('Users to show: (,-separated)'), 'type': str, 'value': '', }, { 'key': 'loadicons', 'label': _('Load user and album icons'), 'type': bool, 'value': True, }, ) ALBUM_URL = '/data/feed/api/user/%s/albumid/%s' USER_URL = 'http://picasaweb.google.com/%(user)s' def is_plugin_configured(): upass = __kupfer_settings__['userpass'] return bool(upass and upass.username and upass.password) def valid_file(filepath): ''' check is file supported by picasa ''' extension = os.path.splitext(filepath)[1].lower() return extension in ('.jpg', '.jpeg', '.png', '.gif') class UploadTask(task.ThreadTask): """ Uploading files to picasa """ def __init__(self): task.ThreadTask.__init__(self) self._files_to_upload = [] self._files_albums_count = 0 def add_files_to_existing_album(self, files, album_id): ''' upload files to existing album. @files: list of local files (full path) @album_id: picasa album id ''' self._files_to_upload.append((files, album_id, None)) self._files_albums_count += len(files) def add_files_to_new_album(self, files, album_name): ''' create new album and upload files. @files: list of local files (full path) @album_name: new album name ''' self._files_to_upload.append((files, None, album_name)) self._files_albums_count += len(files) + 1 def thread_do(self): gd_client = picasa_login() if not gd_client: return progress_dialog = ProgressDialogController( _("Uploading Pictures"), _("Uploading pictures to Picasa Web Album"), max_value=self._files_albums_count) progress_dialog.show() try: upass = __kupfer_settings__['userpass'] progress = 0 for files, album_id, album_name in self._files_to_upload: # create album if album_id is None: progress_dialog.update(progress, _("Creating album:"), album_name) album = gd_client.InsertAlbum(title=album_name, summary=_('Album created by Kupfer')) album_id = album.gphoto_id.text progress += 1 # send files album_url = ALBUM_URL % (upass.username, album_id) for filename in files: pretty.print_debug(__name__, 'upload: sending', filename) progress_dialog.update(progress, _('File:'), utils.get_display_path_for_bytestring(filename)) if progress_dialog.aborted: pretty.print_debug(__name__, 'upload: abort') break # send file gd_client.InsertPhotoSimple(album_url, os.path.basename(filename), '', filename) pretty.print_debug(__name__, 'upload: file sended', filename) progress += 1 except (gdata.service.Error, gdata.photos.service.GooglePhotosException), \ err: pretty.print_error(__name__, 'upload error', err) finally: progress_dialog.hide() def thread_finish(self): pass def picasa_login(): if not is_plugin_configured(): return None gd_client = None try: upass = __kupfer_settings__['userpass'] gd_client = gdata.photos.service.PhotosService() gd_client.email = upass.username gd_client.password = upass.password gd_client.source = 'kupfer-google_picasa' gd_client.ProgrammaticLogin() except (gdata.service.BadAuthentication, gdata.service.CaptchaRequired), err: pretty.print_error(__name__, 'picasa_login', 'authentication error', err) gd_client = None return gd_client def get_thumb(gd_client, thumb_url): ''' Load thumb from web ''' thumb = None if thumb_url: thumb_media = gd_client.GetMedia(thumb_url) if thumb_media: thumb = thumb_media.file_handle.read() return thumb def get_user_leaf(gd_client, user_name): ''' Create PicasaUser obj for given @user_name. ''' leaf = None try: user_info = gd_client.GetContacts(user_name) except gdata.photos.service.GooglePhotosException, err: pretty.print_info(__name__, 'get_uers_leaf', err) else: thumb = None if __kupfer_settings__['loadicons']: thumb = get_thumb(gd_client, user_info.thumbnail.text) user_url = USER_URL % dict(user=user_info.user.text) leaf = PicasaUser(user_url, kupferstring.tounicode(user_info.nickname.text), thumb) return leaf class PicasaDataCache(): data = [] @classmethod def get_albums(cls, force=False): ''' Load user albums, and albums users defined in 'showusers' setting. ''' pretty.print_debug(__name__, 'get_albums', str(force)) if not force: return cls.data start_time = time.time() gd_client = picasa_login() if not gd_client: return [InvalidCredentialsLeaf(__name__, __kupfer_name__)] pusers = [] try: user = __kupfer_settings__['userpass'].username show_users = (__kupfer_settings__['showusers'] or '') user_names = [U.strip() for U in show_users.split(',') if U.strip()] if user not in user_names: user_names.append(user) for user_name in user_names: pretty.print_debug(__name__, 'get_albums: get album', user_name) # get user info picasa_user_leaf = get_user_leaf(gd_client, user_name) if picasa_user_leaf is None: continue picasa_user_leaf.my_albums = (user_name == user) # mark my albums # get albums user_albums = [] for album in gd_client.GetUserFeed(user=user_name).entry: # get album thumbnail: thumb = None if album.media.thumbnail and __kupfer_settings__['loadicons']: thumb = get_thumb(gd_client, album.media.thumbnail[0].url) name = kupferstring.tounicode(album.title.text) album = PicasaAlbum(album.GetAlternateLink().href, name, album.numphotos.text, album.gphoto_id.text, thumb, kupferstring.tounicode(user_name)) user_albums.append(album) picasa_user_leaf.update_albums(user_albums) pusers.append(picasa_user_leaf) except gdata.service.Error, err: pretty.print_error(__name__, 'get_albums', err) pretty.print_debug(__name__, 'get_albums finished', 'loaded: ', len(pusers), str(time.time()-start_time)) cls.data = pusers return pusers def _get_valid_files_in_dir(dir_path): ''' get all files acceptable by picasa in given directory ''' files = [os.path.join(dir_path, filename) for filename in os.listdir(dir_path) if valid_file(filename)] return files class PicasaUser(UrlLeaf): ''' Leaf represent user from Picasa ''' def __init__(self, url, name, thumb=None, albums=None): UrlLeaf.__init__(self, url, name) # list of user albums [PicasaAlbum] self.update_albums(albums) self.thumb = thumb self.my_albums = False def update_albums(self, albums): self.albums = albums or [] albums_count = len(self.albums) self.description = ngettext("One album", "%(num)d albums", albums_count) % {"num": albums_count} def has_content(self): return bool(self.albums) def content_source(self, alternate=False): return PicasaAlbumSource(self) def get_thumbnail(self, width, height): if self.thumb: return icons.get_pixbuf_from_data(self.thumb, width, height) return UrlLeaf.get_thumbnail(self, width, height) def get_gicon(self): return icons.ComposedIconSmall("stock_person", "picasa") def get_description(self): return self.description class PicasaAlbum(UrlLeaf): ''' Leaf represent single album in Picasa ''' def __init__(self, url, name, pict_count, album_id, thumb, user): UrlLeaf.__init__(self, url, name) self.album_id = album_id self.thumb = thumb photos_info = ngettext("one photo", "%(num)s photos", int(pict_count)) % {"num": pict_count} self.description = ': '.join((user, photos_info)) def get_description(self): return self.description def get_thumbnail(self, width, height): if self.thumb: return icons.get_pixbuf_from_data(self.thumb, width, height) return UrlLeaf.get_thumbnail(self, width, height) def get_gicon(self): return icons.ComposedIconSmall(self.get_icon_name(), "picasa") class UploadFileToPicasa(Action): ''' upload selected files or files from selected dirs into existing album or new album (by enter new name) ''' def __init__(self): Action.__init__(self, _('Upload to Picasa Album...')) def activate(self, obj, iobj): return self.activate_multiple((obj, ), (iobj, )) def activate_multiple(self, objects, iobjects): utask = UploadTask() files = [] for obj in objects: if obj.is_dir(): files.extend(_get_valid_files_in_dir(obj.object)) else: files.append(obj.object) for iobj in iobjects: if isinstance(iobj, PicasaAlbum): utask.add_files_to_existing_album(files, iobj.album_id) else: utask.add_files_to_new_album(files, iobj.object) return utask def is_async(self): return True def get_icon_name(self): return "document-save" def item_types(self): yield FileLeaf def valid_for_item(self, item): return (valid_file(item.object) or item.is_dir()) \ and is_plugin_configured() def requires_object(self): return True def object_types(self): yield PicasaAlbum yield TextLeaf def object_source(self, for_item=None): return PicasaPrivAlbumsSource() def get_description(self): return _("Upload files to Picasa album") class UploadDirToPicasa(Action): ''' Upload whole directories as new albums ''' def __init__(self): Action.__init__(self, _('Upload to Picasa as New Album')) def activate(self, obj): return self.activate_multiple((obj, )) def activate_multiple(self, objects): utask = UploadTask() for obj in objects: dir_path = obj.object files_to_upload = _get_valid_files_in_dir(dir_path) if files_to_upload: album_name = os.path.basename(dir_path) utask.add_files_to_new_album(files_to_upload, album_name) return utask def is_async(self): return True def get_icon_name(self): return "document-save" def item_types(self): yield FileLeaf def valid_for_item(self, item): return item.is_dir() and is_plugin_configured() def get_description(self): return _("Create album from selected local directory") class PicasaPrivAlbumsSource(Source): def __init__(self, name=_("Picasa Albums")): Source.__init__(self, name) def get_items(self): if is_plugin_configured(): for user in PicasaDataCache.get_albums(): if user.my_albums: return user.albums return [] def should_sort_lexically(self): return True def provides(self): yield PicasaAlbum def get_icon_name(self): return "picasa" class PicasaUsersSource(Source): source_user_reloadable = True def __init__(self, name=_("Picasa Albums")): Source.__init__(self, name) self._version = 2 def initialize(self): # fill loader cache by source cache PicasaDataCache.data = self.cached_items or [] __kupfer_settings__.connect("plugin-setting-changed", self._changed) def _changed(self, settings, key, value): if key == "userpass": PicasaDataCache.data = [] self.mark_for_update() def get_items(self): if is_plugin_configured(): return PicasaDataCache.get_albums() return [PleaseConfigureLeaf(__name__, __kupfer_name__)] def get_items_forced(self): if is_plugin_configured(): return PicasaDataCache.get_albums(True) return [PleaseConfigureLeaf(__name__, __kupfer_name__)] def should_sort_lexically(self): return True def provides(self): yield PicasaUser yield PleaseConfigureLeaf def get_description(self): return _("User albums in Picasa") def get_icon_name(self): return "picasa" class PicasaAlbumSource(Source): """ Source return albums for given user""" def __init__(self, picasa_user, name=_("Albums")): Source.__init__(self, name) self.picasa_user = picasa_user def get_items(self): return self.picasa_user.albums def should_sort_lexically(self): return True def provides(self): yield PicasaAlbum def has_parent(self): return True def get_parent(self): return self.picasa_user def get_icon_name(self): return "picasa" kupfer-v208/kupfer/plugin/google_picasa/icon-list000066400000000000000000000000221176220042200222470ustar00rootroot00000000000000picasa picasa.svg kupfer-v208/kupfer/plugin/google_picasa/picasa.svg000066400000000000000000000441111176220042200224130ustar00rootroot00000000000000 image/svg+xml kupfer-v208/kupfer/plugin/google_search.py000066400000000000000000000054541176220042200210200ustar00rootroot00000000000000__kupfer_name__ = _("Google Search") __kupfer_actions__ = ("Search", ) __description__ = _("Search Google with results shown directly") __version__ = "" __author__ = "Ulrik Sverdrup " import httplib import urllib from kupfer.objects import Action, Source, OperationError from kupfer.objects import TextLeaf, UrlLeaf from kupfer.plugin import ssl_support try: import cjson json_decoder = cjson.decode except ImportError: import json json_decoder = json.loads # Path uses API Key for Kupfer SEARCH_HOST = "ajax.googleapis.com" SEARCH_PATH = ("/ajax/services/search/web?v=1.0&" "key=ABQIAAAAV3_egytv7qJVulO0KzPiVRQg95CfKdfDbUDlTS80sgrv" "_Zs39hRNkb5m7HV_qLx_d40GexmdjYGvcg&") class Search (Action): def __init__(self): Action.__init__(self, _("Google Search")) def is_factory(self): return True def activate(self, leaf): return SearchResults(leaf.object) def item_types(self): yield TextLeaf def get_description(self): return __description__ class CustomDescriptionUrl (UrlLeaf): def __init__(self, obj, title, desc): UrlLeaf.__init__(self, obj, title) self.description = desc def get_description(self): return self.description def _xml_unescape(ustr): """Unescape & to &, < to <, > to >""" # important to replace & last here return ustr.replace("<", "<").replace(">", ">").replace("&", "&") class SearchResults (Source): def __init__(self, query): Source.__init__(self, _('Results for "%s"') % query) self.query = query def repr_key(self): return self.query def get_items(self): try: query = urllib.urlencode({'q': self.query}) if ssl_support.is_supported(): conn = ssl_support.VerifiedHTTPSConnection(SEARCH_HOST, timeout=5) self.output_debug("Connected to", SEARCH_HOST, "using SSL") else: conn = httplib.HTTPConnection(SEARCH_HOST, timeout=5) conn.request("GET", SEARCH_PATH + query) response = conn.getresponse() ctype = response.getheader("content-type", default="") parts = ctype.split("charset=", 1) encoding = parts[-1] if len(parts) > 1 else "UTF-8" search_results = response.read().decode(encoding) response.close() except (IOError, httplib.HTTPException) as exc: raise OperationError(unicode(exc)) results = json_decoder(search_results) data = results['responseData'] more_results_url = data['cursor']['moreResultsUrl'] total_results = data['cursor'].get('estimatedResultCount', 0) for h in data['results']: uq_url = urllib.unquote(h['url']) uq_title = _xml_unescape(h['titleNoFormatting']) yield UrlLeaf(uq_url, uq_title) yield CustomDescriptionUrl(more_results_url, _('Show More Results For "%s"') % self.query, _("%s total found") % total_results) def provides(self): yield UrlLeaf kupfer-v208/kupfer/plugin/gtg.py000066400000000000000000000114331176220042200167720ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("Getting Things GNOME") __kupfer_sources__ = ("TasksSource", ) __kupfer_actions__ = ("CreateNewTask",) __description__ = _("Browse and create new tasks in GTG") __version__ = "2010-05-27" __author__ = "Karol Będkowski " import os import dbus from kupfer import plugin_support from kupfer import pretty from kupfer import textutils from kupfer.obj.base import Leaf, Action, Source from kupfer.obj.objects import TextLeaf from kupfer.obj.apps import AppLeafContentMixin from kupfer.obj.helplib import FilesystemWatchMixin plugin_support.check_dbus_connection() _SERVICE_NAME = 'org.GTG' _OBJECT_NAME = '/org/GTG' _IFACE_NAME = 'org.GTG' _GTG_HOME = "~/.local/share/gtg/" def _create_dbus_connection(activate=False): ''' Create dbus connection to GTG @activate: if True, start program if not running ''' interface = None sbus = dbus.SessionBus() try: proxy_obj = sbus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(proxy_obj, 'org.freedesktop.DBus') if activate or dbus_iface.NameHasOwner(_IFACE_NAME): obj = sbus.get_object(_SERVICE_NAME, _OBJECT_NAME) if obj: interface = dbus.Interface(obj, _IFACE_NAME) except dbus.exceptions.DBusException, err: pretty.print_debug(err) return interface def _truncate_long_text(text, maxlen=80): if len(text) > maxlen: return text[:maxlen - 1] + u'…' return text def _load_tasks(interface): ''' Load task by dbus interface ''' for task in interface.get_tasks(): title = task['title'].strip() if not title: title = task['text'].strip() title = _truncate_long_text(title) otask = Task(task['id'], title, task['status']) otask.duedate = task['duedate'] otask.startdate = task['startdate'] otask.tags = task['tags'] yield otask def _change_task_status(task_id, status): interface = _create_dbus_connection(True) task = interface.get_task(task_id) task['status'] = status interface.modify_task(task_id, task) class Task (Leaf): def __init__(self, task_id, title, status): Leaf.__init__(self, task_id, title) self.status = status self.tags = None self.duedate = None self.startdate = None def get_description(self): descr = [self.status] if self.duedate: descr.append(_("due: %s") % self.duedate) if self.startdate: descr.append(_("start: %s") % self.startdate) if self.tags: descr.append(_("tags: %s") % " ".join(self.tags)) return " ".join(descr) def get_icon_name(self): return 'gtg' def get_actions(self): yield OpenEditor() yield Delete() yield MarkDone() yield Dismiss() class OpenEditor (Action): rank_adjust = 1 def __init__(self): Action.__init__(self, _("Open")) def activate(self, leaf): interface = _create_dbus_connection(True) interface.open_task_editor(leaf.object) def get_icon_name(self): return 'document-open' def get_description(self): return _("Open task in Getting Things GNOME!") class Delete (Action): rank_adjust = -10 def __init__(self): Action.__init__(self, _("Delete")) def activate(self, leaf): interface = _create_dbus_connection(True) interface.delete_task(leaf.object) def get_icon_name(self): return 'edit-delete' def get_description(self): return _("Permanently remove this task") class MarkDone (Action): def __init__(self): Action.__init__(self, _("Mark Done")) def activate(self, leaf): _change_task_status(leaf.object, 'Done') def get_icon_name(self): return 'gtk-yes' def get_description(self): return _("Mark this task as done") class Dismiss (Action): def __init__(self): Action.__init__(self, _("Dismiss")) def activate(self, leaf): _change_task_status(leaf.object, 'Dismiss') def get_icon_name(self): return 'gtk-cancel' def get_description(self): return _("Mark this task as not to be done anymore") class CreateNewTask (Action): def __init__(self): Action.__init__(self, _("Create Task")) def activate(self, leaf): interface = _create_dbus_connection(True) title, body = textutils.extract_title_body(leaf.object) interface.open_new_task(title, body) def item_types(self): yield TextLeaf def get_icon_name(self): return 'document-new' def get_description(self): return _("Create new task in Getting Things GNOME") class TasksSource (AppLeafContentMixin, Source, FilesystemWatchMixin): appleaf_content_id = 'gtg' def __init__(self, name=None): Source.__init__(self, name or __kupfer_name__) self._tasks = [] self._version = 2 def initialize(self): self.monitor_token = \ self.monitor_directories(os.path.expanduser(_GTG_HOME)) def get_items(self): interface = _create_dbus_connection() if interface is not None: self._tasks = list(_load_tasks(interface)) return self._tasks def get_icon_name(self): return 'gtg' def provides(self): yield Task kupfer-v208/kupfer/plugin/gwibber.py000066400000000000000000000363221176220042200176360ustar00rootroot00000000000000# -*- coding: UTF-8 -*- from __future__ import absolute_import __kupfer_name__ = _("Gwibber") __kupfer_sources__ = ("HomeMessagesSource", "AccountsSource", "StreamsSource") __kupfer_actions__ = ("SendMessage", "SendMessageBy", "SendMessageTo") __description__ = _("Microblogging with Gwibber. Allows sending and receiving " "messages from social networks like Twitter, Identi.ca etc. " "Requires the package 'gwibber-service'.") __version__ = "2011-03-04" __author__ = "Karol Będkowski " import time import locale try: import cjson json_decoder = cjson.decode json_encoder = cjson.encode except ImportError: import json json_decoder = json.loads json_encoder = json.dumps import dbus # quick test is gwibber-service installed import gwibber.microblog from kupfer import icons from kupfer import pretty from kupfer import plugin_support from kupfer.objects import Action, TextLeaf, Source, Leaf, TextSource from kupfer.obj.objects import OpenUrl from kupfer.weaklib import dbus_signal_connect_weakly plugin_support.check_dbus_connection() DBUS_GWIBBER_SERVICE = ('com.Gwibber.Service', '/com/gwibber/Service') DBUS_GWIBBER_ACCOUNTS = ('com.Gwibber.Accounts', '/com/gwibber/Accounts') DBUS_GWIBBER_STREAMS = ('com.Gwibber.Streams', '/com/gwibber/Streams') DBUS_GWIBBER_MESSAGES = ('com.Gwibber.Messages', '/com/gwibber/Messages') DBUS_GWIBBER_SEARCH = ('com.Gwibber.Search', '/com/gwibber/Search') __kupfer_settings__ = plugin_support.PluginSettings( { 'key': 'load_limit', 'label': _("Maximum number of messages to show"), 'type': int, 'value': 25, } ) def _get_dbus_iface(service_objname, activate=False): interface = None sbus = dbus.SessionBus() service, objname = service_objname try: proxy_obj = sbus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(proxy_obj, 'org.freedesktop.DBus') if activate or dbus_iface.NameHasOwner(service): obj = sbus.get_object(service, objname) if obj: interface = dbus.Interface(obj, service) except dbus.exceptions.DBusException, err: pretty.print_debug(err) return interface def _get_messages_for_account(stream, account, transient='0'): conn = _get_dbus_iface(DBUS_GWIBBER_SERVICE, True) if not conn: return services = json_decoder(conn.GetServices()) conn = _get_dbus_iface(DBUS_GWIBBER_STREAMS) if not conn: return result = conn.Messages(stream, account, 0, '0', transient, 'time', 'desc', __kupfer_settings__['load_limit']) for msg in json_decoder(result): yield Message(msg['text'], msg, services[msg['service']]) def _gwibber_refresh(conn=None): conn = conn or _get_dbus_iface(DBUS_GWIBBER_SERVICE, True) if conn: conn.Refresh() def _trunc_message(message): return message[:139] + '…' if len(message) > 140 else message class Account(Leaf): def __init__(self, account, service_name, show_content=True): Leaf.__init__(self, account['id'], service_name) self._show_content = show_content # TRANS: Account description, similar to "John on Identi.ca" self._description = _("%(user)s on %(service)s") % { 'user': account.get('site_display_name') or account['username'], 'service': account['service']} def repr_key(self): return self.object def get_icon_name(self): return 'gwibber' def has_content(self): return self._show_content def content_source(self, alternate=False): return MessagesSource(self.object, self.name) def get_description(self): return self._description class Stream(Leaf): def __init__(self, name, id_, account): Leaf.__init__(self, id_, name) self.account = account def repr_key(self): return self.object def get_icon_name(self): return 'gwibber' def has_content(self): return True def content_source(self, alternate=False): return StreamMessagesSource(self) def unicode_strftime(fmt, time_tuple=None): enc = locale.getpreferredencoding(False) return unicode(time.strftime(fmt, time_tuple), enc, "replace") class Message (Leaf): def __init__(self, text, msg, service): Leaf.__init__(self, text, text) self.id = msg['id'] self.msg_url = msg.get('url') self.msg_sender = msg['sender']['nick'] if 'nick' in msg['sender'] \ else msg['sender']['name'] self._service_features = list(service['features']) self._is_my_msg = bool(msg['sender']['is_me']) sender = unicode(msg['sender'].get('name') or msg['sender']['nick']) date = unicode_strftime('%c', time.localtime(msg['time'])) # TRANS: Gwibber Message description # TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" # TRANS: the %(user)s and similar tokens must be unchanged self._description = _("%(user)s %(when)s on %(where)s") % { 'user': sender, 'when': date, 'where': service['name']} def repr_key(self): return self.id def get_actions(self): service_features = self._service_features if self._is_my_msg: if 'delete' in service_features: yield DeleteMessage() else: if 'reply' in service_features: yield Reply() if 'send_private' in service_features: yield SendPrivate() if 'retweet' in service_features: yield Retweet() yield Retweet(True) if self.msg_url: yield OpenMessageUrl() def get_description(self): return self._description def get_text_representation(self): return self.object def get_gicon(self): return icons.ComposedIcon("gwibber", "stock_mail") class SendMessage(Action): def __init__(self): Action.__init__(self, _('Send Message')) def activate(self, leaf): conn = _get_dbus_iface(DBUS_GWIBBER_SERVICE, True) if conn: conn.SendMessage(_trunc_message(leaf.object)) _gwibber_refresh() def item_types(self): yield TextLeaf def valid_for_item(self, item): return bool(item.object) def get_gicon(self): return icons.ComposedIcon("gwibber", "mail-message-new") def get_description(self): return _("Send message to all Gwibber accounts") class SendMessageBy(Action): def __init__(self): Action.__init__(self, _("Send Message To...")) def activate(self, leaf, iobj): conn = _get_dbus_iface(DBUS_GWIBBER_SERVICE, True) if conn: msg = {'message': _trunc_message(leaf.object), 'accounts': [iobj.object]} conn.Send(json_encoder(msg)) _gwibber_refresh() def item_types(self): yield TextLeaf def valid_for_item(self, item): return bool(item.object) def requires_object(self): return True def object_types(self): yield Account def object_source(self, for_item=None): return SendToAccountSource('send') def get_gicon(self): return icons.ComposedIcon("gwibber", "mail-message-new") def get_description(self): return _("Send message to a Gwibber account") class SendMessageTo(Action): def __init__(self): Action.__init__(self, _("Send Message...")) def activate(self, leaf, iobj): conn = _get_dbus_iface(DBUS_GWIBBER_SERVICE, True) if conn: msg = {'message': _trunc_message(iobj.object), 'accounts': [leaf.object]} conn.Send(json_encoder(msg)) _gwibber_refresh() def item_types(self): yield Account def requires_object(self): return True def object_source(self, for_item=None): return TextSource() def object_types(self): yield TextLeaf def valid_object(self, iobj, for_item=None): # ugly, but we don't want derived text return type(iobj) is TextLeaf def get_gicon(self): return icons.ComposedIcon("gwibber", "mail-message-new") def get_description(self): return _("Send message to selected Gwibber account") class Reply(Action): def __init__(self): Action.__init__(self, _("Reply...")) def activate(self, leaf, iobj): conn = _get_dbus_iface(DBUS_GWIBBER_MESSAGES, True) if not conn: return rmsg = json_decoder(conn.Get(leaf.id)) text = '@%s: %s' % (rmsg['sender']['nick'], iobj.object) msg = {'message': _trunc_message(text), 'target': rmsg} conn = _get_dbus_iface(DBUS_GWIBBER_SERVICE) if conn: conn.Send(json_encoder(msg)) _gwibber_refresh() def item_types(self): yield Message def requires_object(self): return True def object_source(self, for_item=None): return TextSource() def object_types(self): yield TextLeaf def valid_object(self, iobj, for_item=None): # ugly, but we don't want derived text return type(iobj) is TextLeaf def get_gicon(self): return icons.ComposedIcon("gwibber", "mail-reply-all") class DeleteMessage(Action): def __init__(self): Action.__init__(self, _("Delete Message")) def activate(self, leaf): conn = _get_dbus_iface(DBUS_GWIBBER_MESSAGES, True) if not conn: return rmsg = json_decoder(conn.Get(leaf.id)) cmd = {'transient': False, 'account': rmsg['account'], 'operation': 'delete', 'args': {'message': rmsg}} conn = _get_dbus_iface(DBUS_GWIBBER_SERVICE) if conn: conn.PerformOp(json_encoder(cmd)) _gwibber_refresh(conn) def item_types(self): yield Message def get_gicon(self): return icons.ComposedIcon("gwibber", "stock_delete") class SendPrivate(Action): def __init__(self): Action.__init__(self, _("Send Private Message...")) def activate(self, leaf, iobj): conn = _get_dbus_iface(DBUS_GWIBBER_MESSAGES, True) if not conn: return rmsg = json_decoder(conn.Get(leaf.id)) msg = {'message': _trunc_message(iobj.object), 'private': rmsg} conn = _get_dbus_iface(DBUS_GWIBBER_SERVICE) if conn: conn.Send(json_encoder(msg)) _gwibber_refresh() def item_types(self): yield Message def requires_object(self): return True def object_source(self, for_item=None): return TextSource() def object_types(self): yield TextLeaf def valid_object(self, iobj, for_item=None): # ugly, but we don't want derived text return type(iobj) is TextLeaf def get_gicon(self): return icons.ComposedIcon("gwibber", "mail-reply-sender") def get_description(self): return _("Send direct message to user") class Retweet(Action): def __init__(self, retweet_to_all=False): self._retweet_to_all = retweet_to_all name = _("Retweet") if retweet_to_all else _("Retweet To...") Action.__init__(self, name) def activate(self, leaf, iobj=None): conn = _get_dbus_iface(DBUS_GWIBBER_SERVICE, True) if conn: text = '♺ @%s: %s' % (leaf.msg_sender, leaf.object) if iobj: msg = {'message': _trunc_message(text), 'accounts': [iobj.object]} conn.Send(json_encoder(msg)) else: conn.SendMessage(_trunc_message(text)) _gwibber_refresh() def item_types(self): yield Message def requires_object(self): return not self._retweet_to_all def object_types(self): yield Account def object_source(self, for_item=None): return SendToAccountSource('retweet') def get_gicon(self): return icons.ComposedIcon("gwibber", "mail-message-forward") def get_description(self): if self._retweet_to_all: return _("Retweet message to all Gwibber accounts") return _("Retweet message to a Gwibber account") class OpenMessageUrl(OpenUrl): def __init__(self): OpenUrl.__init__(self, _("Open in Browser")) def activate(self, leaf): self.open_url(leaf.msg_url) def get_description(self): return _("Open message in default web browser") class AccountsSource(Source): source_user_reloadable = True def __init__(self, name=_("Gwibber Accounts")): Source.__init__(self, name) def initialize(self): session_bus = dbus.Bus() for signal in ('Created', 'Updated', 'Deleted'): dbus_signal_connect_weakly(session_bus, signal, self._signal_update, dbus_interface=DBUS_GWIBBER_ACCOUNTS[0]) def _signal_update(self, *args): self.mark_for_update() def get_items(self): conn = _get_dbus_iface(DBUS_GWIBBER_SERVICE, True) if not conn: return services = json_decoder(conn.GetServices()) del conn if not services: return conn = _get_dbus_iface(DBUS_GWIBBER_ACCOUNTS, True) if conn: accounts = json_decoder(conn.List()) for account in accounts: service = services[account['service']] yield Account(account, service['name']) def get_icon_name(self): return 'gwibber' def get_description(self): return _("Accounts configured in Gwibber") def provides(self): yield Account class SendToAccountSource(Source): def __init__(self, required_feature=None, name=_("Gwibber Accounts")): Source.__init__(self, name) self._required_feature = required_feature def get_items(self): conn = _get_dbus_iface(DBUS_GWIBBER_SERVICE, True) if not conn: return services = json_decoder(conn.GetServices()) conn = _get_dbus_iface(DBUS_GWIBBER_ACCOUNTS, True) if conn: for account in json_decoder(conn.List()): aservice = account['service'] if aservice not in services: continue service = services[aservice] if not self._required_feature or \ self._required_feature in service['features']: yield Account(account, service['name'], False) def get_icon_name(self): return 'gwibber' def provides(self): yield Account class HomeMessagesSource(Source): # we don't connect to "gwibber" app as long we only need "gwibber-service". source_user_reloadable = True source_prefer_sublevel = True def __init__(self, name=_("Gwibber Messages")): Source.__init__(self, name) def initialize(self): session_bus = dbus.Bus() dbus_signal_connect_weakly(session_bus, 'Message', self._signal_update, dbus_interface=DBUS_GWIBBER_MESSAGES[0]) dbus_signal_connect_weakly(session_bus, 'LoadingComplete', self._signal_update, dbus_interface=DBUS_GWIBBER_SERVICE[0]) for signal in ('Created', 'Updated', 'Deleted'): dbus_signal_connect_weakly(session_bus, signal, self._signal_update, dbus_interface=DBUS_GWIBBER_STREAMS[0]) def _signal_update(self, *args): self.mark_for_update() def get_items(self): return _get_messages_for_account('messages', 'all') def get_icon_name(self): return 'gwibber' def get_description(self): return _("Recent messages received by Gwibber") def provides(self): yield Message class MessagesSource(Source): def __init__(self, account, service): # TRANS: %s is a service name Source.__init__(self, _("Gwibber Messages for %s") % service) self.account = account def get_items(self): return _get_messages_for_account('messages', self.account) def get_icon_name(self): return 'gwibber' def provides(self): yield Message class StreamsSource(Source): source_user_reloadable = True def __init__(self, name=_("Gwibber Streams")): Source.__init__(self, name) def initialize(self): session_bus = dbus.Bus() for signal in ('Created', 'Updated', 'Deleted'): dbus_signal_connect_weakly(session_bus, signal, self._signal_update, dbus_interface=DBUS_GWIBBER_STREAMS[0]) _gwibber_refresh() def _signal_update(self, *args): self.mark_for_update() def get_items(self): conn = _get_dbus_iface(DBUS_GWIBBER_STREAMS, True) if conn: for stream in json_decoder(conn.List()): yield Stream(stream['name'], stream['id'], stream['account']) def get_icon_name(self): return 'gwibber' def get_description(self): return _("Streams configured in Gwibber") def provides(self): yield Stream class StreamMessagesSource(Source): def __init__(self, stream): # TRANS: Gwibber messages in %s :: %s is a Stream name Source.__init__(self, _("Gwibber Messages in %s") % stream.name) self._account = stream.account self._stream_id = stream.object def get_items(self): conn = _get_dbus_iface(DBUS_GWIBBER_STREAMS, True) if conn: return _get_messages_for_account('all', self._account, self._stream_id) def get_icon_name(self): return 'gwibber' def provides(self): yield Message kupfer-v208/kupfer/plugin/gwibber_simple.py000066400000000000000000000035431176220042200212060ustar00rootroot00000000000000from __future__ import absolute_import __kupfer_name__ = _("Gwibber (Simple)") __kupfer_actions__ = ( "SendUpdate", ) __description__ = _("Send updates via the microblogging client Gwibber") __version__ = "" __author__ = "" import dbus from kupfer.objects import Action, TextLeaf, OperationError from kupfer import plugin_support from kupfer import pretty plugin_support.check_dbus_connection() SERVICE_NAME = "com.Gwibber.Service" OBJ_NAME = "/com/gwibber/Service" IFACE_NAME = "com.Gwibber.Service" def _get_interface(activate=False): """Return the dbus proxy object for our Note Application. if @activate, we will activate it over d-bus (start if not running) """ bus = dbus.SessionBus() proxy_obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(proxy_obj, 'org.freedesktop.DBus') if not activate and not dbus_iface.NameHasOwner(SERVICE_NAME): return try: proxyobj = bus.get_object(SERVICE_NAME, OBJ_NAME) except dbus.DBusException, e: pretty.print_error(__name__, e) return return dbus.Interface(proxyobj, IFACE_NAME) class SendUpdate (Action): def __init__(self): Action.__init__(self, _("Send Update")) def wants_context(self): return True def activate(self, leaf, ctx): def success_cb(): pretty.print_debug(__name__, "Successful D-Bus method call") def err_cb(exc): exc_info = (type(exc), exc, None) ctx.register_late_error(exc_info) gwibber = _get_interface(True) if gwibber: gwibber.SendMessage(leaf.object, reply_handler=success_cb, error_handler=err_cb) else: pretty.print_error(__name__, "Gwibber Service not found as:", (SERVICE_NAME, OBJ_NAME, IFACE_NAME)) raise OperationError(_("Unable to activate Gwibber service")) def item_types(self): yield TextLeaf def get_description(self): return __description__ kupfer-v208/kupfer/plugin/higherorder.py000066400000000000000000000056111176220042200205140ustar00rootroot00000000000000__kupfer_name__ = _("Higher-order Actions") __kupfer_actions__ = ( "Select", "TakeResult", "DiscardResult", ) __description__ = _("Tools to work with commands as objects") __version__ = "2010-01-11" __author__ = "Ulrik Sverdrup " from kupfer.objects import Action, Leaf from kupfer.obj.compose import ComposedLeaf, MultipleLeaf from kupfer.core import commandexec from kupfer import pretty class Select (Action): rank_adjust = -15 def __init__(self): Action.__init__(self, _("Select in Kupfer")) def has_result(self): return True def activate(self, leaf): return leaf def item_types(self): yield Leaf def _exec_no_show_result(composedleaf): pretty.print_debug(__name__, "Evaluating command", composedleaf) obj, action, iobj = composedleaf.object ret = commandexec.activate_action(None, *composedleaf.object) result_type = commandexec.parse_action_result(action, ret) if result_type == commandexec.RESULT_OBJECT: return ret if result_type == commandexec.RESULT_SOURCE: leaves = list(ret.get_leaves()) if not leaves: return if len(leaves) == 1: return leaves[0] else: return MultipleLeaf(leaves) def _save_result(cleaf): # Save the result of @cleaf into a ResultObject # When the ResultObject is to be restored from serialized state, # @cleaf is executed again. # NOTE: This will have unintended consequences outside Trigger use. leaf = _exec_no_show_result(cleaf) if leaf is None: return None class ResultObject (Leaf): serializable = 1 def __init__(self, leaf, cleaf): Leaf.__init__(self, leaf.object, unicode(leaf)) vars(self).update(vars(leaf)) self.name = _("Result of %s (%s)") % (cleaf, self) self.__composed_leaf = cleaf self.__class__.__bases__ = (leaf.__class__, Leaf) def get_gicon(self): return None def get_icon_name(self): return Leaf.get_icon_name(self) def __reduce__(self): return (_save_result, (self.__composed_leaf, )) return ResultObject(leaf, cleaf) class TakeResult (Action): def __init__(self): Action.__init__(self, _("Run (Take Result)")) def has_result(self): return True def activate(self, leaf): return _save_result(leaf) def item_types(self): yield ComposedLeaf def valid_for_item(self, leaf): action = leaf.object[1] return ((action.has_result() or action.is_factory()) and not action.wants_context()) def get_description(self): return _("Take the command result as a proxy object") class DiscardResult (Action): """Run ComposedLeaf without showing the result""" def __init__(self): Action.__init__(self, _("Run (Discard Result)")) def wants_context(self): return True def activate(self, leaf, ctx): commandexec.activate_action(ctx, *leaf.object) def item_types(self): yield ComposedLeaf def valid_for_item(self, leaf): action = leaf.object[1] return action.has_result() or action.is_factory() def get_description(self): return None kupfer-v208/kupfer/plugin/image.py000066400000000000000000000077541176220042200173060ustar00rootroot00000000000000__kupfer_name__ = _("Image Tools") __kupfer_sources__ = () __kupfer_text_sources__ = () __kupfer_actions__ = ( "Scale", "Rotate90", "Rotate270", "Autorotate", ) __description__ = _("Image transformation tools") __version__ = "" __author__ = "Ulrik Sverdrup " # since "path" is a very generic name, you often forget.. from os import path as os_path import subprocess from kupfer.objects import Action, FileLeaf, TextLeaf from kupfer import utils, pretty from kupfer import runtimehelper class Scale (Action): def __init__(self): Action.__init__(self, _("Scale...")) def has_result(self): return True def wants_context(self): return True def activate(self, leaf, obj, ctx): size = self._make_size(obj.object) fpath = leaf.object dirname = os_path.dirname(fpath) head, ext = os_path.splitext(os_path.basename(fpath)) filename = "%s_%s%s" % (head, size, ext) dpath = utils.get_destpath_in_directory(dirname, filename) argv = ["convert", "-scale", ('%s' % size), fpath, dpath] runtimehelper.register_async_file_result(ctx, dpath) utils.spawn_async(argv) return FileLeaf(dpath) def item_types(self): yield FileLeaf def valid_for_item(self, item): # FIXME: Make this detection smarter root, ext = os_path.splitext(item.object) return ext.lower() in (".jpeg", ".jpg", ".png", ".gif") def requires_object(self): return True def object_types(self): yield TextLeaf @classmethod def _make_size(self, text): size = None try: size = "%g" % float(text.strip()) except ValueError: try: twoparts = text.split("x", 1) size = "%gx%g" % (float(twoparts[0].strip()), float(twoparts[1].strip())) except ValueError: pass return size def valid_object(self, obj, for_item=None): return self._make_size(obj.object) def get_description(self): return _("Scale image to fit inside given pixel measure(s)") class RotateBase (Action): def __init__(self, name, rotation): Action.__init__(self, name) self.rotation = rotation def has_result(self): return True def wants_context(self): return True def activate(self, leaf, ctx): fpath = leaf.object dirname = os_path.dirname(fpath) head, ext = os_path.splitext(os_path.basename(fpath)) filename = "%s_%s%s" % (head, self.rotation, ext) dpath = utils.get_destpath_in_directory(dirname, filename) argv = ["jpegtran", "-copy", "all", "-rotate", self.rotation, "-outfile", dpath, fpath] runtimehelper.register_async_file_result(ctx, dpath) utils.spawn_async(argv) return FileLeaf(dpath) def item_types(self): yield FileLeaf def valid_for_item(self, item): # FIXME: Make this detection smarter root, ext = os_path.splitext(item.object) return ext.lower() in (".jpeg", ".jpg") class Rotate90 (RotateBase): def __init__(self): RotateBase.__init__(self, _("Rotate Clockwise"), "90") def get_icon_name(self): return "object-rotate-right" class Rotate270 (RotateBase): def __init__(self): RotateBase.__init__(self, _("Rotate Counter-Clockwise"), "270") def get_icon_name(self): return "object-rotate-left" class Autorotate (Action): def __init__(self): Action.__init__(self, _("Autorotate")) def has_result(self): return True def activate(self, leaf, obj=None): fpath = leaf.object argv = ['jhead', '-autorot', fpath] utils.spawn_async(argv) def item_types(self): yield FileLeaf def valid_for_item(self, item): root, ext = os_path.splitext(item.object) if not ext.lower() in (".jpeg", ".jpg"): return False # Launch jhead to see if 1) it is installed, 2) Orientation nondefault try: cmdargs = ("jhead", item.object) proc = subprocess.Popen(cmdargs, stdout=subprocess.PIPE) except OSError: pretty.print_debug(__name__ , "Action %s needs 'jhead'" % self) else: out, err = proc.communicate() pretty.print_debug(__name__, "Running", cmdargs) return any(li.startswith("Orientation") for li in out.splitlines()) def get_description(self): return _("Rotate JPEG (in-place) according to its EXIF metadata") kupfer-v208/kupfer/plugin/kupfer_plugins.py000066400000000000000000000061771176220042200212570ustar00rootroot00000000000000__kupfer_name__ = _("Kupfer Plugins") __kupfer_sources__ = ("KupferPlugins", ) __description__ = _("Access Kupfer's plugin list in Kupfer") __version__ = "" __author__ = "Ulrik Sverdrup " import os from kupfer.objects import Action, Source, Leaf, FileLeaf, TextLeaf from kupfer import kupferui # Since this is a core plugin we break some rules # These modules are normally out of bounds for plugins from kupfer.core import plugins, settings class ShowInfo (Action): def __init__(self): Action.__init__(self, _("Show Information")) def wants_context(self): return True def activate(self, leaf, ctx): plugin_id = leaf.object["name"] kupferui.show_plugin_info(plugin_id, ctx.environment) def get_description(self): pass def get_icon_name(self): return "dialog-information" class ShowSource (Action): def __init__(self): Action.__init__(self, _("Show Source Code")) def has_result(self): return True def activate(self, leaf): # Try to find the __file__ attribute for the plugin # It will fail for files inside zip packages, but that is # uncommon for now. # Additionally, it will fail for fake plugins plugin_id = leaf.object["name"] filename = plugins.get_plugin_attribute(plugin_id, "__file__") if not filename: return leaf root, ext = os.path.splitext(filename) if ext.lower() == ".pyc" and os.path.exists(root + ".py"): return FileLeaf(root + ".py") if not os.path.exists(filename): # handle modules in zip or eggs import pkgutil pfull = "kupfer.plugin." + plugin_id loader = pkgutil.get_loader(pfull) if loader: return TextLeaf(loader.get_source(pfull)) return FileLeaf(filename) def get_description(self): pass def get_icon_name(self): return "dialog-information" class Plugin (Leaf): # NOTE: Just to be sure that a plugin ranks lower than a # like-named other object by default. rank_adjust = -1 def __init__(self, obj, name): Leaf.__init__(self, obj, name) def get_actions(self): yield ShowInfo() yield ShowSource() def get_description(self): setctl = settings.GetSettingsController() enabled = setctl.get_plugin_enabled(self.object["name"]) return u"%s (%s)" % (self.object["description"], _("enabled") if enabled else _("disabled")) def get_icon_name(self): return "package-x-generic" class KupferPlugins (Source): def __init__(self): Source.__init__(self, _("Kupfer Plugins")) def get_items(self): setctl = settings.GetSettingsController() for info in plugins.get_plugin_info(): plugin_id = info["name"] if setctl.get_plugin_is_hidden(plugin_id): continue yield Plugin(info, info["localized_name"]) def should_sort_lexically(self): return True def provides(self): yield Plugin def get_icon_name(self): return "package-x-generic" @classmethod def decorates_type(cls): return Plugin @classmethod def decorate_item(cls, obj): if cls.is_self_plugin(obj): return cls() @classmethod def is_self_plugin(cls, obj): self_plug_id = __name__.split(".")[-1] return obj.object['name'] == self_plug_id def get_leaf_repr(self): for obj in self.get_leaves(): if self.is_self_plugin(obj): return obj kupfer-v208/kupfer/plugin/locate.py000066400000000000000000000044621176220042200174640ustar00rootroot00000000000000__kupfer_name__ = _("Locate Files") __kupfer_actions__ = ( "Locate", ) __description__ = _("Search filesystem using locate") __version__ = "" __author__ = "Ulrik Sverdrup " import subprocess from kupfer.objects import Action, Source from kupfer.objects import TextLeaf from kupfer import icons, plugin_support from kupfer.obj.objects import ConstructFileLeaf __kupfer_settings__ = plugin_support.PluginSettings( { "key" : "ignore_case", "label": _("Ignore case distinctions when searching files"), "type": bool, "value": True, }, ) class Locate (Action): def __init__(self): Action.__init__(self, _("Locate Files")) def is_factory(self): return True def activate(self, leaf): return LocateQuerySource(leaf.object) def item_types(self): yield TextLeaf def get_description(self): return _("Search filesystem using locate") def get_gicon(self): return icons.ComposedIcon("gnome-terminal", self.get_icon_name()) def get_icon_name(self): return "edit-find" class LocateQuerySource (Source): def __init__(self, query): Source.__init__(self, name=_('Results for "%s"') % query) self.query = query self.max_items = 500 def repr_key(self): return self.query def get_items(self): ignore_case = '--ignore-case' if __kupfer_settings__["ignore_case"] else '' # Start two processes, one to take the first hits, one # to take the remaining up to maximum. We start both at the same time # (regrettably, locate wont output streamingly to stdout) # but we ask the second for results only after iterating the first few first_num = 12 first_command = ("locate --null --limit %d %s '%s'" % (first_num, ignore_case, self.query)) full_command = ("locate --null --limit %d %s '%s'" % (self.max_items, ignore_case, self.query)) p1 = subprocess.Popen(first_command, shell=True, stdout=subprocess.PIPE) p2 = subprocess.Popen(full_command, shell=True, stdout=subprocess.PIPE) def get_locate_output(proc, offset=0): out, ignored_err = proc.communicate() return (ConstructFileLeaf(f) for f in out.split("\x00")[offset:-1]) for F in get_locate_output(p1, 0): yield F for F in get_locate_output(p2, first_num): yield F def get_gicon(self): return icons.ComposedIcon("gnome-terminal", self.get_icon_name()) def get_icon_name(self): return "edit-find" kupfer-v208/kupfer/plugin/multihead.py000066400000000000000000000022231176220042200201620ustar00rootroot00000000000000# TRANS: Multihead refers to support for multiple computer displays # TRANS: In this case, it only concerns the special configuration # TRANS: with multiple X "screens" __kupfer_name__ = _("Multihead Support") __kupfer_sources__ = () __description__ = ("Will run the keyboard shortcut relay service on additional" " X screens if needed.") __version__ = "" __author__ = "" import os import gtk from kupfer import pretty from kupfer import utils child_pids = [] def initialize_plugin(name): global pid ## check for multihead display = gtk.gdk.display_get_default() screen = display.get_default_screen() if display.get_n_screens() > 1: pretty.print_info(__name__, "Starting Multi X screen support") for idx in xrange(display.get_n_screens()): if idx != screen.get_number(): pretty.print_info(__name__, "Launching keyrelay for screen", idx) screen_x = display.get_screen(idx) # run helper without respawning it pid = utils.start_plugin_helper("kupfer.keyrelay", False, screen_x.make_display_name()) child_pids.append(pid) def finalize_plugin(name): for pid in child_pids: os.kill(pid, 1) child_pids[:] = [] kupfer-v208/kupfer/plugin/nautilusselection.py000066400000000000000000000044131176220042200217630ustar00rootroot00000000000000__kupfer_name__ = _("Selected File") __kupfer_sources__ = ("SelectionSource", ) __description__ = _("Provides current nautilus selection, using Kupfer's Nautilus Extension") __version__ = "" __author__ = "Ulrik Sverdrup " import dbus import gobject import gio from kupfer.objects import Source from kupfer.objects import FileLeaf, SourceLeaf from kupfer.obj.compose import MultipleLeaf from kupfer.obj.helplib import PicklingHelperMixin from kupfer.weaklib import DbusWeakCallback from kupfer import plugin_support plugin_support.check_dbus_connection() class SelectedFile (FileLeaf): qf_id = "selectedfile" def __init__(self, filepath): """@filepath is a filesystem byte string `str`""" basename = gobject.filename_display_basename(filepath) FileLeaf.__init__(self, filepath, _('Selected File "%s"') % basename) def __repr__(self): return "<%s %s>" % (__name__, self.qf_id) class SelectedFiles (MultipleLeaf): qf_id = "selectedfile" def __init__(self, paths): files = [FileLeaf(path) for path in paths] MultipleLeaf.__init__(self, files, _("Selected Files")) def __repr__(self): return "<%s %s>" % (__name__, self.qf_id) class InvisibleSourceLeaf (SourceLeaf): """Hack to hide this source""" def is_valid(self): return False class SelectionSource (Source, PicklingHelperMixin): def __init__(self): Source.__init__(self, _("Selected File")) self.unpickle_finish() def unpickle_finish(self): self._selection = [] def initialize(self): session_bus = dbus.Bus() callback = DbusWeakCallback(self._selected_signal) callback.token = session_bus.add_signal_receiver( callback, "SelectionChanged", dbus_interface="se.kaizer.FileSelection", byte_arrays=True) def _selected_signal(self, selection, window_id): # The SelectionChanged signal carries an array of unicode URIs paths = filter(None, [gio.File(uri).get_path() for uri in selection]) self._selection = paths self.mark_for_update() def get_items(self): if len(self._selection) == 1: yield SelectedFile(self._selection[0]) elif len(self._selection) > 1: yield SelectedFiles(self._selection) def get_description(self): return None def provides(self): yield FileLeaf yield MultipleLeaf def get_leaf_repr(self): return InvisibleSourceLeaf(self) kupfer-v208/kupfer/plugin/notes.py000066400000000000000000000173141176220042200173450ustar00rootroot00000000000000""" It *should* be possible to support Tomboy and Gnote equally since they support the same DBus protocol. This plugin takes this assumption. """ __kupfer_name__ = _("Notes") __kupfer_sources__ = ("NotesSource", ) __kupfer_actions__ = ( "AppendToNote", "CreateNote", "GetNoteSearchResults", ) __description__ = _("Gnote or Tomboy notes") __version__ = "" __author__ = "Ulrik Sverdrup " import locale import os import time import xml.sax.saxutils import dbus import xdg.BaseDirectory as base from kupfer.objects import Action, Source, Leaf, TextLeaf from kupfer.obj.apps import ApplicationSource from kupfer import icons, plugin_support from kupfer import pretty, textutils PROGRAM_IDS = ["gnote", "tomboy", "kzrnote"] __kupfer_settings__ = plugin_support.PluginSettings( { "key" : "notes_application", "label": _("Work with application"), "type": str, "value": "", "alternatives": ["",] + PROGRAM_IDS }, ) plugin_support.check_dbus_connection() def unicode_strftime(fmt, time_tuple=None): enc = locale.getpreferredencoding(False) return unicode(time.strftime(fmt, time_tuple), enc, "replace") ## Tuples of service name, object name, interface name PROGRAM_SERIVCES = { "gnote": ("org.gnome.Gnote", "/org/gnome/Gnote/RemoteControl", "org.gnome.Gnote.RemoteControl"), "tomboy": ("org.gnome.Tomboy", "/org/gnome/Tomboy/RemoteControl", "org.gnome.Tomboy.RemoteControl"), "kzrnote": ("se.kaizer.kzrnote", "/se/kaizer/kzrnote", "se.kaizer.kzrnote"), } def _get_notes_interface(activate=False): """Return the dbus proxy object for our Note Application. if @activate, we will activate it over d-bus (start if not running) """ bus = dbus.SessionBus() proxy_obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(proxy_obj, 'org.freedesktop.DBus') set_prog = __kupfer_settings__["notes_application"] programs = (set_prog, ) if set_prog else PROGRAM_IDS for program in programs: service_name, obj_name, iface_name = PROGRAM_SERIVCES[program] if not activate and not dbus_iface.NameHasOwner(service_name): continue try: searchobj = bus.get_object(service_name, obj_name) except dbus.DBusException, e: pretty.print_error(__name__, e) return notes = dbus.Interface(searchobj, iface_name) return notes class Open (Action): def __init__(self): Action.__init__(self, _("Open")) def activate(self, leaf): noteuri = leaf.object notes = _get_notes_interface(activate=True) notes.DisplayNote(noteuri) def get_description(self): return _("Open with notes application") def get_gicon(self): app_icon = icons.get_gicon_with_fallbacks(None, PROGRAM_IDS) return icons.ComposedIcon(self.get_icon_name(), app_icon) class AppendToNote (Action): def __init__(self): Action.__init__(self, _("Append to Note...")) def activate(self, leaf, iobj): notes = _get_notes_interface(activate=True) noteuri = iobj.object text = leaf.object # NOTE: We search and replace in the XML here xmlcontents = notes.GetNoteCompleteXml(noteuri) endtag = u"" xmltext = xml.sax.saxutils.escape(text) xmlcontents = xmlcontents.replace(endtag, u"\n%s%s" % (xmltext, endtag)) notes.SetNoteCompleteXml(noteuri, xmlcontents) def item_types(self): yield TextLeaf def requires_object(self): return True def object_types(self): yield Note def object_source(self, for_item=None): return NotesSource() def get_description(self): return _("Add text to existing note") def get_icon_name(self): return "list-add" def _prepare_note_text(text): ## split the text into a title + newline + rest of the text ## if we only get the title, put in two helpful newlines title, body = textutils.extract_title_body(text) if body.lstrip(): return u"%s\n%s" % (title, body) else: return u"%s\n\n" % (title,) class CreateNote (Action): def __init__(self): Action.__init__(self, _("Create Note")) def activate(self, leaf): notes = _get_notes_interface(activate=True) text = _prepare_note_text(leaf.object) # FIXME: For Gnote we have to call DisplayNote # else we can't change its contents noteuri = notes.CreateNote() notes.DisplayNote(noteuri) notes.SetNoteContents(noteuri, text) def item_types(self): yield TextLeaf def get_description(self): return _("Create a new note from this text") def get_icon_name(self): return "document-new" class GetNoteSearchResults (Action): def __init__(self): Action.__init__(self, _("Get Note Search Results...")) def is_factory(self): return True def activate(self, leaf): query = leaf.object return NoteSearchSource(query) def item_types(self): yield TextLeaf def get_description(self): return _("Show search results for this query") class NoteSearchSource (Source): def __init__(self, query): self.query = query.lower() Source.__init__(self, _("Notes")) def get_items(self): notes = _get_notes_interface(activate=True) noteuris = notes.SearchNotes(self.query, False) for noteuri in noteuris: title = notes.GetNoteTitle(noteuri) date = notes.GetNoteChangeDate(noteuri) yield Note(noteuri, title, date) def repr_key(self): return self.query def get_gicon(self): return icons.get_gicon_with_fallbacks(None, PROGRAM_IDS) def provides(self): yield Note class Note (Leaf): """The Note Leaf's represented object is the Note URI""" def __init__(self, obj, name, date): self.changedate = date Leaf.__init__(self, obj, name) def get_actions(self): yield Open() def repr_key(self): # the Note URI is unique&persistent for each note return self.object def get_description(self): today_date = time.localtime()[:3] yest_date = time.localtime(time.time() - 3600*24)[:3] change_time = time.localtime(self.changedate) if today_date == change_time[:3]: time_str = _("today, %s") % unicode_strftime("%X", change_time) elif yest_date == change_time[:3]: time_str = _("yesterday, %s") % unicode_strftime("%X", change_time) else: time_str = unicode_strftime("%c", change_time) # TRANS: Note description, %s is last changed time in locale format return _("Last updated %s") % time_str def get_icon_name(self): return "text-x-generic" class ClassProperty (property): """Subclass property to make classmethod properties possible""" def __get__(self, cls, owner): return self.fget.__get__(None, owner)() class NotesSource (ApplicationSource): def __init__(self): Source.__init__(self, _("Notes")) self._notes = [] def initialize(self): """Set up filesystem monitors to catch changes""" # We monitor all directories that exist of a couple of candidates dirs = [] for program in PROGRAM_IDS: notedatapaths = (os.path.join(base.xdg_data_home, program), os.path.expanduser("~/.%s" % program)) dirs.extend(notedatapaths) self.monitor_token = self.monitor_directories(*dirs) def _update_cache(self, notes): try: noteuris = notes.ListAllNotes() except dbus.DBusException, e: self.output_error("%s: %s" % (type(e).__name__, e)) return templates = notes.GetAllNotesWithTag("system:template") self._notes = [] for noteuri in noteuris: if noteuri in templates: continue title = notes.GetNoteTitle(noteuri) date = notes.GetNoteChangeDate(noteuri) self._notes.append((noteuri, title, date)) def get_items(self): notes = _get_notes_interface() if notes: self._update_cache(notes) for noteuri, title, date in self._notes: yield Note(noteuri, title, date=date) def provides(self): yield Note def get_gicon(self): return icons.get_gicon_with_fallbacks(None, PROGRAM_IDS) def get_icon_name(self): return "gnote" @ClassProperty @classmethod def appleaf_content_id(cls): return __kupfer_settings__["notes_application"] or PROGRAM_IDS kupfer-v208/kupfer/plugin/openoffice.py000066400000000000000000000107701176220042200203310ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("OpenOffice / LibreOffice") __kupfer_sources__ = ("RecentsSource", ) __description__ = _("Recently used documents in OpenOffice/LibreOffice") __version__ = "2011-04-07" __author__ = "Karol Będkowski " ''' Changes: 2011-04-02: Support new cofiguration file format in LibreOffice. ''' import os from xml.etree import cElementTree as ElementTree import gio from kupfer.objects import Source, FileLeaf, UrlLeaf, AppLeaf from kupfer.obj.helplib import FilesystemWatchMixin _HISTORY_FILE = [ "~/.config/libreoffice/3/user/registrymodifications.xcu", "~/.libreoffice/3/user/registrymodifications.xcu", "~/.openoffice.org/3/user/registrymodifications.xcu", "~/.openoffice.org/3/user/registry/data/org/openoffice/Office/Histories.xcu", ] _NAME_ATTR = "{http://openoffice.org/2001/registry}name" _PATH_ATTR = "{http://openoffice.org/2001/registry}path" _HISTORY_NODES = "/org.openoffice.Office.Histories/Histories/" \ "org.openoffice.Office.Histories:HistoryInfo['PickList']/OrderList" class MultiAppContentMixin (object): """ Mixin for Source that decorates many app leaves This Mixin sees to that the Source is set as content for the applications with id 'cls.appleaf_content_id', which may also be a sequence of ids. Source has to define the attribute appleaf_content_id and must inherit this mixin BEFORE the Source This Mixin defines: decorates_type, decorates_item """ @classmethod def __get_appleaf_id_iter(cls): if hasattr(cls.appleaf_content_id, "__iter__"): ids = iter(cls.appleaf_content_id) else: ids = (cls.appleaf_content_id, ) return ids @classmethod def decorates_type(cls): return AppLeaf @classmethod def decorate_item(cls, leaf): if leaf.get_id() in cls.__get_appleaf_id_iter(): return cls() class RecentsSource (MultiAppContentMixin, Source, FilesystemWatchMixin): appleaf_content_id = [ "openoffice.org-writer", "openoffice.org-base", "openoffice.org-calc", "openoffice.org-draw", "openoffice.org-impress", "openoffice.org-math", "openoffice.org-startcenter", "libreoffice-writer", "libreoffice-base", "libreoffice-calc", "libreoffice-draw", "libreoffice-impress", "libreoffice-math", "libreoffice-startcenter", ] def __init__(self, name=_("OpenOffice/LibreOffice Recent Items")): Source.__init__(self, name) def initialize(self): hist_file_path = _get_history_files() if hist_file_path: dirs = map(os.path.dirname, hist_file_path) self.monitor_token = self.monitor_directories(*dirs) def monitor_include_file(self, gfile): return gfile and gfile.get_basename().endswith('.xcu') def get_items(self): for hist_file_path in _get_history_files(): self.output_debug('reading', hist_file_path) try: tree = ElementTree.parse(hist_file_path) node_histories = tree.find('node') if node_histories and node_histories.attrib[_NAME_ATTR] == 'Histories': for list_node in node_histories.findall('node'): if list_node.attrib[_NAME_ATTR] == 'PickList': items_node = list_node.find('node') if (not items_node \ or items_node.attrib[_NAME_ATTR] != 'ItemList'): return for node in items_node.findall('node'): hfile = node.attrib[_NAME_ATTR] # file://..... leaf = _create_history_leaf(hfile) if leaf: yield leaf break # new configuration file for item in tree.getroot().findall('item'): if item.get(_PATH_ATTR) != _HISTORY_NODES: continue node = item.find('node') if not node: continue prop = node.find('prop') if not prop: continue if prop.get(_NAME_ATTR) != 'HistoryItemRef': continue value = prop.find('value') if value is not None: leaf = _create_history_leaf(value.text) if leaf: yield leaf except StandardError, err: self.output_error(err) def get_description(self): return _("Recently used documents in OpenOffice/LibreOffice") def get_icon_name(self): return "document-open-recent" def provides(self): yield FileLeaf yield UrlLeaf def _get_history_files(): ''' get all existing files with history ''' for file_path in _HISTORY_FILE: path = os.path.expanduser(file_path) if os.path.isfile(path): yield path def _create_history_leaf(path): ''' Create leaf from file url ''' if not path: return None gfile = gio.File(path) if not gfile.query_exists(): None if gfile.get_path(): return FileLeaf(gfile.get_path()) return UrlLeaf(path, gfile.get_basename()) kupfer-v208/kupfer/plugin/opera.py000066400000000000000000000031021176220042200173110ustar00rootroot00000000000000# -*- coding: UTF-8 -*- from __future__ import with_statement __kupfer_name__ = _("Opera Bookmarks") __kupfer_sources__ = ("BookmarksSource", ) __description__ = _("Index of Opera bookmarks") __version__ = "2010-01-12" __author__ = "Karol Będkowski " import codecs import os from kupfer.objects import Source, UrlLeaf from kupfer.obj.apps import ApplicationSource BOOKMARKS_FILE = "bookmarks.adr" class BookmarksSource(ApplicationSource): appleaf_content_id = "opera" def __init__(self, name=_("Opera Bookmarks")): Source.__init__(self, name) self.unpickle_finish() def unpickle_finish(self): self._opera_home = os.path.expanduser("~/.opera/") self._bookmarks_path = os.path.join(self._opera_home, BOOKMARKS_FILE) def initialize(self): self.monitor_token = self.monitor_directories(self._opera_home) def monitor_include_file(self, gfile): return gfile and gfile.get_basename() == BOOKMARKS_FILE def get_items(self): name = None try: with codecs.open(self._bookmarks_path, "r", "UTF-8") as bfile: for line in bfile: line = line.strip() if line.startswith(u'NAME='): name = line[5:] elif line.startswith(u'URL=') and name: yield UrlLeaf(line[4:], name) except EnvironmentError, exc: self.output_error(exc) except UnicodeError, exc: self.output_error("File %s not in expected encoding (UTF-8)" % self._bookmarks_path) self.output_error(exc) def get_description(self): return _("Index of Opera bookmarks") def get_icon_name(self): return "opera" def provides(self): yield UrlLeaf kupfer-v208/kupfer/plugin/operamail.py000066400000000000000000000071431176220042200201650ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("Opera Mail") __kupfer_sources__ = ("OperaContactsSource", ) __kupfer_actions__ = ("NewMailAction", ) __description__ = _("Opera Mail contacts and actions") __version__ = "2010-10-19" __author__ = "Chris Parsons " import codecs import os from kupfer.objects import Action from kupfer.objects import TextLeaf, UrlLeaf, RunnableLeaf from kupfer import utils from kupfer.obj.helplib import FilesystemWatchMixin from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj.contacts import ContactLeaf, EmailContact, email_from_leaf CONTACTS_FILE = "contacts.adr" class ComposeMail(RunnableLeaf): ''' Create new mail without recipient ''' def __init__(self): RunnableLeaf.__init__(self, name=_("Compose New Email")) def run(self): utils.spawn_async(['opera', '-remote', 'openComposer()']) def get_description(self): return _("Compose a new message in Opera Mail") def get_icon_name(self): return "mail-message-new" class NewMailAction(Action): ''' Create new mail to selected leaf''' def __init__(self): Action.__init__(self, _('Compose Email')) def activate(self, leaf): self.activate_multiple((leaf, )) def activate_multiple(self, objects): recipients = ",".join(email_from_leaf(L) for L in objects) utils.spawn_async(['opera', '-remote', 'openURL(mailto:%s)' % recipients]) def get_icon_name(self): return "mail-message-new" def item_types(self): yield ContactLeaf yield TextLeaf yield UrlLeaf def valid_for_item(self, item): return bool(email_from_leaf(item)) class OperaContactsSource(ToplevelGroupingSource, FilesystemWatchMixin): def __init__(self, name=_("Opera Mail Contacts")): super(OperaContactsSource, self).__init__(name, "Contacts") self._opera_home = os.path.expanduser("~/.opera/") self._contacts_path = os.path.join(self._opera_home, CONTACTS_FILE) def initialize(self): ToplevelGroupingSource.initialize(self) if not os.path.isdir(self._opera_home): return self.monitor_token = self.monitor_directories(self._opera_home) def monitor_include_file(self, gfile): return gfile and gfile.get_basename() == CONTACTS_FILE def get_items(self): name = None folderList = ['TopLevel'] TRASH = 'XXXTRASHXXX' try: with codecs.open(self._contacts_path, "r", "UTF-8") as bfile: for line in bfile: line = line.strip() if line.startswith(u'-'): folderList.pop() elif line.startswith(u'#FOLDER'): entryType = 'Folder' elif line.startswith(u'#CONTACT'): entryType = 'Contact' elif line.startswith(u'TRASH FOLDER=YES'): folderList[-1] = TRASH elif line.startswith(u'NAME='): name = line[5:] if entryType == 'Folder': folderList.append(name) elif line.startswith(u'MAIL=') and name and \ entryType == 'Contact' and not TRASH in folderList: # multiple addresses separated with # two Ctrl-B (\x02) characters emails = line[5:].split('\x02\x02') for e in emails: yield EmailContact(e, name) except EnvironmentError, exc: self.output_error(exc) except UnicodeError, exc: self.output_error("File %s not in expected encoding (UTF-8)" % self._bookmarks_path) self.output_error(exc) yield ComposeMail() def should_sort_lexically(self): # since it is a grouping source, grouping and non-grouping will be # separate and only grouping leaves will be sorted return True def get_description(self): return _("Contacts from Opera Mail") def get_icon_name(self): return "opera" def provides(self): yield RunnableLeaf yield ContactLeaf # vi:nosmarttab:noexpandtab:ts=4:sw=4 kupfer-v208/kupfer/plugin/pidgin.py000066400000000000000000000241151176220042200174640ustar00rootroot00000000000000'''Inspiration from the deskbar pidgin plugin and from the gajim kupfer plugin''' __kupfer_name__ = _("Pidgin") __kupfer_sources__ = ("ContactsSource", ) __kupfer_actions__ = ( "OpenChat", "SendMessage", ) __description__ = _("Access to Pidgin Contacts") __version__ = "0.1" __author__ = ("Chmouel Boudjnah , " "Ulrik Sverdrup ") import dbus from kupfer.objects import Action, TextLeaf, TextSource from kupfer import pretty, scheduler from kupfer import icons from kupfer import plugin_support from kupfer.obj.apps import AppLeafContentMixin from kupfer.obj.helplib import PicklingHelperMixin from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.weaklib import dbus_signal_connect_weakly from kupfer.obj.contacts import NAME_KEY, EMAIL_KEY, ContactLeaf, is_valid_email __kupfer_settings__ = plugin_support.PluginSettings( { "key" : "show_offline", "label": _("Show offline contacts"), "type": bool, "value": False, }, ) plugin_support.check_dbus_connection() # Contact data contstants PIDGIN_ACCOUNT = "_PIDGIN_ACCOUNT" PIDGIN_JID = "_PIDGIN_JID" # D-Bus "addresses" SERVICE_NAME = "im.pidgin.purple.PurpleService" OBJECT_NAME = "/im/pidgin/purple/PurpleObject" IFACE_NAME = "im.pidgin.purple.PurpleInterface" def _create_dbus_connection(activate=False): ''' Create dbus connection to Pidgin @activate: true=starts pidgin if not running ''' interface = None obj = None sbus = dbus.SessionBus() try: #check for running pidgin (code from note.py) proxy_obj = sbus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(proxy_obj, 'org.freedesktop.DBus') if activate or dbus_iface.NameHasOwner(SERVICE_NAME): obj = sbus.get_object(SERVICE_NAME, OBJECT_NAME) if obj: interface = dbus.Interface(obj, IFACE_NAME) except dbus.exceptions.DBusException, err: pretty.print_debug(err) return interface def _send_message_to_contact(pcontact, message, present=False): """ Send @message to PidginContact @pcontact """ interface = _create_dbus_connection() if not interface: return account = pcontact[PIDGIN_ACCOUNT] jid = pcontact[PIDGIN_JID] conversation = interface.PurpleConversationNew(1, account, jid) im = interface.PurpleConvIm(conversation) interface.PurpleConvImSend(im, message) if present: interface.PurpleConversationPresent(conversation) class ContactAction (Action): def get_required_slots(self): return () def item_types(self): yield ContactLeaf def valid_for_item(self, leaf): return all(slot in leaf for slot in self.get_required_slots()) class OpenChat(ContactAction): """ Open Chat Conversation Window with jid """ # consider it as main action for pidgin contacts rank_adjust = 5 def __init__(self): Action.__init__(self, _('Open Chat')) def activate(self, leaf): _send_message_to_contact(leaf, u"", present=True) def get_required_slots(self): return [PIDGIN_ACCOUNT, PIDGIN_JID] class ChatTextSource (TextSource): def get_rank(self): return 100 def get_text_items(self, text): n = len(text) summary = text[:10] + (text[10:11] and "..") desc_template = ngettext("%s (%d character)", "%s (%d characters)", n) yield TextLeaf(text, desc_template % (summary, n)) def get_items(self, text): return self.get_text_items(text) class SendMessage (ContactAction): """ Send chat message directly from Kupfer """ def __init__(self): Action.__init__(self, _("Send Message...")) def activate(self, leaf, iobj): _send_message_to_contact(leaf, iobj.object) def get_required_slots(self): return [PIDGIN_ACCOUNT, PIDGIN_JID] def requires_object(self): return True def object_types(self): yield TextLeaf def object_source(self, for_item=None): return TextSource() def valid_object(self, iobj, for_item=None): # ugly, but we don't want derived text return type(iobj) is TextLeaf class PidginContact(ContactLeaf): """ Leaf represent single contact from Pidgin """ grouping_slots = ContactLeaf.grouping_slots + (EMAIL_KEY, ) def __init__(self, jid, name, account, icon, protocol, available, status_message): slots = { EMAIL_KEY: jid, NAME_KEY: name or jid, PIDGIN_ACCOUNT: account, PIDGIN_JID: jid, } if not is_valid_email(jid): slots[EMAIL_KEY] = None ContactLeaf.__init__(self, slots, name or jid) self.kupfer_add_alias(jid) self._description = _("[%(status)s] %(userid)s/%(service)s") % \ { "status": _("Available") if available else _("Away"), "userid": jid, "service": protocol, } if status_message: self._description += u"\n%s" % status_message self.account = account self.jid = jid self.icon = icon self.protocol = protocol def repr_key(self): # the repr key should be persistent and hopefully unique return "%s, %s" % (self.protocol, self.object[PIDGIN_JID]) def get_description(self): return self._description def get_thumbnail(self, width, height): if not self.icon: return return icons.get_pixbuf_from_file(self.icon, width, height) def get_icon_name(self): return "stock_person" class ContactsSource(AppLeafContentMixin, ToplevelGroupingSource, PicklingHelperMixin): ''' Get contacts from all on-line accounts in Pidgin via DBus ''' appleaf_content_id = 'pidgin' def __init__(self): ToplevelGroupingSource.__init__(self, _('Pidgin Contacts'), "Contacts") self._version = 5 self.unpickle_finish() def unpickle_finish(self): self.mark_for_update() self.pickle_prepare() def initialize(self): ToplevelGroupingSource.initialize(self) self._install_dbus_signal() self._buddy_update_timer = scheduler.Timer() self._buddy_update_queue = set() def pickle_prepare(self): # delete data that we do not want to save to next session self.all_buddies = {} self._buddy_update_timer = None self._buddy_update_queue = None def _get_pidgin_contact(self, interface, buddy, account=None, protocol=None): if not account: account = interface.PurpleBuddyGetAccount(buddy) if not protocol: protocol = interface.PurpleAccountGetProtocolName(account) jid = interface.PurpleBuddyGetName(buddy) name = interface.PurpleBuddyGetAlias(buddy) _icon = interface.PurpleBuddyGetIcon(buddy) icon = None if _icon != 0: icon = interface.PurpleBuddyIconGetFullPath(_icon) presenceid = interface.PurpleBuddyGetPresence(buddy) statusid = interface.PurplePresenceGetActiveStatus(presenceid) availability = interface.PurplePresenceIsAvailable(presenceid) status_message = interface.PurpleStatusGetAttrString(statusid, "message") return PidginContact(jid, name, account, icon, protocol, availability, status_message) def _get_all_buddies(self): interface = _create_dbus_connection() if interface is None: return accounts = interface.PurpleAccountsGetAllActive() show_offline = __kupfer_settings__["show_offline"] for account in accounts: buddies = interface.PurpleFindBuddies(account, dbus.String('')) protocol = interface.PurpleAccountGetProtocolName(account) for buddy in buddies: if not (show_offline or interface.PurpleBuddyIsOnline(buddy)): continue self.all_buddies[buddy] = self._get_pidgin_contact(interface, buddy, protocol=protocol, account=account) def _remove_buddies_not_connected(self): """ Remove buddies that belong to accounts no longer connected """ if not self.all_buddies: return interface = _create_dbus_connection() if interface is None: self.all_buddies = {} return try: # extra careful as this will fail when Pidgin is Quitting accounts = interface.PurpleAccountsGetAllActive() except dbus.DBusException: self.all_buddies = {} return is_disconnected = interface.PurpleAccountIsDisconnected conn_accounts = set(a for a in accounts if not is_disconnected(a)) for buddy, pcontact in self.all_buddies.items(): if pcontact.account not in conn_accounts: del self.all_buddies[buddy] def _signing_off(self, conn): self.output_debug("Pidgin Signing Off", conn) self._remove_buddies_not_connected() self.mark_for_update() def _update_pending(self): """Update all buddies in the update queue""" interface = _create_dbus_connection() if interface is None: self._buddy_update_queue.clear() return show_offline = __kupfer_settings__["show_offline"] for buddy in self._buddy_update_queue: if show_offline or interface.PurpleBuddyIsOnline(buddy): self.output_debug("updating buddy", buddy) pcontact = self._get_pidgin_contact(interface, buddy) self.all_buddies[buddy] = pcontact else: self.all_buddies.pop(buddy, None) self._buddy_update_queue.clear() self.mark_for_update() def _buddy_needs_update(self, buddy): """add @buddy to the update queue""" if self._buddy_update_queue is not None: self._buddy_update_queue.add(buddy) self._buddy_update_timer.set(1, self._update_pending) def _buddy_signed_on(self, buddy): if buddy not in self.all_buddies: self._buddy_needs_update(buddy) def _buddy_signed_off(self, buddy): if buddy in self.all_buddies: del self.all_buddies[buddy] self.mark_for_update() def _buddy_status_changed(self, buddy, old, new): '''Callback when status is changed reload the entry which get the new status''' self._buddy_needs_update(buddy) def _install_dbus_signal(self): '''Add signals to pidgin when buddy goes offline or online to update the list''' try: session_bus = dbus.Bus() except dbus.DBusException: return dbus_signal_connect_weakly(session_bus, "SigningOff", self._signing_off, dbus_interface=IFACE_NAME) dbus_signal_connect_weakly(session_bus, "BuddySignedOn", self._buddy_signed_on, dbus_interface=IFACE_NAME) dbus_signal_connect_weakly(session_bus, "BuddyStatusChanged", self._buddy_status_changed, dbus_interface=IFACE_NAME) dbus_signal_connect_weakly(session_bus, "BuddySignedOff", self._buddy_signed_off, dbus_interface=IFACE_NAME) def get_items(self): if not self.all_buddies: self._get_all_buddies() return self.all_buddies.values() def should_sort_lexically(self): return True def get_icon_name(self): return 'pidgin' def provides(self): yield PidginContact # Local Variables: *** # python-indent: 8 *** # indent-tabs-mode: t *** # End: *** kupfer-v208/kupfer/plugin/putty.py000066400000000000000000000072401176220042200173770ustar00rootroot00000000000000# -*- coding: UTF-8 -*- from __future__ import with_statement __kupfer_name__ = _("PuTTY Sessions") __kupfer_sources__ = ("PuttySessionSource", ) __kupfer_actions__ = ("PuttyOpenSession", ) __description__ = _("Quick access to PuTTY Sessions") __version__ = "2010-04-12" __author__ = "Karol Będkowski " import os import urllib from kupfer.objects import Action from kupfer.obj.helplib import FilesystemWatchMixin, PicklingHelperMixin from kupfer.obj.apps import AppLeafContentMixin from kupfer import utils, icons from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj.hosts import HOST_NAME_KEY, HostLeaf, HOST_ADDRESS_KEY, \ HOST_SERVICE_NAME_KEY, HOST_SERVICE_PORT_KEY, HOST_SERVICE_USER_KEY PUTTY_SESSION_KEY = "PUTTY_SESSION" class PuttySession(HostLeaf): """ Leaf represent session saved in PuTTy""" def __init__(self, name, hostname, description): slots = {HOST_NAME_KEY: hostname, PUTTY_SESSION_KEY: name, HOST_ADDRESS_KEY: hostname, HOST_SERVICE_NAME_KEY: 'ssh'} HostLeaf.__init__(self, slots, name) self._description = description def get_description(self): return self._description def get_gicon(self): return icons.ComposedIconSmall(self.get_icon_name(), "putty") class PuttyOpenSession(Action): ''' opens putty session ''' def __init__(self): Action.__init__(self, _('Start Session')) def activate(self, leaf): if leaf.check_key(PUTTY_SESSION_KEY): session = leaf[PUTTY_SESSION_KEY] utils.spawn_async(["putty", "-load", session]) else: options = ['putty'] if leaf.check_key(HOST_SERVICE_USER_KEY): options.extend(['-l ', leaf[HOST_SERVICE_USER_KEY]]) if leaf.check_key(HOST_SERVICE_PORT_KEY): options.extend(['-P ', leaf[HOST_SERVICE_PORT_KEY]]) options.append(leaf[HOST_ADDRESS_KEY]) utils.spawn_async(options) def get_icon_name(self): return 'putty' def item_types(self): yield HostLeaf def valid_for_item(self, item): if item.check_key(HOST_SERVICE_NAME_KEY): if item[HOST_SERVICE_NAME_KEY] == 'ssh': return True return item.check_key(PUTTY_SESSION_KEY) class PuttySessionSource(AppLeafContentMixin, ToplevelGroupingSource, PicklingHelperMixin, FilesystemWatchMixin): ''' indexes session saved in putty ''' appleaf_content_id = 'putty' def __init__(self, name=_("PuTTY Sessions")): super(PuttySessionSource, self).__init__(name, "hosts") self._version = 2 self._putty_sessions_dir = os.path.expanduser('~/.putty/sessions') self.unpickle_finish() def unpickle_finish(self): self.monitor_token = self.monitor_directories(self._putty_sessions_dir) def get_items(self): if not os.path.isdir(self._putty_sessions_dir): return for filename in os.listdir(self._putty_sessions_dir): if filename == 'Default%20Settings': continue obj_path = os.path.join(self._putty_sessions_dir, filename) if os.path.isfile(obj_path): name = urllib.unquote(filename) description, host = self._load_host_from_session_file(obj_path) yield PuttySession(name, host, description) def get_description(self): return None def get_icon_name(self): return "putty" def provides(self): yield PuttySession def _load_host_from_session_file(self, filepath): user = None host = None try: with open(filepath, 'r') as session_file: for line in session_file: if line.startswith('HostName='): host = line.split('=', 2)[1].strip() elif line.startswith('UserName='): user = line.split('=', 2)[1].strip() except IOError, err: self.output_error(err) else: if host: return unicode(user + '@' + host if user else host, "UTF-8", "replace"), unicode(host, 'UTF-8', 'replace') return u'PuTTY Session', None kupfer-v208/kupfer/plugin/qsicons/000077500000000000000000000000001176220042200173145ustar00rootroot00000000000000kupfer-v208/kupfer/plugin/qsicons/Action.png000066400000000000000000000334371176220042200212510ustar00rootroot00000000000000PNG  IHDR>a IDATx ]Uw[}4"OVl"J0%5H#vD ` pTEL!B9~ZuSM*};^5Zc1xᇻ׿~߶x/~փ>Ru7և>֕W^ٺ 8FO1f"</կ~RK{m}}/y'4XzZ wGi * @U=Ӻ[g+?hy睭G} j9aPψ==P~_Wgկ HM7ݴj:jpӣ=+چ_ފO~׾W/| {sO/#RN}N}WO=X~{;h|ͭo||+H ‰\3:q!?E?K.vm|3}w[w_e`'*@&qPFhϋyor[o~%0 ~/̵k>`h/;s*†QWq?^ $X ,8k5@? ⬳Κ|;+~$+0k5|V@G?V oP7pCG5p"`->>я^ǷX CL <\:h}Sj}_]a$߱t\p.{O~+b]:M?@<~, 7u@Ӑ!@H.\puu.قZO|bn&N;J@'x7^ \2!Xn}w? X5d'[е^{-7|6efϞ='BH ۽[nZ!Jg:%Fqc i.$;1$2@K|&XT&;S;tA/ƎMp?OUcj)3A0k֬; e@wR$s%\ UY'!E gP_* 0,PZwuZAwcRoCH|BG>R/}K+-Q%ݧcyGB抠l /|YDgǃ`%3L<  ` $bu\6 7G48 ΄rd-?p{_+Յ5B:߳dɒ<1G[^ziu?6†XTď^v9߁[Ä3PM(uL>DrO1P~Bt}iAπV0HlD瞋:[ny H|} Z JTXAE 2,}&"@x 5چI:7˲AAOۙ D:g"!8>}{Y:~@C0rTe]Vq=9 Ì駟ޚ3gNkܹN: {X64}t+Pqc@P?&{~ɃмH0D:{ҥ+ kYs//] L;no;HΧ=39S?_`?ug_*Q̜?F\B %~l"~LܿD7#$c  c( a$y)sXg%3yfAT$``GP.`{ .'ܚ={6? "4Hl !>segf#I%B* q1e! v`Jo =14ź`GB`$Ix!8M^ƨ`AC/\0э2CRU@PhaT1_.zsG)nHA UBՆ,`K"e G ᵢd0pﻁ$"LDqU*gWBP<Bs?! + r@5`' -ZiU܏>(LO^0͜C qx^}gmʮ0] (c"B&IF?߅uo0$A{.ȫ\kmdvB@!hgUUϽ0lgѺ{>^ fwi -9m$KlѺh7nY@1 [ iPupu  2ٸ836[!>ay!h+4|wRICx c8Jv,涙}9uC J rUEG{]ݢDh I(ۃKbk=7y a Gy V ز,<&T TLC gP%b27} ~H9mvb3ׯkޤ XR#E#R瞋bأCfE\FhJ!} *400 }}AZ`& 8=gh!}*+_>ğ\k36Ҵ52g^5PZ¨Irv;!l~y|=5REIV"!ܭhHAD{!mAF#KUU͜o`ȸ??o~{sUD 7N .1x(L`~kApm8=s7{ }%}>r-@Մ?Uӯ/ Z0;>$QWIꀉV+T92sgi\bA\}3%o.4R!ć&++*g^fm2LcU 3p`]lVq%e9&k~sV!bkPQE|qMEXC0wF io;yEyy B*a20lo1gu<} Io,+2|!z0R/^Iܛ$f{J!G%ƠBoVE'xR{(À>A!l&8A%IK_Ϣ7bLkCQ XX_iӦ}Ͽ18a3D/~ BA1ȸݍ2LCCE(?B!o0·LAL>e3Rň$z1cL4 0`4W/;x4BsM&BsϽ/xRjz1ӢW_5CWg}. 5uo/A붱W: R](})U*7 B?qнr??w2-1r%vusJ!8f h*Mw4l'ю)5(D &\KZ[E8w.upP H+FNL916?aj0w}9WwI~ 0M7H[KJMx8AtvPw_}o[J:ԛ.R?&h|HDٍfU.lsw[b_,}.G t[7[ԛ'y|qF{S/ Rmh{z?^jɀT3Ν9mh2-dՁ`7 cvIu4(mب.]p+u*@o@[8[JM7Rk^jA!6gPRo2he+7o(5 y@jr̙38s gU }4QkӜx}y&Rc0'Xp(^ Agl˗mQcA|#PV a-I6ږ&R/K zAMRMKN[ڵ@@" ]؛?vW!H-36`+Ru;X)j2A7\,cm,crvhTh@ń4QI zCUO8%X"DXlI,X>+g7_GKXB% :2li[I8| P%BC `3] 141p7X׆pO\Z~p#\BCxљ8MVbGl{0yHѥH±0)"yfm63}f=!tJ|_ j#,U,u/*^ҥ?RN u6]Zo-cq # c"r͚N\oRA=`/ 0&8D;?cB|#v@ts Q> cFAGE7] ǚ́@1xſ!X!S4<{&fmQ|4\x8L?~ IU@pTHX`ɻt3DxGKuQncRK4l&~P^?rlD>Vp#MqwbU oãfap i8 جbvY^Grwh0j1s R͛QYj NWLtρ. 0bo;s$!s\nr׿'z eljI:ĉ49] xQCy a~kFjwY1c^ ,/)1(M[wWܧkɒ%]w^j nJ vƎ K7m]?f24-`&גV'=RKm1 D4ctG o7xD9،pœ.HrH(1f0n3ܛ$Q1͏{:S z==l==@w0@D@h7=D\'Cy9WalTR_vhm2F}7rE _0kXQ}-T[jP1x9;^uoN @pZ}K ̅3ӈ^JvqGvp"q`Yoϐ@ LQϬ# C JFe0O Ǵ{8#7<Jx3Km#M<!s 'rNf$D%-Jfzx^I@@$GJ[\J iN\y`baPlz@~O1=bU*)i'lҷ% uNS[fx\ΟtB &V*sYG3]zyc$K"vKT[Hvw#D`% d&眶g0ːSە~!R5q9 N[4`ؽ֮^>\#WRi|Uq@r4Fa׭7?z^RHQm{ )|&M`"6v6 &v.{cpPky0# lE2l".r1KK_E m!'$ ݊qCiA&6co/Q{y4ɜC#o% du4AP'õr>~"ԴlrOupzyhh(9JyLkd>.rb0e93[VP#q&g@`NRZI:h gM<>W7`'=PIfU/CsB<|k(fDzJܠR:Xw)5VV$Y*[{LBJ:b-;ڵ $ݡo ip+zw AlD>L(И+9Qnˀ6vA6eurm츐&E`輎!8`X`RJ+q>.aScǎeӥi is 78b93; fƳ3eж͞Wgdn!g[fG̣\_nH!$ht ;R+8<7C 9"9$s3teϬZ1B|Aeu0Q⁚Ghkoy#3gQD:Fॗ^:1'ZWp@ܻ8:t _PY&N8cwysƍw{R&mnw}i atKdʼ?s&SO=]x¡r{BK>:ܒ5zC] h['M\%MlA˥tЅz9GuYf!A@*uQ<7P`ʮ }X#B4>72zB4:HG_9 <IDATa`$[T}ss@l{<?wk̓5h-) .6Mӑb5ldsW\qK޹Αnx0!w|E1sGodo c,b⹆z[oi&@̓5h-)]o3ԻY۱>eЮmf!/ҷӈu_Cz˪ohMpRĵ6BO@Léaa-e/,C7SoR&Bە6mZD`AK_1z}{o?D D`Ҡ=KƠ BU`%0&($ [ TrʋBx̓!-Xm8<͢W4;&: 5 4ڮ/ ԮL\ dlڮҗHyHt-SgY'gȘSZ̈F1B£t@@H2Ӱ̈́wSǽ  }q-.}LT%8fuBەB:҆m͛b +ਡ~˗/qhRIQsyUޔi3i#o]H>/(1$,$sX52e~[񱉓?s?YjJ^"b#f7AChiJ!aBK[ p`skи0@ {w=: @@{ٲrgL.Mz n=q̓,p1>*PܷWw2^07KfzGZoBەBɑ|n}fӞ DY "w N#=;CPݖyCk-aIuV&z_&IݭχY ~+!\~,XmGC!m#4ɱ-EL8,/kZF%'QZKafAd2=s=568I 5@цC2I]Ǡ|HuT Jà5#F0cƌa+oT9IzN558"ķ *:~A]ZjΜ9DA $;2=<cYN\hrDG1`l+9+A [HƌǮo 9" 8@UgEp5a=`FmCog@tq8>{T-k\)3-OAj)., qsXѲ,<[ݮ P s !6 1d䚀l Tvn溼d:`vM `fm&JF`y/H#8(hS:}*e$Gy(?)yV9;mD6s}A0쁍A{/`jIK =LgիR/[4\.["T8~8ᵾSV-WA@3v gT.T`gy7CUiKh9#0f'i!u]\ډJh] 7y Q% 2qS*@@(,b6`gyɾJG/z<-ݯ ֝XwdtAc@V¦D @A3Mӱ l'P+<(vau}zyT<{JD$Na|c#>FhF-&Dsxy-y z&x+i &B?J G$Jpȳ| %cJ!pw X%|& [Ɖ5d";hIˡe6ce4$g4\r~T僬%I]1^~PH$AAEfyF 9-_3]o :[/3w %@` BJ=m4'dgfZYDGlCs_ E:QawpT_o2Q?ruHHOUdb1P \|!vcﴧf74ːnlcǒW/J3h~Tw(:2,7ǹa1 <4ɵ&mqi+_='ѰruNZ/*fV8~ͼ=S-`Msg>Ydtّ4 }xb 16ȘnX-gܨ W}&*,ʤB4.r5m& Ai̽Y8|9gψ]z}I/Z Xqog&y|-sW =Ӹ>I=gʄxB{||Q\]KPՒ"^qmEN\트wCñVẈs7x0$=x 06~l򧧒ʉͭx GbMopL#KQB-3n!'oQgBP$f7kh1dE~.QjS7 E!{ C*pEf2\v{q_|kk 1.~k=1zv,$çzՙ^yD3qC'AX%ݠYN09.gJ3׻4s?ŹB9Lzѳ:bP?MwnJNܾg|{v6sh 7Ƀ*r!ACb` ,a߿oVw)VjAxұ![{47c|  X R(}3lѿDtP>M0 B,Aykrۢsȳ@^h-5! H7xG}83|Hp ˗/. +0軄gb7ԙo+ !Mzu2Y)?ۛ{P? XY¾^ p&=3՟ ,@;p g*3~IC&T QL&G> fp<@70W)*.^=P|=܎0!v_ȯ2?k$uЌ@aϽzz!&5sc2GTN"|畯|RO|^ypT@"~l9n'CL$Q .iN*% p; -Tb :/:~-`YG@тHf 1T?6hw7~Is7| $ܜʫp 'Ӄ!:hSW:LlfJ+OpXJm!vE?h8o!~= ?1@ `J\'ܯo@e7)(@[37omu<} D%D7c8upᅤ[[ .Xo/kv`ܹn Ϝtz+挹c;>A~sN,fAs=8gu, 0־T {>  X僪V?3 愹a40;u<}d1KUM-WWX[{{if'`_戹bΘ;p߇ @Ojav][pgO= w&MϹn 9Zu]U s1WsRIxޠJ_z>9ˀR6,h@=H ϙ3gκ}f.4d׸pydkݶʕ@S `:~`b"`Vя~9sT>u 2P}1{c-=`ʔ)S!:;K>6TU:P:Fk'OJ8+ #ͣJaÝJu9NZM@w4m?z8p-KMa IDATx}XUklQlH"HWb]Q" ("MzWX=,{-bIb^MgosBM^%癇v8e;3 TUVժZUjUԙ2}PgЄ!1eA GD'}(21ix\{ S%-0gd?S75~ π0;Of͉ {<*6qrJ:eeQ^^!-˩֭[K֭,׉?^SFŴtrZ{/qnJEJ9q)G6?pR}Ǐm>=8j쨤kht]V֗ӆ 멜xq!effRjj*P KZZ*ϟOdڴq#޵G**hTl%-0ohpy`n:ޡ13&KNbrZl[{͝;WPrss#GGG8p 2ƌC{/// HFВ%Kh5sg9mt.)JZmZDD}M)_gRТ}HGG[Rv4p@Xv锗b6֭i۶mcvoYvA۶o0Eqq,0=U|.<#g;K,$P gi&qwuumے ijjQΝi=%$ ighl b*do_,oqO9y?d+sS -N-\WT\M>|a:x0߷O$;wdR(ɲիctW͙m{9 vI?1i.[}ii^r*0tƆ>Z\/eKU??M[+N;guʕ'O{G"9<{rqIؼ%EˊorÇ![7o|`N8A׮}M7u_\j9;4ܹ)T񷰠}KndӾ=%%ц(#3楤Ҝ{IVl۱kڅK^޽{=zdʊnbb)6,,Z,j,-YTX4`R]~_Μ9Ϟ.`e+Vmt 8UI/\Dq utM:뱱S ~6{\}%,X3Y|\mܰp ΎLBEm߶RR_ 03gþ޸s'OXiXHқ'KWI7`aT@sI&J`ScTMR-X2nɊ~ڽB$yybiU*us89We P O]2evfai4q/Y)>}:4\!,% tae,߄ňEO|u,-$7ei()&<.dTiduޒ9ekma2l)7_ߠs.> Gy~a߇>2)mUxt,&c J'X׼狗,9եKX#Y),cXFIWnmDjM$nPKEY N!<犉ME 3w¹XUJN KZj⡒wYf(9uHv={Ċb UR~wbb1o%7}{OVu: |W>@!*"駟cOf8^_䐰ȘIII駟\D|ܑ#GV*=~V#'a$ܾlp,aڈwiɤ%ʊ*}VrZZeKX!JX!sFVwnCTXXj.V 3D%叮aVzSߕ8 luҥ/PDEkٲ]xR8;:8 ,vH*[U¹t͜9222h߾'JO0IGT"|1_|vm8ׯ_Wc/PU7 )`99ˆ}f{@"SΉfE˩-u?lV8I+}nm~g PÇ zP~%&o_ߟ~yӐokvH9O)+[CvE6nxv/0ك§LVR܇ EߝXv|cV>\[[[[˯)I !'?9x k׭ ]ws̊ AWPHH͚50رs'NWRҽ`׿zc@5+ ʿwoiP&f'˂\}IFHדK-c%:Kw)]gdweBp<01?gBqP 6bũ4ciDEC* ~ߊ9 dc=_B\NNN]f1.>?K:Ao좿K+00Q?hΕ0Zf5[(lo޾=E(Y }@V~V>\'9Zrjgve+WO_KKcAp("X4YtXp YYڲXJb%}~JD2?+x$p1gdEK-;9Qnv֏Ɂ/^r["}+1,XKd+q֭[6׮]aqikN!͌l(֬͂lAv,fB6,X:tŻdҗ?%[z | !u` :IF" l۱¬7v߅yΘX*Mёs.:vD&+t|J߁? ~vX}vܸqٳg;ܹmsssmAڂºQpCaPxG[.,BX(|00,cXYXƳLI=3$ /6-cTuo&;"snYQRpw+hw|7$w?M)Gx9=#XCX}dW_u۷o_7 {򂒡(p($P<SxX9ҲBcY&Lcaecfd,(1XzN6B 8 D5X[wj8ʒUbqhF .DAĸL;+v>|VDg;8r20 ^_'Om۶^+WܹͬsL4G}$m(V޹tR^zV  Oa2%%%eK;…e> :VA8p{׈ T<|STT$N.[N8oZI["~$ρ?cлwtRg_XX8(99yHllpww͛7Rx.KGI ভߓ; 7§3IH8xI3?xFReoPs1=i?mߵѣP')2 [3#1G;wnԞ={F rv7bĈ5kք;H #mEFֈ,e'FZիWOnݺ:uhKҍ0^Ppp$, Y o ( RODj <~㧷G8:_(j}<7^ruL%?őؾlL8w}Å >s5k֌e4.44ʟ6mdrKúE A@T6l(JFjjj67,[VQUUmۂWKM4lܸБAЇJY%({xM8.=o^ mظ59|Y0۟듏?sNvSOMOOwgLf0z޼yx/yIP>\>7hީS^z9r*'On OU ӧOo)l ?d"0GC1 ("E >"(<BEV-sW7#ΟU,haɣwzM?BBܕ|k֭ӋxeddLaşR;*ׇy},3y(755mnUnTtzu#lŚlZP-V6{m6, BM~SRR0Z֚A*@P^J( PmD0%APիWw:b'NУG)i^.i\^>~?$Nj]FQjJ5VZ]v S>Y'w)ߌe˖|ݐ ڸqc(UPT~|l9U;wzEųuX~-=+W۴i.៵&``PHcc~FFF" Q_)"JA Æ指=%$&ݳ;xtxO9!.Xq@) eeei^7nLc~_&~3"d7ٿDy$~{Y-P8*jQfm-uttZ---[WׯƨQ\\\===uقxV+ԐAfb ~-C~۷o7p_QQ.__T@@ tС AWPG:Q  {o߽g}xG6n#FRBRy-x3^dO1?<+ÕJΏ֏B+˗\C6665b@3ftҀh 6xcV={ cǎ=zͩSN#=zϏ/?VB@IIߪUwfKgv&(`hʇlPA|P=q:ن1{8Lmf^ȔmzYK.|m9<_p T#P^*pP2Sx$N%KLzxLSǏ͛Kok̀qѴb7qNM^3 5j?c _TvoYV^@Voo߾Al8DtP?_F֏4L~`Y }&~FlƜMcݎ;ڱRk_ro5ݾ}۔@`oep @vP/F=BP@ Qpgs_ў]w4nqZLWiAz:cپ=w5Ӊs `vWgO߲e~_Av{Bl_YP\1b?<~WM:L%:;;q7 lߌS< V 8+&Vm8`ΐSSki {3x/СC^5 ]d.2@J 0 HG?Lq8bsUUxXO ߛ5= 806oDLh'w&D* 9n`VLi'rؗ]nwU ee ݵkW]@_#Ս9lphDSIZqat\X?N/FxФi3lG#Ǫ6lXKyzܷuef~?g9sc sdrΝ n />*h?o D 0-4s///:**}ZZZG3[L8uܵkWG:08۳YV,Pf̞D_M%t^ ӧO):&WDh% $}}$OӂY4l}9[i(&~d7fcX8b-@@3;@`T2,,, d/̔gAPP5&p8w`vXd J΢ٰҭVhb 1o܆ɤz .ˈV3f !(@JiU< e9Y; mbt1׈pE®iéx%$7ϛh6֭6zxpCg?ГYw>K|"i r@Ե u,--zi1ppp0A`ÜSCζ0YVL-Y73~)xΜ9F)?&f |  $ {cמ_Ue/JЕA٦{}5l7zh3&ɓEc dnΜv1MYrцɞ!+^ &(3P>N0|ygބ Sl\Sm=͂bJ(V5xc9aaha{ ~ѵ{/ɡMh~(wAn`#e  AP> {] p&q0/#V gmgc JF-0pteĜ?&^g<s|p p}[eTTT^@L +q?@DQؚ_ɐ!Cڠ̡Jp=tbƜN0vc miX<~p+ +=ƌMEKP>bGxa9fmdN Is);+ )&!!q]~Os*hY+J䢐ְ2 ^ @=AE?F-f CiA|IPbױ'OܺeHp"jJjcMm} 9D )04Zn$ʕ+)`1{`bf5/((@p]+-X cp OhXeOD AjT!h,kďUGmgtтCK(XtůϟI7ظa㋁ll!!Lagy>(Q~bqyp?Y͙@W%f)..y{=@ {<&+Accc-J(U;AQVוܾwժz (r}ҒNȨ>v hui)-YÌ)`ݻ+{Ύف He A!+ˊ;e/(U{={߷x://o*))Ĺ/,l$(`[96`XE }|p'wt|9=AfV6^ RE&bbӦMZ f+9}.+nǃ_ ^#^A""?NV:^y”)7lx6|Ο?_ܴXI]{Ap~ ׏ 2.܂[m:t C99]:W^C "bzp7G˗/)W: RHP2'PzeW*0َ vxiIN.΢)(d@l1l AKAa@Wҭ[pRB+HK[@F‡+laLz 5k&-w@ Yd`("lDJHzԩS'wPc(A!֕iڴm{хKF;cOf)=,2S׆A 'PXy;Y,̹s#{/fϞM^mbmdbCz8./l8M'!I 쒽xKiib+v+؛.+)%?=t,o (zJR2^B{Y[t[7E ˤI`SlnN6 afJ'`c<,!Lc[E'h;lذy=Hq|iZ>?rT10Q.$~*V Eӱh^n V 4ϏM&6pדD0>qppyW֏% RxРAsrn',-vlN7mm:vV߈8Sĭx^h*{y E&{DG ݸqLxΞ=Kq4>|8ӭ[^rzj@k Mm]y& #dp^;AĒKÐ$9G|hًJ))ނ;+Xv-۟e->=#0lk\Tlrุ=ߪ)g{DFfN޽O>{ ak߾},Ӱ{⽎PJHHS^]PPP {NoݱaAN!T֯d/YxL\|ůyJA۷[mΊϨ|&7dl9;$*qnSv~Q6'z9;;7ۇ 0&yMLݺ~8yN:CΜS_e9G'O/KWkt uݹ}G+ԩSkWx;zܯG;266:иc),8 )}~M48ÆݮMb#ܹspGԩsprr"svFm۝cZ,|xy8z8 ,:=|֔۶u3Rc~"߈HA}q2)/H|qKsip;q҈#wdkI(,++JJVdd?ŰoذDץ3f΢#SXXmٲEwP~h„ biȈ4m\WWU !!A)KbddyL쌌̋˟˖R>+6X*F^guޅ:{GwplFi{;I@׃ ȶ] 8.fόuqI'.ebZɌRV,_F3-Ĺf8DZO+\nxKz9rcj-\V2Zȴw#+O>Թsg#+++1űLPdOLn 2++KRiւCF6.9Ob>N̅E J">񱱱INt:Ͷ{zwm~{ۮwJ2 2K] ^@Br*x8u o7|lΌuFbRIUU $f D Ltq!K +RkтLۚ1m.d(+<JG8o$PzH.cX<Մ sϫV&M[oܤ֭ښz)JSSSb"Jd?hG!MMMRm_61_gbyV(X=|G00wB| :jA$NmA@h7TW qaMxX;6Aϰzp> tG}Q͚5թS羊 P׮]j!A <%dxB P&I][n)Ò!y;p2?`ECP:H&naYoӼ-[V>>"f̢"jjh:ZIUҒIp`9WOb|H$1H瀗lYDaE-Uַ >׏P`gg'C'/u֕T[4#=}]z7yYY yTR<|(LN $єDM*oàX={5Up0^޺u>Pѣ d y%% U׬UlP_pj $m۶I/֏aAVYp5Z805kD ROqͩ!l=ر -}}˷X mdQ#jժUԮ]gLaH <D 6'UC^^^dlԆ43UMw|$i ?d0)XCClll^(HH!?9HC:OMA0WwaJ=DzCP b,f͚6l(*\y D 9s^*tr!bhC9zЬYoUPr F׬UB ^@8Ǩb844T /.#qge椧I&ǫZgHB> F-T ʙ>Fn޼I֭BӧONICMTMKW#1b=uIA 1<SaP>5ö&ԪTUCX-~7r  \!I `yN;\^'HS˰} & eiRK EeGjթs:_ji 13:9IDATT  ~GU`Ʌ"3+`A:{K7~>+Hq29H!NLA3@ tLZvN[\-.&lE˪Q#Bl7CFYBT I\jqϡY[ې>*oU0G3Ǧ_ dRN:?H$Ac \>:O*6l8@" u ]?Te!Z`36fl~T 3P.V._,L5aDqۙ?z$(W߃%`4 E=i)4 h9DJ8 g,$:UP̪FR(D 'k׾ڴ GF x&H5ɤRp&q5ykjWDSիWOV=AO/v߃-y"5kV_S^g14 ժU[PdIB{5~!jV|%cPO$؞ЀLW\;!UNuօ_fcs ,pySt{[C\qt2FzVaKBZUjU_{ IIENDB`kupfer-v208/kupfer/plugin/qsicons/Object.png000066400000000000000000000255231176220042200212370ustar00rootroot00000000000000PNG  IHDR>agAMAOX2tEXtSoftwareAdobe ImageReadyqe<*IDATx}k$Uwzuc絻ڇ+vFa!0Xa2ap@+ ;01,0Hh%jyXkЮVZ>f=={{3ofeUWtϻ"r*+wwνI"EܐU]p?|+_M{`.wύo_#ht0zkk)zK1FA2Aam5Łmdc2:-@DFظsph#BTp⮎{i#|@|E 808}zto7a||+G6! 0@^R7K}JM\[6:›!&<%@" L ϽHn7}rWc3 C  sFπJ8BAKra5wy׮GtD ~t] V.!# $ LD!'Mӿ~-i韦Ur;{EiϏno߷Ju)&v\Y 6˒Ck݈BP4Amz^{~=ɿWDvoq5z[Sǫ+ F-yh ë9eDS< ?:YE{- gn`27@>578TFբD(As<& ϸ#M Ok#hz ou Zn4А%`vG% ! 5ZT1wRold_>濻{w򛷷!EgntD @ —Dw; J%w% kQ]\OUI8x9x@Ci@w<6_gwQDBUv>+3}vy5aZBEi6a 2-,? TV6Cyh4n'zہERr <~z5 (V޸N*t(/SY6c mʧ%~-K捽^nh|m |5P_  [@<. yOE)/ߤZ  WD@:/Aˮ kُ|3i:k@1}P.u 20F7*Sjn@!ZyE*=tc!ѳ w0N @6g_Vc//m:+Wk@fbxɒ57]  `WeUm h粜كG}Ϟ֏uWBr@UuAPćxrHejXh>YD@*065xjg+iSTRb ?m?Pɿ%Q\id>{vsWƿ?VtCLKHsFsGؿIy Ko&j)@itՒR+W"ʈ0ȾOlpP0j,x⎬+h5YRveP1JF[io8T@0*4n"*>/)(*S1{n\,Ԑ?x|'~-:"씒I0:q['}r*R0b ')ެ ȥ e=8aL|( J4ha6ב%vAeQ\k'À`84z.n?+J zUNǢ\T{N"T6"Uï77t5ȂHShQ@3| jF]ti$,2~׉G#A+u HIO},^3{x2O"4lTGiph ti: h eZ Ee%q)ƤKQ㑹o]g7՚)FcqDcz D4f, ҰT1|ժY:8U0&x/R4&hu5}6wMH%c%Zq/=J5a rިKBW o* rTzRU0)mbEd9:wv^<>/jebE;Cg$AIaDLTʻ x0:H)A*,"N/xy{pd9{nWW."g Jԃ$H hyx4I'u/+sK㕦ԅ5;R PI%ip.#w;>|?J\1<.M n8AS,\2VE.ݙSVT`,Ld[B4Z#þAU0ߣQ66biud)MxsOl|8~x-7]6pdƯ@„(_']w"F?_De?Mr'L E[kl CګE.QkI,dp+iUʭ&Ok-<_TɭwCHU.@M4jv`+fDVt4i%܉D"%F+1UU*T./'WȎBn  BAE5"/֭/ϵ#g ok"rHioYJQ`)bN9Ve\P Pldue@.s͔@)|-dWcS-PG f-|}੸u]&{Pm}4a^bg4,)ݽȈP1HN, Ԋ3ۅ&9-|+s-J<)@Ћ19`Ydgc.^e 'Ao;W@8A+Px,9gJK[pL2k 7dk;E+,5& t_ƬZ:r*vU-IeR0 ȽT"EW(l}̰o${JksoR 2s)M*\"sGb ++B *\)*fƶH~.۞C } , _ 5 ?$cxHumAniQŒl.HeQ$OLg TYfWv~VYc%۴blNG@:k$(u$|BikY3vfzNFܹu3\ to:aJ} 8R[8 Zj"Hir"cl4rүL-mJ+@RK?w$/pewղ5Ʌ't'4*E.8t'G>I\P[{HѾV⸨!dq6_`8&;Ƴ=N5E gamO~2-^"2>sBuO/b6ht$Cx e=ۮ+K9峱$v{r@0ցؓGUX!`H CTMvц?iH4J >%ƯZ_܂-Xl `x+eS"hgSjm[Xeh0S8 +&w9 ?IYq]v1h˹'6eIilfk(.EZmQ`*aJYp Iտ&k. 9KiH*Be| (D@1$ D! `w,@㖯 Pm| wj}b Wu^P+U7%,Bu)0L@=x|BP:p`QDJ\oRbɠW jg LĦv%.TY'[ xPDh+W>԰]e$:K;~_+|袺S+ mu P)ZF >H4e4@ .CC}{)\qyGq̞JaPJ@#({ mW؜r=ȡS-* :@M]p\!]@mzY V=d{m9* ( yd|Xp rC@9bbh) FNvBeKOU`14l0W+}\)qc`~wSrF Fkh !Fi bg ^O7c_e$4 QF@)4vI.ag22#|v#w}dvâ63T2 eux2l,JmzFp-b_*`:[`w}"Ơ @*"bA ߦ\\Q! hLTi6(/ sILuE6c߱#NuQ` 6 []#/SO;-v;%d8cem`^;&l=bָO ;NnNl0X̀'J[s5naWAǛ P+s6@Hel␳̴w-"2 v#N(Xذ ]وk(QhBxAYXW%L0"]ݦx,u[vaK@CMxe#0RvPx"; h?Xnrw \$Pp87d"6Ç!i{4gt; Ȃo໅~ -Q}K+aKbmxb#kXLsF\I`6F,7n+J- Tk+9"(`s ZYD;ե J wrKtIj 9зQanO׆a6rn^j'IJ A?'C9aHٞF$sG+W/mD:z m|D"ienJv3Ɇfft~m0RZVQPfjAYRJȮ$mRZnՕ#x))D ҹ3SAe3,Z4ȌK zP )bUnH$r M!bM/)}=\Zքuch\<#]0AAkDRpİVrFZ[E ,%^ܶ2 ͬDHdǮB]VM6!Ckcrf[xJċ\JQoL6Z@TE@186Btʔ0R'QJTN1Ca cCmo.= _vꌰ@ʶ-QgV)&"];C/Q'zV8rpieDπ_P?\x O~OW|p׷sUmx/L+E FHsEGkaLd_X^^j'n{Fp ~ JR,TF:pbU_:"^\IX#HZbwe܎hzqYŢ9(}~b B, &Kg%,(Q̬B*j{<p $ڍ)TCHnxܜR22#%]E(bmDsNFDn˒<^]^ITł#:Ev%Qdƭ(V3_9nn;YYHfhp#?,) w-]|Y#~YO Dn@]Z7~q2O7 Æwq3DJ,7ND6H]![DT0f8§l֪Aܶ|*=F)XX(bůiPZ2w4(uVk z C8P} FNr#E"й"U4xDl(OӼkEG>}Pζh;ڄy&ear|jR.X 䖋L Gp|ڽj[qj)A" Pp55# t׏<9wR-"R1D|P[U'\@ Wׇ1kqqn"bXJPLYY煏Oҭv,I찅wf)Gt_MU`7 GYnޜ'3YʕYˢԋeg!: F8s؉hrM(6jEcH9Iv?o=g$l=dPAfH/=wZ-P J|/ahxÔ`n.0Oxߠ[!u@C+s>^|~ RJ*DBjypMF/ xpB?9y hqe. 6YpOg><Ϫ#bR2`b2ЍlߩQ>>^dLb *Yӭx}482hN=Gߎj-u]NRUA9`^^r? drGy3Bc{-&R?vG¦;^yK}_o}Um ` /vcqFg._kADDYPh8Jst84E? _@یg>?}_E;mdKHAW0+hF/ ?it/m[Z6̔Qq2B- A$ < O3w};MxTbZ[7{.6ʕoRB 8~7@EI\o0T@MgyVG^<~=y}H(D~NkM+RpL; B$Q+Ag SL>(A]j a_ rG q"Qx$*Pw}3k!SFn8T!΄IMW@LYuÇY7:VVW|&;?^||D0piڽΧM#O,hp@h@_;ywįbi5`O&P8x1,bzHӃn/#J-i(6g?~g2 wOkl*f R(5D=H~hL}'E[CΫ+e /4]>u„Vx /j'(?yd|)y: `~fSMr0OQM!/K_Ïw_,@)W 4w/M`j$@#P@Gnb=ѧYY?'.rфӿԌY9C5^M>%2Tz7oH>L!l 2eHR{ U7 ^S'cJ:̅v¨뵙;F.P'[] O0iuxrw|[8Ϛ@Pd3l6vT _y Il#|O?p™ {2Ύ 1v0AD2`LLhq2L:v p^P-M)a-4r,kI SɬsG ƌ{an,,֦̭nQ&pCNJ_e|dPw!'@ vpy=s9GϞݏg+GO$uep?ui穜z8M/hSAn=_3C vw0o LT:[XSJkDZq^y {8='d4_LWzwn* .M䰮D! A/|ns11:Cfp<+SĚyr;A1h&/<'{,=8&#!͈&0h`:k6u9BFqzP(mo8KAPA9ΰC#EiF$rSQ鬷SׂV2_ȏ>KfkQ,6f󚗛Z2}.l&Q@vbu^&*I?)~ݻDo5&-v"L1z(ے"DIB)J͉Gʞ̙=m++!OئsM0ФZ4jeb uHv\3i@XH|1Ξl7&H]p Oaq'vّ~,?'sϼhG_Ѥ5n8MkF.C F1ցRQk׮5>u׽U8 lJ0sF?Ī975cU!JXuŧ/| fgg5k!5G.C U&6pS~I 2^gOD/{w (^Yf4z{!)@){ Eԑ_yȜOZ)OcB9w~ Ed]lo6<; $/@Ei I> p_q~?~Ļt($OKtzW? TzB覅xSKri&&.$amsĉuy/w+8BԶҬY;+}!{铏1QPє\ܤe Ư5c'#P^0-TLs߃3nw 'sϞvFi͈><lLj\)_M`nIC/!T @tt~@_3x|cOg r̪B&y 3nV9VP!h`-Z~X{ݷD=S| ԅAS4RP!C&O 5cݷ<LW{كѼYES#r94@* &'jC]ޠyڶ'W_ U)qƋtдmVnʫ1_h2 >k^F mD,@H$͍&o󄫒hh&L^# )u7k Kr O\&w~`"PcRMȔn_`Z4L]-o-k?WgIENDB`kupfer-v208/kupfer/plugin/qsicons/Rocket.png000066400000000000000000000222231176220042200212520ustar00rootroot00000000000000PNG  IHDR>agAMAOX2tEXtSoftwareAdobe ImageReadyqe<$%IDATx}ku `%^A(^Bg6J^`=#@1J Pi>2#G?e6@ ^ֿGy?B@EcCGTPF?/zl[a r:ޡj)@ɬ[c`@}vرQ`=a4NW!ޝ$@i`1CKr1;vlݲ'̎[3gB? : D`\Ҏ)B$D0r3#r-ѾN^d QeGEFom.>[@a2++dWAdw ,tnݺ;v$|Le$dwzǒNAJ a4O4GzUicǎbI{KہA'?876b`=L$'/ z'}IH$}W/H_šS4MV W %" [lЊ`(=Gdv"7ΣeweUm۟ٲ5<&,XrMH$5ADЄah4D'MZ5}3eJ\={4CFBJت96^siF-|NJX3Dԉ ~pA^f7P/cc;q}ǹ! y`9GBvtq'f+D"J n۾s)yj бcwn&ي.9,L-9MI H$DՈzz>@?*`%2FG^2l^[("i*B<ͥ2HJ`YhpȪ*R@4A8el-440i)`#G73<80X# dkuH^T_9)yjl,A$uIy8b$оAR &~.fOVBFd+qA:TF(sϿ_z@5!`sOs~>1~e4X~7hcԦtp8;(FE"$"bM6WFGG72?ǝ{yKgYU2M9/p\?Pm.`9_ J>-@BW7(CB\#:rtRV$[Мo}/i|g|< 8@ "HH5 x@2!LsLUI$`) B>j{+U-蘐]IÿgiJarPn0Vɚe|"H@>c4$ժmmGִ QY6:zQ&1'~|Et+[M($XZ|! )skx%DrILzw{GkF-s?o8'D%#MzNj/`$k^@þj(h "#҅E$%BK!ZX1{>HK?+3~>J{_\p~hkˆ?N8lo%$ 聮7 vJvJ=Hw/].}625VIn{q/t܍Y|hpȳX,_z bi j80YƜi=۶nxKl{"cW|b:k]]˦sBg+mB0v6v(LDM7p d) E)j x`CXu`JMBaxl)N>}5~XEđWWHj jG66ylME֭X0Y0~3ac?f:e6)`|~so!ṑ^B$8!6pf4ʌ!CFaJJk}r0`919K8i@@5rx+|cyEd a55# ^Uxڃ)hxOzu!E,v%,̌?(<N$l`]6WD<+[ns7$ůseDœ#<Ӛr!Z0jaQh''d"pi\U:bsh0;"odu5\("p^ .!| d1D2`1! =8Zϭt bVq"(qŶ79ɸ~︑g. ?|$ӺWJ_GڡJ_G^:rBB  HH8j-(\,b. P s y+Kͥ^ u@]el\,}usՂPh A=E"F4eד7rI)VxF IxJ mRh)~6<$N[iy<## E\k,7|c»w]A\cSt G3<HC04ն(KLa}D;c9H* ifxw#hng|~9Kgi0cG|%Kj7n[NXt]4Bk70d:D1GQ(@H똴|B]g.g$_(RYߝ$ "OW"Nb@y=vo#7`yKCHΊ_tA4ʐM¶v q,I y. ui.GGLW*S?WyOdsZ,UHIn}L"7 ]B2qh&P 8(cx{D} pNI Pyj==e!P^*arc,kuB;a-Ouc}\4 ;k1raFtT!>>.|3d 43Gp7Bi( \ xXj|Dzkv6-A+cϕ6jP-iand !gDV#M.]H_V+y-p'697?x7ҪԤOӵ~Rk˙%\B\Q#b3Ī$#ED .΄P_\\ tedJr |1Oټ\XK u.BV K`d?X},N"biqQPխx H&[JjaR"Y:﫯Z%( {P\?7?;J+DO3q9kvr +, OyF7:Pqf`9F5yBg>h[ p_Rw 5ibܑjz ö+LYDZ 1t]}3'͡NҔi52&FC._}IUqK ܧ~.,.=fĿ bH$szn֩a P]99؇E"u Ya{~'':q5e?19ٳgeY 'ަDƦ9ەu'dZտ&ѵxMDgp sI)c,)c%Z$>Lf=`x 0pW[\^<[Q\vmEsH(jđ L%c7Z@XE|~8$ yt˥ˏ~4z٧Ν@o)neEo99G,!(HEld',r:eTbFS\t2qNvꟛwz"YKVƑ(,JrNEXj.$b@4rm ro"p)ڕ˟2%JHԻ}2ڶcߗ''/ԏ|Th䏮%zg{!i-?Z\ J'҇Y/_6q}ڜ_G 4g4.U/[k|%p3&34(P`e.[^ZZ6/gff.UJ-W.ԯn4l|S!f 3z$%\r;8'R#y܇uaJssի[J =ٙsVBϷUWוHR °wa%ȍ.:!7#{ʕB4%Jۇ̿;1{ҥO,-..(m[8_+}L #aHm㩱iCs҅e[ 0eitggtv?qx(eBf yIy39L!)w:rR7eiDC'~3;9e'gr֐?* wX> # iJ ͻ\y35utuuFOƺ@Ʀ2*A)A;JdЌ_ff,Wc7nHߜ6 ͻˢ N&Dʱ0ׯ]3{ݻiس4Z O FcMׯ 릦 @VqMo ?$J{kN9@ w1fa!m6/Is̙- f[C<033 mcFʤ$nB{sW/`ek.]sYadmp|DkŖ `];6bmd ~iBPo5<"k0AFjc?0R )=peQd߽m۶߿,Y:Fw%mj _x\f ҁE7R;i-o4bQ&]x?BF/[> iTߋkjN9O@]K5W^y}(U%>FYU @јSVW݉w@tS:$_1\$w**a!/P?w1Gw (*R*3}z+W|\|!(]zb ܴl 0d _pIENDB`kupfer-v208/kupfer/plugin/qsicons/__init__.py000066400000000000000000000015151176220042200214270ustar00rootroot00000000000000""" Acquired from https://github.com/quicksilver/Quicksilver Which says ''' Licensed under the Apache License, Version 2.0 (the "License"); you may not use this software except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ''' Apache License 2-0 is GPLv3+ compatible --ulrik """ __kupfer_name__ = _("Quicksilver Icons") __description__ = "" __version__ = "" __author__ = "Quicksilver Authors. License: Apache 2.0" def initialize_plugin(name): pass kupfer-v208/kupfer/plugin/qsicons/icon-list000066400000000000000000000004511176220042200211400ustar00rootroot00000000000000# ID File flags # !override means that it overrides the current icon theme # (the default is to not override it) kupfer-launch Rocket.png !override kupfer-object Object.png !override kupfer-object-multiple Object.png !override kupfer-execute Action.png !override kupfer-catalog Find.png !override kupfer-v208/kupfer/plugin/quickview.py000066400000000000000000000055131176220042200202220ustar00rootroot00000000000000__kupfer_name__ = _("Quick Image Viewer") __kupfer_actions__ = ("View", ) __description__ = "" __version__ = "" __author__ = "" import shutil import gio import glib import gtk from kupfer.objects import Action, FileLeaf from kupfer.objects import OperationError from kupfer import utils def is_content_type(fileleaf, ctype): predicate = gio.content_type_is_a ctype_guess, uncertain = gio.content_type_guess(fileleaf.object, None, True) ret = predicate(ctype_guess, ctype) if ret or not uncertain: return ret content_attr = gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE gfile = gio.File(fileleaf.object) if not gfile.query_exists(None): return info = gfile.query_info(content_attr) content_type = info.get_attribute_string(content_attr) return predicate(content_type, ctype) def _set_size(loader, width, height, max_w, max_h): if width <= max_w and height <= max_h: return w_scale = max_w*1.0/width h_scale = max_h*1.0/height scale = min(w_scale, h_scale) loader.set_size(int(width*scale), int(height*scale)) def load_image_max_size(filename, w, h): pl = gtk.gdk.PixbufLoader() pl.connect("size-prepared", _set_size, w, h) try: with open(filename, "rb") as f: shutil.copyfileobj(f, pl) pl.close() except (glib.GError, EnvironmentError) as exc: raise OperationError(exc) return pl.get_pixbuf() class View (Action): def __init__(self): Action.__init__(self, _("View Image")) self.open_windows = {} def item_types(self): yield FileLeaf def valid_for_item(self, obj): return is_content_type(obj, "image/*") def wants_context(self): return True def activate(self, obj, ctx): ## If the same file @obj is already open, ## then close its window. if obj.object in self.open_windows: open_window = self.open_windows.pop(obj.object) open_window.destroy() return image_widget = gtk.Image() h = gtk.gdk.screen_height() w = gtk.gdk.screen_width() image_widget.set_from_pixbuf(load_image_max_size(obj.object, w, h)) image_widget.show() window = gtk.Window() window.set_title(utils.get_display_path_for_bytestring(obj.object)) window.set_position(gtk.WIN_POS_CENTER) window.add(image_widget) ctx.environment.present_window(window) window.connect("key-press-event", self.window_key_press, obj.object) window.connect("delete-event", self.window_deleted, obj.object) self.open_windows[obj.object] = window def window_deleted(self, window, event, filename): self.open_windows.pop(filename, None) return False def window_key_press(self, window, event, filepath): if gtk.gdk.keyval_name(event.keyval) == "Escape": self.window_deleted(window, event, filepath) window.destroy() return True if gtk.gdk.keyval_name(event.keyval) == "Return": self.window_deleted(window, event, filepath) utils.show_path(filepath) window.destroy() return True def get_description(self): return None kupfer-v208/kupfer/plugin/rhythmbox.py000066400000000000000000000310341176220042200202340ustar00rootroot00000000000000__kupfer_name__ = _("Rhythmbox") __kupfer_sources__ = ("RhythmboxSource", ) __description__ = _("Play and enqueue tracks and browse the music library") __version__ = "" __author__ = "Ulrik Sverdrup " import itertools from hashlib import md5 import gio import os from kupfer.objects import Leaf, Source, Action, RunnableLeaf, SourceLeaf from kupfer import icons, utils, config from kupfer.obj.apps import AppLeafContentMixin from kupfer import plugin_support from kupfer.plugin import rhythmbox_support __kupfer_settings__ = plugin_support.PluginSettings( { "key" : "toplevel_artists", "label": _("Include artists in top level"), "type": bool, "value": True, }, { "key" : "toplevel_albums", "label": _("Include albums in top level"), "type": bool, "value": False, }, { "key" : "toplevel_songs", "label": _("Include songs in top level"), "type": bool, "value": False, }, ) def _tostr(ustr): return ustr.encode("UTF-8") def play_song(info): uri = _tostr(info["location"]) utils.spawn_async(("rhythmbox-client", "--play-uri=%s" % uri)) def enqueue_songs(info, clear_queue=False): songs = list(info) if not songs: return qargv = ["rhythmbox-client"] if clear_queue: qargv.append("--clear-queue") for song in songs: uri = _tostr(song["location"]) gfile = gio.File(uri) path = gfile.get_path() qargv.append("--enqueue") qargv.append(path) utils.spawn_async(qargv) class Play (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, name=_("Play")) def run(self): utils.spawn_async(("rhythmbox-client", "--play")) def get_description(self): return _("Resume playback in Rhythmbox") def get_icon_name(self): return "media-playback-start" class Pause (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, name=_("Pause")) def run(self): utils.spawn_async(("rhythmbox-client", "--no-start", "--pause")) def get_description(self): return _("Pause playback in Rhythmbox") def get_icon_name(self): return "media-playback-pause" class Next (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, name=_("Next")) def run(self): utils.spawn_async(("rhythmbox-client", "--no-start", "--next")) def get_description(self): return _("Jump to next track in Rhythmbox") def get_icon_name(self): return "media-skip-forward" class Previous (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, name=_("Previous")) def run(self): utils.spawn_async(("rhythmbox-client", "--no-start", "--previous")) def get_description(self): return _("Jump to previous track in Rhythmbox") def get_icon_name(self): return "media-skip-backward" class ShowPlaying (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, name=_("Show Playing")) def run(self): utils.spawn_async(("rhythmbox-client", "--no-start", "--notify")) def get_description(self): return _("Tell which song is currently playing") def get_gicon(self): return icons.ComposedIcon("dialog-information", "audio-x-generic") def get_icon_name(self): return "dialog-information" class ClearQueue (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, name=_("Clear Queue")) def run(self): utils.spawn_async(("rhythmbox-client", "--no-start", "--clear-queue")) def get_icon_name(self): return "edit-clear" def _songs_from_leaf(leaf): "return a sequence of songs from @leaf" if isinstance(leaf, SongLeaf): return (leaf.object, ) if isinstance(leaf, TrackCollection): return list(leaf.object) class PlayTracks (Action): rank_adjust = 5 def __init__(self): Action.__init__(self, _("Play")) def activate(self, leaf): self.activate_multiple((leaf, )) def activate_multiple(self, objects): # for multiple dispatch, play the first and enqueue the rest to_enqueue = [] objects = iter(objects) # take only the first object in the first loop # notice the break for leaf in objects: songs = _songs_from_leaf(leaf) if not songs: continue play_song(songs[0]) to_enqueue.extend(songs[1:]) break for leaf in objects: to_enqueue.extend(_songs_from_leaf(leaf)) if to_enqueue: enqueue_songs(to_enqueue, clear_queue=True) def get_description(self): return _("Play tracks in Rhythmbox") def get_icon_name(self): return "media-playback-start" class Enqueue (Action): def __init__(self): Action.__init__(self, _("Enqueue")) def activate(self, leaf): self.activate_multiple((leaf, )) def activate_multiple(self, objects): to_enqueue = [] for leaf in objects: to_enqueue.extend(_songs_from_leaf(leaf)) enqueue_songs(to_enqueue) def get_description(self): return _("Add tracks to the play queue") def get_gicon(self): return icons.ComposedIcon("gtk-execute", "media-playback-start") def get_icon_name(self): return "media-playback-start" class SongLeaf (Leaf): serializable = 1 def __init__(self, info, name=None): """Init with song info @info: Song information dictionary """ if not name: name = info["title"] Leaf.__init__(self, info, name) def repr_key(self): """To distinguish songs by the same name""" return (self.object["title"], self.object["artist"], self.object["album"]) def get_actions(self): yield PlayTracks() yield Enqueue() def get_description(self): # TRANS: Song description return _("by %(artist)s from %(album)s") % { "artist": self.object["artist"], "album": self.object["album"], } def get_icon_name(self): return "audio-x-generic" class CollectionSource (Source): def __init__(self, leaf): Source.__init__(self, unicode(leaf)) self.leaf = leaf def get_items(self): for song in self.leaf.object: yield SongLeaf(song) def repr_key(self): return self.leaf.repr_key() def get_description(self): return self.leaf.get_description() def get_thumbnail(self, w, h): return self.leaf.get_thumbnail(w, h) def get_gicon(self): return self.leaf.get_gicon() def get_icon_name(self): return self.leaf.get_icon_name() class TrackCollection (Leaf): """A generic track collection leaf, such as one for an Album or an Artist """ def __init__(self, info, name): """Init with track collection @info: Should be a sequence of song information dictionaries """ Leaf.__init__(self, info, name) def get_actions(self): yield PlayTracks() yield Enqueue() def has_content(self): return True def content_source(self, alternate=False): return CollectionSource(self) def get_icon_name(self): return "media-optical" class AlbumLeaf (TrackCollection): def get_description(self): artist = None for song in self.object: if not artist: artist = song["artist"] elif artist != song["artist"]: # TRANS: Multiple artist description "Artist1 et. al. " artist = _("%s et. al.") % artist break # TRANS: Album description "by Artist" return _("by %s") % (artist, ) def _get_thumb_local(self): # try local filesystem uri = self.object[0]["location"] artist = self.object[0]["artist"].lower() album = self.object[0]["album"].lower() gfile = gio.File(uri) cdir = gfile.resolve_relative_path("../").get_path() # We don't support unicode ATM bs_artist_album = \ " - ".join([us.encode("ascii", "ignore") for us in (artist, album)]) cover_names = ("cover.jpg", "album.jpg", "albumart.jpg", ".folder.jpg", "folder.jpg", bs_artist_album + ".jpg") for cover_name in os.listdir(cdir): if cover_name.lower() in cover_names: cfile = gfile.resolve_relative_path("../" + cover_name) return cfile.get_path() def _get_thumb_mediaart(self): """old thumb location""" ltitle = unicode(self).lower() # ignore the track artist -- use the space fallback # hash of ' ' as fallback hspace = "7215ee9c7d9dc229d2921a40e899ec5f" htitle = md5(_tostr(ltitle)).hexdigest() hartist = hspace cache_name = "album-%s-%s.jpeg" % (hartist, htitle) return config.get_cache_file(("media-art", cache_name)) def _get_thumb_rhythmbox(self): artist = self.object[0]["artist"] album = unicode(self) bs_artist_album = \ " - ".join([us.encode("ascii", "ignore") for us in (artist, album)]) \ + ".jpg" return config.get_cache_file(("rhythmbox", "covers", bs_artist_album)) def get_thumbnail(self, width, height): if not hasattr(self, "cover_file"): self.cover_file = (self._get_thumb_rhythmbox() or self._get_thumb_mediaart() or self._get_thumb_local()) return icons.get_pixbuf_from_file(self.cover_file, width, height) class ArtistAlbumsSource (CollectionSource): def get_items(self): albums = {} for song in self.leaf.object: album = song["album"] album_list = albums.get(album, []) album_list.append(song) albums[album] = album_list for album in albums: yield AlbumLeaf(albums[album], album) def should_sort_lexically(self): return True class ArtistLeaf (TrackCollection): def get_description(self): # TRANS: Artist songs collection description return _("Tracks by %s") % (unicode(self), ) def get_gicon(self): return icons.ComposedIcon("media-optical", "system-users") def content_source(self, alternate=False): if alternate: return CollectionSource(self) return ArtistAlbumsSource(self) class RhythmboxAlbumsSource (Source): def __init__(self, library): Source.__init__(self, _("Albums")) self.library = library def get_items(self): for album in self.library: yield AlbumLeaf(self.library[album], album) def should_sort_lexically(self): return True def get_description(self): return _("Music albums in Rhythmbox Library") def get_gicon(self): return icons.ComposedIcon("rhythmbox", "media-optical", emblem_is_fallback=True) def get_icon_name(self): return "rhythmbox" def provides(self): yield AlbumLeaf class RhythmboxArtistsSource (Source): def __init__(self, library): Source.__init__(self, _("Artists")) self.library = library def get_items(self): for artist in self.library: yield ArtistLeaf(self.library[artist], artist) def should_sort_lexically(self): return True def get_description(self): return _("Music artists in Rhythmbox Library") def get_gicon(self): return icons.ComposedIcon("rhythmbox", "system-users", emblem_is_fallback=True) def get_icon_name(self): return "rhythmbox" def provides(self): yield ArtistLeaf def _locale_sort_artist_album_songs(artists): """Locale sort dictionary @artists by Artist, then Album; each artist in @artists should already contain songs grouped by album and sorted by track number. """ for artist in utils.locale_sort(artists): artist_songs = artists[artist] albums = {} albumkey = lambda song: song["album"] for album, songs in itertools.groupby(artist_songs, albumkey): albums[album] = list(songs) for album in utils.locale_sort(albums): for song in albums[album]: yield song class RhythmboxSongsSource (Source): """The whole song library in Leaf representation""" def __init__(self, library): Source.__init__(self, _("Songs")) self.library = library def get_items(self): for song in _locale_sort_artist_album_songs(self.library): yield SongLeaf(song) def get_actions(self): return () def get_description(self): return _("Songs in Rhythmbox library") def get_gicon(self): return icons.ComposedIcon("rhythmbox", "audio-x-generic", emblem_is_fallback=True) def provides(self): yield SongLeaf class RhythmboxSource (AppLeafContentMixin, Source): appleaf_content_id = "rhythmbox" def __init__(self): Source.__init__(self, _("Rhythmbox")) def get_items(self): try: dbfile = config.get_data_file("rhythmdb.xml", "rhythmbox") songs = rhythmbox_support.get_rhythmbox_songs(dbfile=dbfile) except StandardError, e: self.output_error(e) songs = [] albums = rhythmbox_support.parse_rhythmbox_albums(songs) artists = rhythmbox_support.parse_rhythmbox_artists(songs) yield Play() yield Pause() yield Next() yield Previous() yield ClearQueue() yield ShowPlaying() artist_source = RhythmboxArtistsSource(artists) album_source = RhythmboxAlbumsSource(albums) songs_source = RhythmboxSongsSource(artists) yield SourceLeaf(artist_source) yield SourceLeaf(album_source) yield SourceLeaf(songs_source) # we use get_leaves here to get sorting etc right if __kupfer_settings__["toplevel_artists"]: for leaf in artist_source.get_leaves(): yield leaf if __kupfer_settings__["toplevel_albums"]: for leaf in album_source.get_leaves(): yield leaf if __kupfer_settings__["toplevel_songs"]: for leaf in songs_source.get_leaves(): yield leaf def get_description(self): return _("Play and enqueue tracks and browse the music library") def get_icon_name(self): return "rhythmbox" def provides(self): yield RunnableLeaf yield SourceLeaf yield SongLeaf kupfer-v208/kupfer/plugin/rhythmbox_support.py000066400000000000000000000057601176220042200220370ustar00rootroot00000000000000 import os import xml.etree.cElementTree as ElementTree NEEDED_KEYS= set(("title", "artist", "album", "track-number", "location", )) UNICODE_KEYS = set(("title", "artist", "album")) def _tounicode(bstr): # the XML parser returns `str' only when it's ascii, but we want # unicode objects all the time if isinstance(bstr, unicode): return bstr return bstr.decode("ascii") def _lookup_string(string, strmap): """Look up @string in the string map, and return the copy in the map. If not found, update the map with the string. """ string = string or "" try: return strmap[string] except KeyError: strmap[string] = string return string def get_rhythmbox_songs(dbfile, typ="song", keys=NEEDED_KEYS): """Return a list of info dictionaries for all songs in a Rhythmbox library database file, with dictionary keys as given in @keys. """ rhythmbox_dbfile = os.path.expanduser(dbfile) lSongs = [] strmap = {} # Parse with iterparse; we get the elements when # they are finished, and can remove them directly after use. for event, entry in ElementTree.iterparse(rhythmbox_dbfile): if not (entry.tag == ("entry") and entry.get("type") == typ): continue info = {} for child in entry.getchildren(): if child.tag in keys: if child.tag in UNICODE_KEYS: childtext = _tounicode(child.text) else: childtext = child.text tag = _lookup_string(child.tag, strmap) text = _lookup_string(childtext, strmap) info[tag] = text lSongs.append(info) entry.clear() return lSongs def sort_album(album): """Sort album in track order""" def get_track_number(rec): try: tnr = int(rec["track-number"]) except (KeyError, ValueError): tnr = 0 return tnr album.sort(key=get_track_number) def sort_album_order(songs): """Sort songs in order by album then by track number >>> songs = [ ... {"title": "a", "album": "B", "track-number": "2"}, ... {"title": "b", "album": "A", "track-number": "1"}, ... {"title": "c", "album": "B", "track-number": "1"}, ... ] >>> sort_album_order(songs) >>> [s["title"] for s in songs] ['b', 'c', 'a'] """ def get_album_order(rec): try: tnr = int(rec["track-number"]) except (KeyError, ValueError): tnr = 0 return (rec["album"], tnr) songs.sort(key=get_album_order) def parse_rhythmbox_albums(songs): albums = {} for song in songs: song_artist = song["artist"] if not song_artist: continue song_album = song["album"] if not song_album: continue album = albums.get(song_album, []) album.append(song) albums[song_album] = album # sort album in track order for album in albums: sort_album(albums[album]) return albums def parse_rhythmbox_artists(songs): artists = {} for song in songs: song_artist = song["artist"] if not song_artist: continue artist = artists.get(song_artist, []) artist.append(song) artists[song_artist] = artist # sort in album + track order for artist in artists: sort_album_order(artists[artist]) return artists if __name__ == '__main__': import doctest doctest.testmod() kupfer-v208/kupfer/plugin/rst.py000066400000000000000000000020721176220042200170200ustar00rootroot00000000000000__kupfer_name__ = _("reStructuredText") __kupfer_actions__ = ("RenderView", ) __description__ = _("Render reStructuredText and show the result") __version__ = "" __author__ = "Ulrik Sverdrup " import os from kupfer.objects import Action, FileLeaf from kupfer import utils, icons # docutils is a critical import -- not a core kupfer dependency import docutils.core class RenderView (Action): def __init__(self): Action.__init__(self, _("View as HTML Document")) def activate(self, leaf): finput = open(leaf.object, "rb") (foutput, fpath) = utils.get_safe_tempfile() try: docutils.core.publish_file(finput, destination=foutput, writer_name="html") finally: finput.close() foutput.close() utils.show_path(fpath) def item_types(self): yield FileLeaf def valid_for_item(self, leaf): root, ext = os.path.splitext(leaf.object) return ext.lower() in (".rst", ".rest", ".txt") def get_description(self): return __description__ def get_gicon(self): return icons.ComposedIcon(Action.get_icon_name(self), "python") kupfer-v208/kupfer/plugin/screen.py000066400000000000000000000055431176220042200174750ustar00rootroot00000000000000__kupfer_name__ = _("GNU Screen") __kupfer_sources__ = ("ScreenSessionsSource", ) __description__ = _("Active GNU Screen sessions") __version__ = "" __author__ = "Ulrik Sverdrup " import os from kupfer.objects import Leaf, Action, Source from kupfer.obj.helplib import FilesystemWatchMixin from kupfer import utils def screen_sessions_infos(): """ Yield tuples of pid, name, time, status for running screen sessions """ pipe = os.popen("screen -list") output = pipe.read() for line in output.splitlines(): fields = line.split("\t") if len(fields) == 4: empty, pidname, time, status = fields pid, name = pidname.split(".", 1) time = time.strip("()") status = status.strip("()") yield (pid, name, time, status) def get_username(): """Return username for current user""" import pwd info = pwd.getpwuid(os.geteuid()) return info[0] class ScreenSession (Leaf): """Represented object is the session pid as string""" def get_actions(self): return (AttachScreen(),) def is_valid(self): for pid, name, time, status in screen_sessions_infos(): if self.object == pid: return True else: return False def get_description(self): for pid, name, time, status in screen_sessions_infos(): if self.object == pid: break else: return "%s (%s)" % (self.name, self.object) # Handle localization of status status_dict = { "Attached": _("Attached"), "Detached": _("Detached"), } status = status_dict.get(status, status) return (_("%(status)s session (%(pid)s) created %(time)s") % {"status": status, "pid": pid, "time": time}) def get_icon_name(self): return "gnome-window-manager" class ScreenSessionsSource (Source, FilesystemWatchMixin): """Source for GNU Screen sessions""" def __init__(self): super(ScreenSessionsSource, self).__init__(_("Screen Sessions")) def initialize(self): ## the screen dir might not exist when we start ## luckily, gio can monitor directories before they exist self.screen_dir = (os.getenv("SCREENDIR") or "/var/run/screen/S-%s" % get_username()) if not os.path.exists(self.screen_dir): self.output_debug("Screen socket dir or SCREENDIR not found") self.monitor_token = self.monitor_directories(self.screen_dir, force=True) def get_items(self): if not os.path.exists(self.screen_dir): return for pid, name, time, status in screen_sessions_infos(): yield ScreenSession(pid, name) def get_description(self): return _("Active GNU Screen sessions") def get_icon_name(self): return "terminal" def provides(self): yield ScreenSession class AttachScreen (Action): """ """ def __init__(self): name = _("Attach") super(AttachScreen, self).__init__(name) def activate(self, leaf): pid = leaf.object action_argv = ['screen', '-x', '-R', ('%s' % pid)] utils.spawn_in_terminal(action_argv) kupfer-v208/kupfer/plugin/sendkeys.py000066400000000000000000000070511176220042200200370ustar00rootroot00000000000000 __kupfer_name__ = _("Send Keys") __kupfer_actions__ = ( "CopyAndPaste", "SendKeys", "TypeText", ) __description__ = _("Send synthetic keyboard events using " "xautomation") __version__ = "" __author__ = "" import gtk from kupfer.objects import Leaf, Action, TextLeaf from kupfer.objects import OperationError from kupfer import utils from kupfer import interface # delay for first keypress and all following INIT_DELAY = 'usleep 300000' INTER_DELAY = 'usleep 50000' class CopyAndPaste (Action): # rank down since it applies everywhere rank_adjust = -2 def __init__(self): Action.__init__(self, _("Paste to Foreground Window")) def activate(self, leaf): clip = gtk.clipboard_get(gtk.gdk.SELECTION_CLIPBOARD) interface.copy_to_clipboard(leaf, clip) xte_paste_argv = ['xte', INIT_DELAY, 'keydown Control_L', 'key v', 'keyup Control_L'] try: utils.spawn_async_raise(xte_paste_argv) except utils.SpawnError as exc: raise OperationError(exc) def item_types(self): yield Leaf def valid_for_item(self, leaf): try: return bool(interface.get_text_representation(leaf)) except AttributeError: pass def get_description(self): return _("Copy to clipboard and send Ctrl+V to foreground window") def get_icon_name(self): return "edit-paste" class SendKeys (Action): def __init__(self): Action.__init__(self, _("Send Keys")) def activate(self, leaf): return self.activate_multiple((leaf, )) def activate_multiple(self, objects): xte_sendkey_argv = ['xte', INIT_DELAY] iterobjects = iter(objects) for obj in iterobjects: xte_sendkey_argv.extend(self.make_keystr_arguments(obj.object)) break for obj in iterobjects: xte_sendkey_argv.append(INTER_DELAY) xte_sendkey_argv.extend(self.make_keystr_arguments(obj.object)) try: utils.spawn_async_raise(xte_sendkey_argv) except utils.SpawnError as exc: raise OperationError(exc) def make_keystr_arguments(self, keystr): keys, orig_mods = gtk.accelerator_parse(keystr) m = { gtk.gdk.SHIFT_MASK: "Shift_L", gtk.gdk.CONTROL_MASK: "Control_L", gtk.gdk.SUPER_MASK: "Super_L", gtk.gdk.MOD1_MASK: "Alt_L", } mod_names = [] mods = orig_mods for mod in m: if mod & mods: mod_names.append(m[mod]) mods &= ~mod if mods != 0: raise OperationError("Keys not yet implemented: %s" % gtk.accelerator_get_label(keys, orig_mods)) key_arg = 'key %s' % (gtk.gdk.keyval_name(keys), ) mods_down = ['keydown ' + n for n in mod_names] mods_up = ['keyup ' + n for n in reversed(mod_names)] return mods_down + [key_arg] + mods_up def item_types(self): yield TextLeaf def valid_for_item(self, leaf): text = leaf.object keys, mods = gtk.accelerator_parse(text) return keys def get_description(self): return _("Send keys to foreground window") class TypeText (Action): rank_adjust = -2 def __init__(self): Action.__init__(self, _("Type Text")) def activate(self, leaf): text = interface.get_text_representation(leaf) xte_paste_argv = ['xte', 'usleep 300000'] # replace all newlines with 'key Return' for line in text.splitlines(True): xte_paste_argv.append("str " + line.rstrip("\r\n")) if line.endswith("\n"): xte_paste_argv.append("key Return") try: utils.spawn_async_raise(xte_paste_argv) except utils.SpawnError as exc: raise OperationError(exc) def item_types(self): yield Leaf def valid_for_item(self, leaf): try: return bool(interface.get_text_representation(leaf)) except AttributeError: pass def get_description(self): return _("Type the text to foreground window") kupfer-v208/kupfer/plugin/services.py000066400000000000000000000075301176220042200200370ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("System Services") __kupfer_sources__ = ("SystemServicesSource", ) __description__ = _("Start, stop or restart system services via init scripts") __version__ = "0.2" __author__ = "Karol Będkowski " import os from kupfer import plugin_support from kupfer.objects import Leaf, Action, Source from kupfer.obj.helplib import FilesystemWatchMixin from kupfer import utils __kupfer_settings__ = plugin_support.PluginSettings( { 'key': 'sudo_cmd', 'label': _("Sudo-like Command"), 'type': str, 'value': 'gksu', }, ) # skip this services _SERVICES_BLACK_LIST = [ "acpid", "acpi-support", "alsa-utils", "apmd", "binfmt-support", "bootlogd", "bootmisc.sh", "checkfs.sh", "checkroot.sh", "console-screen.kbd.sh", "console-setup", "dbus", "dns-clean", "glibc.sh", "hal", "halt", "hostname.sh", "hotkey-setup", "hwclockfirst.sh", "hwclock.sh", "keyboard-setup", "killprocs", "klogd", "laptop-mode", "linux-restricted-modules-common", "module-init-tools", "mountall-bootclean.sh", "mountall.sh", "mountdevsubfs.sh", "mountkernfs.sh", "mountnfs-bootclean.sh", "mountnfs.sh", "mountoverflowtmp", "mtab.sh", "policykit", "pppd-dns", "procps", "rc", "rc.local", "rcS", "reboot", "readahead", "readahead-desktop", "rmnologin", "screen-cleanup", "sendsigs", "single", "stop-bootlogd", "stop-bootlogd-single", "stop-readahead", "sysklogd", "system-tools-backends", "udev", "udev-finish", "umountfs", "umountnfs.sh", "umountroot", "urandom", "vbesave", "wpa-ifupdown", "x11-common", 'README' ] class Service(Leaf): """ Represent system service """ def get_actions(self): yield StartService() yield StopService() yield RestartService() def get_description(self): return self.object def get_icon_name(self): return "applications-system" class _ServiceAction(Action): def __init__(self, name, icon, command): Action.__init__(self, name) self._icon = icon self._command = command def get_icon_name(self): return self._icon def activate(self, leaf): sudo_cmd = __kupfer_settings__["sudo_cmd"] utils.spawn_in_terminal([sudo_cmd, leaf.object, self._command]) def item_types(self): yield Service class StartService(_ServiceAction): """ Start service action """ def __init__(self): _ServiceAction.__init__(self, _('Start Service'), 'start', 'start') class RestartService(_ServiceAction): """ restart service action """ def __init__(self): _ServiceAction.__init__(self, _('Restart Service'), 'reload', 'restart') class StopService(_ServiceAction): """ restart service action """ def __init__(self): _ServiceAction.__init__(self, _('Stop Service'), 'stop', 'stop') class SystemServicesSource(Source, FilesystemWatchMixin): ''' Index system services from /etc/*/init.d/ ''' def __init__(self, name=_("System Services")): Source.__init__(self, name) self._initd_path = None def initialize(self): # path to file with list notebooks for initd_path in ('/etc/init.d/', '/etc/rc.d/init.d', '/etc/rc.d'): if os.path.exists(initd_path) and os.path.isdir(initd_path): self._initd_path = initd_path self.monitor_token = self.monitor_directories(self._initd_path) break def monitor_include_file(self, gfile): return gfile and not gfile.get_basename() in _SERVICES_BLACK_LIST def get_items(self): if self._initd_path is None: return for filename in os.listdir(self._initd_path): if (filename in _SERVICES_BLACK_LIST \ or filename.find('dpkg-') > 0 or filename.endswith('~') \ or filename.startswith('.')): continue file_path = os.path.join(self._initd_path, filename) if not os.path.isfile(file_path): continue yield Service(file_path, _("%s Service") % filename) def should_sort_lexically(self): return True def get_icon_name(self): return "applications-system" def provides(self): yield Service kupfer-v208/kupfer/plugin/session_gnome.py000066400000000000000000000016311176220042200210600ustar00rootroot00000000000000__kupfer_name__ = _("GNOME Session Management") __kupfer_sources__ = ("GnomeItemsSource", ) __description__ = _("Special items and actions for GNOME environment") __version__ = "2009-12-05" __author__ = "Ulrik Sverdrup " from kupfer.plugin import session_support as support # sequences of argument lists LOGOUT_CMD = (["gnome-panel-logout"], ["gnome-session-save", "--kill"]) SHUTDOWN_CMD = (["gnome-panel-logout", "--shutdown"], ["gnome-session-save", "--shutdown-dialog"]) LOCKSCREEN_CMD = (["gnome-screensaver-command", "--lock"], ["xdg-screensaver", "lock"]) class GnomeItemsSource (support.CommonSource): def __init__(self): support.CommonSource.__init__(self, _("GNOME Session Management")) def get_items(self): return ( support.Logout(LOGOUT_CMD), support.LockScreen(LOCKSCREEN_CMD), support.Shutdown(SHUTDOWN_CMD), ) kupfer-v208/kupfer/plugin/session_support.py000066400000000000000000000036141176220042200214720ustar00rootroot00000000000000''' Common objects for session_* plugins. ''' from kupfer.objects import Source, RunnableLeaf from kupfer import utils, pretty __version__ = "2009-12-05" __author__ = "Ulrik Sverdrup " def launch_argv_with_fallbacks(commands, print_error=True): """Try the sequence of @commands with utils.spawn_async, and return with the first successful command. return False if no command is successful and log an error """ for argv in commands: ret = utils.spawn_async(argv) if ret: return ret pretty.print_error(__name__, "Unable to run command(s)", commands) return False class CommandLeaf (RunnableLeaf): """The represented object of the CommandLeaf is a list of commandlines""" def run(self): launch_argv_with_fallbacks(self.object) class Logout (CommandLeaf): """Log out from desktop""" def __init__(self, commands, name=None): if not name: name = _("Log Out...") CommandLeaf.__init__(self, commands, name) def get_description(self): return _("Log out or change user") def get_icon_name(self): return "system-log-out" class Shutdown (CommandLeaf): """Shutdown computer or reboot""" def __init__(self, commands, name=None): if not name: name = _("Shut Down...") CommandLeaf.__init__(self, commands, name) def get_description(self): return _("Shut down, restart or suspend computer") def get_icon_name(self): return "system-shutdown" class LockScreen (CommandLeaf): """Lock screen""" def __init__(self, commands, name=None): if not name: name = _("Lock Screen") CommandLeaf.__init__(self, commands, name) def get_description(self): return _("Enable screensaver and lock") def get_icon_name(self): return "system-lock-screen" class CommonSource (Source): def __init__(self, name): super(CommonSource, self).__init__(name) def is_dynamic(self): return True def get_icon_name(self): return "system-shutdown" def provides(self): yield RunnableLeaf kupfer-v208/kupfer/plugin/session_xfce.py000066400000000000000000000014151176220042200207000ustar00rootroot00000000000000# -*- coding: utf-8 -* __kupfer_name__ = _("XFCE Session Management") __kupfer_sources__ = ("XfceItemsSource", ) __description__ = _("Special items and actions for XFCE environment") __version__ = "2009-12-05" __author__ = "Karol Będkowski " from kupfer.plugin import session_support as support # sequences of argument lists LOGOUT_CMD = (["xfce4-session-logout", "--logout"],) SHUTDOWN_CMD = (["xfce4-session-logout"],) LOCKSCREEN_CMD = (["xdg-screensaver", "lock"], ) class XfceItemsSource (support.CommonSource): def __init__(self): support.CommonSource.__init__(self, _("XFCE Session Management")) def get_items(self): return ( support.Logout(LOGOUT_CMD), support.LockScreen(LOCKSCREEN_CMD), support.Shutdown(SHUTDOWN_CMD), ) kupfer-v208/kupfer/plugin/shorten_links.py000066400000000000000000000076711176220042200211040ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("Shorten Links") __kupfer_actions__ = ("ShortenLinks", ) __description__ = _("Create short aliases of long URLs") __version__ = "2011-03-01" __author__ = "Karol Będkowski " import httplib import urllib from kupfer.objects import Leaf, Action, Source, UrlLeaf, OperationError from kupfer.plugin import ssl_support from kupfer import pretty class _ShortLinksService(Leaf): def __init__(self, name): Leaf.__init__(self, name, name) def get_icon_name(self): return "text-html" class _GETService(_ShortLinksService, pretty.OutputMixin): """ A unified shortener service working with GET requests """ host = None path = None url_key = "url" use_https = False def process(self, url): """Shorten @url or raise ValueError""" query_string = urllib.urlencode({self.url_key : url}) try: if self.use_https and ssl_support.is_supported(): conn = ssl_support.VerifiedHTTPSConnection(self.host, timeout=5) pretty.print_debug(__name__, "Connected SSL to", self.host) else: conn = httplib.HTTPConnection(self.host, timeout=5) conn.request("GET", self.path+query_string) resp = conn.getresponse() if resp.status != 200: raise ValueError('Invalid response %d, %s' % (resp.status, resp.reason)) result = resp.read() return result.strip() except (httplib.HTTPException, IOError, ValueError) as exc: raise ValueError(exc) return _('Error') # NOTE: It's important that we use only sites that provide a stable API class TinyUrl(_GETService): """ Website: http://tinyurl.com """ host = "tinyurl.com" path = "/api-create.php?" def __init__(self): _ShortLinksService.__init__(self, u'TinyUrl.com') class IsGd(_GETService): """ Website: http://is.gd Reference: http://is.gd/apishorteningreference.php """ host = 'is.gd' path = '/create.php?format=simple&' def __init__(self): _ShortLinksService.__init__(self, u'Is.gd') class VGd(_GETService): """ Website: http://v.gd Reference: http://v.gd/apishorteningreference.php Like is.gd, but v.gd always shows a preview page. """ host = 'v.gd' path = '/create.php?format=simple&' def __init__(self): _ShortLinksService.__init__(self, u'V.gd') class BitLy(_GETService): """ Website: http://bit.ly Reference: http://code.google.com/p/bitly-api/wiki/ApiDocumentation """ # No password is available for this login name, # yet there is a possibility that you could track # all URLs shortened using this API key BITLY_LOGIN = "kupferkupfer" BITLY_API_KEY = "R_a617770f00b647d6c22ce162105125c2" host = 'api.bitly.com' path = ('/v3/shorten?login=%s&apiKey=%s&format=txt&' % (BITLY_LOGIN, BITLY_API_KEY)) url_key = "longUrl" def __init__(self): _ShortLinksService.__init__(self, u'Bit.ly') class BitLySSL(BitLy): host = 'api-ssl.bitly.com' use_https = True def __init__(self): _ShortLinksService.__init__(self, u'Bit.ly (HTTPS)') def process(self, url): resp = BitLy.process(self, url) return resp.replace("http://bit.ly", "https://bit.ly") class ShortenLinks(Action): ''' Shorten links with selected engine ''' def __init__(self): Action.__init__(self, _('Shorten With...')) def has_result(self): return True def activate(self, leaf, iobj): try: result = iobj.process(leaf.object) except ValueError as exc: raise OperationError(unicode(exc)) return UrlLeaf(result, result) def item_types(self): yield UrlLeaf def requires_object(self): return True def object_types(self): yield _ShortLinksService def object_source(self, for_item=None): return ServicesSource() def get_description(self): return __description__ class ServicesSource(Source): def __init__(self): Source.__init__(self, _("Services")) def get_items(self): yield TinyUrl() yield IsGd() yield VGd() yield BitLy() if ssl_support.is_supported(): yield BitLySSL() def should_sort_lexically(self): return True def get_icon_name(self): return "applications-internet" kupfer-v208/kupfer/plugin/show_qrcode.py000066400000000000000000000031651176220042200205310ustar00rootroot00000000000000"""Create QRCodes from texts or urls. Useful for smartphones with QRCode readers: Create some url with kupfer and QRCode it. Get it with the phone and use it's browser to display""" __kupfer_name__ = _("Show QRCode") __kupfer_actions__ = ( "ShowQRCode", ) __description__ = _("Display text as QRCode in a window") __version__ = "0.0.2" __author__ = "Thomas Renard " import StringIO import gtk import qrencode from kupfer.objects import Action, Leaf class ShowQRCode (Action): """Create QRCode windows from text or url""" def __init__(self): """initialize action""" Action.__init__(self, _("Show QRCode")) def wants_context(self): return True def activate(self, leaf, ctx): """Create the image from leaf text and display it on window""" image_file = StringIO.StringIO() text = leaf.get_text_representation() version, size, image = qrencode.encode_scaled(text, size=300) image.save(image_file, "ppm") image_contents = image_file.getvalue() image_file.close() loader = gtk.gdk.PixbufLoader("pnm") loader.write(image_contents, len(image_contents)) pixbuf = loader.get_pixbuf() loader.close() window = gtk.Window() window.set_default_size(350, 350) image = gtk.Image() image.set_from_pixbuf(pixbuf) image.show() window.add(image) ctx.environment.present_window(window) def item_types(self): yield Leaf def valid_for_item(self, leaf): return hasattr(leaf, "get_text_representation") def get_description(self): """The Action description""" return _("Display text as QRCode in a window") def get_icon_name(self): """Name of the icon""" return "format-text-bold" kupfer-v208/kupfer/plugin/show_text.py000066400000000000000000000035111176220042200202330ustar00rootroot00000000000000__kupfer_name__ = _("Show Text") __kupfer_actions__ = ( "ShowText", "LargeType", "ShowNotification", ) __description__ = _("Display text in a window") __version__ = "" __author__ = "US" from kupfer.objects import Action, Leaf, TextLeaf from kupfer import icons, uiutils from kupfer import textutils class ShowText (Action): def __init__(self): Action.__init__(self, _("Show Text")) def wants_context(self): return True def activate(self, leaf, ctx): uiutils.show_text_result(leaf.get_text_representation(), title=_("Show Text"), ctx=ctx) def item_types(self): yield TextLeaf def get_description(self): return _("Display text in a window") def get_icon_name(self): return "format-text-bold" class LargeType (Action): def __init__(self): Action.__init__(self, _("Large Type")) def wants_context(self): return True def activate(self, leaf, ctx): return self.activate_multiple((leaf, ), ctx) def activate_multiple(self, objects, ctx): all_texts = [] for obj in objects: all_texts.append(obj.get_text_representation()) uiutils.show_large_type("\n".join(all_texts), ctx) def item_types(self): yield Leaf def valid_for_item(self, obj): return hasattr(obj, "get_text_representation") def get_description(self): return _("Display text in a window") def get_gicon(self): return icons.ComposedIcon("format-text-bold", "zoom-in") def get_icon_name(self): return "format-text-bold" class ShowNotification (Action): def __init__(self): Action.__init__(self, _("Show Notification")) def activate(self, leaf): title, body = textutils.extract_title_body(leaf.object) if body: uiutils.show_notification(title, body, icon_name=self.get_icon_name()) else: uiutils.show_notification(title) def item_types(self): yield TextLeaf def get_icon_name(self): return "format-text-bold" kupfer-v208/kupfer/plugin/skype.py000066400000000000000000000164571176220042200173570ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("Skype") __kupfer_sources__ = ("ContactsSource", ) __kupfer_actions__ = ("ChangeStatus", 'Chat', 'Call') __description__ = _("Access to Skype contacts") __version__ = "2011-02-05" __author__ = "Karol Będkowski " import dbus from kupfer.objects import Leaf, Action, Source from kupfer.objects import AppLeaf from kupfer import pretty, icons from kupfer import plugin_support from kupfer.obj.apps import AppLeafContentMixin from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj.contacts import ContactLeaf, SkypeContact # This plugin Requires D-Bus to work plugin_support.check_dbus_connection() SKYPE_IFACE = 'com.Skype.API' SKYPE_PATH_CLIENT = '/com/Skype/Client' SKYPE_CLIENT_API = 'com.Skype.API.Client' SKYPE_KEY = "SKYPE" _STATUSES = { 'ONLINE': _('Available'), 'SKYPEME': _('Skype Me'), 'AWAY': _('Away'), 'NA': _('Not Available'), 'DND': _('Busy'), 'INVISIBLE':_('Invisible'), 'OFFLINE': _('Offline'), 'LOGGEDOUT': _('Logged Out') } def _parse_response(response, prefix): if response.startswith(prefix): return response[len(prefix):].strip() return None class _SkypeNotify(dbus.service.Object): def __init__(self, bus, callback): dbus.service.Object.__init__(self, bus, SKYPE_PATH_CLIENT) self._callback = callback @dbus.service.method(SKYPE_CLIENT_API, in_signature='s') def Notify(self, com): pretty.print_debug(__name__, '_SkypeNotify', 'Notify', com) self._callback(com) class Skype(object): """ Handling events from skype""" __instance__ = None @classmethod def get(cls): if cls.__instance__ is None: cls.__instance__ = cls() return cls.__instance__ def __init__(self): self._friends = None self._authenticated = False try: self.bus = bus = dbus.Bus() except dbus.DBusException, err: pretty.print_error(__name__, 'Skype', '__init__', err) return self._dbus_name_owner_watch = bus.add_signal_receiver( self._signal_dbus_name_owner_changed, 'NameOwnerChanged', 'org.freedesktop.DBus', 'org.freedesktop.DBus', '/org/freedesktop/DBus', arg0=SKYPE_IFACE) self._skype_notify_callback = _SkypeNotify(bus, self._signal_update) self._signal_dbus_name_owner_changed() def __del__(self): if self.bus: self.bus.remove_signal_receiver(self._dbus_name_owner_watch) self._dbus_name_owner_watch = None self._skype_notify_callback = None def _get_skype(self, bus): ''' Check if Skype is running and login to it. Return Skype proxy object. ''' try: proxy_obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(proxy_obj, 'org.freedesktop.DBus') if dbus_iface.NameHasOwner(SKYPE_IFACE): skype = bus.get_object(SKYPE_IFACE, '/com/Skype') if skype and not self._authenticated: resp = skype.Invoke("NAME Kupfer") if resp.startswith('ERROR'): return None resp = skype.Invoke("PROTOCOL 5") if resp != 'PROTOCOL 5': return None self._authenticated = True return skype except dbus.exceptions.DBusException, err: pretty.print_debug(__name__, 'Skype', '_get_skype', err) return None def _signal_dbus_name_owner_changed(self, *args, **kwarg): pretty.print_debug(__name__, 'Skype', '_signal_dbus_name_owner_changed', args, kwarg) self._authenticated = False self._signal_update(*args, **kwarg) def _signal_update(self, *args, **kwargs): pretty.print_debug(__name__, 'Skype', '_signal_update', args, kwargs) self._friends = None def _get_friends(self): pretty.print_debug(__name__, 'Skype', '_get_friends') self._friends = [] skype = self._get_skype(self.bus) if not skype: return users = skype.Invoke("SEARCH FRIENDS") if not users.startswith('USERS '): return users = users[6:].split(',') for user in users: user = user.strip() fullname = skype.Invoke('GET USER %s FULLNAME' % user) fullname = _parse_response(fullname, 'USER %s FULLNAME' % user) displayname = skype.Invoke('GET USER %s DISPLAYNAME' % user) displayname = _parse_response(displayname, 'USER %s DISPLAYNAME' % user) status = skype.Invoke('GET USER %s ONLINESTATUS' % user) status = _parse_response(status, 'USER %s ONLINESTATUS' % user) contact = Contact((displayname or fullname or user), user, status) self._friends.append(contact) @property def friends(self): if self._friends is None: self._get_friends() return self._friends def open_chat(self, handle): skype = self._get_skype(self.bus) if not skype: return resp = skype.Invoke("CHAT CREATE %s" % handle) if resp.startswith('CHAT '): _chat, chat_id, _status, status = resp.split() skype.Invoke('OPEN CHAT %s' % chat_id) def call(self, handle): skype = self._get_skype(self.bus) if skype: skype.Invoke("CALL %s" % handle) def set_status(self, status): skype = self._get_skype(self.bus) if skype: skype.Invoke("SET USERSTATUS %s" % status) class Contact(SkypeContact): def __init__(self, name, handle, status): SkypeContact.__init__(self, handle, name) self.kupfer_add_alias(handle) self._description = _("[%(status)s] %(userid)s") % \ dict(status=status, userid=handle) def get_description(self): return self._description def get_gicon(self): return icons.ComposedIconSmall(self.get_icon_name(), "skype") class AccountStatus(Leaf): pass class Chat(Action): rank_adjust = 5 def __init__(self): Action.__init__(self, _("Open Chat")) def activate(self, leaf): handle = SKYPE_KEY in leaf and leaf[SKYPE_KEY] if handle: Skype.get().open_chat(handle) def item_types(self): yield ContactLeaf def valid_for_item(self, item): return SKYPE_KEY in item and item[SKYPE_KEY] def get_icon_name(self): return 'internet-group-chat' class Call(Action): rank_adjust = 5 def __init__(self): Action.__init__(self, _("Call")) def activate(self, leaf): handle = SKYPE_KEY in leaf and leaf[SKYPE_KEY] if handle: Skype.get().call(handle) def item_types(self): yield ContactLeaf def valid_for_item(self, item): return SKYPE_KEY in item and item[SKYPE_KEY] def get_description(self): return _("Place a call to contact") def get_icon_name(self): return 'call-start' class ChangeStatus(Action): ''' Change global status ''' rank_adjust = 5 def __init__(self): Action.__init__(self, _('Change Global Status To...')) def activate(self, leaf, iobj): Skype.get().set_status(iobj.object) def item_types(self): yield AppLeaf def valid_for_item(self, leaf): return leaf.get_id() == 'skype' def requires_object(self): return True def object_types(self): yield AccountStatus def object_source(self, for_item=None): return StatusSource() class ContactsSource(AppLeafContentMixin, ToplevelGroupingSource): appleaf_content_id = 'skype' def __init__(self, name=_('Skype Contacts')): super(ContactsSource, self).__init__(name, "Contacts") self._version = 3 def get_items(self): pretty.print_debug(__name__, 'ContactsSource', 'get_items') return Skype.get().friends def get_icon_name(self): return 'skype' def provides(self): yield Contact def is_dynamic(self): return True class StatusSource(Source): def __init__(self): Source.__init__(self, _("Skype Statuses")) def get_items(self): for status, name in _STATUSES.iteritems(): yield AccountStatus(status, name) def provides(self): yield AccountStatus kupfer-v208/kupfer/plugin/ssh_hosts.py000066400000000000000000000056041176220042200202310ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("SSH Hosts") __description__ = _("Adds the SSH hosts found in ~/.ssh/config.") __version__ = "2010-04-12" __author__ = "Fabian Carlström" __kupfer_sources__ = ("SSHSource", ) __kupfer_actions__ = ("SSHConnect", ) import codecs import os from kupfer import icons, utils from kupfer.objects import Action from kupfer.obj.helplib import FilesystemWatchMixin from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj.hosts import HOST_NAME_KEY, HostLeaf, HOST_SERVICE_NAME_KEY, \ HOST_ADDRESS_KEY class SSHLeaf (HostLeaf): """The SSH host. It only stores the "Host" as it was specified in the ssh config. """ def __init__(self, name): slots = {HOST_NAME_KEY: name, HOST_ADDRESS_KEY: name, HOST_SERVICE_NAME_KEY: "ssh"} HostLeaf.__init__(self, slots, name) def get_description(self): return _("SSH host") def get_gicon(self): return icons.ComposedIconSmall(self.get_icon_name(), "applications-internet") class SSHConnect (Action): """Used to launch a terminal connecting to the specified SSH host. """ def __init__(self): Action.__init__(self, name=_("Connect")) def activate(self, leaf): utils.spawn_in_terminal(["ssh", leaf[HOST_ADDRESS_KEY]]) def get_description(self): return _("Connect to SSH host") def get_icon_name(self): return "network-server" def item_types(self): yield HostLeaf def valid_for_item(self, item): if item.check_key(HOST_SERVICE_NAME_KEY): return item[HOST_SERVICE_NAME_KEY] == 'ssh' return False class SSHSource (ToplevelGroupingSource, FilesystemWatchMixin): """Reads ~/.ssh/config and creates leaves for the hosts found. """ _ssh_home = os.path.expanduser("~/.ssh/") _ssh_config_file = "config" _config_path = os.path.join(_ssh_home, _ssh_config_file) def __init__(self, name=_("SSH Hosts")): ToplevelGroupingSource.__init__(self, name, "hosts") self._version = 2 def initialize(self): ToplevelGroupingSource.initialize(self) self.monitor_token = self.monitor_directories(self._ssh_home) def monitor_include_file(self, gfile): return gfile and gfile.get_basename() == self._ssh_config_file def get_items(self): try: content = codecs.open(self._config_path, "r", "UTF-8").readlines() for line in content: line = line.strip() words = line.split() # Take every word after "Host" as an individual host # we must skip entries with wildcards if words and words[0].lower() == "host": for word in words[1:]: if "*" in word: continue yield SSHLeaf(word) except EnvironmentError, exc: self.output_error(exc) except UnicodeError, exc: self.output_error("File %s not in expected encoding (UTF-8)" % self._config_path) self.output_error(exc) def get_description(self): return _("SSH hosts as specified in ~/.ssh/config") def get_icon_name(self): return "applications-internet" def provides(self): yield SSHLeaf kupfer-v208/kupfer/plugin/ssl_support.py000066400000000000000000000005021176220042200206010ustar00rootroot00000000000000""" Stub implementation of HTTPS connections. """ class VerifiedHTTPSConnection (object): "implementation stub" def __init__(self, host, *args, **kwargs): pass @classmethod def is_ssl_supported(cls): return False def is_supported(): return VerifiedHTTPSConnection and VerifiedHTTPSConnection.is_ssl_supported() kupfer-v208/kupfer/plugin/templates.py000066400000000000000000000071271176220042200202140ustar00rootroot00000000000000__kupfer_name__ = _("Document Templates") __kupfer_sources__ = ("TemplatesSource", ) __kupfer_actions__ = ("CreateNewDocument", ) __description__ = _("Create new documents from your templates") __version__ = "" __author__ = "Ulrik Sverdrup " import os import gio import glib from kupfer.objects import Leaf, Action, Source, FileLeaf from kupfer import icons, utils from kupfer.obj import helplib from kupfer.obj.helplib import FilesystemWatchMixin DEFAULT_TMPL_DIR = "~/Templates" class Template (FileLeaf): def __init__(self, path): basename = glib.filename_display_basename(path) nameroot, ext = os.path.splitext(basename) FileLeaf.__init__(self, path, _("%s template") % nameroot) def get_actions(self): yield CreateDocumentIn() for a in FileLeaf.get_actions(self): yield a def get_gicon(self): file_gicon = FileLeaf.get_gicon(self) return icons.ComposedIcon("text-x-generic-template", file_gicon) class EmptyFile (Leaf): def __init__(self): Leaf.__init__(self, None, _("Empty File")) def repr_key(self): return "" def get_actions(self): yield CreateDocumentIn() def get_icon_name(self): return "text-x-generic" class NewFolder (Leaf): def __init__(self): Leaf.__init__(self, None, _("New Folder")) def repr_key(self): return "" def get_actions(self): yield CreateDocumentIn() def get_icon_name(self): return "folder" class CreateNewDocument (Action): def __init__(self): Action.__init__(self, _("Create New Document...")) def has_result(self): return True def activate(self, leaf, iobj): if iobj.object is not None: # Copy the template to destination directory basename = os.path.basename(iobj.object) tmpl_gfile = gio.File(iobj.object) destpath = utils.get_destpath_in_directory(leaf.object, basename) destfile = gio.File(destpath) tmpl_gfile.copy(destfile, flags=gio.FILE_COPY_ALL_METADATA) elif isinstance(iobj, NewFolder): filename = unicode(iobj) destpath = utils.get_destpath_in_directory(leaf.object, filename) os.makedirs(destpath) else: # create new empty file filename = unicode(iobj) f, destpath = utils.get_destfile_in_directory(leaf.object, filename) f.close() return FileLeaf(destpath) def item_types(self): yield FileLeaf def valid_for_item(self, leaf): return leaf.is_dir() def requires_object(self): return True def object_types(self): yield Template yield EmptyFile yield NewFolder def object_source(self, for_item=None): return TemplatesSource() def get_description(self): return _("Create a new document from template") def get_icon_name(self): return "document-new" class CreateDocumentIn(helplib.reverse_action(CreateNewDocument)): rank_adjust = 10 def __init__(self): Action.__init__(self, _("Create Document In...")) class TemplatesSource (Source, FilesystemWatchMixin): def __init__(self): Source.__init__(self, _("Document Templates")) @classmethod def _get_tmpl_dir(self): tmpl_dir = glib.get_user_special_dir(glib.USER_DIRECTORY_TEMPLATES) if not tmpl_dir: tmpl_dir = os.path.expanduser(DEFAULT_TMPL_DIR) return tmpl_dir def initialize(self): self.monitor_token = self.monitor_directories(self._get_tmpl_dir()) def get_items(self): tmpl_dir = self._get_tmpl_dir() yield EmptyFile() yield NewFolder() try: for fname in os.listdir(tmpl_dir): yield Template(os.path.join(tmpl_dir, fname)) except EnvironmentError, exc: self.output_error(exc) def should_sort_lexically(self): return True def get_description(self): return None def get_icon_name(self): return "system-file-manager" def provides(self): yield Template kupfer-v208/kupfer/plugin/textfiles.py000066400000000000000000000061111176220042200202150ustar00rootroot00000000000000""" Work with Textfiles: Allow appending and writing new files, or extracting the content of files. All Text in Kupfer is in unicode. When we read from textfiles or write to textfiles, we always work in the locale-defined encoding. FIXME: Be less strict (use UTF-8 if locale says Ascii) """ from __future__ import with_statement __kupfer_name__ = _("Textfiles") __kupfer_actions__ = ( "AppendTo", "AppendText", "WriteTo", "GetTextContents", ) __description__ = None __version__ = "0.1" __author__ = "Ulrik Sverdrup " import gio from kupfer.objects import Action from kupfer.objects import TextLeaf, FileLeaf from kupfer.obj import helplib from kupfer import kupferstring from kupfer import utils # FIXME: Sometimes require that the type is *exactly* text/plain? def is_content_type(fileleaf, ctype): predicate = gio.content_type_is_a ctype_guess, uncertain = gio.content_type_guess(fileleaf.object, None, True) ret = predicate(ctype_guess, ctype) if ret or not uncertain: return ret content_attr = gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE gfile = gio.File(fileleaf.object) if not gfile.query_exists(None): return info = gfile.query_info(content_attr) content_type = info.get_attribute_string(content_attr) return predicate(content_type, ctype) class AppendTo (Action): def __init__(self, name=None): if not name: name = _("Append To...") Action.__init__(self, name) def activate(self, leaf, iobj): l_text = kupferstring.tolocale(leaf.object) with open(iobj.object, "ab") as outfile: outfile.write(l_text) outfile.write("\n") def item_types(self): yield TextLeaf def requires_object(self): return True def object_types(self): yield FileLeaf def valid_object(self, iobj, for_item=None): return is_content_type(iobj, "text/plain") def get_icon_name(self): return "list-add" class AppendText (helplib.reverse_action(AppendTo)): def __init__(self): Action.__init__(self, _("Append...")) class WriteTo (Action): def __init__(self): Action.__init__(self, _("Write To...")) def has_result(self): return True def activate(self, leaf, iobj): outfile, outpath = \ utils.get_destfile_in_directory(iobj.object, _("Empty File")) try: l_text = kupferstring.tolocale(leaf.object) outfile.write(l_text) if not l_text.endswith("\n"): outfile.write("\n") finally: outfile.close() return FileLeaf(outpath) def item_types(self): yield TextLeaf def requires_object(self): return True def object_types(self): yield FileLeaf def valid_object(self, iobj, for_item=None): return iobj.is_dir() def get_icon_name(self): return "document-new" class GetTextContents (Action): def __init__(self): Action.__init__(self, _("Get Text Contents")) def has_result(self): return True def activate(self, leaf): with open(leaf.object, "rb") as infile: l_text = infile.read() us_text = kupferstring.fromlocale(l_text) return TextLeaf(us_text) def item_types(self): yield FileLeaf def valid_for_item(self, item): return is_content_type(item, "text/plain") def get_icon_name(self): return "edit-copy" kupfer-v208/kupfer/plugin/thunar.py000066400000000000000000000231631176220042200175150ustar00rootroot00000000000000__kupfer_name__ = _("Thunar") __kupfer_sources__ = ("ThunarObjects", ) __kupfer_actions__ = ( "Reveal", "GetInfo", "SendTo", "CopyTo", "LinkTo", "MoveTo", ) __description__ = _("File manager Thunar actions") __version__ = "" __author__ = "Ulrik Sverdrup " import os import dbus import gio from kupfer.objects import Action, Source from kupfer.objects import InvalidDataError, NotAvailableError, NoMultiError from kupfer.objects import FileLeaf, RunnableLeaf, AppLeaf from kupfer.obj.apps import AppLeafContentMixin from kupfer import config from kupfer import plugin_support from kupfer import pretty plugin_support.check_dbus_connection() SERVICE_NAME = "org.xfce.Thunar" OBJECT_PATH = "/org/xfce/FileManager" IFACE_NAME = "org.xfce.FileManager" TRASH_IFACE_NAME = "org.xfce.Trash" def _get_thunar(): """Return the dbus proxy object for Thunar we will activate it over d-bus (start if not running) """ bus = dbus.SessionBus() try: proxy_obj = bus.get_object(SERVICE_NAME, OBJECT_PATH) except dbus.DBusException, e: pretty.print_error(__name__, e) return iface_obj = dbus.Interface(proxy_obj, IFACE_NAME) return iface_obj def _get_thunar_trash(): """Return the dbus proxy object for Thunar we will activate it over d-bus (start if not running) """ bus = dbus.SessionBus() try: proxy_obj = bus.get_object(SERVICE_NAME, OBJECT_PATH) except dbus.DBusException, e: pretty.print_error(__name__, e) return iface_obj = dbus.Interface(proxy_obj, TRASH_IFACE_NAME) return iface_obj def _dummy(*args): pass class Reveal (Action): def __init__(self): Action.__init__(self, _("Select in File Manager")) def wants_context(self): return True def activate(self, leaf, ctx): gfile = gio.File(leaf.object) parent = gfile.get_parent() if not parent: return uri = parent.get_uri() bname = gfile.get_basename() id_ = ctx.environment.get_startup_notification_id() display = ctx.environment.get_display() try: # Thunar 1.2 Uses $DISPLAY and $STARTUP_ID args _get_thunar().DisplayFolderAndSelect(uri, bname, display, id_, reply_handler=_dummy, error_handler=_dummy) except TypeError: # Thunar 1.0 Uses $DISPLAY _get_thunar().DisplayFolderAndSelect(uri, bname, display, reply_handler=_dummy, error_handler=_dummy) def item_types(self): yield FileLeaf class GetInfo (Action): def __init__(self): Action.__init__(self, _("Show Properties")) def wants_context(self): return True def activate(self, leaf, ctx): gfile = gio.File(leaf.object) uri = gfile.get_uri() id_ = ctx.environment.get_startup_notification_id() display = ctx.environment.get_display() try: # Thunar 1.2 Uses $DISPLAY and $STARTUP_ID args _get_thunar().DisplayFileProperties(uri, display, id_, reply_handler=_dummy, error_handler=_dummy) except TypeError: # Thunar 1.0 Uses $DISPLAY _get_thunar().DisplayFileProperties(uri, display, reply_handler=_dummy, error_handler=_dummy) def item_types(self): yield FileLeaf def get_description(self): return _("Show information about file in file manager") def get_icon_name(self): return "dialog-information" class SendTo (Action): """ Send files to selected app from "send to" list """ def __init__(self): Action.__init__(self, _("Send To...")) def activate_multiple(self, leaves, iobjs): for app in iobjs: app.launch(paths=[leaf.object for leaf in leaves]) def activate(self, leaf, iobj): self.activate_multiple((leaf, ), (iobj, )) def item_types(self): yield FileLeaf def requires_object(self): return True def object_types(self): yield AppLeaf def object_source(self, for_item=None): return _SendToAppsSource() def _good_destination(dpath, spath): """If directory path @dpath is a valid destination for file @spath to be copied or moved to. """ if not os.path.isdir(dpath): return False spath = os.path.normpath(spath) dpath = os.path.normpath(dpath) cpfx = os.path.commonprefix((spath, dpath)) if os.path.samefile(dpath, spath) or cpfx == spath: return False return True def path_to_uri(filepath): return gio.File(filepath).get_uri() class CopyTo (Action, pretty.OutputMixin): def __init__(self): Action.__init__(self, _("Copy To...")) def wants_context(self): return True def activate_multiple(self, leaves, iobjects, ctx): # Unroll by looping over the destinations, # copying everything into each destination thunar = _get_thunar() work_dir = os.path.expanduser("~/") display = ctx.environment.get_display() notify_id = ctx.environment.get_startup_notification_id() sourcefiles = [path_to_uri(L.object) for L in leaves] def _reply(*args): self.output_debug("reply got for copying", *args) def _reply_error(exc): self.output_debug(exc) ctx.register_late_error(NotAvailableError(_("Thunar"))) for dest_iobj in iobjects: desturi = path_to_uri(dest_iobj.object) thunar.CopyInto(work_dir, sourcefiles, desturi, display, notify_id, reply_handler=_reply, error_handler=_reply_error) def activate(self, leaf, iobj, ctx): return self.activate_multiple([leaf], [iobj], ctx) def item_types(self): yield FileLeaf def valid_for_item(self, item): return True def requires_object(self): return True def object_types(self): yield FileLeaf def valid_object(self, obj, for_item): return _good_destination(obj.object, for_item.object) def get_description(self): return _("Copy file to a chosen location") class MoveTo (Action, pretty.OutputMixin): def __init__(self): Action.__init__(self, _("Move To...")) def wants_context(self): return True def activate_multiple(self, leaves, iobjects, ctx): if len(iobjects) != 1: raise NoMultiError() def _reply(): self.output_debug("reply got for moving") def _reply_error(exc): self.output_debug(exc) ctx.register_late_error(NotAvailableError(_("Thunar"))) (dest_iobj,) = iobjects # Move everything into the destination thunar = _get_thunar() work_dir = os.path.expanduser("~/") display = ctx.environment.get_display() notify_id = ctx.environment.get_startup_notification_id() sourcefiles = [path_to_uri(L.object) for L in leaves] desturi = path_to_uri(dest_iobj.object) thunar.MoveInto(work_dir, sourcefiles, desturi, display, notify_id, reply_handler=_reply, error_handler=_reply_error) def activate(self, leaf, iobj, ctx): return self.activate_multiple([leaf], [iobj], ctx) def item_types(self): yield FileLeaf def valid_for_item(self, item): return True def requires_object(self): return True def object_types(self): yield FileLeaf def valid_object(self, obj, for_item): return _good_destination(obj.object, for_item.object) def get_description(self): return _("Move file to new location") def get_icon_name(self): return "go-next" class LinkTo (Action, pretty.OutputMixin): def __init__(self): Action.__init__(self, _("Symlink In...")) def wants_context(self): return True def activate_multiple(self, leaves, iobjects, ctx): # Unroll by looping over the destinations, # copying everything into each destination thunar = _get_thunar() work_dir = os.path.expanduser("~/") display = ctx.environment.get_display() notify_id = ctx.environment.get_startup_notification_id() sourcefiles = [path_to_uri(L.object) for L in leaves] def _reply(*args): self.output_debug("reply got for copying", *args) def _reply_error(exc): self.output_debug(exc) ctx.register_late_error(NotAvailableError(_("Thunar"))) for dest_iobj in iobjects: desturi = path_to_uri(dest_iobj.object) thunar.LinkInto(work_dir, sourcefiles, desturi, display, notify_id, reply_handler=_reply, error_handler=_reply_error) def activate(self, leaf, iobj, ctx): return self.activate_multiple([leaf], [iobj], ctx) def item_types(self): yield FileLeaf def valid_for_item(self, item): return True def requires_object(self): return True def object_types(self): yield FileLeaf def valid_object(self, obj, for_item): return _good_destination(obj.object, for_item.object) def get_description(self): return _("Create a symlink to file in a chosen location") class EmptyTrash (RunnableLeaf): def __init__(self): RunnableLeaf.__init__(self, None, _("Empty Trash")) def wants_context(self): return True def run(self, ctx): id_ = ctx.environment.get_startup_notification_id() thunar = _get_thunar_trash() try: # Thunar 1.2 Uses $DISPLAY and $STARTUP_ID args thunar.EmptyTrash(ctx.environment.get_display(), id_, reply_handler=_dummy, error_handler=_dummy) except TypeError: # Thunar 1.0 uses only $DISPLAY arg thunar.EmptyTrash(ctx.environment.get_display(), reply_handler=_dummy, error_handler=_dummy) def get_description(self): return None def get_icon_name(self): return "user-trash-full" class ThunarObjects (AppLeafContentMixin, Source): appleaf_content_id = "Thunar" def __init__(self): Source.__init__(self, _("Thunar")) def get_items(self): yield EmptyTrash() def provides(self): yield RunnableLeaf def get_icon_name(self): return "Thunar" class _SendToAppsSource (Source): """ Send To items source """ def __init__(self): Source.__init__(self, _("Thunar Send To Objects")) def get_items(self): for data_dir in config.get_data_dirs("sendto", package="Thunar"): for filename in os.listdir(data_dir): if not filename.endswith('.desktop'): continue file_path = os.path.join(data_dir, filename) if not os.path.isfile(file_path): continue try: yield AppLeaf(init_path=file_path, require_x=False) except InvalidDataError: pass def get_icon_name(self): return "Thunar" def provides(self): yield AppLeaf kupfer-v208/kupfer/plugin/thunderbird.py000066400000000000000000000056731176220042200205340ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement __kupfer_name__ = _("Thunderbird") __kupfer_sources__ = ("ContactsSource", ) __kupfer_actions__ = ("NewMailAction", ) __description__ = _("Thunderbird/Icedove Contacts and Actions") __version__ = "2012-03-15" __author__ = "Karol Będkowski " from kupfer.objects import Action from kupfer.objects import TextLeaf, UrlLeaf, RunnableLeaf from kupfer.obj.apps import AppLeafContentMixin from kupfer.obj.helplib import FilesystemWatchMixin from kupfer import utils, icons from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj.contacts import ContactLeaf, EmailContact, email_from_leaf from kupfer.plugin import thunderbird_support as support """ Changes: 2012-03-15: Karol Będkowski + activate_multiple for new mail action """ class ComposeMail(RunnableLeaf): ''' Create new mail without recipient ''' def __init__(self): RunnableLeaf.__init__(self, name=_("Compose New Email")) def run(self): if not utils.spawn_async(['thunderbird', '--compose']): utils.spawn_async(['icedove', '--compose']) def get_description(self): return _("Compose a new message in Thunderbird") def get_icon_name(self): return "mail-message-new" class NewMailAction(Action): ''' Createn new mail to selected leaf (Contact or TextLeaf)''' def __init__(self): Action.__init__(self, _('Compose Email')) def activate(self, leaf): self.activate_multiple((leaf, )) def activate_multiple(self, objects): recipients = ",".join(email_from_leaf(L) for L in objects) if not utils.spawn_async(['thunderbird', 'mailto:%s' % recipients]): utils.spawn_async(['icedove', 'mailto:%s' % recipients]) def get_icon_name(self): return "mail-message-new" def item_types(self): yield ContactLeaf # we can enter email yield TextLeaf yield UrlLeaf def valid_for_item(self, item): return bool(email_from_leaf(item)) class ContactsSource(AppLeafContentMixin, ToplevelGroupingSource, FilesystemWatchMixin): appleaf_content_id = ('thunderbird', 'icedove') def __init__(self, name=_("Thunderbird Address Book")): ToplevelGroupingSource.__init__(self, name, "Contacts") self._version = 2 def initialize(self): ToplevelGroupingSource.initialize(self) abook_dirs = list(support.get_addressbook_dirs()) if abook_dirs: self.monitor_token = self.monitor_directories(*abook_dirs) def monitor_include_file(self, gfile): print gfile.get_basename() return gfile and (gfile.get_basename().endswith('.mab') \ or gfile.get_basename() == 'localstore.rdf') def get_items(self): for name, email in support.get_contacts(): yield EmailContact(email, name) yield ComposeMail() def should_sort_lexically(self): return True def get_description(self): return _("Contacts from Thunderbird Address Book") def get_gicon(self): return icons.get_gicon_with_fallbacks(None, ("thunderbird", "icedove")) def provides(self): yield ContactLeaf yield RunnableLeaf kupfer-v208/kupfer/plugin/thunderbird_support.py000066400000000000000000000164271176220042200223270ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import with_statement import os import re from ConfigParser import RawConfigParser from kupfer import pretty __version__ = "2011-04-10" __author__ = "Karol Będkowski " ''' Module provide function to read Thunderbird's address book. Concept for mork parser from: - demork.py by Kumaran Santhanam - mork.cs from GnomeDo by Pierre Östlund ''' THUNDERBIRD_HOME = map(os.path.expanduser, ('~/.mozilla-thunderbird/', '~/.thunderbird', '~/.icedove/')) THUNDERBIRD_PROFILES = [(thome, os.path.join(thome, 'profiles.ini')) for thome in THUNDERBIRD_HOME] RE_COLS = re.compile(r'<\s*<\(a=c\)>\s*(\/\/)?\s*(\(.+?\))\s*>') RE_CELL = re.compile(r'\((.+?)\)') RE_ATOM = re.compile(r'<\s*(\(.+?\))\s*>') RE_TABLE = re.compile( r'\{-?(\d+):\^(..)\s*\{\(k\^(..):c\)\(s=9u?\)\s*(.*?)\}\s*(.+?)\}') RE_ROW = re.compile(r'(-?)\s*\[(.+?)((\(.+?\)\s*)*)\]') RE_CELL_TEXT = re.compile(r'\^(.+?)=(.*)') RE_CELL_OID = re.compile(r'\^(.+?)\^(.+)') RE_TRAN_BEGIN = re.compile(r'@\$\$\{.+?\{\@') RE_TRAN_END = re.compile(r'@\$\$\}.+?\}\@') COLS_TO_KEEP = ( 'DisplayName', 'FirstName', 'LastName', 'PrimaryEmail', 'SecondEmail', ) SPECIAL_CHARS = ( ('\\\\', '\\'), ('\\$', '$'), ('\\t', chr(9)), ('\\n', chr(10)), ) RE_ESCAPED = re.compile(r'(\$[a-f0-9]{2})', re.IGNORECASE) RE_HEADER = re.compile(r'// ') class _Table(object): def __init__(self, tableid): self.tableid = tableid self.rows = {} def __repr__(self): return 'Table %r: %r' % (self.tableid, self.rows) def add_cell(self, rowid, col, atom): if ':' in rowid: rowid = rowid.split(':')[0] row = self.rows.get(rowid) if not row: row = self.rows[rowid] = dict() row[col] = _unescape_data(atom) def del_row(self, rowid): if ':' in rowid: rowid = rowid.split(':')[0] if rowid in self.rows: del self.rows[rowid] def _unescape_character(match): value = match.group() try: return chr(int(value[1:], 16)) except ValueError: return value def _unescape_data(instr): for src, dst in SPECIAL_CHARS: instr = instr.replace(src, dst) return RE_ESCAPED.sub(_unescape_character, instr) def _read_mork(filename): ''' Read mork file, return tables from file ''' data = [] with open(filename, 'rt') as mfile: header = mfile.readline().strip() # check header if not RE_HEADER.match(header): pretty.print_debug(__name__, '_read_mork: header error', header) return {} for line in mfile.readlines(): # remove blank lines and comments line = line.strip() if not line: continue # remove comments comments = line.find('// ') if comments > -1: line = line[:comments].strip() if line: data.append(line) data = ''.join(data) if not data: return {} data = data.replace('\\)', '$29') # decode data cells = {} atoms = {} tables = {} pos = 0 active_trans = False while data: data = data[pos:].lstrip() if not data: break # cols match = RE_COLS.match(data) if match: for cell in RE_CELL.findall(match.group()): key, val = cell.split('=', 1) if val in COLS_TO_KEEP: # skip necessary columns cells[key] = val pos = match.span()[1] continue # atoms match = RE_ATOM.match(data) if match: for cell in RE_CELL.findall(match.group()): if '=' in cell: key, val = cell.split('=', 1) atoms[key] = val pos = match.span()[1] continue # tables match = RE_TABLE.match(data) if match: tableid = ':'.join(match.groups()[0:2]) table = tables.get(tableid) if not table: table = tables[tableid] = _Table(tableid) for row in RE_ROW.findall(match.group()): tran, rowid = row[:2] if active_trans and rowid[0] == '-': rowid = rowid[1:] table.del_row(rowid) if not active_trans or tran != '-': rowdata = row[2:] for rowcell in rowdata: if not rowcell: continue for cell in RE_CELL.findall(rowcell): atom, col = None, None cmatch = RE_CELL_TEXT.match(cell) if cmatch: col = cells.get(cmatch.group(1)) atom = cmatch.group(2) else: cmatch = RE_CELL_OID.match(cell) if cmatch: col = cells.get(cmatch.group(1)) atom = atoms.get(cmatch.group(2)) if col and atom: table.add_cell(rowid, col, atom) pos = match.span()[1] continue # transaction match = RE_TRAN_BEGIN.match(data) if match: active_trans = True continue match = RE_TRAN_END.match(data) if match: tran = True continue # dangling rows match = RE_ROW.match(data) if match: row = match.groups() tran, rowid = row[:2] table = tables.get('1:80') # bind to default table if rowid[0] == '-': rowid = rowid[1:] if table: table.del_row(rowid) if tran != '-': rowdata = row[2:] if rowdata: if not table: table = tables['1:80'] = _Table('1:80') for rowcell in rowdata: if not rowcell: continue for cell in RE_CELL.findall(str(rowcell)): atom, col = None, None cmatch = RE_CELL_TEXT.match(cell) if cmatch: col = cells.get(cmatch.group(1)) atom = cmatch.group(2) else: cmatch = RE_CELL_OID.match(cell) if cmatch: col = cells.get(cmatch.group(1)) atom = atoms.get(cmatch.group(2)) if col and atom: table.add_cell(rowid, col, atom) pos = match.span()[1] continue pos = 1 return tables def _mork2contacts(tables): ''' Get contacts from mork table prepared by _read_mork ''' if not tables: return # get only default table table = tables.get('1:80') if table: for row in table.rows.itervalues(): display_name = row.get('DisplayName') if not display_name: first_name = row.get('FirstName', '') last_name = row.get('LastName', '') display_name = ' '.join((first_name, last_name)) if display_name: display_name = display_name.strip() for key in ('PrimaryEmail', 'SecondEmail'): email = row.get(key) if email: yield (display_name or email[:email.find('@')], email) def get_addressbook_dirs(): ''' Get path to addressbook file from default profile. ''' for thome, tprofile in THUNDERBIRD_PROFILES: if os.path.isfile(tprofile): config = RawConfigParser() config.read(tprofile) for section in config.sections(): if config.has_option(section, "Path"): path = config.get(section, "Path") if not os.path.isabs(path): path = os.path.join(thome, path) if os.path.isdir(path): yield path def get_addressbook_files(): ''' Get full path to all Thunderbird address book files. ''' for path in get_addressbook_dirs(): pretty.print_debug(__name__, 'get_addressbook_files dir:', path) files = os.listdir(path) for filename in files: if filename.endswith('.mab'): fullpath = os.path.join(path, filename) if os.path.isfile(fullpath): yield fullpath def get_contacts(): ''' Get all contacts from all Thunderbird address books as ((contact name, contact email)) ''' for abook in get_addressbook_files(): pretty.print_debug(__name__, 'get_contacts:', abook) try: tables = _read_mork(abook) except IOError, err: pretty.print_error(__name__, 'get_contacts error', abook, err) else: for item in _mork2contacts(tables): yield item if __name__ == '__main__': print '\n'.join(map(str, sorted(get_contacts()))) kupfer-v208/kupfer/plugin/top.py000066400000000000000000000106541176220042200170170ustar00rootroot00000000000000# -*- coding: UTF-8 -*- from __future__ import with_statement __kupfer_name__ = _("Top") __kupfer_sources__ = ("TaskSource", ) __description__ = _("Show running tasks and allow sending signals to them") __version__ = "2009-11-24" __author__ = "Karol Będkowski " import os import signal import operator from kupfer.objects import Action, Source, Leaf from kupfer.obj.helplib import PicklingHelperMixin from kupfer import scheduler from kupfer import plugin_support from kupfer import utils __kupfer_settings__ = plugin_support.PluginSettings( { "key" : "sort_order", "label": _("Sort Order"), "type": str, "value": _("Commandline"), "alternatives": [_("Commandline"), _("CPU usage (descending)"), _("Memory usage (descending)") ] }, ) class Task(Leaf): def __init__(self, path, name, description=None): Leaf.__init__(self, path, name) self._description = description def get_description(self): return self._description def get_actions(self): yield SendSignal() def get_icon_name(self): return 'applications-system' class SendSignal(Action): def __init__(self): Action.__init__(self, _("Send Signal...")) def activate(self, leaf, iobj): os.kill(leaf.object, iobj.object) def requires_object(self): return True def object_types(self): yield _Signal def object_source(self, for_item=None): return _SignalsSource() class _Signal(Leaf): def get_description(self): return "kill -%s ..." % self.object # get all signals from signal package _SIGNALS = [ _Signal(getattr(signal, signame), signame[3:]) for signame in sorted(dir(signal)) if signame.startswith('SIG') and not signame.startswith('SIG_') ] class _SignalsSource(Source): def __init__(self): Source.__init__(self, _("Signals")) def get_items(self): return _SIGNALS def provides(self): yield _Signal class TaskSource(Source, PicklingHelperMixin): task_update_interval_sec = 5 def __init__(self, name=_("Running Tasks")): Source.__init__(self, name) self._cache = [] self._version = 2 def pickle_prepare(self): # clear saved processes self.mark_for_update() def initialize(self): self._timer = scheduler.Timer() def finalize(self): self._timer = None self._cache = [] def _async_top_finished(self, acommand, stdout, stderr): self._cache = [] processes = parse_top_output(stdout) # sort processes (top don't allow to sort via cmd line) if __kupfer_settings__['sort_order'] == _("Memory usage (descending)"): processes = sorted(processes, key=operator.itemgetter(2), reverse=True) elif __kupfer_settings__['sort_order'] == _("Commandline"): processes = sorted(processes, key=operator.itemgetter(4)) # default: by cpu fields = _("pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s") for pid, cpu, mem, ptime, cmd in processes: description = fields % dict(pid=pid, cpu=cpu, mem=mem, time=ptime) self._cache.append(Task(pid, cmd, description)) self.mark_for_update() def _async_top_start(self): uid = os.getuid() utils.AsyncCommand(["top", "-b", "-n", "1", "-u", "%d" % uid], self._async_top_finished, 60) def get_items(self): for task in self._cache: yield task update_wait = self.task_update_interval_sec if self._cache else 0 # update after a few seconds self._timer.set(update_wait, self._async_top_start) def get_description(self): return _("Running tasks for current user") def get_icon_name(self): return "system" def provides(self): yield Task def parse_top_output(out): """ Yield tuples of (pid, cpu, mem, ptime, cmd) """ fields_map = None fields_count = 0 header_read = False for line in out.split('\n'): line = line.strip() if line == '': header_read = True continue if not header_read: continue if line.startswith('PID'): # assume pid is first col fields_map = dict(((name, pos) for pos, name in enumerate(line.split()))) fields_count = len(fields_map) continue # skip header line_fields = line.split(None, fields_count-1) pid = line_fields[0] cpu = line_fields[fields_map['%CPU']] mem = line_fields[fields_map['%MEM']] ptime = line_fields[fields_map['TIME+']] cmd = line_fields[-1] # read command line proc_file = '/proc/%s/cmdline' % pid if os.path.isfile(proc_file): # also skip (finished) missing tasks with open(proc_file, 'rt') as f: cmd = f.readline().replace('\x00', ' ') or cmd yield (int(pid), float(cpu), float(mem), ptime, cmd) kupfer-v208/kupfer/plugin/tracker.py000066400000000000000000000165301176220042200176470ustar00rootroot00000000000000""" Tracker plugins are versioned by the D-Bus API version This is version works with the "original" tracker 0.6.x dbus API. """ __kupfer_name__ = _("Tracker 0.6") __kupfer_sources__ = ("TrackerTagsSource", ) __kupfer_text_sources__ = () __kupfer_contents__ = ("TrackerQuerySource", ) __kupfer_actions__ = ( "TrackerSearch", "TrackerSearchHere", "TrackerAddTag", "TrackerRemoveTag", ) __description__ = _("Tracker desktop search integration") __version__ = "2010-01-03" __author__ = "Ulrik Sverdrup " import os from xml.etree.cElementTree import ElementTree import gobject from kupfer.objects import Action, Source, Leaf from kupfer.objects import TextLeaf, SourceLeaf, FileLeaf from kupfer.obj.objects import ConstructFileLeaf from kupfer import utils, pretty from kupfer import kupferstring from kupfer import plugin_support plugin_support.check_dbus_connection() SERVICE_NAME = "org.freedesktop.Tracker" SEARCH_OBJECT_PATH = "/org/freedesktop/Tracker/Search" SEARCH_INTERFACE = "org.freedesktop.Tracker.Search" class TrackerSearch (Action): def __init__(self): Action.__init__(self, _("Search in Tracker")) def activate(self, leaf): utils.spawn_async(["tracker-search-tool", leaf.object]) def get_description(self): return _("Open Tracker Search Tool and search for this term") def get_icon_name(self): return "system-search" def item_types(self): yield TextLeaf class TrackerSearchHere (Action): def __init__(self): Action.__init__(self, _("Get Tracker Results...")) def is_factory(self): return True def activate(self, leaf): return TrackerQuerySource(leaf.object) def get_description(self): return _("Show Tracker results for query") def get_icon_name(self): return "tracker" def item_types(self): yield TextLeaf class TrackerQuerySource (Source): def __init__(self, query): Source.__init__(self, name=_('Results for "%s"') % query) self.query = query self.max_items = 50 def repr_key(self): return self.query def get_items(self): try: import dbus except ImportError: pretty.print_info(__name__, "Dbus not available!") return bus = dbus.SessionBus() try: tobj = bus.get_object(SERVICE_NAME, SEARCH_OBJECT_PATH) searchobj = dbus.Interface(tobj, SEARCH_INTERFACE) except dbus.DBusException, exc: pretty.print_error(__name__, exc) pretty.print_error(__name__, "Could not connect to Tracker") return # Text interface # (i) live_query_id, (s) service, (s) search_text, # (i) offset, (i) max_hits # Returns array of strings for results try: file_hits = searchobj.Text(1, "Files", self.query, 0, self.max_items) except dbus.DBusException, exc: pretty.print_error(__name__, exc) return for filestr in file_hits: # A bit of encoding carousel # dbus strings are subclasses of unicode # but FileLeaf expects a filesystem encoded object bytes = filestr.decode("UTF-8", "replace") filename = gobject.filename_from_utf8(bytes) yield ConstructFileLeaf(filename) def get_description(self): return _('Results for "%s"') % self.query def get_icon_name(self): return "tracker" @classmethod def decorates_type(cls): return FileLeaf @classmethod def decorate_item(cls, leaf): # FIXME: Very simplified .savedSearch parsing, so far we only support # the query, without additional filtering. The simplest form of # .savedSearch file is saved by nautilus as following: # # QUERY GOES HERE # if not leaf.object.endswith(".savedSearch"): return None try: et = ElementTree(file=leaf.object) query = et.getroot().find("text").text return cls(query) except Exception: return None # FIXME: Use dbus for this communication def cmd_output_lines(cmd): return kupferstring.fromlocale(os.popen(cmd).read()).splitlines() def get_tracker_tags(for_file=None): if not for_file: for tagline in cmd_output_lines("tracker-tag --list")[1:]: tag, count = tagline.rsplit(",", 1) tag = tag.strip() yield tag else: output = cmd_output_lines("tracker-tag --list '%s'" % for_file) for tagline in output[1:]: fil, tagstr = tagline.rsplit(": ", 1) tags = tagstr.strip().split("|") for t in filter(None, tags): yield t def get_tracker_tag_items(tag): output = cmd_output_lines("tracker-tag -s '%s'" % tag) for tagline in output[1:]: yield tagline.strip() class TrackerFileTagsSource (Source): """Tracker tags for a specific file""" def __init__(self, fil=None): """ All tags for file @fil or all tags known if None""" Source.__init__(self, _("Tracker tags")) self.for_file = fil def get_items(self): for tag in get_tracker_tags(self.for_file): yield TrackerTag(tag) def get_description(self): return _("Tracker tags") def get_icon_name(self): return "tracker" def provides(self): yield TrackerTag class TrackerTagsSource (Source): """Browse items tagged in Tracker""" def __init__(self): Source.__init__(self, _("Tracker Tags")) def get_items(self): for tag in get_tracker_tags(): src = TrackerTagObjectsSource(tag) yield SourceLeaf(src) def get_description(self): return _("Browse Tracker's tags") def get_icon_name(self): return "tracker" def provides(self): yield TrackerTag class TrackerTag (Leaf): """ Represents a tag without actions """ def __init__(self, tag): Leaf.__init__(self, tag, tag) def get_description(self): return _("Tag %s") % self.object def get_icon_name(self): return "user-bookmarks" class TrackerTagObjectsSource (Source): """This source shows all items of one tracker tag""" def __init__(self, tag): Source.__init__(self, _("Tag %s") % tag) self.tag = tag def is_dynamic(self): return True def get_items(self): return (ConstructFileLeaf(f) for f in get_tracker_tag_items(self.tag)) def get_description(self): return _("Objects tagged %s with Tracker") % self.tag def get_icon_name(self): return "user-bookmarks" class TrackerAddTag (Action): """ Add tracker tags. FIXME: Only tracker-indexed directories can be tagged I don't know how to check that effectively. So we allow everything here """ def __init__(self): Action.__init__(self, _("Add Tag...")) def activate(self, leaf, obj): lpath = leaf.object tag = obj.object utils.spawn_async(["tracker-tag", "--add=%s" % tag, lpath]) def requires_object(self): return True def item_types(self): yield FileLeaf def object_types(self): yield TextLeaf yield TrackerTag def object_source(self, for_item=None): # FIXME: We list all tags. We don't want to list tags it already has return TrackerFileTagsSource() def valid_object(self, obj, for_item): if isinstance(obj, TextLeaf): # FIXME: Do tag syntax checking here return (u" " not in obj.object) return True def get_description(self): return _("Add tracker tag to file") def get_icon_name(self): return "list-add" class TrackerRemoveTag (Action): def __init__(self): Action.__init__(self, _("Remove Tag...")) def activate(self, leaf, obj): lpath = leaf.object tag = obj.object utils.spawn_async(["tracker-tag", "--remove=%s" % tag, lpath]) def requires_object(self): return True def item_types(self): yield FileLeaf def object_types(self): yield TrackerTag def object_source(self, for_item): path = for_item.object return TrackerFileTagsSource(path) def get_description(self): return _("Remove tracker tag from file") def get_icon_name(self): return "list-remove" kupfer-v208/kupfer/plugin/tracker1.py000066400000000000000000000133461176220042200177320ustar00rootroot00000000000000""" Tracker plugins are versioned by the D-Bus API version This is version works with tracker 0.8.x and 0.10.x, where the API is called Tracker1 Tracker 0.10 has exactly the same Resources.SparqlQuery API, but according to its developers it does not have the same class signal api but that does not impact this plugin. """ __kupfer_name__ = _("Tracker") __kupfer_sources__ = () __kupfer_text_sources__ = () __kupfer_contents__ = ("TrackerQuerySource", ) __kupfer_actions__ = ( "TrackerSearch", "TrackerSearchHere", ) __description__ = _("Tracker desktop search integration") __version__ = "2010-04-01" __author__ = "Ulrik Sverdrup " from xml.etree.cElementTree import ElementTree import dbus import gio import gobject from kupfer.objects import Action, Source from kupfer.objects import TextLeaf, FileLeaf from kupfer.obj.objects import ConstructFileLeaf from kupfer import utils, pretty from kupfer import kupferstring from kupfer import plugin_support plugin_support.check_dbus_connection() SERVICE_NAME = "org.freedesktop.Tracker" SEARCH_OBJECT_PATH = "/org/freedesktop/Tracker/Search" SEARCH_INTERFACE = "org.freedesktop.Tracker.Search" SERVICE1_NAME = "org.freedesktop.Tracker1" SEARCH_OBJECT1_PATH = "/org/freedesktop/Tracker1/Resources" SEARCH1_INTERFACE = "org.freedesktop.Tracker1.Resources" class TrackerSearch (Action): def __init__(self): Action.__init__(self, _("Search in Tracker")) def activate(self, leaf): utils.spawn_async(["tracker-search-tool", leaf.object]) def get_description(self): return _("Open Tracker Search Tool and search for this term") def get_icon_name(self): return "system-search" def item_types(self): yield TextLeaf class TrackerSearchHere (Action): def __init__(self): Action.__init__(self, _("Get Tracker Results...")) def is_factory(self): return True def activate(self, leaf): return TrackerQuerySource(leaf.object) def get_description(self): return _("Show Tracker results for query") def get_icon_name(self): return "tracker" def item_types(self): yield TextLeaf def sparql_escape(ustr): """Escape unicode string @ustr for insertion into a SPARQL query Implemented to behave like tracker_sparql_escape in libtracker-client """ sparql_escape_table = { ord(u'\t'): ur'\t', ord(u'\n'): ur'\n', ord(u'\r'): ur'\r', ord(u'\b'): ur'\b', ord(u'\f'): ur'\f', ord(u'"') : ur'\"', ord(u'\\'): u'\\\\', } return ustr.translate(sparql_escape_table) def get_file_results_sparql(searchobj, query, max_items): clean_query = sparql_escape(query) sql = u"""SELECT tracker:coalesce (nie:url (?s), ?s) WHERE { ?s fts:match "%s*" . ?s tracker:available true . } ORDER BY tracker:weight(?s) OFFSET 0 LIMIT %d""" % (clean_query, int(max_items)) pretty.print_debug(__name__, "Searching for %s (%s)", repr(clean_query), repr(query)) pretty.print_debug(__name__, sql) results = searchobj.SparqlQuery(sql) gio_File = gio.File for result in results: yield FileLeaf(gio_File(result[0]).get_path()) def get_file_results_old(searchobj, query, max_items): try: file_hits = searchobj.Text(1, "Files", query, 0, max_items) except dbus.DBusException, exc: pretty.print_error(__name__, exc) return for filestr in file_hits: # A bit of encoding carousel # dbus strings are subclasses of unicode # but FileLeaf expects a filesystem encoded object bytes = filestr.decode("UTF-8", "replace") filename = gobject.filename_from_utf8(bytes) yield ConstructFileLeaf(filename) use_version = None versions = { "0.8": (SERVICE1_NAME, SEARCH_OBJECT1_PATH, SEARCH1_INTERFACE), "0.6": (SERVICE_NAME, SEARCH_OBJECT_PATH, SEARCH_INTERFACE), } version_query = { "0.8": get_file_results_sparql, "0.6": get_file_results_old, } def get_searchobject(sname, opath, sinface): bus = dbus.SessionBus() searchobj = None try: tobj = bus.get_object(sname, opath) searchobj = dbus.Interface(tobj, sinface) except dbus.DBusException, exc: pretty.print_debug(__name__, exc) return searchobj def get_tracker_filequery(query, max_items): searchobj = None global use_version if use_version is None: for version, (sname, opath, sinface) in versions.items(): pretty.print_debug(__name__, "Trying", sname, version) searchobj = get_searchobject(sname, opath, sinface) if searchobj is not None: use_version = version break else: searchobj = get_searchobject(*versions[use_version]) if searchobj is None: use_version = None pretty.print_error(__name__, "Could not connect to Tracker") return () queryfunc = version_query[use_version] return queryfunc(searchobj, query, max_items) class TrackerQuerySource (Source): def __init__(self, query): Source.__init__(self, name=_('Results for "%s"') % query) self.query = query self.max_items = 50 def repr_key(self): return self.query def get_items(self): return get_tracker_filequery(self.query, self.max_items) def get_description(self): return _('Results for "%s"') % self.query def get_icon_name(self): return "tracker" @classmethod def decorates_type(cls): return FileLeaf @classmethod def decorate_item(cls, leaf): # FIXME: Very simplified .savedSearch parsing, so far we only support # the query, without additional filtering. The simplest form of # .savedSearch file is saved by nautilus as following: # # QUERY GOES HERE # if not leaf.object.endswith(".savedSearch"): return None try: et = ElementTree(file=leaf.object) query = et.getroot().find("text").text us_query = kupferstring.tounicode(query) return cls(us_query) except Exception: return None # FIXME: Port tracker tag sources and actions # to the new, much more powerful sparql + dbus API # (using tracker-tag as in 0.6 is a plain hack and a dead end) kupfer-v208/kupfer/plugin/trash.py000066400000000000000000000123011176220042200173250ustar00rootroot00000000000000__kupfer_name__ = _("Trash") __kupfer_actions__ = ("MoveToTrash", ) __kupfer_sources__ = ("TrashSource", ) __description__ = _("Access trash contents") __version__ = "2009-12-06" __author__ = "Ulrik Sverdrup " import gio from kupfer.objects import Leaf, Action, Source, SourceLeaf, FileLeaf from kupfer.objects import OperationError from kupfer.obj.fileactions import Open from kupfer import utils, icons, pretty TRASH_URI = 'trash://' class MoveToTrash (Action): # this should never be default rank_adjust = -10 def __init__(self): Action.__init__(self, _("Move to Trash")) def activate(self, leaf): gfile = gio.File(leaf.object) try: gfile.trash() except gio.Error as exc: raise OperationError(exc) def valid_for_item(self, item): gfile = gio.File(item.object) if not gfile.query_exists(None): return False info = gfile.query_info(gio.FILE_ATTRIBUTE_ACCESS_CAN_TRASH) return info.get_attribute_boolean(gio.FILE_ATTRIBUTE_ACCESS_CAN_TRASH) def get_description(self): return _("Move this file to trash") def get_icon_name(self): return "user-trash-full" def item_types(self): yield FileLeaf class RestoreTrashedFile (Action): def __init__(self): Action.__init__(self, _("Restore")) def has_result(self): return True def activate(self, leaf): orig_path = leaf.get_orig_path() if not orig_path: return orig_gfile = gio.File(orig_path) cur_gfile = leaf.get_gfile() if orig_gfile.query_exists(): raise IOError("Target file exists at %s" % orig_gfile.get_path()) pretty.print_debug(__name__, "Move %s to %s" % (cur_gfile, orig_gfile)) ret = cur_gfile.move(orig_gfile) pretty.print_debug(__name__, "Move ret=%s" % (ret, )) return FileLeaf(orig_gfile.get_path()) def get_description(self): return _("Move file back to original location") def get_icon_name(self): return "edit-undo" class TrashFile (Leaf): """A file in the trash. Represented object is a file info object""" def __init__(self, trash_uri, info): name = info.get_display_name() Leaf.__init__(self, info, name) self._trash_uri = trash_uri def get_actions(self): if self.get_orig_path(): yield RestoreTrashedFile() def get_gfile(self): cur_gfile = gio.File(self._trash_uri).get_child(self.object.get_name()) return cur_gfile def get_orig_path(self): try: orig_path = self.object.get_attribute_byte_string("trash::orig-path") return orig_path except AttributeError: pass return None def is_valid(self): return self.get_gfile().query_exists() def get_description(self): orig_path = self.get_orig_path() return utils.get_display_path_for_bytestring(orig_path) if orig_path \ else None def get_gicon(self): return self.object.get_icon() def get_icon_name(self): return "text-x-generic" class TrashContentSource (Source): def __init__(self, trash_uri, name): Source.__init__(self, name) self._trash_uri = trash_uri def is_dynamic(self): return True def get_items(self): gfile = gio.File(self._trash_uri) enumerator = gfile.enumerate_children("standard::*,trash::*") for info in enumerator: yield TrashFile(self._trash_uri, info) def should_sort_lexically(self): return True def get_gicon(self): return icons.get_gicon_for_file(self._trash_uri) class SpecialLocation (Leaf): """ Base class for Special locations (in GIO/GVFS), such as trash:/// Here we assume they are all "directories" """ def __init__(self, location, name=None, description=None, icon_name=None): """Special location with @location and @name. If unset, we find @name from filesystem @description is Leaf description""" gfile = gio.File(location) info = gfile.query_info(gio.FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME) name = (info.get_attribute_string(gio.FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME) or location) Leaf.__init__(self, location, name) self.description = description self.icon_name = icon_name def get_actions(self): yield Open() def get_description(self): return self.description or self.object def get_gicon(self): # Get icon return icons.get_gicon_for_file(self.object) def get_icon_name(self): return "folder" class Trash (SpecialLocation): def __init__(self, trash_uri, name=None): SpecialLocation.__init__(self, trash_uri, name=name) def has_content(self): return self.get_item_count() def content_source(self, alternate=False): return TrashContentSource(self.object, name=unicode(self)) def get_item_count(self): gfile = gio.File(self.object) info = gfile.query_info(gio.FILE_ATTRIBUTE_TRASH_ITEM_COUNT) return info.get_attribute_uint32(gio.FILE_ATTRIBUTE_TRASH_ITEM_COUNT) def get_description(self): item_count = self.get_item_count() if not item_count: return _("Trash is empty") # proper translation of plural return ngettext("Trash contains one file", "Trash contains %(num)s files", item_count) % {"num": item_count} class InvisibleSourceLeaf (SourceLeaf): """Hack to hide this source""" def is_valid(self): return False class TrashSource (Source): def __init__(self): Source.__init__(self, _("Trash")) def get_items(self): yield Trash(TRASH_URI) def get_leaf_repr(self): return InvisibleSourceLeaf(self) def provides(self): yield SpecialLocation def get_icon_name(self): return "user-trash" kupfer-v208/kupfer/plugin/triggers.py000066400000000000000000000117231176220042200200410ustar00rootroot00000000000000__kupfer_name__ = _("Triggers") __kupfer_sources__ = ("Triggers", ) __kupfer_actions__ = ( "AddTrigger", ) __description__ = _("Assign global keybindings (triggers) to objects created " "with 'Compose Command'.") __version__ = "2009-12-30" __author__ = "Ulrik Sverdrup " import gtk import glib from kupfer.objects import Action, Source from kupfer.objects import TextLeaf, RunnableLeaf from kupfer.objects import OperationError from kupfer.obj.compose import ComposedLeaf from kupfer import puid from kupfer import kupferstring from kupfer import task from kupfer.ui import keybindings from kupfer.ui import uievents from kupfer.ui import getkey_dialog from kupfer.core import commandexec # we import the keybinder module for its side-effects -- # this plugin needs this module, lest it shall not function. import keybinder class Trigger (RunnableLeaf): def get_actions(self): for act in RunnableLeaf.get_actions(self): yield act yield RemoveTrigger() def wants_context(self): return True def is_valid(self): return Triggers.has_trigger(self.object) def run(self, ctx): return Triggers.perform_trigger(ctx, self.object) def repr_key(self): return self.object class Triggers (Source): instance = None def __init__(self): Source.__init__(self, _("Triggers")) self.trigger_table = {} def config_save(self): return {"triggers": self.trigger_table, "version": self.version} def config_save_name(self): return __name__ def config_restore(self, state): self.trigger_table = state["triggers"] return True def initialize(self): Triggers.instance = self keybindings.GetKeyboundObject().connect("keybinding", self.keybinding_callback) for target, (keystr, name, id_) in self.trigger_table.iteritems(): keybindings.bind_key(keystr, target) self.output_debug("Loaded triggers, count:", len(self.trigger_table)) def finalize(self): for target, (keystr, name, id_) in self.trigger_table.iteritems(): keybindings.bind_key(None, target) def keybinding_callback(self, keyobj, target, display, event_time): if not self.has_trigger(target): return ui_ctx = uievents.gui_context_from_keyevent(event_time, display) ctx = commandexec.DefaultActionExecutionContext() exec_token = ctx.make_execution_token(ui_ctx) self.perform_trigger(exec_token, target) def get_items(self): for target, (keystr, name, id_) in self.trigger_table.iteritems(): label = gtk.accelerator_get_label(*gtk.accelerator_parse(keystr)) yield Trigger(target, u"%s (%s)" % (label or keystr, name)) def should_sort_lexically(self): return True def provides(self): yield Trigger @classmethod def has_trigger(cls, target): return target in cls.instance.trigger_table @classmethod def perform_trigger(cls, ctx, target): try: keystr, name, id_ = cls.instance.trigger_table[target] except KeyError: raise OperationError("Trigger '%s' does not exist" % (target, )) obj = puid.resolve_unique_id(id_) if obj is None: return return obj.run(ctx) @classmethod def add_trigger(cls, leaf, keystr): Triggers.instance._add_trigger(leaf, keystr) @classmethod def remove_trigger(cls, target): Triggers.instance._remove_trigger(target) def _add_trigger(self, leaf, keystr): for target in xrange(*keybindings.KEYRANGE_TRIGGERS): if target not in self.trigger_table: break keybindings.bind_key(keystr, target) name = unicode(leaf) self.trigger_table[target] = (keystr, name, puid.get_unique_id(leaf)) self.mark_for_update() def _remove_trigger(self, target): self.trigger_table.pop(target, None) keybindings.bind_key(None, target) self.mark_for_update() def get_icon_name(self): return "key_bindings" def try_bind_key(keystr): label = gtk.accelerator_get_label(*gtk.accelerator_parse(keystr)) ulabel = kupferstring.tounicode(label) if len(ulabel) == 1 and ulabel.isalnum(): return False target = keybindings.KEYRANGE_TRIGGERS[-1] - 1 succ = keybindings.bind_key(keystr, target) if succ: keybindings.bind_key(None, target) return succ class BindTask (task.Task): def __init__(self, leaf, screen): self.leaf = leaf self.screen = screen def start(self, finish_callback): glib.idle_add(self.ask_key, finish_callback) def ask_key(self, finish_callback): keystr = getkey_dialog.ask_for_key(try_bind_key, screen=self.screen) if keystr: Triggers.add_trigger(self.leaf, keystr) finish_callback(self) class AddTrigger (Action): def __init__(self): Action.__init__(self, _("Add Trigger...")) def is_async(self): return True def wants_context(self): return True def activate(self, leaf, ctx): return BindTask(leaf, ctx.environment.get_screen()) def item_types(self): yield ComposedLeaf def get_icon_name(self): return "list-add" class RemoveTrigger (Action): def __init__(self): Action.__init__(self, _("Remove Trigger")) def activate(self, leaf): Triggers.remove_trigger(leaf.object) def get_icon_name(self): return "list-remove" kupfer-v208/kupfer/plugin/truecrypt.py000066400000000000000000000071651176220042200202610ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("TrueCrypt") __kupfer_sources__ = ("VolumeSource", ) __kupfer_actions__ = ('DismountAll', 'MountFile') __description__ = _("Volumes from TrueCrypt history") __version__ = "2009-11-24" __author__ = "Karol Będkowski " import os from xml.etree import cElementTree as ElementTree import gio from kupfer.objects import (Action, Source, Leaf,AppLeaf, FileLeaf) from kupfer.obj.apps import AppLeafContentMixin from kupfer.obj.helplib import PicklingHelperMixin from kupfer import utils _HISTORY_FILE = "~/.TrueCrypt/History.xml" def mount_volume_in_truecrypt(filepath): ''' Mount file in Truecrypt. Escape apostrophes - ie: "test'dk 'dlk' dsl''k '' sdkl.test" -> "'test'\''dk '\''dlk'\'' dsl'\'''\''k '\'''\'' sdkl.test'" ''' # escape ' characters filepath = filepath.replace("'", "'\\''") utils.spawn_async(["truecrypt", filepath]) class Volume(Leaf): def __init__(self, path, name): Leaf.__init__(self, path, name) def get_icon_name(self): return "truecrypt" def get_description(self): dispname = utils.get_display_path_for_bytestring(self.object) return _("TrueCrypt volume: %(file)s") % dict(file=dispname) def get_actions(self): yield MountVolume() class MountVolume(Action): def __init__(self): Action.__init__(self, _("Mount Volume")) def activate(self, leaf): mount_volume_in_truecrypt(leaf.object) class MountFile(Action): ''' Mount selected file in truecrypt. ''' rank_adjust = -10 def __init__(self): Action.__init__(self, _("Mount in Truecrypt")) def activate(self, leaf): mount_volume_in_truecrypt(leaf.object) def item_types(self): yield FileLeaf def get_description(self): return _("Try to mount file as Truecrypt volume") def valid_for_item(self, item): return os.path.isfile(item.object) class DismountAll(Action): def __init__(self): Action.__init__(self, _("Dismount All Volumes")) def activate(self, leaf, iobj=None): utils.spawn_async(['truecrypt', '-d']) def get_icon_name(self): return "hdd_unmount" def item_types(self): yield AppLeaf def valid_for_item(self, leaf): return leaf.get_id() == 'truecrypt' class VolumeSource (AppLeafContentMixin, Source, PicklingHelperMixin): appleaf_content_id = "truecrypt" def __init__(self, name=_("TrueCrypt Volumes")): Source.__init__(self, name) self.unpickle_finish() def pickle_prepare(self): self.monitor = None def unpickle_finish(self): hist_file_path = _get_history_file_path() if not hist_file_path: return gfile = gio.File(hist_file_path) self.monitor = gfile.monitor_file(gio.FILE_MONITOR_NONE, None) if self.monitor: self.monitor.connect("changed", self._on_history_changed) def _on_history_changed(self, monitor, file1, file2, evt_type): if evt_type in (gio.FILE_MONITOR_EVENT_CREATED, gio.FILE_MONITOR_EVENT_DELETED, gio.FILE_MONITOR_EVENT_CHANGED): self.mark_for_update() def get_items(self): hist_file_path = _get_history_file_path() if not hist_file_path: return try: tree = ElementTree.parse(hist_file_path) for volume in tree.find('history').findall('volume'): volume_path = volume.text if volume_path: gfile = gio.File(volume_path) if not gfile.query_exists(): continue yield Volume(gfile.get_path(), gfile.get_basename()) except StandardError, err: self.output_error(err) def get_description(self): return _("Volumes from TrueCrypt history") def get_icon_name(self): return "truecrypt" def provides(self): yield Volume def _get_history_file_path(): path = os.path.expanduser(_HISTORY_FILE) return path if os.path.isfile(path) else None kupfer-v208/kupfer/plugin/tsclient.py000066400000000000000000000062011176220042200200330ustar00rootroot00000000000000# -*- coding: UTF-8 -*- from __future__ import with_statement __kupfer_name__ = _("Terminal Server Client") __kupfer_sources__ = ("TsclientSessionSource", ) __kupfer_actions__ = ("TsclientOpenSession", ) __description__ = _("Session saved in Terminal Server Client") __version__ = "2010-10-01" __author__ = "Karol Będkowski " ''' Changes: 2010-10-01 Freddie Brandt - read files in subdirs ~/.tsclient Karol: - drop FilesystemWatchMixin, add source_user_reloadable ''' import os from kupfer.objects import Action from kupfer.obj.apps import AppLeafContentMixin from kupfer import utils, icons from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj.hosts import HOST_NAME_KEY, HostLeaf TSCLIENT_SESSION_KEY = "TSCLIENT_SESSION" class TsclientSession(HostLeaf): """ Leaf represent session saved in Tsclient""" def __init__(self, obj_path, name, description): slots = {HOST_NAME_KEY: name, TSCLIENT_SESSION_KEY: obj_path} HostLeaf.__init__(self, slots, name) self._description = description def get_description(self): return self._description def get_gicon(self): return icons.ComposedIconSmall(self.get_icon_name(), "tsclient") class TsclientOpenSession(Action): ''' opens tsclient session ''' def __init__(self): Action.__init__(self, _('Start Session')) def activate(self, leaf): session = leaf[TSCLIENT_SESSION_KEY] utils.spawn_async(["tsclient", "-x", session]) def get_icon_name(self): return 'tsclient' def item_types(self): yield HostLeaf def valid_for_item(self, item): return item.check_key(TSCLIENT_SESSION_KEY) class TsclientSessionSource(AppLeafContentMixin, ToplevelGroupingSource): ''' indexes session saved in tsclient ''' appleaf_content_id = 'tsclient' source_user_reloadable = True def __init__(self, name=_("TSClient sessions")): ToplevelGroupingSource.__init__(self, name, "hosts") self._sessions_dir = os.path.expanduser('~/.tsclient') self._version = 2 def initialize(self): ToplevelGroupingSource.initialize(self) def get_items(self): if not os.path.isdir(self._sessions_dir): return for root, sub_folders_, files in os.walk(self._sessions_dir): for filename in files: if not filename.endswith('.rdp'): continue obj_path = os.path.join(root, filename) if os.path.isfile(obj_path): name = filename[:-4] description = self._load_descr_from_session_file(obj_path) yield TsclientSession(obj_path, name, description) def get_description(self): return _("Saved sessions in Terminal Server Client") def get_icon_name(self): return "tsclient" def provides(self): yield TsclientSession def _load_descr_from_session_file(self, filepath): user = None host = None try: with open(filepath, 'r') as session_file: for line in session_file: if line.startswith('full address:s:'): host = line.split(':s:', 2)[1].strip() elif line.startswith('username:s:'): user = line.split(':s:', 2)[1].strip() except IOError, err: self.output_error(err) else: if host: return unicode(user + '@' + host if user else host, "UTF-8", "replace") return u'Terminal Server Client Session' kupfer-v208/kupfer/plugin/urlactions.py000066400000000000000000000054051176220042200203760ustar00rootroot00000000000000__kupfer_name__ = _("URL Actions") __kupfer_sources__ = () __kupfer_text_sources__ = () __kupfer_actions__ = ( "DownloadAndOpen", "DownloadTo", ) __description__ = _("URL Actions") __version__ = "" __author__ = "Ulrik Sverdrup " import os import shutil import urllib from kupfer.objects import Action, UrlLeaf, FileLeaf from kupfer import utils, task class DownloadTask (task.ThreadTask): def __init__(self, uri, destdir=None, tempfile=False, finish_callback=None): super(DownloadTask, self).__init__() self.uri = uri self.download_finish_callback = finish_callback self.destdir = destdir self.use_tempfile = tempfile def thread_do(self): self.response = urllib.urlopen(self.uri) def url_name(url): return os.path.basename(url.rstrip("/")) def header_name(headers): content_disp = headers.get("Content-Disposition", "") for part in content_disp.split(";"): if part.strip().lower().startswith("filename="): return part.split("=", 1)[-1] return content_disp destname = (header_name(self.response.headers) or url_name(self.response.url)) if self.use_tempfile: (self.destfile, self.destpath) = utils.get_safe_tempfile() else: (self.destfile, self.destpath) = \ utils.get_destfile_in_directory(self.destdir, destname) try: if not self.destfile: raise IOError("Could not write output file") shutil.copyfileobj(self.response, self.destfile) finally: self.destfile.close() self.response.close() def thread_finish(self): if self.download_finish_callback: self.download_finish_callback(self.destpath) class DownloadAndOpen (Action): """Asynchronous action to download file and open it""" def __init__(self): Action.__init__(self, _("Download and Open")) def is_async(self): return True def wants_context(self): return True def activate(self, leaf, ctx): uri = leaf.object def finish_action(filename): utils.show_path(filename) ctx.register_late_result(FileLeaf(filename), show=False) return DownloadTask(uri, None, True, finish_action) def item_types(self): yield UrlLeaf def get_description(self): return None class DownloadTo (Action): def __init__(self): Action.__init__(self, _("Download To...")) def is_async(self): return True def wants_context(self): return True def activate(self, leaf, obj, ctx): uri = leaf.object def finish_action(filename): ctx.register_late_result(FileLeaf(filename)) return DownloadTask(uri, obj.object, False, finish_action) def item_types(self): yield UrlLeaf def requires_object(self): return True def object_types(self): yield FileLeaf def valid_object(self, obj, for_item=None): return utils.is_directory_writable(obj.object) def get_description(self): return _("Download URL to a chosen location") kupfer-v208/kupfer/plugin/vim/000077500000000000000000000000001176220042200164305ustar00rootroot00000000000000kupfer-v208/kupfer/plugin/vim/__init__.py000066400000000000000000000006471176220042200205500ustar00rootroot00000000000000__kupfer_name__ = _("Vim") __kupfer_sources__ = ("RecentsSource", "ActiveVim", ) __kupfer_actions__ = ("InsertInVim", ) __description__ = _("Recently used documents in Vim") __version__ = "2011-04" __author__ = "Plugin: Ulrik Sverdrup, VimCom: Ali Afshar" def initialize_plugin(name): global RecentsSource global ActiveVim global InsertInVim from kupfer.plugin.vim.plugin import RecentsSource, ActiveVim, InsertInVim kupfer-v208/kupfer/plugin/vim/plugin.py000066400000000000000000000221311176220042200202770ustar00rootroot00000000000000import os import sys import dbus import gio import glib from kupfer.objects import Source, FileLeaf, Leaf, Action from kupfer.objects import OperationError from kupfer.objects import AppLeaf, TextLeaf, TextSource from kupfer.obj.objects import Launch from kupfer.obj.apps import AppLeafContentMixin from kupfer import datatools from kupfer import utils from kupfer import kupferstring from kupfer import pretty from kupfer import plugin_support from kupfer import utils plugin_support.check_dbus_connection() PLUGID='vim' VIM = 'gvim' def get_vim_files(filepath): """ Read ~/.viminfo from @filepath Look for a line like this: *encoding= Return an iterator of unicode string file paths """ encoding = "UTF-8" recents = [] with open(filepath, "r") as f: for line in f: if line.startswith("*encoding="): _, enc = line.split("=") encoding = enc.strip() us_line = line.decode(encoding, "replace") ## Now find the jumplist if us_line.startswith("-' "): parts = us_line.split(None, 3) recentfile = os.path.expanduser(parts[-1].strip()) if recentfile: recents.append(recentfile) return datatools.UniqueIterator(recents) class RecentsSource (AppLeafContentMixin, Source): appleaf_content_id = ("vim", "gvim") vim_viminfo_file = "~/.viminfo" def __init__(self, name=None): name = name or _("Vim Recent Documents") super(RecentsSource, self).__init__(name) def initialize(self): """Set up change monitor""" viminfofile = os.path.expanduser(self.vim_viminfo_file) gfile = gio.File(viminfofile) self.monitor = gfile.monitor_file(gio.FILE_MONITOR_NONE, None) if self.monitor: self.monitor.connect("changed", self._changed) def finalize(self): if self.monitor: self.monitor.cancel() self.monitor = None def _changed(self, monitor, file1, file2, evt_type): """Change callback; something changed""" if evt_type in (gio.FILE_MONITOR_EVENT_CREATED, gio.FILE_MONITOR_EVENT_DELETED, gio.FILE_MONITOR_EVENT_CHANGED): self.mark_for_update() def get_items(self): viminfofile = os.path.expanduser(self.vim_viminfo_file) if not os.path.exists(viminfofile): self.output_debug("Viminfo not found at", viminfofile) return try: filepaths = list(get_vim_files(viminfofile)) except EnvironmentError: self.output_exc() return for filepath in filepaths: # The most confusing glib function # takes a unicode string and returns a # filesystem-encoded bytestring. yield FileLeaf(glib.filename_from_utf8(filepath)) def get_icon_name(self): return "document-open-recent" def provides(self): yield FileLeaf def get_plugin_iface_name(plugin_id): plugin_id = plugin_id.split(".")[-1] interface_name = "se.kaizer.kupfer.plugin.%s" % plugin_id return interface_name def get_plugin_service_obj(plugin_id, activate=True): """Return the dbus proxy object for our plugin if @activate, we will --exec-helper= the service """ plugin_id = plugin_id.split(".")[-1] service_name = "se.kaizer.kupfer.plugin.%s" % plugin_id interface_name = "se.kaizer.kupfer.plugin.%s" % plugin_id object_name = "/se/kaizer/kupfer/plugin/%s" % plugin_id try: bus = dbus.Bus() except dbus.DBusException: return None try: proxy_obj = bus.get_object(service_name, object_name) except dbus.DBusException as exc: if activate: service_id = "kupfer.plugin.%s.service" % plugin_id return utils.start_plugin_helper(service_id, True) return None proxy_iface = dbus.Interface(proxy_obj, interface_name) return proxy_iface def stop_plugin_service(plugin_id): """ Return True if it was running and was stopped """ plug_iface = get_plugin_service_obj(plugin_id, activate=False) if plug_iface: plug_iface.Exit(reply_handler=_dummy_handler, error_handler=_dummy_handler) def _dummy_handler(*args): pass class VimApp (AppLeaf): """ This is a re-implemented AppLeaf that represents a running Vim session with a fake vim self.object for safety (this should not be needed) """ serializable = None def __init__(self, serverid, name): try: obj = gio.unix.DesktopAppInfo("gvim.desktop") except RuntimeError: obj = gio.AppInfo(VIM) Leaf.__init__(self, obj, name) self.serverid = serverid def get_id(self): # use an ostensibly fake id starting with @/ return "@/%s/%s" % (__name__, self.serverid or "") def __setstate__(self, state): raise NotImplementedError def __getstate__(self): raise NotImplementedError def get_actions(self): if self.serverid is not None: yield Launch(_("Go To"), is_running=True) yield SendCommand() yield CloseSaveAll() else: yield Launch() def launch(self, files=(), paths=(), activate=False, ctx=None): """ Launch the represented application @files: a seq of GFiles (gio.File) @paths: a seq of bytestring paths @activate: activate instead of start new """ if self.serverid is not None: argv = [VIM, '--servername', self.serverid, '--remote'] else: argv = [VIM] if files: paths = [f.get_path() or f.get_uri() for f in files] if paths: argv.extend(paths) if paths or self.serverid is None: try: utils.spawn_async_raise(argv) except utils.SpawnError as exc: raise OperationError(exc) if self.serverid: ## focus the window we opened def error_handler(exc): ctx.register_late_error(OperationError(exc)) proxy_obj = get_plugin_service_obj(PLUGID) if proxy_obj: proxy_obj.Foreground(self.serverid, reply_handler=_dummy_handler, error_handler=error_handler) def get_icon_name(self): return 'vim' def get_description(self): return None class CloseSaveAll (Action): """ Close a vim window without forcing """ rank_adjust = -5 def __init__(self): Action.__init__(self, _("Close (Save All)")) def wants_context(self): return True def activate(self, obj, ctx): def error_handler(exc): ctx.register_late_error(OperationError(exc)) proxy_obj = get_plugin_service_obj(PLUGID) if proxy_obj: proxy_obj.SendEx(obj.serverid, 'wqa', reply_handler=_dummy_handler, error_handler=error_handler) def get_icon_name(self): return "window-close" class SendCommand (Action): def __init__(self): Action.__init__(self, _("Send...")) def wants_context(self): return True def activate(self, obj, iobj, ctx): ## accept with or without starting : lcmd = kupferstring.tolocale(iobj.object) if lcmd.startswith(":"): lcmd = lcmd[1:] def error_handler(exc): ctx.register_late_error(OperationError(exc)) proxy_obj = get_plugin_service_obj(PLUGID) if proxy_obj: proxy_obj.SendEx(obj.serverid, lcmd, reply_handler=_dummy_handler, error_handler=error_handler) def requires_object(self): return True def object_types(self): yield TextLeaf def object_source(self, for_item=None): return TextSource() def get_description(self): return _("Send ex command") class InsertInVim (Action): """ Insert a given text into the currently open buffer in a vim session """ def __init__(self): Action.__init__(self, _("Insert in Vim...")) def wants_context(self): return True def activate(self, obj, iobj, ctx): tmpf, tmpname = utils.get_safe_tempfile() tmpf.write(kupferstring.tolocale(obj.object)) tmpf.close() vim_cmd = "r %s" % tmpname glib.timeout_add_seconds(10, os.unlink, tmpname) def error_handler(exc): ctx.register_late_error(OperationError(exc)) proxy_obj = get_plugin_service_obj(PLUGID) if proxy_obj: proxy_obj.SendEx(iobj.serverid, vim_cmd, reply_handler=_dummy_handler, error_handler=error_handler) def item_types(self): yield TextLeaf def requires_object(self): return True def object_types(self): yield VimApp def get_icon_name(self): return "insert-text" class ActiveVim (AppLeafContentMixin, Source): appleaf_content_id = ("vim", "gvim") def __init__(self): Source.__init__(self, _("Active Vim Sessions")) def initialize(self): ActiveVim.instance = self self.serverids = [] self.signal_match = None glib.timeout_add_seconds(1, self.start_helper) def start_helper(self): bus = dbus.Bus() self.signal_match = bus.add_signal_receiver(self.on_new_serverlist, signal_name="NewServerlist", dbus_interface=get_plugin_iface_name(PLUGID), byte_arrays=True) get_plugin_service_obj(PLUGID, activate=True) def finalize(self): ActiveVim.instance = None if self.signal_match is not None: bus = dbus.Bus() bus.remove_signal_receiver(self.signal_match, signal_name="NewServerlist", dbus_interface=get_plugin_iface_name(PLUGID)) self.signal_match = None self.mark_for_update() stop_plugin_service(PLUGID) def get_items(self): for x in self.serverids: yield VimApp(x, _("Vim Session %s") % kupferstring.fromlocale(x)) def on_new_serverlist(self, new_list): self.output_debug("New list:", list(new_list)) if set(new_list) != set(self.serverids): self.serverids = map(str, new_list) self.mark_for_update() def provides(self): yield VimApp @classmethod def decorate_item(cls, leaf): if cls.instance and not cls.instance.serverids: return None return super(ActiveVim, cls).decorate_item(leaf) kupfer-v208/kupfer/plugin/vim/service.py000066400000000000000000000055471176220042200204550ustar00rootroot00000000000000 import os import sys import traceback import pygtk pygtk.require('2.0') import glib import gobject from kupfer.plugin.vim import vimcom try: import dbus import dbus.service #import dbus.glib from dbus.mainloop.glib import DBusGMainLoop except (ImportError, dbus.exceptions.DBusException) as exc: print exc raise SystemExit(1) PLUGID='vim' server_name = "se.kaizer.kupfer.plugin.%s" % PLUGID interface_name = "se.kaizer.kupfer.plugin.%s" % PLUGID object_name = "/se/kaizer/kupfer/plugin/%s" % PLUGID class Service (dbus.service.Object): def __init__(self, mainloop, bus): bus_name = dbus.service.BusName(server_name, bus=bus, allow_replacement=True, replace_existing=True) super(Service, self).__init__(conn=bus, object_path=object_name, bus_name=bus_name) self.mainloop = mainloop self.initialize() def unregister(self): self.connection.release_name(server_name) def initialize(self): self.vimcom = vimcom.VimCom(self) self.vimcom.vim_hidden = vimcom.poller(name_token="KUPFER") self.vimcom.stop_fetching_serverlist() self.serverids = [] glib.timeout_add_seconds(1, self.update_serverlist) def finalize(self): pid = self.vimcom.vim_hidden.pid if pid: self.vimcom.send_ex(self.vimcom.vim_hidden.name, 'qa!') os.close(self.vimcom.vim_hidden.childfd) #os.kill(pid, 15) os.waitpid(pid, 0) self.vimcom.destroy() self.vimcom = None def mark_for_update(self): self.NewServerlist(self.serverids) def vim_new_serverlist(self, serverlist): """this is the inaccurate serverlist""" ## useless callback from vimcom.VimCom pass def on_new_serverlist(self, new_list): if set(new_list) != set(self.serverids): self.serverids = new_list self.mark_for_update() def update_serverlist(self): if self.vimcom: self.vimcom.get_hidden_serverlist(self.on_new_serverlist) return True @dbus.service.method(interface_name, in_signature="ay", out_signature="b", byte_arrays=True) def Foreground(self, server): if self.vimcom and server in self.serverids: self.vimcom.foreground(server) return True return False @dbus.service.method(interface_name, in_signature="ayay", out_signature="b", byte_arrays=True) def SendEx(self, server, excommand): if self.vimcom and server in self.serverids: self.vimcom.send_ex(server, excommand) return True return False @dbus.service.signal(interface_name, signature="aay") def NewServerlist(self, serverlist): pass @dbus.service.method(interface_name) def Exit(self): self.unregister() self.finalize() self.mainloop.quit() def start(ml): try: bus = dbus.Bus() service = Service(ml, bus) except: traceback.print_exc() raise SystemExit(1) def main(): ml_wrap = DBusGMainLoop(set_as_default=True) glib.set_prgname(__name__) ml = glib.MainLoop() glib.idle_add(start, ml) ml.run() if __name__ == '__main__': main() kupfer-v208/kupfer/plugin/vim/vimcom.py000066400000000000000000000647101176220042200203040ustar00rootroot00000000000000# -*- coding: utf-8 -*- # vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: #Copyright (c) 2005 Ali Afshar aafshar@gmail.com #Permission is hereby granted, free of charge, to any person obtaining a copy #of this software and associated documentation files (the "Software"), to deal #in the Software without restriction, including without limitation the rights #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell #copies of the Software, and to permit persons to whom the Software is #furnished to do so, subject to the following conditions: #The above copyright notice and this permission notice shall be included in #all copies or substantial portions of the Software. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE #SOFTWARE. """ A library to control vim -g using its X protocol interface (with gdk). ============ How it works ============ === General Communication === The Vim client/server protocol communicates by sending messages to and from an X communication window. The details are explained in the Vim source. Essentially, Vim understands two sorts of messages over this interface. ;asynchronous key sends : that are exactly equivalent to to the user of the remote Vim typing commands. ;synchronous expression evaluations : these are Vim expressions that are evaluated by the remote Vim, and an answer is replied with the result over the same protocol. Although the synchronous messages are called synchronous, the reply itself, in programming terms is entirely asynchronous, in that there is no way of knowing when a reply will be received, and one cannot block for it. Thus, this library allows you to make both of these calls to remote Vims. Synchronous expressions must provide a call back function that will be called when the message is replied to. === The Server List === (It has been an utter nightmare.) The primary problem is that GTK does not actually know accurately whether a window with a given window ID has been destroyed. This is how Vim does it (using the X libraries) after checking an attribute for registered Vim sessions with the X root window. This way each Vim doesn't need to unregister itself with the X root window on dying, it just assumes that any other client attempting to connect to it will know that the window has been destroyed. As mentioned, GTK totally fails to do what the X library does, and ascertain whether the window is alive. It succeeds sometimes, but not at others. The result is a GDK window that appears alive, and ready to communicate with, but which causes an uncatchable and fatal application error. Step in other potential methods of getting an accurate list of servers. Firstly, and most obviously, one can call the command 'vim --serverlist' on a simple system pipe and read the list off. This is entirely reliable, and effective, but the cost of forking a process and starting Vim each time is not fun, and effectively blocks. Another option is to force users to start Vim through Pida and keep an account of the child processes. This would work very effectively, but it restricts the user, and the entire system. The final, and current solution is to start Vim itself on a pseudoterminal as a hidden instance, and then communicate with that over the Vim protocol. The reason this can be reliably done, is that since the process is a child, it can be polled to check whether it is alive. This is performed each time the serverlist is requested, and if the hidden instance has been destroyed (eg by the user) a new one is spawned, thus preventing an attempt to communicate with an already-destroyed GDK window. The cost of this solution is that we spawn an extra Vim process. I believe that the added solidity it brings to the entire system is easily worth it, and it ensures that Pida can communicate with Vim it started and Vim it didn't start. """ # Gtk imports import gtk import gtk.gdk as gdk import gobject # System imports import os import pty import time import tempfile class poller(object): """ DEPRECATED: WE DO NOT USE THIS ANYMORE An instance of Vim on a pseudoterminal which can be reliably polled. This class is used to provide an instance of Vim which can be communicated with using the Vim client/server protocol, in order to retrieve an accurate and current server list, and also which can be polled accurately as to whether it is alive before communicating with it. This method is much cheaper in resources than running vim --serverlist each time, and much more accurate than using the root window's VimRegistry property, and also more accurate than using GDK methods for assessing whether a window is alive. """ def __init__(self, name_token="PIDA_HIDDEN", extra_args=[]): """ Constructor. Create a temporary and unique name for use as the servername, and initialise the instance variables. @param cb: An instance of the main application class. @type cb: pida.main.Application. """ # Prefacing with '__' means it will be ignored in the internal server # list. self.name = '__%s_%s' % (time.time(), name_token) # Checked to evaluate False on starting. self.pid = None self.extra_args = extra_args def start(self): """ Start the Vim instance if it is not already running. This command forks in a pseudoterminal, and starts Vim, if Vim is not already running. The pid is stored for later use. """ if not self.pid: # Get the console vim executable path #command = self.prop_main_registry.commands.vim.value() command = 'gvim' # Fork using pty.fork to prevent Vim taking the terminal sock = gtk.Socket() w = gtk.Window() w.realize() w.add(sock) xid = sock.get_id() pid, fd = pty.fork() if pid == 0: # Child, execute Vim with the correct servername argument argv = ['gvim', '-f', '--servername', self.name, '--socketid', '%s' % xid] argv.extend(self.extra_args) os.execvp(command, argv) # os.system('%s -v --servername %s' % (command, self.name)) else: # Parent, store the pid, and file descriptor for later. self.pid = pid self.childfd = fd #self.do_action('accountfork', self.pid) def is_alive(self): """ Check if the Vim instance is alive. This method uses os.waitpid, with no blocking to determine whether the process is still alive. If it is not, it sets the internal pid attribute to None, so that it may be restarted. @returns: alive @rtype alive: boolean """ if self.pid: try: # call os.waitpid, returns 0 if the pid is alive pid, sts = os.waitpid(self.pid, os.WNOHANG) except OSError: # might still be starting up return False if pid == self.pid: # has shut down self.pid = None return False else: # is still alive return True else: # Not started yet return False class communication_window(gtk.Window): """ A GTK window that can communicate with any number Vim instances. This is an actual GTK window (which it must be to accurately detect property events inside the GTK main loop) but has its GDK window correctly set to receive such events. This is notably the "Vim" property which must be present and set to a version string, in this case "6.0" is used. """ def __init__(self, cb): """ Constructor. The Window is instantiated, the properties are correctly set, the event mask is modified, and the instance variables are initialized. @param cb: An instance of the main Application class. @type cb: pida.main.Application. """ gtk.Window.__init__(self) self.cb = cb # Window needs to be realized to do anything useful with it. Realizing # does not show the window to the user, so we can use it, but not have # an ugly blank frame while it loads. self.realize() # The "Vim" property self.window.property_change("Vim", gdk.SELECTION_TYPE_STRING, 8, gdk.PROP_MODE_REPLACE, "6.0") # Set the correct event mask and connect the notify event self.add_events(gtk.gdk.PROPERTY_CHANGE_MASK) self.connect('property-notify-event', self.cb_notify) # The serial number used for sending synchronous messages self.serial = 1 # A dictionary of callbacks for synchronous messages. The key is the # serial number, and the value is a callable that will be called with # the result of the synchronous evaluation. self.callbacks = {} # A dictionary to store the working directories for each Vim so they # only have to be fetched once. self.server_cwds = {} # An instance of the root window, so it only has to be fetched once. self.root_window = gdk.get_default_root_window() # fetch the serverlist to begin with to know when we are started self.oldservers = None self.keep_fetching_serverlist = True gobject.timeout_add(250, self.fetch_serverlist) def fetch_serverlist(self): """ Fetch the serverlist, and if it has changed, feed it to the client. The serverlist is requested asynchrnously, and passed the gotservers function as a callback. The gotservers function is then called with the server list, gets the appropriate working directory (if required) and feeds the new server list to the client if it has changed. """ def gotservers(serverlist): """ Called back on receiving the serverlist. Fetch working directories for new Vim instances, and feed the server list to the client if it has changed. """ for server in serverlist: # Check if we already have the working directory. if server not in self.server_cwds: # We don't, fetch it self.fetch_cwd(server) # Check if the server list has changed if serverlist != self.oldservers: self.oldservers = serverlist # A ew serverlist to feed to the client. self.feed_serverlist(serverlist) gotservers(self.get_rootwindow_serverlist()) # decide whether to keep fetching server list return self.keep_fetching_serverlist def stop_fetching_serverlist(self): self.keep_fetching_serverlist = False def get_rootwindow_serverlist(self): """ Get the X root window's version of the current Vim serverlist. On starting with the client-server feature, GVim or Vim with the --servername option registers its server name and X window id as part of the "VimRegistry" parameter on the X root window. This method extracts and parses that property, and returns the server list. Note: Vim does not actually unregister itself with the root window on dying, so the presence of a server in the root window list is no gurantee that it is alive. @return: servers @rtype servers: dict of ("server", "window id") key, value """ servers = {} # Read the property vimregistry = self.root_window.property_get("VimRegistry") # If it exists if vimregistry: # Get the list of servers by splitting with '\0' vimservers = vimregistry[-1].split('\0') # Parse each individual server and add to the results list for rawserver in vimservers: # Sometimes blank servers exist in the list if rawserver: # split the raw value for the name and id name_id = rawserver.split() # Set the value in the results dict, remembering to convert # the window id to a long int. servers[name_id[1]] = long(int(name_id[0], 16)) # return the list of resuts return servers def get_shell_serverlist(self): """ DEPRACATED: WE NEVER NEED A SERVERLIST (This is here for educative purposes) Get the server list by starting console Vim on a Pipe. This blocks, so we don't use it. It is one of the alternative methods of retrieving an accurate serverlist. It is slow, and expensive. """ vimcom = 'gvim' p = os.popen('%s --serverlist' % vimcom) servers = p.read() p.close() return servers.splitlines() def get_hidden_serverlist(self, callbackfunc): """ DEPRACATED: WE NEVER NEED A SERVERLIST (This is here for educative purposes) Get the serverlist from the hidden Vim instance and call the callback function with the results. This method checks first whther the Vim instance is alive, and then evaluates the serverlist() function remotely in it, with a local call back function which parses the result and calls the user-provided callback function. @param callbackfunc: The call back function to be called with the server list. @type callbackfunc: callable """ def cb(serverstring): """ Called back with the raw server list. Parse the lines and call the call back function, ignoring any instances starting with "__" which represent hidden instances. If the hidden Vim instance is not alive, it is restarted. """ servers = serverstring.splitlines() # Call the callback function callbackfunc([svr for svr in servers if not svr.startswith('__')]) # Check if the hidden Vim is alive. if self.vim_hidden.is_alive(): # It is alive, get the serverlist. self.send_expr(self.vim_hidden.name, 'serverlist()', cb) else: # It is not alive, restart it. self.vim_hidden.start() def get_server_wid(self, servername): """ Get the X Window id for a named Vim server. This function returns the id from the root window server list, if it exists, or None if it does not. @param servername: The name of the server @type servername: str @return: wid @rtype wid: long """ try: # get the window id from the root window wid = self.get_rootwindow_serverlist()[servername] except KeyError: # The server is not registered in the root window so return None wid = None # Return wid if it is not none, or None return wid and long(wid) or None def get_server_window(self, wid): """ Create and return a GDK window for a given window ID. This method simply calls gdk.window_foreign_new, which should return None if the window has been destroyed, but does not, in some cases. @param wid: The window ID. @type wid: long """ return gtk.gdk.window_foreign_new(wid) def feed_serverlist(self, serverlist): """ Feed the given list of servers to the client. This is achieved by calling the clients serverlist event. In Pida, this event is passed on to all the plugins. @param serverlist: The list of servers. @type serverlist: list """ # Call the event. #self.do_evt('serverlist', serverlist) self.cb.vim_new_serverlist(serverlist) def fetch_cwd(self, servername): """ Fetch the working directory for a named server and store the result. """ def gotcwd(cwd): """ Called back on receiving the working directory, store it for later use. """ self.server_cwds[servername] = cwd # Evaluate the expression with the gotcwd callback self.send_expr(servername, "getcwd()", gotcwd) def get_cwd(self, server): if server in self.server_cwds: return self.server_cwds[server] def abspath(self, servername, filename): """ Return the absolute path of a buffer name in the context of the named server. """ # Only alter non-absolute paths if not filename.startswith('/'): try: # Try to find the current working directory cwd = self.server_cwds[servername] except KeyError: # The working directory is not set # Use a sane default, and fetch it cwd = os.path.expanduser('~') self.fetch_cwd(servername) filename = os.path.join(cwd, filename) return filename def generate_message(self, server, cork, message, sourceid): """ Generate a message. """ # Increment the serial number used for synchronous messages if cork: self.serial = self.serial + 1 # Pick an arbitrary number where we recycle. if self.serial > 65530: self.serial = 1 # return the generated string return '\0%s\0-n %s\0-s %s\0-r %x %s\0' % (cork, server, message, sourceid, self.serial) def parse_message(self, message): """ Parse a received message and return the message atributes as a dictionary. """ messageattrs = {} for t in [s.split(' ') for s in message.split('\0')]: if t and len(t[0]): if t[0].startswith('-'): #attributes start with a '-', strip it and set the value if len(t) > 1: messageattrs[t[0][1:]] = t[1] else: # Otherwise set the t attribute messageattrs['t'] = t[0] return messageattrs def send_message(self, servername, message, asexpr, callback): wid = self.get_server_wid(servername) if wid: cork = (asexpr and 'c') or 'k' sw = self.get_server_window(wid) if sw and sw.property_get("Vim"): mp = self.generate_message(servername, cork, message, self.window.xid) sw.property_change("Comm", gdk.TARGET_STRING, 8, gdk.PROP_MODE_APPEND, mp) if asexpr and callback: self.callbacks['%s' % (self.serial)] = callback def send_expr(self, server, message, callback): self.send_message(server, message, True, callback) def send_keys(self, server, message): self.send_message(server, message, False, False) def send_esc(self, server): self.send_keys(server, '') def send_ret(self, server): self.send_keys(server, '') def send_ex(self, server, message): self.send_esc(server) self.send_keys(server, ':%s' % message) self.send_ret(server) def get_option(self, server, option, callbackfunc): self.send_expr(server, '&%s' % option, callbackfunc) def foreground(self, server): def cb(*args): pass self.send_expr(server, 'foreground()', cb) def change_buffer(self, server, filename): self.send_ex(server, "exe 'b!'.bufnr('%s')" % filename) def change_buffer_number(self, server, number): self.send_ex(server, "b!%s" % number) def close_buffer(self, server, buffername): self.send_ex(server, "exe 'confirm bw'.bufnr('%s')" % buffername) def close_current_buffer(self, server): self.send_ex(server, 'confirm bw') def change_cursor(self, server, x, y): self.send_message(server, 'cursor(%s, %s)' % (y, x), True, False) self.send_esc(server) def save_session(self, name): self.send_ex('mks %s' % name) def escape_filename(self, name): for s in ['\\', '?', '*', ' ', "'", '"', '[', ' ', '$', '{', '}']: name = name.replace (s, '\\%s' % s) return name def open_file(self, server, name): self.send_ex(server, 'confirm e %s' % self.escape_filename(name)) def new_file(self, server): f, path = tempfile.mkstemp() self.open_file(server, path) return path def goto_line(self, server, linenumber): self.send_ex(server, '%s' % linenumber) self.send_esc(server) self.send_keys(server, 'zz') self.send_keys(server, 'zv') def revert(self, server): self.send_ex(server, 'e') def load_script(self, server, scriptpath): self.send_ex(server, 'so %s' % scriptpath) def preview_file(self, server, fn): self.send_ex(server, 'pc') self.send_ex(server, 'set nopreviewwindow') self.send_ex(server, 'pedit %s' % fn) def get_bufferlist(self, server): def cb(bl): if bl: l = [i.split(':') for i in bl.strip(';').split(';')] L = [] for n in l: if not n[0].startswith('E'): L.append([n[0], self.abspath(server, n[1])]) self.do_evt('bufferlist', L) #self.get_cwd(server) self.send_expr(server, 'Bufferlist()', cb) def get_current_buffer(self, server): def cb(bs): bn = bs.split(',') bn[1] = self.abspath(server, bn[1]) self.do_evt('bufferchange', *bn) #self.get_cwd(server) self.send_expr(server, "bufnr('%').','.bufname('%')", cb) def save(self, server): self.send_ex(server, 'w') def save_as(self, server, filename): print filename self.send_ex(server, 'saveas %s' % filename) def undo(self, server): self.send_esc(server) self.send_keys(server, 'u') def redo(self, server): self.send_esc(server) self.send_keys(server, '') def cut(self, server): self.send_keys(server, '"+x') def copy(self, server): self.send_keys(server, '"+y') def paste(self, server): self.send_esc(server) self.send_keys(server, 'p') def set_colorscheme(self, server, colorscheme): self.send_ex(server, 'colorscheme %s' % colorscheme) def set_menu_visible(self, server, visible): if visible: op = '+' else: op = '-' self.send_ex(server, 'set guioptions%s=m' % op) def quit(self, server): self.send_ex(server, 'q!') def define_sign(self, server, name, icon, linehl, text, texthl): self.send_ex(server, 'sign define %s icon=%s linehl=%s text=%s texthl=%s '% (name, icon, linehl, text, texthl)) def undefine_sign(self, server, name): self.send_ex(server, 'sign undefine %s' % name) def show_sign(self, server, index, type, filename, line): self.send_ex(server, 'sign place %s line=%s name=%s file=%s' % (index + 1, line, type, filename)) def hide_sign(self, server, index, filename): self.send_ex(server, 'sign unplace %s' % (index + 1)) def cb_notify(self, *a): win, ev = a if hasattr(ev, 'atom'): if ev.atom == 'Comm': message = self.window.property_get('Comm', pdelete=True) if message: self.cb_reply(message[-1]) return True def cb_reply(self, data): mdict = self.parse_message(data) if mdict['t'] == 'r': if mdict['s'] in self.callbacks: self.callbacks[mdict['s']](mdict['r']) else: s = [t for t in data.split('\0') if t.startswith('-n')].pop()[3:] self.cb_reply_async(s) def cb_reply_async(self, data): if data.count(':'): server, data = data.split(':', 1) else: server = None if data.count(','): evt, d = data.split(',', 1) self.vim_event(server, evt, d) else: print 'bad async reply', data def vim_event(self, server, evt, d): funcname = 'vim_%s' % evt if hasattr(self.cb, funcname): getattr(self.cb, funcname)(server, *d.split(',')) else: print 'unhandled event', evt VimCom = communication_window NMAP_COM = '%smap %s :call %sCR>' UNMAP_COM = '%sun %s' VIMSCRIPT = ''':silent function! Bufferlist() let i = 1 let max = bufnr('$') + 1 let lis = "" while i < max if bufexists(i) let lis = lis.";".i.":".bufname(i) endif let i = i + 1 endwhile return lis :endfunction :silent function! BreakPoint(l) call Async_event(v:servername.":set_breakpoint,".a:l) :endfunction :silent function! Yank_visual() y return @" :endfunction :silent function! Async_event(e) let c = "silent call server2client('".expand('')."', '".a:e."')" try exec c catch /.*/ echo c endtry :endfunction :silent function! Pida_Started() silent call Async_event(v:servername.":filesave,") echo "PIDA connected" :endfunction :silent sign define break text=!B :silent augroup pida :silent set guioptions-=T :silent set guioptions-=m :silent au! pida :silent au pida BufEnter * silent call Async_event(v:servername.":bufferchange,".getcwd().",".bufname('%').",".bufnr('%')) :silent au pida BufDelete * silent call Async_event(v:servername.":bufferunload,".expand('')) :silent au pida VimLeave * silent call Async_event(v:servername.":shutdown,") :silent au pida VimEnter * silent call Pida_Started() :silent au pida BufWritePost * silent call Async_event(v:servername.":filesave,") ''' kupfer-v208/kupfer/plugin/vinagre.py000066400000000000000000000066561176220042200176570ustar00rootroot00000000000000# -*- coding: UTF-8 -*- from __future__ import with_statement __kupfer_name__ = _("Vinagre") __kupfer_sources__ = ("SessionSource", ) __kupfer_actions__ = ('VinagreStartSession', ) __description__ = _("Vinagre bookmarks and actions") __version__ = "2009-11-24" __author__ = "Karol Będkowski " import os import gio from xml.etree import cElementTree as ElementTree from kupfer.objects import Action, UrlLeaf from kupfer.obj.helplib import PicklingHelperMixin from kupfer.obj.apps import AppLeafContentMixin from kupfer import utils, icons from kupfer.obj.grouping import ToplevelGroupingSource from kupfer.obj.hosts import HostServiceLeaf, HOST_ADDRESS_KEY, \ HOST_SERVICE_NAME_KEY, HOST_SERVICE_PORT_KEY, HOST_SERVICE_USER_KEY BOOKMARKS_FILE = '~/.local/share/vinagre/vinagre-bookmarks.xml' class Bookmark(HostServiceLeaf): def get_gicon(self): return icons.ComposedIconSmall(self.get_icon_name(), "vinagre") class VinagreStartSession(Action): def __init__(self): Action.__init__(self, _('Start Vinagre Session')) def activate(self, leaf): if isinstance(leaf, UrlLeaf): utils.spawn_async(["vinagre", leaf.object]) else: service = leaf[HOST_SERVICE_NAME_KEY] host = leaf[HOST_ADDRESS_KEY] port = '' if leaf.check_key(HOST_SERVICE_PORT_KEY): port = ':' + leaf[HOST_SERVICE_PORT_KEY] user = '' if leaf.check_key(HOST_SERVICE_USER_KEY): user = leaf[HOST_SERVICE_USER_KEY] + '@' url = '%s://%s%s%s' % (service, user, host, port) utils.spawn_async(["vinagre", url]) def get_icon_name(self): return 'vinagre' def item_types(self): yield HostServiceLeaf yield UrlLeaf def valid_for_item(self, item): if isinstance(item, HostServiceLeaf): if item.check_key(HOST_SERVICE_NAME_KEY): service = item[HOST_SERVICE_NAME_KEY] return service in ('ssh', 'vnc') return False return (item.object.startswith('ssh://') \ or item.object.startswith('vnc://')) class SessionSource(AppLeafContentMixin, ToplevelGroupingSource, PicklingHelperMixin): appleaf_content_id = 'vinagre' def __init__(self, name=_("Vinagre Bookmarks")): ToplevelGroupingSource.__init__(self, name, 'hosts') self._version = 2 def pickle_prepare(self): self.monitor = None def initialize(self): ToplevelGroupingSource.initialize(self) bookmark_file = os.path.expanduser(BOOKMARKS_FILE) gfile = gio.File(bookmark_file) self.monitor = gfile.monitor_file(gio.FILE_MONITOR_NONE, None) if self.monitor: self.monitor.connect("changed", self._on_bookmarks_changed) def _on_bookmarks_changed(self, monitor, file1, file2, evt_type): if evt_type in (gio.FILE_MONITOR_EVENT_CREATED, gio.FILE_MONITOR_EVENT_DELETED, gio.FILE_MONITOR_EVENT_CHANGED): self.mark_for_update() def get_items(self): bookmark_file = os.path.expanduser(BOOKMARKS_FILE) if not os.path.isfile(bookmark_file): return try: tree = ElementTree.parse(bookmark_file) for item in tree.findall('item'): protocol = item.find('protocol').text name = item.find('name').text host = item.find('host').text port = item.find('port').text url = '%s://%s:%s' % (protocol, host, port) user = None if host.find('@') > 0: user, host = host.split('@', 1) yield Bookmark(name, host, protocol, url, port, user) except StandardError, err: self.output_error(err) def get_description(self): return None def get_icon_name(self): return "vinagre" def provides(self): yield Bookmark kupfer-v208/kupfer/plugin/virtualbox/000077500000000000000000000000001176220042200200345ustar00rootroot00000000000000kupfer-v208/kupfer/plugin/virtualbox/__init__.py000066400000000000000000000104531176220042200221500ustar00rootroot00000000000000# -*- coding: UTF-8 -*- __kupfer_name__ = _("VirtualBox") __kupfer_sources__ = ("VBoxMachinesSource", ) __description__ = _("Control VirtualBox Virtual Machines. " "Supports both Sun VirtualBox and Open Source Edition.") __version__ = "0.3" __author__ = "Karol Będkowski " from kupfer.objects import Leaf, Action, Source from kupfer import pretty from kupfer import plugin_support from kupfer.obj.apps import ApplicationSource from kupfer.plugin.virtualbox import ose_support from kupfer.plugin.virtualbox import constants as vbox_const __kupfer_settings__ = plugin_support.PluginSettings( { "key": "force_cli", "label": _("Force use CLI interface"), "type": bool, "value": False, }, ) def _get_vbox(): if __kupfer_settings__['force_cli']: pretty.print_info(__name__, 'Using cli...') return ose_support try: from kupfer.plugin.virtualbox import vboxapi4_support pretty.print_info(__name__, 'Using vboxapi4...') return vboxapi4_support except ImportError: pass try: from kupfer.plugin.virtualbox import vboxapi_support pretty.print_info(__name__, 'Using vboxapi...') return vboxapi_support except ImportError: pass pretty.print_info(__name__, 'Using cli...') return ose_support class _VBoxSupportProxy: VBOX = None def __getattr__(self, attr): if not self.VBOX: self.reload_settings() return getattr(self.VBOX, attr) def reload_settings(self): pretty.print_debug(__name__, '_VBoxSupportProxy.reloading...') self.unload_module() self.VBOX = _get_vbox() def unload_module(self): if not self.VBOX: return self.VBOX.unload() self.VBOX = None vbox_support = _VBoxSupportProxy() class VirtualMachine(Leaf): def __init__(self, obj, name, description): Leaf.__init__(self, obj, name) self.description = description def get_description(self): return self.description def get_icon_name(self): return vbox_support.ICON def get_actions(self): state = vbox_support.get_machine_state(self.object) if state == vbox_const.VM_STATE_POWEROFF: yield VMAction(_('Power On'), 'system-run', vbox_const.VM_START_NORMAL) yield VMAction(_('Power On Headless'), 'system-run', vbox_const.VM_START_HEADLESS, -5) elif state == vbox_const.VM_STATE_POWERON: yield VMAction(_('Send Power Off Signal'), 'system-shutdown', vbox_const.VM_ACPI_POWEROFF, -5) yield VMAction(_('Pause'), 'pause', vbox_const.VM_PAUSE) yield VMAction(_('Reboot'), 'system-reboot', vbox_const.VM_REBOOT, -10) elif state == vbox_const.VM_STATE_SAVED: yield VMAction(_('Power On'), 'system-run', vbox_const.VM_START_NORMAL) yield VMAction(_('Power On Headless'), 'system-run', vbox_const.VM_START_HEADLESS, -5) else: # VM_STATE_PAUSED yield VMAction(_('Resume'), 'resume', vbox_const.VM_RESUME) if state in (vbox_const.VM_STATE_POWERON, vbox_const.VM_STATE_PAUSED): yield VMAction(_('Save State'), 'system-supsend', vbox_const.VM_SAVE) yield VMAction(_('Power Off'), 'system-shutdown', vbox_const.VM_POWEROFF, -10) class VMAction(Action): def __init__(self, name, icon, command, rank_adjust=0): Action.__init__(self, name) self._icon = icon self.rank_adjust = rank_adjust self.command = command def get_icon_name(self): return self._icon def item_types(self): yield VirtualMachine def activate(self, leaf): vbox_support.vm_action(self.command, leaf.object) class VBoxMachinesSource(ApplicationSource): appleaf_content_id = ("virtualbox-ose", "virtualbox") def __init__(self, name=_("VirtualBox Machines")): Source.__init__(self, name) def initialize(self): if vbox_support.MONITORED_DIRS: self.monitor_token = self.monitor_directories( *vbox_support.MONITORED_DIRS) __kupfer_settings__.connect("plugin-setting-changed", self._setting_changed) def finalize(self): if vbox_support: vbox_support.unload_module() def is_dynamic(self): return vbox_support.IS_DYNAMIC def get_items(self): for machine_id, machine_name, machine_desc in vbox_support.get_machines(): yield VirtualMachine(machine_id, machine_name, machine_desc) def get_description(self): return None def get_icon_name(self): return vbox_support.ICON def provides(self): yield VirtualMachine def _setting_changed(self, _setting, _key, _value): if vbox_support: vbox_support.reload_settings() kupfer-v208/kupfer/plugin/virtualbox/constants.py000066400000000000000000000006621176220042200224260ustar00rootroot00000000000000# -*- coding: UTF-8 -*- ''' virtualbox_const_support.py Constants for VirtualBox. ''' __author__ = "Karol Będkowski " __version__ = '0.3' # virtual machine states VM_STATE_POWEROFF = 0 VM_STATE_POWERON = 1 VM_STATE_PAUSED = 2 VM_STATE_SAVED = 3 # virtual machine actions VM_START_NORMAL = 1 VM_START_HEADLESS = 2 VM_PAUSE = 3 VM_POWEROFF = 4 VM_ACPI_POWEROFF = 5 VM_REBOOT = 6 VM_RESUME = 7 VM_SAVE = 8 kupfer-v208/kupfer/plugin/virtualbox/ose_support.py000066400000000000000000000076401176220042200227770ustar00rootroot00000000000000# -*- coding: UTF-8 -*- ''' virtualbox_ose_support.py Control VirtualBox via command-line interface. Support both Sun VirtualBox and VirtualBox OpenSource Edition. ''' from __future__ import with_statement __author__ = "Karol Będkowski " __version__ = '0.3' import os from xml.dom import minidom from kupfer import pretty, utils from kupfer.plugin.virtualbox import constants as vbox_const _VBOX_CONFIG_DIR = os.path.expanduser('~/.VirtualBox/') _VBOX_CONFIG_FILE = os.path.join(_VBOX_CONFIG_DIR, 'VirtualBox.xml') MONITORED_DIRS = (_VBOX_CONFIG_DIR, ) IS_DYNAMIC = False ICON = "virtualbox-ose" APP_ID = "virtualbox-ose" # parameters for VBoxManage _ACTIONS = { vbox_const.VM_POWEROFF: 'poweroff', vbox_const.VM_ACPI_POWEROFF: 'acpipowerbutton', vbox_const.VM_PAUSE: 'pause', vbox_const.VM_REBOOT: 'reset', vbox_const.VM_RESUME: 'resume', vbox_const.VM_SAVE: 'savestate', } def get_machine_state(vm_uuid): ''' check vms state (on/off/paused) ''' state = vbox_const.VM_STATE_POWEROFF try: str_state = 'poweroff' with os.popen('VBoxManage showvminfo %s --machinereadable' % vm_uuid) \ as pinfo: for line in pinfo: if line.startswith('VMState="'): str_state = line.strip()[9:-1] break if str_state == 'paused': state = vbox_const.VM_STATE_PAUSED elif str_state == 'running': state = vbox_const.VM_STATE_POWERON elif str_state == 'saved': state = vbox_const.VM_STATE_SAVED except IOError, err: pretty.print_error(__name__, 'get_machine_state', vm_uuid, 'error', err) state = vbox_const.VM_STATE_POWEROFF return state def vm_action(action, vm_uuid): ''' change state of the virtual machine. Call VBoxManage. @param action - one of the const VM_* @param vm_uuid - virtual machine uuid ''' if action == vbox_const.VM_START_NORMAL: utils.spawn_async(['VBoxManage', 'startvm', vm_uuid, '--type', 'gui']) elif action == vbox_const.VM_START_HEADLESS: utils.spawn_async(['VBoxManage', 'startvm', vm_uuid, '--type', 'headless']) else: command = _ACTIONS[action] utils.spawn_async(['VBoxManage', 'controlvm', vm_uuid, command]) def _get_virtual_machines(config_file): ''' load (virtual machine uuid, path to vm config) from virtualbox configuration. @param config_file - path to VirtualBox.xml file ''' try: dtree = minidom.parse(config_file) machine_registry = dtree.getElementsByTagName('MachineRegistry')[0] for machine in machine_registry.getElementsByTagName('MachineEntry'): yield (machine.getAttribute('uuid')[1:-1], machine.getAttribute('src')) except StandardError, err: pretty.print_error(__name__, '_get_virtual_machines', config_file, 'error', err) def _get_machine_info(vm_uuid, config_file): ''' load information about virtual machines from its configuration file. @param vm_uuid - uuid virtual machine @param config_file - path to vm configuration file ''' if not os.path.isfile(config_file): return None, None try: dtree = minidom.parse(config_file) machine_registry = dtree.getElementsByTagName('Machine')[0] os_type = machine_registry.getAttribute('OSType') name = machine_registry.getAttribute('name') description = None for machine_registry_child in machine_registry.childNodes: if machine_registry_child.nodeName == 'Description': if machine_registry_child.hasChildNodes(): description = machine_registry_child.firstChild.nodeValue break return (name, description or os_type) except StandardError, err: pretty.print_error(__name__, '_get_machine_info', vm_uuid, 'error' + \ config_file, err) return None, None def get_machines(): if os.path.isfile(_VBOX_CONFIG_FILE): for vm_uuid, config in _get_virtual_machines(_VBOX_CONFIG_FILE): if not os.path.isabs(config): config = os.path.join(os.path.dirname(_VBOX_CONFIG_FILE), config) name, description = _get_machine_info(vm_uuid, config) if name: yield (vm_uuid, name, description) def unload(): pass kupfer-v208/kupfer/plugin/virtualbox/vboxapi4_support.py000066400000000000000000000104201176220042200237330ustar00rootroot00000000000000# -*- coding: UTF-8 -*- ''' virtualbox_vboxapi_support.py Control VirtualBox via Python interface (vboxapi). Only (?) Sun VirtualBox (no OSE). ''' __author__ = "Karol Będkowski " __version__ = "2011-03-06" import vboxapi from kupfer import pretty # check api try: vboxapi.VirtualBoxReflectionInfo(None).SessionState_Locked except AttributeError: raise ImportError() from kupfer.plugin.virtualbox import constants as vbox_const MONITORED_DIRS = None IS_DYNAMIC = False ICON = "VBox" APP_ID = "virtualbox" _ACTIONS = { vbox_const.VM_POWEROFF: lambda c: c.powerDown(), vbox_const.VM_ACPI_POWEROFF: lambda c: c.powerButton(), vbox_const.VM_PAUSE: lambda c: c.pause(), vbox_const.VM_REBOOT: lambda c: c.reset(), vbox_const.VM_RESUME: lambda c: c.resume(), vbox_const.VM_SAVE: lambda c: c.saveState(), } def _get_object_session(): ''' get new session to vm ''' vbox, session = None, None try: vbox = vboxapi.VirtualBoxManager(None, None) session = vbox.mgr.getSessionObject(vbox.vbox) except Exception, err: pretty.print_error(__name__, 'virtualbox: get session error ', err) return vbox, session def _get_existing_session(vm_uuid): ''' get existing session by machine uuid ''' vbox, session = None, None try: vbox = vboxapi.VirtualBoxManager(None, None) session = vbox.mgr.getSessionObject(vbox.vbox) except Exception, err: pretty.print_error(__name__, 'virtualbox: get session error', vm_uuid, err) return vbox, session def get_machine_by_id(vbox, mid): try: mach = vbox.getMachine(mid) except: mach = vbox.findMachine(mid) return mach def get_machine_state(machine_id): ''' check vms state (on/off/paused) ''' vbox, vbox_sess = _get_object_session() if vbox_sess is None: return vbox_const.VM_STATE_POWEROFF state = vbox_const.VM_STATE_POWERON try: machine = get_machine_by_id(vbox.vbox, machine_id) machine_state = machine.state if machine_state == vbox.constants.MachineState_Paused: state = vbox_const.VM_STATE_PAUSED elif machine_state in (vbox.constants.MachineState_PoweredOff, vbox.constants.MachineState_Aborted, vbox.constants.MachineState_Starting): state = vbox_const.VM_STATE_POWEROFF elif machine_state == vbox.constants.MachineState_Saved: state = vbox_const.VM_STATE_SAVED except Exception, err: # exception == machine is off (xpcom.Exception) pretty.print_debug(__name__, 'get_machine_state', machine_state, err) # silently set state to off state = vbox_const.VM_STATE_POWEROFF return state def _machine_start(vm_uuid, mode): ''' Start virtual machine @param vm_uuid - uuid of virtual machine @param mode - mode: gui, headless ''' vbox, session = _get_object_session() if session: try: mach = get_machine_by_id(vbox.vbox, vm_uuid) remote_sess = mach.launchVMProcess(session, mode, '') remote_sess.waitForCompletion(-1) session.unlockMachine() except Exception, err: pretty.print_error(__name__, "StartVM:", vm_uuid, "Mode ", mode, "error", err) def _execute_machine_action(vm_uuid, action): ''' Start virtual machine @param vm_uuid - uuid of virtual machine @param action - function called on vbox session ''' vbox, session = _get_existing_session(vm_uuid) try: mach = get_machine_by_id(vbox.vbox, vm_uuid) mach.lockMachine(session, vbox.constants.LockType_Shared) action(session.console) session.unlockMachine() except Exception, err: pretty.print_error(__name__, "_execute_machine_action:", repr(action), " vm:", vm_uuid, "error", err) def vm_action(action, vm_uuid): ''' change state of the virtual machine @param action - one of the const VM_* @param vm_uuid - virtual machine uuid ''' if action == vbox_const.VM_START_NORMAL: _machine_start(vm_uuid, 'gui') elif action == vbox_const.VM_START_HEADLESS: _machine_start(vm_uuid, 'headless') else: command = _ACTIONS[action] _execute_machine_action(vm_uuid, command) def get_machines(): ''' Get generator of items: (machine uuid, machine name, machine description) ''' vbox, vbox_sess = _get_object_session() if vbox_sess is None: return machines = vbox.getArray(vbox.vbox, 'machines') for machine in machines: if not machine.accessible: continue description = machine.description or machine.OSTypeId yield (machine.id, machine.name, description) def unload(): pass kupfer-v208/kupfer/plugin/virtualbox/vboxapi_support.py000066400000000000000000000116061176220042200236560ustar00rootroot00000000000000# -*- coding: UTF-8 -*- ''' virtualbox_vboxapi_support.py Control VirtualBox via Python interface (vboxapi). Only (?) Sun VirtualBox (no OSE). ''' __author__ = "Karol Będkowski " __version__ = "2011-03-06" from kupfer import pretty import vboxapi from kupfer.plugin.virtualbox import constants as vbox_const MONITORED_DIRS = None IS_DYNAMIC = False ICON = "VBox" APP_ID = "virtualbox" _ACTIONS = { vbox_const.VM_POWEROFF: lambda c: c.powerDown(), vbox_const.VM_ACPI_POWEROFF: lambda c: c.powerButton(), vbox_const.VM_PAUSE: lambda c: c.pause(), vbox_const.VM_REBOOT: lambda c: c.reset(), vbox_const.VM_RESUME: lambda c: c.resume(), vbox_const.VM_SAVE: lambda c: c.saveState(), } def _get_object_session(): ''' get new session to vm ''' pretty.print_debug(__name__, '_get_object_session start') vbox, session = None, None try: vbox = vboxapi.VirtualBoxManager(None, None) session = vbox.mgr.getSessionObject(vbox.vbox) except Exception, err: pretty.print_error(__name__, 'virtualbox: get session error ', err) pretty.print_debug(__name__, '_get_object_session finished', vbox, session) return vbox, session def _get_existing_session(vm_uuid): ''' get existing session by machine uuid ''' pretty.print_debug(__name__, '_get_existing_session start') vbox, session = None, None try: vbox = vboxapi.VirtualBoxManager(None, None) session = vbox.mgr.getSessionObject(vbox.vbox) vbox.vbox.openExistingSession(session, vm_uuid) except Exception, err: pretty.print_error(__name__, 'virtualbox: get session error', vm_uuid, err) pretty.print_debug(__name__, '_get_existing_session finished', vbox, session) return vbox, session def get_machine_state(machine_id): ''' check vms state (on/off/paused) ''' pretty.print_debug(__name__, 'get_machine_state', machine_id) vbox, vbox_sess = _get_object_session() if vbox_sess is None: return vbox_const.VM_STATE_POWEROFF state = vbox_const.VM_STATE_POWERON try: vbox.vbox.openExistingSession(vbox_sess, machine_id) machine_state = vbox_sess.machine.state if machine_state == vbox.constants.MachineState_Paused: state = vbox_const.VM_STATE_PAUSED elif machine_state in (vbox.constants.MachineState_PoweredOff, vbox.constants.MachineState_Aborted, vbox.constants.MachineState_Starting): state = vbox_const.VM_STATE_POWEROFF elif machine_state == vbox.constants.MachineState_Saved: state = vbox_const.VM_STATE_SAVED except Exception, err: # exception == machine is off (xpcom.Exception) # silently set state to off state = vbox_const.VM_STATE_POWEROFF pretty.print_debug(__name__, 'get_machine_state error', err) try: if vbox_sess.state == vbox.constants.SessionState_Open: vbox_sess.close() except Exception: # varoius errors (xpcom.Exception) pass pretty.print_debug(__name__, 'get_machine_state finish', machine_id, state) return state def _machine_start(vm_uuid, mode): ''' Start virtual machine @param vm_uuid - uuid of virtual machine @param mode - mode: gui, headless ''' vbox, session = _get_object_session() if session: try: remote_sess = vbox.vbox.openRemoteSession(session, vm_uuid, mode, '') remote_sess.waitForCompletion(-1) except Exception, err: pretty.print_error(__name__, "StartVM:", vm_uuid, "Mode ", mode, "error", err) try: if session.state == vbox.constants.SessionState_Open: session.close() except Exception: # varoius errors (xpcom.Exception) pass def _execute_machine_action(vm_uuid, action): ''' Start virtual machine @param vm_uuid - uuid of virtual machine @param action - function called on vbox session ''' vbox, session = _get_existing_session(vm_uuid) try: action(session.console) except Exception, err: pretty.print_error(__name__, "_execute_machine_action:", repr(action), " vm:", vm_uuid, "error", err) try: if session.state == vbox.constants.SessionState_Open: session.close() except Exception: # varoius errors (xpcom.Exception) pass def vm_action(action, vm_uuid): ''' change state of the virtual machine @param action - one of the const VM_* @param vm_uuid - virtual machine uuid ''' if action == vbox_const.VM_START_NORMAL: _machine_start(vm_uuid, 'gui') elif action == vbox_const.VM_START_HEADLESS: _machine_start(vm_uuid, 'headless') else: command = _ACTIONS[action] _execute_machine_action(vm_uuid, command) def get_machines(): ''' Get generator of items: (machine uuid, machine name, machine description) ''' pretty.print_debug(__name__, 'get_machines start') vbox, vbox_sess = _get_object_session() if vbox_sess is None: return machines = vbox.getArray(vbox.vbox, 'machines') for machine in machines: pretty.print_debug(__name__, 'get_machines; found machine', machine.id, machine.name) description = machine.description or machine.OSTypeId yield (machine.id, machine.name, description) pretty.print_debug(__name__, 'get_machines finished') def unload(): pass kupfer-v208/kupfer/plugin/volumes.py000066400000000000000000000052121176220042200177010ustar00rootroot00000000000000__kupfer_name__ = _("Volumes and Disks") __kupfer_sources__ = ("VolumesSource", ) __description__ = _("Mounted volumes and disks") __version__ = "" __author__ = "Ulrik Sverdrup " import gio from kupfer.objects import Action, Source, FileLeaf from kupfer.obj.fileactions import Open, OpenTerminal from kupfer import utils class Volume (FileLeaf): """ The Volume class actually represents one instance of GIO's GMount (as long as it is mounted) """ # NOTE: marking as non-serializable serializable = None def __init__(self, volume): self.volume = volume fil = self.volume.get_root() path = fil.get_path() super(Volume, self).__init__(obj=path, name=volume.get_name()) self.kupfer_add_alias(fil.get_basename()) def get_actions(self): yield Open() yield OpenTerminal() if self.volume.can_eject(): yield Eject() elif self.volume.can_unmount(): yield Unmount() def is_valid(self): vm = gio.volume_monitor_get() return any(self.volume == v for v in vm.get_mounts()) def get_description(self): return _("Volume mounted at %s") % \ utils.get_display_path_for_bytestring(self.object) def get_gicon(self): return self.volume.get_icon() def get_icon_name(self): return "drive-removable-media" class Unmount (Action): def __init__(self, name=None): super(Unmount, self).__init__(name or _("Unmount")) def eject_callback(self, mount, async_result, ctx): try: mount.eject_finish(async_result) except gio.Error: ctx.register_late_error() def unmount_callback(self, mount, async_result, ctx): try: mount.unmount_finish(async_result) except gio.Error: ctx.register_late_error() def wants_context(self): return True def activate(self, leaf, ctx): if not leaf.is_valid(): return vol = leaf.volume if vol.can_eject(): vol.eject(self.eject_callback, user_data=ctx) elif vol.can_unmount(): vol.unmount(self.unmount_callback, user_data=ctx) def get_description(self): return _("Unmount this volume") def get_icon_name(self): return "media-eject" class Eject (Unmount): def __init__(self): super(Eject, self).__init__(_("Eject")) def get_description(self): return _("Unmount and eject this media") class VolumesSource (Source): def __init__(self, name=_("Volumes and Disks")): super(VolumesSource, self).__init__(name) def is_dynamic(self): return True def get_items(self): vm = gio.volume_monitor_get() # get_mounts gets all mounted removable media return (Volume(v) for v in vm.get_mounts()) def get_description(self): return _("Mounted volumes and disks") def get_icon_name(self): return "drive-removable-media" def provides(self): yield Volume kupfer-v208/kupfer/plugin/websearch.py000066400000000000000000000140071176220042200201540ustar00rootroot00000000000000__kupfer_name__ = _("Search the Web") __kupfer_sources__ = ("OpenSearchSource", ) __kupfer_text_sources__ = () __kupfer_actions__ = ( "SearchFor", "SearchWithEngine", ) __description__ = _("Search the web with OpenSearch search engines") __version__ = "" __author__ = "Ulrik Sverdrup " import locale import os import urllib import xml.etree.cElementTree as ElementTree from kupfer.objects import Action, Source, Leaf from kupfer.objects import TextLeaf from kupfer import utils, config from kupfer.plugin import firefox_support def _noescape_urlencode(items): """Assemble an url param string from @items, without using any url encoding. """ return "?" + "&".join("%s=%s" % (n,v) for n,v in items) def _urlencode(word): """Urlencode a single string of bytes @word""" return urllib.urlencode({"q": word})[2:] def _do_search_engine(terms, search_url, encoding="UTF-8"): """Show an url searching for @search_url with @terms""" search_url = search_url.encode(encoding, "ignore") terms_enc = terms.encode(encoding, "ignore") query_url = search_url.replace("{searchTerms}", _urlencode(terms_enc)) utils.show_url(query_url) class SearchWithEngine (Action): """TextLeaf -> SearchWithEngine -> SearchEngine""" def __init__(self): Action.__init__(self, _("Search With...")) def activate(self, leaf, iobj): coding = iobj.object.get("InputEncoding") url = iobj.object["Url"] _do_search_engine(leaf.object, url, encoding=coding) def item_types(self): yield TextLeaf def requires_object(self): return True def object_types(self): yield SearchEngine def object_source(self, for_item=None): return OpenSearchSource() def get_description(self): return _("Search the web with OpenSearch search engines") def get_icon_name(self): return "edit-find" class SearchFor (Action): """SearchEngine -> SearchFor -> TextLeaf This is the opposite action to SearchWithEngine """ def __init__(self): Action.__init__(self, _("Search For...")) def activate(self, leaf, iobj): coding = leaf.object.get("InputEncoding") url = leaf.object["Url"] terms = iobj.object _do_search_engine(terms, url, encoding=coding) def item_types(self): yield SearchEngine def requires_object(self): return True def object_types(self): yield TextLeaf def get_description(self): return _("Search the web with OpenSearch search engines") def get_icon_name(self): return "edit-find" class SearchEngine (Leaf): def get_description(self): desc = self.object.get("Description") return desc if desc != unicode(self) else None def get_icon_name(self): return "text-html" def coroutine(func): """Coroutine decorator: Start the coroutine""" def startcr(*ar, **kw): cr = func(*ar, **kw) cr.next() return cr return startcr class OpenSearchParseError (StandardError): pass class OpenSearchSource (Source): def __init__(self): Source.__init__(self, _("Search Engines")) @coroutine def _parse_opensearch(self, target): """This is a coroutine to parse OpenSearch files""" vital_keys = set(["Url", "ShortName"]) keys = set(["Description", "Url", "ShortName", "InputEncoding"]) #mozns = '{http://www.mozilla.org/2006/browser/search/}' #osns = '{http://a9.com/-/spec/opensearch/1.1/}' roots = ('OpenSearchDescription', 'SearchPlugin') gettagname = lambda tag: tag.rsplit("}", 1)[-1] def parse_etree(etree, name=None): if not gettagname(etree.getroot().tag) in roots: raise OpenSearchParseError("Search %s has wrong type" % name) search = {} for child in etree.getroot(): tagname = gettagname(child.tag) if tagname not in keys: continue # Only pick up Url tags with type="text/html" if tagname == "Url": if (child.get("type") == "text/html" and child.get("template")): text = child.get("template") params = {} for ch in child.getchildren(): if gettagname(ch.tag) == "Param": params[ch.get("name")] = ch.get("value") if params: text += _noescape_urlencode(params.items()) else: continue else: text = (child.text or "").strip() search[tagname] = text if not vital_keys.issubset(search.keys()): raise OpenSearchParseError("Search %s missing keys" % name) return search while True: try: path = (yield) etree = ElementTree.parse(path) target.send(parse_etree(etree, name=path)) except StandardError, exc: self.output_debug("%s: %s" % (type(exc).__name__, exc)) def get_items(self): plugin_dirs = [] # accept in kupfer data dirs plugin_dirs.extend(config.get_data_dirs("searchplugins")) # firefox in home directory ffx_home = firefox_support.get_firefox_home_file("searchplugins") if ffx_home: plugin_dirs.append(ffx_home) plugin_dirs.extend(config.get_data_dirs("searchplugins", package="firefox")) plugin_dirs.extend(config.get_data_dirs("searchplugins", package="iceweasel")) addon_dir = "/usr/lib/firefox-addons/searchplugins" cur_lang, _ignored = locale.getlocale(locale.LC_MESSAGES) suffixes = ["en-US"] if cur_lang: suffixes = [cur_lang.replace("_", "-"), cur_lang[:2]] + suffixes for suffix in suffixes: addon_lang_dir = os.path.join(addon_dir, suffix) if os.path.exists(addon_lang_dir): plugin_dirs.append(addon_lang_dir) break self.output_debug("Found following searchplugins directories", sep="\n", *plugin_dirs) @coroutine def collect(seq): """Collect items in list @seq""" while True: seq.append((yield)) searches = [] collector = collect(searches) parser = self._parse_opensearch(collector) # files are unique by filename to allow override visited_files = set() for pdir in plugin_dirs: try: for f in os.listdir(pdir): if f in visited_files: continue parser.send(os.path.join(pdir, f)) visited_files.add(f) except EnvironmentError, exc: self.output_error(exc) for s in searches: yield SearchEngine(s, s["ShortName"]) def should_sort_lexically(self): return True def provides(self): yield SearchEngine def get_icon_name(self): return "applications-internet" kupfer-v208/kupfer/plugin/wikipedia.py000066400000000000000000000023641176220042200201620ustar00rootroot00000000000000""" This is a simple plugin demonstration, how to add single, simple actions """ __kupfer_name__ = _("Wikipedia") __kupfer_sources__ = () __kupfer_actions__ = ("WikipediaSearch", ) __description__ = _("Search in Wikipedia") __version__ = "" __author__ = "Ulrik Sverdrup " import urllib from kupfer.objects import Action, TextLeaf from kupfer import utils, plugin_support __kupfer_settings__ = plugin_support.PluginSettings( { "key": "lang", "label": _("Wikipedia language"), "type": str, # TRANS: Default wikipedia language code "value": _("en"), }, ) class WikipediaSearch (Action): def __init__(self): Action.__init__(self, _("Search in Wikipedia")) def activate(self, leaf): # Send in UTF-8 encoding lang_code = __kupfer_settings__["lang"] search_url="http://%s.wikipedia.org/w/index.php?title=Special:Search&go=Go" % lang_code # will encode search=text, where `text` is escaped query_url = search_url + "&" + urllib.urlencode({"search": leaf.object}) utils.show_url(query_url) def item_types(self): yield TextLeaf def get_description(self): lang_code = __kupfer_settings__["lang"] return _("Search for this term in %s.wikipedia.org") % lang_code def get_icon_name(self): return "edit-find" kupfer-v208/kupfer/plugin/windows.py000066400000000000000000000210461176220042200177040ustar00rootroot00000000000000__kupfer_name__ = _("Window List") __kupfer_sources__ = ("WindowsSource", "WorkspacesSource", ) __description__ = _("All windows on all workspaces") __version__ = "2010-01-08" __author__ = "Ulrik Sverdrup " import wnck from kupfer.objects import Leaf, Action, Source from kupfer.weaklib import gobject_connect_weakly from kupfer.obj.helplib import PicklingHelperMixin class WindowLeaf (Leaf): def get_actions(self): yield WindowActivateWorkspace() yield WindowMoveToWorkspace() yield WindowAction(_("Activate"), "activate", time=True) W = self.object T = type(W) yield ToggleAction(_("Shade"), _("Unshade"), "shade", "unshade", W.is_shaded(), T.is_shaded) yield ToggleAction(_("Minimize"), _("Unminimize"), "minimize", "unminimize", W.is_minimized(), T.is_minimized, time=True, icon="list-remove") yield ToggleAction(_("Maximize"), _("Unmaximize"), "maximize", "unmaximize", W.is_maximized(), T.is_maximized, icon="list-add") yield ToggleAction(_("Maximize Vertically"), _("Unmaximize Vertically"), "maximize_vertically", "unmaximize_vertically", W.is_maximized_vertically(), T.is_maximized_vertically, icon="list-add") yield WindowAction(_("Close"), "close", time=True, icon="window-close") def is_valid(self): return self.object and self.object.get_xid() def get_description(self): workspace = self.object.get_workspace() if not workspace: return u"" nr, name = workspace.get_number(), workspace.get_name() # TRANS: Window on (Workspace name), window description return _("Window on %(wkspc)s") % {"wkspc": name} def get_icon_name(self): return "gnome-window-manager" class FrontmostWindow (WindowLeaf): qf_id = "frontwindow" def __init__(self): WindowLeaf.__init__(self, None, _("Frontmost Window")) # HACK: Make self.object a property # so that this leaf is *not* immutable def _set_object(self, obj): pass def _get_object(self): scr = wnck.screen_get_default() active = scr.get_active_window() or scr.get_previously_active_window() # FIXME: Ignore Kupfer's main window reliably if active and active.get_application().get_name() != "kupfer.py": if not active.is_skip_tasklist(): return active wspc = scr.get_active_workspace() for win in reversed(scr.get_windows_stacked()): if not win.is_skip_tasklist(): if win.is_on_workspace(wspc): return win object = property(_get_object, _set_object) def repr_key(self): return "" def get_description(self): return self.object and self.object.get_name() class NextWindow (WindowLeaf): qf_id = "nextwindow" def __init__(self): WindowLeaf.__init__(self, None, _("Next Window")) def _set_object(self, obj): pass def _get_object(self): scr = wnck.screen_get_default() wspc = scr.get_active_workspace() for win in scr.get_windows_stacked(): if not win.is_skip_tasklist(): if win.is_on_workspace(wspc): return win object = property(_get_object, _set_object) def repr_key(self): return "" def get_description(self): return self.object and self.object.get_name() class WindowActivateWorkspace (Action): def __init__(self, name=_("Go To")): super(WindowActivateWorkspace, self).__init__(name) def wants_context(self): return True def activate (self, leaf, ctx): window = leaf.object workspace = window.get_workspace() time = ctx.environment.get_timestamp() workspace.activate(time) window.activate(time) def get_description(self): return _("Jump to this window's workspace and focus") def get_icon_name(self): return "go-jump" class WindowMoveToWorkspace (Action): def __init__(self): Action.__init__(self, _("Move To...")) def wants_context(self): return True def activate(self, leaf, iobj, ctx): window = leaf.object workspace = iobj.object window.move_to_workspace(workspace) time = ctx.environment.get_timestamp() workspace.activate(time) window.activate(time) def requires_object(self): return True def object_types(self): yield Workspace def object_source(self, for_item=None): return WorkspacesSource() def valid_object(self, iobj, for_item): window = for_item.object return not window.is_on_workspace(iobj.object) def get_icon_name(self): return "forward" class WindowAction (Action): def __init__(self, name, action, time=False, icon=None): super(Action, self).__init__(name) if not action: action = name.lower() self.action = action self.time = time self.icon_name = icon def repr_key(self): return self.action def wants_context(self): return True def activate(self, leaf, ctx): time = self._get_time(ctx) if self.time else None self._perform_action(self.action, leaf, time) @classmethod def _perform_action(cls, action_attr, leaf, time=None): window = leaf.object action_method = getattr(window, action_attr) if time is not None: action_method(time) else: action_method() @classmethod def _get_time(cls, ctx): # @time will be != 0 if we are "inside" # a current gtk event return ctx.environment.get_timestamp() def get_icon_name(self): if not self.icon_name: return super(WindowAction, self).get_icon_name() return self.icon_name class ToggleAction (WindowAction): """A toggle action, performing the enable / disable action as needed, for example minimize/unminimize. @istate: Initial state @predicate: Callable for state taking the window object as only argument """ def __init__(self, ename, uname, eaction, uaction, istate, predicate, time=False, icon=None): name = uname if istate else ename WindowAction.__init__(self, name, eaction, time=time, icon=icon) self.predicate = predicate self.uaction = uaction def activate(self, leaf, ctx): if self.predicate(leaf.object): # only use time on the disable action time = self._get_time(ctx) if self.time else None self._perform_action(self.uaction, leaf, time) else: self._perform_action(self.action, leaf) class WindowsSource (Source): def __init__(self, name=_("Window List")): super(WindowsSource, self).__init__(name) # "preload" windows: Ask for them early # since the first call "primes" the event loop # and always comes back empty screen = wnck.screen_get_default() screen.get_windows_stacked() def is_dynamic(self): return True def get_items(self): # wnck should be "primed" now to return the true list screen = wnck.screen_get_default() yield FrontmostWindow() yield NextWindow() for win in reversed(screen.get_windows_stacked()): if not win.is_skip_tasklist(): name, app = (win.get_name(), win.get_application().get_name()) if name != app and app not in name: name = "%s (%s)" % (name, app) yield WindowLeaf(win, name) def get_description(self): return _("All windows on all workspaces") def get_icon_name(self): return "gnome-window-manager" def provides(self): yield WindowLeaf class Workspace (Leaf): def get_actions(self): yield ActivateWorkspace() def repr_key(self): return self.object.get_number() def get_icon_name(self): return "gnome-window-manager" def get_description(self): screen = wnck.screen_get_default() if screen: n_windows = sum([1 for w in screen.get_windows() if w.get_workspace() == self.object]) w_msg = (ngettext("%d window", "%d windows", n_windows) % n_windows) active_wspc = screen.get_active_workspace() if active_wspc == self.object: return _("Active workspace") + " (%s)" % w_msg if n_windows: return u"(%s)" % w_msg return None class ActivateWorkspace (Action): rank_adjust = 5 def __init__(self): Action.__init__(self, _("Go To")) def wants_context(self): return True def activate (self, leaf, ctx): workspace = leaf.object time = ctx.environment.get_timestamp() workspace.activate(time) def get_description(self): return _("Jump to this workspace") def get_icon_name(self): return "go-jump" class WorkspacesSource (Source, PicklingHelperMixin): def __init__(self): Source.__init__(self, _("Workspaces")) screen = wnck.screen_get_default() screen.get_workspaces() def pickle_prepare(self): self.mark_for_update() def initialize(self): screen = wnck.screen_get_default() gobject_connect_weakly(screen, "workspace-created", self._changed) gobject_connect_weakly(screen, "workspace-destroyed", self._changed) def _changed(self, screen, workspace): self.mark_for_update() def get_items(self): # wnck should be "primed" now to return the true list screen = wnck.screen_get_default() for wspc in screen.get_workspaces(): yield Workspace(wspc, wspc.get_name()) def get_icon_name(self): return "gnome-window-manager" def provides(self): yield Workspace kupfer-v208/kupfer/plugin/zim.py000066400000000000000000000252441176220042200170150ustar00rootroot00000000000000# -*- coding: UTF-8 -*- from __future__ import with_statement __kupfer_name__ = _("Zim") __kupfer_sources__ = ("ZimPagesSource", ) __kupfer_actions__ = ( "CreateZimPage", "CreateZimPageInNotebook", "CreateZimQuickNote", ) __description__ = _("Access to Pages stored in Zim - " "A Desktop Wiki and Outliner") __version__ = "2011-12-03" __author__ = "Karol Będkowski " import os import time import gio import glib from kupfer.objects import Leaf, Action, Source, TextLeaf, TextSource from kupfer.obj.apps import AppLeafContentMixin from kupfer import config, utils, pretty, icons, plugin_support __kupfer_settings__ = plugin_support.PluginSettings( { "key": "page_name_starts_colon", "label": _("Page names start with :colon"), "type": bool, "value": False, }, { "key": "quicknote_basename", "label": _("Default page name for quick notes"), "type": str, "value": _("Note %x %X"), "tooltip": _("Strftime tags can be used: %H - hour, %M - minutes, etc\n" "Please check python documentation for details.\n" "NOTE: comma will be replaced by _"), }, { "key": "quicknote_namespace", "label": _("Default namespace for quick notes"), "type": str, "value": "", }, ) ''' Changes: 2011-12-02 Karol Będkowski fix loading notebook list from zim 0.53 2011-12-03 Karol Będkowski add CreateZimQuickNote action TODO: use FilesystemWatchMixin (?) ''' def _start_zim(notebook, page): ''' Start zim and open given notebook and page. ''' utils.spawn_async(("zim", notebook, page.replace("'", "_"))) class ZimPage(Leaf): """ Represent single Zim page """ def __init__(self, page_id, page_name, notebook_path, notebook_name): Leaf.__init__(self, page_id, page_name) self.page = page_name self.notebook = notebook_path self.notebook_name = notebook_name def get_actions(self): yield OpenZimPage() yield CreateZimSubPage() def get_description(self): return _('Zim Page from Notebook "%s"') % self.notebook_name def get_icon_name(self): return "text-x-generic" class CreateZimPage(Action): """ Create new page in default notebook """ def __init__(self): Action.__init__(self, _('Create Zim Page')) def activate(self, leaf): notebook = _get_default_notebook() _start_zim(notebook, ":" + leaf.object.strip(':')) def get_description(self): return _("Create page in default notebook") def get_icon_name(self): return 'document-new' def item_types(self): yield TextLeaf class CreateZimPageInNotebook(Action): """ Create new page in default notebook """ def __init__(self): Action.__init__(self, _('Create Zim Page In...')) def activate(self, leaf, iobj): _start_zim(iobj.object, ":" + leaf.object.strip(':')) def get_icon_name(self): return 'document-new' def item_types(self): yield TextLeaf def requires_object(self): return True def object_types(self): yield ZimNotebook def object_source(self, for_item=None): return ZimNotebooksSource() class CreateZimQuickNote(Action): """ Create new page using quicknote plugin """ def __init__(self): Action.__init__(self, _('Insert QuickNote into Zim')) def activate(self, leaf): self._create_note(leaf.object) def activate_multiple(self, objects): text = '\n'.join(str(leaf.object) for leaf in objects) self._create_note(text) def get_description(self): return _("Quick note selected text into Zim notebook") def get_icon_name(self): return 'document-new' def item_types(self): yield TextLeaf def _create_note(self, text): argv = ['zim', '--plugin', 'quicknote', 'input=stdin'] basename = __kupfer_settings__['quicknote_basename'] if basename: try: basename = time.strftime(basename, time.localtime()) basename = basename.replace(':', '_') except: pass argv.append("basename=" + basename) namespace = __kupfer_settings__['quicknote_namespace'] if namespace: argv.append("namespace=" + namespace) def finish_callback(acommand, stdout, stderr): pretty.print_debug(__name__, "CreateZimQuickNote.finish_callback", acommand, stdout, stderr) utils.AsyncCommand(argv, finish_callback, None, stdin=text) class OpenZimPage(Action): """ Open Zim page """ rank_adjust = 10 def __init__(self): Action.__init__(self, _('Open')) def activate(self, leaf): _start_zim(leaf.notebook, leaf.page) def get_icon_name(self): return 'document-open' def item_types(self): yield ZimPage class CreateZimSubPage(Action): """ Open Zim page """ def __init__(self): Action.__init__(self, _('Create Subpage...')) def activate(self, leaf, iobj): _start_zim(leaf.notebook, leaf.page + ":" + iobj.object.strip(':')) def get_icon_name(self): return 'document-new' def item_types(self): yield ZimPage def requires_object(self): return True def object_types(self): yield TextLeaf def object_source(self, for_item=None): return TextSource() def _read_zim_notebooks_old(zim_notebooks_file): ''' Yield (notebook name, notebook path) from zim config @notebook_name: Unicode name @notebook_path: Filesystem byte string ''' # We assume the notebook description is UTF-8 encoded with open(zim_notebooks_file, 'r') as notebooks_file: for line in notebooks_file.readlines(): if not line.startswith('_default_'): notebook_name, notebook_path = line.strip().split('\t', 2) notebook_name = notebook_name.decode("UTF-8", "replace") notebook_path = os.path.expanduser(notebook_path) yield (notebook_name, notebook_path) def _get_default_notebook(): ''' Find default notebook ''' zim_notebooks_file = config.get_config_file("notebooks.list", package="zim") if not zim_notebooks_file: pretty.print_error(__name__, "Zim notebooks.list not found") return None lines = None with open(zim_notebooks_file, 'r') as notebooks_file: lines = notebooks_file.readlines() if not lines: return '' if lines[0].strip() == '[NotebookList]': # new version # first section looks like: # [NotebookList] # Default=~/doc/zim # ~/doc/zim # ~/tmp/test for line in lines[1:]: if line.startswith('Default='): _dummy, name = line.split('=', 1) name = name.strip() if name: pretty.print_debug(__name__, '_get_default_notebook:', name) return name return line return '' # old version # format '\t' name = '' for line in lines: if '\t' in line: notebook_name, notebook_path = line.strip().split('\t', 1) if notebook_name == '_default_': # _default_ is pointing at name of the default notebook name = notebook_path.decode("UTF-8", "replace") else: # assume first notebook as default name = notebook_name.decode("UTF-8", "replace") break pretty.print_debug(__name__, '_get_default_notebook (old):', name) return name def _read_zim_notebook_name(notebook_path): npath = os.path.join(notebook_path, "notebook.zim") with open(npath, "r") as notebook_file: for line in notebook_file: if line.startswith("name="): _ignored, b_name = line.strip().split("=", 1) us_name = b_name.decode("unicode_escape") return us_name return os.path.basename(notebook_path) def _read_zim_notebooks_new(zim_notebooks_file): ''' Yield (notebook name, notebook path) from zim config NOTE: we can't use ConfigParser - zim config file is not parsable Sample file: [NotebookList] Default=~/doc/zim ~/doc/zim ~/tmp/test [Notebook] uri=~/doc/zim name=doc interwiki=None icon= [Notebook] .... @notebook_name: Unicode name @notebook_path: Filesystem byte string ''' notebooks = [] last_section = None with open(zim_notebooks_file, 'r') as notebooks_file: for line in notebooks_file: line = line.strip() if line.startswith("["): if line == '[Notebook]': notebooks.append(dict()) last_section = line continue if not line: last_section = None continue if last_section == '[Notebook]': if '=' in line: key, val = line.split('=', 1) notebooks[-1][key] = val for notebook in notebooks: uri = notebook.get('uri') if not uri: continue notebook_path = gio.File(os.path.expanduser(uri)).get_path() notebook_name = notebook.get('name') if not notebook_name: # old version: name don't present in config try: notebook_name = _read_zim_notebook_name(notebook_path) except IOError: pass if not notebook_name: notebook_name = notebook_path.split('/')[-1] yield (notebook_name, notebook_path) def _get_zim_notebooks(): ''' Yield (notebook name, notebook path) from zim config @notebook_name: Unicode name @notebook_path: Filesystem byte string ''' # We assume the notebook description is UTF-8 encoded zim_notebooks_file = config.get_config_file("notebooks.list", package="zim") if not zim_notebooks_file: pretty.print_error(__name__, "Zim notebooks.list not found") return [] try: config_first_line = None with open(zim_notebooks_file, 'r') as notebooks_file: config_first_line = notebooks_file.readline().strip() if config_first_line == "[NotebookList]": return _read_zim_notebooks_new(zim_notebooks_file) else: return _read_zim_notebooks_old(zim_notebooks_file) except IOError, err: pretty.print_error(__name__, err) class ZimNotebook (Leaf): def get_gicon(self): return icons.get_gicon_for_file(self.object) class ZimNotebooksSource (Source): def __init__(self): Source.__init__(self, _("Zim Notebooks")) def get_items(self): for name, path in _get_zim_notebooks(): yield ZimNotebook(path, name) def get_icon_name(self): return "zim" def provides(self): yield ZimNotebook class ZimPagesSource(AppLeafContentMixin, Source): ''' Index pages in all Zim notebooks ''' appleaf_content_id = "zim" def __init__(self, name=_("Zim Pages")): Source.__init__(self, name) # path to file with list notebooks self._version = 2 def get_items(self): strip_name_first_colon = not __kupfer_settings__["page_name_starts_colon"] for notebook_name, notebook_path in _get_zim_notebooks(): for root, dirs, files in os.walk(notebook_path): # find pages in notebook for filename in files: file_path = os.path.join(root, filename) page_name, ext = os.path.splitext(file_path) if not ext.lower() == ".txt": continue page_name = page_name.replace(notebook_path, "", 1) # Ask GLib for the correct unicode representation # of the page's filename page_name = glib.filename_display_name(page_name) if strip_name_first_colon: page_name = page_name.lstrip(os.path.sep) page_name = (page_name .replace(os.path.sep, u":") .replace(u"_", u" ")) yield ZimPage(file_path, page_name, notebook_path, notebook_name) def get_description(self): return _("Pages stored in Zim Notebooks") def get_icon_name(self): return "zim" def provides(self): yield ZimPage kupfer-v208/kupfer/plugin_support.py000066400000000000000000000227621176220042200200140ustar00rootroot00000000000000import sys import gobject keyring = None from kupfer import pretty from kupfer import config from kupfer.core import settings from kupfer.core import plugins from kupfer import utils __all__ = [ "UserNamePassword", "PluginSettings", "check_dbus_connection", "check_keyring_support", ] def _is_core_setting(key): return key.startswith("kupfer_") class PluginSettings (gobject.GObject, pretty.OutputMixin): """Allows plugins to have preferences by assigning an instance of this class to the plugin's __kupfer_settings__ attribute. Setting values are accessed by the getitem operator [] with the setting's 'key' attribute Signals: plugin-setting-changed: key, value """ __gtype_name__ = "PluginSettings" def __init__(self, *setdescs): """Create a settings collection by passing in dictionaries as arguments, where each dictionary must have the following keys: key type value (default value) label (localized label) the @key may be any string except strings starting with 'kupfer_', which are reserved """ gobject.GObject.__init__(self) self.setting_descriptions = {} self.setting_key_order = [] self.signal_connection = -1 req_keys = set(("key", "value", "type", "label")) for desc in setdescs: if not req_keys.issubset(desc.keys()): missing = req_keys.difference(desc.keys()) raise KeyError("Plugin setting missing keys: %s" % missing) self.setting_descriptions[desc["key"]] = dict(desc) self.setting_key_order.append(desc["key"]) def __iter__(self): return iter(self.setting_key_order) def initialize(self, plugin_name): """Init by reading from global settings and setting up callbacks""" setctl = settings.GetSettingsController() for key in self: value_type = self.setting_descriptions[key]["type"] value = setctl.get_plugin_config(plugin_name, key, value_type) if value is not None: self[key] = value elif _is_core_setting(key): default = self.setting_descriptions[key]["value"] setctl.set_plugin_config(plugin_name, key, default, value_type) setctl.connect("value-changed", self._value_changed, plugin_name) # register for unload notification if not plugin_name.startswith("core."): plugins.register_plugin_unimport_hook(plugin_name, self._disconnect_all, plugin_name) def __getitem__(self, key): return self.setting_descriptions[key]["value"] def __setitem__(self, key, value): value_type = self.setting_descriptions[key]["type"] self.setting_descriptions[key]["value"] = value_type(value) if not _is_core_setting(key): self.emit("plugin-setting-changed::"+str(key), key, value) def _value_changed(self, setctl, section, key, value, plugin_name): """Preferences changed, update object""" if key in self and plugin_name in section: self[key] = value def get_value_type(self, key): """Return type of setting @key""" return self.setting_descriptions[key]["type"] def get_label(self, key): """Return label for setting @key""" return self.setting_descriptions[key]["label"] def get_alternatives(self, key): """Return alternatives for setting @key (if any)""" return self.setting_descriptions[key].get("alternatives") def get_tooltip(self, key): """Return tooltip string for setting @key (if any)""" return self.setting_descriptions[key].get("tooltip") def connect_settings_changed_cb(self, callback, *args): self.signal_connection = \ self.connect("plugin-setting-changed", callback, *args) def _disconnect_all(self, plugin_name): if self.signal_connection != -1: self.disconnect(self.signal_connection) # Arguments: Key, Value # Detailed by the key gobject.signal_new("plugin-setting-changed", PluginSettings, gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_DETAILED, gobject.TYPE_BOOLEAN, (gobject.TYPE_STRING, gobject.TYPE_PYOBJECT)) # Plugin convenience functions for dependencies _has_dbus_connection = None def check_dbus_connection(): """ Check if a connection to the D-Bus daemon is available, else raise ImportError with an explanatory error message. For plugins that can not be used without contact with D-Bus; if this check is used, the plugin may use D-Bus and assume it is available in the Plugin's code. """ global _has_dbus_connection if _has_dbus_connection is None: import dbus try: dbus.Bus() _has_dbus_connection = True except dbus.DBusException: _has_dbus_connection = False if not _has_dbus_connection: raise ImportError(_("No D-Bus connection to desktop session")) class UserNamePassword (settings.ExtendedSetting): ''' Configuration type for storing username/password values. Username is stored in Kupfer config, password in keyring ''' def __init__(self, obj=None): settings.ExtendedSetting.__init__(self) self.username = None self.password = None if obj: self.username = obj.username self.password = obj.password def __repr__(self): return '' % (self.username, bool(self.password)) @classmethod def is_backend_encrypted(cls): import keyring.core return keyring.core.get_keyring().supported() == 1 @classmethod def get_backend_name(cls): import keyring.core import keyring.backend keyring_map = { keyring.backend.GnomeKeyring : _("GNOME Keyring"), keyring.backend.KDEKWallet : _("KWallet"), keyring.backend.UncryptedFileKeyring: _("Unencrypted File"), } kr = keyring.get_keyring() keyring_name = keyring_map.get(type(kr), type(kr).__name__) return keyring_name def load(self, plugin_id, key, username): self.password = keyring.get_password(plugin_id, username) self.username = username def save(self, plugin_id, key): ''' save @user_password - store password in keyring and return username to save in standard configuration file ''' keyring.set_password(plugin_id, self.username, self.password) return self.username def check_keyring_support(): """ Check if the UserNamePassword class can be used, else raise ImportError with an explanatory error message. """ global keyring # if gnomekeyring exists, block kde libraries old_pykde4 = sys.modules.get('PyKDE4') try: import gnomekeyring except ImportError: pass else: sys.modules['PyKDE4'] = None try: import keyring except ImportError: global UserNamePassword class UserNamePassword (object): pass raise else: # Configure the fallback keyring's configuration file if used import keyring.backend kr = keyring.get_keyring() if hasattr(kr, "crypted_password"): keyring.set_keyring(keyring.backend.UncryptedFileKeyring()) kr = keyring.get_keyring() if hasattr(kr, "file_path"): kr.file_path = config.save_config_file("keyring.cfg") finally: # now unblock kde libraries again if old_pykde4: sys.modules['PyKDE4'] = old_pykde4 def _plugin_configuration_error(plugin, err): pretty.print_error(__name__, err) def _is_valid_terminal(term_dict): if len(term_dict["argv"]) < 1: return False exe = term_dict["argv"][0] return bool(utils.lookup_exec_path(exe)) _available_alternatives = { "terminal": { "filter": _is_valid_terminal, "required_keys": { 'name': unicode, 'argv': list, 'exearg': str, 'desktopid': str, 'startup_notify': bool, }, }, "icon_renderer": { "filter": None, "required_keys": { 'name': unicode, 'renderer': object, }, }, } _alternatives = { "terminal": {}, "icon_renderer": {}, } def register_alternative(caller, category_key, id_, **kwargs): """ Register a new alternative for the category @category_key @caller: Must be the caller's plugin id (Plugin __name__ variable) @id_ is a string identifier for the object to register @kwargs are the keyed arguments for the alternative constructor Returns True with success """ caller = str(caller) category_key = str(category_key) id_ = str(id_) if category_key not in _available_alternatives: _plugin_configuration_error(caller, "Category '%s' does not exist" % category_key) return alt = _available_alternatives[category_key] id_ = caller + "." + id_ kw_set = set(kwargs) req_set = set(alt["required_keys"]) if not req_set.issubset(kw_set): _plugin_configuration_error(caller, "Configuration error for alternative '%s':" % category_key) _plugin_configuration_error(caller, "Missing keys: %s" % (req_set - kw_set)) return _alternatives[category_key][id_] = kwargs pretty.print_debug(__name__, "Registered alternative %s: %s" % (category_key, id_)) setctl = settings.GetSettingsController() setctl._update_alternatives(category_key, _alternatives[category_key], alt["filter"]) # register the alternative to be unloaded plugin_id = ".".join(caller.split(".")[2:]) if plugin_id and not plugin_id.startswith("core."): plugins.register_plugin_unimport_hook(plugin_id, _unregister_alternative, caller, category_key, id_) return True def _unregister_alternative(caller, category_key, full_id_): """ Remove the alternative for category @category_key (this is done automatically at plugin unload) """ if category_key not in _available_alternatives: _plugin_configuration_error(caller, "Category '%s' does not exist" % category_key) return alt = _available_alternatives[category_key] id_ = full_id_ try: del _alternatives[category_key][id_] except KeyError: _plugin_configuration_error(caller, "Alternative '%s' does not exist" % (id_, )) return pretty.print_debug(__name__, "Unregistered alternative %s: %s" % (category_key, id_)) setctl = settings.GetSettingsController() setctl._update_alternatives(category_key, _alternatives[category_key], alt["filter"]) return True kupfer-v208/kupfer/pretty.py000066400000000000000000000044251176220042200162450ustar00rootroot00000000000000from __future__ import print_function debug = False import sys import traceback class OutputMixin (object): """ A mixin class providing prefixed output standard output and debug output """ def _output_category(self): return "[%s] %s:" % (type(self).__module__, type(self).__name__) def _output_core(self, prefix, sep, end, stream, *items): category = self._output_category() print(prefix+category, *items, sep=sep, end=end, file=stream) def output_info(self, *items, **kwargs): """ Output given items using @sep as separator, ending the line with @end """ sep = kwargs.get("sep", " ") end = kwargs.get("end", "\n") self._output_core("", sep, end, sys.stdout, *items) def output_exc(self, exc_info=None): """Output current exception, or use @exc_info if given""" etype, value, tb = (exc_info or sys.exc_info()) if debug: self._output_core("Exception in ", "", "\n", sys.stderr) traceback.print_exception(etype, value, tb, file=sys.stderr) else: msg = "%s: %s" % (etype.__name__, value) self._output_core("Exception in ", " ", "\n", sys.stderr, msg) def output_debug(self, *items, **kwargs): if debug: sep = kwargs.get("sep", " ") end = kwargs.get("end", "\n") self._output_core("D ", sep, end, sys.stderr, *items) def output_error(self, *items, **kwargs): sep = kwargs.get("sep", " ") end = kwargs.get("end", "\n") self._output_core("Error ", sep, end, sys.stderr, *items) class _StaticOutput (OutputMixin): current_calling_module = None def _output_category(self): return "[%s]:" % (self.current_calling_module, ) def print_info(self, modulename, *args, **kwargs): self.current_calling_module = modulename self.output_info(*args, **kwargs) def print_error(self, modulename, *args, **kwargs): self.current_calling_module = modulename self.output_error(*args, **kwargs) def print_exc(self, modulename, *args, **kwargs): self.current_calling_module = modulename self.output_exc(*args, **kwargs) def print_debug(self, modulename, *args, **kwargs): if debug: self.current_calling_module = modulename self.output_debug(*args, **kwargs) _StaticOutput = _StaticOutput() print_info = _StaticOutput.print_info print_debug = _StaticOutput.print_debug print_error = _StaticOutput.print_error print_exc = _StaticOutput.print_exc kupfer-v208/kupfer/puid.py000066400000000000000000000076231176220042200156620ustar00rootroot00000000000000""" Persistent Globally Unique Indentifiers for KupferObjects. Some objects are assigned identifiers by reference, some are assigned identifiers containing the whole object data (SerializedObject). SerializedObject is a saved representation of a KupferObject, i.e. a data model user-level object. We unpickle SerializedObjects in an especially conservative way: new module loading is always refused; this way, we avoid loading parts of the program that we didn't wish to activate. """ import contextlib import pickle from kupfer import pretty from kupfer.core import actioncompat from kupfer.core import qfurl from kupfer.core.sources import GetSourceController from kupfer.conspickle import ConservativeUnpickler __all__ = [ "SerializedObject", "SERIALIZABLE_ATTRIBUTE", "resolve_unique_id", "resolve_action_id", "get_unique_id", "is_reference", ] SERIALIZABLE_ATTRIBUTE = "serializable" class SerializedObject (object): # treat the serializable attribute as a version number, defined on the class def __init__(self, obj): self.version = getattr(obj, SERIALIZABLE_ATTRIBUTE) self.data = pickle.dumps(obj, pickle.HIGHEST_PROTOCOL) def __eq__(self, other): return (isinstance(other, type(self)) and self.data == other.data and self.version == other.version) def reconstruct(self): obj = ConservativeUnpickler.loads(self.data) if self.version != getattr(obj, SERIALIZABLE_ATTRIBUTE): raise ValueError("Version mismatch for reconstructed %s" % obj) return obj def get_unique_id(obj): if obj is None: return None if hasattr(obj, "qf_id"): return str(qfurl.qfurl(obj)) if getattr(obj, SERIALIZABLE_ATTRIBUTE, None) is not None: try: return SerializedObject(obj) except pickle.PicklingError, exc: pretty.print_error(__name__, type(exc).__name__, exc) return None return repr(obj) def is_reference(puid): "Return True if @puid is a reference-type ID" return not isinstance(puid, SerializedObject) # A Context manager to block recursion when seeking inside a # catalog; we have a stack (@_excluding) of the sources we # are visiting, and nested context with the _exclusion # context manager _excluding = [] @contextlib.contextmanager def _exclusion(src): try: _excluding.append(src) yield finally: _excluding.pop() def _is_currently_excluding(src): return src is not None and src in _excluding def _find_obj_in_catalog(puid, catalog): if puid.startswith(qfurl.QFURL_SCHEME): qfu = qfurl.qfurl(url=puid) return qfu.resolve_in_catalog(catalog) for src in catalog: if _is_currently_excluding(src): continue with _exclusion(src): for obj in src.get_leaves(): if repr(obj) == puid: return obj return None def resolve_unique_id(puid, excluding=None): """ Resolve unique id @puid The caller (if a Source) should pass itself as @excluding, so that recursion into itself is avoided. """ if excluding is not None: with _exclusion(excluding): return resolve_unique_id(puid, None) if puid is None: return None if isinstance(puid, SerializedObject): try: return puid.reconstruct() except Exception, exc: pretty.print_debug(__name__, type(exc).__name__, exc) return None sc = GetSourceController() obj = _find_obj_in_catalog(puid, sc._firstlevel) if obj is not None: return obj other_sources = set(sc.sources) - set(sc._firstlevel) obj = _find_obj_in_catalog(puid, other_sources) return obj def resolve_action_id(puid, for_item=None): if puid is None: return None if isinstance(puid, SerializedObject): return resolve_unique_id(puid) get_action_id = repr sc = GetSourceController() if for_item is not None: for action in actioncompat.actions_for_item(for_item, sc): if get_unique_id(action) == puid: return action for item_type, actions in sc.action_decorators.iteritems(): for action in actions: if get_action_id(action) == puid: return action pretty.print_debug(__name__, "Unable to resolve %s (%s)" % (puid, for_item)) return None kupfer-v208/kupfer/runtimehelper.py000066400000000000000000000014641176220042200176010ustar00rootroot00000000000000import gio from kupfer.objects import FileLeaf def register_async_file_result(ctx, filepath): """ Register that @filepath may appear soon @ctx: The action's execution context token """ return AsyncFileResult(ctx, filepath) class AsyncFileResult (object): """Expect a given file path to be created, and when (probably) done, post the file as a late result. """ def __init__(self, ctx, filepath): self.ctx = ctx gfile = gio.File(filepath) self.monitor = gfile.monitor_file(gio.FILE_MONITOR_NONE) self.callback_id = self.monitor.connect("changed", self.changed) def changed(self, monitor, gfile1, gfile2, event): if event == gio.FILE_MONITOR_EVENT_CHANGES_DONE_HINT: self.ctx.register_late_result(FileLeaf(gfile1.get_path())) self.monitor.disconnect(self.callback_id) self.monitor = None kupfer-v208/kupfer/scheduler.py000066400000000000000000000052741176220042200166770ustar00rootroot00000000000000 import gobject from kupfer import pretty from kupfer.weaklib import gobject_connect_weakly _scheduler = None def GetScheduler(): """Get the shared instance""" global _scheduler if not _scheduler: _scheduler = Scheduler() return _scheduler class Scheduler (gobject.GObject, pretty.OutputMixin): __gtype_name__ = "Scheduler" def __init__(self): super(Scheduler, self).__init__() def load(self): self.output_debug("Loading") self.emit("load") self.emit("loaded") self.output_debug("Loaded") def display(self): self.output_debug("Display") self.emit("display") gobject.idle_add(self._after_display) def _after_display(self): self.output_debug("After Display") self.emit("after-display") def finish(self): self.emit("finish") gobject.signal_new("load", Scheduler, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, ()) gobject.signal_new("loaded", Scheduler, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, ()) gobject.signal_new("display", Scheduler, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, ()) gobject.signal_new("after-display", Scheduler, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, ()) gobject.signal_new("finish", Scheduler, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, ()) class Timer (object): def __init__(self, call_at_finish=False): self._current_timer = -1 self._call_at_finish = call_at_finish self._current_callback = None gobject_connect_weakly(GetScheduler(), "finish", self._on_finish) def set(self, timeout_seconds, callback, *arguments): """Setup timer to call @timeout_seconds in the future. If the timer was previously set, it is postponed """ self.invalidate() self._current_callback = lambda : callback(*arguments) self._current_timer = gobject.timeout_add_seconds(timeout_seconds, self._call) def set_ms(self, timeout_milliseconds, callback, *arguments): """Setup timer to call @timeout_milliseconds in the future. If the timer was previously set, it is postponed """ self.invalidate() self._current_callback = lambda : callback(*arguments) self._current_timer = gobject.timeout_add(int(timeout_milliseconds), self._call) def set_idle(self, callback, *arguments): self.invalidate() self._current_callback = lambda : callback(*arguments) self._current_timer = gobject.idle_add(self._call) def _call(self, timer=None): self._current_timer = -1 self._current_callback() def invalidate(self): if self._current_timer > 0: gobject.source_remove(self._current_timer) self._current_timer = -1 def is_valid(self): """If Timer is currently set""" return (self._current_timer > 0) def _on_finish(self, scheduler): if self._call_at_finish and self.is_valid(): self._call() else: self.invalidate() kupfer-v208/kupfer/task.py000066400000000000000000000044461176220042200156630ustar00rootroot00000000000000import sys import threading import gobject from kupfer import scheduler, pretty class Task (object): """Represent a task that can be done in the background The finish_callback received in Task.start(..) must be stored, and regardless if the task exits with an error, or completes successfully, the callback *must* be called. The finish callback must pass the Task instance itself as the only and first argument: finish_callback(self) """ def __init__(self, name=None): self.name = name def __unicode__(self): return self.name def start(self, finish_callback): raise NotImplementedError class ThreadTask (Task): """Run in a thread""" def __init__(self, name=None): Task.__init__(self, name) self._finish_callback = None def thread_do(self): """Override this to run what should be done in the thread""" raise NotImplementedError def thread_finish(self): """This finish function runs in the main thread after thread completion, and can be used to communicate with the GUI. """ pass def thread_finally(self, exc_info): """Always run at thread finish""" if exc_info is not None: etype, value, tb = exc_info raise etype, value, tb def _thread_finally(self, exc_info): try: self.thread_finally(exc_info) finally: self._finish_callback(self) def _run_thread(self): try: self.thread_do() gobject.idle_add(self.thread_finish) except: exc_info = sys.exc_info() else: exc_info = None finally: gobject.idle_add(self._thread_finally, exc_info) def start(self, finish_callback): self._finish_callback = finish_callback thread = threading.Thread(target=self._run_thread) thread.start() class TaskRunner (pretty.OutputMixin): """Run Tasks in the idle Loop""" def __init__(self, end_on_finish): self.tasks = set() self.end_on_finish = end_on_finish scheduler.GetScheduler().connect("finish", self._finish_cleanup) def _task_finished(self, task): self.output_debug("Task finished", task) self.tasks.remove(task) def add_task(self, task): """Register @task to be run""" self.tasks.add(task) task.start(self._task_finished) def _finish_cleanup(self, sched): if self.end_on_finish: self.tasks.clear() return if self.tasks: self.output_info("Uncompleted tasks:") for task in self.tasks: self.output_info(task) kupfer-v208/kupfer/terminal.py000066400000000000000000000006561176220042200165330ustar00rootroot00000000000000from kupfer.core import settings def is_known_terminal_executable(exearg): setctl = settings.GetSettingsController() for id_, term in setctl.get_all_alternatives('terminal').iteritems(): if exearg == term["argv"][0]: return True return False def get_configured_terminal(): """ Return the configured Terminal object """ setctl = settings.GetSettingsController() return setctl.get_preferred_alternative('terminal') kupfer-v208/kupfer/textutils.py000066400000000000000000000046701176220042200167650ustar00rootroot00000000000000# encoding: utf-8 def _unicode_truncate(ustr, length, encoding="UTF-8"): "Truncate @ustr to specific encoded byte length" bstr = ustr.encode(encoding)[:length] return bstr.decode(encoding, 'ignore') def extract_title_body(text, maxtitlelen=60): u"""Prepare @text: Return a (title, body) tuple @text: A user-submitted paragraph or otherwise snippet of text. We try to detect an obvious title and then return the title and the following body. Otherwise we extract a title from the first words, and return the full text as body. @maxtitlelen: A unitless measure of approximate length of title. The default value yields a resulting title of approximately 60 ascii characters, or 20 asian characters. >>> extract_title_body(u"Short Text") (u'Short Text', u'') >>> title, body = extract_title_body(u"執筆方針については、項目名の付け方、" ... "フォーマットや表記上の諸問題に関して多くの方針が存在している。") >>> print title 執筆方針については、項目名の付け方、フォ >>> print body # doctest: +ELLIPSIS 執筆方針については、項目名の付け方、フォ...して多くの方針が存在している。 """ # if you don't make real tests, it's not not worth doing it at all. if not text.strip(): return text, u"" def split_first_line(text): """Take first non-empty line of text""" lines = iter(text.splitlines()) for l in lines: l = l.strip() if not l: continue rest = u"\n".join(lines) return l, rest # We use the UTF-8 encoding and truncate due to it: # this is a good heuristic for ascii vs "wide characters" # it results in taking fewer characters if they are asian, which # is exactly what we want def split_first_words(text, maxlen): text = text.lstrip() first_text = _unicode_truncate(text, maxlen) words = first_text.split() if len(words) > 3: words = words[:-1] first_words = u" ".join(words[:-1]) if text.startswith(first_words): first_text = first_words rest_text = text[len(first_text):] return first_text, rest_text firstline, rest = split_first_line(text) if len(firstline.encode("UTF-8")) > maxtitlelen: firstline, rest = split_first_words(text, maxtitlelen) else: return firstline, rest if rest.strip(): return firstline, text else: return text, u"" if __name__ == '__main__': # unicode doctest hack import sys reload(sys) sys.setdefaultencoding("UTF-8") import doctest doctest.testmod() kupfer-v208/kupfer/ui/000077500000000000000000000000001176220042200147545ustar00rootroot00000000000000kupfer-v208/kupfer/ui/__init__.py000066400000000000000000000000001176220042200170530ustar00rootroot00000000000000kupfer-v208/kupfer/ui/accelerators.py000066400000000000000000000015311176220042200177750ustar00rootroot00000000000000 ACCELERATOR_NAMES = { # TRANS: Names of accelerators in the interface 'activate': _('Alternate Activate'), # TRANS: The "Comma Trick"/"Put Selection on Stack" allows the # TRANS: user to select many objects to be used for one action 'comma_trick': _('Comma Trick'), # TRANS: "Compose Command" makes one object out of the selected # TRANS: object + action (+iobject) 'compose_action': _('Compose Command'), 'mark_as_default': _('Mark Default Action'), 'erase_affinity_for_first_pane': _('Forget Object'), 'reset_all': _('Reset All'), 'select_quit': _('Select Quit'), 'select_selected_file': _('Select Selected File'), 'select_selected_text': _('Select Selected Text'), 'show_help': _('Show Help'), 'show_preferences': _('Show Preferences'), 'switch_to_source': _('Switch to First Pane'), "toggle_text_mode_quick": _('Toggle Text Mode'), } kupfer-v208/kupfer/ui/browser.py000066400000000000000000002150041176220042200170130ustar00rootroot00000000000000# -*- coding: UTF-8 -*- import io import itertools import signal import sys import textwrap import time import gtk import gio import gobject import cairo from kupfer import kupferui from kupfer import version from kupfer import scheduler from kupfer.ui import accelerators from kupfer.ui import keybindings from kupfer.ui import listen from kupfer.ui import uievents from kupfer.core import data, relevance, learn from kupfer.core import settings from kupfer import icons from kupfer import interface from kupfer import pretty _escape_table = { ord(u"&"): u"&", ord(u"<"): u"<", ord(u">"): u">", } def tounicode(ustr): if isinstance(ustr, unicode): return ustr return ustr.decode("UTF-8", "replace") def escape_markup_str(mstr): """ Use a simeple homegrown replace table to replace &, <, > with entities in @mstr """ return tounicode(mstr).translate(_escape_table) def text_direction_is_ltr(): return gtk.widget_get_default_direction() != gtk.TEXT_DIR_RTL def make_rounded_rect(cr,x,y,width,height,radius): """ Draws a rounded rectangle with corners of @radius """ MPI = 3.1415926535897931 cr.save() w,h = width, height cr.move_to(radius, 0) cr.line_to(w-radius,0) cr.arc(w-radius, radius, radius, 3*MPI/2, 2*MPI) cr.line_to(w, h-radius) cr.arc(w-radius, h-radius, radius, 0, MPI/2) cr.line_to(radius, h) cr.arc(radius, h-radius, radius, MPI/2, MPI) cr.line_to(0, radius) cr.arc(radius, radius, radius, MPI, 3*MPI/2) cr.close_path() cr.restore() def get_glyph_pixbuf(text, sz, center_vert=True, color=None): """Return pixbuf for @text if @center_vert, then center completely vertically """ margin = sz * 0.1 ims = cairo.ImageSurface(cairo.FORMAT_ARGB32, sz, sz) cc = cairo.Context(ims) cc.move_to(margin, sz-margin) cc.set_font_size(sz/2) if color is None: cc.set_source_rgba(0,0,0,1) else: cc.set_source_rgb(*color) cc.text_path(text) x1, y1, x2, y2 =cc.path_extents() skew_horiz = ((sz-x2) - (x1))/2.0 skew_vert = ((sz-y2) - (y1))/2.0 if not center_vert: skew_vert = skew_vert*0.2 - margin*0.5 cc.new_path() cc.move_to(margin+skew_horiz, sz-margin+skew_vert) cc.text_path(text) cc.fill() ims.flush() f = io.BytesIO() ims.write_to_png(f) loader = gtk.gdk.PixbufLoader() loader.write(f.getvalue()) loader.close() return loader.get_pixbuf() # State Constants class State (object): Wait, Match, NoMatch = (1,2,3) class LeafModel (object): """A base for a tree view With a magic load-on-demand feature. self.set_base will set its base iterator and self.populate(num) will load @num items into the model """ def __init__(self): """ First column is always the object -- returned by get_object it needs not be specified in columns """ columns = (gobject.TYPE_OBJECT, str, str, str) self.store = gtk.ListStore(gobject.TYPE_PYOBJECT, *columns) self.object_column = 0 self.base = None self._setup_columns() def __len__(self): return len(self.store) def _setup_columns(self): self.icon_col = 1 self.val_col = 2 self.info_col = 3 self.rank_col = 4 # only show in debug mode show_rank_col = pretty.debug from pango import ELLIPSIZE_MIDDLE cell = gtk.CellRendererText() cell.set_property("ellipsize", ELLIPSIZE_MIDDLE) cell.set_property("width-chars", 45) col = gtk.TreeViewColumn("item", cell) """ info_cell = gtk.CellRendererPixbuf() info_cell.set_property("height", 16) info_cell.set_property("width", 16) info_col = gtk.TreeViewColumn("info", info_cell) info_col.add_attribute(info_cell, "icon-name", self.info_col) """ info_cell = gtk.CellRendererText() info_cell.set_property("width-chars", 1) info_col = gtk.TreeViewColumn("info", info_cell) info_col.add_attribute(info_cell, "text", self.info_col) col.add_attribute(cell, "markup", self.val_col) nbr_cell = gtk.CellRendererText() nbr_col = gtk.TreeViewColumn("rank", nbr_cell) nbr_cell.set_property("width-chars", 3) nbr_col.add_attribute(nbr_cell, "text", self.rank_col) icon_cell = gtk.CellRendererPixbuf() #icon_cell.set_property("height", 32) #icon_cell.set_property("width", 32) #icon_cell.set_property("stock-size", gtk.ICON_SIZE_LARGE_TOOLBAR) icon_col = gtk.TreeViewColumn("icon", icon_cell) icon_col.add_attribute(icon_cell, "pixbuf", self.icon_col) self.columns = [icon_col, col, info_col,] if show_rank_col: self.columns += (nbr_col, ) def _get_column(self, treepath, col): iter = self.store.get_iter(treepath) val = self.store.get_value(iter, col) return val def get_object(self, path): return self._get_column(path, self.object_column) def get_store(self): return self.store def clear(self): """Clear the model and reset its base""" self.store.clear() self.base = None def set_base(self, baseiter): self.base = iter(baseiter) def populate(self, num=None): """ populate model with num items from its base and return first item inserted if num is none, insert everything """ if not self.base: return None if num: iterator = itertools.islice(self.base, num) first = None for item in iterator: self.add(item) if not first: first = item.object # first.object is a leaf return first def _get_row(self, rankable): """Use the UI description functions get_* to initialize @rankable into the model """ leaf, rank = rankable.object, rankable.rank icon = self.get_icon(leaf) markup = self.get_label_markup(rankable) info = self.get_aux_info(leaf) rank_str = self.get_rank_str(rank) return (rankable, icon, markup, info, rank_str) def add(self, rankable): self.store.append(self._get_row(rankable)) def add_first(self, rankable): self.store.prepend(self._get_row(rankable)) def get_icon_size(self): return gtk.icon_size_lookup(gtk.icon_size_from_name("kupfer-small"))[0] def get_icon(self, leaf): sz = self.get_icon_size() if sz >= 8: return leaf.get_thumbnail(sz, sz) or leaf.get_pixbuf(sz) def get_label_markup(self, rankable): leaf = rankable.object # Here we use the items real name # Previously we used the alias that was matched, # but it can be too confusing or ugly name = escape_markup_str(unicode(leaf)) desc = escape_markup_str(leaf.get_description() or "") if desc: text = u'%s\n%s' % (name, desc, ) else: text = u'%s' % (name, ) return text def get_aux_info(self, leaf): # info: display arrow if leaf has content fill_space = u"\N{EM SPACE}" if text_direction_is_ltr(): content_mark = u"\N{BLACK RIGHT-POINTING SMALL TRIANGLE}" else: content_mark = u"\N{BLACK LEFT-POINTING SMALL TRIANGLE}" info = u"" if learn.is_favorite(leaf): info += u"\N{BLACK STAR}" else: info += fill_space if hasattr(leaf, "has_content") and leaf.has_content(): info += content_mark return info def get_rank_str(self, rank): # Display rank empty instead of 0 since it looks better return str(int(rank)) if rank else "" class MatchView (gtk.Bin): """ A Widget for displaying name, icon and underlining properly if it matches """ __gtype_name__ = "MatchView" def __init__(self): gobject.GObject.__init__(self) # object attributes self.label_char_width = 25 self.preedit_char_width = 5 self.match_state = State.Wait self.object_stack = [] self.connect("realize", self._update_theme) self.connect("style-set", self._update_theme) # finally build widget self.build_widget() self.cur_icon = None self.cur_text = None self.cur_match = None @property def icon_size(self): return gtk.icon_size_lookup(gtk.icon_size_from_name("kupfer-large"))[0] def _update_theme(self, *args): # Style subtables to choose from # fg, bg, text, base # light, mid, dark # Use a darker color for selected state # leave active state as preset selectedc = self.style.dark[gtk.STATE_SELECTED] self.event_box.modify_bg(gtk.STATE_SELECTED, selectedc) def build_widget(self): """ Core initalization method that builds the widget """ from pango import ELLIPSIZE_MIDDLE self.label = gtk.Label("") self.label.set_single_line_mode(True) self.label.set_width_chars(self.label_char_width) self.label.set_ellipsize(ELLIPSIZE_MIDDLE) self.icon_view = gtk.Image() # infobox: icon and match name icon_align = gtk.Alignment(0.5, 0.5, 0, 0) icon_align.set_property("top-padding", 5) icon_align.add(self.icon_view) infobox = gtk.HBox() infobox.pack_start(icon_align, True, True, 0) box = gtk.VBox() box.pack_start(infobox, True, False, 0) self._editbox = gtk.HBox() self._editbox.pack_start(self.label, True, True, 0) box.pack_start(self._editbox, False, True, 0) self.event_box = gtk.EventBox() self.event_box.add(box) self.event_box.connect("expose-event", self._box_expose) self.event_box.set_app_paintable(True) self.add(self.event_box) self.event_box.show_all() self.__child = self.event_box def _box_expose(self, widget, event): "Draw background on the EventBox" rect = widget.get_allocation() context = widget.window.cairo_create() # set a clip region for the expose event context.rectangle(event.area.x, event.area.y, event.area.width, event.area.height) scale = 1.0/2**16 # paint over GtkEventBox's default background context.clip_preserve() context.set_operator(cairo.OPERATOR_SOURCE) normc = widget.style.bg[gtk.STATE_NORMAL] toplevel_window = widget.get_toplevel() if toplevel_window.is_composited(): opacity = 0.01*toplevel_window.style_get_property('opacity') context.set_source_rgba(normc.red*scale, normc.green*scale, normc.blue*scale, opacity) else: context.set_source_rgba(normc.red*scale, normc.green*scale, normc.blue*scale, 1.0) context.fill() radius = self.style_get_property('corner-radius') make_rounded_rect(context, 0, 0, rect.width, rect.height, radius=radius) # Get the current selection color newc = widget.style.bg[widget.get_state()] context.set_operator(cairo.OPERATOR_SOURCE) opacity = 0.01*self.style_get_property('opacity') context.set_source_rgba(newc.red*scale, newc.green*scale, newc.blue*scale, opacity) context.fill() return False def do_size_request (self, requisition): requisition.width, requisition.height = self.__child.size_request () def do_size_allocate (self, allocation): self.__child.size_allocate (allocation) def do_forall (self, include_internals, callback, user_data): callback (self.__child, user_data) def _render_composed_icon(self, base, pixbufs, small_size): """ Render the main selection + a string of objects on the stack. Scale the main image into the upper portion, leaving a clear strip at the bottom where we line up the small icons. @base: main selection pixbuf @pixbufs: icons of the object stack, in final (small) size @small_size: the size of the small icons """ sz = self.icon_size base_scale = min((sz-small_size)*1.0/base.get_height(), sz*1.0/base.get_width()) new_sz_x = int(base_scale*base.get_width()) new_sz_y = int(base_scale*base.get_height()) if not base.get_has_alpha(): base = base.add_alpha(False, 0, 0, 0) destbuf = base.scale_simple(sz, sz, gtk.gdk.INTERP_NEAREST) destbuf.fill(0x00000000) # Align in the middle of the area offset_x = (sz - new_sz_x)/2 offset_y = ((sz - small_size) - new_sz_y)/2 base.composite(destbuf, offset_x, offset_y, new_sz_x, new_sz_y, offset_x, offset_y, base_scale, base_scale, gtk.gdk.INTERP_BILINEAR, 255) # @fr is the scale compared to the destination pixbuf fr = small_size*1.0/sz dest_y = offset_y = int((1-fr)*sz) for idx, pbuf in enumerate(pixbufs): dest_x = offset_x = int(fr*sz)*idx pbuf.copy_area(0,0, small_size,small_size, destbuf, dest_x,dest_y) return destbuf def update_match(self): """ Update interface to display the currently selected match """ # update icon icon = self.cur_icon if icon: if self.match_state is State.NoMatch: icon = self._dim_icon(icon) if icon and self.object_stack: small_max = 6 small_size = 16 pixbufs = [o.get_pixbuf(small_size) for o in self.object_stack[-small_max:]] icon = self._render_composed_icon(icon, pixbufs, small_size) self.icon_view.set_from_pixbuf(icon) else: self.icon_view.set_from_icon_name("gtk-file", self.icon_size) self.icon_view.set_pixel_size(self.icon_size) if not self.cur_text: self.label.set_text("") return if not self.cur_match: if self.match_state is not State.Match: # Allow markup in the text string if we have no match self.label.set_markup(self.cur_text) else: self.label.set_text(self.cur_text) return # update the text label text = unicode(self.cur_text) key = unicode(self.cur_match).lower() format_match=(lambda m: u"%s" % escape_markup_str(m)) markup = relevance.formatCommonSubstrings(text, key, format_clean=escape_markup_str, format_match=format_match) self.label.set_markup(markup) @classmethod def _dim_icon(cls, icon): if icon: dim_icon = icon.copy() icon.saturate_and_pixelate(dim_icon, 0, True) else: dim_icon = None return dim_icon def set_object(self, text, icon, update=True): self.cur_text = text self.cur_icon = icon if update: self.update_match() def set_match(self, match=None, state=None, update=True): self.cur_match = match if state: self.match_state = state else: self.match_state = (State.NoMatch, State.Match)[self.cur_match != None] if update: self.update_match() def set_match_state(self, text, icon, match=None, state=None, update=True): self.set_object(text,icon, update=False) self.set_match(match, state, update=False) if update: self.update_match() def set_match_text(self, text, update=True): self.cur_match = text if update: self.update_match() def expand_preedit(self, preedit): new_label_width = self.label_char_width - self.preedit_char_width self.label.set_width_chars(new_label_width) preedit.set_width_chars(self.preedit_char_width) pass def shrink_preedit(self, preedit): self.label.set_width_chars(self.label_char_width) preedit.set_width_chars(0) pass def inject_preedit(self, preedit): """ @preedit: Widget to be injected or None """ if preedit: old_parent = preedit.get_parent() if old_parent: old_parent.remove(preedit) self.shrink_preedit(preedit) self._editbox.pack_start(preedit, False, True, 0) selectedc = self.style.dark[gtk.STATE_SELECTED] preedit.modify_bg(gtk.STATE_SELECTED, selectedc) preedit.show() preedit.grab_focus() else: self.label.set_width_chars(self.label_char_width) self.label.set_alignment(.5,.5) gobject.type_register(MatchView) gtk.widget_class_install_style_property(MatchView, ('corner-radius', gobject.TYPE_INT, 'Corner radius', 'Radius of bezel around match', 0, 50, 15, gobject.PARAM_READABLE)) gtk.widget_class_install_style_property(MatchView, ('opacity', gobject.TYPE_INT, 'Bezel opacity', 'Opacity of bezel around match', 50, 100, 95, gobject.PARAM_READABLE)) class Search (gtk.Bin): """ A Widget for displaying search results icon + aux table etc Signals * cursor-changed: def callback(widget, selection) called with new selected (represented) object or None * activate: def callback(widget, selection) called with activated leaf, when the widget is activated by double-click in table * table-event: def callback(widget, table, event) called when the user types in the table """ __gtype_name__ = 'Search' def __init__(self): gobject.GObject.__init__(self) # object attributes self.model = LeafModel() self.match = None self.match_state = State.Wait self.text = u"" # internal constants self.show_initial = 10 self.show_more = 10 # number rows to skip when press PgUp/PgDown self.page_step = 7 self.source = None self._old_win_position=None self._has_search_result = False self._initialized = False # finally build widget self.build_widget() self.icon_size = None self.on_style_set() self.setup_empty() self.connect("style-set", self.on_style_set) def on_style_set(self, *args): self.icon_size = \ gtk.icon_size_lookup(gtk.icon_size_from_name("kupfer-large"))[0] def build_widget(self): """ Core initalization method that builds the widget """ self.match_view = MatchView() self.table = gtk.TreeView(self.model.get_store()) self.table.set_headers_visible(False) self.table.set_property("enable-search", False) for col in self.model.columns: self.table.append_column(col) self.table.connect("row-activated", self._row_activated) self.table.connect("cursor-changed", self._cursor_changed) self.scroller = gtk.ScrolledWindow() self.scroller.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.scroller.add(self.table) vscroll = self.scroller.get_vscrollbar() vscroll.connect("change-value", self._table_scroll_changed) self.list_window = gtk.Window(gtk.WINDOW_POPUP) self.list_window.set_name("kupfer-list") box = gtk.VBox() box.pack_start(self.match_view, True, True, 0) self.add(box) box.show_all() self.__child = box self.list_window.add(self.scroller) self.scroller.show_all() def get_current(self): """ return current selection """ return self.match def set_object_stack(self, stack): self.match_view.object_stack[:] = stack self.match_view.update_match() def set_source(self, source): """Set current source (to get icon, name etc)""" self.source = source def get_match_state(self): return self.match_state def get_match_text(self): return self.text def do_size_request (self, requisition): requisition.width, requisition.height = self.__child.size_request () def do_size_allocate (self, allocation): self.__child.size_allocate (allocation) def do_forall (self, include_internals, callback, user_data): callback (self.__child, user_data) def get_table_visible(self): return self.list_window.get_property("visible") def hide_table(self): self.list_window.hide() def _show_table(self): table_maxlen = self.style_get_property('list-length') opacity = 0.01*self.style_get_property('list-opacity') # self.window is a GdkWindow (of self's parent) win_width, win_height = self.window.get_size() pos_x, pos_y = self.window.get_position() # find origin in parent's coordinates self_x, self_y = self.translate_coordinates(self.get_parent(), 0, 0) self_width = self.size_request()[0] sub_x = pos_x sub_y = pos_y + win_height table_w, table_len = self.table.size_request() subwin_height = min(table_len, table_maxlen) or 100 subwin_width = self_width*2 - self_x if not text_direction_is_ltr(): sub_x += win_width - subwin_width + self_x else: sub_x -= self_x self.list_window.move(sub_x, sub_y) self.list_window.resize(subwin_width, subwin_height) win = self.get_toplevel() self.list_window.set_transient_for(win) self.list_window.set_property("focus-on-map", False) self.list_window.set_opacity(opacity) self.list_window.show() self._old_win_position = pos_x, pos_y def show_table(self): self.go_down(True) def _table_scroll_changed(self, scrollbar, scroll_type, value): """When the scrollbar changes due to user interaction""" # page size: size of currently visible area adj = scrollbar.get_adjustment() upper = adj.get_property("upper") page_size = adj.get_property("page-size") if value + page_size >= upper: self.populate(self.show_more) # table methods def _table_set_cursor_at_row(self, row): path_at_row = lambda r: (r,) self.table.set_cursor(path_at_row(row)) def go_up(self, rows_count=1): """ Upwards in the table """ row_at_path = lambda p: p[0] # go up, simply. close table if we go up from row 0 path, col = self.table.get_cursor() if path: r = row_at_path(path) if r >= 1: self._table_set_cursor_at_row(r-min(rows_count, r)) else: self.hide_table() def go_down(self, force=False, rows_count=1): """ Down in the table """ row_at_path = lambda p: p[0] table_visible = self.get_table_visible() # if no data is loaded (frex viewing catalog), load # if too little data is loaded, try load more if len(self.model) <= 1: self.populate(self.show_more) if len(self.model) >= 1: path, col = self.table.get_cursor() if path: r = row_at_path(path) if len(self.model) - rows_count <= r: self.populate(self.show_more) # go down only if table is visible if table_visible: step = min(len(self.model) - r - 1, rows_count) if step > 0: self._table_set_cursor_at_row(r + step) else: self._table_set_cursor_at_row(0) self._show_table() if force: self._show_table() def go_page_up(self): ''' move list one page up ''' self.go_up(self.page_step) def go_page_down(self): ''' move list one page down ''' self.go_down(rows_count=self.page_step) def go_first(self): ''' Rewind to first item ''' if self.get_table_visible(): self._table_set_cursor_at_row(0) def _window_config(self, widget, event): """ When the window moves """ winpos = event.x, event.y # only hide on move, not resize # set old win position in _show_table if self.get_table_visible() and winpos != self._old_win_position: self.hide_table() gobject.timeout_add(300, self._show_table) def _window_hidden(self, window): """ Window changed hid """ self.hide_table() def _row_activated(self, treeview, path, col): obj = self.get_current() self.emit("activate", obj) def _cursor_changed(self, treeview): path, col = treeview.get_cursor() match = self.model.get_object(path) self._set_match(match) def _set_match(self, rankable=None): """ Set the currently selected (represented) object, either as @rankable or KupferObject @obj Emits cursor-changed """ self.match = (rankable.object if rankable else None) self.emit("cursor-changed", self.match) if self.match: match_text = (rankable and rankable.value) self.match_state = State.Match m = self.match pbuf = (m.get_thumbnail(self.icon_size*4//3, self.icon_size) or m.get_pixbuf(self.icon_size)) self.match_view.set_match_state(match_text, pbuf, match=self.text, state=self.match_state) def set_match_plain(self, obj): """Set match to object @obj, without search or matches""" self.text = None self._set_match(obj) self.model.add_first(obj) self._table_set_cursor_at_row(0) def relax_match(self): """Remove match text highlight""" self.match_view.set_match_text(None) self.text = None def has_result(self): """A search with explicit search term is active""" return self._has_search_result def is_showing_result(self): """Showing search result: A search with explicit search term is active, and the result list is shown. """ return self._has_search_result and self.get_table_visible() def update_match(self, key, matchrankable, matches): """ @matchrankable: Rankable first match or None @matches: Iterable to rest of matches """ self._has_search_result = bool(key) self.model.clear() self.text = key if not matchrankable: self._set_match(None) return self.handle_no_matches(empty=not key) self._set_match(matchrankable) self.model.set_base(iter(matches)) self._browsing_match = False if not self.model and self.get_table_visible(): self.go_down() def reset(self): self._has_search_result = False self._initialized = True self.model.clear() self.setup_empty() def setup_empty(self): self.match_state = State.NoMatch self.match_view.set_match_state(u"No match", None, state=State.NoMatch) self.relax_match() def get_is_browsing(self): """Return if self is browsing""" return self._browsing_match def populate(self, num): """populate model with num items""" return self.model.populate(num) def handle_no_matches(self, empty=False): """if @empty, there were no matches to find""" name, icon = self.get_nomatch_name_icon(empty=empty) self.match_state = State.NoMatch self.match_view.set_match_state(name, icon, state=State.NoMatch) # Take care of gobject things to set up the Search class gobject.type_register(Search) gobject.signal_new("activate", Search, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_PYOBJECT, )) gobject.signal_new("cursor-changed", Search, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_PYOBJECT, )) gtk.widget_class_install_style_property(Search, ('list-opacity', gobject.TYPE_INT, 'Result list opacity', 'Opacity of the whole result list', 50, 100, 93, gobject.PARAM_READABLE)) gtk.widget_class_install_style_property(Search, ('list-length', gobject.TYPE_INT, 'Result list length', 'Maximum length of the result list', 50, 1024, 200, gobject.PARAM_READABLE)) class LeafSearch (Search): """ Customize for leaves search """ def get_nomatch_name_icon(self, empty): get_pbuf = \ lambda m: (m.get_thumbnail(self.icon_size*4/3, self.icon_size) or \ m.get_pixbuf(self.icon_size)) if empty and self.source: return (_("%s is empty") % escape_markup_str(unicode(self.source)), get_pbuf(self.source)) elif self.source: return (_('No matches in %(src)s for "%(query)s"') % { "src": u"%s" % escape_markup_str(unicode(self.source)), "query": escape_markup_str(self.text), }, get_pbuf(self.source)) else: return _("No matches"), icons.get_icon_for_name("kupfer-object", self.icon_size) def setup_empty(self): icon = None title = _("Type to search") def get_pbuf(m): return (m.get_thumbnail(self.icon_size*4//3, self.icon_size) or m.get_pixbuf(self.icon_size)) if self.source: icon = get_pbuf(self.source) title = (_("Type to search %s") % u"%s" % escape_markup_str(unicode(self.source))) self._set_match(None) self.match_state = State.Wait self.match_view.set_match_state(title, icon, state=State.Wait) class ActionSearch (Search): """ Customization for Actions """ def get_nomatch_name_icon(self, empty=False): # don't look up icons too early if not self._initialized: return ("", None) return _("No action"), icons.get_icon_for_name("kupfer-execute", self.icon_size) def setup_empty(self): self.handle_no_matches() self.hide_table() class Interface (gobject.GObject): """ Controller object that controls the input and the state (current active) search object/widget Signals: * cancelled: def callback(controller) escape was typed """ __gtype_name__ = "Interface" def __init__(self, controller, window): """ @controller: DataController @window: toplevel window """ gobject.GObject.__init__(self) self.search = LeafSearch() self.action = ActionSearch() self.third = LeafSearch() self.entry = gtk.Entry() self.label = gtk.Label() self.preedit = gtk.Entry() ## make sure we lose the preedit focus ring self.preedit.set_name("kupfer-preedit") gtk.rc_parse_string(""" style "kupferpreedit" { GtkEntry :: focus-line-width = 0 } widget "*.%s" style "kupferpreedit" """ % (self.preedit.path(), )) self.current = None self._widget = None self._ui_transition_timer = scheduler.Timer() self._pane_three_is_visible = False self._is_text_mode = False self._latest_input_timer = scheduler.Timer() self._slow_input_interval = 2 self._key_press_time = None self._key_press_interval = 0.3 self._key_press_repeat_threshold = 0.02 self._key_repeat_key = None self._key_repeat_active = False self._reset_to_toplevel = False self._reset_when_back = False self.entry.connect("realize", self._entry_realized) self.preedit.set_has_frame(False) self.preedit.set_inner_border(gtk.Border(0, 0, 0, 0)) self.preedit.set_width_chars(0) self.preedit.set_alignment(1) from pango import ELLIPSIZE_MIDDLE self.label.set_width_chars(50) self.label.set_single_line_mode(True) self.label.set_ellipsize(ELLIPSIZE_MIDDLE) self.label.set_name("kupfer-description") self.switch_to_source() self.entry.connect("changed", self._changed) self.preedit.connect("changed", self._preedit_changed) ## preedit-changed is GTK+ 2.20 ## if not available, silently skip it try: self.preedit.connect("preedit-changed", self._preedit_im_changed) except TypeError: pass for widget in (self.entry, self.preedit): widget.connect("activate", self._activate, None) widget.connect("key-press-event", self._entry_key_press) widget.connect("key-release-event", self._entry_key_release) widget.connect("copy-clipboard", self._entry_copy_clipboard) widget.connect("cut-clipboard", self._entry_cut_clipboard) widget.connect("paste-clipboard", self._entry_paste_clipboard) # set up panewidget => self signals # as well as window => panewidgets for widget in (self.search, self.action, self.third): widget.connect("activate", self._activate) widget.connect("button-press-event", self._panewidget_button_press) widget.connect("cursor-changed", self._selection_changed) # window signals window.connect("configure-event", widget._window_config) window.connect("hide", widget._window_hidden) self.data_controller = controller self.data_controller.connect("search-result", self._search_result) self.data_controller.connect("source-changed", self._new_source) self.data_controller.connect("pane-reset", self._pane_reset) self.data_controller.connect("mode-changed", self._show_hide_third) self.data_controller.connect("object-stack-changed", self._object_stack_changed) self.widget_to_pane = { id(self.search) : data.SourcePane, id(self.action) : data.ActionPane, id(self.third) : data.ObjectPane, } self.pane_to_widget = { data.SourcePane : self.search, data.ActionPane : self.action, data.ObjectPane : self.third, } # Setup keyval mapping keys = ( "Up", "Down", "Right", "Left", "Tab", "ISO_Left_Tab", "BackSpace", "Escape", "Delete", "space", 'Page_Up', 'Page_Down', 'Home', 'End', "Return", ) self.key_book = dict((k, gtk.gdk.keyval_from_name(k)) for k in keys) if not text_direction_is_ltr(): # for RTL languages, simply swap the meaning of Left and Right # (for keybindings!) D = self.key_book D["Left"], D["Right"] = D["Right"], D["Left"] self.keys_sensible = set(self.key_book.itervalues()) self.search.reset() def get_widget(self): """Return a Widget containing the whole Interface""" if self._widget: return self._widget box = gtk.HBox() box.pack_start(self.search, True, True, 3) box.pack_start(self.action, True, True, 3) box.pack_start(self.third, True, True, 3) vbox = gtk.VBox() vbox.pack_start(box, True, True, 0) label_align = gtk.Alignment(0.5, 1, 0, 0) label_align.set_property("top-padding", 3) label_align.add(self.label) vbox.pack_start(label_align, False, False, 0) vbox.pack_start(self.entry, False, False, 0) vbox.show_all() self.third.hide() self._widget = vbox return vbox def _entry_realized(self, widget): self.update_text_mode() def _entry_key_release(self, entry, event): return # check for key repeat activation (disabled) if self._key_repeat_key == event.keyval: if self._key_repeat_active: self.activate() self._key_repeat_key = None self._key_repeat_active = False self._update_active() def _entry_key_press(self, entry, event): """ Intercept arrow keys and manipulate table without losing focus from entry field """ direct_text_key = gtk.gdk.keyval_from_name("period") init_text_keys = map(gtk.gdk.keyval_from_name, ("slash", "equal")) init_text_keys.append(direct_text_key) keymap = gtk.gdk.keymap_get_default() # translate keys properly keyv, egroup, level, consumed = keymap.translate_keyboard_state( event.hardware_keycode, event.state, event.group) all_modifiers = gtk.accelerator_get_default_mod_mask() modifiers = all_modifiers & ~consumed # MOD1_MASK is alt/option mod1_mask = ((event.state & modifiers) == gtk.gdk.MOD1_MASK) shift_mask = ((event.state & all_modifiers) == gtk.gdk.SHIFT_MASK) text_mode = self.get_in_text_mode() has_input = bool(self.entry.get_text()) curtime = time.time() self._reset_input_timer() setctl = settings.GetSettingsController() # process accelerators for action, accel in setctl.get_accelerators().iteritems(): akeyv, amodf = gtk.accelerator_parse(accel) if not akeyv: continue if akeyv == keyv and (amodf == (event.state & modifiers)): action_method = getattr(self, action, None) if not action_method: pretty.print_error(__name__, "Action invalid '%s'" % action) else: action_method() return True key_book = self.key_book use_command_keys = setctl.get_use_command_keys() has_selection = (self.current.get_match_state() is State.Match) if not text_mode and use_command_keys: # translate extra commands to normal commands here # and remember skipped chars if keyv == key_book["space"]: if shift_mask: keyv = key_book["Up"] else: keyv = key_book["Down"] elif keyv == ord("/") and has_selection: keyv = key_book["Right"] elif keyv == ord(",") and has_selection: if self.comma_trick(): return True elif keyv in init_text_keys: if self.try_enable_text_mode(): # swallow if it is the direct key swallow = (keyv == direct_text_key) return swallow if text_mode and keyv in (key_book["Left"], key_book["Right"], key_book["Home"], key_book["End"]): # pass these through in text mode return False # disabled repeat-key activation and shift-to-action selection # check for repeated key activation """ if ((not text_mode) and self._key_repeat_key == keyv and keyv not in self.keys_sensible and curtime - self._key_press_time > self._key_press_repeat_threshold): if curtime - self._key_press_time > self._key_press_interval: self._key_repeat_active = True self._update_active() return True else: # cancel repeat key activation if a new key is pressed self._key_press_time = curtime self._key_repeat_key = keyv if self._key_repeat_active: self._key_repeat_active = False self._update_active() """ """ ## if typing with shift key, switch to action pane if not text_mode and use_command_keys and shift_mask: uchar = gtk.gdk.keyval_to_unicode(keyv) if (uchar and unichr(uchar).isupper() and self.current == self.search): self.current.hide_table() self.switch_current() return False """ # exit here if it's not a special key if keyv not in self.keys_sensible: return False self._reset_to_toplevel = False if keyv == key_book["Escape"]: self._escape_key_press() return True if keyv == key_book["Up"]: self.current.go_up() elif keyv == key_book["Page_Up"]: self.current.go_page_up() elif keyv == key_book["Down"]: ## if typing with shift key, switch to action pane if shift_mask and self.current == self.search: self.current.hide_table() self.switch_current() if (not self.current.get_current() and self.current.get_match_state() is State.Wait): self._populate_search() self.current.go_down() elif keyv == key_book["Page_Down"]: if (not self.current.get_current() and self.current.get_match_state() is State.Wait): self._populate_search() self.current.go_page_down() elif keyv == key_book["Right"]: self._browse_down(alternate=mod1_mask) elif keyv == key_book["BackSpace"]: if not has_input: self._backspace_key_press() elif not text_mode: self.entry.delete_text(self.entry.get_text_length() - 1, -1) else: return False elif keyv == key_book["Left"]: self._back_key_press() elif keyv in (key_book["Tab"], key_book["ISO_Left_Tab"]): self.current.hide_table() self.switch_current(reverse=(keyv == key_book["ISO_Left_Tab"])) elif keyv == key_book['Home']: self.current.go_first() else: # cont. processing return False return True def _entry_copy_clipboard(self, entry): # Copy current selection to clipboard # delegate to text entry when in text mode if self.get_in_text_mode(): return False selection = self.current.get_current() if selection is None: return False clip = gtk.Clipboard(selection=gtk.gdk.SELECTION_CLIPBOARD, display=entry.get_display()) return interface.copy_to_clipboard(selection, clip) def _entry_cut_clipboard(self, entry): if not self._entry_copy_clipboard(entry): return False self.reset_current() self.reset() def _entry_paste_data_received(self, clipboard, targets, entry): uri_target = "text/uri-list" ## check if we can insert files if uri_target in targets: # paste as files sdata = clipboard.wait_for_contents(uri_target) self.reset_current() self.reset() self.put_files(sdata.get_uris()) ## done else: # enable text mode and reemit to paste text self.try_enable_text_mode() if self.get_in_text_mode(): entry.emit("paste-clipboard") def _entry_paste_clipboard(self, entry): if not self.get_in_text_mode(): self.reset() ## when not in text mode, ## stop signal emission so we can handle it clipboard = gtk.Clipboard(selection=gtk.gdk.SELECTION_CLIPBOARD, display=entry.get_display()) clipboard.request_targets(self._entry_paste_data_received, entry) entry.emit_stop_by_name("paste-clipboard") def reset_text(self): self.entry.set_text("") def reset(self): self.reset_text() self.current.hide_table() def reset_current(self, populate=False): """ Reset the source or action view Corresponds to backspace """ if self.current.get_match_state() is State.Wait: self.toggle_text_mode(False) if self.current is self.action or populate: self._populate_search() else: self.current.reset() def reset_all(self): """Reset all panes and focus the first""" self.switch_to_source() while self._browse_up(): pass self.toggle_text_mode(False) self.data_controller.object_stack_clear_all() self.reset_current() self.reset() def _populate_search(self): """Do a blanket search/empty search to populate current pane""" pane = self._pane_for_widget(self.current) self.data_controller.search(pane, interactive=True) def soft_reset(self, pane=None): """Reset @pane or current pane context/source softly (without visible update), and unset _reset_to_toplevel marker. """ pane = pane or self._pane_for_widget(self.current) newsrc = self.data_controller.soft_reset(pane) if newsrc: self.current.set_source(newsrc) self._reset_to_toplevel = False def _escape_key_press(self): """Handle escape if first pane is reset, cancel (put away) self. """ if self.current.has_result(): if self.current.is_showing_result(): self.reset_current(populate=True) else: self.reset_current() else: if self.get_in_text_mode(): self.toggle_text_mode(False) elif not self.current.get_table_visible(): pane = self._pane_for_widget(self.current) self.data_controller.object_stack_clear(pane) self.emit("cancelled") self._reset_to_toplevel = True self.current.hide_table() self.reset_text() def _backspace_key_press(self): # backspace: delete from stack pane = self._pane_for_widget(self.current) if self.data_controller.get_object_stack(pane): self.data_controller.object_stack_pop(pane) self.reset_text() return self._back_key_press() def _back_key_press(self): # leftarrow (or backspace without object stack) # delete/go up through stource stack if self.current.is_showing_result(): self.reset_current(populate=True) else: if self._browse_up(): pass else: self.reset() self.reset_current() self._reset_to_toplevel = True self.reset_text() def _relax_search_terms(self): if self.get_in_text_mode(): return self.reset_text() self.current.relax_match() def get_in_text_mode(self): return self._is_text_mode def get_can_enter_text_mode(self): """We can enter text mode if the data backend allows, and the text entry is ready for input (empty) """ pane = self._pane_for_widget(self.current) val = self.data_controller.get_can_enter_text_mode(pane) entry_text = self.entry.get_text() return val and not entry_text def try_enable_text_mode(self): """Perform a soft reset if possible and then try enabling text mode""" if self._reset_to_toplevel: self.soft_reset() if self.get_can_enter_text_mode(): return self.toggle_text_mode(True) return False def toggle_text_mode(self, val): """Toggle text mode on/off per @val, and return the subsequent on/off state. """ val = bool(val) and self.get_can_enter_text_mode() self._is_text_mode = val self.update_text_mode() self.reset() return val def toggle_text_mode_quick(self): """Toggle text mode or not, if we can or not, without reset""" if self._is_text_mode: self._is_text_mode = False else: self._is_text_mode = True self.update_text_mode() def update_text_mode(self): """update appearance to whether text mode enabled or not""" if self._is_text_mode: self.entry.show() self.entry.grab_focus() self.entry.set_position(-1) self.preedit.hide() self.preedit.set_width_chars(0) else: self.entry.hide() self._update_active() def switch_to_source(self): if self.current is not self.search: if self.current: self.current.hide_table() self.current = self.search self._update_active() if self.get_in_text_mode(): self.toggle_text_mode_quick() def focus(self): """called when the interface is focus (after being away)""" if self._reset_when_back: self._reset_when_back = False self.toggle_text_mode(False) # preserve text mode, but switch to source if we are not in it if not self.get_in_text_mode(): self.switch_to_source() # Check that items are still valid when "coming back" self.data_controller.validate() def did_launch(self): "called to notify that 'activate' was successful" self._reset_when_back = True def put_away(self): """Called when the interface is hidden""" self._relax_search_terms() self._reset_to_toplevel = True # no hide / show pane three on put away -> focus anymore def select_selected_file(self): # Add optional lookup data to narrow the search self.data_controller.find_object("qpfer:selectedfile#any.FileLeaf") def select_selected_text(self): self.data_controller.find_object("qpfer:selectedtext#any.TextLeaf") def select_quit(self): self.data_controller.find_object("qpfer:quit") def show_help(self): kupferui.show_help(self._make_gui_ctx()) self.emit("launched-action") def show_preferences(self): kupferui.show_preferences(self._make_gui_ctx()) self.emit("launched-action") def compose_action(self): self.data_controller.compose_selection() def mark_as_default(self): if self.action.get_match_state() != State.Match: return False self.data_controller.mark_as_default(data.ActionPane) return True def erase_affinity_for_first_pane(self): if self.search.get_match_state() != State.Match: return False self.data_controller.erase_object_affinity(data.SourcePane) return True def comma_trick(self): if self.current.get_match_state() != State.Match: return False cur = self.current.get_current() curpane = self._pane_for_widget(self.current) if self.data_controller.object_stack_push(curpane, cur): self._relax_search_terms() if self.get_in_text_mode(): self.reset_text() return True def get_context_actions(self): """ Get a list of (name, function) currently active context actions """ def get_accel(key): """ Return name, method pair for @key""" if key not in accelerators.ACCELERATOR_NAMES: raise RuntimeError("Missing accelerator: %s" % key) return (accelerators.ACCELERATOR_NAMES[key], getattr(self, key)) def trunc(ustr): "truncate long object names" return ustr[:25] has_match = self.current.get_match_state() == State.Match if has_match: yield get_accel('compose_action') yield get_accel('select_selected_text') if self.get_can_enter_text_mode(): yield get_accel('toggle_text_mode_quick') if self.action.get_match_state() == State.Match: smatch = self.search.get_current() amatch = self.action.get_current() label = (_('Make "%(action)s" Default for "%(object)s"') % { 'action': trunc(unicode(amatch)), 'object': trunc(unicode(smatch)), }) w_label = textwrap.wrap(label, width=40, subsequent_indent=" ") yield (u"\n".join(w_label), self.mark_as_default) if has_match: if self.data_controller.get_object_has_affinity(data.SourcePane): match = self.search.get_current() # TRANS: Removing learned and/or configured bonus search score yield (_('Forget About "%s"') % trunc(unicode(match)), self.erase_affinity_for_first_pane) if has_match: yield get_accel('reset_all') def _pane_reset(self, controller, pane, item): wid = self._widget_for_pane(pane) if not item: wid.reset() else: wid.set_match_plain(item) if wid is self.search: self.reset() self.toggle_text_mode(False) self.switch_to_source() def _new_source(self, sender, pane, source, at_root): """Notification about a new data source, (represented object for the self.search object """ wid = self._widget_for_pane(pane) wid.set_source(source) wid.reset() if pane is data.SourcePane: self.switch_to_source() self.action.reset() if wid is self.current: self.toggle_text_mode(False) self._reset_to_toplevel = False if not at_root: self.reset_current(populate=True) wid.show_table() def _show_hide_third(self, ctr, mode, ignored): if mode is data.SourceActionObjectMode: # use a delay before showing the third pane, # but set internal variable to "shown" already now self._pane_three_is_visible = True self._ui_transition_timer.set_ms(200, self._show_third_pane, True) else: self._pane_three_is_visible = False self._show_third_pane(False) def _show_third_pane(self, show): self._ui_transition_timer.invalidate() self.third.set_property("visible", show) def _update_active(self): for panewidget in (self.action, self.search, self.third): if panewidget is not self.current: panewidget.set_state(gtk.STATE_NORMAL) panewidget.match_view.inject_preedit(None) if self._is_text_mode or self._key_repeat_active: self.current.set_state(gtk.STATE_ACTIVE) else: self.current.set_state(gtk.STATE_SELECTED) self.current.match_view.inject_preedit(self.preedit) self._description_changed() def switch_current(self, reverse=False): # Only allow switch if we have match order = [self.search, self.action] if self._pane_three_is_visible: order.append(self.third) curidx = order.index(self.current) newidx = curidx -1 if reverse else curidx +1 newidx %= len(order) prev_pane = order[max(newidx -1, 0)] new_focus = order[newidx] if (prev_pane.get_match_state() is State.Match and new_focus is not self.current): self.current = new_focus # Use toggle_text_mode to reset self.toggle_text_mode(False) pane = self._pane_for_widget(new_focus) self._update_active() if self.data_controller.get_should_enter_text_mode(pane): self.toggle_text_mode_quick() def _browse_up(self): pane = self._pane_for_widget(self.current) return self.data_controller.browse_up(pane) def _browse_down(self, alternate=False): pane = self._pane_for_widget(self.current) self.data_controller.browse_down(pane, alternate=alternate) def _make_gui_ctx(self): timestamp = gtk.get_current_event_time() return uievents.gui_context_from_widget(timestamp, self._widget) def _activate(self, widget, current): self.data_controller.activate(ui_ctx=self._make_gui_ctx()) def activate(self): """Activate current selection (Run action)""" self._activate(None, None) def execute_file(self, filepath, display, timestamp): """Execute a .kfcom file""" def _handle_error(exc_info): from kupfer import uiutils etype, exc, tb = exc_info if not uiutils.show_notification(unicode(exc), icon_name="kupfer"): raise ctxenv = uievents.gui_context_from_keyevent(timestamp, display) self.data_controller.execute_file(filepath, ctxenv, _handle_error) def _search_result(self, sender, pane, matchrankable, matches, context): # NOTE: "Always-matching" search. # If we receive an empty match, we ignore it, to retain the previous # results. The user is not served by being met by empty results. key = context if key and len(key) > 1 and matchrankable is None: # with typos or so, reset quicker self._latest_input_timer.set(self._slow_input_interval/2, self._relax_search_terms) return wid = self._widget_for_pane(pane) wid.update_match(key, matchrankable, matches) def _widget_for_pane(self, pane): return self.pane_to_widget[pane] def _pane_for_widget(self, widget): return self.widget_to_pane[id(widget)] def _object_stack_changed(self, controller, pane): """ Stack of objects (for comma trick) changed in @pane """ wid = self._widget_for_pane(pane) wid.set_object_stack(controller.get_object_stack(pane)) def _panewidget_button_press(self, widget, event): " mouse clicked on a pane widget " # activate on double-click if event.type == gtk.gdk._2BUTTON_PRESS: self.activate() return True def _selection_changed(self, widget, match): pane = self._pane_for_widget(widget) self.data_controller.select(pane, match) if not widget is self.current: return self._description_changed() def _description_changed(self): match = self.current.get_current() desc = match and match.get_description() or "" markup = "%s" % (escape_markup_str(desc), ) self.label.set_markup(markup) def put_text(self, text): """ Put @text into the interface to search, to use for "queries" from other sources """ self.try_enable_text_mode() self.entry.set_text(text) self.entry.set_position(-1) def put_files(self, fileuris): leaves = map(interface.get_fileleaf_for_path, filter(None, [gio.File(U).get_path() for U in fileuris])) if leaves: self.data_controller.insert_objects(data.SourcePane, leaves) def _reset_input_timer(self): # if input is slow/new, we reset self._latest_input_timer.set(self._slow_input_interval, self._relax_search_terms) def _preedit_im_changed(self, editable, preedit_string): """ This is called whenever the input method changes its own preedit box. We take this opportunity to expand it. """ if preedit_string: self.current.match_view.expand_preedit(self.preedit) self._reset_input_timer() def _preedit_changed(self, editable): """ The preedit has changed. As below, we need to use unicode. """ text = editable.get_text() text = text.decode("UTF-8") if text: self.entry.insert_text(text, -1) self.entry.set_position(-1) editable.delete_text(0, -1) # uncomment this to reset width after every commit. # self.current.match_view.shrink_preedit(self.preedit) self._reset_input_timer() self._update_active() def _changed(self, editable): """ The entry changed callback: Here we have to be sure to use **UNICODE** (unicode()) for the entered text """ # @text is UTF-8 text = editable.get_text() text = text.decode("UTF-8") # draw character count as icon if self.get_in_text_mode() and text: w, h = editable.size_request() sz = h - 3 c = editable.style.text[gtk.STATE_NORMAL] textc = (c.red/65535.0, c.green/65535.0, c.blue/65535.0) pb = get_glyph_pixbuf(str(len(text)), sz, color=textc) editable.set_icon_from_pixbuf(gtk.ENTRY_ICON_SECONDARY, pb) else: editable.set_icon_from_pixbuf(gtk.ENTRY_ICON_SECONDARY, None) # cancel search and return if empty if not text: self.data_controller.cancel_search() # See if it was a deleting key press curev = gtk.get_current_event() if (curev and curev.type == gtk.gdk.KEY_PRESS and curev.keyval in (self.key_book["Delete"], self.key_book["BackSpace"])): self._backspace_key_press() return # start search for updated query pane = self._pane_for_widget(self.current) if not self.get_in_text_mode() and self._reset_to_toplevel: self.soft_reset(pane) self.data_controller.search(pane, key=text, context=text, text_mode=self.get_in_text_mode()) gobject.type_register(Interface) gobject.signal_new("cancelled", Interface, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, ()) # Send only when the interface itself launched an action directly gobject.signal_new("launched-action", Interface, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, ()) class KupferWindow (gtk.Window): __gtype_name__ = "KupferWindow" def __init__(self, *args): super(KupferWindow, self).__init__(*args) self.connect("style-set", self.on_style_set) self.set_name("kupfer") self.connect("expose-event", self.on_expose_event) self.connect("size-allocate", self.on_size_allocate) self.connect("composited-changed", self.on_composited_changed) self.connect("realize", self.on_realize) self.set_app_paintable(True) def on_style_set(self, widget, old_style): widget.set_property('decorated', widget.style_get_property('decorated')) widget.set_property('border-width', widget.style_get_property('border-width')) def on_expose_event(self, widget, event): cr = widget.window.cairo_create() w,h = widget.allocation.width, widget.allocation.height region = gtk.gdk.region_rectangle(event.area) cr.region(region) cr.clip() def rgba_from_gdk(c, alpha): return (c.red/65535.0, c.green/65535.0, c.blue/65535.0, alpha) radius = widget.style_get_property('corner-radius') if widget.is_composited(): opacity = 0.01*widget.style_get_property('opacity') #cr.set_operator(cairo.OPERATOR_CLEAR) cr.set_operator(cairo.OPERATOR_SOURCE) cr.set_source_rgba(0,0,0,0) cr.rectangle(0,0,w,h) cr.fill() #cr.rectangle(0,0,w,h) make_rounded_rect(cr, 0, 0, w, h, radius) cr.set_operator(cairo.OPERATOR_SOURCE) c = widget.style.bg[widget.get_state()] cr.set_source_rgba(*rgba_from_gdk(c, opacity)) cr.fill() c = widget.style.dark[gtk.STATE_SELECTED] cr.set_operator(cairo.OPERATOR_OVER) cr.set_source_rgba(*rgba_from_gdk(c, 0.7)) make_rounded_rect(cr, 0, 0, w, h, radius) cr.set_line_width(1) cr.stroke() def on_composited_changed(self, widget): self.reshape(widget, widget.get_allocation()) def on_realize(self, widget): self.reshape(widget, widget.get_allocation()) def on_size_allocate(self, widget, allocation): if not hasattr(self, "_old_alloc"): self._old_alloc = (0,0) w,h = allocation.width, allocation.height if self._old_alloc == (w,h): return self._old_alloc = (w,h) self.reshape(widget, allocation) def reshape(self, widget, allocation): ## if not composited, use rounded window shape w,h = allocation.width, allocation.height radius = widget.style_get_property('corner-radius') if not widget.is_composited() and radius: bitmap = gtk.gdk.Pixmap(None, w, h, 1) cr = bitmap.cairo_create() cr.set_source_rgb(0.0, 0.0, 0.0) cr.set_operator(cairo.OPERATOR_CLEAR) cr.paint() # radius of rounded corner cr.set_source_rgb(1.0, 1.0, 1.0) cr.set_operator(cairo.OPERATOR_SOURCE) make_rounded_rect(cr, 0, 0, w, h, radius) cr.fill() widget.shape_combine_mask(bitmap, 0, 0) else: if widget.window: widget.window.shape_combine_mask(None, 0, 0) if widget.window: widget.window.invalidate_rect(gtk.gdk.Rectangle(0, 0, w, h), False) gobject.type_register(KupferWindow) gtk.widget_class_install_style_property(KupferWindow, ('corner-radius', gobject.TYPE_INT, 'Corner radius', 'Radius of bezel around window', 0, 50, 15, gobject.PARAM_READABLE)) gtk.widget_class_install_style_property(KupferWindow, ('opacity', gobject.TYPE_INT, 'Frame opacity', 'Opacity of window background', 50, 100, 85, gobject.PARAM_READABLE)) gtk.widget_class_install_style_property(KupferWindow, ('decorated', gobject.TYPE_BOOLEAN, 'Decorated', 'Whether to use window decorations', False, gobject.PARAM_READABLE)) gtk.widget_class_install_style_property(KupferWindow, ('border-width', gobject.TYPE_INT, 'Border width', 'Width of border around window content', 0, 100, 8, gobject.PARAM_READABLE)) class WindowController (pretty.OutputMixin): """ This is the fundamental Window (and App) Controller """ def __init__(self): self.window = None self.current_screen_handler = 0 self.current_screen = None self.interface = None self._statusicon = None self._window_hide_timer = scheduler.Timer() def initialize(self, data_controller): self.window = KupferWindow(gtk.WINDOW_TOPLEVEL) self.window.add_events(gtk.gdk.BUTTON_PRESS_MASK) #data_controller = data.DataController() data_controller.connect("launched-action", self.launch_callback) data_controller.connect("command-result", self.result_callback) self.interface = Interface(data_controller, self.window) self.interface.connect("launched-action", self.launch_callback) self.interface.connect("cancelled", self._cancelled) self._setup_window() def show_statusicon(self): if not self._statusicon: self._statusicon = self._setup_status_icon() try: self._statusicon.set_visible(True) except AttributeError: pass def hide_statusicon(self): if self._statusicon: try: self._statusicon.set_visible(False) except AttributeError: self._statusicon = None def _showstatusicon_changed(self, setctl, section, key, value): "callback from SettingsController" if value: self.show_statusicon() else: self.hide_statusicon() def _setup_menu(self, context_menu=False): menu = gtk.Menu() menu.set_name("kupfer-menu") def submenu_callback(menuitem, callback): callback() return True def add_menu_item(icon, callback, label=None, with_ctx=True): def mitem_handler(menuitem, callback): if with_ctx: time = gtk.get_current_event_time() ui_ctx = uievents.gui_context_from_widget(time, menuitem) callback(ui_ctx) else: callback() if context_menu: self.put_away() return True mitem = None if label and not icon: mitem = gtk.MenuItem(label=label) else: mitem = gtk.ImageMenuItem(icon) mitem.connect("activate", mitem_handler, callback) menu.append(mitem) if context_menu: add_menu_item(gtk.STOCK_CLOSE, self.put_away, with_ctx=False) else: add_menu_item(None, self.activate, _("Show Main Interface")) menu.append(gtk.SeparatorMenuItem()) if context_menu: for name, func in self.interface.get_context_actions(): mitem = gtk.MenuItem(label=name) mitem.connect("activate", submenu_callback, func) menu.append(mitem) menu.append(gtk.SeparatorMenuItem()) add_menu_item(gtk.STOCK_PREFERENCES, kupferui.show_preferences) add_menu_item(gtk.STOCK_HELP, kupferui.show_help) add_menu_item(gtk.STOCK_ABOUT, kupferui.show_about_dialog) menu.append(gtk.SeparatorMenuItem()) add_menu_item(gtk.STOCK_QUIT, self.quit, with_ctx=False) menu.show_all() return menu def _setup_status_icon(self): menu = self._setup_menu() try: import appindicator except ImportError: appindicator = None else: ## make sure dbus is available, else appindicator crashes import dbus try: dbus.Bus() except dbus.DBusException: appindicator = None if appindicator: return self._setup_appindicator(menu) else: return self._setup_gtk_status_icon(menu) def _setup_gtk_status_icon(self, menu): status = gtk.status_icon_new_from_icon_name(version.ICON_NAME) status.set_tooltip(version.PROGRAM_NAME) status.connect("popup-menu", self._popup_menu, menu) status.connect("activate", self.show_hide) return status def _setup_appindicator(self, menu): import appindicator indicator = appindicator.Indicator(version.PROGRAM_NAME, version.ICON_NAME, appindicator.CATEGORY_APPLICATION_STATUS) indicator.set_status(appindicator.STATUS_ACTIVE) indicator.set_menu(menu) return indicator def _setup_window(self): """ Returns window """ self.window.connect("delete-event", self._close_window) self.window.connect("focus-out-event", self._lost_focus) self.window.connect("button-press-event", self._window_frame_clicked) widget = self.interface.get_widget() widget.show() # Build the window frame with its top bar topbar = gtk.HBox() vbox = gtk.VBox() vbox.pack_start(topbar, False, False) vbox.pack_start(widget, True, True) vbox.show() self.window.add(vbox) title = gtk.Label(u"") button = gtk.Label(u"") l_programname = version.PROGRAM_NAME.lower() # The text on the general+context menu button btext = u"%s \N{GEAR}" % (l_programname, ) button.set_markup(btext) button_box = gtk.EventBox() button_box.set_visible_window(False) button_adj = gtk.Alignment(0.5, 0.5, 0, 0) button_adj.set_padding(0, 2, 0, 3) button_adj.add(button) button_box.add(button_adj) button_box.connect("button-press-event", self._context_clicked) button_box.connect("enter-notify-event", self._button_enter, button, btext) button_box.connect("leave-notify-event", self._button_leave, button, btext) button.set_name("kupfer-menu-button") title_align = gtk.Alignment(0, 0.5, 0, 0) title_align.add(title) topbar.pack_start(title_align, True, True) topbar.pack_start(button_box, False, False) topbar.show_all() self.window.set_title(version.PROGRAM_NAME) self.window.set_icon_name(version.ICON_NAME) self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_UTILITY) self.window.set_property("skip-taskbar-hint", True) self.window.set_keep_above(True) if not text_direction_is_ltr(): self.window.set_gravity(gtk.gdk.GRAVITY_NORTH_EAST) # Setting not resizable changes from utility window # on metacity self.window.set_resizable(False) def _window_frame_clicked(self, widget, event): "Start drag when the window is clicked" widget.begin_move_drag(event.button, int(event.x_root), int(event.y_root), event.time) def _context_clicked(self, widget, event): "The context menu label was clicked" menu = self._setup_menu(True) menu.set_screen(self.window.get_screen()) menu.popup(None, None, None, event.button, event.time) return True def _button_enter(self, widget, event, button, udata): "Pointer enters context menu button" button.set_markup("" + udata + "") def _button_leave(self, widget, event, button, udata): "Pointer leaves context menu button" button.set_markup(udata) def _popup_menu(self, status_icon, button, activate_time, menu): """ When the StatusIcon is right-clicked """ menu.popup(None, None, gtk.status_icon_position_menu, button, activate_time, status_icon) def launch_callback(self, sender): # Separate window hide from the action being # done. This is to solve a window focus bug when # we switch windows using an action self.interface.did_launch() self._window_hide_timer.set_ms(100, self.put_away) def result_callback(self, sender, result_type, ui_ctx): if ui_ctx: self.on_present(sender, ui_ctx.get_display(), ui_ctx.get_timestamp()) else: self.on_present(sender, "", gtk.get_current_event_time()) def _lost_focus(self, window, event): # Close at unfocus. # Since focus-out-event is triggered even # when we click inside the window, we'll # do some additional math to make sure that # that window won't close if the mouse pointer # is over it. x, y, mods = window.get_screen().get_root_window().get_pointer() w_x, w_y = window.get_position() w_w, w_h = window.get_size() if (x not in xrange(w_x, w_x + w_w) or y not in xrange(w_y, w_y + w_h)): self._window_hide_timer.set_ms(50, self.put_away) def _monitors_changed(self, *ignored): self._center_window() def is_current_display(self, displayname): def norm_name(name): "Make :0.0 out of :0" if name[-2] == ":": return name + ".0" return name if not self.window.has_screen(): return False cur_disp = self.window.get_screen().get_display().get_name() return norm_name(cur_disp) == norm_name(displayname) def _window_put_on_screen(self, screen): if self.current_screen_handler: scr = self.window.get_screen() scr.disconnect(self.current_screen_handler) rgba = screen.get_rgba_colormap() if rgba: self.window.unrealize() self.window.set_screen(screen) self.window.set_colormap(rgba) self.window.realize() else: self.window.set_screen(screen) self.current_screen_handler = \ screen.connect("monitors-changed", self._monitors_changed) self.current_screen = screen def _center_window(self, displayname=None): """Center Window on the monitor the pointer is currently on""" def norm_name(name): "Make :0.0 out of :0" if name[-2] == ":": return name + ".0" return name if not displayname and self.window.has_screen(): display = self.window.get_display() else: display = uievents.GUIEnvironmentContext.ensure_display_open(displayname) screen, x, y, modifiers = display.get_pointer() self._window_put_on_screen(screen) monitor_nr = screen.get_monitor_at_point(x, y) geo = screen.get_monitor_geometry(monitor_nr) wid, hei = self.window.get_size() midx = geo.x + geo.width / 2 - wid / 2 midy = geo.y + geo.height / 2 - hei / 2 self.window.move(midx, midy) uievents.GUIEnvironmentContext._try_close_unused_displays(screen) def _should_recenter_window(self): """Return True if the mouse pointer and the window are on different monitors. """ # Check if the GtkWindow was realized yet if not self.window.window: return True display = self.window.get_screen().get_display() screen, x, y, modifiers = display.get_pointer() return (screen.get_monitor_at_point(x,y) != screen.get_monitor_at_window(self.window.window)) def activate(self, sender=None): dispname = self.window.get_screen().make_display_name() self.on_present(sender, dispname, gtk.get_current_event_time()) def on_present(self, sender, display, timestamp): """Present on @display, where None means default display""" self._window_hide_timer.invalidate() if not display: display = gtk.gdk.display_get_default().get_name() if (self._should_recenter_window() or not self.is_current_display(display)): self._center_window(display) self.window.stick() self.window.present_with_time(timestamp) self.window.window.focus(timestamp=timestamp) self.interface.focus() def put_away(self): self.interface.put_away() self.window.hide() def _cancelled(self, widget): self.put_away() def on_show_hide(self, sender, display, timestamp): """ Toggle activate/put-away """ if self.window.get_property("visible"): self.put_away() else: self.on_present(sender, display, timestamp) def show_hide(self, sender): "GtkStatusIcon callback" self.on_show_hide(sender, "", gtk.get_current_event_time()) def _key_binding(self, keyobj, keybinding_number, display, timestamp): """Keybinding activation callback""" if keybinding_number == keybindings.KEYBINDING_DEFAULT: self.on_show_hide(keyobj, display, timestamp) elif keybinding_number == keybindings.KEYBINDING_MAGIC: self.on_present(keyobj, display, timestamp) self.interface.select_selected_text() self.interface.select_selected_file() def on_put_text(self, sender, text, display, timestamp): """We got a search text from dbus""" self.on_present(sender, display, timestamp) self.interface.put_text(text) def on_put_files(self, sender, fileuris, display, timestamp): self.on_present(sender, display, timestamp) self.interface.put_files(fileuris) def on_execute_file(self, sender, filepath, display, timestamp): self.interface.execute_file(filepath, display, timestamp) def _close_window(self, window, event): self.put_away() return True def _destroy(self, widget, data=None): self.quit() def _sigterm(self, signal, frame): self.output_info("Caught signal", signal, "exiting..") self.quit() def _on_early_interrupt(self, signal, frame): sys.exit(1) def save_data(self): """Save state before quit""" sch = scheduler.GetScheduler() sch.finish() def quit(self, sender=None): gtk.main_quit() def quit_now(self): """Quit immediately (state save should already be done)""" raise SystemExit def _session_save(self, *args): """Old-style session save callback. ret True on successful """ # No quit, only save self.output_info("Saving for logout...") self.save_data() return True def _session_die(self, *args): """Session callback on session end quit now, without saving, since we already do that on Session save! """ self.quit_now() def lazy_setup(self): """Do all setup that can be done after showing main interface. Connect to desktop services (keybinding callback, session logout callbacks etc). """ from kupfer.ui import session self.output_debug("in lazy_setup") setctl = settings.GetSettingsController() if setctl.get_show_status_icon(): self.show_statusicon() setctl.connect("value-changed::kupfer.showstatusicon", self._showstatusicon_changed) keystr = setctl.get_keybinding() magickeystr = setctl.get_magic_keybinding() if keystr: succ = keybindings.bind_key(keystr) self.output_info("Trying to register %s to spawn kupfer.. %s" % (keystr, "success" if succ else "failed")) if magickeystr: succ = keybindings.bind_key(magickeystr, keybindings.KEYBINDING_MAGIC) self.output_debug("Trying to register %s to spawn kupfer.. %s" % (magickeystr, "success" if succ else "failed")) keyobj = keybindings.GetKeyboundObject() keyobj.connect("keybinding", self._key_binding) signal.signal(signal.SIGINT, self._sigterm) signal.signal(signal.SIGTERM, self._sigterm) signal.signal(signal.SIGHUP, self._sigterm) client = session.SessionClient() client.connect("save-yourself", self._session_save) client.connect("die", self._session_die) self.output_debug("finished lazy_setup") def main(self, quiet=False): """Start WindowController, present its window (if not @quiet)""" signal.signal(signal.SIGINT, self._on_early_interrupt) try: kserv = listen.Service() except listen.AlreadyRunningError: self.output_info("An instance is already running, exiting...") self.quit_now() except listen.NoConnectionError: kserv = None else: keyobj = keybindings.GetKeyboundObject() keyobj.connect("bound-key-changed", lambda x,y,z: kserv.BoundKeyChanged(y,z)) kserv.connect("relay-keys", keyobj.relayed_keys) # Load data data_controller = data.DataController() sch = scheduler.GetScheduler() sch.load() # Now create UI and display self.initialize(data_controller) sch.display() if kserv: kserv.connect("present", self.on_present) kserv.connect("show-hide", self.on_show_hide) kserv.connect("put-text", self.on_put_text) kserv.connect("put-files", self.on_put_files) kserv.connect("execute-file", self.on_execute_file) kserv.connect("quit", self.quit) if not quiet: self.activate() gobject.idle_add(self.lazy_setup) def do_main_iterations(max_events=0): # use sentinel form of iter for idx, pending in enumerate(iter(gtk.events_pending, False)): if max_events and idx > max_events: break gtk.main_iteration() try: gtk.main() # put away window *before exiting further* self.put_away() do_main_iterations(10) finally: self.save_data() # tear down but keep hanging if kserv: kserv.unregister() keybindings.bind_key(None, keybindings.KEYBINDING_DEFAULT) keybindings.bind_key(None, keybindings.KEYBINDING_MAGIC) do_main_iterations(100) # if we are still waiting, print a message if gtk.events_pending(): self.output_info("Waiting for tasks to finish...") do_main_iterations() kupfer-v208/kupfer/ui/credentials_dialog.py000066400000000000000000000032771176220042200211530ustar00rootroot00000000000000import gtk from kupfer import version, config, kupferstring class CredentialsDialogController(): def __init__(self, username, password, infotext=None): """Load ui from data file""" builder = gtk.Builder() builder.set_translation_domain(version.PACKAGE_NAME) ui_file = config.get_data_file("credentials_dialog.ui") builder.add_from_file(ui_file) builder.connect_signals(self) self.window = builder.get_object("credentials_dialog") self.entry_user = builder.get_object('entry_username') self.entry_pass = builder.get_object('entry_password') if infotext: hbox_information = builder.get_object('hbox_information') label_information = builder.get_object('label_information') hbox_information.show() label_information.set_text(infotext) self.entry_user.set_text(username or '') self.entry_pass.set_text(password or '') def on_button_ok_clicked(self, widget): self.window.response(gtk.RESPONSE_ACCEPT) self.window.hide() def on_button_cancel_clicked(self, widget): self.window.response(gtk.RESPONSE_CANCEL) self.window.hide() def show(self): return self.window.run() @property def username(self): return kupferstring.tounicode(self.entry_user.get_text()) @property def password(self): return kupferstring.tounicode(self.entry_pass.get_text()) def ask_user_credentials(user=None, password=None, infotext=None): ''' Ask user for username and password. @user, @password - initial values @return: (user, password) when user press "change" None when user press "cancel" button ''' dialog = CredentialsDialogController(user, password, infotext) result = None if dialog.show() == gtk.RESPONSE_ACCEPT: result = dialog.username, dialog.password return result kupfer-v208/kupfer/ui/getkey_dialog.py000066400000000000000000000064411176220042200201420ustar00rootroot00000000000000 import gtk from kupfer import version, config class GetKeyDialogController(object): def __init__(self, check_callback=None, previous_key=None, screen=None): '''@check_callback - optional function to check is entered key is valid. @previous_key - optional previous keybinding, press equal act like cancel''' builder = gtk.Builder() builder.set_translation_domain(version.PACKAGE_NAME) ui_file = config.get_data_file("getkey_dialog.ui") builder.add_from_file(ui_file) builder.connect_signals(self) self.window = builder.get_object("dialoggetkey") self.labelkey = builder.get_object('labelkey') self.imagekeybindingaux = builder.get_object('imagekeybindingaux') self.labelkeybindingaux = builder.get_object('labelkeybindingaux') self.labelaccelerator = builder.get_object('labelaccelerator') self.imagekeybindingaux.hide() self.labelkeybindingaux.hide() self._key = None self._check_callback = check_callback self._previous_key = previous_key self._press_time = None if screen: self.window.set_screen(screen) self.window.connect("focus-in-event", self.on_window_focus_in) self.window.connect("focus-out-event", self.on_window_focus_out) def run(self): ''' Run dialog, return key codes or None when user press cancel''' self.window.set_keep_above(True) self.window.run() self.window.destroy() return self._key def _return(self, key): " Finish dialog with @key as result" self._key = key self.window.hide() def on_buttoncancel_activate(self, _widget): self._return(None) def translate_keyboard_event(self, widget, event): keymap = gtk.gdk.keymap_get_for_display(widget.get_display()) # translate keys properly keyval, egroup, level, consumed = keymap.translate_keyboard_state( event.hardware_keycode, event.state, event.group) modifiers = gtk.accelerator_get_default_mod_mask() & ~consumed state = event.state & modifiers return keyval, state def update_accelerator_label(self, keyval, state): accel_label = gtk.accelerator_get_label(keyval, state) self.labelaccelerator.set_text(accel_label) def on_dialoggetkey_key_press_event(self, widget, event): self.imagekeybindingaux.hide() self.labelkeybindingaux.hide() self._press_time = event.time keyval, state = self.translate_keyboard_event(widget, event) keyname = gtk.accelerator_name(keyval, state) if keyname == 'Escape': self._return(None) elif keyname == 'BackSpace': self._return('') self.update_accelerator_label(keyval, state) def on_dialoggetkey_key_release_event(self, widget, event): if not self._press_time: return keyval, state = self.translate_keyboard_event(widget, event) self.update_accelerator_label(0, 0) if gtk.accelerator_valid(keyval, state): key = gtk.accelerator_name(keyval, state) if (self._previous_key is not None and key == self._previous_key): self._return(None) return if self._check_callback is None or self._check_callback(key): self._return(key) else: self.imagekeybindingaux.show() self.labelkeybindingaux.show() def on_window_focus_in(self, window, _event): pass def on_window_focus_out(self, _window, _event): pass def ask_for_key(check_callback=None, previous_key=None, screen=None): dlg = GetKeyDialogController(check_callback, previous_key, screen) result = dlg.run() return result kupfer-v208/kupfer/ui/keybindings.py000066400000000000000000000064731176220042200176460ustar00rootroot00000000000000import gobject from kupfer import pretty KEYBINDING_DEFAULT = 1 KEYBINDING_MAGIC = 2 KEYRANGE_RESERVED = (3, 0x1000) KEYRANGE_TRIGGERS = (0x1000, 0x2000) _keybound_object = None def GetKeyboundObject(): """Get the shared instance""" global _keybound_object if not _keybound_object: _keybound_object = KeyboundObject() return _keybound_object class KeyboundObject (gobject.GObject): """Keybinder object signals: keybinding (target, event_time) keybinding signal is triggered when the key bound for @target is triggered. """ __gtype_name__ = "KeyboundObject" def __init__(self): super(KeyboundObject, self).__init__() def _keybinding(self, target): import keybinder time = keybinder.get_current_event_time() self.emit("keybinding", target, "", time) def emit_bound_key_changed(self, keystring, is_bound): self.emit("bound-key-changed", keystring, is_bound) def relayed_keys(self, sender, keystring, display, timestamp): for target, key in _currently_bound.iteritems(): if keystring == key: self.emit("keybinding", target, display, timestamp) # Arguments: Target, Display, Timestamp gobject.signal_new("keybinding", KeyboundObject, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_INT, gobject.TYPE_STRING, gobject.TYPE_UINT)) # Arguments: Keystring, Boolean gobject.signal_new("bound-key-changed", KeyboundObject, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_STRING, gobject.TYPE_BOOLEAN,)) _currently_bound = {} def get_all_bound_keys(): return filter(bool, _currently_bound.values()) def get_current_event_time(): "Return current event time as given by keybinder" try: import keybinder except ImportError: return 0 return keybinder.get_current_event_time() def _register_bound_key(keystr, target): _currently_bound[target] = keystr def get_currently_bound_key(target=KEYBINDING_DEFAULT): return _currently_bound.get(target) def bind_key(keystr, keybinding_target=KEYBINDING_DEFAULT): """ Bind @keystr, unbinding any previous key for @keybinding_target. If @keystr is a false value, any previous key will be unbound. """ try: import keybinder except ImportError: pretty.print_error(__name__, "Could not import keybinder, " "keybindings disabled!") return False keybinding_target = int(keybinding_target) callback = lambda : GetKeyboundObject()._keybinding(keybinding_target) if not _is_sane_keybinding(keystr): pretty.print_error(__name__, "Refusing to bind key", repr(keystr)) return False succ = True if keystr: try: succ = keybinder.bind(keystr, callback) pretty.print_debug(__name__, "binding", repr(keystr)) GetKeyboundObject().emit_bound_key_changed(keystr, True) except KeyError, exc: pretty.print_error(__name__, exc) succ = False if succ: old_keystr = get_currently_bound_key(keybinding_target) if old_keystr and old_keystr != keystr: keybinder.unbind(old_keystr) pretty.print_debug(__name__, "unbinding", repr(old_keystr)) GetKeyboundObject().emit_bound_key_changed(old_keystr, False) _register_bound_key(keystr, keybinding_target) return succ def _is_sane_keybinding(keystr): "Refuse keys that we absolutely do not want to bind" if keystr is None: return True if len(keystr) == 1 and keystr.isalnum(): return False if keystr in set(["Return", "space", "BackSpace", "Escape"]): return False return True kupfer-v208/kupfer/ui/listen.py000066400000000000000000000122441176220042200166270ustar00rootroot00000000000000""" This module has a singleton Service for dbus callbacks, and ensures there is only one unique service in the Session """ import gobject try: import dbus import dbus.glib import dbus.service from kupfer.dbuscompat import ExportedGObject # if dbus unavailable print the exception here # but further actions (register) will fail without warning session_bus = dbus.Bus() except (ImportError, dbus.exceptions.DBusException), exc: session_bus = None print exc from kupfer.ui import uievents class AlreadyRunningError (Exception): """Service already available on the bus Exception""" pass class NoConnectionError (Exception): """Not possible to establish connection for callbacks""" pass server_name = "se.kaizer.kupfer" interface_name = "se.kaizer.kupfer.Listener" object_name = "/interface" class Service (ExportedGObject): def __init__(self): """Create a new Kupfer service on the Session Bus Raises NoConnectionError, AlreadyRunningError """ if not session_bus: raise NoConnectionError if session_bus.name_has_owner(server_name): raise AlreadyRunningError bus_name = dbus.service.BusName(server_name, bus=session_bus) super(Service, self).__init__(conn=session_bus, object_path=object_name, bus_name=bus_name) def unregister(self): if session_bus: session_bus.release_name(server_name) @dbus.service.method(interface_name) def Present(self): self.PresentOnDisplay("", "") @dbus.service.method(interface_name, in_signature="ay", byte_arrays=True) def PresentWithStartup(self, notify_id): self.PresentOnDisplay("", notify_id) @dbus.service.method(interface_name, in_signature="ayay", byte_arrays=True) def PresentOnDisplay(self, display, notify_id): with uievents.using_startup_notify_id(notify_id) as time: self.emit("present", display, time) @dbus.service.method(interface_name) def ShowHide(self): self.emit("show-hide", "", 0) @dbus.service.method(interface_name, in_signature="s") def PutText(self, text): self.PutTextOnDisplay(text, "", "") @dbus.service.method(interface_name, in_signature="sayay", byte_arrays=True) def PutTextOnDisplay(self, text, display, notify_id): with uievents.using_startup_notify_id(notify_id) as time: self.emit("put-text", text, display, time) @dbus.service.method(interface_name, in_signature="as") def PutFiles(self, fileuris): self.PutFilesOnDisplay(fileuris, "", "") @dbus.service.method(interface_name, in_signature="asayay", byte_arrays=True) def PutFilesOnDisplay(self, fileuris, display, notify_id): # files sent with dbus-send from kupfer have a custom comma # escape that we have to unescape here fileuris[:] = [f.replace("%%kupfercomma%%", ",") for f in fileuris] with uievents.using_startup_notify_id(notify_id) as time: self.emit("put-files", fileuris, display, time) @dbus.service.method(interface_name, in_signature="s") def ExecuteFile(self, filepath): self.ExecuteFileOnDisplay(filepath, "", "") @dbus.service.method(interface_name, in_signature="sayay", byte_arrays=True) def ExecuteFileOnDisplay(self, filepath, display, notify_id): with uievents.using_startup_notify_id(notify_id) as time: self.emit("execute-file", filepath, display, time) @dbus.service.method(interface_name, in_signature="sayay", byte_arrays=True) def RelayKeysFromDisplay(self, keystring, display, notify_id): with uievents.using_startup_notify_id(notify_id) as time: self.emit("relay-keys", keystring, display, time) @dbus.service.method(interface_name, in_signature=None, out_signature="as", byte_arrays=True) def GetBoundKeys(self): from kupfer.ui import keybindings return keybindings.get_all_bound_keys() @dbus.service.signal(interface_name, signature="sb") def BoundKeyChanged(self, keystr, is_bound): pass @dbus.service.method(interface_name) def Quit(self): self.emit("quit") # Signature: displayname, timestamp gobject.signal_new("present", Service, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_STRING, gobject.TYPE_UINT)) # Signature: displayname, timestamp gobject.signal_new("show-hide", Service, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_STRING, gobject.TYPE_UINT)) # Signature: text, displayname, timestamp gobject.signal_new("put-text", Service, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_UINT)) # Signature: filearray, displayname, timestamp gobject.signal_new("put-files", Service, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_PYOBJECT, gobject.TYPE_STRING, gobject.TYPE_UINT)) # Signature: fileuri, displayname, timestamp gobject.signal_new("execute-file", Service, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_UINT)) # Signature: () gobject.signal_new("quit", Service, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, ()) # Signature: keystring, displayname, timestamp gobject.signal_new("relay-keys", Service, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_UINT)) kupfer-v208/kupfer/ui/preferences.py000066400000000000000000001006721176220042200176350ustar00rootroot00000000000000import os import re import gtk import gio import gobject import pango from xdg import BaseDirectory as base from xdg import DesktopEntry as desktop from kupfer import config, pretty, utils, icons, version from kupfer import scheduler, kupferstring from kupfer import kupferui from kupfer.core import settings, plugins, relevance, sources from kupfer.ui import keybindings from kupfer.ui.credentials_dialog import ask_user_credentials from kupfer.ui import getkey_dialog from kupfer.ui import accelerators from kupfer import plugin_support # index in GtkNotebook PLUGIN_LIST_PAGE = 2 # List icon pixel size LIST_ICON_SIZE = 18 # A major HACK # http://tadeboro.blogspot.com/2009/05/wrapping-adn-resizing-gtklabel.html def _cb_allocate(label, allocation, maxwid): if maxwid == -1: maxwid = 300 label.set_size_request(min(maxwid, allocation.width), -1) pass def wrapped_label(text=None, maxwid=-1): label = gtk.Label(text) label.set_line_wrap(True) label.connect("size-allocate", _cb_allocate, maxwid) return label def kobject_should_show(obj): try: leaf_repr = obj.get_leaf_repr() except AttributeError: pass else: if leaf_repr is None: return True if hasattr(leaf_repr, "is_valid") and not leaf_repr.is_valid(): return False return True class PreferencesWindowController (pretty.OutputMixin): KEYBINDING_NAMES = { # TRANS: Names of global keyboard shortcuts 'keybinding': _("Show Main Interface"), 'magickeybinding': _("Show with Selection"), } KEYBINDING_TARGETS = { "keybinding": keybindings.KEYBINDING_DEFAULT, "magickeybinding": keybindings.KEYBINDING_MAGIC, } def __init__(self): """Load ui from data file""" builder = gtk.Builder() builder.set_translation_domain(version.PACKAGE_NAME) ui_file = config.get_data_file("preferences.ui") if ui_file: builder.add_from_file(ui_file) else: self.window = None return builder.connect_signals(self) self.window = builder.get_object("preferenceswindow") self.window.set_position(gtk.WIN_POS_CENTER) self.window.connect("delete-event", self._close_window) self.pluglist_parent = builder.get_object("plugin_list_parent") self.dirlist_parent = builder.get_object("directory_list_parent") self.plugin_about_parent = builder.get_object("plugin_about_parent") self.preferences_notebook = builder.get_object("preferences_notebook") self.buttonremovedirectory = builder.get_object("buttonremovedirectory") checkautostart = builder.get_object("checkautostart") checkstatusicon = builder.get_object("checkstatusicon") checkusecommandkeys = builder.get_object("checkusecommandkeys") self.entry_plugins_filter = builder.get_object('entry_plugins_filter') self.keybindings_list_parent = builder.get_object('keybindings_list_parent') self.gkeybindings_list_parent = builder.get_object('gkeybindings_list_parent') source_list_parent = builder.get_object("source_list_parent") self.sources_list_ctrl = SourceListController(source_list_parent) setctl = settings.GetSettingsController() checkautostart.set_active(self._get_should_autostart()) checkstatusicon.set_active(setctl.get_show_status_icon()) checkusecommandkeys.set_active(setctl.get_use_command_keys()) # List store with columns (Name, ID) # Make alternative comboboxes terminal_combobox = builder.get_object("terminal_combobox") icons_combobox = builder.get_object("icons_combobox") def make_combobox_model(combobox): combobox_store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) combobox.set_model(combobox_store) combobox_cell = gtk.CellRendererText() combobox.pack_start(combobox_cell, True) combobox.add_attribute(combobox_cell, 'text', 0) make_combobox_model(terminal_combobox) make_combobox_model(icons_combobox) self._update_alternative_combobox('terminal', terminal_combobox) self._update_alternative_combobox('icon_renderer', icons_combobox) self.terminal_combobox = terminal_combobox self.icons_combobox = icons_combobox setctl.connect("alternatives-changed", self._on_alternatives_changed) # Plugin List columns = [ {"key": "plugin_id", "type": str }, {"key": "enabled", "type": bool }, {"key": "icon-name", "type": str }, {"key": "text", "type": str }, ] # setup plugin list table column_types = [c["type"] for c in columns] self.columns = [c["key"] for c in columns] self.store = gtk.ListStore(*column_types) self.table = gtk.TreeView(self.store) self.table.set_headers_visible(False) self.table.set_property("enable-search", False) self.table.set_rules_hint(True) self.table.connect("cursor-changed", self.plugin_table_cursor_changed) self.table.get_selection().set_mode(gtk.SELECTION_BROWSE) checkcell = gtk.CellRendererToggle() checkcol = gtk.TreeViewColumn("item", checkcell) checkcol.add_attribute(checkcell, "active", self.columns.index("enabled")) checkcell.connect("toggled", self.on_checkplugin_toggled) icon_cell = gtk.CellRendererPixbuf() icon_cell.set_property("height", LIST_ICON_SIZE) icon_cell.set_property("width", LIST_ICON_SIZE) icon_col = gtk.TreeViewColumn("icon", icon_cell) icon_col.add_attribute(icon_cell, "icon-name", self.columns.index("icon-name")) cell = gtk.CellRendererText() col = gtk.TreeViewColumn("item", cell) col.add_attribute(cell, "text", self.columns.index("text")) self.table.append_column(checkcol) # hide icon for now #self.table.append_column(icon_col) self.table.append_column(col) self.plugin_list_timer = scheduler.Timer() self.plugin_info = utils.locale_sort(plugins.get_plugin_info(), key= lambda rec: rec["localized_name"]) self._refresh_plugin_list() self.output_debug("Standard Plugins: %d" % len(self.store)) self.table.show() self.pluglist_parent.add(self.table) # Directory List self.dir_store = gtk.ListStore(str, gio.Icon, str) self.dir_table = gtk.TreeView(self.dir_store) self.dir_table.set_headers_visible(False) self.dir_table.set_property("enable-search", False) self.dir_table.connect("cursor-changed", self.dir_table_cursor_changed) self.dir_table.get_selection().set_mode(gtk.SELECTION_BROWSE) icon_cell = gtk.CellRendererPixbuf() icon_col = gtk.TreeViewColumn("icon", icon_cell) icon_col.add_attribute(icon_cell, "gicon", 1) cell = gtk.CellRendererText() col = gtk.TreeViewColumn("name", cell) col.add_attribute(cell, "text", 2) cell.set_property("ellipsize", pango.ELLIPSIZE_END) self.dir_table.append_column(icon_col) self.dir_table.append_column(col) self.dir_table.show() self.dirlist_parent.add(self.dir_table) self.read_directory_settings() # keybindings list self.keybind_table, self.keybind_store = _create_conf_keys_list() self.keybindings_list_parent.add(self.keybind_table) self.keybind_table.connect("row-activated", self.on_keybindings_row_activate) # global keybindings list self.gkeybind_table, self.gkeybind_store = _create_conf_keys_list() self.gkeybindings_list_parent.add(self.gkeybind_table) self.gkeybind_table.connect("row-activated", self.on_gkeybindings_row_activate) self._show_keybindings(setctl) self._show_gkeybindings(setctl) def _show_keybindings(self, setctl): names = self.KEYBINDING_NAMES self.keybind_store.clear() for binding in sorted(names, key=lambda k: names[k]): accel = setctl.get_global_keybinding(binding) or "" label = gtk.accelerator_get_label(*gtk.accelerator_parse(accel)) self.keybind_store.append((names[binding], label, binding)) def _show_gkeybindings(self, setctl): names = accelerators.ACCELERATOR_NAMES self.gkeybind_store.clear() for binding in sorted(names, key=lambda k: names[k]): accel = setctl.get_accelerator(binding) or "" label = gtk.accelerator_get_label(*gtk.accelerator_parse(accel)) self.gkeybind_store.append((names[binding], label, binding)) def read_directory_settings(self): setctl = settings.GetSettingsController() dirs = setctl.get_directories() for d in dirs: self.add_directory_model(d, store=False) def add_directory_model(self, d, store=False): have = list(os.path.normpath(row[0]) for row in self.dir_store) if d in have: self.output_debug("Ignoring duplicate directory: ", d) return else: have.append(d) d = os.path.expanduser(d) dispname = utils.get_display_path_for_bytestring(d) gicon = icons.get_gicon_for_file(d) self.dir_store.append((d, gicon, dispname)) if store: setctl = settings.GetSettingsController() setctl.set_directories(have) def remove_directory_model(self, rowiter, store=True): self.dir_store.remove(rowiter) if store: have = list(os.path.normpath(row[0]) for row in self.dir_store) setctl = settings.GetSettingsController() setctl.set_directories(have) def on_preferenceswindow_key_press_event(self, widget, event): if event.keyval == gtk.gdk.keyval_from_name("Escape"): self.hide() return True def on_checkstatusicon_toggled(self, widget): setctl = settings.GetSettingsController() setctl.set_show_status_icon(widget.get_active()) def _get_should_autostart(self): KUPFER_DESKTOP = "kupfer.desktop" AUTOSTART_KEY = "X-GNOME-Autostart-enabled" autostart_dir = base.save_config_path("autostart") autostart_file = os.path.join(autostart_dir, KUPFER_DESKTOP) if not os.path.exists(autostart_file): return False dfile = desktop.DesktopEntry(autostart_file) return (dfile.hasKey(AUTOSTART_KEY) and dfile.get(AUTOSTART_KEY, type="boolean")) def on_checkautostart_toggled(self, widget): KUPFER_DESKTOP = "kupfer.desktop" AUTOSTART_KEY = "X-GNOME-Autostart-enabled" autostart_dir = base.save_config_path("autostart") autostart_file = os.path.join(autostart_dir, KUPFER_DESKTOP) if not os.path.exists(autostart_file): desktop_files = list(base.load_data_paths("applications", KUPFER_DESKTOP)) if not desktop_files: self.output_error("Installed kupfer desktop file not found!") return desktop_file_path = desktop_files[0] # Read installed file and modify it dfile = desktop.DesktopEntry(desktop_file_path) executable = dfile.getExec() ## append no-splash if "--no-splash" not in executable: executable += " --no-splash" dfile.set("Exec", executable) else: dfile = desktop.DesktopEntry(autostart_file) activestr = str(bool(widget.get_active())).lower() self.output_debug("Setting autostart to", activestr) dfile.set(AUTOSTART_KEY, activestr) ## remove the format specifiers executable = dfile.getExec().replace("%F", "") dfile.set("Exec", executable) dfile.write(filename=autostart_file) def on_entrykeybinding_changed(self, widget): pass def on_buttonkeybinding_clicked(self, widget): keystr = getkey_dialog.ask_for_key(keybindings.bind_key, screen=widget.get_screen()) if keystr: self.entrykeybinding.set_text(keystr) self.output_debug("Try set keybinding with", keystr) keybindings.bind_key(keystr) setctl = settings.GetSettingsController() setctl.set_keybinding(keystr) def on_helpbutton_clicked(self, widget): kupferui.show_help() def on_closebutton_clicked(self, widget): self.hide() def _refresh_plugin_list(self, us_filter=None): "List plugins that pass text filter @us_filter or list all if None" self.store.clear() setctl = settings.GetSettingsController() if us_filter: self.plugin_list_timer.set_ms(300, self._show_focus_topmost_plugin) else: self.plugin_list_timer.invalidate() for info in self.plugin_info: plugin_id = info["name"] if setctl.get_plugin_is_hidden(plugin_id): continue enabled = setctl.get_plugin_enabled(plugin_id) name = info["localized_name"] folded_name = kupferstring.tofolded(name) desc = info["description"] text = u"%s" % name if us_filter: name_score = relevance.score(name, us_filter) fold_name_score = relevance.score(folded_name, us_filter) desc_score = relevance.score(desc, us_filter) if not name_score and not fold_name_score and desc_score < 0.9: continue self.store.append((plugin_id, enabled, "kupfer-object", text)) def _show_focus_topmost_plugin(self): try: first_row = iter(self.store).next() except StopIteration: return plugin_id = first_row[0] self.show_focus_plugin(plugin_id, 0) def on_checkplugin_toggled(self, cell, path): checkcol = self.columns.index("enabled") plugin_id = self._id_for_table_path(path) it = self.store.get_iter(path) plugin_is_enabled = not self.store.get_value(it, checkcol) self.store.set_value(it, checkcol, plugin_is_enabled) setctl = settings.GetSettingsController() setctl.set_plugin_enabled(plugin_id, plugin_is_enabled) def _id_for_table_path(self, path): it = self.store.get_iter(path) id_col = self.columns.index("plugin_id") plugin_id = self.store.get_value(it, id_col) return plugin_id def _table_path_for_id(self, id_): """ Find the tree path of plugin @id_ """ id_col = self.columns.index("plugin_id") for row in self.store: plugin_id = row[id_col] if plugin_id == id_: return row.path raise ValueError("No such plugin %s" % id_) def _plugin_info_for_id(self, plugin_id): for info in self.plugin_info: if info["name"] == plugin_id: return info return None def plugin_table_cursor_changed(self, table): curpath, curcol = table.get_cursor() if not curpath: return plugin_id = self._id_for_table_path(curpath) self.plugin_sidebar_update(plugin_id) def plugin_sidebar_update(self, plugin_id): about = gtk.VBox() about.set_property("spacing", 15) about.set_property("border-width", 5) info = self._plugin_info_for_id(plugin_id) title_label = gtk.Label() m_localized_name = gobject.markup_escape_text(info["localized_name"]) title_label.set_markup(u"%s" % m_localized_name) version, description, author = plugins.get_plugin_attributes(plugin_id, ( "__version__", "__description__", "__author__", )) about.pack_start(title_label, False) infobox = gtk.VBox() infobox.set_property("spacing", 3) # TRANS: Plugin info fields for field, val in zip((_("Description"), _("Author")), (description, author)): if not val: continue label = gtk.Label() label.set_alignment(0, 0) label.set_markup(u"%s" % field) infobox.pack_start(label, False) label = wrapped_label() label.set_alignment(0, 0) label.set_markup(u"%s" % gobject.markup_escape_text(val)) label.set_selectable(True) infobox.pack_start(label, False) if version: label = wrapped_label() label.set_alignment(0, 0) m_version = gobject.markup_escape_text(version) label.set_markup(u"%s: %s" % (_("Version"), m_version)) label.set_selectable(True) infobox.pack_start(label, False) about.pack_start(infobox, False) # Check for plugin load exception exc_info = plugins.get_plugin_error(plugin_id) if exc_info is not None: etype, error, tb = exc_info # TRANS: Error message when Plugin needs a Python module to load import_error_localized = _("Python module '%s' is needed") % u"\\1" import_error_pat = u"No module named ([^\s]+)" errmsg = unicode(error) if re.match(import_error_pat, errmsg): errstr = re.sub(import_error_pat, import_error_localized, errmsg, count=1) else: import traceback errstr = "".join(traceback.format_exception(*exc_info)) label = wrapped_label() label.set_alignment(0, 0) label.set_markup(u"%s\n\n%s" % ( _("Plugin could not be read due to an error:"), gobject.markup_escape_text(errstr), )) label.set_selectable(True) about.pack_start(label, False) elif not plugins.is_plugin_loaded(plugin_id): label = gtk.Label() label.set_alignment(0, 0) label.set_text(u"(%s)" % _("disabled")) about.pack_start(label, False) wid = self._make_plugin_info_widget(plugin_id) about.pack_start(wid, False) psettings_wid = self._make_plugin_settings_widget(plugin_id) if psettings_wid: about.pack_start(psettings_wid, False) oldch = self.plugin_about_parent.get_child() if oldch: self.plugin_about_parent.remove(oldch) vp = gtk.Viewport() vp.set_shadow_type(gtk.SHADOW_NONE) vp.add(about) self.plugin_about_parent.add(vp) self.plugin_about_parent.show_all() def _make_plugin_info_widget(self, plugin_id): sources, actions, text_sources = \ plugins.get_plugin_attributes(plugin_id, ( plugins.sources_attribute, plugins.action_decorators_attribute, plugins.text_sources_attribute) ) vbox = gtk.VBox() vbox.set_property("spacing", 5) def make_objects_frame(objs, title): frame_label = gtk.Label() frame_label.set_markup(u"%s" % gobject.markup_escape_text(title)) frame_label.set_alignment(0, 0) objvbox = gtk.VBox() objvbox.pack_start(frame_label, False) objvbox.set_property("spacing", 3) for item in objs: plugin_type = plugins.get_plugin_attribute(plugin_id, item) if not plugin_type: continue hbox = gtk.HBox() hbox.set_property("spacing", 3) obj = plugin_type() name = unicode(obj) desc = obj.get_description() or u"" gicon = obj.get_icon() im = gtk.Image() im.set_property("gicon", gicon) im.set_property("pixel-size", 32) hbox.pack_start(im, False) m_name = gobject.markup_escape_text(name) m_desc = gobject.markup_escape_text(desc) name_label = \ u"%s\n%s" % (m_name, m_desc) if m_desc else \ u"%s" % (m_name, ) label = wrapped_label() label.set_markup(name_label) hbox.pack_start(label, False) objvbox.pack_start(hbox) # Display information for application content-sources. if not kobject_should_show(obj): continue try: leaf_repr = obj.get_leaf_repr() except AttributeError: continue if leaf_repr is None: continue hbox = gtk.HBox() hbox.set_property("spacing", 3) gicon = leaf_repr.get_icon() im = gtk.Image() im.set_property("gicon", gicon) im.set_property("pixel-size", 16) hbox.pack_start(gtk.Label(_("Content of")), False) hbox.pack_start(im, False) hbox.pack_start(gtk.Label(unicode(leaf_repr)), False) objvbox.pack_start(hbox) return objvbox sources = list(sources or ()) + list(text_sources or ()) if sources: # TRANS: Plugin contents header swid = make_objects_frame(sources, _("Sources")) vbox.pack_start(swid) if actions: # TRANS: Plugin contents header awid = make_objects_frame(actions, _("Actions")) vbox.pack_start(awid) vbox.show_all() return vbox def _get_plugin_change_callback(self, plugin_id, key, value_type, get_attr, no_false_values=False): """Callback factory for the plugin parameter configuration""" def callback(widget): value = getattr(widget, get_attr)() if no_false_values and not value: return setctl = settings.GetSettingsController() setctl.set_plugin_config(plugin_id, key, value, value_type) return callback def _get_plugin_credentials_callback(self, plugin_id, key): def callback(widget): setctl = settings.GetSettingsController() val_type = plugin_support.UserNamePassword backend_name = plugin_support.UserNamePassword.get_backend_name() if plugin_support.UserNamePassword.is_backend_encrypted(): information = _("Using encrypted password storage: %s") % backend_name else: information = _("Using password storage: %s") % backend_name upass = setctl.get_plugin_config(plugin_id, key, val_type) \ or plugin_support.UserNamePassword() user_password = ask_user_credentials(upass.username, upass.password, information) if user_password: upass.username, upass.password = user_password setctl.set_plugin_config(plugin_id, key, upass, val_type) return callback def _make_plugin_settings_widget(self, plugin_id): plugin_settings = plugins.get_plugin_attribute(plugin_id, plugins.settings_attribute) if not plugin_settings: return None title_label = gtk.Label() # TRANS: Plugin-specific configuration (header) title_label.set_markup(u"%s" % _("Configuration")) title_label.set_alignment(0, 0) vbox = gtk.VBox() vbox.pack_start(title_label, False) #vbox.set_property("spacing", 5) plugin_settings_keys = iter(plugin_settings) if plugin_settings else () for setting in plugin_settings_keys: typ = plugin_settings.get_value_type(setting) alternatives = plugin_settings.get_alternatives(setting) tooltip = plugin_settings.get_tooltip(setting) wid = None hbox = gtk.HBox() hbox.set_property("spacing", 10) if tooltip: hbox.set_tooltip_text(tooltip) label = plugin_settings.get_label(setting) if issubclass(typ, plugin_support.UserNamePassword): wid = gtk.Button(label or _("Set username and password")) wid.connect("clicked", self._get_plugin_credentials_callback( plugin_id, setting)) hbox.pack_start(wid, False) vbox.pack_start(hbox, False) continue label_wid = wrapped_label(label, maxwid=200) if issubclass(typ, basestring): if alternatives: wid = gtk.combo_box_new_text() val = plugin_settings[setting] active_index = -1 for idx, text in enumerate(alternatives): wid.append_text(text) if text == val: active_index = idx if active_index < 0: wid.prepend_text(val) active_index = 0 wid.set_active(active_index) wid.connect("changed", self._get_plugin_change_callback( plugin_id, setting, typ, "get_active_text")) else: wid = gtk.Entry() wid.set_text(plugin_settings[setting]) wid.connect("changed", self._get_plugin_change_callback( plugin_id, setting, typ, "get_text", no_false_values=True)) hbox.pack_start(label_wid, False) hbox.pack_start(wid, True) elif issubclass(typ, bool): wid = gtk.CheckButton(label) wid.set_active(plugin_settings[setting]) hbox.pack_start(wid, False) wid.connect("toggled", self._get_plugin_change_callback( plugin_id, setting, typ, "get_active")) elif issubclass(typ, int): wid = gtk.SpinButton() wid.set_increments(1, 1) wid.set_range(0, 1000) wid.set_value(plugin_settings[setting]) hbox.pack_start(label_wid, False) hbox.pack_start(wid, False) wid.connect("changed", self._get_plugin_change_callback( plugin_id, setting, typ, "get_text", no_false_values=True)) vbox.pack_start(hbox, False) vbox.show_all() return vbox def on_buttonadddirectory_clicked(self, widget): # TRANS: File Chooser Title chooser_dialog = gtk.FileChooserDialog(title=_("Choose a Directory"), action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) chooser_dialog.set_select_multiple(True) if chooser_dialog.run() == gtk.RESPONSE_ACCEPT: for selected_dir in chooser_dialog.get_filenames(): self.add_directory_model(selected_dir, store=True) chooser_dialog.hide() def on_buttonremovedirectory_clicked(self, widget): curpath, curcol = self.dir_table.get_cursor() if not curpath: return it = self.dir_store.get_iter(curpath) self.remove_directory_model(it, store=True) def on_entry_plugins_filter_changed(self, widget): s_filter = widget.get_text() us_filter = kupferstring.tounicode(s_filter).lower() self._refresh_plugin_list(us_filter) def on_entry_plugins_filter_icon_press(self, entry, icon_pos, event): entry.set_text('') def on_keybindings_row_activate(self, treeview, path, view_column): def bind_key_func(target): def bind_key(keystr): return keybindings.bind_key(keystr, target) return bind_key it = self.keybind_store.get_iter(path) keybind_id = self.keybind_store.get_value(it, 2) setctl = settings.GetSettingsController() curr_key = setctl.get_global_keybinding(keybind_id) bind_func = bind_key_func(self.KEYBINDING_TARGETS[keybind_id]) keystr = getkey_dialog.ask_for_key(bind_func, curr_key, screen=treeview.get_screen()) if keystr == '': keybindings.bind_key(None, self.KEYBINDING_TARGETS[keybind_id]) setctl.set_global_keybinding(keybind_id, keystr) self.keybind_store.set_value(it, 1, '') elif keystr is not None: setctl.set_global_keybinding(keybind_id, keystr) label = gtk.accelerator_get_label(*gtk.accelerator_parse(keystr)) self.keybind_store.set_value(it, 1, label) def _is_good_keystr(self, keystr): # Reject single letters so you can't bind 'A' etc if keystr is None: return label = gtk.accelerator_get_label(*gtk.accelerator_parse(keystr)) ulabel = kupferstring.tounicode(label) return not (len(ulabel) == 1 and ulabel.isalnum()) def on_gkeybindings_row_activate(self, treeview, path, view_column): it = self.gkeybind_store.get_iter(path) keybind_id = self.gkeybind_store.get_value(it, 2) setctl = settings.GetSettingsController() curr_key = setctl.get_accelerator(keybind_id) keystr = getkey_dialog.ask_for_key(self._is_good_keystr, previous_key=curr_key, screen=treeview.get_screen()) if keystr is not None: setctl.set_accelerator(keybind_id, keystr) label = gtk.accelerator_get_label(*gtk.accelerator_parse(keystr)) self.gkeybind_store.set_value(it, 1, label) def on_button_reset_keys_clicked(self, button): if self.ask_user_for_reset_keybinding(): setctl = settings.GetSettingsController() setctl.reset_keybindings() self._show_keybindings(setctl) # Unbind all before re-binding for keybind_id, target in self.KEYBINDING_TARGETS.iteritems(): keybindings.bind_key(None, target) for keybind_id, target in self.KEYBINDING_TARGETS.iteritems(): keystr = setctl.get_global_keybinding(keybind_id) keybindings.bind_key(keystr, target) def on_button_reset_gkeys_clicked(self, button): if self.ask_user_for_reset_keybinding(): setctl = settings.GetSettingsController() setctl.reset_accelerators() self._show_gkeybindings(setctl) def on_checkusecommandkeys_toggled(self, widget): setctl = settings.GetSettingsController() setctl.set_use_command_keys(widget.get_active()) def dir_table_cursor_changed(self, table): curpath, curcol = table.get_cursor() if not curpath or not self.dir_store: self.buttonremovedirectory.set_sensitive(False) return self.buttonremovedirectory.set_sensitive(True) def on_terminal_combobox_changed(self, widget): setctl = settings.GetSettingsController() itr = widget.get_active_iter() if itr: term_id = widget.get_model().get_value(itr, 1) setctl.set_preferred_tool('terminal', term_id) def on_icons_combobox_changed(self, widget): setctl = settings.GetSettingsController() itr = widget.get_active_iter() if itr: term_id = widget.get_model().get_value(itr, 1) setctl.set_preferred_tool('icon_renderer', term_id) def _update_alternative_combobox(self, category_key, combobox): """ Alternatives changed """ combobox_store = combobox.get_model() combobox_store.clear() setctl = settings.GetSettingsController() term_id = setctl.get_preferred_tool(category_key) # fill in the available alternatives alternatives = utils.locale_sort( setctl.get_valid_alternative_ids(category_key), key=lambda t:t[1]) term_iter = None for (id_, name) in alternatives: _it = combobox_store.append((name, id_)) if id_ == term_id: term_iter = _it # Update selection term_iter = term_iter or combobox_store.get_iter_first() combobox.set_sensitive(len(combobox_store) > 1) if term_iter: combobox.set_active_iter(term_iter) def _on_alternatives_changed(self, setctl, category_key): if category_key == 'terminal': self._update_alternative_combobox(category_key, self.terminal_combobox) elif category_key == 'icon_renderer': self._update_alternative_combobox(category_key, self.icons_combobox) def on_preferences_notebook_switch_page(self, notebook, page, page_num): ## focus the search box on the plugin tab if page_num == PLUGIN_LIST_PAGE: gobject.idle_add(self.entry_plugins_filter.grab_focus) def show(self, timestamp): self.window.present_with_time(timestamp) def show_on_screen(self, timestamp, screen): self.window.set_screen(screen) self.show(timestamp) ## focus the search box on the plugin tab if self.preferences_notebook.get_current_page() == PLUGIN_LIST_PAGE: self.entry_plugins_filter.grab_focus() def show_focus_plugin(self, plugin_id, timestamp): """ Open and show information about plugin @plugin_id """ try: table_path = self._table_path_for_id(plugin_id) except ValueError: self.entry_plugins_filter.set_text(u"") self._refresh_plugin_list() table_path = self._table_path_for_id(plugin_id) self.table.set_cursor(table_path) self.table.scroll_to_cell(table_path) self.preferences_notebook.set_current_page(PLUGIN_LIST_PAGE) self.window.present_with_time(timestamp) def hide(self): self.window.hide() def _close_window(self, *ignored): self.hide() return True def ask_user_for_reset_keybinding(self): dlg = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION) dlg.set_markup(_("Reset all shortcuts to default values?")) dlg.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CLOSE, _('Reset'), gtk.RESPONSE_ACCEPT) result = dlg.run() == gtk.RESPONSE_ACCEPT dlg.destroy() return result _conf_keys_list_columns = [{"key": "name", "type":str, 'header': _('Command')}, {"key": "key", "type": str, 'header': _('Shortcut') }, {"key": "keybinding_id", "type": str, 'header': None}] _conf_keys_list_column_types = [c["type"] for c in _conf_keys_list_columns] def _create_conf_keys_list(): keybind_store = gtk.ListStore(*_conf_keys_list_column_types) keybind_table = gtk.TreeView(keybind_store) for idx, col in enumerate(_conf_keys_list_columns): renderer = gtk.CellRendererText() column = gtk.TreeViewColumn(col['header'], renderer, text=idx) column.set_visible(col['header'] is not None) keybind_table.append_column(column) keybind_table.set_property("enable-search", False) keybind_table.set_rules_hint(True) keybind_table.set_headers_visible(True) keybind_table.show() return keybind_table, keybind_store _preferences_window = None def GetPreferencesWindowController(): global _preferences_window if _preferences_window is None: _preferences_window = PreferencesWindowController() return _preferences_window class SourceListController (object): def __init__(self, parent_widget): columns = [ {"key": "source", "type": gobject.TYPE_PYOBJECT }, {"key": "plugin_id", "type": str }, {"key": "toplevel", "type": bool }, {"key": "icon", "type": gio.Icon }, {"key": "text", "type": str }, ] # setup plugin list table column_types = [c["type"] for c in columns] self.columns = [c["key"] for c in columns] self.store = gtk.ListStore(*column_types) self.table = gtk.TreeView(self.store) self.table.set_headers_visible(False) self.table.set_property("enable-search", False) self.table.set_rules_hint(True) #self.table.connect("cursor-changed", self.plugin_table_cursor_changed) self.table.get_selection().set_mode(gtk.SELECTION_NONE) checkcell = gtk.CellRendererToggle() checkcol = gtk.TreeViewColumn("item", checkcell) checkcol.add_attribute(checkcell, "active", self.columns.index("toplevel")) checkcell.connect("toggled", self.on_checktoplevel_enabled) icon_cell = gtk.CellRendererPixbuf() icon_cell.set_property("height", LIST_ICON_SIZE) icon_cell.set_property("width", LIST_ICON_SIZE) icon_col = gtk.TreeViewColumn("icon", icon_cell) icon_col.add_attribute(icon_cell, "gicon", self.columns.index("icon")) cell = gtk.CellRendererText() col = gtk.TreeViewColumn("item", cell) col.add_attribute(cell, "text", self.columns.index("text")) self.table.append_column(checkcol) self.table.append_column(icon_col) self.table.append_column(col) self._refresh() self.table.show() parent_widget.add(self.table) setctl = settings.GetSettingsController() setctl.connect("plugin-enabled-changed", self._refresh) def _refresh(self, *ignored): self.store.clear() setctl = settings.GetSettingsController() sc = sources.GetSourceController() srcs = sorted(sc.get_sources(), key=unicode) for src in srcs: name = unicode(src) plugin_id = sc.get_plugin_id_for_object(src) if not plugin_id or setctl.get_plugin_is_hidden(plugin_id): continue if not kobject_should_show(src): continue gicon = src.get_icon() toplevel = setctl.get_source_is_toplevel(plugin_id, src) self.store.append((src, plugin_id, toplevel, gicon, name)) def on_checktoplevel_enabled(self, cell, path): it = self.store.get_iter(path) checkcol = self.columns.index("toplevel") idcol = self.columns.index("plugin_id") srccol = self.columns.index("source") is_toplevel = not self.store.get_value(it, checkcol) plugin_id = self.store.get_value(it, idcol) src = self.store.get_value(it, srccol) sc = sources.GetSourceController() sc.set_toplevel(src, is_toplevel) setctl = settings.GetSettingsController() setctl.set_source_is_toplevel(plugin_id, src, is_toplevel) self.store.set_value(it, checkcol, is_toplevel) kupfer-v208/kupfer/ui/progress_dialog.py000066400000000000000000000037641176220042200205230ustar00rootroot00000000000000import functools import glib import gtk from kupfer import version, config def idle_call(func): @functools.wraps(func) def idle_wrapper(*args): glib.idle_add(func, *args) return idle_wrapper _HEADER_MARKUP = '%s' class ProgressDialogController (object): def __init__(self, title, header=None, max_value=100): """Create a new progress dialog @header: first line of dialog The methods show, hide and update are all wrapped to be safe to call from any thread. """ self.aborted = False self.max_value = float(max_value) ui_file = config.get_data_file("progress_dialog.ui") self._construct_dialog(ui_file, title, header) @idle_call def _construct_dialog(self, ui_file, title, header): builder = gtk.Builder() builder.set_translation_domain(version.PACKAGE_NAME) builder.add_from_file(ui_file) builder.connect_signals(self) self.window = builder.get_object("window_progress") self.button_abort = builder.get_object('button_abort') self.progressbar = builder.get_object('progressbar') self.label_info = builder.get_object('label_info') self.label_header = builder.get_object('label_header') self.window.set_title(title) if header: self.label_header.set_markup(_HEADER_MARKUP % glib.markup_escape_text(header)) else: self.label_header.hide() self.update(0, '', '') def on_button_abort_clicked(self, widget): self.aborted = True self.button_abort.set_sensitive(False) @idle_call def show(self): self.window.present() @idle_call def hide(self): self.window.hide() @idle_call def update(self, value, label, text): """ Update dialog information. @value: value to set for progress bar @label: current action (displayed in emphasized style) @text: current information (normal style) """ self.progressbar.set_fraction(min(value/self.max_value, 1.0)) self.label_info.set_markup(u"%s %s" % ( glib.markup_escape_text(label), glib.markup_escape_text(text), )) return self.aborted kupfer-v208/kupfer/ui/session.py000066400000000000000000000123171176220042200170150ustar00rootroot00000000000000""" session sets up the program as a client to the current desktop session and enables notifications on session close, to be able to save state before being killed; the module API does not depend on the session API used """ import os import time import dbus import gobject from kupfer import pretty, version class SessionClient (gobject.GObject, pretty.OutputMixin): """Session handling controller signals: save-yourself: Program should save state die: Program should quit immediately """ __gtype_name__ = "SessionClient" def __init__(self): """Set up program as client to current Session""" gobject.GObject.__init__(self) succ = False try: succ = self._connect_session_manager() except dbus.DBusException, exc: self.output_error(exc) if not succ: # try to bind to xfce session manager try: succ = self._connect_xfce_session_manager() except dbus.DBusException, exc: self.output_error(exc) if not succ: succ = self._connect_gnomeui() # unset autostart id so that it is not transferred os.putenv("DESKTOP_AUTOSTART_ID", "") self._enabled = succ if not self.enabled: self.output_info("Warning: Not able to connect to current " "desktop session, please Quit before logout to save " "kupfer's data.") def _connect_gnomeui(self): try: import gnome import gnome.ui except ImportError, exc: self.output_debug(exc) return False gnome.program_init(version.PACKAGE_NAME, version.VERSION) client = gnome.ui.master_client() client.connect("save-yourself", self._session_save) client.connect("die", self._session_die) self.output_debug("Setting up session connection using GnomeClient") return True def _connect_session_manager(self): bus = dbus.SessionBus() proxy_obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(proxy_obj, 'org.freedesktop.DBus') service_name = "org.gnome.SessionManager" obj_name = "/org/gnome/SessionManager" iface_name = service_name if not dbus_iface.NameHasOwner(service_name): self.output_debug("D-Bus name %s not found" % service_name) return False try: obj = bus.get_object(service_name, obj_name) except dbus.DBusException, e: pretty.print_error(__name__, e) return False smanager = dbus.Interface(obj, iface_name) app_id = version.PACKAGE_NAME startup_id = os.getenv("DESKTOP_AUTOSTART_ID") or "" self.client_id = smanager.RegisterClient(app_id, startup_id) self._session_ended = False self.output_debug("Connected to session as client", self.client_id, startup_id) private_iface_name = "org.gnome.SessionManager.ClientPrivate" bus.add_signal_receiver(self._query_end_session, "QueryEndSession", dbus_interface=private_iface_name) bus.add_signal_receiver(self._end_session_signal, "EndSession", dbus_interface=private_iface_name) bus.add_signal_receiver(self._stop_signal, "Stop", dbus_interface=private_iface_name) return True def _connect_xfce_session_manager(self): bus = dbus.SessionBus() proxy_obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(proxy_obj, 'org.freedesktop.DBus') service_name = "org.xfce.SessionManager" obj_name = "/org/xfce/SessionManager" if not dbus_iface.NameHasOwner(service_name): self.output_debug("D-Bus name %s not found" % service_name) return False try: bus.get_object(service_name, obj_name) except dbus.DBusException, e: pretty.print_error(__name__, e) return False private_iface_name = "org.xfce.Session.Manager" bus.add_signal_receiver(self._xfce_session_state_changed, "StateChanged", dbus_interface=private_iface_name) return True def _get_response_obj(self): """Return D-Bus session object for ClientPrivate Interface""" service_name = "org.gnome.SessionManager" obj_name = self.client_id iface_name = "org.gnome.SessionManager.ClientPrivate" try: bus = dbus.Bus() obj = bus.get_object(service_name, obj_name) except dbus.DBusException, e: pretty.print_error(__name__, e) return None smanager = dbus.Interface(obj, iface_name) return smanager def _query_end_session(self, flags): self.output_debug("Query end", flags) smanager = self._get_response_obj() smanager and smanager.EndSessionResponse(True, "Always OK") def _end_session_signal(self, flags): self.output_debug("Session end", flags) if not self._session_ended: self._session_ended = True self.emit("save-yourself") smanager = self._get_response_obj() smanager and smanager.EndSessionResponse(True, "Always OK") def _xfce_session_state_changed(self, old_value, new_value): self.output_debug("XFCE Session change", time.asctime(), old_value, new_value) if new_value == 4: self.emit("save-yourself") def _stop_signal(self): self.output_debug("Session stop") self.emit("die") def _session_save(self, obj, *args): self.emit("save-yourself") def _session_die(self, obj, *args): self.emit("die") @property def enabled(self): """If a session connection is available""" return self._enabled gobject.signal_new("save-yourself", SessionClient, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, ()) gobject.signal_new("die", SessionClient, gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, ()) kupfer-v208/kupfer/ui/uievents.py000066400000000000000000000106731176220042200171770ustar00rootroot00000000000000import contextlib import os import gtk from kupfer import pretty from kupfer.ui import keybindings def gui_context_from_widget(timestamp, widget): return GUIEnvironmentContext(timestamp, widget.get_screen()) def gui_context_from_timestamp(timestamp): return GUIEnvironmentContext(timestamp, None) def gui_context_from_keyevent(timestamp, display): new_display = GUIEnvironmentContext.ensure_display_open(display) screen, x, y, modifiers = new_display.get_pointer() return GUIEnvironmentContext(timestamp, screen) class GUIEnvironmentContext (object): """ Context object for action execution in the current GUI context """ _open_displays = set() def __init__(self, timestamp, screen=None): self._timestamp = timestamp self._screen = screen or gtk.gdk.screen_get_default() @classmethod def ensure_display_open(cls, display): """ Return GdkDisplay for name @display. Return default if @display is None. """ def norm_name(name): "normalize display name" if name[-2] == ":": return name+".0" return name dm = gtk.gdk.display_manager_get() if display: new_display = None for disp in dm.list_displays(): if norm_name(disp.get_name()) == norm_name(display): new_display = disp break if new_display is None: pretty.print_debug(__name__, "Opening display in ensure_display_open", display) new_display = gtk.gdk.Display(display) else: new_display = gtk.gdk.display_get_default() ## Hold references to all open displays cls._open_displays = set(dm.list_displays()) return new_display @classmethod def _try_close_unused_displays(cls, screen): """@screen is current GdkScreen Try to close inactive displays... Take all GtkWindow that are hidden, and move to the current screen. If no windows remain then we close the display, but we never close the default display. """ def debug(*x): pretty.print_debug(__name__, *x) display = screen.get_display() dm = gtk.gdk.display_manager_get() for disp in list(dm.list_displays()): if disp != display and disp != gtk.gdk.display_get_default(): debug("Trying to close", disp.get_name()) open_windows = 0 for window in gtk.window_list_toplevels(): # find windows on @disp if window.get_screen().get_display() != disp: continue if not window.get_property("visible"): debug("Moving window", window.get_name()) debug("Moving", window.get_title()) window.set_screen(screen) else: debug("Open window blocks close") open_windows += 1 if not open_windows: debug("Closing display", disp.get_name()) disp.close() def get_timestamp(self): return self._timestamp def get_startup_notification_id(self): """ Always returns a byte string """ return _make_startup_notification_id(self.get_timestamp()) def get_display(self): """return the display name to show new windows on Always returns a byte string """ return self._screen.make_display_name() def get_screen(self): return self._screen def present_window(self, window): """ Show and present @window on the current workspace, screen & display as appropriate. @window: A gtk.Window """ window.set_screen(self.get_screen()) window.present_with_time(self.get_timestamp()) class _internal_data (object): seq = 0 current_event_time = 0 @classmethod def inc_seq(cls): cls.seq = cls.seq + 1 def _make_startup_notification_id(time): _internal_data.inc_seq() return "%s-%d-%s_TIME%d" % ("kupfer", os.getpid(), _internal_data.seq, time) def current_event_time(): return (gtk.get_current_event_time() or keybindings.get_current_event_time() or _internal_data.current_event_time) def _parse_notify_id(startup_notification_id): """ Return timestamp or 0 from @startup_notification_id """ time = 0 if "_TIME" in startup_notification_id: _ign, bstime = startup_notification_id.split("_TIME", 1) try: time = abs(int(bstime)) except ValueError: pass return time @contextlib.contextmanager def using_startup_notify_id(notify_id): """ Pass in a DESKTOP_STARTUP_ID with using_startup_notify_id(...) as time: pass The yelt object is the parsed timestamp """ timestamp = _parse_notify_id(notify_id) if timestamp: gtk.gdk.notify_startup_complete_with_id(notify_id) try: pretty.print_debug(__name__, "Using startup id", repr(notify_id)) _internal_data.current_event_time = timestamp yield timestamp finally: _internal_data.current_event_time = gtk.gdk.CURRENT_TIME kupfer-v208/kupfer/uiutils.py000066400000000000000000000133351176220042200164140ustar00rootroot00000000000000""" User Interface Utility Functions for Kupfer These helper functions can be called from plugins (are meant to serve this purpose), but care should be taken to only call UI functions from the main (default) thread. """ import gtk import pango from kupfer import pretty from kupfer import config, version from kupfer.ui import uievents def _window_destroy_on_escape(widget, event): """ Callback function for Window's key press event, will destroy window on escape """ if event.keyval == gtk.gdk.keyval_from_name("Escape"): widget.destroy() return True def builder_get_objects_from_file(fname, attrs, autoconnect_to=None): """ Open @fname with gtk.Builder and yield objects named @attrs @fname is sought in the data directories. If @autoconnect_to is not None, signals are autoconnected to this object, and a user_data object is passed as a namespace containing all @attrs """ builder = gtk.Builder() builder.set_translation_domain(version.PACKAGE_NAME) ui_file = config.get_data_file(fname) builder.add_from_file(ui_file) class Namespace (object): pass names = Namespace() for attr in attrs: obj = builder.get_object(attr) setattr(names, attr, obj) yield obj if autoconnect_to: builder.connect_signals(autoconnect_to, user_data=names) def show_text_result(text, title=None, ctx=None): """ Show @text in a result window. Use @title to set a window title """ class ResultWindowBehavior (object): def on_text_result_window_key_press_event(self, widget, event, names): return _window_destroy_on_escape(widget, event) def on_close_button_clicked(self, widget, names): names.text_result_window.window.destroy() return True def on_copy_button_clicked(self, widget, names): clip = gtk.clipboard_get(gtk.gdk.SELECTION_CLIPBOARD) textview = names.result_textview buf = textview.get_buffer() buf.select_range(*buf.get_bounds()) buf.copy_clipboard(clip) window, textview = builder_get_objects_from_file("result.ui", ("text_result_window", "result_textview"), autoconnect_to=ResultWindowBehavior()) # Set up text buffer buf = gtk.TextBuffer() buf.set_text(text) monospace = gtk.TextTag("fixed") monospace.set_property("family", "Monospace") monospace.set_property("scale", pango.SCALE_LARGE) beg, end = buf.get_bounds() tag_table = buf.get_tag_table() tag_table.add(monospace) buf.apply_tag(monospace, beg, end) textview.set_buffer(buf) textview.set_wrap_mode(gtk.WRAP_NONE) if title: window.set_title(title) if ctx: ctx.environment.present_window(window) window.show_all() # Fix Sizing: # We want to size the window so that the # TextView is displayed without scrollbars # initially, if it fits on screen. oldwid, oldhei = textview.window.get_size() winwid, winhei = window.get_size() max_hsize, max_vsize = window.get_default_size() wid, hei = textview.size_request() textview.set_wrap_mode(gtk.WRAP_WORD) vsize = int(min(hei + (winhei - oldhei) + 5, max_vsize)) hsize = int(min(wid + (winwid - oldwid) + 5, max_hsize)) window.resize(hsize, vsize) if ctx: ctx.environment.present_window(window) else: window.present_with_time(uievents.current_event_time()) def _wrap_paragraphs(text): """ Return @text with linewrapped paragraphs """ import textwrap return u"\n\n".join(textwrap.fill(par) for par in text.split("\n\n")) def show_large_type(text, ctx=None): """ Show @text, large, in a result window. """ import math text = text.strip() window = gtk.Window() label = gtk.Label() label.set_text(text) def set_font_size(label, fontsize=48.0): siz_attr = pango.AttrFontDesc( pango.FontDescription (str(fontsize)), 0, -1) attrs = pango.AttrList() attrs.insert(siz_attr) label.set_attributes(attrs) label.show() size = 72.0 set_font_size(label, size) if ctx: screen = ctx.environment.get_screen() window.set_screen(screen) else: screen = gtk.gdk.screen_get_default() maxwid = screen.get_width() - 50 maxhei = screen.get_height() - 100 wid, hei = label.size_request() # If the text contains long lines, we try to # hard-wrap the text if ((wid > maxwid or hei > maxhei) and any(len(L) > 100 for L in text.splitlines())): label.set_text(_wrap_paragraphs(text)) wid, hei = label.size_request() if wid > maxwid or hei > maxhei: # Round size down to fit inside wscale = maxwid * 1.0/wid hscale = maxhei * 1.0/hei set_font_size(label, math.floor(min(wscale, hscale)*size) or 1.0) window.add(label) window.set_position(gtk.WIN_POS_CENTER) window.set_resizable(False) window.set_decorated(False) window.set_property("border-width", 10) window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("black")) label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white")) def _window_destroy(widget, event): widget.destroy() return True window.connect("key-press-event", _window_destroy) window.show_all() if ctx: ctx.environment.present_window(window) else: window.present_with_time(uievents.current_event_time()) SERVICE_NAME = "org.freedesktop.Notifications" OBJECT_PATH = "/org/freedesktop/Notifications" IFACE_NAME = "org.freedesktop.Notifications" def _get_notification_iface(): "we will activate it over d-bus (start if not running)" import dbus try: bus = dbus.SessionBus() proxy_obj = bus.get_object(SERVICE_NAME, OBJECT_PATH) except dbus.DBusException, e: pretty.print_debug(__name__, e) return iface_obj = dbus.Interface(proxy_obj, IFACE_NAME) return iface_obj def show_notification(title, text="", icon_name="", nid=0): """ @nid: If not 0, the id of the notification to replace. Returns the id of the displayed notification. """ notifications = _get_notification_iface() if not notifications: return None rid = notifications.Notify("kupfer", nid, icon_name, title, text, (), {}, -1) return rid kupfer-v208/kupfer/utils.py000066400000000000000000000330301176220042200160500ustar00rootroot00000000000000import itertools import os from os import path as os_path import locale import signal import sys import gobject import glib from kupfer import pretty from kupfer import kupferstring from kupfer import desktop_launch from kupfer import launch from kupfer import desktop_parse from kupfer import terminal from kupfer.desktop_launch import SpawnError def get_dirlist(folder, depth=0, include=None, exclude=None): """ Return a list of absolute paths in folder include, exclude: a function returning a boolean def include(filename): return ShouldInclude """ from os import walk paths = [] def include_file(file): return (not include or include(file)) and (not exclude or not exclude(file)) for dirname, dirnames, fnames in walk(folder): # skip deep directories head, dp = dirname, 0 while not os_path.samefile(head, folder): head, tail = os_path.split(head) dp += 1 if dp > depth: del dirnames[:] continue excl_dir = [] for dir in dirnames: if not include_file(dir): excl_dir.append(dir) continue abspath = os_path.join(dirname, dir) paths.append(abspath) for file in fnames: if not include_file(file): continue abspath = os_path.join(dirname, file) paths.append(abspath) for dir in reversed(excl_dir): dirnames.remove(dir) return paths def locale_sort(seq, key=unicode): """Return @seq of objects with @key function as a list sorted in locale lexical order >>> locale.setlocale(locale.LC_ALL, "C") 'C' >>> locale_sort("abcABC") ['A', 'B', 'C', 'a', 'b', 'c'] >>> locale.setlocale(locale.LC_ALL, "en_US.UTF-8") 'en_US.UTF-8' >>> locale_sort("abcABC") ['a', 'A', 'b', 'B', 'c', 'C'] """ locale_cmp = lambda s, o: locale.strcoll(key(s), key(o)) seq = seq if isinstance(seq, list) else list(seq) seq.sort(cmp=locale_cmp) return seq def _argv_to_locale(argv): "encode unicode strings in @argv according to the locale encoding" return [kupferstring.tolocale(A) if isinstance(A, unicode) else A for A in argv] class AsyncCommand (object): """ Run a command asynchronously (using the GLib mainloop) call @finish_callback when command terminates, or when command is killed after @timeout_s seconds, whichever comes first. If @timeout_s is None, no timeout is used If stdin is a byte string, it is supplied on the command's stdin. finish_callback -> (AsyncCommand, stdout_output, stderr_output) Attributes: self.exit_status Set after process exited self.finished bool """ # the maximum input (bytes) we'll read in one shot (one io_callback) max_input_buf = 512 * 1024 def __init__(self, argv, finish_callback, timeout_s, stdin=None): self.stdout = [] self.stderr = [] self.stdin = [] self.timeout = False self.killed = False self.finished = False self.finish_callback = finish_callback argv = _argv_to_locale(argv) pretty.print_debug(__name__, "AsyncCommand:", argv) flags = (glib.SPAWN_SEARCH_PATH | glib.SPAWN_DO_NOT_REAP_CHILD) pid, stdin_fd, stdout_fd, stderr_fd = \ glib.spawn_async(argv, standard_output=True, standard_input=True, standard_error=True, flags=flags) if stdin: self.stdin[:] = self._split_string(stdin, self.max_input_buf) in_io_flags = glib.IO_OUT | glib.IO_ERR | glib.IO_HUP | glib.IO_NVAL glib.io_add_watch(stdin_fd, in_io_flags, self._in_io_callback, self.stdin) else: os.close(stdin_fd) io_flags = glib.IO_IN | glib.IO_ERR | glib.IO_HUP | glib.IO_NVAL glib.io_add_watch(stdout_fd, io_flags, self._io_callback, self.stdout) glib.io_add_watch(stderr_fd, io_flags, self._io_callback, self.stderr) self.pid = pid glib.child_watch_add(pid, self._child_callback) if timeout_s is not None: glib.timeout_add_seconds(timeout_s, self._timeout_callback) def _split_string(self, s, length): """Split @s in pieces of @length""" L = [] for i in xrange(0, len(s)//length + 1): L.append(s[i*length:(i+1)*length]) return L def _io_callback(self, sourcefd, condition, databuf): if condition & glib.IO_IN: databuf.append(os.read(sourcefd, self.max_input_buf)) return True return False def _in_io_callback(self, sourcefd, condition, databuf): """write to child's stdin""" if condition & glib.IO_OUT: if not databuf: os.close(sourcefd) return False s = databuf.pop(0) written = os.write(sourcefd, s) if written < len(s): databuf.insert(0, s[written:]) return True return False def _child_callback(self, pid, condition): # @condition is the &status field of waitpid(2) (C library) self.exit_status = os.WEXITSTATUS(condition) self.finished = True self.finish_callback(self, "".join(self.stdout), "".join(self.stderr)) def _timeout_callback(self): "send term signal on timeout" if not self.finished: self.timeout = True os.kill(self.pid, signal.SIGTERM) glib.timeout_add_seconds(2, self._kill_callback) def _kill_callback(self): "Last resort, send kill signal" if not self.finished: self.killed = True os.kill(self.pid, signal.SIGKILL) def spawn_terminal(workdir=None, screen=None): " Raises SpawnError " term = terminal.get_configured_terminal() notify = term["startup_notify"] app_id = term["desktopid"] argv = term["argv"] desktop_launch.spawn_app_id(app_id, argv, workdir, notify, screen) def spawn_in_terminal(argv, workdir=None): " Raises SpawnError " term = terminal.get_configured_terminal() notify = term["startup_notify"] _argv = list(term["argv"]) if term["exearg"]: _argv.append(term["exearg"]) _argv.extend(argv) desktop_launch.spawn_app_id(term["desktopid"], _argv , workdir, notify) def spawn_async_notify_as(app_id, argv): """ Spawn argument list @argv and startup-notify as if application @app_id is starting (if possible) raises SpawnError """ desktop_launch.spawn_app_id(app_id, argv , None, True) def spawn_async(argv, in_dir="."): """ Silently spawn @argv in the background Returns False on failure """ try: return spawn_async_raise(argv, in_dir) except SpawnError as exc: pretty.print_debug(__name__, "spawn_async", argv, exc) return False def spawn_async_raise(argv, workdir="."): """ A version of spawn_async that raises on error. raises SpawnError """ argv = _argv_to_locale(argv) pretty.print_debug(__name__, "spawn_async", argv, workdir) try: return gobject.spawn_async (argv, working_directory=workdir, flags=gobject.SPAWN_SEARCH_PATH) except gobject.GError as exc: raise SpawnError(exc) def argv_for_commandline(cli): return desktop_parse.parse_argv(cli) def launch_commandline(cli, name=None, in_terminal=False): " Raises SpawnError " argv = desktop_parse.parse_argv(cli) pretty.print_error(__name__, "Launch commandline is deprecated ") pretty.print_debug(__name__, "Launch commandline (in_terminal=", in_terminal, "):", argv, sep="") if in_terminal: return spawn_in_terminal(argv) return spawn_async(argv) def launch_app(app_info, files=(), uris=(), paths=()): " Raises SpawnError " # With files we should use activate=False return launch.launch_application(app_info, files, uris, paths, activate=False) def show_path(path): """Open local @path with default viewer""" from gio import File # Implemented using gtk.show_uri gfile = File(path) if not gfile: return url = gfile.get_uri() show_url(url) def show_url(url): """Open any @url with default viewer""" from gtk import show_uri, get_current_event_time from gtk.gdk import screen_get_default from glib import GError try: pretty.print_debug(__name__, "show_url", url) return show_uri(screen_get_default(), url, get_current_event_time()) except GError, exc: pretty.print_error(__name__, "gtk.show_uri:", exc) def _on_child_exit(pid, condition, user_data): # @condition is the &status field of waitpid(2) (C library) argv, respawn = user_data if respawn: is_signal = os.WIFSIGNALED(condition) if is_signal and respawn: def callback(*args): spawn_child(*args) return False glib.timeout_add_seconds(10, callback, argv, respawn) def _try_register_pr_pdeathsig(): """ Register PR_SET_PDEATHSIG (linux-only) for the calling process which is a signal delivered when its parent dies. This should ensure child processes die with the parent. """ PR_SET_PDEATHSIG=1 SIGHUP=1 if sys.platform != 'linux2': return try: import ctypes except ImportError: return try: libc = ctypes.CDLL("libc.so.6") libc.prctl(PR_SET_PDEATHSIG, SIGHUP) except (AttributeError, OSError): pass def spawn_child(argv, respawn=True, display=None): """ Spawn argv in the mainloop and keeping it as a child process (it will be made sure to exit with the parent). @respawn: If True, respawn if child dies abnormally raises utils.SpawnError returns pid """ flags = (glib.SPAWN_SEARCH_PATH | glib.SPAWN_DO_NOT_REAP_CHILD) kwargs = {} if display: # environment is passed as a sequence of strings envd = os.environ.copy() envd['DISPLAY'] = display kwargs['envp'] = ['='.join((k,v)) for k,v in envd.items()] try: pid, stdin_fd, stdout_fd, stderr_fd = \ glib.spawn_async(argv, flags=flags, child_setup=_try_register_pr_pdeathsig, **kwargs) except glib.GError as exc: raise utils.SpawnError(unicode(exc)) if pid: glib.child_watch_add(pid, _on_child_exit, (argv, respawn)) return pid def start_plugin_helper(name, respawn, display=None): """ @respawn: If True, respawn if child dies abnormally raises SpawnError """ argv = [sys.executable] argv.extend(sys.argv) argv.append('--exec-helper=%s' % name) pretty.print_debug(__name__, "Spawning", argv) return spawn_child(argv, respawn, display=display) def show_help_url(url): """ Try at length to display a startup notification for the help browser. Return False if there is no handler for the help URL """ import gio ## Check that the system help viewer is Yelp, ## and if it is, launch its startup notification. scheme = gio.File(url).get_uri_scheme() default = gio.app_info_get_default_for_uri_scheme(scheme) help_viewer_id = "yelp.desktop" if not default: return False try: yelp = gio.unix.DesktopAppInfo(help_viewer_id) except RuntimeError: return show_url(url) cmd_path = lookup_exec_path(default.get_executable()) yelp_path = lookup_exec_path(yelp.get_executable()) if cmd_path and yelp_path and os.path.samefile(cmd_path, yelp_path): try: spawn_async_notify_as(help_viewer_id, [cmd_path, url]) return True except SpawnError: pass return show_url(url) def lookup_exec_path(exename): "Return path for @exename in $PATH or None" PATH = os.environ.get("PATH") or os.defpath for execdir in PATH.split(os.pathsep): exepath = os.path.join(execdir, exename) if os.access(exepath, os.R_OK|os.X_OK) and os.path.isfile(exepath): return exepath def is_directory_writable(dpath): """If directory path @dpath is a valid destination to write new files? """ if not os_path.isdir(dpath): return False return os.access(dpath, os.R_OK | os.W_OK | os.X_OK) def get_destpath_in_directory(directory, filename, extension=None): """Find a good destpath for a file named @filename in path @directory Try naming the file as filename first, before trying numbered versions if the previous already exist. If @extension, it is used as the extension. Else the filename is split and the last extension is used """ # find a nonexisting destname ctr = itertools.count(1) basename = filename + (extension or "") destpath = os_path.join(directory, basename) while True: if not os_path.exists(destpath): break if extension: root, ext = filename, extension else: root, ext = os_path.splitext(filename) basename = "%s-%s%s" % (root, ctr.next(), ext) destpath = os_path.join(directory, basename) return destpath def get_destfile_in_directory(directory, filename, extension=None): """Find a good destination for a file named @filename in path @directory. Like get_destpath_in_directory, but returns an open file object, opened atomically to avoid race conditions. Return (fileobj, filepath) """ # retry if it fails for retry in xrange(3): destpath = get_destpath_in_directory(directory, filename, extension) try: fd = os.open(destpath, os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0666) except OSError, exc: pretty.print_error(__name__, exc) else: return (os.fdopen(fd, "wb"), destpath) return (None, None) def get_safe_tempfile(): """Return (fileobj, filepath) pointing to an open temporary file""" import tempfile fd, path = tempfile.mkstemp() return (os.fdopen(fd, "wb"), path) def get_display_path_for_bytestring(filepath): """Return a unicode path for display for bytestring @filepath Will use glib's filename decoding functions, and will format nicely (denote home by ~/ etc) """ desc = gobject.filename_display_name(filepath) homedir = os.path.expanduser("~/") if desc.startswith(homedir) and homedir != desc: desc = desc.replace(homedir, "~/", 1) return desc def parse_time_interval(tstr): """ Parse a time interval in @tstr, return whole number of seconds >>> parse_time_interval("2") 2 >>> parse_time_interval("1h 2m 5s") 3725 >>> parse_time_interval("2 min") 120 """ weights = { "s": 1, "sec": 1, "m": 60, "min": 60, "h": 3600, "hours": 3600, } try: return int(tstr) except ValueError: pass total = 0 amount = 0 # Split the string in runs of digits and runs of characters for isdigit, group in itertools.groupby(tstr, lambda k: k.isdigit()): part = "".join(group).strip() if not part: continue if isdigit: amount = int(part) else: total += amount * weights.get(part.lower(), 0) amount = 0 return total if __name__ == '__main__': import doctest doctest.testmod() kupfer-v208/kupfer/version.py000066400000000000000000000045371176220042200164070ustar00rootroot00000000000000# encoding: UTF-8 VERSION = "development version" PACKAGE_NAME = "kupfer" try: from kupfer import version_subst except ImportError: pass else: VERSION = version_subst.VERSION PACKAGE_NAME = version_subst.PACKAGE_NAME ICON_NAME = "kupfer" PROGRAM_NAME = _("Kupfer") AUTHORS = u"""Ulrik Sverdrup Karol Będkowski Francesco Marella Chmouel Boudjnah Horia V. Corcalciuc Grigory Javadyan Chris Parsons Fabian Carlström Jakh Daven Thomas Renard """.splitlines() PACKAGERS=u""" Luca Falavigna (Debian, Ubuntu) Francesco Marella (Ubuntu PPA) """.splitlines() TRANSLATORS=u""" Marek Černocký (cs) Petr Kovar (cs) Joe Hansen (da) Thibaud Roth (de) Mario Blättermann (de) Leandro Leites (es) Jesús Barbero Rodríguez (es) Jorge González (es) Daniel Mustieles (es) Oier Mees (eu) Iñaki Larrañaga Murgoitio (eu) Christophe Benz (fr) Marcos Lans (gl) Fran Diéguez (gl) Andrea Zagli (it) Francesco Marella (it) Martin Koelewijn (nl) Kjartan Maraas (no) Maciej Kwiatkowski (pl) Karol Będkowski (pl) Carlos Pais (pt) Andrej Žnidaršič (sl) Matej Urbančič (sl) M. Deran Delice (tr) lh (zh_CN) Aron Xu (zh_CN) Yinghua Wang (zh_CN) """.splitlines() ARTISTS=u"""Nasser Alshammari """.splitlines() AUTHORS += ARTISTS + PACKAGERS + TRANSLATORS DOCUMENTERS = [] # TRANS: Don't translate literally! # TRANS: This should be a list of all translators of this language TRANSLATOR_CREDITS = _("translator-credits") WEBSITE = u"http://kaizer.se/wiki/kupfer/" HELP_WEBSITE = u"http://kaizer.se/wiki/kupfer/help/" SHORT_DESCRIPTION = _("A free software (GPLv3+) launcher") COPYRIGHT = u"""Copyright © 2007--2011 Ulrik Sverdrup with others""" LICENSE = _(""" 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 . """) # follows strings used elsewhere _("Could not find running Kupfer") kupfer-v208/kupfer/version_subst.py.in000066400000000000000000000001411176220042200202170ustar00rootroot00000000000000VERSION = "@VERSION@" PACKAGE_NAME = "@PACKAGE@" LOCALEDIR = "@LOCALEDIR@" DATADIR = "@DATADIR@" kupfer-v208/kupfer/weaklib.py000066400000000000000000000050321176220042200163270ustar00rootroot00000000000000""" This module is a part of the program Kupfer, see the main program file for more information. """ import weakref class WeakCallback (object): """A Weak Callback object that will keep a reference to the connecting object with weakref semantics. This allows object A to pass a callback method to object S, without object S keeping A alive. """ def __init__(self, mcallback): """Create a new Weak Callback calling the method @mcallback""" obj = mcallback.im_self attr = mcallback.im_func.__name__ self.wref = weakref.ref(obj, self.object_deleted) self.callback_attr = attr self.token = None def __call__(self, *args, **kwargs): obj = self.wref() if obj: attr = getattr(obj, self.callback_attr) attr(*args, **kwargs) else: self.default_callback(*args, **kwargs) def default_callback(self, *args, **kwargs): """Called instead of callback when expired""" pass def object_deleted(self, wref): """Called when callback expires""" pass class DbusWeakCallback (WeakCallback): """ Will use @token if set as follows: token.remove() """ def object_deleted(self, wref): if self.token: self.token.remove() self.token = None def dbus_signal_connect_weakly(bus, signal, mcallback, **kwargs): """ Connect method @mcallback to dbus signal using a weak callback Connect to @signal on @bus, passing on all keyword arguments """ weak_cb = DbusWeakCallback(mcallback) weak_cb.token = bus.add_signal_receiver(weak_cb, signal, **kwargs) class GobjectWeakCallback (WeakCallback): """ Will use @token if set as follows: sender.disconnect(token) """ __senders = {} def object_deleted(self, wref): sender = self.__senders.pop(self.token, None) if sender: sender.disconnect(self.token) @classmethod def _connect(cls, sender, signal, mcallback, *user_args): # We save references to the sender in a class variable, # this is the only way to have it accessible when obj expires. wc = cls(mcallback) wc.token = sender.connect(signal, wc, *user_args) cls.__senders[wc.token] = sender def gobject_connect_weakly(sender, signal, mcallback, *user_args): """Connect weakly to GObject @sender's @signal, with a callback method @mcallback >>> import gtk >>> btn = gtk.Button() >>> class Handler (object): ... def handle(self): pass ... def __del__(self): print "deleted" ... >>> h = Handler() >>> gobject_connect_weakly(btn, "clicked", h.handle) >>> del h deleted >>> """ GobjectWeakCallback._connect(sender, signal, mcallback, *user_args) if __name__ == '__main__': import doctest doctest.testmod() kupfer-v208/po/000077500000000000000000000000001176220042200134615ustar00rootroot00000000000000kupfer-v208/po/LINGUAS000066400000000000000000000001131176220042200145010ustar00rootroot00000000000000cs da de en en_GB es eu fr gl hu it ko nb nl pl pt pt_BR ru sl sv tr zh_CN kupfer-v208/po/POTFILES.in000066400000000000000000000065231176220042200152440ustar00rootroot00000000000000# encoding: UTF-8 # Order: Data files, Regular modules, Object modules, Plugins auxdata/kupfer.desktop.in auxdata/kupfer-exec.desktop.in auxdata/kupfer-mimetypes.xml.in [type: gettext/glade]data/credentials_dialog.ui [type: gettext/glade]data/getkey_dialog.ui [type: gettext/glade]data/preferences.ui [type: gettext/glade]data/progress_dialog.ui [type: gettext/glade]data/result.ui extras/kupfer_provider.py kupfer/core/commandexec.py kupfer/core/execfile.py kupfer/keyrelay.py kupfer/main.py kupfer/ui/accelerators.py kupfer/ui/browser.py kupfer/ui/getkey_dialog.py kupfer/ui/preferences.py kupfer/version.py kupfer/obj/base.py kupfer/obj/compose.py kupfer/obj/contacts.py kupfer/obj/exceptions.py kupfer/obj/fileactions.py kupfer/obj/objects.py kupfer/obj/sources.py kupfer/obj/special.py # Plugin order: First, all by default enabled plugins, then others. Sorted. kupfer/plugin/applications.py kupfer/plugin/archivemanager.py kupfer/plugin/calculator.py kupfer/plugin/clipboard.py kupfer/plugin/commands.py kupfer/plugin/core/alternatives.py kupfer/plugin/core/commands.py kupfer/plugin/core/contents.py kupfer/plugin/core/debug.py kupfer/plugin/core/__init__.py kupfer/plugin/core/internal.py kupfer/plugin/core/text.py kupfer/plugin/dictionary.py kupfer/plugin/documents.py kupfer/plugin/epiphany.py kupfer/plugin/favorites.py kupfer/plugin/fileactions.py kupfer/plugin/firefox.py kupfer/plugin/multihead.py kupfer/plugin/nautilusselection.py kupfer/plugin/notes.py kupfer/plugin/rhythmbox.py kupfer/plugin/session_gnome.py kupfer/plugin/session_support.py kupfer/plugin/session_xfce.py kupfer/plugin/show_text.py kupfer/plugin/trash.py kupfer/plugin/triggers.py kupfer/plugin/urlactions.py kupfer/plugin/volumes.py kupfer/plugin/websearch.py kupfer/plugin/wikipedia.py kupfer/plugin/windows.py # Optional plugins follow kupfer/plugin/abiword.py kupfer/plugin/apt_tools.py kupfer/plugin/archiveinside.py kupfer/plugin/asciiunicodeiconset.py kupfer/plugin/audacious.py kupfer/plugin/chromium.py kupfer/plugin/clawsmail.py kupfer/plugin/custom_terminal.py kupfer/plugin/customtheme.py kupfer/plugin/defaultmail.py kupfer/plugin/devhelp.py kupfer/plugin/duckduckgo.py kupfer/plugin/empathy.py kupfer/plugin/evolution.py kupfer/plugin/filezilla.py kupfer/plugin/gajim.py kupfer/plugin/glob.py kupfer/plugin/gmail/__init__.py kupfer/plugin/gnome_terminal.py kupfer/plugin/google_picasa/__init__.py kupfer/plugin/google_search.py kupfer/plugin/gtg.py kupfer/plugin/gwibber.py kupfer/plugin/gwibber_simple.py kupfer/plugin/higherorder.py kupfer/plugin/image.py kupfer/plugin/kupfer_plugins.py kupfer/plugin/locate.py kupfer/plugin/openoffice.py kupfer/plugin/operamail.py kupfer/plugin/opera.py kupfer/plugin/pidgin.py kupfer/plugin/putty.py kupfer/plugin/qsicons/__init__.py kupfer/plugin/quickview.py kupfer/plugin/rst.py kupfer/plugin/screen.py kupfer/plugin/sendkeys.py kupfer/plugin/services.py kupfer/plugin/shorten_links.py kupfer/plugin/show_qrcode.py kupfer/plugin/skype.py kupfer/plugin/ssh_hosts.py kupfer/plugin_support.py kupfer/plugin/templates.py kupfer/plugin/textfiles.py kupfer/plugin/thunar.py kupfer/plugin/thunderbird.py kupfer/plugin/top.py kupfer/plugin/tracker1.py kupfer/plugin/tracker.py kupfer/plugin/truecrypt.py kupfer/plugin/tsclient.py kupfer/plugin/vim/__init__.py kupfer/plugin/vim/plugin.py kupfer/plugin/vinagre.py kupfer/plugin/virtualbox/__init__.py kupfer/plugin/zim.py kupfer-v208/po/POTFILES.skip000066400000000000000000000001751176220042200156010ustar00rootroot00000000000000contrib/google_translate.py contrib/icon_names.py contrib/runningapplications.py contrib/_ssl.py contrib/twitter/__init__.py kupfer-v208/po/cs.po000066400000000000000000002570761176220042200144470ustar00rootroot00000000000000# Czech translation for kupfer. # Copyright (C) 2009, 2010 the author(s) of kupfer. # This file is distributed under the same license as the kupfer package. # # Lucas Lommer , 2010. # Petr Kovar , 2010. # Marek Černocký , 2009, 2010, 2011, 2012. # msgid "" msgstr "" "Project-Id-Version: kupfer master\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2012-02-25 19:02+0000\n" "PO-Revision-Date: 2012-04-24 18:58+0200\n" "Last-Translator: Marek Černocký \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../auxdata/kupfer.desktop.in.h:1 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Application Launcher" msgstr "Spouštěč aplikací" #: ../auxdata/kupfer.desktop.in.h:3 msgid "Convenient command and access tool for applications and documents" msgstr "" "Nástroj pro pohodlné provádění příkazů a přístup k aplikacím a dokumentům" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Spustit v aplikaci Kupfer" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Uložený příkaz aplikace Kupfer" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Přístupové údaje uživatele" #: ../data/credentials_dialog.ui.h:2 msgid "_User:" msgstr "_Uživatel:" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "_Heslo:" #: ../data/credentials_dialog.ui.h:4 msgid "_Change" msgstr "_Změnit" #: ../data/getkey_dialog.ui.h:1 msgid "Set Keyboard Shortcut" msgstr "Nastavit klávesové zkratky" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Zmáčkněte prosím požadovanou kombinaci kláves" #: ../data/getkey_dialog.ui.h:3 msgid "Keybinding could not be bound" msgstr "Nelze najít klávesovou zkratku" #: ../data/preferences.ui.h:1 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Předvolby Kupfer" #: ../data/preferences.ui.h:2 msgid "Start automatically on login" msgstr "Spouštět automaticky po přihlášení" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Spuštění" #: ../data/preferences.ui.h:4 msgid "Show icon in notification area" msgstr "Zobrazovat ikonu v oznamovací oblasti" #: ../data/preferences.ui.h:5 msgid "Icon set:" msgstr "Sada ikon:" #: ../data/preferences.ui.h:6 msgid "Terminal emulator:" msgstr "Emulátor terminálu:" #: ../data/preferences.ui.h:7 msgid "Desktop Environment" msgstr "Pracovní prostředí" #: ../data/preferences.ui.h:8 ../kupfer/plugin/gmail/__init__.py:60 msgid "General" msgstr "Obecné" #: ../data/preferences.ui.h:9 msgid "Global Keyboard Shortcuts" msgstr "Globální klávesové zkratky" #: ../data/preferences.ui.h:10 ../kupfer/ui/preferences.py:849 msgid "Reset" msgstr "Vrátit původní" #: ../data/preferences.ui.h:11 msgid "Browser Keyboard Shortcuts" msgstr "Klávesové zkratky prohlížeče" #: ../data/preferences.ui.h:12 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "Použít jednoklávesové příkazy (mezerník, lomítko, tečka, čárka atd.)" #: ../data/preferences.ui.h:13 msgid "Keyboard" msgstr "Klávesnice" #: ../data/preferences.ui.h:14 msgid "Plugins" msgstr "Zásuvné moduly" #: ../data/preferences.ui.h:15 msgid "Inclusion in Top Level Searches" msgstr "Zahrnout do nejvyšší úrovně hledání" #: ../data/preferences.ui.h:16 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" "Označené zdroje mají své objekty zahrnuty v nejvyšší úrovni hledání.\n" "Obsah neoznačených zdrojů je dostupny pouze při hledání v jeho podkatalogu." #: ../data/preferences.ui.h:18 msgid "Indexed Folders" msgstr "Indexované složky" #: ../data/preferences.ui.h:19 msgid "Folders whose files are always available in the catalog." msgstr "Složky, jejichž soubory jsou již dostupné v katalogu." #: ../data/preferences.ui.h:20 ../kupfer/obj/sources.py:156 msgid "Catalog" msgstr "Katalog" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Nelze provést „%s“" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "„%s“ vyprodukoval výsledek" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "Nedostatečné oprávnění ke spuštění „%s“ (není spustitelný)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "Příkaz v „%s“ není dostupný" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "Zachytávání klávesnice je aktivní pro displej %s" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "po spuštění nezobrazit hlavní rozhraní" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "vypsat dostupné zásuvné moduly" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "zapnout ladicí informace" #. TRANS: --exec-helper=HELPER is an internal command #. TRANS: that executes a helper program that is part of kupfer #: ../kupfer/main.py:49 msgid "run plugin helper" msgstr "spustit pomocníka zásuvného modulu" #: ../kupfer/main.py:52 msgid "show usage help" msgstr "zobrazit nápovědu k použití" #: ../kupfer/main.py:53 msgid "show version information" msgstr "zobrazit informace o verzi" #: ../kupfer/main.py:59 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Použití: kupfer [PŘEPÍNAČE | SOUBOR … ]" #: ../kupfer/main.py:70 msgid "Available plugins:" msgstr "Dostupné zásuvné moduly:" #: ../kupfer/main.py:121 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "Alternativní aktivace" # Překlad viz dotaz v konferenci kupfer: http://mail.gnome.org/archives/kupfer-list/2010-April/msg00003.html #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Vložení do zásobníku" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Sestavit příkaz" #: ../kupfer/ui/accelerators.py:11 msgid "Mark Default Action" msgstr "Označit výchozí akci" #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "Zapomenout objekt" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "U všech vrátit původní" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Zvolit ukončení" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Zvolit vybraný soubor" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Zvolit vybraný text" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Zobrazit nápovědu" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Zobrazit předvolby" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "Přepnout na první panel" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Přepnout textový režim" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s je prázdný" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "Ve zdroji %(src)s nebylo pro dotaz \"%(query)s\" nic nalezeno" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Nic nenalezeno" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Pište co se má vyhledat" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Pište, prohledá se %s" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Žádná akce" #: ../kupfer/ui/browser.py:1513 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "Nastavit akci „%(action)s“ jako výchozí pro objekt „%(object)s“" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1523 #, python-format msgid "Forget About \"%s\"" msgstr "Zapomenout informace o „%s“" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1960 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Zobrazit hlavní rozhraní" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Zobrazit s výběrem" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Popis" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Autor" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Verze" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Je zapotřebí modul Python „%s“" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Zásuvný modul nemohl být načten kvůli výskytu chyby:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "vypnutý" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Obsah" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Zdroje" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Akce" #: ../kupfer/ui/preferences.py:575 #, python-format msgid "Using encrypted password storage: %s" msgstr "Použití šifrovaného úložiště s heslem: %s" #: ../kupfer/ui/preferences.py:577 #, python-format msgid "Using password storage: %s" msgstr "Použití úložiště s heslem: %s" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:594 msgid "Configuration" msgstr "Nastavení" #: ../kupfer/ui/preferences.py:614 msgid "Set username and password" msgstr "Nastavit jméno a heslo" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:668 msgid "Choose a Directory" msgstr "Výběr složky" #: ../kupfer/ui/preferences.py:847 msgid "Reset all shortcuts to default values?" msgstr "Nastavit všechny klávesové zkratky na výchozí hodnoty?" #: ../kupfer/ui/preferences.py:855 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Příkaz" #: ../kupfer/ui/preferences.py:856 msgid "Shortcut" msgstr "Klávesová zkratka" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "Marek Černocký " #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Spouštěč vydaný pod svobodnou licencí (GPLv3+)" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Tento program je svobodný software: Můžete jej dále šířit a/nebo upravovat " "za podmínek licence GNU General Public License v podobě, v jaké ji vydala " "Free Software Foundation, a to buď ve verzi 3 této licence nebo (dle vaší " "volby) v libovolné novější verzi.\n" "\n" "Tento program je šířen ve víře, že bude užitečný, ale BEZ JAKÝCHKOLIV ZÁRUK, " "a to i bez předpokládané záruky na PRODEJNOST nebo VHODNOST PRO KONKRÉTNÍ " "ÚČEL. Více podrobností najdete přímo v licenci GNU General Public License.\n" "\n" "Spolu s tímto programem byste měli obdržet kopii licence GNU General Public " "License. Pokud se tak nestalo, podívejte se na .\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "Nelze najít běžící aplikaci Kupfer" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 msgid "Text" msgstr "Text" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Spustit po chvíli…" #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Provést příkaz po uplynutí zadané časové prodlevy" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Více objektů" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s objekt" msgstr[1] "%s objekty" msgstr[2] "%s objektů" #: ../kupfer/obj/contacts.py:129 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/contacts.py:131 msgid "unknown" msgstr "neznámý" #: ../kupfer/obj/contacts.py:144 msgid "Aim" msgstr "Aim" #: ../kupfer/obj/contacts.py:151 msgid "Google Talk" msgstr "Google Talk" #: ../kupfer/obj/contacts.py:159 msgid "ICQ" msgstr "ICQ" #: ../kupfer/obj/contacts.py:166 msgid "MSN" msgstr "MSN" #: ../kupfer/obj/contacts.py:173 msgid "QQ" msgstr "QQ" #: ../kupfer/obj/contacts.py:180 msgid "Yahoo" msgstr "Yahoo" #. -*- coding: UTF-8 -*- #: ../kupfer/obj/contacts.py:187 ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "%s nepodporuje tuto operaci" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "Nelze použít s více objekty naráz" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:176 msgid "Open" msgstr "Otevřít" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Není nastavená výchozí aplikace pro %(file)s (%(type)s)" #: ../kupfer/obj/fileactions.py:45 #, python-format msgid "Please use \"%s\"" msgstr "Použijte prosím „%s“" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Nastavit výchozí aplikaci…" #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Otevřít pomocí výchozí aplikace" #: ../kupfer/obj/fileactions.py:74 msgid "Reveal" msgstr "Ukázat" #: ../kupfer/obj/fileactions.py:83 msgid "Open parent folder" msgstr "Otevřít rodičovskou složku" #: ../kupfer/obj/fileactions.py:89 msgid "Open Terminal Here" msgstr "Otevřít zde terminál" #: ../kupfer/obj/fileactions.py:102 msgid "Open this location in a terminal" msgstr "Otevřít toto umístění v terminálu" #: ../kupfer/obj/fileactions.py:110 msgid "Run in Terminal" msgstr "Spustit v terminálu" #: ../kupfer/obj/fileactions.py:110 msgid "Run (Execute)" msgstr "Spustit (provést)" #: ../kupfer/obj/fileactions.py:130 msgid "Run this program in a Terminal" msgstr "Spustit tento program v terminálu" #: ../kupfer/obj/fileactions.py:132 msgid "Run this program" msgstr "Spustit tento program" #: ../kupfer/obj/objects.py:252 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 ../kupfer/plugin/vim/plugin.py:172 msgid "Go To" msgstr "Přejít na" #: ../kupfer/obj/objects.py:278 msgid "Open URL" msgstr "Otevřít URL" #: ../kupfer/obj/objects.py:289 msgid "Open URL with default viewer" msgstr "Otevřít URL s výchozím prohlížečem" #: ../kupfer/obj/objects.py:303 msgid "Launch" msgstr "Spustit" #: ../kupfer/obj/objects.py:316 msgid "Show application window" msgstr "Zobrazit okno aplikace" #: ../kupfer/obj/objects.py:317 msgid "Launch application" msgstr "Spustit aplikaci" #: ../kupfer/obj/objects.py:328 msgid "Launch Again" msgstr "Spustit znovu" #: ../kupfer/obj/objects.py:335 msgid "Launch another instance of this application" msgstr "Spustit další instanci této aplikace" #: ../kupfer/obj/objects.py:341 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Zavřít" #: ../kupfer/obj/objects.py:349 msgid "Attempt to close all application windows" msgstr "Zkusit zavřít okna všech aplikací" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:396 msgid "Run" msgstr "Spustit" #: ../kupfer/obj/objects.py:406 msgid "Perform command" msgstr "Provést příkaz" #: ../kupfer/obj/objects.py:419 msgid "(Empty Text)" msgstr "(Prázdný text)" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:449 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "„%(text)s“" msgstr[1] "(%(num)d řádky) „%(text)s“" msgstr[2] "(%(num)d řádků) „%(text)s“" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s a další" #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Rekurzivní zdroj ze složky %(dir)s, (%(levels)d úrovní)" #: ../kupfer/obj/sources.py:108 #, python-format msgid "Directory source %s" msgstr "Zdroj složka %s" #: ../kupfer/obj/sources.py:118 msgid "Home Folder" msgstr "Domovská složka" #: ../kupfer/obj/sources.py:129 msgid "Catalog Index" msgstr "Katalogový rejstřík" #: ../kupfer/obj/sources.py:144 msgid "An index of all available sources" msgstr "Rejstřík ze všech dostupných zdrojů" #: ../kupfer/obj/sources.py:176 msgid "Root catalog" msgstr "Kořenový katalog" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Nastavte prosím zásuvný modul" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "Zásuvný modul %s není nastavený" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "Neplatné přístupové údaje uživatele pro %s" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Aplikace" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Všechny aplikace a předvolby" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Aplikace pro pracovní prostředí" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Otevřít s…" #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Otevřít pomocí nějaké aplikace" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Nastavit výchozí aplikaci na otevírání tohoto typu souboru" #: ../kupfer/plugin/archivemanager.py:1 msgid "Archive Manager" msgstr "Správa archivu" #: ../kupfer/plugin/archivemanager.py:9 msgid "Use Archive Manager actions" msgstr "Použít akce správce archivu" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Typ komprimovaného archivu pro „Vytvořit archiv v“" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Rozbalit zde" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Rozbalit komprimovaný archiv" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Vytvořit archiv" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Vytvořit komprimovaný archiv ze složky" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Vytvořit archiv v…" #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Archiv" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Kalkulačka" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Vypočítat výraz začínajících „=“" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Vypočítat" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:112 msgid "Clipboards" msgstr "Schránky" #: ../kupfer/plugin/clipboard.py:4 msgid "Recent clipboards and clipboard proxy objects" msgstr "Nedávné objekty schránek a proxy schránky" #: ../kupfer/plugin/clipboard.py:24 msgid "Number of recent clipboards to remember" msgstr "Počet nedávných schránek k zapamatování" #: ../kupfer/plugin/clipboard.py:30 msgid "Include selected text in clipboard history" msgstr "Zahrnout vybraný text do historie schránky" #: ../kupfer/plugin/clipboard.py:36 msgid "Copy selected text to primary clipboard" msgstr "Kopírovat vybraný text do hlavní schránky" #: ../kupfer/plugin/clipboard.py:47 msgid "Selected Text" msgstr "Vybraný text" #: ../kupfer/plugin/clipboard.py:57 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Schránka „%(desc)s“" msgstr[1] "Schránka s %(num)d řádky „%(desc)s“" msgstr[2] "Schránka s %(num)d řádky „%(desc)s“" #: ../kupfer/plugin/clipboard.py:64 msgid "Clipboard Text" msgstr "Text schránky" #: ../kupfer/plugin/clipboard.py:74 msgid "Clipboard File" msgstr "Soubor schránky" #: ../kupfer/plugin/clipboard.py:84 msgid "Clipboard Files" msgstr "Soubory schránky" #: ../kupfer/plugin/clipboard.py:92 msgid "Clear" msgstr "Vyčistit" #: ../kupfer/plugin/clipboard.py:104 msgid "Remove all recent clipboards" msgstr "Odstranit všechny nedávné položky ze schránky" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Příkazy shellu" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" "Spustit programy příkazové řádky. Akce označené symbolem %s poběží v " "podřízeném shellu." #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Spustit (získat výstup)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Spustit program a vrátit jeho výstup" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 msgid "Pass to Command..." msgstr "Předat do příkazu…" #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "Spustit program s objektem, jako doplňujícím parametrem" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 msgid "Write to Command..." msgstr "Zapsat do příkazu…" #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 msgid "Run program and supply text on the standard input" msgstr "Spustit program a poskytnout text na standardní vstup" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "Filtrovat přes příkaz…" #: ../kupfer/plugin/commands.py:215 msgid "Run command-line programs" msgstr "Spustit programy příkazové řádky" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "GTK+" #: ../kupfer/plugin/core/alternatives.py:13 msgid "GNOME Terminal" msgstr "Terminál GNOME" #: ../kupfer/plugin/core/alternatives.py:22 msgid "XFCE Terminal" msgstr "Terminál XFCE" #: ../kupfer/plugin/core/alternatives.py:31 msgid "LXTerminal" msgstr "LXTerminal" #: ../kupfer/plugin/core/alternatives.py:40 msgid "X Terminal" msgstr "Terminál X" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "Urxvt" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Uložit jako…" #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Ukončit" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Ukončit aplikaci Kupfer" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "O aplikaci Kupfer" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Zobrazit informace o autorech aplikace Kupfer a licenci" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Nápověda aplikace Kupfer" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Získat nápovědu k aplikaci Kupfer" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Zobrazit okno s předvolbami pro Kupfer" #: ../kupfer/plugin/core/__init__.py:64 msgid "Search Contents" msgstr "Prohledat obsah" #: ../kupfer/plugin/core/__init__.py:82 msgid "Search inside this catalog" msgstr "Hledat v tomto katalogu" #: ../kupfer/plugin/core/__init__.py:90 msgid "Copy" msgstr "Kopírovat" #: ../kupfer/plugin/core/__init__.py:105 msgid "Copy to clipboard" msgstr "Kopírovat do schránky" #: ../kupfer/plugin/core/__init__.py:127 msgid "Rescan" msgstr "Přeindexovat" #: ../kupfer/plugin/core/__init__.py:142 msgid "Force reindex of this source" msgstr "Vynutit přeindexování tohoto zdroje" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Poslední příkaz" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Interní objekty Kupfer" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Poslední výsledek" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Výsledky příkazu" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Slovník" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Vyhledat slovíčko ve slovníku" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Vyhledat" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Dokumenty" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "Nedávno použité dokumenty a označené složky" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "Max. stáří nedávných dokumentů ve dnech" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Nedávné položky" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Nedávno použité dokumenty" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "Dokumenty %s" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Nedávno použité dokumenty pro %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Místa" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Označené složky" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Záložky v Epiphany" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Seznam záložek v prohlížeči Epiphany" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Oblíbené" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "Označit běžně používané položky a uchovat objekty pro pozdější použití" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "Seznam „oblíbených“ položek" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Přidat do oblíbených" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Přidat položku do seznamu oblíbených" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Odebrat z oblíbených" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Odebrat položku ze seznamu oblíbených" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Akce se soubory" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Více akcí se soubory" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:211 msgid "Move To..." msgstr "Přesunout do…" #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:253 msgid "Move file to new location" msgstr "Přesunout tento soubor na nové místo" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Přejmenovat na…" #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:166 msgid "Copy To..." msgstr "Kopírovat do…" #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:207 msgid "Copy file to a chosen location" msgstr "Kopírovat soubor na vybrané místo" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Záložky ve Firefoxu" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Seznam záložek v prohlížeči Firefox" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "Zahrnout navštívené stránky" #. TRANS: Multihead refers to support for multiple computer displays #. TRANS: In this case, it only concerns the special configuration #. TRANS: with multiple X "screens" #: ../kupfer/plugin/multihead.py:4 msgid "Multihead Support" msgstr "Podpora více monitorů" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Vybraný soubor" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" "Poskytuje současný výběr ze správce souborů Nautilus pomocí rozšíření " "Nautilus aplikace Kupfer" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Vybraný soubor „%s“" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Vybrané soubory" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Poznámky" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Poznámky v aplikacích Gnote nebo Tomboy" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Pracovat s aplikací" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Otevřít s aplikací pro práci s poznámkami" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Připojit k poznámce…" #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Přidat text do stávající poznámky" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Vytvořit poznámku" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Vytvořit novou poznámku z tohoto textu" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Získat výsledky hledávání poznámek…" #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "Zobrazit výsledky hledání pro tento dotaz" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "dnes, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "včera, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Naposledy aktualizováno %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "Přehrávání a přidávání skladeb do fronty a procházení hudební knihovny" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Zahrnout umělce do nejvyšší úrovně" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Zahrnout alba do nejvyšší úrovně" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Zahrnout skladby do nejvyšší úrovně" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Přehrát" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Pokračovat v přehrávání v přehrávači Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Pozastavit" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Pozastavit přehrávání v přehrávači Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Následující" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Přeskočit na následující stopu v přehrávači Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Předchozí" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Přeskočit na předchozí stopu v přehrávači Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Zobrazit co se přehrává" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Sdělit, která skladba se právě přehrává" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Vymazat frontu" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Přehrát skladby v přehrávači Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Zařadit do fronty" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Přidat skladbu do fronty přehrávaných skladeb" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "od interpreta %(artist)s z alba %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "od interpreta %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Skladby od interpreta %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Alba" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Hudební album v knihovně Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Umělci" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Hudební umělec v knihovně Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Skladby" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Skladba v knihovně Rhythmbox" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "Správa sezení GNOME" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "Speciální položky a akce pro pracovní prostředí GNOME" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Odhlásit se…" #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Odhlásit nebo změnit uživatele" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Vypnout…" #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Vypnout, restartovat nebo uspat počítač" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Zamknout obrazovku" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Povolit šetřič obrazovky a zamykání" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "Správa sezení XFCE" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Speciální položky a akce pro pracovní prostředí XFCE" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Zobrazit text" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:58 msgid "Display text in a window" msgstr "Zobrazit text v okně" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Rozsáhlý typ" #: ../kupfer/plugin/show_text.py:66 msgid "Show Notification" msgstr "Zobrazovat oznámení" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Koš" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Přístup k obsahu koše" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Přesunout do koše" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Přesunout tento soubor do koše" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Obnovit" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Přesunout soubor zpět na původní místo" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "Koš je prázdný" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "Koš obsahuje jeden soubor" msgstr[1] "Koš obsahuje %(num)s soubory" msgstr[2] "Koš obsahuje %(num)s souborů" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Spouštěče" #: ../kupfer/plugin/triggers.py:6 msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Přiřadit globální klávesové zkratky (spouštěče) objektům vytvořeným pomocí " "„Napsat příkaz“" #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Přidat spouštěč…" #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Odstranit spouštěč" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "Akce s URL" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Stáhnout a otevřít" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Stáhnout do…" #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "Stáhnout URL do vybraného místa" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Svazky a disky" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Připojené svazky a disky" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Svazek připojen v %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Odpojit" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Odpojit tento svazek" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Vysunout" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Odpojit a vysunout toto médium" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Prohledat web" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Prohledat web pomocí vyhledávacího stroje OpenSearch" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Prohledat pomocí…" #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Vyhledat…" #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Vyhledávací stroje" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedie" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Hledat na Wikipedii" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Jazyk Wikipedie" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "cs" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Vyhledat tento výraz na %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Seznam oken" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Všechna okna na všech pracovních plochách" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Aktivovat" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Zakrýt" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Odkrýt" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Minimalizovat" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Zrušit minimalizaci" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Maximalizovat" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Zrušit maximalizaci" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Maximalizovat svisle" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Zrušit svislou maximalizaci" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Okno na ploše %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Okno zcela nahoře" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Následující okno" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Přejít na pracovní plochu s tímto oknem a zaměřit jej" #: ../kupfer/plugin/windows.py:252 #, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "%d okno" msgstr[1] "%d okna" msgstr[2] "%d oken" #: ../kupfer/plugin/windows.py:256 msgid "Active workspace" msgstr "Aktivní pracovní plocha" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Přejít na tuto pracovní plochu" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Pracovní plochy" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Nedávno použité dokumenty v aplikaci Abiword" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Nedávné položky Abiword" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Rozhraní ke správci balíčků APT" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Instalační metoda" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Zobrazit informace o balíčku" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Nainstalovat" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Nainstalovat balíček pomocí nastavené metody" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Odpovídající balíčky „%s“" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Vyhledat balíček podle názvu…" #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "Do hloubky archivů" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Umožňuje procházení uvnitř komprimovaných archivních souborů" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "Obsah archivu %s" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "Sada ikon ASCII a Unikód" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" "Poskytuje sadu ikon ASCII a Unikód, které používají písmena a symboly k " "vytvoření ikon pro objekty nalezené v aplikaci Kupfer." #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "ASCII" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "Unikód" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Ovládat přehrávání a seznamy skladeb přehrávače Audacious" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Přidat skladbu do fronty přehrávaných skladeb v přehrávači Audacious" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Vyjmout z fronty" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Odstranit skladbu z fronty přehrávaných skladeb v přehrávači Audacious" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Přeskočit na stopu v přehrávači Audacious" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Pokračovat v přehrávání v přehrávači Audacious" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Pozastavit přehrávání v přehrávači Audacious" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Přeskočit na následující stopu v přehrávači Audacious" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Přeskočit na předchozí stopu v přehrávači Audacious" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Vymazat frontu přehrávaných skladeb v přehrávači Audacious" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Náhodně" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Zapnout/vypnout náhodné pořadí v přehrávači Audacious" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Opakovat" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Zapnout/vypnout opakování v přehrávači Audacious" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Seznam skladeb" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Záložky v prohlížeči Chromium" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Seznam záložek v prohlížeči Chromium" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Kontakty a akce v Claws Mail" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Napsat nový e-mail" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Napsat nový e-mail v poštovním klientovi Claws Mail" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Přijmout všechny e-maily" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "" "Přijmout pomocí poštovního klienta Claws Mail nové zprávy ze všech účtů" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "Napsat e-mail" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "Odeslat e-mailem…" #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Napsat novou zprávu v poštovním klientovi Claws Mail a přiložit soubor" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Adresář z Claws Mail" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Kontakty z adresáře poštovního klienta Claws Mail" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 msgid "Custom Terminal" msgstr "Vlastní terminál" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "Nastavit vlastní emulátor terminálu" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "Příznaky spuštění" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "Vlastní motiv" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "Použít motiv s vlastními barvami" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "Motiv:" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Výchozí poštovní klient" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "Napsat e-mail ve výchozím programu systému pro zpracován mailto:" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Hledat v nápovědě pro vývojáře DevHelp" #: ../kupfer/plugin/duckduckgo.py:5 ../kupfer/plugin/duckduckgo.py:19 msgid "DuckDuckGo Search" msgstr "Vyhledávač DuckDuckGo" #: ../kupfer/plugin/duckduckgo.py:8 ../kupfer/plugin/duckduckgo.py:30 msgid "Search the web securely with DuckDuckGo" msgstr "Prohledat web bezpečně pomocí DuckDuckGo" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "Empathy" #: ../kupfer/plugin/empathy.py:6 msgid "Access to Empathy Contacts" msgstr "Přístup ke kontaktům v komunikátoru Empathy" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Zobrazovat odpojené kontakty" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Dostupný" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Pryč" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Nerušit" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Nedostupný" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Neviditelný" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Odpojený" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:93 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:197 msgid "Open Chat" msgstr "Otevřít diskuzi" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:121 #: ../kupfer/plugin/skype.py:243 msgid "Change Global Status To..." msgstr "Změnit globální stav na…" #: ../kupfer/plugin/empathy.py:171 msgid "Empathy Contacts" msgstr "Kontakty v komunikátoru Empathy" #: ../kupfer/plugin/empathy.py:237 msgid "Empathy Account Status" msgstr "Stav účtu Empathy" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Kontakty aplikace Evolution" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Napsat nový e-mail v poštovním klientovi Evolution" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Napsat novou zprávu v poštovním klientovi Evolution a přiložit soubor" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Adresář aplikace Evolution" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Zobrazit servery a pracovat s FTP pomocí aplikace Filezilla" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Připojit se k serveru pomocí aplikace Filezilla" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Servery Filezilla" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Servery z aplikace Filezilla" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Přístup ke kontaktům v komunikátoru Gajim" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Ukecaný" #: ../kupfer/plugin/gajim.py:149 msgid "Gajim Contacts" msgstr "Kontakty v komunikátoru Gajim" #: ../kupfer/plugin/gajim.py:213 msgid "Gajim Account Status" msgstr "Stav účtu Gajim" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "Glob" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:234 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "Načítání kontaktů a psaní nových e-mailů v Gmail" #: ../kupfer/plugin/gmail/__init__.py:33 msgid "Load contacts' pictures" msgstr "Načítat obrázky kontaktů" #: ../kupfer/plugin/gmail/__init__.py:39 msgid "Load additional information" msgstr "Načíst doplňující informace" #: ../kupfer/plugin/gmail/__init__.py:50 msgid "Work email" msgstr "E-mail do práce" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Home email" msgstr "E-mail domů" #: ../kupfer/plugin/gmail/__init__.py:52 msgid "Other email" msgstr "Jiný e-mail" #: ../kupfer/plugin/gmail/__init__.py:54 msgid "Work address" msgstr "Adresa do práce" #: ../kupfer/plugin/gmail/__init__.py:55 msgid "Home address" msgstr "Adresa domů" #: ../kupfer/plugin/gmail/__init__.py:56 msgid "Other address" msgstr "Jiná adresa" #: ../kupfer/plugin/gmail/__init__.py:58 msgid "Car phone" msgstr "Telefon do auta" #: ../kupfer/plugin/gmail/__init__.py:59 msgid "Fax" msgstr "Fax" #: ../kupfer/plugin/gmail/__init__.py:61 msgid "Home phone" msgstr "Telefon domů" #: ../kupfer/plugin/gmail/__init__.py:62 msgid "Home fax" msgstr "Fax domů" #: ../kupfer/plugin/gmail/__init__.py:63 msgid "Internal phone" msgstr "Interní telefon" #: ../kupfer/plugin/gmail/__init__.py:64 msgid "Mobile" msgstr "Mobilní telefon" #: ../kupfer/plugin/gmail/__init__.py:65 msgid "Other" msgstr "Jiný" #: ../kupfer/plugin/gmail/__init__.py:66 msgid "VOIP" msgstr "VOIP" #: ../kupfer/plugin/gmail/__init__.py:67 msgid "Work phone" msgstr "Telefon do práce" #: ../kupfer/plugin/gmail/__init__.py:68 msgid "Work fax" msgstr "Fax do práce" #: ../kupfer/plugin/gmail/__init__.py:93 msgid "Compose Email in Gmail" msgstr "Napsat e-mail v pošťáku Gmail" #: ../kupfer/plugin/gmail/__init__.py:117 msgid "Open web browser and compose new email in Gmail" msgstr "Otevřít webový prohlížeč a napsat nový e-mail v pošťáku Gmail" #: ../kupfer/plugin/gmail/__init__.py:123 msgid "Edit Contact in Gmail" msgstr "Upravit kontakt na službě Gmail" #: ../kupfer/plugin/gmail/__init__.py:133 msgid "Open web browser and edit contact in Gmail" msgstr "Otevřít webový prohlížeč a upravit kontakt na službě Gmail" #: ../kupfer/plugin/gmail/__init__.py:263 msgid "Contacts from Google services (Gmail)" msgstr "Kontakty ze služeb Google (Gmail)" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "Profily terminálu GNOME" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "Profily pro spouštění terminálu GNOME" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Zobrazit alba a odesílat soubory do služby Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "Zobrazit uživatele: (oddělujte ,)" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Načítat ikony uživatelů a alb" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Odesílají se obrázky" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Odeslat obrázky do webového alba Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Vytvoření alba:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Album vytvořené aplikací Kupfer" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Soubor:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "Jedno album" msgstr[1] "%(num)d alba" msgstr[2] "%(num)d alb" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "jedna fotka" msgstr[1] "%(num)s fotky" msgstr[2] "%(num)s fotek" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Odeslat do alba Picasa…" #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Odeslat soubory do alba Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Odeslat jako nové album Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Vytvořit album z vybrané místní složky" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Alba Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Uživatelská alba ve službě Picasa" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Vyhledávač Google" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Vyhledávání pomocí Google s přímým zobrazením výsledků" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #, python-format msgid "Results for \"%s\"" msgstr "Výsledky pro „%s“" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Zobrazit více výsledků pro „%s“" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "Celkem nalezeno %s" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "Procházení a vytváření nových úkolů v GTG" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "termín: %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "začít: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "značky: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Otevřít úkol v Getting Things GNOME!" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Smazat" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Trvale odstranit tento úkol" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Označit „Dokončeno“" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Označit tento úkol jako dokončený" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Zahodit" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Označit úkol, že již nebude dokončen" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Vytvořit úkol" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Vytvořit nový úkol v aplikaci Getting Things GNOME" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "Gwibber" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" "Mikroblogování se službou Gwibber. Umožňuje odesílat a přijímat zprávy ze " "sociálních sítí jako je Twitter, Identi.ca atd. Vyžaduje balíček „gwibber-" "service“." #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "Maximální počet zobrazovaných zpráv" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s na %(service)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s na %(where)s" #: ../kupfer/plugin/gwibber.py:187 msgid "Send Message" msgstr "Odeslat zprávu" #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "Odeslat zprávu na všechny účty Gwibber" #: ../kupfer/plugin/gwibber.py:210 msgid "Send Message To..." msgstr "Odeslat zprávu na…" #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "Odeslat zprávu na účet Gwibber" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Odeslat zprávu…" #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "Odeslat zprávu na vybraný účet Gwibber" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Odpovědět…" #: ../kupfer/plugin/gwibber.py:314 msgid "Delete Message" msgstr "Smazat zprávu" #: ../kupfer/plugin/gwibber.py:337 msgid "Send Private Message..." msgstr "Odeslat soukromou zprávu…" #: ../kupfer/plugin/gwibber.py:370 msgid "Send direct message to user" msgstr "Odeslat přímou zprávu uživateli" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "Znovu napsat" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet To..." msgstr "Znovu napsat na…" #: ../kupfer/plugin/gwibber.py:407 msgid "Retweet message to all Gwibber accounts" msgstr "Znovu napsat zprávu na všechny účty Gwibber" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "Znovu napsat zprávu na účet Gwibber" #: ../kupfer/plugin/gwibber.py:413 msgid "Open in Browser" msgstr "Otevřít v prohlížeči" #: ../kupfer/plugin/gwibber.py:419 msgid "Open message in default web browser" msgstr "Otevřít zprávu ve výchozím prohlížeči" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 msgid "Gwibber Accounts" msgstr "Účty Gwibber" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "Účty nastavené ve službě Gwibber" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "Zprávy Gwibber" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "Poslední zprávy přijaté na Gwibber" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "Zprávy Gwibber pro službu %s" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "Proudy Gwibber" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "Proudy nastavené ve službě Gwibber" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "Zprávy Gwibber v proudu %s" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "Gwibber (jednoduchý)" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "Poslat aktualizaci přes mikroblogovacího klienta Gwibber" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "Poslat aktualizaci" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "Nelze aktivovat službu Gwibber" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Akce nejvyšší úrovně" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Nástroj umožňující práci s příkazy jako s objekty" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Vybrat v aplikaci Kupfer" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Výsledky pro %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Spustit (převzít výsledky)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Převzít výsledek příkazu jako objekt proxy" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Spustit (zahodit výsledky)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Nástroje na obrázky" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Nástroje pro transformaci obrázků" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Změnit velikost…" #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "" "Změnit velikost obrázku, aby odpovídal vnitřně daným rozměrům v pixelech" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Otočit ve směru hodinových ručiček" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Otočit proti směru hodinových ručiček" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Automaticky otočit" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Otočit JPEG v souladu s jeho metadaty EXIF" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Zásuvné moduly Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Přístup k seznamu zásuvných modulů Kupfer v aplikaci Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Zobrazit informace" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Zobrazit zdrojový kód" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "zapnutý" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Najít soubory" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Prohledat souborový systém pomocí programu „locate“" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Při vyhledávání souborů nebrat ohled na velikost písmen" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "OpenOffice / LibreOffice" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Dokumenty nedávno použité v OpenOffice/LibreOffice" #: ../kupfer/plugin/openoffice.py:83 msgid "OpenOffice/LibreOffice Recent Items" msgstr "Nedávné položky OpenOffice/LibreOffice" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera Mail" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Kontakty a akce poštovního klienta Opera Mail" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Napsat nový e-mail v poštovním klientovi Opera Mail" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Kontakty v Opera Mail" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Kontakty z adresáře poštovního klienta Opera Mail" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Záložky v Opeře" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Seznam záložek v prohlížeči Opera" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Přístup ke kontaktům v komunikátoru Pidgin" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d znak)" msgstr[1] "%s (%d znaky)" msgstr[2] "%s (%d znaků)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Kontakty Pidgin" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "Sezení PuTTY" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Rychlý přístup k sezením PuTTY" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Spustit sezení" #: ../kupfer/plugin/qsicons/__init__.py:24 msgid "Quicksilver Icons" msgstr "Ikony Quicksilver" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "Rychlé prohlížení obrázků" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "Zobrazit obrázek" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "reStructuredText" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "Vykreslit reStructuredText a zobrazit výsledek" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Zobrazit jako dokument HTML" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "Aktivovat sezení GNU Screen" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Připojené" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Odpojené" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s sezení (%(pid)s) vytvořené %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Sezení obrazovky" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Připojit" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:52 msgid "Send Keys" msgstr "Poslat klávesy" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "Poslat pomocí xautomation uměle vyvolané události klávesnice" #: ../kupfer/plugin/sendkeys.py:28 msgid "Paste to Foreground Window" msgstr "Vložit do okna na popředí" #: ../kupfer/plugin/sendkeys.py:46 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "Kopírovat do schránky a poslat Ctrl+V do okna na popředí" #: ../kupfer/plugin/sendkeys.py:101 msgid "Send keys to foreground window" msgstr "Poslat klávesy do okna na popředí" #: ../kupfer/plugin/sendkeys.py:106 msgid "Type Text" msgstr "Psát text" #: ../kupfer/plugin/sendkeys.py:127 msgid "Type the text to foreground window" msgstr "Psát text do okna na popředí" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Systémové služby" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "" "Spustit, zastavit nebo restartovat systémové služby přes inicializační " "skripty" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Příkaz typu sudo" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Spustit službu" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Restartovat službu" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Zastavit službu" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "Služba %s" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Zkrácené odkazy" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Vytvořit zkrácené přezdívky pro dlouhé URL" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Chyba" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Zkrátit pomocí…" #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Služby" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 msgid "Show QRCode" msgstr "Zobrazit kód QR" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 msgid "Display text as QRCode in a window" msgstr "Zobrazit text jako kód QR v okně" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Přístup ke kontaktům komunikátoru Skype" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Zavolat mi" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Odhlášeno" #: ../kupfer/plugin/skype.py:179 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:218 msgid "Call" msgstr "Volat" #: ../kupfer/plugin/skype.py:232 msgid "Place a call to contact" msgstr "Umístit volání do kontaktu" #: ../kupfer/plugin/skype.py:267 msgid "Skype Contacts" msgstr "Kontakty v komunikátoru Skype" #: ../kupfer/plugin/skype.py:287 msgid "Skype Statuses" msgstr "Stav komunikátoru Skype" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "Hostitelé SSH" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "Přidává hostitele SSH nalezené v ~/.ssh/config." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "Hostitel SSH" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Připojit" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "Připojit k hostiteli SSH" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "Hostitelé SSH jak jsou zadáni v ~/.ssh/config" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "" "Neexistuje žádné napojení sběrnice D-Bus na sezení pracovního prostředí" #: ../kupfer/plugin_support.py:171 msgid "GNOME Keyring" msgstr "Klíčenka GNOME" #: ../kupfer/plugin_support.py:172 msgid "KWallet" msgstr "KWallet" #: ../kupfer/plugin_support.py:173 msgid "Unencrypted File" msgstr "Rozšifrovat soubor" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Šablony dokumentů" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Vytvořit nový dokumentu ze své šablony" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "Šablona %s" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Prázdný soubor" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Nová složka" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Vytvořit nový dokument…" #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Vytvořit nový dokument ze šablony" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Vytvořit dokument v…" #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "Textové soubory" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Připojit k…" #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Připojit…" #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Zapsat do…" #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Získat textový obsah" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:185 #: ../kupfer/plugin/thunar.py:225 ../kupfer/plugin/thunar.py:278 #: ../kupfer/plugin/thunar.py:329 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:11 msgid "File manager Thunar actions" msgstr "Akce správce souborů Thunar" #: ../kupfer/plugin/thunar.py:67 msgid "Select in File Manager" msgstr "Vybrat ve správci souborů" #: ../kupfer/plugin/thunar.py:95 msgid "Show Properties" msgstr "Zobrazit vlastnosti" #: ../kupfer/plugin/thunar.py:118 msgid "Show information about file in file manager" msgstr "Zobrazit informace o souborech ve správci souborů" #: ../kupfer/plugin/thunar.py:127 msgid "Send To..." msgstr "Odeslat do…" #: ../kupfer/plugin/thunar.py:259 msgid "Symlink In..." msgstr "Symbolický odkaz v…" #: ../kupfer/plugin/thunar.py:300 msgid "Create a symlink to file in a chosen location" msgstr "Vytvořit symbolický odkaz na soubor ve zvoleném umístění" #: ../kupfer/plugin/thunar.py:304 msgid "Empty Trash" msgstr "Vyprázdnit koš" #: ../kupfer/plugin/thunar.py:344 msgid "Thunar Send To Objects" msgstr "Objekty „Odeslat do“ aplikace Thunar" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Kontakty a akce v Thunderbird/Icedove" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Napsat novou zprávu v aplikaci Thunderbird" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Adresář aplikace Thunderbird" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Kontakty z adresáře poštovního klienta Thunderbird" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Top" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Zobrazuje běžící úlohy a umožňuje jim zaslat signál" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Řazení" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Příkazový řádek" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "Využití procesoru (sestupně)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Využití paměti (sestupně)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Zaslat signál…" #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Signály" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Běžící úlohy" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s cpu: %(cpu)g%% paměť: %(mem)g%% čas: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Úlohy běžící pro současného uživatele" #: ../kupfer/plugin/tracker1.py:10 msgid "Tracker" msgstr "Tracker" #: ../kupfer/plugin/tracker1.py:18 ../kupfer/plugin/tracker.py:15 msgid "Tracker desktop search integration" msgstr "Vyhledávač Tracker integrovaný v pracovním prostředí" #: ../kupfer/plugin/tracker1.py:49 ../kupfer/plugin/tracker.py:41 msgid "Search in Tracker" msgstr "Vyhledat prohledávačem Tracker" #: ../kupfer/plugin/tracker1.py:54 ../kupfer/plugin/tracker.py:46 msgid "Open Tracker Search Tool and search for this term" msgstr "Otevřít vyhledávací nástroj Tracker a vyhledat tento výraz" #: ../kupfer/plugin/tracker1.py:62 ../kupfer/plugin/tracker.py:55 msgid "Get Tracker Results..." msgstr "Získat výsledky prohledávače Tracker…" #: ../kupfer/plugin/tracker1.py:71 ../kupfer/plugin/tracker.py:64 msgid "Show Tracker results for query" msgstr "Zobrazit výsledky dotazu z prohledávače Tracker" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Značky prohledávače Tracker" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Značky prohledávače Tracker" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Procházet značky prohledávače Tracker" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "Značka %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Objekt má značku %s od prohledávače Tracker" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Přidat značku…" #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Přidat souboru značku prohledávače Tracker" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Odstranit značku…" #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Odstranit souboru značku prohledávače Tracker" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Svazky z historie TrueCrypt" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "Svazek TrueCrypt: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Připojit svazek" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Připojit v Truecrypt" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Zkusit připojit soubor jako svazek Truecrypt" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Odpojit všechny svazky" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "Svazky TrueCrypt" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Terminal Server Client" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Sezení uložené v Terminal Server Client" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "Sezení TSClient" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Uložená sezení v Terminal Server Client" #: ../kupfer/plugin/vim/__init__.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim/__init__.py:4 msgid "Recently used documents in Vim" msgstr "Nedávno použité dokumenty v aplikaci Vim" #: ../kupfer/plugin/vim/plugin.py:56 msgid "Vim Recent Documents" msgstr "Nedávné dokumenty Vim" #: ../kupfer/plugin/vim/plugin.py:219 msgid "Close (Save All)" msgstr "Zavřít (Uložit vše)" #: ../kupfer/plugin/vim/plugin.py:237 msgid "Send..." msgstr "Odeslat…" #: ../kupfer/plugin/vim/plugin.py:264 msgid "Send ex command" msgstr "Odeslat příkaz ex" #: ../kupfer/plugin/vim/plugin.py:272 msgid "Insert in Vim..." msgstr "Vložit ve Vim…" #: ../kupfer/plugin/vim/plugin.py:309 msgid "Active Vim Sessions" msgstr "Aktivovat sezení Vim" #: ../kupfer/plugin/vim/plugin.py:338 #, python-format msgid "Vim Session %s" msgstr "Sezení Vim %s" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Záložky a akce klienta Vinagre" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Spustit sezení Vinagre" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Záložky ve Vinagre" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "Ovládání virtuálních strojů ve VirtualBoxu. Podporuje jak Sun VirtualBox, " "tak Open Source Editon." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "Vynutit použití řádkového rozhraní" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Zapnout" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Zapnout bez grafiky" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Zaslat signál pro vypnutí" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Restartovat" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Obnovit" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Uložit stav" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Vypnout" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "Virtuální stroje ve VirtualBoxu" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:11 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "Přístup do stránek uchovaných v Zim - Místní Wiki a zápisník" #: ../kupfer/plugin/zim.py:30 msgid "Page names start with :colon" msgstr "Názvy stránek začínat :dvojtečkou" #: ../kupfer/plugin/zim.py:36 msgid "Default page name for quick notes" msgstr "Název výchozí stránky pro rychlé poznámky" #: ../kupfer/plugin/zim.py:38 #, python-format msgid "Note %x %X" msgstr "Poznámka %x %X" #: ../kupfer/plugin/zim.py:39 msgid "" "Strftime tags can be used: %H - hour, %M - minutes, etc\n" "Please check python documentation for details.\n" "NOTE: comma will be replaced by _" msgstr "" "Můžete využívat značek Strftime: %H – hodina, %M – minuty, atd.\n" "Podrobnosti najdete v dokumentaci k jazyku Python.\n" "POZNÁMKA: čárka bude nahrazena _" #: ../kupfer/plugin/zim.py:45 msgid "Default namespace for quick notes" msgstr "Výchozí jmenný prostor pro rychlé poznámky" #: ../kupfer/plugin/zim.py:80 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Stránka Zim ze zápisníku „%s“" #: ../kupfer/plugin/zim.py:89 msgid "Create Zim Page" msgstr "Vytvořit stránku Zim" #: ../kupfer/plugin/zim.py:96 msgid "Create page in default notebook" msgstr "Vytvořit stránku ve výchozím zápisníku" #: ../kupfer/plugin/zim.py:108 msgid "Create Zim Page In..." msgstr "Vytvořit stránku Zim v…" #: ../kupfer/plugin/zim.py:132 msgid "Insert QuickNote into Zim" msgstr "Vložit rychlou poznámku do Zim" #: ../kupfer/plugin/zim.py:142 msgid "Quick note selected text into Zim notebook" msgstr "Z vybraného textu rychlou poznámku v zápisníku Zim" #: ../kupfer/plugin/zim.py:191 msgid "Create Subpage..." msgstr "Vytvořit podstránku…" #: ../kupfer/plugin/zim.py:370 msgid "Zim Notebooks" msgstr "Zápisníky Zim" #: ../kupfer/plugin/zim.py:387 msgid "Zim Pages" msgstr "Stránky Zim" #: ../kupfer/plugin/zim.py:415 msgid "Pages stored in Zim Notebooks" msgstr "Stránky uchované v zápisnících Zim"kupfer-v208/po/da.po000066400000000000000000002442501176220042200144140ustar00rootroot00000000000000# Danish translation for kupfer. # Copyright (C) 2010 kupfer's COPYRIGHT HOLDER # This file is distributed under the same license as the kupfer package. # joehansen , 2010. # # compose -> skriv (opret, komponer) # email -> e-post (kunne nok også være brev, e-brev nogle af stederne) # suspend -> hvile # volume -> diskenhed (eller drev?) # msgid "" msgstr "" "Project-Id-Version: kupfer master\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2011-04-14 21:40+0200\n" "PO-Revision-Date: 2010-09-28 17:30+01:00\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "Programopstarter" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "Nemt kommando- og adgangsværktøj til programmer og dokumenter" #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Kør i Kupfer" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Gemt Kupferkommando" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "Tastaturgenveje til browser" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "Globale tastaturgenveje" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Start" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:150 msgid "Catalog" msgstr "Katalog" #: ../data/preferences.ui.h:5 #, fuzzy msgid "Desktop Environment" msgstr "Programmer til skrivebordsmiljø" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "" #: ../data/preferences.ui.h:7 msgid "General" msgstr "Generelt" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "" #: ../data/preferences.ui.h:9 #, fuzzy msgid "Inclusion in Top Level Searches" msgstr "Inkluder sange i overniveau" #: ../data/preferences.ui.h:10 #, fuzzy msgid "Indexed Folders" msgstr "Ny mappe" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "Tastatur" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Kupferindstillinger" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "Udvidelsesmodul" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:844 msgid "Reset" msgstr "Nulstil" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "Vis ikon i statusfelt" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "Start automatisk ved logind" #: ../data/preferences.ui.h:19 #, fuzzy msgid "Terminal emulator:" msgstr "Åbn terminal her" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "Brug enkelttastkommandoer (mellemrum, /, punktum, komma etc.)" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Brugerakkreditiver" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "_Ændr" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "_Adgangskode:" #: ../data/credentials_dialog.ui.h:4 msgid "_User:" msgstr "_Bruger:" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "Tastaturgenvej kunne ikke sættes" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Tryk venligst på ønsket tastekombination" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "Angiv tastaturgenvej" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "præsenter ikke hovedgrænseflade ved opstart" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "vis tilgængelige udvidelsesmoduler" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "aktiver fejlsøgningsinfo" #: ../kupfer/main.py:46 msgid "run keyboard shortcut relay service on this display" msgstr "" #: ../kupfer/main.py:49 msgid "show usage help" msgstr "vis hjælp" #: ../kupfer/main.py:50 msgid "show version information" msgstr "vis versionsinformation" #: ../kupfer/main.py:56 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Brug: kupfer [ TILVALG | FIL ... ]" #: ../kupfer/main.py:67 msgid "Available plugins:" msgstr "Tilgængelige udvidelsesmoduler:" # skal den oversættes? #: ../kupfer/main.py:114 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "Alternativ aktivering" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Kommatricket" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Kompositionskommando" #: ../kupfer/ui/accelerators.py:11 #, fuzzy msgid "Mark Default Action" msgstr "Angiv standardprogram..." #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Nulstil alle" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Vælg afslut" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Vælg valgt fil" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Vælg valgt tekst" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Vis hjælp" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Vis indstillinger" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "Skift til første panel" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Skift teksttilstand" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s er tom" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "Ingen resultater i %(src)s for \"%(query)s\"" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Ingen resultater" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Skriv for at søge" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Skriv for at søge %s" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Ingen handling" #: ../kupfer/ui/browser.py:1461 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1471 #, python-format msgid "Forget About \"%s\"" msgstr "" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1903 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Vis hovedgrænseflade" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Vis med markering" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Beskrivelse" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Forfatter" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Version" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Pythonmodul '%s' kræves" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Udvidelsesmodul kunne ikke læses på grund af en fejl:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "deaktiveret" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Indhold af" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Kilder" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Handlinger" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:589 msgid "Configuration" msgstr "Konfiguration" #: ../kupfer/ui/preferences.py:609 msgid "Set username and password" msgstr "Angiv brugernavn og adgangskode" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:663 msgid "Choose a Directory" msgstr "Vælg en mappe" #: ../kupfer/ui/preferences.py:842 msgid "Reset all shortcuts to default values?" msgstr "Nulstil alle genveje til standardværdier?" #: ../kupfer/ui/preferences.py:850 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Kommando" #: ../kupfer/ui/preferences.py:851 msgid "Shortcut" msgstr "Genvej" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "" "Joe Hansen, 2010.\n" "\n" "Dansk-gruppen \n" "Mere info: http://www.dansk-gruppen.dk" #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "En programstarter der er fri software (GPLv3+)" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Dette program er fri software. Du kan redistribuere og/eller modificere\n" "det under de betingelser som er angivet i GNU General Public License, som\n" "udgivet af Free Software Foundation. Enten version 3 af licensen eller\n" "(efter eget valg) enhver senere version.\n" "\n" "Dette program distribueres i håb om, at det vil vise sig nyttigt, men UDEN\n" "NOGEN FORM FOR GARANTI, uden selv de underforståede garantier omkring\n" "SALGBARHED eller EGNETHED TIL ET BESTEMT FORMÅL. Yderligere detaljer kan\n" "læses i GNU General Public License.\n" "\n" "Du bør have modtaget en kopi af GNU General Public License sammen med\n" "dette program. Hvis ikke, så se .\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "Kunne ikke finde kørende Kupfer" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "" # lyder lidt sort det her (også den engelske) # tror de mener at det er en kommando, de ikke kan udføre #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Kunne ikke at udføre '%s'" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "\"%s\" gav et resultat" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "Ingen tilladelse til at køre \"%s\" (ikke kørbar)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "Kommando i \"%s\" er ikke tilgængelig" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 #, fuzzy msgid "Text" msgstr "Vis tekst" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Kør efter forsinkelse..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Udfør kommando efter et specifikt tidsinterval" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Flere objekter" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s objekt" msgstr[1] "%s objekter" # oversættes? #: ../kupfer/obj/contacts.py:87 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:107 msgid "Open" msgstr "Åbn" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Intet standardprogram til %(file)s (%(type)s)" #: ../kupfer/obj/fileactions.py:45 #, fuzzy, python-format msgid "Please use \"%s\"" msgstr "Markeret fil \"%s\"" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Angiv standardprogram..." #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Åbn med standardprogram" #: ../kupfer/obj/fileactions.py:77 msgid "Reveal" msgstr "Afslør" #: ../kupfer/obj/fileactions.py:86 msgid "Open parent folder" msgstr "Åbn overmappe" #: ../kupfer/obj/fileactions.py:92 msgid "Open Terminal Here" msgstr "Åbn terminal her" #: ../kupfer/obj/fileactions.py:105 msgid "Open this location in a terminal" msgstr "Åbn denne placering i en terminal" #: ../kupfer/obj/fileactions.py:113 msgid "Run in Terminal" msgstr "Kør i terminal" #: ../kupfer/obj/fileactions.py:113 msgid "Run (Execute)" msgstr "Kør (afvikl)" #: ../kupfer/obj/fileactions.py:133 msgid "Run this program in a Terminal" msgstr "Kør dette program i en terminal" #: ../kupfer/obj/fileactions.py:135 msgid "Run this program" msgstr "Kør dette program" #: ../kupfer/obj/objects.py:248 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 msgid "Go To" msgstr "Gå til" #: ../kupfer/obj/objects.py:274 msgid "Open URL" msgstr "Åbn adresse" #: ../kupfer/obj/objects.py:285 msgid "Open URL with default viewer" msgstr "Åbn adresse med standardviser" #: ../kupfer/obj/objects.py:299 msgid "Launch" msgstr "Start" #: ../kupfer/obj/objects.py:312 msgid "Show application window" msgstr "Vis programvindue" #: ../kupfer/obj/objects.py:313 msgid "Launch application" msgstr "Start program" #: ../kupfer/obj/objects.py:324 msgid "Launch Again" msgstr "Start igen" #: ../kupfer/obj/objects.py:331 msgid "Launch another instance of this application" msgstr "Start en anden instans af dette program" #: ../kupfer/obj/objects.py:337 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Luk" #: ../kupfer/obj/objects.py:345 msgid "Attempt to close all application windows" msgstr "Forsøg at lukke alle programvinduer" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:392 msgid "Run" msgstr "Kør" #: ../kupfer/obj/objects.py:402 msgid "Perform command" msgstr "Udfør kommando" #: ../kupfer/obj/objects.py:416 #, fuzzy msgid "(Empty Text)" msgstr "Tom fil" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:432 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "\"%(text)s\"" msgstr[1] "(%(num)d linjer) \"%(text)s\"" # den forstår jeg ikke? hvad betyder et. al. # forkortelse for 'et alia', som betyder 'og andre'. Det er forkert at # have punktum efter 'et'. Den rigtige måde at skrive det på er 'et # al.' Kunne evt. være m.fl. på dansk #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, fuzzy, python-format msgid "%s et. al." msgstr "%s m.fl." #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Rekursiv kilde for %(dir)s, (%(levels)d niveauer)" #: ../kupfer/obj/sources.py:103 #, python-format msgid "Directory source %s" msgstr "Mappekilde %s" #: ../kupfer/obj/sources.py:113 msgid "Home Folder" msgstr "Hjemmemappe" #: ../kupfer/obj/sources.py:124 msgid "Catalog Index" msgstr "Katalogindeks" #: ../kupfer/obj/sources.py:139 msgid "An index of all available sources" msgstr "Et indeks af alle tilgængelige kilder" #: ../kupfer/obj/sources.py:170 msgid "Root catalog" msgstr "Rodkatalog" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Konfigurer venligst udvidelsesmodul" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "Udvidelsesmodulet %s er ikke konfigureret" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "Ugyldige brugerakkreditiver for %s" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "" #: ../kupfer/plugin/core/alternatives.py:13 #, fuzzy msgid "GNOME Terminal" msgstr "GNOME-terminalprofiler" #: ../kupfer/plugin/core/alternatives.py:22 #, fuzzy msgid "XFCE Terminal" msgstr "Kør i terminal" #: ../kupfer/plugin/core/alternatives.py:31 #, fuzzy msgid "LXTerminal" msgstr "Kør i terminal" #: ../kupfer/plugin/core/alternatives.py:40 #, fuzzy msgid "X Terminal" msgstr "Kør i terminal" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Gem som..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Afslut" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Afslut Kupfer" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "Om Kufper" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Vis information om Kupfers forfattere og licens" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Kupferhjælp" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Få hjælp til Kupfer" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Vis indstillingsvindue for Kupfer" #: ../kupfer/plugin/core/__init__.py:65 msgid "Search Contents" msgstr "Søg i indhold" #: ../kupfer/plugin/core/__init__.py:83 msgid "Search inside this catalog" msgstr "Søg i dette katalog" #: ../kupfer/plugin/core/__init__.py:91 msgid "Copy" msgstr "Kopier" #: ../kupfer/plugin/core/__init__.py:106 msgid "Copy to clipboard" msgstr "Kopier til udklipsholder" #: ../kupfer/plugin/core/__init__.py:128 msgid "Rescan" msgstr "Genskan" #: ../kupfer/plugin/core/__init__.py:143 msgid "Force reindex of this source" msgstr "Fremtving omindeksering af denne kilde" #: ../kupfer/plugin/core/selection.py:8 ../kupfer/plugin/core/selection.py:36 msgid "Selected Text" msgstr "Valgt tekst" #: ../kupfer/plugin/core/selection.py:23 #, python-format msgid "Selected Text \"%s\"" msgstr "Valgt tekst \"%s\"" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Sidste kommando" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Interne Kupferobjekter" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Sidste resultat" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Kommandoresultater" #: ../kupfer/plugin/archivemanager.py:1 #, fuzzy msgid "Archive Manager" msgstr "Arkiv" #: ../kupfer/plugin/archivemanager.py:9 #, fuzzy msgid "Use Archive Manager actions" msgstr "Handlinger for filhåndteringen Thunar" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Komprimeret arkivtype for 'Opret arkiv i'" # Hvad med 'Udpak'? Da de netop taler om pakkede filer, synes jeg dette # passer bedre (udpak, udtræk) #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Udpak her" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Udpak komprimeret arkiv" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Opret arkiv" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Opret et komprimeret arkiv fra mappe" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Opret arkiv i..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Arkiv" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Programmer" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Alle programmer og indstillinger" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Programmer til skrivebordsmiljø" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Åbn med..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Åbn med vilkårligt program" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Angiv standardprogram til at åbne denne filtype med" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Lommeregner" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Beregn udtryk der starter med '='" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Beregn" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:71 msgid "Clipboards" msgstr "Udklipsholdere" #: ../kupfer/plugin/clipboard.py:4 ../kupfer/plugin/clipboard.py:111 msgid "Recent clipboards" msgstr "Seneste udklipsholdere" #: ../kupfer/plugin/clipboard.py:20 msgid "Number of recent clipboards" msgstr "Antal seneste udklipsholdere" #: ../kupfer/plugin/clipboard.py:26 msgid "Include recent selections" msgstr "Inkluder seneste markeringer" #: ../kupfer/plugin/clipboard.py:32 msgid "Copy selection to primary clipboard" msgstr "Kopier markering til primær udklipsholder" #: ../kupfer/plugin/clipboard.py:44 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Udklipsholder \"%(desc)s\"" msgstr[1] "Udklipsholder \"%(desc)s\" med %(num)d linjer" #: ../kupfer/plugin/clipboard.py:51 msgid "Clear" msgstr "Ryd" #: ../kupfer/plugin/clipboard.py:63 msgid "Remove all recent clipboards" msgstr "Fjern alle seneste udklipsholdere" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Skalkommandoer" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Kør (hent uddata)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Kør program og returner dets uddata" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 #, fuzzy msgid "Pass to Command..." msgstr "Sidste kommando" #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 #, fuzzy msgid "Write to Command..." msgstr "Skriv til..." #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 #, fuzzy msgid "Run program and supply text on the standard input" msgstr "Kør program og returner dets uddata" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "" #: ../kupfer/plugin/commands.py:215 #, fuzzy msgid "Run command-line programs" msgstr "Kør kommandolinjeprogrammer" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Ordbog" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Slå et ord op i ordbogen" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Slå op" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Dokumenter" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "Seneste brugte dokumenter og bogmærkede mapper" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "Maks. dage for seneste dokument" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Seneste punkter" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Seneste brugte dokumenter" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "%s dokumenter" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Seneste brugte dokumenter for %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Steder" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Bogmærkede mapper" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Epiphanybogmærker" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Indeks af Epiphanybogmærker" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Favoritter" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "Marker ofte brugte punkter og gem objekter til senere brug" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "Hylde af \"Favoritpunkter\"" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Tilføj til favoritter" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Tilføj punkt til favorithylde" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Fjern fra favoritter" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Fjern punkt fra favorithylde" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Filhandlinger" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Flere filhandlinger" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:210 msgid "Move To..." msgstr "Flyt til..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:252 msgid "Move file to new location" msgstr "Flyt fil til ny placering" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Omdøb til..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:165 msgid "Copy To..." msgstr "Kopier til..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:206 msgid "Copy file to a chosen location" msgstr "Kopier fil til en valgt placering" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Firefoxbogmærker" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Indeks af Firefoxbogmærker" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "Inkluder besøgte sider" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Markeret fil" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" "Giver adgang til den aktuelle markering i nautilus ved brug af Kupfers " "Nautilusudvidelse" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Markeret fil \"%s\"" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Valgte filer" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Noter" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Gnote- eller Tomboynoter" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Arbejd med program" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Åbn med noteprogram" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Tilføj til note..." #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Tilføj tekst til eksisterende note" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Opret note" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Opret en ny note fra denne tekst" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Hent notesøgningsresultater..." #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "Vis søgeresultat for denne forespørgsel" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "i dag, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "i går, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Sidst opdateret %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "Afspil og sæt numre i kø og gennemse musikbiblioteket" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Inkluder kunstnere i overniveau" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Inkluder album i overniveau" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Inkluder sange i overniveau" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Afspil" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Genoptag afspilning i Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Pause" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Sæt afspilning i Rhythmbox på pause" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Næste" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Hop til næste nummer i Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Forrige" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Hop til forrige nummer i Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Vis afspilning" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Vis hvilken sang der nu afspilles" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Ryd kø" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Afspil numre i Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Sæt i kø" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Tilføj numre til afspilningskøen" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "af %(artist)s fra %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "af %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Numre af %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Album" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Musikalbum i Rhythmboxbibliotek" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Kunstnere" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Musikkunstnere i Rhythmboxbibliotek" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Sange" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Sange i Rhythmboxbibliotek" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "GNOME-sessionshåndtering" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "Specielle punkter og handlinger til GNOME-miljøet" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Log ud..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Log ud eller ændr bruger" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Luk ned..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Luk ned, genstart eller sæt computer i hvile" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Lås skærm" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Aktiver pauseskærm og lås" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "XFCE-sessionshåndtering" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Specielle punkter og handlinger XFCE-miljøet" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Vis tekst" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:52 msgid "Display text in a window" msgstr "Vis tekst i et vindue" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Stor type" #: ../kupfer/plugin/show_text.py:60 msgid "Show Notification" msgstr "Vis påmindelse" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Papirkurv" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Tilgå papirkurvsindhold" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Flyt til papirkurv" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Flyt denne fil til papirkurven" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Gendan" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Flyt fil tilbage til oprindelig placering" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "Papirkurv er tom" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "Papirkurv indeholder en fil" msgstr[1] "Papirkurve indeholder %(num)s filer" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Udløsere" #: ../kupfer/plugin/triggers.py:6 #, fuzzy msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Tildel globale tastaturgenveje (udløsere) til objekter oprettet med " "'kompositionskommandoen' (Ctrl+Retur)." #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Tilføj udløser..." #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Fjern udløser" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "Adressehandlinger" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Hent og åbn" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Hent til..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "Hent adresseindhold til en valgt placering" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Diskenheder og diske" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Monterede diskenheder og diske" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Diskenhed monteret på %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Afmonter" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Afmonter denne diskenhed" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Skub ud" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Afmonter og skub dette medie ud" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Søg på internettet" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Søg på internettet med OpenSearchs søgemotorer" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Søg med..." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Søg efter..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Søgemotorer" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Søg i Wikipedia" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Wikipediasprog" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "da" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Søg efter denne tekst på %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Vinduesliste" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Alle vinduer på alle arbejdsområder" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Aktiver" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Skygge" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Fjern skygge" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Minimer" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Fjern minimering" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Maksimer" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Fjern maksimering" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Maksimer vandret" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Fjern vandret maksimering" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Vindue på %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Forreste vindue" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Næste vindue" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Spring til dette vindues arbejdsområde og fokuser" #: ../kupfer/plugin/windows.py:252 #, fuzzy, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "Næste vindue" msgstr[1] "Næste vindue" #: ../kupfer/plugin/windows.py:256 #, fuzzy msgid "Active workspace" msgstr "Spring til dette arbejdsområde" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Spring til dette arbejdsområde" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Arbejdsområde" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Seneste dokumenter i Abiword" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Abiwords seneste punkter" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Grænseflade til pakkehåndteringen APT" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Installationsmetode" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Vis pakkeinformation" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Installer" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Installer pakke med brug af den konfigurerede metode" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Pakker der matcher \"%s\"" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Søg efter pakkenavn..." #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "Dybe arkiver" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Tillad at der kan gennemses i komprimerede arkivfiler" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "Indhold af %s" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Kontroller Audacious' afspilning og afspilningsliste" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Tilføj numre til Audacious' afspilningskø" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Fjern fra kø" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Fjern numre fra Audacious' afspilningskø" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Gå til nummer i Audacious" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Genoptag afspilning i Audacious" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Sæt afspilning på pause i Audacious" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Gå til næste nummer i Audacious" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Gå til forrige nummer i Audacious" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Ryd Audacious' afspilningskø" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Vilkårlig rækkefølge" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Slå vilkårlig rækkefølge i Audacious til/fra" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Gentag" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Slå gentag i Audacious til/fra" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Afspilningsliste" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Chromiumbogmærker" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Indeks af Chromiumbogmærker" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Claws Mail-kontakter og handlinger" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Skriv ny e-post" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Skriv en ny besked i Claws Mail" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Modtag al e-post" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "Modtag nye beskeder fra alle kontakter i ClawsMail" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "Opret e-post" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "Send i en e-post til..." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Opret ny besked i Claws Mail og vedhæft fil" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Claws' postadressebog" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Kontakter fra Claws' postadressebog" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 #, fuzzy msgid "Custom Terminal" msgstr "Kør i terminal" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "Kørselsflag" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Standard for e-post-klient" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "Opret e-post med brug af systemets standard mailto:-håndtering" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Søg i Devhelp" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "" #: ../kupfer/plugin/empathy.py:6 #, fuzzy msgid "Access to Empathy Contacts" msgstr "Adgang til Gajimkontakter" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Vis frakoblede kontakter" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Tilgængelig" # fraværende eller ude #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Fraværende" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Optaget" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Ikke tilgængelig" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Usynlig" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Afkoblet" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:90 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:204 msgid "Open Chat" msgstr "Åbn snak" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:118 #: ../kupfer/plugin/skype.py:250 msgid "Change Global Status To..." msgstr "Ændr global status til..." #: ../kupfer/plugin/empathy.py:171 #, fuzzy msgid "Empathy Contacts" msgstr "Gajimkontakter" #: ../kupfer/plugin/empathy.py:237 #, fuzzy msgid "Empathy Account Status" msgstr "Gajims kontostatus" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Evolutionkontakter" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Opret en ny besked i Evolution" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Opret ny besked i Evolution og tilføj fil" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Evolutions adressebog" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Vis sider og håndter ftp-adresser med Filezilla" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Åbn side med Filezilla" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Filezillasider" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Sider fra Filezilla" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Adgang til Gajimkontakter" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Ledig til snak" #: ../kupfer/plugin/gajim.py:146 msgid "Gajim Contacts" msgstr "Gajimkontakter" #: ../kupfer/plugin/gajim.py:210 msgid "Gajim Account Status" msgstr "Gajims kontostatus" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "GNOME-terminalprofiler" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "Kør GNOME-terminalprofiler" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:144 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "Indlæs kontakter og Skriv ny e-post i Gmail" #: ../kupfer/plugin/gmail/__init__.py:32 msgid "Load contacts' pictures" msgstr "Indlæs kontakters billeder" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Compose Email in GMail" msgstr "Skriv e-post i GMail" #: ../kupfer/plugin/gmail/__init__.py:74 msgid "Open web browser and compose new email in GMail" msgstr "Åbn internetbrowser og skriv ny e-post i GMail" #: ../kupfer/plugin/gmail/__init__.py:177 msgid "Contacts from Google services (Gmail)" msgstr "Kontakter fra Googletjenester (Gmail)" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Vis album og overfør filer til Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "Brugere at vise: (kommaadskilt)" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Indlæs bruger- og albumikoner" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Overfører billeder" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Overfører billeder til Picasa Webalbum" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Opretter album:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Album oprettet af Kupfer" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Fil:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "Et album" msgstr[1] "%(num)d albummer" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "et billede" msgstr[1] "%(num)s billeder" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Overfør til Picasa-album..." #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Overfør filer til Picasa-album" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Overfør til Picasa som nyt album" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Opret album fra valgt lokal mappe" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Picasa-album" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Brugeralbum i Picasa" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Googlesøgning" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Søg med Google og få resultater vist direkte" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #, python-format msgid "Results for \"%s\"" msgstr "Resultater for \"%s\"" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Vis flere resultater for \"%s\"" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "%s fundet i alt" #: ../kupfer/plugin/google_translate.py:6 msgid "Google Translate" msgstr "Google oversæt" #: ../kupfer/plugin/google_translate.py:8 #: ../kupfer/plugin/google_translate.py:153 msgid "Translate text with Google Translate" msgstr "Oversæt tekst med Google oversæt" #: ../kupfer/plugin/google_translate.py:83 msgid "Google Translate connection timed out" msgstr "Forbindelse til Google oversæt fik tidsudløb" #: ../kupfer/plugin/google_translate.py:86 msgid "Error connecting to Google Translate" msgstr "Fejl ved forbindelse til Google oversæt" #: ../kupfer/plugin/google_translate.py:136 #: ../kupfer/plugin/google_translate.py:223 msgid "Translate To..." msgstr "Oversæt til..." #: ../kupfer/plugin/google_translate.py:179 #, python-format msgid "Translate into %s" msgstr "Oversæt til %s" #: ../kupfer/plugin/google_translate.py:203 msgid "Languages" msgstr "Sprog" #: ../kupfer/plugin/google_translate.py:238 msgid "Show translated page in browser" msgstr "Vis oversat side i browser" #: ../kupfer/plugin/google_translate.py:255 msgid "Show Translation To..." msgstr "Vis oversættelse til..." #: ../kupfer/plugin/google_translate.py:271 msgid "Show translation in browser" msgstr "Vis oversættelse i browser" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "Gennemse og opret nye opgaver i GTG" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "forfalden: %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "start: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "mærker: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Åbn opgave i Getting Things GNOME!" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Slet" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Fjern permanent denne opgave" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Markering færdig" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Marker denne opgave som færdig" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Afvis" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Marker at denne opgave ikke længere skal udføres" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Opret opgave" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Opret ny opgave i Getting Things GNOME" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, fuzzy, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s %(when)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, fuzzy, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s" #: ../kupfer/plugin/gwibber.py:187 #, fuzzy msgid "Send Message" msgstr "Send besked..." #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "" #: ../kupfer/plugin/gwibber.py:210 #, fuzzy msgid "Send Message To..." msgstr "Send besked..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Send besked..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Svar..." #: ../kupfer/plugin/gwibber.py:314 #, fuzzy msgid "Delete Message" msgstr "Send besked..." #: ../kupfer/plugin/gwibber.py:337 #, fuzzy msgid "Send Private Message..." msgstr "Send direkte besked..." #: ../kupfer/plugin/gwibber.py:370 #, fuzzy msgid "Send direct message to user" msgstr "Send direkte besked til..." #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "" #: ../kupfer/plugin/gwibber.py:376 #, fuzzy msgid "Retweet To..." msgstr "Omdøb til..." #: ../kupfer/plugin/gwibber.py:407 #, fuzzy msgid "Retweet message to all Gwibber accounts" msgstr "Modtag nye beskeder fra alle kontakter i ClawsMail" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:413 #, fuzzy msgid "Open in Browser" msgstr "Åbn overmappe" #: ../kupfer/plugin/gwibber.py:419 #, fuzzy msgid "Open message in default web browser" msgstr "Åbn adresse med standardviser" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 #, fuzzy msgid "Gwibber Accounts" msgstr "Gajims kontostatus" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Handlinger med højere prioritet" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Værktøjer til arbejde med kommandoer som objekter" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Vælg i Kupfer" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Resultat af %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Kør (tag resultat)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Tag kommandoresultatet som et proxyobjekt" # ville nok skrive: # (smid resultat væk) # eller (kassér resultat) sidstnævne anbefales af ordlisten #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Kør (kassér resultat)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Billedværktøjer" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Billedtransformeringsværktøjer" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Skaler..." #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Skaler billede så det passer inden for angivet størrelsesforhold" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Roter med uret" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Roter mod uret" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Automatisk rotering" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Roter JPEG (internt) ifølge egne EXIF-metadata" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Kupferudvidelsesmoduler" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Tilgå Kupfers udvidelsesmodulliste i Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Vis information" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Vis kildekode" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "aktiveret" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Find filer" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Søg i filsystemet med brug af kommandoen locate" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Ignorer forskel på små/store bogstaver under søgning" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 #, fuzzy msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Seneste brugte dokumenter i OpenOffice" #: ../kupfer/plugin/openoffice.py:83 #, fuzzy msgid "OpenOffice/LibreOffice Recent Items" msgstr "OpenOffices seneste punkter" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Operabogmærker" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Indeks af Operabogmærker" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera Mail" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Opera Mail-kontakter og handlinger" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Opret en ny besked i Opera Mail" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Opera Mail-kontakter" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Kontakter fra Opera Mail" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Adgang til Pidginkontakter" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d tegn)" msgstr[1] "%s (%d tegn)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Pidginkontakter" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "PuTTY-sessioner" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Hurtig adgang til PuTTY-sessioner" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Start session" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "reStructuredText" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "Optegn reStructuredText og vis resultatet" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Vis som HTML-dokument" # 'GNU Screen' er navnet på et program, en såkaldt 'terminalmultiplekser' # der tillader multitasking inden for en enkelt terminal (bl.a. brugbart # hvis man vil flytte et program der kører i en terminal til en anden) #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNN Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "Aktive sessioner af GNU Screen" # (processen er koblet til en terminal) #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Tilkoblet" # (processen er ikke tilkoblet en terminal - kører i 'baggrunden') #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Afkoblet" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s session (%(pid)s) oprettet %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Screen-sessioner" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Tilføj" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:49 msgid "Send Keys" msgstr "" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "" #: ../kupfer/plugin/sendkeys.py:25 msgid "Paste to Foreground Window" msgstr "" #: ../kupfer/plugin/sendkeys.py:43 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:85 msgid "Send keys to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:90 msgid "Type Text" msgstr "" #: ../kupfer/plugin/sendkeys.py:111 msgid "Type the text to foreground window" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Systemtjenester" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "Start, stop eller genstart systemtjenester via init-skript" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Sudo-lignende kommando" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Start tjeneste" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Genstart tjeneste" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Stop tjeneste" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "%s-tjeneste" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Forkort henvisninger" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Opret korte aliasser på lange internetadresser" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Fejl" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Forkort med..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Tjenester" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 #, fuzzy msgid "Show QRCode" msgstr "Vis kildekode" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 #, fuzzy msgid "Display text as QRCode in a window" msgstr "Vis tekst i et vindue" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Adgang til Skypekontakter" # tror 'Skype Me' skal være uoversat (det er vist navnet på en # skype-funktion som i øvrigt ikke findes længere iflg. nogle hurtigt # skimmede googleresultater) #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skype Me" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Logget ud" #: ../kupfer/plugin/skype.py:183 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:225 msgid "Call" msgstr "Opkald" #: ../kupfer/plugin/skype.py:239 msgid "Place a call to contact" msgstr "Foretag et opkald til en kontakt" #: ../kupfer/plugin/skype.py:274 msgid "Skype Contacts" msgstr "Skypekontakter" #: ../kupfer/plugin/skype.py:294 msgid "Skype Statuses" msgstr "Skypestatusser" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "SSH-værter" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "Tilføjer SSH-værterne fundet i ~/.ssh/config." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "SSH-vært" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Forbind" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "Forbind til SSH-vært" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "SSH-værter som angivet i ~/.ssh/config" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Ingen D-Bus-forbindelse til skrivebordssession" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Dokumentskabeloner" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Opret nye dokumenter fra dine skabeloner" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "%s-skabelon" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Tom fil" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Ny mappe" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Opret nyt dokument..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Opret et nyt dokument fra skabelon" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Opret dokument i..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "Tekstfiler" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Tilføj til..." #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Tilføj..." #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Skriv til..." #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Hent tekstindhold" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:184 #: ../kupfer/plugin/thunar.py:224 ../kupfer/plugin/thunar.py:283 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:10 msgid "File manager Thunar actions" msgstr "Handlinger for filhåndteringen Thunar" #: ../kupfer/plugin/thunar.py:66 msgid "Select in File Manager" msgstr "Vælg i filhåndtering" #: ../kupfer/plugin/thunar.py:94 msgid "Show Properties" msgstr "Vis egenskaber" #: ../kupfer/plugin/thunar.py:117 msgid "Show information about file in file manager" msgstr "Vis information om fil i filhåndtering" #: ../kupfer/plugin/thunar.py:126 msgid "Send To..." msgstr "Send til..." #: ../kupfer/plugin/thunar.py:258 msgid "Empty Trash" msgstr "Tøm papirkurv" #: ../kupfer/plugin/thunar.py:298 msgid "Thunar Send To Objects" msgstr "Send til-objekter for Thunar" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Thunderbird-/Icedovekontakter og -handlinger" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Opret en ny besked i Thunderbird" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Thunderbirds adressebog" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Kontakter fra Thunderbirds adressebog" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Øverst" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Vis kørende opgaver og tillad at der bliver sendt signaler til dem" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Sorteringsrækkefølge" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Kommandolinje" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "CPU-forbrug (faldende)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Hukommelsesforbrug (faldende)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Send signal..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Signaler" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Igangværende opgaver" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s cpu: %(cpu)g%% huk: %(mem)g%% tid: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Igangværende opgaver for aktuel bruger" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:15 ../kupfer/plugin/tracker1.py:18 msgid "Tracker desktop search integration" msgstr "Skrivebordsintegrering for søgning via Tracker" #: ../kupfer/plugin/tracker.py:41 ../kupfer/plugin/tracker1.py:49 msgid "Search in Tracker" msgstr "Søg i Tracker" #: ../kupfer/plugin/tracker.py:46 ../kupfer/plugin/tracker1.py:54 msgid "Open Tracker Search Tool and search for this term" msgstr "Åbn søgeværktøjet Trackers og søg efter denne tekst" #: ../kupfer/plugin/tracker.py:55 ../kupfer/plugin/tracker1.py:62 msgid "Get Tracker Results..." msgstr "Indhent Trackerresultater..." #: ../kupfer/plugin/tracker.py:64 ../kupfer/plugin/tracker1.py:71 msgid "Show Tracker results for query" msgstr "Vis Trackerresultater for søgning" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Trackermærker" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Trackermærker" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Gennemse Trackers mærker" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "Mærket %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Objekter mærket %s med Tracker" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Tilføj mærke..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Tilføj trackermærke til fil" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Fjern mærke..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Fjern trackermærke fra fil" #: ../kupfer/plugin/tracker1.py:10 #, fuzzy msgid "Tracker" msgstr "Tracker 0.6" #. FIXME: Port tracker tag sources and actions #. to the new, much more powerful sparql + dbus API #. (using tracker-tag as in 0.6 is a plain hack and a dead end) #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Diskenheder fra TrueCrypts historik" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "TrueCryptdiskenhed: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Monter diskenhed" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Monter i Truecrypt" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Forsøg at montere fil som Truecryptdiskenhed" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Afmonter alle diskenheder" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "TrueCryptdiskenheder" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Terminalserverklient" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Session gemt i Terminalserverklient" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "TSClient-sessioner" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Gemte sessioner i Terminalserverklient" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Vinagrebogmærker og -handlinger" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Start Vinagresession" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Vinagrebogmærker" #: ../kupfer/plugin/vim.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim.py:3 msgid "Recently used documents in Vim" msgstr "Seneste dokumenter i Vim" #: ../kupfer/plugin/vim.py:46 msgid "Vim Recent Documents" msgstr "Vims seneste dokumenter" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "Kontroller VirtualBox Virtual Machines. Understøtter både Sun VirtualBox og " "open source-udgaven." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "" # Tændt, tænd # mon ikke det er 'Tænd'? #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Tænd" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Tænd headless" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Send sluksignal" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Genstart" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Genoptag" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Gem tilstand" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Sluk" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "VirtualBox-maskiner" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:10 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "" "Adgang til sider gemt i Zim - En skrivebordswiki og et disponeringsprogram" #: ../kupfer/plugin/zim.py:28 msgid "Page names start with :colon" msgstr "Sidenavne starter med :colon" #: ../kupfer/plugin/zim.py:58 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Zimside fra notebog \"%s\"" #: ../kupfer/plugin/zim.py:67 msgid "Create Zim Page" msgstr "Opret Zimside" #: ../kupfer/plugin/zim.py:74 msgid "Create page in default notebook" msgstr "Opret side i standardnotebog" #: ../kupfer/plugin/zim.py:84 msgid "Create Zim Page In..." msgstr "Opret Zimside i..." #: ../kupfer/plugin/zim.py:122 msgid "Create Subpage..." msgstr "Opret underside..." #: ../kupfer/plugin/zim.py:243 msgid "Zim Notebooks" msgstr "Zimnotebøger" #: ../kupfer/plugin/zim.py:259 msgid "Zim Pages" msgstr "Zimsider" #: ../kupfer/plugin/zim.py:287 msgid "Pages stored in Zim Notebooks" msgstr "Sider gemt i Zimnotebøger" #~ msgid "Directories" #~ msgstr "Mapper" #~ msgid "Interface" #~ msgstr "Grænseflade" #~ msgid "Hide Kupfer when focus is lost" #~ msgstr "Skjul Kupfer når fokus mistes" #~ msgid "" #~ "Tick the box next to a source to make sure its objects are exported to " #~ "the top level of the catalog. An unticked source's contents are only " #~ "available by locating its subcatalog and entering it.\n" #~ "\n" #~ "Note: Kupfer is an integrator, not an indexer itself. Kupfer is not " #~ "designed to carry a catalog larger than a couple of thousand objects, and " #~ "may become slow if overly large subcatalogs are included in the top level." #~ msgstr "" #~ "Afkryds boksen ved siden af en kilde for at sikre dig at dens objekter " #~ "eksporteres til topniveauet på kataloget. En manglende afkrydsning for en " #~ "kilde vil gøre, at dens indhold kun er tilgængeligt ved at finde dens " #~ "underkatalog og tilgå dette underkatalog.\n" #~ "\n" #~ "Bemærk: Kupfer er en integrator, ikke et indekseringsprogram i sig selv. " #~ "Kupfer er ikke designet til at håndtere et katalog større end et par " #~ "tusinde objekter, og kan blive langsom hvis mange store underkataloger " #~ "indgår under topniveauet." #~ msgid "Text Matches" #~ msgstr "Tekstresultater" #~ msgid "noun" #~ msgstr "navneord" #~ msgid "verb" #~ msgstr "udsagnsord" #~ msgid "adjective" #~ msgstr "tillægsord" #~ msgid "Twitter" #~ msgstr "Twitter" #~ msgid "Microblogging with Twitter: send updates and show friends' tweets" #~ msgstr "Mikroblogning med Twitter: Send opdatering og vis venners tweet'er" #~ msgid "Load friends' pictures" #~ msgstr "Indlæs venners billeder" #~ msgid "Load friends' public tweets" #~ msgstr "Indlæs venners offentlige tweet'er" #~ msgid "Load timeline" #~ msgstr "Indlæs tidslinje" #~ msgid "Post Update to Twitter" #~ msgstr "Indsend opdatering til Twitter" #~ msgid "Twitter Timeline" #~ msgstr "Twittertidslinje" #~ msgid "Twitter Friends" #~ msgstr "Twittervenner" #~ msgid "Timeline for %s" #~ msgstr "Tidslinje for %s" #~ msgid "OpenOffice" #~ msgstr "OpenOffice" #~ msgid "Preferred terminal" #~ msgstr "Foretrukne terminal" #~ msgid "" #~ "The preferred terminal emulator. It's used to launch the SSH sessions." #~ msgstr "" #~ "Den foretrukne terminalemulator. Den bruges til at starte SSH-sessionerne " #~ "op." #~ msgid "" #~ "The flag which makes the terminal execute everything following it inside " #~ "the terminal (e.g. '-x' for gnome-terminal and terminal, '-e' for konsole " #~ "and urxvt)." #~ msgstr "" #~ "Flaget som får terminalen til at køre alt, der følger efter inden i " #~ "terminalen (f.eks. '-x' til gnome-terminal og terminal, '-e' til konsole " #~ "og urxvt)." #~ msgid "Tracker 0.8" #~ msgstr "Tracker 0.8" kupfer-v208/po/de.po000066400000000000000000002572611176220042200144260ustar00rootroot00000000000000# German translations for the kupfer package. # Copyright (C) 2009 Ulrik Sverdrup # This file is distributed under the same license as the kupfer package. (GPLv3) # Ulrik Sverdrup , 2009. # Thibaud Roth , 2009. # Mario Blättermann , 2009-2011. # Christian Kirbach , 2009. # msgid "" msgstr "" "Project-Id-Version: kupfer master\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2011-12-13 17:56+0000\n" "PO-Revision-Date: 2011-12-16 19:18+0100\n" "Last-Translator: Mario Blättermann \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "Anwendungsstarter" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "Praktisches Befehls- und Zugriffswerkzeug für Anwendungen und Dokumente" #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "In Kupfer ausführen" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Gespeicherter Kupfer-Befehl" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "Tastenkombinationen für Browser" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "Globale Tastenkombinationen" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Start" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:156 msgid "Catalog" msgstr "Katalog" #: ../data/preferences.ui.h:5 msgid "Desktop Environment" msgstr "Arbeitsumgebung" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "Ordner, deren Dateien immer im Katalog verfügbar sind." #: ../data/preferences.ui.h:7 msgid "General" msgstr "Allgemein" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "Symbolsatz:" #: ../data/preferences.ui.h:9 msgid "Inclusion in Top Level Searches" msgstr "Einbeziehung in Suchvorgänge der ersten Ebene" #: ../data/preferences.ui.h:10 msgid "Indexed Folders" msgstr "Indizierte Ordner" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "Tastatur" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Kupfer-Einstellungen" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" "Aktivierte Quellen beziehen ihre Objekte in Suchvorgänge der ersten Ebene " "ein.\n" "Die Inhalte einer deaktivierten Quelle sind nur über deren Unterkatalog " "verfügbar." #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "Erweiterungen" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:849 msgid "Reset" msgstr "Zurücksetzen" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "Symbol im Benachrichtigungsfeld anzeigen" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "Beim Anmelden automatisch starten" #: ../data/preferences.ui.h:19 msgid "Terminal emulator:" msgstr "Terminal-Emulator:" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "" "Einzelne Tastaturbefehle verwenden (Leerzeichen, Schrägstrich, Punkt, Komma " "usw.)" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Anmeldedaten" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "Ä_ndern" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "_Passwort:" #: ../data/credentials_dialog.ui.h:4 msgid "_User:" msgstr "_Benutzer:" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "Tastenkürzel konnte nicht gefunden werden" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Bitte die gewünschte Tastenkombination drücken" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "Tastenkombination festlegen" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "Hauptoberfläche beim Start nicht anzeigen" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "Verfügbare Plugins auflisten" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "Informationen zur Fehlerdiagnose aktivieren" #. TRANS: --exec-helper=HELPER is an internal command #. TRANS: that executes a helper program that is part of kupfer #: ../kupfer/main.py:49 msgid "run plugin helper" msgstr "Plugin-Helfer ausführen" #: ../kupfer/main.py:52 msgid "show usage help" msgstr "Hilfe anzeigen" #: ../kupfer/main.py:53 msgid "show version information" msgstr "Versionsinformationen anzeigen" #: ../kupfer/main.py:59 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Aufruf: kupfer [OPTIONEN | DATEI …]" #: ../kupfer/main.py:70 msgid "Available plugins:" msgstr "Verfügbare Erweiterungen:" #: ../kupfer/main.py:121 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "Alternative Aktivierung" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Komma-Trick" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Compose-Befehl" #: ../kupfer/ui/accelerators.py:11 msgid "Mark Default Action" msgstr "Als Standardanwendung markieren" #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "Objekt vergessen" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Alle zurücksetzen" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Beenden wählen" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Ausgewählte Datei wählen" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Markierten Text wählen" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Hilfe anzeigen" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Einstellungen anzeigen" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "In erste Leiste wechseln" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Textmodus umschalten" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s ist leer" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "Keine Treffer in %(src)s für »%(query)s«" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Keine Treffer" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Eingeben, um zu suchen" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Eingeben, um »%s« zu durchsuchen" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Keine Aktion" #: ../kupfer/ui/browser.py:1506 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "»%(action)s« als Vorgabe für »%(object)s« festlegen" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1516 #, python-format msgid "Forget About \"%s\"" msgstr "»%s« vergessen" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1952 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Haupt-Bedienoberfläche anzeigen" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Mit Auswahl anzeigen" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Beschreibung" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Autor" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Version" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Python-Modul »%s« wird benötigt" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Plugin konnte wegen eines Fehlers nicht gelesen werden:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "deaktiviert" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Inhalt von" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Quellen" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Aktionen" #: ../kupfer/ui/preferences.py:575 #, python-format msgid "Using encrypted password storage: %s" msgstr "Verschlüsselter Passwortspeicher %s wird verwendet" #: ../kupfer/ui/preferences.py:577 #, python-format msgid "Using password storage: %s" msgstr "Passwortspeicher %s wird verwendet" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:594 msgid "Configuration" msgstr "Einstellungen" #: ../kupfer/ui/preferences.py:614 msgid "Set username and password" msgstr "Benutzername und Passwort festlegen" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:668 msgid "Choose a Directory" msgstr "Einen Ordner auswählen" #: ../kupfer/ui/preferences.py:847 msgid "Reset all shortcuts to default values?" msgstr "Sollen alle Tastenkombinationen auf Standardwerte zurückgesetzt werden?" #: ../kupfer/ui/preferences.py:855 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Befehl" #: ../kupfer/ui/preferences.py:856 msgid "Shortcut" msgstr "Kürzel" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "" "Thibaud Roth \n" "Mario Blättermann \n" "Christian Kirbach " #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Ein freier Anwendungsstarter (GPLv3+)" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Dieses Programm ist freie Software, Sie können sie weitergeben und/oder\n" "verändern, solange Sie sich an die Regeln der GNU General Public License\n" "halten, so wie sie von der Free Software Foundation festgelegt wurden;\n" "entweder in Version 3 der Lizenz oder (nach Ihrem Ermessen) in jeder " "folgenden Lizenz.\n" "\n" "Dieses Programm wurde mit dem Ziel veröffentlicht, dass Sie es nützlich " "finden,\n" "jedoch OHNE JEDWEDE GARANTIE, sogar ohne eine implizite Garantie\n" "der VERKAUFBARKEIT oder der NUTZBARKEIT FÜR EINEN SPEZIELLEN ZWECK.\n" "Schauen Sie für weitere Informationen bitte in der GNU General Public License " "(GNU GPL) nach.\n" "\n" "Mit diesem Programm sollten Sie außerdem eine Kopie der GNU General Public " "License erhalten\n" "haben. Wenn dem nicht so ist, so schreiben Sie bitte an die\n" "Free Software Foundation, Inc.,\n" "51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "Laufender Kupfer-Prozess konnte nicht gefunden werden" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "Tastatur-Weiterleitungsdienst ist aktiv für Anzeige %s" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Aktion »%s« konnte nicht ausgeführt werden" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "»%s« hatte eine Ausgabe" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "Keine Zugriffsrechte zur Ausführung von »%s« (nicht ausführbar)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "Befehl in »%s« ist nicht verfügbar" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 msgid "Text" msgstr "Text" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Verzögert ausführen …" #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Einen Befehl nach einer angegebenen Zeit ausführen" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Mehrere Objekte" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s Objekt" msgstr[1] "%s Objekte" #: ../kupfer/obj/contacts.py:87 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "%s unterstützt diesen Vorgang nicht" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "Kann nicht mit mehreren Objekten verwendet werden" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:176 msgid "Open" msgstr "Öffnen" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Keine Standardanwendung für %(file)s (%(type)s)" #: ../kupfer/obj/fileactions.py:45 #, python-format msgid "Please use \"%s\"" msgstr "Bitte benutzen Sie »%s«" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Standardanwendung auswählen …" #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Mit der Standardanwendung öffnen" #: ../kupfer/obj/fileactions.py:74 msgid "Reveal" msgstr "Beinhaltenden Ordner öffnen" #: ../kupfer/obj/fileactions.py:83 msgid "Open parent folder" msgstr "Übergeordneten Ordner öffnen" #: ../kupfer/obj/fileactions.py:89 msgid "Open Terminal Here" msgstr "Hier ein Terminal öffnen" #: ../kupfer/obj/fileactions.py:102 msgid "Open this location in a terminal" msgstr "Diesen Ort in einem Terminal öffnen" #: ../kupfer/obj/fileactions.py:110 msgid "Run in Terminal" msgstr "Im Terminal ausführen" #: ../kupfer/obj/fileactions.py:110 msgid "Run (Execute)" msgstr "Ausführen (Starten)" #: ../kupfer/obj/fileactions.py:130 msgid "Run this program in a Terminal" msgstr "Dieses Programm in einem Terminal ausführen" #: ../kupfer/obj/fileactions.py:132 msgid "Run this program" msgstr "Dieses Programm ausführen" #: ../kupfer/obj/objects.py:252 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 ../kupfer/plugin/vim/plugin.py:172 msgid "Go To" msgstr "Gehe zu" #: ../kupfer/obj/objects.py:278 msgid "Open URL" msgstr "Adresse öffnen" #: ../kupfer/obj/objects.py:289 msgid "Open URL with default viewer" msgstr "Adresse mit dem Standardbetrachter öffnen" #: ../kupfer/obj/objects.py:303 msgid "Launch" msgstr "Starten" #: ../kupfer/obj/objects.py:316 msgid "Show application window" msgstr "Anwendungsfenster anzeigen" #: ../kupfer/obj/objects.py:317 msgid "Launch application" msgstr "Anwendung starten" #: ../kupfer/obj/objects.py:328 msgid "Launch Again" msgstr "Neu starten" #: ../kupfer/obj/objects.py:335 msgid "Launch another instance of this application" msgstr "Eine andere Instanz dieser Anwendung starten" #: ../kupfer/obj/objects.py:341 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Schließen" #: ../kupfer/obj/objects.py:349 msgid "Attempt to close all application windows" msgstr "Versuchen, alle Anwendungsfenster zu schließen" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:396 msgid "Run" msgstr "Ausführen" #: ../kupfer/obj/objects.py:406 msgid "Perform command" msgstr "Befehl ausführen" #: ../kupfer/obj/objects.py:419 msgid "(Empty Text)" msgstr "(Leerer Text)" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:449 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "»%(text)s«" msgstr[1] "(%(num)d Zeilen) »%(text)s«" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s et. al." #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Rekursive Quelle von %(dir)s, (%(levels)d Ebenen)" #: ../kupfer/obj/sources.py:108 #, python-format msgid "Directory source %s" msgstr "Quellordner %s" #: ../kupfer/obj/sources.py:118 msgid "Home Folder" msgstr "Persönlicher Ordner" #: ../kupfer/obj/sources.py:129 msgid "Catalog Index" msgstr "Katalogindex" #: ../kupfer/obj/sources.py:144 msgid "An index of all available sources" msgstr "Ein Index aller verfügbaren Quellen" #: ../kupfer/obj/sources.py:176 msgid "Root catalog" msgstr "Standardkatalog" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Bitte das Plugin konfigurieren" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "Plugin %s ist nicht konfiguriert" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "Ungültige Anmeldedaten für %s" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "GTK+" #: ../kupfer/plugin/core/alternatives.py:13 msgid "GNOME Terminal" msgstr "GNOME-Terminal" #: ../kupfer/plugin/core/alternatives.py:22 msgid "XFCE Terminal" msgstr "XFCE-Terminal" #: ../kupfer/plugin/core/alternatives.py:31 msgid "LXTerminal" msgstr "LXTerminal" #: ../kupfer/plugin/core/alternatives.py:40 msgid "X Terminal" msgstr "X-Terminal" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "Urxvt" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Speichern unter …" #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Beenden" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Kupfer beenden" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "Info zu Kupfer" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Informationen über die Kupfer-Autoren und Lizenz anzeigen" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Kupfer-Hilfe" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Hilfe zu Kupfer erhalten" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Kupfers Einstellungsfenster anzeigen" #: ../kupfer/plugin/core/__init__.py:64 msgid "Search Contents" msgstr "Inhalt durchsuchen" #: ../kupfer/plugin/core/__init__.py:82 msgid "Search inside this catalog" msgstr "Im Katalog suchen" #: ../kupfer/plugin/core/__init__.py:90 msgid "Copy" msgstr "Kopieren" #: ../kupfer/plugin/core/__init__.py:105 msgid "Copy to clipboard" msgstr "In die Zwischenablage kopieren" #: ../kupfer/plugin/core/__init__.py:127 msgid "Rescan" msgstr "Neu einlesen" #: ../kupfer/plugin/core/__init__.py:142 msgid "Force reindex of this source" msgstr "Neuindizierung dieser Quelle erzwingen" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Letzter Befehl" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Interne Kupfer-Objekte" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Letzte Ausgabe" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Befehlsausgaben" #: ../kupfer/plugin/archivemanager.py:1 msgid "Archive Manager" msgstr "Archivmanager" #: ../kupfer/plugin/archivemanager.py:9 msgid "Use Archive Manager actions" msgstr "Aktionen des Archivmanagers verwenden" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Archivtyp für »Archiv erstellen in«" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Hier entpacken" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Komprimiertes Archiv entpacken" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Archiv erstellen" #: ../kupfer/plugin/archivemanager.py:86 ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Ein komprimiertes Archiv aus einem Ordner erstellen" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Archiv erstellen in …" #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Archiv" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Anwendungen" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Alle Anwendungen und Einstellungen" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Anwendungen für die Arbeitsumgebung" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Öffnen mit …" #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Mit einer Anwendung öffnen" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Standardanwendung für diesen Dateityp auswählen" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Rechner" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Ausdrücke beginnend mit »=« berechnen" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Berechnen" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:112 msgid "Clipboards" msgstr "Zwischenablagen" #: ../kupfer/plugin/clipboard.py:4 msgid "Recent clipboards and clipboard proxy objects" msgstr "Letzte (Proxy-)Objekte in der Zwischenablage" #: ../kupfer/plugin/clipboard.py:24 msgid "Number of recent clipboards to remember" msgstr "Anzahl der vorzuhaltenden Einträge in der Zwischenablage" #: ../kupfer/plugin/clipboard.py:30 msgid "Include selected text in clipboard history" msgstr "Ausgewählten Text in Zwischenspeicher-Chronik einfügen" #: ../kupfer/plugin/clipboard.py:36 msgid "Copy selected text to primary clipboard" msgstr "Ausgewählten Text in die primäre Zwischenablage kopieren" #: ../kupfer/plugin/clipboard.py:47 msgid "Selected Text" msgstr "Markierter Text" #: ../kupfer/plugin/clipboard.py:57 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Zwischenablage »%(desc)s«" msgstr[1] "Zwischenablage mit %(num)d Zeilen »%(desc)s«" #: ../kupfer/plugin/clipboard.py:64 msgid "Clipboard Text" msgstr "Text in Zwischenablage" #: ../kupfer/plugin/clipboard.py:74 msgid "Clipboard File" msgstr "Datei in Zwischenablage" #: ../kupfer/plugin/clipboard.py:84 msgid "Clipboard Files" msgstr "Dateien in Zwischenablage" #: ../kupfer/plugin/clipboard.py:92 msgid "Clear" msgstr "Leeren" #: ../kupfer/plugin/clipboard.py:104 msgid "Remove all recent clipboards" msgstr "Alle aktuellen Zwischenablagen entfernen" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Shell-Befehle" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" "Befehlszeilenprogramme ausführen. Mit dem Symbol %s markierte Aktionen werden " "in einer Subshell ausgeführt." #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Ausführen (Ausgabe erhalten)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Programm ausführen und dessen Ausgabe zurückgeben" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 msgid "Pass to Command..." msgstr "An Befehl übergeben …" #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "Programm mit Objekt als zusätzlichem Parameter ausführen" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 msgid "Write to Command..." msgstr "In Befehl schreiben …" #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 msgid "Run program and supply text on the standard input" msgstr "Programm ausführen und Text über die Standardausgabe zurückgeben" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "Mittels Befehl filtern …" #: ../kupfer/plugin/commands.py:215 msgid "Run command-line programs" msgstr "Befehlszeilenprogramme ausführen" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Wörterbuch" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Ein Wort im Wörterbuch nachschlagen" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Nachschlagen" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Dokumente" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "Kürzlich verwendete Dokumente und als Lesezeichen gespeicherte Ordner" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "Maximale Anzahl der Tage für zuletzt geöffnete Dokumente" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Zuletzt geöffnete Objekte" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Zuletzt geöffnete Dokumente" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "%s Dokumente" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Zuletzt geöffnete Dokumente für %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Orte" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Als Lesezeichen gespeicherte Ordner" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Lesezeichen in Epiphany" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Index der Lesezeichen in Epiphany" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Favoriten" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "Häufig benutzte Objekte zur späteren Benutzung markieren und speichern" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "»Favoriten«-Ablage" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Zu den Favoriten hinzufügen" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Das Objekt zur Favoriten-Ablage hinzufügen" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Aus den Favoriten entfernen" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Objekt aus der Favoriten-Ablage entfernen" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Datei-Aktionen" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Mehr Datei-Aktionen" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:211 msgid "Move To..." msgstr "Verschieben nach …" #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:253 msgid "Move file to new location" msgstr "Archiv an einen neuen Ort verschieben" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Umbenennen in …" #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:166 msgid "Copy To..." msgstr "Kopieren nach …" #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:207 msgid "Copy file to a chosen location" msgstr "Datei an einen ausgesuchten Ort kopieren" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Lesezeichen in Firefox" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Index der Lesezeichen in Firefox" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "Besuchte Seiten einbeziehen" #. TRANS: Multihead refers to support for multiple computer displays #. TRANS: In this case, it only concerns the special configuration #. TRANS: with multiple X "screens" #: ../kupfer/plugin/multihead.py:4 msgid "Multihead Support" msgstr "Multihead-Unterstützung" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Ausgewählte Datei" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" "Gibt aktuelle Nautilus-Auswahl aus, indem es Kupfers Nautilus-Erweiterung " "verwendet" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Ausgewählte Datei »%s«" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Ausgewählte Dateien" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Notizen" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Gnote- oder Tomboy-Notizen" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Mit einer Anwendung arbeiten" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Mit der Notiz-Anwendung öffnen" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "An eine Notiz anfügen …" #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Den Text zu einer bereits vorhandenen Notiz hinzufügen" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Notiz erstellen" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Eine neue Notiz aus diesem Text erstellen" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Suchergebnisse für Notizen einholen …" #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "Suchergebnisse für diese Abfrage anzeigen" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "heute, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "gestern, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Zuletzt aktualisiert %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "" "Titel abspielen und zur Wiedergabeliste hinzufügen und die Musikbibliothek " "durchsuchen" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Künstler auf der ersten Ebene anzeigen" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Alben auf der ersten Ebene anzeigen" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Lieder auf der ersten Ebene anzeigen" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Abspielen" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Wiedergabe in Rhythmbox fortsetzen" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Pause" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Wiedergabe in Rhythmbox pausieren" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Nächstes" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "In Rhythmbox zum nächsten Titel springen" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Vorheriges" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "In Rhythmbox zum vorherigen Titel springen" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Wiedergegebenen Titel anzeigen" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Aktuell gespieltes Lied anzeigen" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Warteschlange leeren" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Titel in Rhythmbox abspielen" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Zur Wiedergabeliste hinzufügen" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Titel zur Wiedergabeliste hinzufügen" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "von %(artist)s aus %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "von %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Lieder von %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Alben" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Alben in der Rhythmbox-Bibliothek" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Künstler" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Künstler in der Rhythmbox-Bibliothek" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Lieder" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Lieder in der Rhythmbox-Bibliothek" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "GNOME-Sitzungsverwaltung" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "Spezielle Objekte und Aktionen für die GNOME-Arbeitsumgebung" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Abmelden …" #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Abmelden und Benutzer wechseln" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Herunterfahren …" #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "" "Den Rechner herunterfahren, neu starten oder in den Ruhezustand versetzen" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Bildschirm sperren" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Bildschirmschoner aktivieren und sperren" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "XFCE-Sitzungsverwaltung" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Spezielle Objekte und Aktionen für die XFCE-Arbeitsumgebung" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Text anzeigen" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:58 msgid "Display text in a window" msgstr "Text in einem Fenster anzeigen" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Groß" #: ../kupfer/plugin/show_text.py:66 msgid "Show Notification" msgstr "Benachrichtigung anzeigen" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Müll" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Zugriff auf den Inhalt des Mülls" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "In den Müll verschieben" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Diese Datei in den Müll verschieben" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Wiederherstellen" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Datei wieder an den ursprünglichen Ort verschieben" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "Der Mülleimer ist leer" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "Es ist ein Objekt im Mülleimer" msgstr[1] "Es sind %(num)s Objekte im Mülleimer" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Auslöser" #: ../kupfer/plugin/triggers.py:6 msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Globale Tastenkürzel (Auslöser) zu mit dem »Compose-Befehl« (Strg+Eingabe) " "erstellten Objekten hinzufügen" #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Auslöser hinzufügen …" #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Auslöser entfernen …" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "URL-Aktionen" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Herunterladen und öffnen" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Herunterladen nach …" #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "URL in einen ausgewählten Ort herunterladen" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Partitionen und Festplatten" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Eingebundene Partitionen und Festplatten" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Partition in %s eingebunden" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Aushängen" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Diese Partition aushängen" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Auswerfen" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Aushängen und das Medium auswerfen" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Das Internet durchsuchen" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Das Internet mit den OpenSearch-Suchmaschinen durchsuchen" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Suchen mit …" #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Suchen nach …" #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Suchmaschinen" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "In Wikipedia suchen" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Wikipedia-Sprache" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "de" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Nach diesem Suchbegriff auf %s.wikipedia.org suchen" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Fensterliste" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Alle Fenster und Arbeitsflächen" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Aktivieren" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Verstecken" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Zeigen" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Minimieren" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Minimierung aufheben" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Maximieren" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Maximierung aufheben" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Vertikal maximieren" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Maximierung vertikal aufheben" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Fenster auf %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Vorderstes Fenster" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Nächstes Fenster" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Zur Arbeitsfläche springen und Fenster fokussieren" #: ../kupfer/plugin/windows.py:252 #, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "%d Fenster" msgstr[1] "%d Fenster" #: ../kupfer/plugin/windows.py:256 msgid "Active workspace" msgstr "Aktive Arbeitsfläche" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Zu dieser Arbeitsfläche springen" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Arbeitsflächen" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Kürzlich in Abiword verwendete Dokumente" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Letzte Abiword-Dokumente" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Schnittstelle für die APT-Paketverwaltung" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Installationsmethode" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Paketinformationen anzeigen" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Installieren" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Das Paket mit Hilfe der konfigurierten Methode installieren" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Pakete, auf die »%s« zutrifft" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Nach Paketnamen suchen …" #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "In Archive vertiefen" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Suchen innerhalb gepackter Archivdateien ermöglichen" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "Inhalt von %s" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "ASCII- und Unicode-Symbolsatz" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" "Stellt ASCII- und Unicode-Symbolsätze bereit, aus denen Buchstaben und " "Symbole für die in Kupfer gefundenen Objekte erstellt werden." #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "ASCII" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "Unicode" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Wiedergabe und Wiedergabeliste von Audacious steuern" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Titel zur Wiedergabeliste von Audacious hinzufügen" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Titel entfernen" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Titel aus der Wiedergabeliste von Audacious entfernen" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "In Audacious zu einem Titel springen" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Wiedergabe in Audacious fortsetzen" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Wiedergabe in Audacious pausieren" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "In Audacious zum nächsten Titel springen" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "In Audacious zum vorherigen Titel springen" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Warteschlange von Audacious leeren" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Zufall" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Zufallswiedergabe in Audacious ein-/ausschalten" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Wiederholen" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Wiederholung in Audacious ein-/ausschalten" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Wiedergabeliste" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Lesezeichen in Chromium" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Index der Chromium-Lesezeichen" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Kontakte und Aktionen in Claws Mail" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Neue E-Mail verfassen" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Eine neue E-Mail mit Claws Mail erstellen" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Alle E-Mails empfangen" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "Neue E-Mails für alle Konten in Claws Mail empfangen" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "Neue E-Mail verfassen" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "In E-Mail senden an …" #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Eine neue Nachricht in Claws Mail erstellen und Datei anhängen" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Adressbuch von Claws Mail" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Kontakte aus dem Adressbuch von Claws Mail" #: ../kupfer/plugin/custom_terminal.py:1 ../kupfer/plugin/custom_terminal.py:39 msgid "Custom Terminal" msgstr "Benutzerdefiniertes Terminal" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "Einen Terminalemulator benutzerdefiniert einstellen" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "Ausführungsargument" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "Benutzerdefiniertes Thema" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "Ein benutzerdefiniertes Farbthema verwenden" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "Thema:" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Vorgegebenes E-Mail-Programm" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "E-Mail mit dem »mailto:«-Handler des Systems verfassen" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Hilfe für Entwickler" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "In der Hilfe für Entwickler suchen" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "Empathy" #: ../kupfer/plugin/empathy.py:6 msgid "Access to Empathy Contacts" msgstr "Zugriff auf Empathy-Kontakte" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Abgemeldete Kontakte anzeigen" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Verfügbar" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Abwesend" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Beschäftigt" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Nicht verfügbar" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Verborgen" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Abgemeldet" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:93 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:204 msgid "Open Chat" msgstr "Unterhaltung öffnen" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:121 #: ../kupfer/plugin/skype.py:250 msgid "Change Global Status To..." msgstr "Globalen Status ändern in …" #: ../kupfer/plugin/empathy.py:171 msgid "Empathy Contacts" msgstr "Empathy-Kontakte" #: ../kupfer/plugin/empathy.py:237 msgid "Empathy Account Status" msgstr "Kontenstatus von Empathy" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Evolution-Kontakte" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Eine neue E-Mail mit Evolution erstellen" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Eine neue Nachricht in Evolution erstellen und Datei anhängen" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Adressbuch von Evolution" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Seiten anzeigen und FTP-Adressen von Filezilla verarbeiten lassen" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Seite mit Filezilla öffnen" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Filezilla-Seiten" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Seiten von Filezilla" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Zugriff auf Gajim-Kontakte" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Verfügbar für Unterhaltungen" #: ../kupfer/plugin/gajim.py:149 msgid "Gajim Contacts" msgstr "Gajim-Kontakte" #: ../kupfer/plugin/gajim.py:213 msgid "Gajim Account Status" msgstr "Kontenstatus von Gajim" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "Glob" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "GNOME-Terminal-Profile" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "GNOME-Terminal-Profile starten" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:177 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "Kontakte laden und eine neue Nachricht in Google Mail erstellen" #: ../kupfer/plugin/gmail/__init__.py:32 msgid "Load contacts' pictures" msgstr "Bilder für Kontakte laden" #: ../kupfer/plugin/gmail/__init__.py:53 msgid "Compose Email in Gmail" msgstr "Neue E-Mail in GMail verfassen" #: ../kupfer/plugin/gmail/__init__.py:76 msgid "Open web browser and compose new email in Gmail" msgstr "Webbrowser öffnen und eine neue Nachricht in GMail erstellen" #: ../kupfer/plugin/gmail/__init__.py:82 msgid "Edit Contact in Gmail" msgstr "Kontakt in Gmail bearbeiten" #: ../kupfer/plugin/gmail/__init__.py:92 msgid "Open web browser and edit contact in Gmail" msgstr "Webbrowser öffnen und den Kontakt in GMail bearbeiten" #: ../kupfer/plugin/gmail/__init__.py:210 msgid "Contacts from Google services (Gmail)" msgstr "Kontakte aus Google-Diensten (Google Mail)" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Alben anzeigen und Dateien zu Picasa hochladen" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "Anzuzeigende Benutzer (durch Kommata getrennt):" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Symbole für Benutzer und Alben laden" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Bilder werden übertragen" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Bilder werden zum Picasa-Webalbum übertragen" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Album wird erstellt:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Album erstellt von Kupfer" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Datei:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "One album" msgstr[1] "%(num)d Alben" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "Ein Foto" msgstr[1] "%(num)s Fotos" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Bilder zum Picasa-Album hochladen …" #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Dateien zum Picasa-Album hochladen" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Dateien zu Picasa als neues Album hochladen" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Album aus dem gewählten lokalen Ordner erstellen" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Picasa-Alben" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Benutzeralben in Picasa" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Google-Suche" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Mit Google suchen und Ergebnisse direkt anzeigen" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #, python-format msgid "Results for \"%s\"" msgstr "Ergebnisse für »%s«" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Weitere Ergebnisse für »%s« anzeigen" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "%s insgesamt gefunden" #: ../kupfer/plugin/google_translate.py:6 msgid "Google Translate" msgstr "Google Translate" #: ../kupfer/plugin/google_translate.py:8 #: ../kupfer/plugin/google_translate.py:153 msgid "Translate text with Google Translate" msgstr "Text mit Google Translate übersetzen" #: ../kupfer/plugin/google_translate.py:83 msgid "Google Translate connection timed out" msgstr "Zeitüberschreitung bei Google Translate" #: ../kupfer/plugin/google_translate.py:86 msgid "Error connecting to Google Translate" msgstr "Fehler bei der Verbindung mit Google Translate" #: ../kupfer/plugin/google_translate.py:136 #: ../kupfer/plugin/google_translate.py:223 msgid "Translate To..." msgstr "Übersetzen nach …" #: ../kupfer/plugin/google_translate.py:179 #, python-format msgid "Translate into %s" msgstr "Übersetzen nach %s" #: ../kupfer/plugin/google_translate.py:203 msgid "Languages" msgstr "Sprachen" #: ../kupfer/plugin/google_translate.py:238 msgid "Show translated page in browser" msgstr "Übersetzte Seite im Browser anzeigen" #: ../kupfer/plugin/google_translate.py:255 msgid "Show Translation To..." msgstr "Anzeigen der Übersetzung nach …" #: ../kupfer/plugin/google_translate.py:271 msgid "Show translation in browser" msgstr "Übersetzung im Browser anzeigen" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "GTG durchsuchen und neue Aufgaben erstellen" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "Fällig: %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "Beginn: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "Schlagworte: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Aufgabe in Getting Things GNOME! öffnen" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Löschen" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Diese Aufgabe dauerhaft entfernen" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Erledigt" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Diese Aufgabe als erledigt markieren" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Verwerfen" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Diese Aufgabe als nicht mehr zu erledigen markieren" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Aufgabe anlegen" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Neue Aufgabe in Getting Things GNOME! anlegen" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "Gwibber" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from social " "networks like Twitter, Identi.ca etc. Requires the package 'gwibber-service'." msgstr "" "Microblogging mit Gwibber. Erlaubt das Senden und Empfangen von Nachrichten " "in sozialen Netzwerken wie Twitter, Identi.ca usw. Dafür wird das Paket " "»gwibber-service« benötigt." #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "Maximale Anzahl anzuzeigender Nachrichten" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s auf %(service)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s am %(when)s auf %(where)s" #: ../kupfer/plugin/gwibber.py:187 msgid "Send Message" msgstr "Nachricht senden" #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "Nachricht an alle Gwibber-Konten senden" #: ../kupfer/plugin/gwibber.py:210 msgid "Send Message To..." msgstr "Nachricht senden an …" #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "Nachricht an ein Gwibber-Konto senden" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Nachricht senden …" #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "Nachricht an das ausgewählte Gwibber-Konto senden" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Antworten …" #: ../kupfer/plugin/gwibber.py:314 msgid "Delete Message" msgstr "Nachricht löschen" #: ../kupfer/plugin/gwibber.py:337 msgid "Send Private Message..." msgstr "Private Nachricht senden …" #: ../kupfer/plugin/gwibber.py:370 msgid "Send direct message to user" msgstr "Direkte Nachricht an Benutzer senden" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "Antworten" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet To..." msgstr "Antworten an …" #: ../kupfer/plugin/gwibber.py:407 msgid "Retweet message to all Gwibber accounts" msgstr "Auf die Nachricht an alle Gwibber-Konten antworten" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "Auf eine Nachricht über ein Gwibber-Konto antworten" #: ../kupfer/plugin/gwibber.py:413 msgid "Open in Browser" msgstr "Im Browser öffnen" #: ../kupfer/plugin/gwibber.py:419 msgid "Open message in default web browser" msgstr "Nachricht im vorgegebenen Webbrowser öffnen" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 msgid "Gwibber Accounts" msgstr "Gwibber-Konten" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "In Gwibber eingerichtete Konten" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "Gwibber-Nachrichten" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "Von Gwibber kürzlich empfangene Nachrichten" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "Gwibber-Nachrichten für %s" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "Gwibber-Streams" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "In Gwibber eingerichtete Streams" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "Gwibber-Nachrichten in %s" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "Gwibber (einfach)" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "Aktualisierungen über den Microblogging-Client Gwibber senden" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "Aktualisierung senden" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "Gwibber-Dienst konnte nicht aktiviert werden" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Wichtigere Aktionen" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Werkzeuge zur Arbeit mit Befehlen als Objekte" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "In Kupfer auswählen" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Ergebnisse von %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Ausführen (Ergebnis annehmen)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Ausgabe des Befehls als Proxy-Objekt verwenden" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Ausführen (Ergebnis verwerfen)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Bildwerkzeuge" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Werkzeuge zur Bildumwandlung" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Skalieren …" #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Bild zum Einpassen in die angegebenen Pixelgrößen skalieren" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Im Uhrzeigersinn drehen" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Gegen den Uhrzeigersinn drehen" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Automatisch drehen" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "JPEG anhand der EXIF-Metadaten drehen" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Kupfer-Plugins" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Zugriff auf die Kupfer-Pluginliste in Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Informationen anzeigen" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Quellcode anzeigen" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "aktiviert" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Datei finden" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Das Dateisystem mit locate durchsuchen" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Groß-/Kleinschreibung während der Suche ignorieren" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "OpenOffice / LibreOffice" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Kürzlich in OpenOffice/LibreOffice verwendete Dokumente" #: ../kupfer/plugin/openoffice.py:83 msgid "OpenOffice/LibreOffice Recent Items" msgstr "In OpenOffice/LibreOffice zuletzt geöffnete Objekte" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Lesezeichen in Opera" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Index der Lesezeichen in Opera" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera Mail" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Kontakte und Aktionen in Opera Mail" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Eine neue E-Mail mit Opera Mail erstellen" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Opera-Mail-Kontakte" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Kontakte aus Opera Mail" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Zugriff auf Pidgin-Kontakte" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d Zeichen)" msgstr[1] "%s (%d Zeichen)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Pidgin-Kontakte" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "PuTTY-Sitzungen" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Schneller Zugriff auf PuTTY-Sitzungen" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Sitzung starten" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "Bild-Schnellanzeiger" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "Bildansicht" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "reStructuredText" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "reStructuredText darstellen" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Als HTML-Dokument betrachten" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "Aktive GNU Screen-Sitzungen" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Verbunden" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Nicht verbunden" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s Sitzung (%(pid)s) erstellt %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Screen-Sitzungen" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Verbinden" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:52 msgid "Send Keys" msgstr "Tastatursignale senden" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "Synthetische Tastatursignale mit xautomation senden" #: ../kupfer/plugin/sendkeys.py:28 msgid "Paste to Foreground Window" msgstr "In aktives Fenster einfügen" #: ../kupfer/plugin/sendkeys.py:46 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "In die Zwischenablage kopieren und Strg+V an das aktive Fenster senden" #: ../kupfer/plugin/sendkeys.py:101 msgid "Send keys to foreground window" msgstr "Tastatursignale an das aktive Fenster senden" #: ../kupfer/plugin/sendkeys.py:106 msgid "Type Text" msgstr "Text eingeben" #: ../kupfer/plugin/sendkeys.py:127 msgid "Type the text to foreground window" msgstr "Text in das aktive Fenster eingeben" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Systemdienste" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "Systemdienste über Init-Skripte starten, stoppen oder neu starten" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Sudo-ähnlicher Befehl" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Dienst starten" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Dienst neu starten" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Dienst stoppen" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "%s-Dienst" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Links abkürzen" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Schnellzugriffe für lange Adressen erstellen" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Fehler" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Abkürzen als …" #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Dienste" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 msgid "Show QRCode" msgstr "QRCode anzeigen" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 msgid "Display text as QRCode in a window" msgstr "Text als QRCode in einem Fenster anzeigen" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Zugriff auf Skype-Kontakte" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skype Me" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Abgemeldet" #: ../kupfer/plugin/skype.py:183 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:225 msgid "Call" msgstr "Anrufen" #: ../kupfer/plugin/skype.py:239 msgid "Place a call to contact" msgstr "Einen Kontakt anrufen" #: ../kupfer/plugin/skype.py:274 msgid "Skype Contacts" msgstr "Skype-Kontakte" #: ../kupfer/plugin/skype.py:294 msgid "Skype Statuses" msgstr "Skype-Status" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "SSH-Rechner" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "Fügt die in ~/.ssh/config gefundenen Rechner hinzu." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "SSH-Rechner" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Verbinden" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "Mit einem SSH-Rechner verbinden" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "SSH-Rechner wie in ~/.ssh/config angegeben" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Keine D-Bus-Verbindung zur Desktopsitzung" #: ../kupfer/plugin_support.py:171 msgid "GNOME Keyring" msgstr "GNOME-Schlüsselbund" #: ../kupfer/plugin_support.py:172 msgid "KWallet" msgstr "KWallet" #: ../kupfer/plugin_support.py:173 msgid "Unencrypted File" msgstr "Unverschlüsselte Datei" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Dokumentvorlagen" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Neue Dokumente aus Ihren Vorlagen erstellen" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "Vorlage %s" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Leere Datei" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Neuer Ordner" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Neues Dokument erstellen …" #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Ein neues Dokument aus einer Vorlage erstellen" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Dokument erstellen in …" #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "Textdateien" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Anhängen an …" #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Anhängen …" #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Schreiben an …" #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Textinhalte holen" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:185 #: ../kupfer/plugin/thunar.py:225 ../kupfer/plugin/thunar.py:278 #: ../kupfer/plugin/thunar.py:329 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:11 msgid "File manager Thunar actions" msgstr "Aktionen des Dateimanagers Thunar" #: ../kupfer/plugin/thunar.py:67 msgid "Select in File Manager" msgstr "Im Dateimanager auswählen" #: ../kupfer/plugin/thunar.py:95 msgid "Show Properties" msgstr "Eigenschaften anzeigen" #: ../kupfer/plugin/thunar.py:118 msgid "Show information about file in file manager" msgstr "Informationen über die Datei im Dateimanager anzeigen" #: ../kupfer/plugin/thunar.py:127 msgid "Send To..." msgstr "Senden an …" #: ../kupfer/plugin/thunar.py:259 msgid "Symlink In..." msgstr "Verknüpfung zu …" #: ../kupfer/plugin/thunar.py:300 msgid "Create a symlink to file in a chosen location" msgstr "Verknüpfung zur Datei am gewählten Ort erstellen" #: ../kupfer/plugin/thunar.py:304 msgid "Empty Trash" msgstr "Müll ist leer" #: ../kupfer/plugin/thunar.py:344 msgid "Thunar Send To Objects" msgstr "Objekte aus Thunar versenden" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Kontakte und Aktionen in Thunderbird/Icedove" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Eine neue E-Mail mit Thunderbird erstellen" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Thunderbird-Adressbuch" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Kontakte aus dem Adressbuch von Thunderbird" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Top" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Anzeigen aktiver Prozesse und Senden von Signalen" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Sortierreihenfolge" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Befehlszeile" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "Prozessorlast (absteigend)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Speichernutzung (absteigend)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Signal senden …" #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Signale" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Laufende Prozesse" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "PID: %(pid)s Proz.: %(cpu)g%% Speich.: %(mem)g%% Zeit: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Laufende Prozesse des derzeitigen Benutzers" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:15 ../kupfer/plugin/tracker1.py:18 msgid "Tracker desktop search integration" msgstr "Einbindung der Tracker Desktop-Suche" #: ../kupfer/plugin/tracker.py:41 ../kupfer/plugin/tracker1.py:49 msgid "Search in Tracker" msgstr "Mit Tracker suchen" #: ../kupfer/plugin/tracker.py:46 ../kupfer/plugin/tracker1.py:54 msgid "Open Tracker Search Tool and search for this term" msgstr "Tracker Suchwerkzeug öffnen und nach diesem Begriff suchen" #: ../kupfer/plugin/tracker.py:55 ../kupfer/plugin/tracker1.py:62 msgid "Get Tracker Results..." msgstr "Tracker-Ergebnisse einholen …" #: ../kupfer/plugin/tracker.py:64 ../kupfer/plugin/tracker1.py:71 msgid "Show Tracker results for query" msgstr "Tracker Ergebnisse für den Suchbegriff anzeigen" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Tracker-Schlagworte" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Tracker-Schlagworte" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Tracker-Schlagworte anzeigen" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "Schlagwort %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Objekte mit dem Schlagwort %s in Tracker" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Schlagwort hinzufügen …" #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Tracker-Schlagwort zur Datei hinzufügen" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Schlagwort entfernen …" #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Tracker-Schlagwort von der Datei entfernen" #: ../kupfer/plugin/tracker1.py:10 msgid "Tracker" msgstr "Tracker" #. FIXME: Port tracker tag sources and actions #. to the new, much more powerful sparql + dbus API #. (using tracker-tag as in 0.6 is a plain hack and a dead end) #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Datenträger der TrueCrypt-Chronik" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "TrueCrypt-Datenträger: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Datenträger einhängen" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "In TrueCrypt einhängen" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Versuchen, eine Datei in TrueCrypt einzuhängen" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Alle Datenträger aushängen" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "TrueCrypt-Datenträger" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Terminal Server Client" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Sitzung gespeichert im Terminal-Server-Client" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "TSClient-Sitzungen" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Gespeicherte Sitzungen im Terminal-Server-Client" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Vinagre-Lesezeichen und -Aktionen" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Vinagre-Sitzung starten" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Lesezeichen in Vinagre" #: ../kupfer/plugin/vim/__init__.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim/__init__.py:4 msgid "Recently used documents in Vim" msgstr "Kürzlich in Vim verwendete Dokumente" #: ../kupfer/plugin/vim/plugin.py:56 msgid "Vim Recent Documents" msgstr "Zuletzt in Vim geöffnete Dokumente" #: ../kupfer/plugin/vim/plugin.py:219 msgid "Close (Save All)" msgstr "Schließen (alle speichern)" #: ../kupfer/plugin/vim/plugin.py:237 msgid "Send..." msgstr "Senden …" #: ../kupfer/plugin/vim/plugin.py:264 msgid "Send ex command" msgstr "Abbrechen-Befehl senden" #: ../kupfer/plugin/vim/plugin.py:272 msgid "Insert in Vim..." msgstr "In Vim einfügen …" #: ../kupfer/plugin/vim/plugin.py:309 msgid "Active Vim Sessions" msgstr "Aktive Vim-Sitzungen" #: ../kupfer/plugin/vim/plugin.py:338 #, python-format msgid "Vim Session %s" msgstr "Vim-Sitzung %s" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "Steuerung von VirtualBox-Maschinen. Unterstützt sowohl VirtualBox von Sun als " "auch die Open Source Edition." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "Befehlszeilenschnittstelle erzwingen" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Einschalten" # Der Headless mode von VirtualBox kann verwendet werden, um eine virtuelle Maschine auf einem Host ohne grafisches Frontend zu betreiben. #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Ohne Grafikausgabe (headless) einschalten" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Signal zum Ausschalten senden" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Neu starten" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Fortsetzen" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Status speichern" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Ausschalten" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "VirtualBox-Maschinen" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:11 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "Zugriff auf in Zim gespeicherte Seiten - ein Desktop-Wiki" #: ../kupfer/plugin/zim.py:30 msgid "Page names start with :colon" msgstr "Seitennamen beginnen mit :colon" #: ../kupfer/plugin/zim.py:36 msgid "Default page name for quick notes" msgstr "Vorgegebener Seitenname für Quicknotes" #: ../kupfer/plugin/zim.py:38 #, python-format msgid "Note %x %X" msgstr "Notiz %x %X" #: ../kupfer/plugin/zim.py:39 msgid "" "Strftime tags can be used: %H - hour, %M - minutes, etc\n" "Please check python documentation for details.\n" "NOTE: comma will be replaced by _" msgstr "" "Strftime-Tags sind verwendbar: %H - Stunde, %M - Minuten usw.\n" "Details hierzu finden Sie in der Python-Dokumentation.\n" "Achtung: Das Komma wird durch einen Unterstrich ersetzt." #: ../kupfer/plugin/zim.py:45 msgid "Default namespace for quick notes" msgstr "Vorgegebener Namensraum für Quicknotes" #: ../kupfer/plugin/zim.py:80 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Zim-Seite aus Notizbuch »%s«" #: ../kupfer/plugin/zim.py:89 msgid "Create Zim Page" msgstr "Zim-Seite erstellen" #: ../kupfer/plugin/zim.py:96 msgid "Create page in default notebook" msgstr "Zim-Seite im vorgegebenen Notizbuch erstellen" #: ../kupfer/plugin/zim.py:108 msgid "Create Zim Page In..." msgstr "Zim-Seite erstellen in …" #: ../kupfer/plugin/zim.py:132 msgid "Insert QuickNote into Zim" msgstr "Quicknote in Zim einfügen" #: ../kupfer/plugin/zim.py:142 msgid "Quick note selected text into Zim notebook" msgstr "Ausgewählten Text der Quicknote in das Zim-Notizbuch einfügen" #: ../kupfer/plugin/zim.py:191 msgid "Create Subpage..." msgstr "Unterseite erstellen …" #: ../kupfer/plugin/zim.py:370 msgid "Zim Notebooks" msgstr "Zim-Notizbücher" #: ../kupfer/plugin/zim.py:387 msgid "Zim Pages" msgstr "Zim-Seiten" #: ../kupfer/plugin/zim.py:415 msgid "Pages stored in Zim Notebooks" msgstr "In Zim-Notizbüchern gespeicherte Seiten" #~ msgid "run keyboard shortcut relay service on this display" #~ msgstr "" #~ "Weiterleitungsdienst für Tastenkombinationen in dieser Anzeige starten" #~ msgid "Selected Text \"%s\"" #~ msgstr "Markierter Text »%s«" #~ msgid "Recent clipboards" #~ msgstr "Aktuelle Zwischenablagen" #~ msgid "Include recent selections" #~ msgstr "Kürzlich getroffene Auswahlen einschließen" #~ msgid "Text Matches" #~ msgstr "Übereinstimmungen im Text" #~ msgid "noun" #~ msgstr "Substantiv" #~ msgid "verb" #~ msgstr "Verb" #~ msgid "adjective" #~ msgstr "Adjektiv" #~ msgid "Directories" #~ msgstr "Ordner" #~ msgid "Exported Objects from Plugins" #~ msgstr "Von Plugins exportierte Objekte" #~ msgid "Interface" #~ msgstr "Schnittstelle" #~ msgid "Hide Kupfer when focus is lost" #~ msgstr "Kupfer verbergen, wenn Fenster nicht fokussiert ist" #~ msgid "Preferred terminal" #~ msgstr "Bevorzugtes Terminal" #~ msgid "" #~ "The preferred terminal emulator. It's used to launch the SSH sessions." #~ msgstr "" #~ "Die bevorzugte Terminalemulation. Sie wird zum Start von SSH-Sitzungen " #~ "verwendet." #~ msgid "" #~ "The flag which makes the terminal execute everything following it inside " #~ "the terminal (e.g. '-x' for gnome-terminal and terminal, '-e' for konsole " #~ "and urxvt)." #~ msgstr "" #~ "Das Argument, welches das Terminal anweist, alles Nachfolgende im Terminal " #~ "auszuführen (z.B. »-x« für gnome-terminal und terminal, »-e« für konsole " #~ "und urxvt)." #~ msgid "Tracker 0.8" #~ msgstr "Tracker 0.8" kupfer-v208/po/en.po000066400000000000000000000077171176220042200144370ustar00rootroot00000000000000# English translations for the kupfer package -- just for curly quotes # Copyright (C) 2012 Ulrik Sverdrup # This file is distributed under the same license as the kupfer package. (GPLv3) # msgid "" msgstr "" "Project-Id-Version: kupfer \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-02-25 17:33+0100\n" "PO-Revision-Date: 2009-06-23 20:19+0200\n" "Last-Translator: Ulrik Sverdrup \n" "Language-Team: (US) English\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Could not carry out ‘%s’" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "“%s” produced a result" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "No permission to run “%s” (not executable)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "Command in “%s” is not available" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "No matches in %(src)s for “%(query)s”" #: ../kupfer/ui/browser.py:1513 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "Make “%(action)s” Default for “%(object)s”" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1523 #, python-format msgid "Forget About \"%s\"" msgstr "Forget About “%s”" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Python module ‘%s’ is needed" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "Ulrik Sverdrup " #: ../kupfer/obj/fileactions.py:45 #, python-format msgid "Please use \"%s\"" msgstr "Please use “%s”" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:449 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "“%(text)s”" msgstr[1] "(%(num)d lines) “%(text)s”" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Compressed archive type for ‘Create Archive In’" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Calculate expressions starting with ‘=’" #: ../kupfer/plugin/clipboard.py:57 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Clipboard “%(desc)s”" msgstr[1] "Clipboard with %(num)d lines “%(desc)s”" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "Shelf of “Favorite” items" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Selected File “%s”" #: ../kupfer/plugin/triggers.py:6 msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Assign global keybindings (triggers) to objects created with ‘Compose " "Command’." #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Packages matching “%s”" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #, python-format msgid "Results for \"%s\"" msgstr "Results for “%s”" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Show More Results For “%s”" kupfer-v208/po/en_GB.po000066400000000000000000000105011176220042200147700ustar00rootroot00000000000000# British English translations for the kupfer package # Copyright (C) 2009--2010 Ulrik Sverdrup # This file is distributed under the same license as the kupfer package. (GPLv3) # msgid "" msgstr "" "Project-Id-Version: kupfer \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-05 18:33+0100\n" "PO-Revision-Date: 2009-06-23 20:19+0200\n" "Last-Translator: Ulrik Sverdrup \n" "Language-Team: British English\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #, python-format msgid "Could not to carry out '%s'" msgstr "Could not carry out ‘%s’" #, python-format msgid "\"%s\" produced a result" msgstr "“%s” produced a result" #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "No permission to run “%s” (not executable)" #, python-format msgid "Command in \"%s\" is not available" msgstr "Command in “%s” is not available" #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "No matches in %(src)s for “%(query)s”" #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "Make “%(action)s” Default for “%(object)s”" #. TRANS: Removing learned and/or configured bonus search score #, python-format msgid "Forget About \"%s\"" msgstr "Forget About “%s”" #. TRANS: Error message when Plugin needs a Python module to load #, python-format msgid "Python module '%s' is needed" msgstr "Python module ‘%s’ is needed" #, python-format msgid "Please use \"%s\"" msgstr "Please use “%s”" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "“%(text)s”" msgstr[1] "(%(num)d lines) “%(text)s”" msgid "Compressed archive type for 'Create Archive In'" msgstr "Compressed archive type for ‘Create Archive In’" msgid "Calculate expressions starting with '='" msgstr "Calculate expressions starting with ‘=’" #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Clipboard “%(desc)s”" msgstr[1] "Clipboard with %(num)d lines “%(desc)s”" #, python-format msgid "Selected File \"%s\"" msgstr "Selected File “%s”" msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Assign global keybindings (triggers) to objects created with ‘Compose " "Command’." #, python-format msgid "Packages matching \"%s\"" msgstr "Packages matching “%s”" #, python-format msgid "Results for \"%s\"" msgstr "Results for “%s”" #, python-format msgid "Show More Results For \"%s\"" msgstr "Show More Results For “%s”" msgid "Favorites" msgstr "Favourites" msgid "Mark commonly used items and store objects for later use" msgstr "" msgid "Shelf of \"Favorite\" items" msgstr "Shelf of “Favourite” items" msgid "Add to Favorites" msgstr "Add to Favourites" msgid "Add item to favorites shelf" msgstr "Add item to favourites shelf" msgid "Remove from Favorites" msgstr "Remove from Favourites" msgid "Remove item from favorites shelf" msgstr "Remove item from favourites shelf" msgid "Move to Trash" msgstr "Move to Wastebasket" msgid "Move this file to trash" msgstr "Move this file to the wastebasket" msgid "Trash" msgstr "Wastebasket" msgid "Access trash contents" msgstr "Access the content of the wastebasket" msgid "Restore" msgstr "" msgid "Move file back to original location" msgstr "" msgid "Trash is empty" msgstr "The wastebasket is empty" #. proper translation of plural #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "The wastebasket contains one file" msgstr[1] "The wastebasket contains %(num)s files" msgid "Shade" msgstr "" msgid "Unshade" msgstr "" msgid "Minimize" msgstr "Minimise" msgid "Unminimize" msgstr "Unminimise" msgid "Maximize" msgstr "Maximise" msgid "Unmaximize" msgstr "Unmaximise" msgid "Maximize Vertically" msgstr "Maximise Vertically" msgid "Unmaximize Vertically" msgstr "Unmaximise Vertically" msgid "Empty Trash" msgstr "Empty the Wastebasket" msgid "translator-credits" msgstr "Ulrik Sverdrup " kupfer-v208/po/es.po000066400000000000000000002746621176220042200144510ustar00rootroot00000000000000# Spanish translations for the kupfer package # Traduccion al Espanol para el paquete kupfer # Copyright (C) 2009 Ulrik Sverdrup # This file is distributed under the same license as the kupfer package. (GPLv3) # Ulrik Sverdrup , 2009. # Jorge González , 2009, 2010. # Daniel Mustieles , 2011, 2012. # msgid "" msgstr "" "Project-Id-Version: kupfer.master\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2012-02-25 19:02+0000\n" "PO-Revision-Date: 2012-02-27 14:52+0100\n" "Last-Translator: Daniel Mustieles \n" "Language-Team: Español \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../auxdata/kupfer.desktop.in.h:1 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Application Launcher" msgstr "Lanzador de aplicaciones" #: ../auxdata/kupfer.desktop.in.h:3 msgid "Convenient command and access tool for applications and documents" msgstr "Herramienta para acceso y manejo de aplicaciones y documentos" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Ejecutar en Kupfer" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Comando de Kupfer guardado" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Credenciales del usuario" #: ../data/credentials_dialog.ui.h:2 msgid "_User:" msgstr "_Usuario:" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "Contrase_ña:" #: ../data/credentials_dialog.ui.h:4 msgid "_Change" msgstr "_Cambiar" #: ../data/getkey_dialog.ui.h:1 msgid "Set Keyboard Shortcut" msgstr "Establecer atajo de teclado" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Pulse la combinación de teclas deseada" #: ../data/getkey_dialog.ui.h:3 msgid "Keybinding could not be bound" msgstr "No se puede vincular la combinación de teclas" #: ../data/preferences.ui.h:1 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Preferencias de Kupfer" #: ../data/preferences.ui.h:2 msgid "Start automatically on login" msgstr "Iniciar automáticamente al iniciar sesión" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Inicio" #: ../data/preferences.ui.h:4 msgid "Show icon in notification area" msgstr "Mostrar icono en el área de notificación" #: ../data/preferences.ui.h:5 msgid "Icon set:" msgstr "Conjunto de iconos:" #: ../data/preferences.ui.h:6 msgid "Terminal emulator:" msgstr "Emulador de la terminal:" #: ../data/preferences.ui.h:7 msgid "Desktop Environment" msgstr "Entorno de Escritorio" #: ../data/preferences.ui.h:8 ../kupfer/plugin/gmail/__init__.py:60 msgid "General" msgstr "General" #: ../data/preferences.ui.h:9 msgid "Global Keyboard Shortcuts" msgstr "Atajos de teclado globales" #: ../data/preferences.ui.h:10 ../kupfer/ui/preferences.py:849 msgid "Reset" msgstr "Restablecer" #: ../data/preferences.ui.h:11 msgid "Browser Keyboard Shortcuts" msgstr "Atajos de teclado del examinador" #: ../data/preferences.ui.h:12 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "Usar comandos de una sola tecla (espacio, /, punto, coma, etc.)" #: ../data/preferences.ui.h:13 msgid "Keyboard" msgstr "Teclado" #: ../data/preferences.ui.h:14 msgid "Plugins" msgstr "Complementos" #: ../data/preferences.ui.h:15 msgid "Inclusion in Top Level Searches" msgstr "Incluir en búsquedas de nivel superior" #: ../data/preferences.ui.h:16 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" "Las fuentes marcadas tienen sus objetos incluidos en los niveles superiores " "de búsqueda.\n" "Los contenidos de una fuente desmarcada sólo están disponibles encontrando " "su subcatálogo." #: ../data/preferences.ui.h:18 msgid "Indexed Folders" msgstr "Carpetas indexadas" #: ../data/preferences.ui.h:19 msgid "Folders whose files are always available in the catalog." msgstr "Carpetas cuyos archivos están siempre disponibles en el catálogo." #: ../data/preferences.ui.h:20 ../kupfer/obj/sources.py:156 msgid "Catalog" msgstr "Catálogo" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "No se pudo ejecutar «%s»" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "«%s» genera un resultado" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "No se tienen permisos para ejecutar «%s» (no es ejecutable)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "El comando «%s» no está disponible" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "La transmisión de teclado está activa para la pantalla %s" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "no mostrar interfaz principal al iniciar" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "lista de complementos disponibles" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "activar mensajes de depuración" #. TRANS: --exec-helper=HELPER is an internal command #. TRANS: that executes a helper program that is part of kupfer #: ../kupfer/main.py:49 msgid "run plugin helper" msgstr "ejecutar plugin-helper" #: ../kupfer/main.py:52 msgid "show usage help" msgstr "mostrar ayuda de uso" #: ../kupfer/main.py:53 msgid "show version information" msgstr "mostrar información de la versión" #: ../kupfer/main.py:59 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Uso: kupfer [OPCIONES | ARCHIVO ...]" #: ../kupfer/main.py:70 msgid "Available plugins:" msgstr "Complementos disponibles:" #: ../kupfer/main.py:121 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "Activación alternativa" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Truco de la coma" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Componer comando" #: ../kupfer/ui/accelerators.py:11 msgid "Mark Default Action" msgstr "Marcar la acción predeterminada" #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "Olvidar objeto" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Restablecer todo" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Seleccionar Salir" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Seleccionar Archivo seleccionado" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Seleccionar Texto seleccionado" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Mostrar ayuda" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Mostrar las preferencias" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "Cambiar al primer panel" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Conmutar el modo texto" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s está vacío" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "No hay coincidencias en %(src)s para «%(query)s»" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "No hay coincidencias" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Teclear para buscar" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Teclear para buscar %s" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Sin acción" #: ../kupfer/ui/browser.py:1513 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "Hacer «%(action)s» predeterminada para «%(object)s»" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1523 #, python-format msgid "Forget About \"%s\"" msgstr "Olvidarse de «%s»" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1960 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Mostrar la interfaz principal" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Mostrar con selección" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Descripción" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Autor" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Versión" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Se necesita el módulo de Python «%s»" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "No se puede leer el complemento debido al error:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "desactivado" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Contenido de" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Fuentes" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Acciones" #: ../kupfer/ui/preferences.py:575 #, python-format msgid "Using encrypted password storage: %s" msgstr "Usando contraseña de almacenamiento cifrada: %s" #: ../kupfer/ui/preferences.py:577 #, python-format msgid "Using password storage: %s" msgstr "Usando contraseña de almacenamiento: %s" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:594 msgid "Configuration" msgstr "Configuración" #: ../kupfer/ui/preferences.py:614 msgid "Set username and password" msgstr "Establecer el nombre de usuario y la contraseña" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:668 msgid "Choose a Directory" msgstr "Elegir un directorio" #: ../kupfer/ui/preferences.py:847 msgid "Reset all shortcuts to default values?" msgstr "" "¿Quiere restablecer todos los atajos de teclado a los valores " "predeterminados?" #: ../kupfer/ui/preferences.py:855 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Comando" #: ../kupfer/ui/preferences.py:856 msgid "Shortcut" msgstr "Atajo" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "" "Daniel Mustieles , 2011\n" "Jorge González , 2009-2011\n" "Leandro Leites \n" "Jesús Barbero Rodríguez " #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Un lanzador de aplicaciones libre (GPLv3+)" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\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" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "No se pudo encontrar un Kupfer en ejecución" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 msgid "Text" msgstr "Texto" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Ejecutar después de un retraso…" #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Ejecutar un comando después de un intervalo de tiempo especificado" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Objetos múltiples" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s objeto" msgstr[1] "%s objetos" #: ../kupfer/obj/contacts.py:129 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/contacts.py:131 msgid "unknown" msgstr "desconocido" #: ../kupfer/obj/contacts.py:144 #| msgid "Vim" msgid "Aim" msgstr "Aim" #: ../kupfer/obj/contacts.py:151 #| msgid "Google Translate" msgid "Google Talk" msgstr "Google Talk" #: ../kupfer/obj/contacts.py:159 msgid "ICQ" msgstr "ICQ" #: ../kupfer/obj/contacts.py:166 msgid "MSN" msgstr "MSN" #: ../kupfer/obj/contacts.py:173 msgid "QQ" msgstr "QQ" #: ../kupfer/obj/contacts.py:180 msgid "Yahoo" msgstr "Yahoo" #. -*- coding: UTF-8 -*- #: ../kupfer/obj/contacts.py:187 ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "%s no soporta esta operación" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "No se puede usar con varios objetos" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:176 msgid "Open" msgstr "Abrir" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "No existe una aplicación predeterminada para %(file)s (%(type)s)" #: ../kupfer/obj/fileactions.py:45 #, python-format msgid "Please use \"%s\"" msgstr "Use «%s»" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Establecer aplicación predeterminada…" #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Abrir con la aplicación predeterminada" #: ../kupfer/obj/fileactions.py:74 msgid "Reveal" msgstr "Mostrar" #: ../kupfer/obj/fileactions.py:83 msgid "Open parent folder" msgstr "Abrir carpeta padre" #: ../kupfer/obj/fileactions.py:89 msgid "Open Terminal Here" msgstr "Abrir terminal aquí" #: ../kupfer/obj/fileactions.py:102 msgid "Open this location in a terminal" msgstr "Abrir esta ubicación en una terminal" #: ../kupfer/obj/fileactions.py:110 msgid "Run in Terminal" msgstr "Ejecutar en un terminal" #: ../kupfer/obj/fileactions.py:110 msgid "Run (Execute)" msgstr "Ejecutar" #: ../kupfer/obj/fileactions.py:130 msgid "Run this program in a Terminal" msgstr "Ejecutar este programa en una terminal" #: ../kupfer/obj/fileactions.py:132 msgid "Run this program" msgstr "Ejecutar este programa" #: ../kupfer/obj/objects.py:252 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 ../kupfer/plugin/vim/plugin.py:172 msgid "Go To" msgstr "Ir a" #: ../kupfer/obj/objects.py:278 msgid "Open URL" msgstr "Abrir URL" #: ../kupfer/obj/objects.py:289 msgid "Open URL with default viewer" msgstr "Abrir URL con el visor predeterminado" #: ../kupfer/obj/objects.py:303 msgid "Launch" msgstr "Lanzar" #: ../kupfer/obj/objects.py:316 msgid "Show application window" msgstr "Mostrar la ventana de la aplicación" #: ../kupfer/obj/objects.py:317 msgid "Launch application" msgstr "Iniciar aplicación" #: ../kupfer/obj/objects.py:328 msgid "Launch Again" msgstr "Iniciar de nuevo" #: ../kupfer/obj/objects.py:335 msgid "Launch another instance of this application" msgstr "Iniciar otra instancia de esta aplicación" #: ../kupfer/obj/objects.py:341 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Cerrar" #: ../kupfer/obj/objects.py:349 msgid "Attempt to close all application windows" msgstr "Intentar cerrar todas las ventanas de la aplicación" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:396 msgid "Run" msgstr "Ejecutar" #: ../kupfer/obj/objects.py:406 msgid "Perform command" msgstr "Ejecutar comando" #: ../kupfer/obj/objects.py:419 msgid "(Empty Text)" msgstr "(Texto vacío)" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:449 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "\"%(text)s\"" msgstr[1] "(%(num)d líneas) \"%(text)s\"" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s et. al." #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Fuente recursiva de %(dir)s, (%(levels)d niveles)" #: ../kupfer/obj/sources.py:108 #, python-format msgid "Directory source %s" msgstr "Directorio inicial %s" #: ../kupfer/obj/sources.py:118 msgid "Home Folder" msgstr "Carpeta personal" #: ../kupfer/obj/sources.py:129 msgid "Catalog Index" msgstr "Índice del Catálogo" #: ../kupfer/obj/sources.py:144 msgid "An index of all available sources" msgstr "Un índice de todas las fuentes disponibles" #: ../kupfer/obj/sources.py:176 msgid "Root catalog" msgstr "Catálogo Raíz" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Configurar el complemento" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "El complemento %s no está configurado" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "Las credenciales de usuario no son válidas para %s" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Aplicaciones" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Todas las aplicaciones y preferencias" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Aplicaciones para el entorno de escritorio" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Abrir con…" #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Abrir con una aplicación" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "" "Establecer la aplicación predeterminada para abrir este tipo de archivo" #: ../kupfer/plugin/archivemanager.py:1 msgid "Archive Manager" msgstr "Gestor de archivadores" #: ../kupfer/plugin/archivemanager.py:9 msgid "Use Archive Manager actions" msgstr "Usar acciones del Gestor de archivadores" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Tipo de archivo comprimido para «Crear archivador en»" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Extraer aquí" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Extraer archivador comprimido" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Crear archivador" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Crear un archivador comprimido desde carpeta" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Crear archivador en…" #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Archivador" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Calculadora" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Calcular expresión empezando por «=»" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Calcular" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:112 msgid "Clipboards" msgstr "Portapapeles" #: ../kupfer/plugin/clipboard.py:4 msgid "Recent clipboards and clipboard proxy objects" msgstr "Portapapeles recientes y objetos proxy del portapapeles" #: ../kupfer/plugin/clipboard.py:24 msgid "Number of recent clipboards to remember" msgstr "Numero de portapapeles recientes que recordar" #: ../kupfer/plugin/clipboard.py:30 msgid "Include selected text in clipboard history" msgstr "Incluir el texto seleccionado en el histórico del portapapeles" #: ../kupfer/plugin/clipboard.py:36 msgid "Copy selected text to primary clipboard" msgstr "Copiar el texto seleccionado al portapapeles primario" #: ../kupfer/plugin/clipboard.py:47 msgid "Selected Text" msgstr "Texto seleccionado" #: ../kupfer/plugin/clipboard.py:57 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Portapapeles \"%(desc)s\"" msgstr[1] "Portapapeles con %(num)d líneas «%(desc)s»" #: ../kupfer/plugin/clipboard.py:64 msgid "Clipboard Text" msgstr "Texto del portapapeles" #: ../kupfer/plugin/clipboard.py:74 msgid "Clipboard File" msgstr "Archivo del portapapeles" #: ../kupfer/plugin/clipboard.py:84 msgid "Clipboard Files" msgstr "Archivos del portapapeles" #: ../kupfer/plugin/clipboard.py:92 msgid "Clear" msgstr "Limpiar" #: ../kupfer/plugin/clipboard.py:104 msgid "Remove all recent clipboards" msgstr "Limpiar todos los elementos recientes en el portapapeles" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Comandos de consola" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" "Ejecutar programas de línea de comandos. Las acciones marcadas con el " "símbolo «%s» se ejecutan en una subterminal." #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Ejecutar (obtener salida)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Ejecutar un programa y obtener su salida" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 msgid "Pass to Command..." msgstr "Enviar a un comando…" #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "Ejecutar programa con un objeto como un parámetro adicional" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 msgid "Write to Command..." msgstr "Redirigir a un comando…" #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 msgid "Run program and supply text on the standard input" msgstr "Ejecutar programa y proporcionar texto en la salida extándar" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "Filtrar a través de un comando…" #: ../kupfer/plugin/commands.py:215 msgid "Run command-line programs" msgstr "Ejecutar programas de línea de comandos" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "GTK+" #: ../kupfer/plugin/core/alternatives.py:13 msgid "GNOME Terminal" msgstr "Terminal de GNOME" #: ../kupfer/plugin/core/alternatives.py:22 msgid "XFCE Terminal" msgstr "Terminal de XFCE" #: ../kupfer/plugin/core/alternatives.py:31 msgid "LXTerminal" msgstr "LXTerminal" #: ../kupfer/plugin/core/alternatives.py:40 msgid "X Terminal" msgstr "Terminal X" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "Urxvt" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Guardar como…" #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Salir" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Salir de Kupfer" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "Acerca de Kupfer" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Mostrar información de los autores y licencia de Kupfer" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Ayuda de Kupfer" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Obtener ayuda sobre Kupfer" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Mostrar la ventana de preferencias de Kupfer" #: ../kupfer/plugin/core/__init__.py:64 msgid "Search Contents" msgstr "Buscar contenido" #: ../kupfer/plugin/core/__init__.py:82 msgid "Search inside this catalog" msgstr "Buscar dentro del catálogo" #: ../kupfer/plugin/core/__init__.py:90 msgid "Copy" msgstr "Copiar" #: ../kupfer/plugin/core/__init__.py:105 msgid "Copy to clipboard" msgstr "Copiar al portapapeles" #: ../kupfer/plugin/core/__init__.py:127 msgid "Rescan" msgstr "Rescanear" #: ../kupfer/plugin/core/__init__.py:142 msgid "Force reindex of this source" msgstr "Forzar reindexación de esta fuente" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Último comando" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Objetos internos de Kupfer" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Último resultado" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Resultados del comando" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Diccionario" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Buscar palabra en el diccionario" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Buscar" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Documentos" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "Documentos recientemente usados y carpetas en marcadores" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "Días máximos de documentos recientes" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Elementos recientes" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Documentos usados recientemente" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "Documentos %s" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Documentos recientes para %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Lugares" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Carpetas marcadas" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Marcadores de Epiphany" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Índice de marcadores de Epiphany" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Favoritos" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "" "Marcar elementos usados comúnmente y almacenar objetos para un uso posterior" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "Cajón de elementos favoritos" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Agregar a favoritos" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Añadir elementos al cajón de favoritos" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Quitar de favoritos" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Quitar elemento del cajón de favoritos" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Acciones sobre archivos" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Más acciones sobre archivos" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:211 msgid "Move To..." msgstr "Mover a…" #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:253 msgid "Move file to new location" msgstr "Mover archivo a ubicación nueva" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Renombrar a…" #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:166 msgid "Copy To..." msgstr "Copiar a…" #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:207 msgid "Copy file to a chosen location" msgstr "Copiar archivo a una ubicación elegida" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Marcadores de Firefox" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Índice de marcadores de Firefox" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "Incluir sitios visitados" #. TRANS: Multihead refers to support for multiple computer displays #. TRANS: In this case, it only concerns the special configuration #. TRANS: with multiple X "screens" #: ../kupfer/plugin/multihead.py:4 msgid "Multihead Support" msgstr "Soporte multipantalla" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Archivo seleccionado" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" "Proporciona la selección actual de Nautilus usando la extensión Kupfer " "Nautilus" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Archivo seleccionado «%s»" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Archivos seleccionados" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Notas" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Notas de GNote o Tomboy" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Trabajar con aplicación" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Abrir con la aplicación de notas" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Añadir a nota…" #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Añadir texto a una nota existente" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Crear nota" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Crear una nota nueva desde este texto" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Obtener los resultados de búsqueda de notas…" #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "Mostrar los resultados de búsqueda para esta consulta" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "hoy, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "ayer, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Última actualización %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "Reproducir, encolar pistas y navegar la biblioteca de música" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Incluir artistas en nivel superior" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Incluir álbum en nivel superior" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Incluir canciones en nivel superior" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Reproducir" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Continuar reproducción en Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Pausar" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Pausar reproducción en Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Siguiente" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Saltar a la pista siguiente en Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Anterior" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Saltar a la pista anterior en Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Mostrar en reproducción" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Mostrar qué canción se esta reproduciendo" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Limpiar la cola" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Reproducir pistas en Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Encolar" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Añade pistas a la cola de reproducción" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "por %(artist)s de %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "por %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Pistas por %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Álbumes" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Álbumes en la biblioteca de Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Artistas" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Artistas en la biblioteca de Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Canciones" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Canciones en la biblioteca de Rhythmbox" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "Gestión de la sesión de GNOME" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "Elementos y acciones especiales para el entorno GNOME" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Cerrar sesión…" #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Cerrar sesión o cambiar de usuario" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Apagar…" #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Apagar, reiniciar o suspender el equipo" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Bloquear pantalla" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Iniciar salvapantallas y bloquear" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "Gestión de la sesión de XFCE" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Elementos y acciones especiales para el entorno XFCE" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Mostrar texto" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:58 msgid "Display text in a window" msgstr "Mostrar el texto en una ventana" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Tipo grande" #: ../kupfer/plugin/show_text.py:66 msgid "Show Notification" msgstr "Mostrar notificación" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Papelera" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Acceder al contenido de la papelera" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Mover a la papelera" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Mover este archivo a la papelera" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Restaurar" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Mover archivo a ubicación original" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "La papelera está vacía" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "La papelera contiene un archivo" msgstr[1] "La papelera contiene %(num)s archivos" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Disparadores" #: ../kupfer/plugin/triggers.py:6 msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Asignar combinaciones de teclas globales (disparadores) a objetos creados " "con «Editar comando»." #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Añadir disparados…" #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Quitar disparador" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "Acciones de URL" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Descargar y abrir" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Descargar en…" #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "Descargar URL en una ubicación determinada" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Volúmenes y discos" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Volúmenes montados y discos" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Volumen montado en %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Desmontar" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Desmontar este volumen" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Expulsar" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Desmontar y expulsar el medio" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Buscar en la web" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Buscar en la web con motores de búsqueda OpenSearch" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Buscar con…" #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Buscar…" #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Motores de búsqueda" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Buscar en Wikipedia" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Idioma de Wikipedia" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "es" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Buscar este término en %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Lista de ventanas" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Todas las ventanas en todas las áreas de trabajo" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Activar" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Enrollar" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Desenrollar" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Minimizar" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Desminimizar" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Maximizar" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Desmaximizar" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Maximizar verticamente" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Desmaximizar verticalmente" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Ventana en %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Ventana de primer plano" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Siguiente ventana" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Saltar al área de trabajo de esta ventana y dar foco" #: ../kupfer/plugin/windows.py:252 #, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "%d ventana" msgstr[1] "%d ventanas" #: ../kupfer/plugin/windows.py:256 msgid "Active workspace" msgstr "Área de trabajo activa" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Saltar a este área de trabajo" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Áreas de trabajo" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Documentos recientemente utilizados en Abiword" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Documentos recientes de Abiword" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Interfaz con el gestor de paquetes APT" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Método de instalación" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Mostrar información del paquete" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Instalar" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Instalar el paquete usando el método configurado" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Paquetes que coinciden con «%s»" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Buscar paquete por nombre…" #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "Archivadores profundos" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Permitir examinar dentro de archivadores comprimidos" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "Contenido de %s" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "Conjunto de iconos ASCII y Unicode" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" "Proporcionar el conjunto de iconos ASCII y Unicode que usan letras y " "símbolos para producir iconos para los objetos encontrados en Kupfer." #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "ASCII" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "Unicode" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Controlar la reproducción y listas de reproducción de Audacious" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Añadir pistas a la cola de reproducción de Audacious" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Dequeue" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Quitar pistas de la cola de reproducción de Audacious" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Saltar a la pista siguiente en Audacious" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Continuar reproducción en Audacious" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Pausar reproducción en Audacious" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Saltar a la pista siguiente en Audacious" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Saltar a la pista anterior en Audacious" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Limpiar la cola de reproducción de Audacious" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Aleatorio" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Conmutar la reproducción aleatoria en Audacious" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Repetir" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Conmutar la repetición en Audacious" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Lista de reproducción" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Marcadores de Chromium" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Índice de marcadores de Chromium" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Contactos y acciones de Claws Mail" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Redactar un correo electrónico nuevo" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Redactar un correo electrónico nuevo con Claws Mail" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Recibir todos los correos" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "Recibir correo nuevo para todas las cuentas de Claws Mail" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "Redactar un correo nuevo" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "Enviar un correo-e a…" #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Redactar mensaje nuevo con Claws Mail y adjuntar el archivo" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Libreta de direcciones de Claws Mail" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Contactos desde la libreta de direcciones de Claws Mail" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 msgid "Custom Terminal" msgstr "Terminal personalizada" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "Configurar un emulador de terminal personalizada" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "Ejecutar opción" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "Tema personalizado" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "Usar un tema de color personalizado" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "Tema:" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Cliente de correo-e predeterminado" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "" "Redactar un correo-e usando el manejador predeterminado del sistema para " "«mailto:»" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Buscar en Devhelp" #: ../kupfer/plugin/duckduckgo.py:5 ../kupfer/plugin/duckduckgo.py:19 msgid "DuckDuckGo Search" msgstr "Busqueda DuckDuckGo" #: ../kupfer/plugin/duckduckgo.py:8 ../kupfer/plugin/duckduckgo.py:30 msgid "Search the web securely with DuckDuckGo" msgstr "Buscar en la web con seguridad usando DuckDuckGo" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "Empathy" #: ../kupfer/plugin/empathy.py:6 msgid "Access to Empathy Contacts" msgstr "Acceder a los contactos de Empathy" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Mostrar contactos desconectados" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Disponible" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Ausente" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Ocupado" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "No disponible" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Invisible" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Desconectado" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:93 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:197 msgid "Open Chat" msgstr "Abrir chat" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:121 #: ../kupfer/plugin/skype.py:243 msgid "Change Global Status To..." msgstr "Cambiar estado general a…" #: ../kupfer/plugin/empathy.py:171 msgid "Empathy Contacts" msgstr "Contactos de Empathy" #: ../kupfer/plugin/empathy.py:237 msgid "Empathy Account Status" msgstr "Estado de las cuentas de Empathy" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Contactos de Evolution" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Escribir un mensaje nuevo en Evolution" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Redactar mensaje nuevo con Evolution y adjuntar el archivo" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Libreta de direcciones de Evolution" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Mostrar sitios y gestionar direcciones FTP con Filezilla" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Abrir un sitio con Filezilla" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Sitios Filezilla" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Sitios de Filezilla" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Acceder a los contactos de Gajim" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Disponible para conversar" #: ../kupfer/plugin/gajim.py:149 msgid "Gajim Contacts" msgstr "Contactos de Gajim" #: ../kupfer/plugin/gajim.py:213 msgid "Gajim Account Status" msgstr "Estado de las cuentas de Gajim" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "Glob" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:234 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "Cargar contactos y redactar un correo-e nuevo en GMail" #: ../kupfer/plugin/gmail/__init__.py:33 msgid "Load contacts' pictures" msgstr "Cargar las imágenes de los contactos" #: ../kupfer/plugin/gmail/__init__.py:39 #| msgid "show version information" msgid "Load additional information" msgstr "Cargar información adicional" #: ../kupfer/plugin/gmail/__init__.py:50 msgid "Work email" msgstr "Correo-e del trabajo" #: ../kupfer/plugin/gmail/__init__.py:51 #| msgid "Compose Email" msgid "Home email" msgstr "Correo-e personal" #: ../kupfer/plugin/gmail/__init__.py:52 #| msgid "Opera Mail" msgid "Other email" msgstr "Otro correo-e" #: ../kupfer/plugin/gmail/__init__.py:54 #| msgid "Workspaces" msgid "Work address" msgstr "Dirección del trabajo" #: ../kupfer/plugin/gmail/__init__.py:55 #| msgid "Home Folder" msgid "Home address" msgstr "Dirección personal" #: ../kupfer/plugin/gmail/__init__.py:56 msgid "Other address" msgstr "Otra dirección" #: ../kupfer/plugin/gmail/__init__.py:58 #| msgid "Mark Done" msgid "Car phone" msgstr "Teléfono del coche" #: ../kupfer/plugin/gmail/__init__.py:59 msgid "Fax" msgstr "Fax" #: ../kupfer/plugin/gmail/__init__.py:61 #| msgid "Home Folder" msgid "Home phone" msgstr "Teléfono personal" #: ../kupfer/plugin/gmail/__init__.py:62 msgid "Home fax" msgstr "Fax personal" #: ../kupfer/plugin/gmail/__init__.py:63 msgid "Internal phone" msgstr "Teléfono interno" #: ../kupfer/plugin/gmail/__init__.py:64 msgid "Mobile" msgstr "Móvil" #: ../kupfer/plugin/gmail/__init__.py:65 msgid "Other" msgstr "Otro" #: ../kupfer/plugin/gmail/__init__.py:66 msgid "VOIP" msgstr "VOIP" #: ../kupfer/plugin/gmail/__init__.py:67 #| msgid "Mark Done" msgid "Work phone" msgstr "Teléfono del trabajo" #: ../kupfer/plugin/gmail/__init__.py:68 msgid "Work fax" msgstr "Fax del trabajo" #: ../kupfer/plugin/gmail/__init__.py:93 msgid "Compose Email in Gmail" msgstr "Redactar un correo-e en GMail" #: ../kupfer/plugin/gmail/__init__.py:117 msgid "Open web browser and compose new email in Gmail" msgstr "Abrir el navegador web y redactar un correo-e nuevo en GMail" #: ../kupfer/plugin/gmail/__init__.py:123 msgid "Edit Contact in Gmail" msgstr "Editar contacto en Gmail" #: ../kupfer/plugin/gmail/__init__.py:133 msgid "Open web browser and edit contact in Gmail" msgstr "Abrir el navegador web y editar contacto en GMail" #: ../kupfer/plugin/gmail/__init__.py:263 msgid "Contacts from Google services (Gmail)" msgstr "Contactos de los servicios de Google (GMail)" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "Perfiles de la terminal de GNOME" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "Lanzar los perfiles de la terminal de GNOME" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Mostrar álbumes y subir archivos a Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "Usuarios para mostrar: (, -separados)" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Cargar los iconos de usuario y de álbumes" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Subiendo imágenes" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Subiendo imágenes al álbum en Picasa Web" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Creando álbum:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Álbum creado por Kupfer" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Archivo:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "Un álbum" msgstr[1] "%(num)d álbumes" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "una foto" msgstr[1] "%(num)s fotos" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Subir a un álbum en Picasa…" #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Subir archivos al álbum de Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Subir a Picasa como un álbum nuevo" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Crear un álbum desde la carpeta local seleccionada" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Álbumes de Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Álbumes de usuario en Picasa" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Google Search" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Buscar en Google mostrando directamente los resultados" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #, python-format msgid "Results for \"%s\"" msgstr "Resultados para «%s»" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Mostrar más resultados para «%s»" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "%s encontradas en total" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "Examinar y crear tareas nuevas en GTG" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "vence: %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "inicio: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "etiquetas: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Abrir tarea en Getting Things GNOME" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Eliminar" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Quitar permanentemente esta tarea" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Marcar como realizada" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Marcar esta tarea como realizada" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Descartar" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Marcar esta tarea como para no realizar" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Crear tarea" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Crear una tarea nueva en Getting Things GNOME" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "Gwibber" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" "Microblogging con Gwibber. Permite enviar y recibir mensajes de redes " "sociales como Twitter, Identi.ca etc. Requiere el paquete «gwibber-service»." #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "Número máximo de mensajes que mostrar" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s en %(service)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s en %(where)s" #: ../kupfer/plugin/gwibber.py:187 msgid "Send Message" msgstr "Enviar mensaje" #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "Enviar mensaje a todas las cuentas de Gwibber" #: ../kupfer/plugin/gwibber.py:210 msgid "Send Message To..." msgstr "Enviar mensaje a…" #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "Enviar mensaje a una cuenta de Gwibber" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Enviar mensaje…" #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "Enviar mensaje a la cuenta de Gwibber seleccionada" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Responder…" #: ../kupfer/plugin/gwibber.py:314 msgid "Delete Message" msgstr "Eliminar mensaje" #: ../kupfer/plugin/gwibber.py:337 msgid "Send Private Message..." msgstr "Enviar mensaje privado…" #: ../kupfer/plugin/gwibber.py:370 msgid "Send direct message to user" msgstr "Enviar mensaje directo al usuario" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "Replicar" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet To..." msgstr "Replicar a…" #: ../kupfer/plugin/gwibber.py:407 msgid "Retweet message to all Gwibber accounts" msgstr "Replicar mensaje a todas las cuentas de Gwibber" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "Replicar mensaje a una cuenta de Gwibber" #: ../kupfer/plugin/gwibber.py:413 msgid "Open in Browser" msgstr "Abrir en el navegador" #: ../kupfer/plugin/gwibber.py:419 msgid "Open message in default web browser" msgstr "Abrir mensaje en el navegador web predeterminado" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 msgid "Gwibber Accounts" msgstr "Cuentas de Gwibber" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "Cuentas configuradas en Gwibber" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "Mensajes de Gwibber" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "Mensajes recientes recibidos por Gwibber" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "Mensajes de Gwibber para %s" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "Flujos de Gwibber" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "Flujos configurados en Gwibber" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "Mensajes de Gwibber en %s" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "Gwibber (simple)" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "Enviar actualizaciones a través del cliente de microblogging Gwibber" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "Enviar actualización" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "No se pudo activar el servicio Gwibber" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Acciones de nivel más alto" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Herramientas para trabajar como comandos como objetos" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Seleccionar en Kupfer" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Resultado de %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Ejecutar (obtener el resultado)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Tomar el resultado del comando como un objeto del proxy" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Ejecutar (descartar resultado)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Herramientas de imagen" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Herramientas de transformación de imagen" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Escalar…" #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Escalar imagen para ajustar dentro de las medidas dadas" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Rotar en el sentido de las agujas del reloj" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Rotar en sentido contrario a las agujas de reloj" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Rotar automáticamente" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Rotar JPEG (en el sitio) respecto a su metadatos EXIF" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Complementos de Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Acceder a la lista de complementos de Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Mostrar información" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Mostrar el código fuente" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "activado" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Localizar archivos" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Buscar en el sistema de archivos usando locate" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Ignorar capitalización al buscar archivos" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "OpenOffice / LibreOffice" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Documentos usados recientemente en OpenOffice/LibreOffice" #: ../kupfer/plugin/openoffice.py:83 msgid "OpenOffice/LibreOffice Recent Items" msgstr "Elementos recientes de OpenOffice/LibreOffice" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera Mail" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Contactos y acciones de Opera Mail" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Redactar un correo electrónico nuevo con Opera Mail" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Contactos de Opera Mail" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Contactos de Opera Mail" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Marcadores de Opera" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Índice de marcadores de Opera" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Acceder a los contactos de Pidgin" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d carácter)" msgstr[1] "%s (%d carácteres)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Contactos de Pidgin" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "Sesiones PuTTY" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Acceso rápido a sesiones de PuTTY" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Iniciar sesión" #: ../kupfer/plugin/qsicons/__init__.py:24 msgid "Quicksilver Icons" msgstr "Iconos Quicksilver" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "Visor rápido de imágenes" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "Ver imagen" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "TextoRestructurado" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "Renderizar TextoRestructurado y mostrar el resultado" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Ver como documento HTML" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "Sesiones activas de GNU Screen" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Adjunto" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "No adjunto" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "sesión %(status)s %(pid)s) creada %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Sesiones de Screen" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Adjuntar" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:52 msgid "Send Keys" msgstr "Enviar teclas" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "Enviar eventos sintéticos de teclado usando xautomation" #: ../kupfer/plugin/sendkeys.py:28 msgid "Paste to Foreground Window" msgstr "Pegar en la ventana de primer plano" #: ../kupfer/plugin/sendkeys.py:46 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "Copiar al portapapeles y enviar Ctrl+V a la ventana en primer plano" #: ../kupfer/plugin/sendkeys.py:101 msgid "Send keys to foreground window" msgstr "Enviar teclas a la ventana en primer plano" #: ../kupfer/plugin/sendkeys.py:106 msgid "Type Text" msgstr "Escribir texto" #: ../kupfer/plugin/sendkeys.py:127 msgid "Type the text to foreground window" msgstr "Escribir el texto en la ventana en primer plano" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Servicios del sistema" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "" "Iniciar, parar o reiniciar servicios del sistema a través de init scripts" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Comandos del tipo sudo" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Iniciar servicio" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Reiniciar servicio" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Parar servicio" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "Servicio %s" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Acortar enlaces" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Crear alias cortos para URL largas" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Error" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Acortar con…" #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Servicios" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 msgid "Show QRCode" msgstr "Mostrar el código QR" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 msgid "Display text as QRCode in a window" msgstr "Mostrar texto como código QR en una ventana" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Acceder a los contactos de Skype" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Eskypéame" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Cerró la sesión" #: ../kupfer/plugin/skype.py:179 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:218 msgid "Call" msgstr "Llamar" #: ../kupfer/plugin/skype.py:232 msgid "Place a call to contact" msgstr "Llamar al contacto" #: ../kupfer/plugin/skype.py:267 msgid "Skype Contacts" msgstr "Contactos de Skype" #: ../kupfer/plugin/skype.py:287 msgid "Skype Statuses" msgstr "Estados de Skype" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "Servidores SSH" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "Añadir los servidores SSH encontrados en ~/.ssh/config." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "Servidor SSH" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Conectar" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "Conectar al servidor SSH" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "Servidores SSH especificados en ~/.ssh/config" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Sin conexión de D-Bus con la sesión del escritorio" #: ../kupfer/plugin_support.py:171 msgid "GNOME Keyring" msgstr "Depósito de claves de GNOME" #: ../kupfer/plugin_support.py:172 msgid "KWallet" msgstr "KWallet" #: ../kupfer/plugin_support.py:173 msgid "Unencrypted File" msgstr "Archivo no cifrado" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Plantillas de documentos" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Crear documentos nuevos desde sus plantillas" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "Plantilla de %s" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Archivo vacío" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Carpeta nueva" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Crear un documento nuevo…" #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Crear un documento nuevo desde una plantilla" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Crear documento en…" #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "Archivos de texto" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Añadir a…" #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Añadir…" #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Escribir a…" #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Obtener el contenido del texto" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:185 #: ../kupfer/plugin/thunar.py:225 ../kupfer/plugin/thunar.py:278 #: ../kupfer/plugin/thunar.py:329 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:11 msgid "File manager Thunar actions" msgstr "Acciones Thunar del gestor de archivos" #: ../kupfer/plugin/thunar.py:67 msgid "Select in File Manager" msgstr "Seleccionar en el gestor de archivos" #: ../kupfer/plugin/thunar.py:95 msgid "Show Properties" msgstr "Mostrar las propiedades" #: ../kupfer/plugin/thunar.py:118 msgid "Show information about file in file manager" msgstr "Mostrar información acerca del archivo en el gestor de archivos" #: ../kupfer/plugin/thunar.py:127 msgid "Send To..." msgstr "Enviar a…" #: ../kupfer/plugin/thunar.py:259 msgid "Symlink In..." msgstr "Crear enlace simbólico en…" #: ../kupfer/plugin/thunar.py:300 msgid "Create a symlink to file in a chosen location" msgstr "Crear un enlace simbólico a un archivo en la ubicación elegida" #: ../kupfer/plugin/thunar.py:304 msgid "Empty Trash" msgstr "Vacía la papelera" #: ../kupfer/plugin/thunar.py:344 msgid "Thunar Send To Objects" msgstr "Objetos enviar a de Thunar" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Contactos y acciones de Thunderbird/Icedove" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Escribir un mensaje nuevo en Thunderbird" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Libreta de direcciones de Thunderbird" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Contactos de la libreta de direcciones de Thunderbird" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Top" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Mostrar las tareas en ejecución y permitir mandarlas señales" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Ordenación" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Línea de comandos" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "Uso de CPU (descendiente)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Uso de memoria (descendiente)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Enviar señal…" #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Señales" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Tareas en ejecución" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% tiempo: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Tareas en ejecución para el usuario actual" #: ../kupfer/plugin/tracker1.py:10 msgid "Tracker" msgstr "Tracker" #: ../kupfer/plugin/tracker1.py:18 ../kupfer/plugin/tracker.py:15 msgid "Tracker desktop search integration" msgstr "Integración con la búsqueda de escritorio Tracker" #: ../kupfer/plugin/tracker1.py:49 ../kupfer/plugin/tracker.py:41 msgid "Search in Tracker" msgstr "Buscar en Tracker" #: ../kupfer/plugin/tracker1.py:54 ../kupfer/plugin/tracker.py:46 msgid "Open Tracker Search Tool and search for this term" msgstr "Abrir herramienta de búsqueda de Tracker" #: ../kupfer/plugin/tracker1.py:62 ../kupfer/plugin/tracker.py:55 msgid "Get Tracker Results..." msgstr "Obtener resultados de Tracker…" #: ../kupfer/plugin/tracker1.py:71 ../kupfer/plugin/tracker.py:64 msgid "Show Tracker results for query" msgstr "Mostrar resultados de Tracker para la consulta" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Etiquetas de Tracker" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Etiquetas de Tracker" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Examinar las etiquetas de Tracker" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "Etiqueta %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Objetos con etiqueta %s en Tracker" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Añadir etiqueta…" #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Añadir etiqueta Tracker al archivo" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Quitar etiqueta…" #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Quitar etiqueta Tracker del archivo" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Volúmenes en el histórico de TrueCrypt" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "Volumen TrueCrypt: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Montar volumen" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Montar en TrueCrypt" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Intentar montar el archivo como un volumen TrueCrypt" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Desmontar todos los volúmenes" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "Volúmenes TrueCrypt" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Cliente de Terminal Server" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Sesión guardada en el cliente de Terminal Server" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "Sesiones de TSClient" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Sesiones guardadas en el cliente de Terminal Server" #: ../kupfer/plugin/vim/__init__.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim/__init__.py:4 msgid "Recently used documents in Vim" msgstr "Documentos recientemente utilizados en Vim" #: ../kupfer/plugin/vim/plugin.py:56 msgid "Vim Recent Documents" msgstr "Documentos usados recientemente en VIM" #: ../kupfer/plugin/vim/plugin.py:219 msgid "Close (Save All)" msgstr "Cerrar (guardar todo)" #: ../kupfer/plugin/vim/plugin.py:237 msgid "Send..." msgstr "Enviar…" #: ../kupfer/plugin/vim/plugin.py:264 msgid "Send ex command" msgstr "Enviar comando «ex»" #: ../kupfer/plugin/vim/plugin.py:272 msgid "Insert in Vim..." msgstr "Insertar en Vim…" #: ../kupfer/plugin/vim/plugin.py:309 msgid "Active Vim Sessions" msgstr "Sesiones activas de Vim" #: ../kupfer/plugin/vim/plugin.py:338 #, python-format msgid "Vim Session %s" msgstr "Sesión %s de Vim" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Acciones y marcadores de Vinagre" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Iniciar sesión de Vinagre" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Marcadores de Vinagre" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "Controla máquinas virtuales de VirtualBox. Soporta Sun VirtualBox y la " "versión Open Source." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "Forzar el uso de la interfaz CLI" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Encender" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Encender «Headless»" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Enviar señal de apagado" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Reiniciar" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Restaurar" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Guardar estado" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Apagar" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "Máquinas de VirtualBox" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:11 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "Acceder a páginas guardadas en Zim - Una wiki de escritorio" #: ../kupfer/plugin/zim.py:30 msgid "Page names start with :colon" msgstr "Nombre de páginas empezando por dos puntos" #: ../kupfer/plugin/zim.py:36 msgid "Default page name for quick notes" msgstr "Nombre de página predeterminado para notas rápidas" #: ../kupfer/plugin/zim.py:38 #, python-format msgid "Note %x %X" msgstr "Nota %x %X" #: ../kupfer/plugin/zim.py:39 msgid "" "Strftime tags can be used: %H - hour, %M - minutes, etc\n" "Please check python documentation for details.\n" "NOTE: comma will be replaced by _" msgstr "" "Se puede usar etiquetas de «strftime»: %H: hora, %M: minutos, etc\n" "Consulte la documentación de Python para obtener más detalles.\n" "Nota: las comas se reemplazarán por «_»" #: ../kupfer/plugin/zim.py:45 msgid "Default namespace for quick notes" msgstr "Espacio de nombres predeterminado para notas rápidas" #: ../kupfer/plugin/zim.py:80 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Página de Zim desde el libro de notas «%s»" #: ../kupfer/plugin/zim.py:89 msgid "Create Zim Page" msgstr "Crear página de Zim" #: ../kupfer/plugin/zim.py:96 msgid "Create page in default notebook" msgstr "Crear página en el libro de notas predeterminado" #: ../kupfer/plugin/zim.py:108 msgid "Create Zim Page In..." msgstr "Crear página de Zim en…" #: ../kupfer/plugin/zim.py:132 msgid "Insert QuickNote into Zim" msgstr "Insertar nota rápida en Zim" #: ../kupfer/plugin/zim.py:142 msgid "Quick note selected text into Zim notebook" msgstr "Nota rápida seleccionada en el cuaderno de notas Zim" #: ../kupfer/plugin/zim.py:191 msgid "Create Subpage..." msgstr "Crear subpágina…" #: ../kupfer/plugin/zim.py:370 msgid "Zim Notebooks" msgstr "Libro de notas Zim" #: ../kupfer/plugin/zim.py:387 msgid "Zim Pages" msgstr "Páginas de Zim" #: ../kupfer/plugin/zim.py:415 msgid "Pages stored in Zim Notebooks" msgstr "Páginas almacenadas en el libro de notas Zim" #~ msgid "Translate text with Google Translate" #~ msgstr "Traducir texto con Google" #~ msgid "Google Translate connection timed out" #~ msgstr "Expiró el tiempo de conexión con Google Translate" #~ msgid "Error connecting to Google Translate" #~ msgstr "Error al contactar con Google" #~ msgid "Translate To..." #~ msgstr "Traducir a…" #~ msgid "Translate into %s" #~ msgstr "Traducir a %s" #~ msgid "Languages" #~ msgstr "Idiomas" #~ msgid "Show translated page in browser" #~ msgstr "Mostrar la página traducida en un navegador" #~ msgid "Show Translation To..." #~ msgstr "Mostrar la traducción a…" #~ msgid "Show translation in browser" #~ msgstr "Mostrar la traducción en un navegador" #~ msgid "run keyboard shortcut relay service on this display" #~ msgstr "" #~ "ejecutar el servicio de transmisión de atajos de teclado en esta pantalla" #~ msgid "Selected Text \"%s\"" #~ msgstr "Texto seleccionado «%s»" #~ msgid "Recent clipboards" #~ msgstr "Portapapeles recientes" #~ msgid "Include recent selections" #~ msgstr "Incluir selecciones recientes" #~ msgid "Text Matches" #~ msgstr "Coincidencias del texto" #~ msgid "noun" #~ msgstr "sustantivo" #~ msgid "verb" #~ msgstr "verbo" #~ msgid "adjective" #~ msgstr "adjetivo" #~ msgid "Directories" #~ msgstr "Directorios" #~ msgid "Icon Set" #~ msgstr "Conjunto de iconos" #~ msgid "Interface" #~ msgstr "Interfaz" #~ msgid "" #~ "Objects Exported\n" #~ "from Plugins" #~ msgstr "" #~ "Objetos exportados\n" #~ "desde complementos" #~ msgid "Terminal" #~ msgstr "Terminal" #~ msgid "Command '%s' not found" #~ msgstr "No se encontró el comando «%s»" #~ msgid "Keys not yet implemented: %s" #~ msgstr "Teclas aún no implementadas: %s" #~ msgid "Tracker 0.8" #~ msgstr "Tracker 0.8" #~ msgid "Hide Kupfer when focus is lost" #~ msgstr "Ocultar Kupfer cuando pierda el foco" #~ msgid "Preferred terminal" #~ msgstr "Terminal preferida" #~ msgid "" #~ "The preferred terminal emulator. It's used to launch the SSH sessions." #~ msgstr "" #~ "El emulador de terminal preferido. Se usa para lanzar las sesiones SSH." #~ msgid "" #~ "The flag which makes the terminal execute everything following it inside " #~ "the terminal (e.g. '-x' for gnome-terminal and terminal, '-e' for konsole " #~ "and urxvt)." #~ msgstr "" #~ "La opción que hace que el terminal ejecute todo siguiéndolo dentro de la " #~ "terminal (ej. «-x» para gnome-terminal y terminal, «-e» para konsole y " #~ "urxvt)." #~ msgid "Twitter" #~ msgstr "Twitter" #~ msgid "Microblogging with Twitter: send updates and show friends' tweets" #~ msgstr "" #~ "Microblogging con Twitter: enviar actualizaciones y mostrar los «tweets» " #~ "de mis amigos" #~ msgid "Load friends' pictures" #~ msgstr "Cargar las imágenes de mis amigos" #~ msgid "Load friends' public tweets" #~ msgstr "Cargar los «tweets» públicos de mis amigos" #~ msgid "Load timeline" #~ msgstr "Cargar cronología" #~ msgid "Post Update to Twitter" #~ msgstr "Publicar actualización en Twitter" #~ msgid "Send Direct Message..." #~ msgstr "Enviar mensaje directo…" #~ msgid "Send Direct Message To..." #~ msgstr "Enviar mensaje directo a…" #~ msgid "%(user)s %(when)s" #~ msgstr "%(when)s %(user)s" #~ msgid "Twitter Timeline" #~ msgstr "Cronología en Twitter" #~ msgid "Twitter Friends" #~ msgstr "Amigos de Twitter" #~ msgid "Timeline for %s" #~ msgstr "Cronología de %s" #~ msgid "" #~ "Tick the box next to a source to make sure its objects are exported to " #~ "the top level of the catalog. An unticked source's contents are only " #~ "available by locating its subcatalog and entering it.\n" #~ "\n" #~ "Note: Kupfer is an integrator, not an indexer itself. Kupfer is not " #~ "designed to carry a catalog larger than a couple of thousand objects, and " #~ "may become slow if overly large subcatalogs are included in the top level." #~ msgstr "" #~ "Seleccionar la casilla junto a una fuente para asegurarse de que sus " #~ "objetos se exportan al nivel superior del catálogo. El contenido de una " #~ "casilla no seleccionada sólo está disponible ubicando su subcatálogo e " #~ "introduciéndolo.\n" #~ "\n" #~ "Nota: Kupfer es un integrador, no un indexador en si mismo. Kupfer no " #~ "está diseñado para catalogar más de un par de miles de objetos y puede " #~ "acabar siendo lento si se incluyen grandes subcatálogos en el nivel " #~ "superior." #~ msgid "Send message to one Gwibber account" #~ msgstr "Enviar mensaje a una cuenta de Gwibber" #~| msgid "Reply..." #~ msgid "Reply" #~ msgstr "Responder" #~ msgid "OpenOffice" #~ msgstr "OpenOffice" #~ msgid "Plugins may not be unloaded at runtime" #~ msgstr "Los complementos no se pueden descargar durante la ejecución" #~ msgid "Include in top level" #~ msgstr "Incluir en nivel superior" #~ msgid "" #~ "If enabled, objects from the plugin's source(s) will be available in the " #~ "top level.\n" #~ "Sources are always available as subcatalogs in the top level." #~ msgstr "" #~ "Si está activado, los objetos de la(s) fuente(s) del complemento estarán " #~ "disponibles en el nivel superior.\n" #~ "Las fuentes siempre están disponibles como subcatálogos en el nivel " #~ "superior." #~ msgid "Keybinding" #~ msgstr "Atajos de teclado" #~ msgid "Applied" #~ msgstr "Aplicado" #~ msgid "Gnome Session Management" #~ msgstr "Gestión de la sesión de GNOME" #~ msgid "Special items and actions for Gnome environment" #~ msgstr "Elementos y acciones especiales para el entorno GNOME" #~ msgid "To configure kupfer, edit:" #~ msgstr "Para configurar kupfer, editar:" #~ msgid "The default config for reference is at:" #~ msgstr "La configuración predeterminada está en:" #~ msgid "Open with %s" #~ msgstr "Abrir con %s" #~ msgid "Do" #~ msgstr "Hacer" #~ msgid "Compose New Mail To" #~ msgstr "Redactar un correo nuevo para" #~ msgid "Common" #~ msgstr "Comunes" #~ msgid "Special Items" #~ msgstr "Elementos epeciales" #~ msgid "Items and special actions" #~ msgstr "Elementos y acciones especiales" #~ msgid "Kupfer items and actions" #~ msgstr "Elementos y acciones de Kupfer" #~ msgid "Recently used documents and nautilus places" #~ msgstr "Documentos recientes y lugares de Nautilus" #~ msgid "Bookmarked locations in Nautilus" #~ msgstr "Marcadores de lugares en Nautilus" #~ msgid "(Simple) favorites plugin" #~ msgstr "Complemento simple de favoritos" #~ msgid "(no description)" #~ msgstr "(sin descripción)" #~ msgid " %(name)-20s %(version)-4s %(description)s" #~ msgstr " %(name)-20s %(version)-4s %(description)s" #~ msgid "Free-text Queries" #~ msgstr "Consultas de Free-text" #~ msgid "Basic support for free-text queries" #~ msgstr "Soporte básico para consultas de free-text" #~ msgid "Filesystem Text Matches" #~ msgstr "Coincidencias de texto en el sistema de archivos" #~ msgid "URL Text Matches" #~ msgstr "Coincidencias de texto en URL" #~ msgid "Searching..." #~ msgstr "Buscando..." #~ msgid "Searching %(source)s..." #~ msgstr "Buscando %(source)s..." #~ msgid "" #~ "%(program)s: %(desc)s\n" #~ "\t%(copyright)s\n" #~ "\t%(website)s\n" #~ msgstr "" #~ "%(program)s: %(desc)s\n" #~ "\t%(copyright)s\n" #~ "\t%(website)s\n" #~ msgid "Core" #~ msgstr "Nucleo" #~ msgid "%d lines" #~ msgstr "%d lineas" kupfer-v208/po/eu.po000066400000000000000000002454411176220042200144440ustar00rootroot00000000000000# translation of eu.po to Basque # Iñaki Larrañaga Murgoitio , 2010. msgid "" msgstr "" "Project-Id-Version: eu\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2011-04-14 21:40+0200\n" "PO-Revision-Date: 2010-08-27 17:12+0200\n" "Last-Translator: Iñaki Larrañaga Murgoitio \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Language: Basque\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: KBabel 1.11.4\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "Aplikazioen abiarazlea" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "Komando eta atzipen tresna egokia aplikazio eta dokumentuentzat" #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Kupfer-en exekutatu" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Gordetako Kupfer komandoa" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "Arakatzailearen laster-teklak" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "Laster-tekla orokorrak" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Hasiera" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:150 msgid "Catalog" msgstr "Katalogoa" #: ../data/preferences.ui.h:5 #, fuzzy msgid "Desktop Environment" msgstr "Mahaigainaren ingurunearentzako aplikazioak" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "" #: ../data/preferences.ui.h:7 msgid "General" msgstr "Orokorra" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "" #: ../data/preferences.ui.h:9 #, fuzzy msgid "Inclusion in Top Level Searches" msgstr "Sartu abestiak maila gorenean" #: ../data/preferences.ui.h:10 #, fuzzy msgid "Indexed Folders" msgstr "Sortu karpeta" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "Teklatua" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Kupfer-en hobespenak" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "Pluginak" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:844 msgid "Reset" msgstr "Berrezarri" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "Erakutsi ikonoa jakinarazpen-arean" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "Abiarazi automatikoki saioa hastean" #: ../data/preferences.ui.h:19 #, fuzzy msgid "Terminal emulator:" msgstr "Ireki terminala hemen" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "Erabili tekla bakarreko komandoak (zuriunea, /, puntua, koma etab.)" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Erabiltzailearen kredentzialak" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "_Aldatu" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "_Pasahitza:" #: ../data/credentials_dialog.ui.h:4 msgid "_User:" msgstr "_Erabiltzailea:" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "Ezin izan da laster-tekla esleitu" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Sakatu nahi den tekla konbinazioa" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "Ezarri laster-tekla" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "ez aurkeztu interfaze nagusia abioan" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "zerrendatu plugin erabilgarriak" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "gaitu arazte informazioa" #: ../kupfer/main.py:46 msgid "run keyboard shortcut relay service on this display" msgstr "" #: ../kupfer/main.py:49 msgid "show usage help" msgstr "erakutsi erabilerari buruzko laguntza" #: ../kupfer/main.py:50 msgid "show version information" msgstr "erakutsi bertsioaren informazioa" #: ../kupfer/main.py:56 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Erabilera: kupfer [ AUKERAK | FITXATEGIA ... ]" #: ../kupfer/main.py:67 msgid "Available plugins:" msgstr "Plugin erabilgarriak:" #: ../kupfer/main.py:114 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "Ordezko aktibazioa" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Koma trikimailua" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Prestatu komandoa" #: ../kupfer/ui/accelerators.py:11 #, fuzzy msgid "Mark Default Action" msgstr "Ezarri lehenetsitako aplikazioa..." #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Berrezarri denak" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Hautatu irtetzeko" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Aukeratu hautatutako fitxategia" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Aukeratu hautatutako testua" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Erakutsi laguntza" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Erakutsi hobespenak" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "Aldatu lehen panelera" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Aldatu testu modura" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s hutsa dago" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "Ez dago \"%(query)s\"(r)ekin bat datorrenik %(src)s-en" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Ez dago bat datorrenik" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Idatzi bilatzeko" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Idatzi %s bilatzeko" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Ekintzarik ez" #: ../kupfer/ui/browser.py:1461 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1471 #, python-format msgid "Forget About \"%s\"" msgstr "" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1903 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Erakutsi interfaze nagusia" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Erakutsi hautapenarekin" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Deskribapena" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Egilea" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Bertsioa" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Beharrezkoa da Python-eko '%s' modulua" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Ezin izan da plugina irakurri errore bat dela eta:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "desgaituta" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Edukia" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Iturburuak" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Ekintzak" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:589 msgid "Configuration" msgstr "Konfigurazioa" #: ../kupfer/ui/preferences.py:609 msgid "Set username and password" msgstr "Ezarri erabiltzaile-izena eta pasahitza" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:663 msgid "Choose a Directory" msgstr "Aukeratu direktorioa" #: ../kupfer/ui/preferences.py:842 msgid "Reset all shortcuts to default values?" msgstr "Berrezarri laster-tekla guztiak lehenetsitako balioetara?" #: ../kupfer/ui/preferences.py:850 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Komandoa" #: ../kupfer/ui/preferences.py:851 msgid "Shortcut" msgstr "Laster-tekla" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "" "Oier Mees \n" "Iñaki Larrañaga Murgoitio " #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Software librea (GPLv3+) den abiarazle bat" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Programa hau software librea da; birbana eta/edo alda dezakezu Software \n" "Foundation-ek argitaratutako GNU Lizentzia Publiko Orokorraren 3. " "bertsioan, \n" "edo (nahiago baduzu) beste berriago batean, jasotako baldintzak betez gero.\n" "\n" "Programa hau erabilgarria izango delakoan banatzen da, baina, INOLAKO\n" "BERMERIK GABE; era berean, ez da bermatzen beraren EGOKITASUNA \n" "MERKATURATZEKO edo HELBURU PARTIKULARRETARAKO ERABILTZEKO. \n" "Argibide gehiago nahi izanez gero, ikus GNU Lizentzia Publiko Orokorra.\n" "\n" "Programa honekin batera GNU Lizentzia Publiko Orokorraren kopia bat \n" "jasoko zenuen; hala ez bada, ikusi .\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "Ezin izan da exekutatzen ari den Kupfer instantziarik aurkitu" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Ezin izan da '%s' exekutatu" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "\"%s\"(e)k emaitza bat sortu du" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "Baimenik ez \"%s\" exekutatzeko (ez da exekutagarria)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "\"%s\" komandoa ez dago eskuragarri" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 #, fuzzy msgid "Text" msgstr "Erakutsi testua" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Exekutatu atzerapenaren ondoren..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Exekutatu komandoa zehaztutako denbora tartearen ondoren" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Objektu anitzak" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "objektu %s" msgstr[1] "%s objektu" #: ../kupfer/obj/contacts.py:87 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:107 msgid "Open" msgstr "Ireki" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Ez dago %(file)s (%(type)s)(r)en lehenetsitako aplikaziorik" #: ../kupfer/obj/fileactions.py:45 #, fuzzy, python-format msgid "Please use \"%s\"" msgstr "\"%s\" fitxategi hautatuta" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Ezarri lehenetsitako aplikazioa..." #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Ireki lehenetsitako aplikazioarekin" #: ../kupfer/obj/fileactions.py:77 msgid "Reveal" msgstr "Erakutsi" #: ../kupfer/obj/fileactions.py:86 msgid "Open parent folder" msgstr "Ireki karpeta gurasoa" #: ../kupfer/obj/fileactions.py:92 msgid "Open Terminal Here" msgstr "Ireki terminala hemen" #: ../kupfer/obj/fileactions.py:105 msgid "Open this location in a terminal" msgstr "Ireki kokalekua terminalean" #: ../kupfer/obj/fileactions.py:113 msgid "Run in Terminal" msgstr "Exekutatu terminalean" #: ../kupfer/obj/fileactions.py:113 msgid "Run (Execute)" msgstr "Exekutatu" #: ../kupfer/obj/fileactions.py:133 msgid "Run this program in a Terminal" msgstr "Exekutatu programa terminalean" #: ../kupfer/obj/fileactions.py:135 msgid "Run this program" msgstr "Exekutatu programa hau" #: ../kupfer/obj/objects.py:248 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 msgid "Go To" msgstr "Joan" #: ../kupfer/obj/objects.py:274 msgid "Open URL" msgstr "Ireki URLa" #: ../kupfer/obj/objects.py:285 msgid "Open URL with default viewer" msgstr "Ireki URLa lehenetsitako ikustailearekin" #: ../kupfer/obj/objects.py:299 msgid "Launch" msgstr "Abiarazi" #: ../kupfer/obj/objects.py:312 msgid "Show application window" msgstr "Erakutsi aplikazioaren leihoa" #: ../kupfer/obj/objects.py:313 msgid "Launch application" msgstr "Abiarazi aplikazioa" #: ../kupfer/obj/objects.py:324 msgid "Launch Again" msgstr "Abiarazi berriro" #: ../kupfer/obj/objects.py:331 msgid "Launch another instance of this application" msgstr "Abiarazi aplikazio honen beste instantzia bat" #: ../kupfer/obj/objects.py:337 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Itxi" #: ../kupfer/obj/objects.py:345 msgid "Attempt to close all application windows" msgstr "Aplikazio guztien leihoak ixteko saiakera" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:392 msgid "Run" msgstr "Exekutatu" #: ../kupfer/obj/objects.py:402 msgid "Perform command" msgstr "Egikaritu komandoa" #: ../kupfer/obj/objects.py:416 #, fuzzy msgid "(Empty Text)" msgstr "Hustu fitxategia" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:432 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "\"%(text)s\"" msgstr[1] "(%(num)d lerro) \"%(text)s\"" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s et. al." #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "%(dir)s(r)en iturburu errekurtsiboa, (%(levels)d maila)" #: ../kupfer/obj/sources.py:103 #, python-format msgid "Directory source %s" msgstr "Direktorioaren iturburua: %s" #: ../kupfer/obj/sources.py:113 msgid "Home Folder" msgstr "Karpeta nagusia" #: ../kupfer/obj/sources.py:124 msgid "Catalog Index" msgstr "Katalogoaren aurkibidea" #: ../kupfer/obj/sources.py:139 msgid "An index of all available sources" msgstr "Baliabide erabilgarri guztien aurkibidea" #: ../kupfer/obj/sources.py:170 msgid "Root catalog" msgstr "Erroko katalogoa" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Konfiguratu plugina" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "%s plugina ez dago konfiguratuta" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "%s(r)en baliogabeko erabiltzaile-kredentzialak" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "" #: ../kupfer/plugin/core/alternatives.py:13 #, fuzzy msgid "GNOME Terminal" msgstr "GNOMEren terminaleko profilak" #: ../kupfer/plugin/core/alternatives.py:22 #, fuzzy msgid "XFCE Terminal" msgstr "Exekutatu terminalean" #: ../kupfer/plugin/core/alternatives.py:31 #, fuzzy msgid "LXTerminal" msgstr "Exekutatu terminalean" #: ../kupfer/plugin/core/alternatives.py:40 #, fuzzy msgid "X Terminal" msgstr "Exekutatu terminalean" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Gorde honela..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Irten" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Irten Kupfer-etik" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "Kupfer-i buruz" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Erakutsi Kupfer-en egile eta lizentziari buruzko informazioa" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Kupfer-en laguntza" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Eskuratu Kupfer-en laguntza" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Erakutsi Kupfer-en hobespenen leihoa" #: ../kupfer/plugin/core/__init__.py:65 msgid "Search Contents" msgstr "Bilatu edukiak" #: ../kupfer/plugin/core/__init__.py:83 msgid "Search inside this catalog" msgstr "Bilatu katalogoaren barruan" #: ../kupfer/plugin/core/__init__.py:91 msgid "Copy" msgstr "Kopiatu" #: ../kupfer/plugin/core/__init__.py:106 msgid "Copy to clipboard" msgstr "Kopiatu arbelean" #: ../kupfer/plugin/core/__init__.py:128 msgid "Rescan" msgstr "Berreskaneatu" #: ../kupfer/plugin/core/__init__.py:143 msgid "Force reindex of this source" msgstr "Behartu iturburu hau berriro indexatzea" #: ../kupfer/plugin/core/selection.py:8 ../kupfer/plugin/core/selection.py:36 msgid "Selected Text" msgstr "Hautatutako testua" #: ../kupfer/plugin/core/selection.py:23 #, python-format msgid "Selected Text \"%s\"" msgstr "Hautatutako \"%s\" testua" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Azken komandoa" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Kupfer-en barneko objektuak" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Azken emaitza" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Komandoaren emaitzak" #: ../kupfer/plugin/archivemanager.py:1 #, fuzzy msgid "Archive Manager" msgstr "Artxiboa" #: ../kupfer/plugin/archivemanager.py:9 #, fuzzy msgid "Use Archive Manager actions" msgstr "Thunar fitxategi-kudeatzailearen ekintzak" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Konprimitutako artxibo mota 'Sortu artxiboa hemen'-entzat" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Erauzi hemen" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Erauzi konprimitutako artxiboa" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Sortu artxiboa" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Sortu konprimitutako artxiboa karpetatik" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Sortu artxiboa hemen..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Artxiboa" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Aplikazioak" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Aplikazio eta hobespen guztiak" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Mahaigainaren ingurunearentzako aplikazioak" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Ireki honekin..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Ireki edozein aplikaziorekin" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Ezarri aplikazio lehenetsia fitxategi mota hau irekitzeko" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Kalkulagailua" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Kalkulatu '='-rekin hasten diren adierazpenak" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Kalkulatu" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:71 msgid "Clipboards" msgstr "Arbelak" #: ../kupfer/plugin/clipboard.py:4 ../kupfer/plugin/clipboard.py:111 msgid "Recent clipboards" msgstr "Azken arbelak" #: ../kupfer/plugin/clipboard.py:20 msgid "Number of recent clipboards" msgstr "Azken aldiz erabilitako arbelen kopurua" #: ../kupfer/plugin/clipboard.py:26 msgid "Include recent selections" msgstr "Sartu azken hautapenak" #: ../kupfer/plugin/clipboard.py:32 msgid "Copy selection to primary clipboard" msgstr "Kopiatu hautapena arbel nagusian" #: ../kupfer/plugin/clipboard.py:44 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "\"%(desc)s\" arbela" msgstr[1] "Arbela \"%(desc)s\" %(num)d lerrorekin" #: ../kupfer/plugin/clipboard.py:51 msgid "Clear" msgstr "Garbitu" #: ../kupfer/plugin/clipboard.py:63 msgid "Remove all recent clipboards" msgstr "Ezabatu azken arbel guztiak" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Shell-eko komandoak" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Exekutatu (eskuratu irteera)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Exekutatu programa eta itzuli honen emaitza" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 #, fuzzy msgid "Pass to Command..." msgstr "Azken komandoa" #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 #, fuzzy msgid "Write to Command..." msgstr "Idatzi hemen..." #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 #, fuzzy msgid "Run program and supply text on the standard input" msgstr "Exekutatu programa eta itzuli honen emaitza" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "" #: ../kupfer/plugin/commands.py:215 #, fuzzy msgid "Run command-line programs" msgstr "Exekutatu komando-lerroko programak" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Hiztegia" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Bilatu hitza hiztegian" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Bilatu" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Dokumentuak" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "Azken aldian erabilitako dokumentu eta laster-markatutako karpetak" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "Gehienezko azken dokumentuen egunak" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Azken elementuak" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Azken aldian erabilitako dokumentuak" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "%s dokumentu" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "%s(r)en erabilitako azken dokumentuak" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Lekuak" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Laster-markatutako karpetak" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Epiphany-ren laster-markak" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Epiphany-ren laster-marken indizea" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Gogokoenak" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "" "Markatu maiz erabilitako elementuak, eta gorde objektuak beranduago " "erabiltzeko" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "Gogoko elementuen apala" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Gehitu gogokoei" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Gehitu elementua gogokoen apalari" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Kendu gogokoetatik" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Kendu elementua gogokoen apaletik" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Fitxategien ekintzak" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Fitxategien ekintza gehiago" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:210 msgid "Move To..." msgstr "Eraman hona..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:252 msgid "Move file to new location" msgstr "Eraman fitxategi hau kokapen berrira" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Aldatu izena..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:165 msgid "Copy To..." msgstr "Kopiatu hona..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:206 msgid "Copy file to a chosen location" msgstr "Kopiatu fitxategia aukeratutako kokapenera" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Firefox-en laster-markak" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Firefox-en laster-marken indizea" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "Sartu bisitatutako guneak" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Hautatutako fitxategia" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" "Nautilus-en uneko hautapena eskaintzen du, Kupfer-eko Nautilus hedapenaz " "baliatuz" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "\"%s\" fitxategi hautatuta" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Hautatutako fitxategiak" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Oharrak" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Gnote edo Tomboy oharrak" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Lan egin aplikazioarekin" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Ireki oharrentzako aplikazioarekin" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Erantsi oharrari..." #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Gehitu testua oharrari" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Sortu oharra" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Sortu ohar berria testu honetatik" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Lortu oharreko bilaketaren emaitzak..." #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "Erakutsi kontsulta honen bilaketaren emaitzak" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "gaur, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "atzo, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Azken eguneraketa: %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "Entzun eta jarri abestiak ilaran, eta arakatu musikaren liburutegia" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Sartu artistak maila gorenean" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Sartu albumak maila gorenean" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Sartu abestiak maila gorenean" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Erreproduzitu" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Jarraitu erreprodukzioa Rhythmbox-en" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Pausatu" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Pausatu erreprodukzioa Rhythmbox-en" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Hurrengoa" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Joan hurrengo abestira Rhythmbox-en" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Aurrekoa" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Joan aurreko abestira Rhythmbox-en" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Erakutsi erreproduzitzen ari den abestia" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Esan unean erreproduzitzen ari den abestia" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Garbitu erreprodukzio-zerrenda" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Erreproduzitu abestiak Rhythmbox-en" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Gehitu ilarari" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Gehitu abestiak erreprodukzio-zerrendari" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "%(album)s-eko %(artist)s-en arabera" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "%s(r)en arabera" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Abestiak %s-ren arabera" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Albumak" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Rhythmbox liburutegiko musikaren albumak" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Artistak" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Rhythmbox liburutegiko musikaren artistak" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Abestiak" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Rhythmbox liburutegiko abestiak" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "GNOME saio-kudeatzailea" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "Elementu eta ekintza bereziak GNOME ingurunearentzat" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Amaitu saioa..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Amaitu saioa edo aldatu erabiltzailez" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Itzali..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Itzali, berrabiarazi edo eseki ordenagailua" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Blokeatu pantaila" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Gaitu pantaila-babeslea eta pantaila-blokeoa" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "XFCE saio-kudeatzailea" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Elementu eta ekintza bereziak XFCE ingurunearentzat" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Erakutsi testua" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:52 msgid "Display text in a window" msgstr "Erakutsi testua leihoan" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Mota handia" #: ../kupfer/plugin/show_text.py:60 msgid "Show Notification" msgstr "Erakutsi jakinarazpena" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Zakarrontzia" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Atzitu zakarrontziko edukia" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Bota zakarrontzira" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Bota fitxategi hau zakarrontzira" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Leheneratu" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Eraman fitxategia hasierako kokalekura" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "Zakarrontzia hutsa dago" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "Zakarrontzian fitxategi bakarra dago" msgstr[1] "Zakarrontzian %(num)s fitxategi daude" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Abiarazleak" #: ../kupfer/plugin/triggers.py:6 #, fuzzy msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Esleitu laster-tekla orokorrak (abiarazleak) 'Prestatu komandoa'-rekin (Ktrl" "+Sartu) sortutako objektuei" #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Gehitu abiarazlea..." #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Ezabatu abiarazlea" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "URL ekintzak" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Deskargatu eta ireki" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Deskargatu hemen..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "Deskargatu URLa aukeratutako kokalekura" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Bolumenak eta diskoak" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Muntatutako bolumen eta diskoak" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Bolumena %s-en muntatuta" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Desmuntatu" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Desmuntatu bolumena" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Egotzi" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Desmuntatu eta egotzi euskarria" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Bilatu webean" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Bilatu webean Open Search bilaketako motorrekin" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Bilatu honekin..." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Hau bilatu..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Bilaketako motorrak" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Bilatu Wikipedian" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Wikipediako hizkuntza" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "en" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Bilatu termino hau %s.wikipedia.org-en" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Leihoen zerrenda" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Leiho guztiak laneko area guztietan" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Aktibatu" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Bildu" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Zabaldu" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Minimizatu" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Leheneratu leihoa" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Maximizatu" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Desmaximizatu leihoa" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Maximizatu bertikalki" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Desmaximizatu bertikalki" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Leihoa %(wkspc)s laneko arean" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Aurrean dagoen leihoa" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Hurrengo leihoa" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Joan leiho honen laneko areara eta jarri fokua" #: ../kupfer/plugin/windows.py:252 #, fuzzy, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "Hurrengo leihoa" msgstr[1] "Hurrengo leihoa" #: ../kupfer/plugin/windows.py:256 #, fuzzy msgid "Active workspace" msgstr "Joan laneko area honetara" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Joan laneko area honetara" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Laneko areak" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Abiword-en erabilitako azken dokumentuak" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Abiword-eko azken dokumentuak" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "APT pakete-kudeatzailearen interfazea" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Instalazioaren metodoa" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Erakutsi paketearen informazioa" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Instalatu" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Instalatu paketeak konfiguratutako metodoa erabiliz" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "\"%s\" paketearekin bat datozenak" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Bilatu paketearen izena..." #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "Artxibo sakonak" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Baimendu konprimitutako artxiboen barruan arakatzea" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "%s(r)en edukia" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Kontrolatu Audacious-en erreprodukzioak eta zerrendak" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Gehitu abestia Audacious-en erreprodukzio-zerrendari" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Kendu ilaratik" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Kendu abestia Audacious-en erreprodukzio-zerrendatik" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Joan abestira Audacious-en" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Jarraitu erreprodukzioa Audacious-en" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Pausatu erreprodukzioa Audacious-en" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Joan hurrengo abestira Audacious-en" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Joan aurreko abestira Audacious-en" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Garbitu Audacious-en erreprodukzio-zerrenda" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Ausaz" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Txandakatu ausaz erreproduzitzea Audacious-en" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Errepikatu" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Txandakatu erreprodukzioa errepikatzea Audacious-en" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Erreprodukzio-zerrenda" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Chromium-en laster-markak" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Chromium-en laster-marken indizea" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws posta-bezeroa" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Claws posta-bezeroaren kontaktuak eta ekintzak" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Prestatu mezu berria" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Prestatu mezu berria Claws posta-bezeroan" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Jaso mezu guztiak" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "Jaso mezu berriak kontu guztietatik Claws posta-bezeroan" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "Prestatu mezua" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "Bidali mezua honi..." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Prestatu mezu berria eta erantxi fitxategia Claws-en" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Claws-eko helbide-liburua" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Claws-eko helbide-liburuko kontaktuak" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 #, fuzzy msgid "Custom Terminal" msgstr "Exekutatu terminalean" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "Exekutatu bandera" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Posta-bezero lehenetsia" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "Prestatu mezua sistemako posta-bezero lehenetsia erabiliz" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Bilatu Devhelp-en" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "" #: ../kupfer/plugin/empathy.py:6 #, fuzzy msgid "Access to Empathy Contacts" msgstr "Atzitu Gajim-eko kontaktuak" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Erakutsi deskonektatutako kontaktuak" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Erabilgarri" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Kanpoan" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Lanpetuta" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Ez erabilgarri" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Ikustezin" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Deskonektatuta" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:90 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:204 msgid "Open Chat" msgstr "Ireki berriketa" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:118 #: ../kupfer/plugin/skype.py:250 msgid "Change Global Status To..." msgstr "Aldatu egoera orokorra hona..." #: ../kupfer/plugin/empathy.py:171 #, fuzzy msgid "Empathy Contacts" msgstr "Gajim-eko kontaktuak" #: ../kupfer/plugin/empathy.py:237 #, fuzzy msgid "Empathy Account Status" msgstr "Gajim-eko kontuaren egoera" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Evolution-eko kontaktuak" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Prestatu mezu berria Evolution-en" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Prestatu mezu berria eta erantsi fitxategia Evolution-en" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Evolution-eko helbide-liburua" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Erakutsi guneak eta kudeatu ftp helbideak Filezilla-rekin" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Ireki guneak Filezilla-rekin" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Filezilla guneak" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Filezilla-ko guneak" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Atzitu Gajim-eko kontaktuak" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Berriketarako libre" #: ../kupfer/plugin/gajim.py:146 msgid "Gajim Contacts" msgstr "Gajim-eko kontaktuak" #: ../kupfer/plugin/gajim.py:210 msgid "Gajim Account Status" msgstr "Gajim-eko kontuaren egoera" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "GNOMEren terminaleko profilak" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "Abiatu GNOMEren terminaleko profilak" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:144 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "Kargatu kontaktuak eta prestatu mezu berria Gmail-en" #: ../kupfer/plugin/gmail/__init__.py:32 msgid "Load contacts' pictures" msgstr "Kargatu kontaktuaren argazkiak" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Compose Email in GMail" msgstr "Prestatu mezua Gmail-en" #: ../kupfer/plugin/gmail/__init__.py:74 msgid "Open web browser and compose new email in GMail" msgstr "Ireki web arakatzailea eta prestatu mezu berria Gmail-en" #: ../kupfer/plugin/gmail/__init__.py:177 msgid "Contacts from Google services (Gmail)" msgstr "Google zerbitzuetako (Gmail) kontaktuak" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Erakutsi albumak eta igo argazkiak Picasa-ra" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "Erabiltzaileak erakusteko: (komaz bereiztuta)" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Kargatu erabiltzaile eta albumen ikonoak" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Argazkiak igotzen" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Argazkiak igotzen 'Picasa Web Album'-era" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Albuma sortzen:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Kupfer-ek sortutako albuma" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Fitxategia:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "album bat" msgstr[1] "%(num)d album" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "argazki bat" msgstr[1] "%(num)s argazki" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Igo 'Picasa Album'-era..." #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Igo fitxategiak Picasa-ko albumera" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Igo Picasa-ra album berri gisa" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Sortu albuma hautatutako direktorio lokaletik" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Picasa-ko albumak" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Erabiltzailearen albumak Picasa-n" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Google Search" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Bilatu Google-n eta erakutsi emaitzak zuzenean" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #, python-format msgid "Results for \"%s\"" msgstr "\"%s\"(r)en emaitzak" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Erakutsi \"%s\"(r)en emaitza gehiago" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "Guztira %s aurkituta" #: ../kupfer/plugin/google_translate.py:6 msgid "Google Translate" msgstr "Google Translate" #: ../kupfer/plugin/google_translate.py:8 #: ../kupfer/plugin/google_translate.py:153 msgid "Translate text with Google Translate" msgstr "Itzuli testua Google Translate-rekin" #: ../kupfer/plugin/google_translate.py:83 msgid "Google Translate connection timed out" msgstr "Google Translate-ren konexioa denboraz kanpo" #: ../kupfer/plugin/google_translate.py:86 msgid "Error connecting to Google Translate" msgstr "Errorea Google Translate-rekin konexioa ezartzean" #: ../kupfer/plugin/google_translate.py:136 #: ../kupfer/plugin/google_translate.py:223 msgid "Translate To..." msgstr "Itzuli hona..." #: ../kupfer/plugin/google_translate.py:179 #, python-format msgid "Translate into %s" msgstr "Itzuli %s(e)ra" #: ../kupfer/plugin/google_translate.py:203 msgid "Languages" msgstr "Hizkuntzak" #: ../kupfer/plugin/google_translate.py:238 msgid "Show translated page in browser" msgstr "Erakutsi itzulitako orria arakatzailean" #: ../kupfer/plugin/google_translate.py:255 msgid "Show Translation To..." msgstr "Erakutsi itzulpena honi..." #: ../kupfer/plugin/google_translate.py:271 msgid "Show translation in browser" msgstr "Erakutsi itzulpena arakatzailean" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "Arakatu eta sortu ataza berriak GTGen" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "iraungitzea: %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "hasiera: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "etiketak: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Ireki ataza 'Getting Things GNOME'n" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Ezabatu" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Kendu betirako ataza hau" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Markatu eginda gisa" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Markatu ataza hau eginda balego bezala" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Baztertu" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Markatu ataza hau gehiago ez egiteko gisa" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Sortu ataza" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Sortu ataza berria 'Getting Things GNOME'n" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, fuzzy, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s %(when)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, fuzzy, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s" #: ../kupfer/plugin/gwibber.py:187 #, fuzzy msgid "Send Message" msgstr "Bidali mezua..." #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "" #: ../kupfer/plugin/gwibber.py:210 #, fuzzy msgid "Send Message To..." msgstr "Bidali mezua..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Bidali mezua..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Erantzun..." #: ../kupfer/plugin/gwibber.py:314 #, fuzzy msgid "Delete Message" msgstr "Bidali mezua..." #: ../kupfer/plugin/gwibber.py:337 #, fuzzy msgid "Send Private Message..." msgstr "Bidali mezu zuzena..." #: ../kupfer/plugin/gwibber.py:370 #, fuzzy msgid "Send direct message to user" msgstr "Bidali mezu zuzena honi..." #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "" #: ../kupfer/plugin/gwibber.py:376 #, fuzzy msgid "Retweet To..." msgstr "Aldatu izena..." #: ../kupfer/plugin/gwibber.py:407 #, fuzzy msgid "Retweet message to all Gwibber accounts" msgstr "Jaso mezu berriak kontu guztietatik Claws posta-bezeroan" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:413 #, fuzzy msgid "Open in Browser" msgstr "Ireki karpeta gurasoa" #: ../kupfer/plugin/gwibber.py:419 #, fuzzy msgid "Open message in default web browser" msgstr "Ireki URLa lehenetsitako ikustailearekin" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 #, fuzzy msgid "Gwibber Accounts" msgstr "Gajim-eko kontuaren egoera" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Goi-mailako ekintzak" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Komandoekin objektu gisa lan egiteko tresnak" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Hautatu Kupfer-en" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "%s (%s)(r)en emaitza" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Exekutatu (hartu emaitza)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Hartu komandoaren emaitza proxy-ko objektu gisa" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Exekutatu (baztertu emaitzak)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Irudien tresnak" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Irudiak eraldatzeko tresnak" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Eskalatu..." #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Eskalatu irudia emandako pixel neurrietan doitzeko" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Biratu erlojuaren norantzan" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Biratu erlojuaren aurkako norantzan" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Biratu automatikoki" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Biratu JPEG bere EXIF metadatuen arabera" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Kupfer-en pluginak" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Atzitu Kupfer-eko pluginen zerrenda Kupfer-en" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Erakutsi informazioa" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Erakutsi iturburuaren kodea" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "gaituta" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Bilatu fitxategiak" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Bilatu fitxategi-sisteman 'locate' erabiliz" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Ezikusi egin maiuskulei/minuskulei fitxategiak bilatzean" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 #, fuzzy msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "OpenOffice.org-en erabilitako azken dokumentuak" #: ../kupfer/plugin/openoffice.py:83 #, fuzzy msgid "OpenOffice/LibreOffice Recent Items" msgstr "OpenOffice.org-eko azken elementuak" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Opera-ko laster-markak" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Opera-ko laster-marken indizea" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera-ren posta-bezeroa" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Opera posta-bezeroaren kontaktuak eta ekintzak" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Prestatu mezu berria Opera posta-bezeroan" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Opera posta-bezeroko kontaktuak" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Opera posta-bezeroko kontaktuak" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Atzitu Pidgin-eko kontaktuak" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (karaktere %d)" msgstr[1] "%s (%d karaktere)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Pidgin-eko kontaktuak" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "PuTTY saioak" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Atzipen azkarra PuTTY saioentzako" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Hasi saioa" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "reStructuredText" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "Errendatu reStructuredText eta erakutsi emaitza" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Ikusi HTML dokumentu gisa" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "GNU Screen saio aktiboak" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Erantsita" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Askatuta" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "saioa %(status)s (%(pid)s), sorrera: %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Screen saioak" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Erantsi" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:49 msgid "Send Keys" msgstr "" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "" #: ../kupfer/plugin/sendkeys.py:25 msgid "Paste to Foreground Window" msgstr "" #: ../kupfer/plugin/sendkeys.py:43 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:85 msgid "Send keys to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:90 msgid "Type Text" msgstr "" #: ../kupfer/plugin/sendkeys.py:111 msgid "Type the text to foreground window" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Sistemako zerbitzuak" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "" "Hasi, gelditu edo berrabiarazi sistemako zerbitzuak 'init' script-en bitartez" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Sudo-ren antzeko komandoa" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Hasi zerbitzua" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Berrabiarazi zerbitzua" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Gelditu zerbitzua" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "%s zerbitzua" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Laburtu estekak" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Sortu URL luzeen alias laburrak" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Errorea" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Laburtu honekin..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Zerbitzuak" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 #, fuzzy msgid "Show QRCode" msgstr "Erakutsi iturburuaren kodea" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 #, fuzzy msgid "Display text as QRCode in a window" msgstr "Erakutsi testua leihoan" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Atzitu Skype-ko kontaktuak" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skype ni" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Saioa amaituta" #: ../kupfer/plugin/skype.py:183 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:225 msgid "Call" msgstr "Deitu" #: ../kupfer/plugin/skype.py:239 msgid "Place a call to contact" msgstr "Deitu kontaktuari" #: ../kupfer/plugin/skype.py:274 msgid "Skype Contacts" msgstr "Skype-ko kontaktuak" #: ../kupfer/plugin/skype.py:294 msgid "Skype Statuses" msgstr "Skype-ren egoerak" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "SSH ostalariak" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "~/.ssh/config fitxategian aurkitutako SSH ostalariak gehitzen ditu." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "SSH ostalaria" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Konektatu" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "Konektatu SSH ostalarira" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "~/.ssh/config-en zehaztutako SSH ostalariak" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Ez dago D-Bus konexiorik mahaigaineko saiora" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Dokumentuen txantiloiak" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Sortu dokumentu berriak zure txantiloietatik" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "%s txantiloi" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Hustu fitxategia" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Sortu karpeta" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Sortu dokumentu berria..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Sortu dokumentu berri bat txantiloitik" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Sortu dokumentu hemen..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "Testu-fitxategiak" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Erantsi honi..." #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Erantsi..." #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Idatzi hemen..." #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Lortu testuaren edukiak" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:184 #: ../kupfer/plugin/thunar.py:224 ../kupfer/plugin/thunar.py:283 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:10 msgid "File manager Thunar actions" msgstr "Thunar fitxategi-kudeatzailearen ekintzak" #: ../kupfer/plugin/thunar.py:66 msgid "Select in File Manager" msgstr "Hautatu fitxategi-kudeatzailean" #: ../kupfer/plugin/thunar.py:94 msgid "Show Properties" msgstr "Erakutsi propietateak" #: ../kupfer/plugin/thunar.py:117 msgid "Show information about file in file manager" msgstr "Erakutsi fitxategiari buruzko informazioa fitxategi-kudeatzailean" #: ../kupfer/plugin/thunar.py:126 msgid "Send To..." msgstr "Bidali honi..." #: ../kupfer/plugin/thunar.py:258 msgid "Empty Trash" msgstr "Hustu zakarrontzia" #: ../kupfer/plugin/thunar.py:298 msgid "Thunar Send To Objects" msgstr "Thunar-etik objektuei bidaltzea" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Thunderbird/Icedove-ko kontaktu eta ekintzak" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Prestatu mezu berria Thunderbird-en" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Thunderbird-eko helbide-liburua" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Thunderbird-eko helbide-liburuko kontaktuak" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Top" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "" "Erakutsi martxan dauden atazak eta ahalbidetu hauei seinaleak bidaltzea" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Ordenatu" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Komando-lerroa" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "PUZaren erabilpena (beherantz)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Memoriaren erabilpena (beherantz)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Bidali seinalea..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Seinaleak" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Exekutatzen ari diren dauden atazak" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s puz: %(cpu)g%% memoria: %(mem)g%% denbora: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Exekutatzen ari diren uneko erabiltzailearen atazak" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:15 ../kupfer/plugin/tracker1.py:18 msgid "Tracker desktop search integration" msgstr "Tracker mahaigaineko bilaketaren bateragarritasuna" #: ../kupfer/plugin/tracker.py:41 ../kupfer/plugin/tracker1.py:49 msgid "Search in Tracker" msgstr "Bilatu Tracker-en" #: ../kupfer/plugin/tracker.py:46 ../kupfer/plugin/tracker1.py:54 msgid "Open Tracker Search Tool and search for this term" msgstr "Ireki Tracker bilaketa tresna eta termino hau bilatu" #: ../kupfer/plugin/tracker.py:55 ../kupfer/plugin/tracker1.py:62 msgid "Get Tracker Results..." msgstr "Lortu Tracker emaitzak..." #: ../kupfer/plugin/tracker.py:64 ../kupfer/plugin/tracker1.py:71 msgid "Show Tracker results for query" msgstr "Erakutsi Tracker-eko kontsultaren emaitzak" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Tracker-eko etiketak" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Tracker-eko etiketak" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Arakatu Tracker-eko etiketak" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "%s etiketa" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Tracker-ekin etiketatutako %s objektu" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Gehitu etiketa..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Gehitu tracker-eko etiketa fitxategiari" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Kendu etiketa..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Kendu tracker-eko etiketa fitxategitik" #: ../kupfer/plugin/tracker1.py:10 #, fuzzy msgid "Tracker" msgstr "Tracker 0.6" #. FIXME: Port tracker tag sources and actions #. to the new, much more powerful sparql + dbus API #. (using tracker-tag as in 0.6 is a plain hack and a dead end) #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "TrueCrypt historiako bolumenak" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "TrueCrypt bolumena: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Muntatu bolumena" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Muntatu Truecrypt-en" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Saiatu fitxategia muntatzen TrueCrypt bolumen gisa" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Desmuntatu bolumen guztiak" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "TrueCrypt bolumenak" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Urruneko mahaigainen bezeroa" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Saioa gorde da urruneko mahaigainen bezeroan" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "Bezeroaren saioak" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Gordetako saioak urruneko mahaigainen bezeroan" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Vinagre-ko laster-markak eta ekintzak" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Hasi Vinagre-ren saioa" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Vinagre-ko laster-markak" #: ../kupfer/plugin/vim.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim.py:3 msgid "Recently used documents in Vim" msgstr "Erabilitako azken dokumentuak Vim-en" #: ../kupfer/plugin/vim.py:46 msgid "Vim Recent Documents" msgstr "Vim-eko azken dokumentuak" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "Kontrolatu VirtualBox makina birtualak. Sun VirtualBox eta Open Source " "Edizioak onartzen ditu." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Piztu" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Piztu burugabea" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Bidali itzaltzeko seinalea" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Berrabiarazi" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Jarraitu" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Gorde egoera" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Itzali" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "VirtualBox makinak" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:10 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "" "Atzitu Zim-en gordetako orriak - Mahaigaineko wiki eta eskema sortzailea" #: ../kupfer/plugin/zim.py:28 msgid "Page names start with :colon" msgstr "Orriaren izena bi puntuekin (:) hasten da" #: ../kupfer/plugin/zim.py:58 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Zim orria \"%s\" koadernotik" #: ../kupfer/plugin/zim.py:67 msgid "Create Zim Page" msgstr "Sortu Zim orria" #: ../kupfer/plugin/zim.py:74 msgid "Create page in default notebook" msgstr "Sortu orria lehenetsitako koadernoan" #: ../kupfer/plugin/zim.py:84 msgid "Create Zim Page In..." msgstr "Sortu Zim orria hemen..." #: ../kupfer/plugin/zim.py:122 msgid "Create Subpage..." msgstr "Sortu azpi-orria..." #: ../kupfer/plugin/zim.py:243 msgid "Zim Notebooks" msgstr "Zim koadernoak" #: ../kupfer/plugin/zim.py:259 msgid "Zim Pages" msgstr "Zim orriak" #: ../kupfer/plugin/zim.py:287 msgid "Pages stored in Zim Notebooks" msgstr "Zim koadernoetan gordetako orriak" #~ msgid "Directories" #~ msgstr "Direktorioak" #~ msgid "Interface" #~ msgstr "Interfazea" #~ msgid "Hide Kupfer when focus is lost" #~ msgstr "Ezkutatu Kupfer fokua galtzean" #~ msgid "" #~ "Tick the box next to a source to make sure its objects are exported to " #~ "the top level of the catalog. An unticked source's contents are only " #~ "available by locating its subcatalog and entering it.\n" #~ "\n" #~ "Note: Kupfer is an integrator, not an indexer itself. Kupfer is not " #~ "designed to carry a catalog larger than a couple of thousand objects, and " #~ "may become slow if overly large subcatalogs are included in the top level." #~ msgstr "" #~ "Iturburuaren ondoko koadroa markatu objektuak katalogoaren maila gorenera " #~ "esportatzen direla ziurtatzeko. Markatu gabeko iturburuen edukiak " #~ "eskuragarri daude bakarrik honen azpikatalogoa kokatuz eta honetan " #~ "sartuz.\n" #~ "\n" #~ "Oharra: Kupfer ez da indexatzaile bat, baizik eta integratzailea bat. " #~ "Kupfer ez dago diseinatuta pare bat milaka objektuko katalogoak baina " #~ "handiagokoekin lan egiteko. Horregatik, azpikatalogo handiegiak gehitzen " #~ "badira maila gorenean Kupfer mantso ibili daiteke." #~ msgid "Text Matches" #~ msgstr "Testua bat dator" #~ msgid "noun" #~ msgstr "izena" #~ msgid "verb" #~ msgstr "aditza" #~ msgid "adjective" #~ msgstr "adjetiboa" #~ msgid "Twitter" #~ msgstr "Twitter" #~ msgid "Microblogging with Twitter: send updates and show friends' tweets" #~ msgstr "" #~ "Mikrobloggintza Twitter-ekin: bidali eguneraketak eta erakutsi lagunen " #~ "tweet-ak" #~ msgid "Load friends' pictures" #~ msgstr "Kargatu lagunen argazkiak" #~ msgid "Load friends' public tweets" #~ msgstr "Kargatu lagunen tweet publikoak" #~ msgid "Load timeline" #~ msgstr "Kargatu kronologia" #~ msgid "Post Update to Twitter" #~ msgstr "Bidali eguneraketa Twitter-era" #~ msgid "Twitter Timeline" #~ msgstr "Twitter kronologia" #~ msgid "Twitter Friends" #~ msgstr "Twitter lagunak" #~ msgid "Timeline for %s" #~ msgstr "%s(r)en kronologia" #~ msgid "OpenOffice" #~ msgstr "OpenOffice.org" #~ msgid "Preferred terminal" #~ msgstr "Terminal hobetsia" #~ msgid "" #~ "The preferred terminal emulator. It's used to launch the SSH sessions." #~ msgstr "" #~ "Terminal hobetsiaren emuladorea. SSH saioak abiatzeko erabiltzen da." #~ msgid "" #~ "The flag which makes the terminal execute everything following it inside " #~ "the terminal (e.g. '-x' for gnome-terminal and terminal, '-e' for konsole " #~ "and urxvt)." #~ msgstr "" #~ "Terminalean banderaren ondoren dagoena exekutarazten du (adib. '-x' gnome-" #~ "terminal eta terminalean, '-e' konsole eta urxvt-en)." #~ msgid "Tracker 0.8" #~ msgstr "Tracker 0.8" kupfer-v208/po/fr.po000066400000000000000000002604111176220042200144340ustar00rootroot00000000000000# French translation for kupfer. # Copyright (C) 2010 kupfer's COPYRIGHT HOLDER # This file is distributed under the same license as the kupfer package. # cbenz , 2010. # YannUbuntu , 2010 # Bruno Brouard , 2012. # msgid "" msgstr "" "Project-Id-Version: kupfer master\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2012-04-24 17:02+0000\n" "PO-Revision-Date: 2012-02-19 12:50+0100\n" "Last-Translator: Bruno Brouard \n" "Language-Team: GNOME French Team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../auxdata/kupfer.desktop.in.h:1 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Application Launcher" msgstr "Lanceur d'applications" #: ../auxdata/kupfer.desktop.in.h:3 msgid "Convenient command and access tool for applications and documents" msgstr "Outil pratique pour accéder à des documents et lancer des applications" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Exécuter dans Kupfer" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Commande Kupfer enregistrée" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Authentification de l'utilisateur" #: ../data/credentials_dialog.ui.h:2 msgid "_User:" msgstr "_Utilisateur :" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "_Mot de passe :" #: ../data/credentials_dialog.ui.h:4 msgid "_Change" msgstr "_Changer" #: ../data/getkey_dialog.ui.h:1 msgid "Set Keyboard Shortcut" msgstr "Définition du raccourci clavier" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Veuillez appuyer sur la combinaison de touches désirée" #: ../data/getkey_dialog.ui.h:3 msgid "Keybinding could not be bound" msgstr "Le raccourci clavier n'a pas pu être configuré" #: ../data/preferences.ui.h:1 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Préférences de Kupfer" #: ../data/preferences.ui.h:2 msgid "Start automatically on login" msgstr "Démarrer automatiquement à l'ouverture de session" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Démarrage" #: ../data/preferences.ui.h:4 msgid "Show icon in notification area" msgstr "Afficher l'icône dans la zone de notification" #: ../data/preferences.ui.h:5 msgid "Icon set:" msgstr "Ensemble d'icônes :" #: ../data/preferences.ui.h:6 msgid "Terminal emulator:" msgstr "Émulateur de terminal :" #: ../data/preferences.ui.h:7 msgid "Desktop Environment" msgstr "Environnement de bureau" #: ../data/preferences.ui.h:8 ../kupfer/plugin/gmail/__init__.py:60 msgid "General" msgstr "Général" #: ../data/preferences.ui.h:9 msgid "Global Keyboard Shortcuts" msgstr "Raccourcis clavier généraux" #: ../data/preferences.ui.h:10 ../kupfer/ui/preferences.py:849 msgid "Reset" msgstr "Réinitialiser" #: ../data/preferences.ui.h:11 msgid "Browser Keyboard Shortcuts" msgstr "Raccourcis clavier du navigateur" #: ../data/preferences.ui.h:12 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "" "Utiliser les commandes à l'aide d'une seule touche (espace, /, point, " "virgule, etc.)" #: ../data/preferences.ui.h:13 msgid "Keyboard" msgstr "Clavier" #: ../data/preferences.ui.h:14 msgid "Plugins" msgstr "Greffons" #: ../data/preferences.ui.h:15 msgid "Inclusion in Top Level Searches" msgstr "Inclusion dans les recherches les plus courantes" #: ../data/preferences.ui.h:16 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" "Les éléments des sources cochées sont inclus dans les recherches les plus " "courantes.\n" "Le contenu d'une source non cochée n'est disponible qu'en localisant son " "sous-catalogue." #: ../data/preferences.ui.h:18 msgid "Indexed Folders" msgstr "Dossiers indexés" #: ../data/preferences.ui.h:19 msgid "Folders whose files are always available in the catalog." msgstr "" "Dossiers dont les fichiers sont toujours disponibles dans le catalogue." #: ../data/preferences.ui.h:20 ../kupfer/obj/sources.py:156 msgid "Catalog" msgstr "Catalogue" # bruno ; typo ? "Could not carry out '%s'" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Impossible d'exécuter « %s »" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "« %s » a produit un résultat" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "Lancement de « %s » non autorisé (non exécutable)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "La commande n'est pas disponible dans « %s »" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "Le relais du clavier est actif pour l'écran %s" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "ne pas afficher l'interface principale au lancement" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "afficher les greffons disponibles" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "activer les informations de débogage" #. TRANS: --exec-helper=HELPER is an internal command #. TRANS: that executes a helper program that is part of kupfer #: ../kupfer/main.py:49 msgid "run plugin helper" msgstr "lancer l'assistant greffon" #: ../kupfer/main.py:52 msgid "show usage help" msgstr "afficher l'aide" #: ../kupfer/main.py:53 msgid "show version information" msgstr "afficher les informations de version" #: ../kupfer/main.py:59 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Utilisation : kupfer [ OPTIONS | FICHIER ... ]" #: ../kupfer/main.py:70 msgid "Available plugins:" msgstr "Greffons disponibles :" #: ../kupfer/main.py:121 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s : %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "Activation alternative" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Astuce virgule" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Composition de commande" #: ../kupfer/ui/accelerators.py:11 msgid "Mark Default Action" msgstr "Marquer l'action par défaut" #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "Oublier l'élément" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Tout réinitialiser" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Sélectionner quitter" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Sélectionner le fichier sélectionné" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Sélectionner le texte sélectionné" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Afficher l'aide" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Afficher les préférences" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "Basculer vers le premier panneau" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Basculer en mode texte" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s est vide" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "Aucun résultat dans %(src)s pour « %(query)s »" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Aucun résultat" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Saisir pour rechercher" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Saisir pour rechercher dans %s" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Aucune action" #: ../kupfer/ui/browser.py:1513 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "Rendre « %(action)s » par défaut pour « %(object)s »" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1523 #, python-format msgid "Forget About \"%s\"" msgstr "Oublier « %s »" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1960 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Afficher l'interface principale" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Afficher avec sélection" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Description" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Auteur" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Version" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Le module Python « %s » est requis" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Le greffon n'a pas pu être lu à cause d'une erreur :" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "désactivé" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Contenu de" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Sources" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Actions" #: ../kupfer/ui/preferences.py:575 #, python-format msgid "Using encrypted password storage: %s" msgstr "Utilisation d'un enregistrement de mot de passe chiffré : %s" #: ../kupfer/ui/preferences.py:577 #, python-format msgid "Using password storage: %s" msgstr "Utilisation d'un enregistrement de mot de passe : %s" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:594 msgid "Configuration" msgstr "Configuration" #: ../kupfer/ui/preferences.py:614 msgid "Set username and password" msgstr "Configurer le nom d'utilisateur et le mot de passe" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:668 msgid "Choose a Directory" msgstr "Sélection d'un dossier" #: ../kupfer/ui/preferences.py:847 msgid "Reset all shortcuts to default values?" msgstr "Réinitialiser tous les raccourcis aux valeurs par défaut ?" #: ../kupfer/ui/preferences.py:855 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Commande" #: ../kupfer/ui/preferences.py:856 msgid "Shortcut" msgstr "Raccourci" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "" "Christophe Benz \n" "Bruno Brouard " #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Un lanceur d'applications sous licence libre (GPLv3+)" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou\n" "le modifier au titre des clauses de la Licence Publique Générale GNU,\n" "telle que publiée par la Free Software Foundation ; soit la version 3\n" "de la Licence, ou (à votre discrétion) une version ultérieure quelconque.\n" "\n" "Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE\n" "GARANTIE ; sans même une garantie implicite de COMMERCIABILITÉ ou DE\n" "CONFORMITÉ À UNE UTILISATION PARTICULIÈRE. Voir la Licence Publique " "Générale\n" "GNU pour plus de détails.\n" "\n" "Vous devriez avoir reçu un exemplaire de la Licence Publique Générale GNU " "avec\n" "ce programme ; si ce n'est pas le cas, consultez .\n" "\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "Impossible de trouver une instance de Kupfer" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 msgid "Text" msgstr "Texte" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Exécuter après un délai..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Exécuter la commande après le délai indiqué" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Éléments multiples" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s élément" msgstr[1] "%s éléments" #: ../kupfer/obj/contacts.py:129 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/contacts.py:131 msgid "unknown" msgstr "inconnu" #: ../kupfer/obj/contacts.py:144 msgid "Aim" msgstr "Aim" #: ../kupfer/obj/contacts.py:151 msgid "Google Talk" msgstr "Google Talk" #: ../kupfer/obj/contacts.py:159 msgid "ICQ" msgstr "ICQ" #: ../kupfer/obj/contacts.py:166 msgid "MSN" msgstr "MSN" #: ../kupfer/obj/contacts.py:173 msgid "QQ" msgstr "QQ" #: ../kupfer/obj/contacts.py:180 msgid "Yahoo" msgstr "Yahoo" #. -*- coding: UTF-8 -*- #: ../kupfer/obj/contacts.py:187 ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "%s ne prend pas en charge cette opération" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "Utilisation impossible avec plusieurs éléments" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:176 msgid "Open" msgstr "Ouvrir" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Aucune application par défaut pour %(file)s (%(type)s)" #: ../kupfer/obj/fileactions.py:45 #, python-format msgid "Please use \"%s\"" msgstr "Veuillez utiliser « %s »" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Définir l'application par défaut..." #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Ouvrir avec l'application par défaut" #: ../kupfer/obj/fileactions.py:74 msgid "Reveal" msgstr "Afficher" #: ../kupfer/obj/fileactions.py:83 msgid "Open parent folder" msgstr "Ouvrir le dossier parent" #: ../kupfer/obj/fileactions.py:89 msgid "Open Terminal Here" msgstr "Ouvrir un terminal ici" #: ../kupfer/obj/fileactions.py:102 msgid "Open this location in a terminal" msgstr "Ouvrir cet emplacement dans un terminal" #: ../kupfer/obj/fileactions.py:110 msgid "Run in Terminal" msgstr "Exécuter dans un terminal" #: ../kupfer/obj/fileactions.py:110 msgid "Run (Execute)" msgstr "Exécuter" #: ../kupfer/obj/fileactions.py:130 msgid "Run this program in a Terminal" msgstr "Exécuter ce programme dans un terminal" #: ../kupfer/obj/fileactions.py:132 msgid "Run this program" msgstr "Exécuter ce programme" #: ../kupfer/obj/objects.py:252 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 ../kupfer/plugin/vim/plugin.py:172 msgid "Go To" msgstr "Aller à" #: ../kupfer/obj/objects.py:278 msgid "Open URL" msgstr "Ouvrir l'URL" #: ../kupfer/obj/objects.py:289 msgid "Open URL with default viewer" msgstr "Ouvrir l'URL avec le visionneur par défaut" #: ../kupfer/obj/objects.py:303 msgid "Launch" msgstr "Lancer" #: ../kupfer/obj/objects.py:316 msgid "Show application window" msgstr "Afficher la fenêtre de l'application" #: ../kupfer/obj/objects.py:317 msgid "Launch application" msgstr "Lancer l'application" #: ../kupfer/obj/objects.py:328 msgid "Launch Again" msgstr "Lancer à nouveau" #: ../kupfer/obj/objects.py:335 msgid "Launch another instance of this application" msgstr "Lancer une autre instance de cette application" #: ../kupfer/obj/objects.py:341 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Fermer" #: ../kupfer/obj/objects.py:349 msgid "Attempt to close all application windows" msgstr "Essayer de fermer toutes les fenêtres de l'application" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:396 msgid "Run" msgstr "Exécuter" #: ../kupfer/obj/objects.py:406 msgid "Perform command" msgstr "Exécuter la commande" #: ../kupfer/obj/objects.py:419 msgid "(Empty Text)" msgstr "(texte vide)" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:449 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "« %(text)s »" msgstr[1] "(%(num)d lignes) « %(text)s »" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s et al." #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Source récursive de %(dir)s, (%(levels)d niveaux)" #: ../kupfer/obj/sources.py:108 #, python-format msgid "Directory source %s" msgstr "Dossier source %s" #: ../kupfer/obj/sources.py:118 msgid "Home Folder" msgstr "Dossier personnel" #: ../kupfer/obj/sources.py:129 msgid "Catalog Index" msgstr "Index du catalogue" #: ../kupfer/obj/sources.py:144 msgid "An index of all available sources" msgstr "Index de toutes les sources disponibles" #: ../kupfer/obj/sources.py:176 msgid "Root catalog" msgstr "Catalogue racine" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Veuillez configurer le greffon" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "Le greffon %s n'est pas configuré" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "Erreur d'authentification pour %s" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Applications" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Toutes les applications et préférences" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Applications pour le bureau" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Ouvrir avec..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Ouvrir avec n'importe quelle application" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Sauvegarder l'application par défaut pour ouvrir ce type de fichier" #: ../kupfer/plugin/archivemanager.py:1 msgid "Archive Manager" msgstr "Gestionnaire d'archive" #: ../kupfer/plugin/archivemanager.py:9 msgid "Use Archive Manager actions" msgstr "Utiliser les actions du gestionnaire d'archive" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Type d'archive pour « Créer une archive dans »" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Extraire ici" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Extraire l'archive compressée" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Créer une archive" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Créer une archive compressée du dossier" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Créer une archive dans..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Archive" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Calculatrice" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Calculer les expressions commençant par « = »" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Calculer" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:112 msgid "Clipboards" msgstr "Presse-papiers" #: ../kupfer/plugin/clipboard.py:4 msgid "Recent clipboards and clipboard proxy objects" msgstr "" "Éléments du presse-papiers et objets de procuration de presse-papiers récents" #: ../kupfer/plugin/clipboard.py:24 msgid "Number of recent clipboards to remember" msgstr "Nombre d'éléments récents de presse-papiers à se rappeler" #: ../kupfer/plugin/clipboard.py:30 msgid "Include selected text in clipboard history" msgstr "Inclure le texte sélectionné dans l'historique du presse-papiers" #: ../kupfer/plugin/clipboard.py:36 msgid "Copy selected text to primary clipboard" msgstr "Copier le texte sélectionné dans le presse-papiers primaire" #: ../kupfer/plugin/clipboard.py:47 msgid "Selected Text" msgstr "Texte sélectionné" #: ../kupfer/plugin/clipboard.py:57 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Presse-papiers « %(desc)s »" msgstr[1] "Presse-papiers de %(num)d lignes « %(desc)s »" #: ../kupfer/plugin/clipboard.py:64 msgid "Clipboard Text" msgstr "Texte du presse-papiers" #: ../kupfer/plugin/clipboard.py:74 msgid "Clipboard File" msgstr "Fichier du presse-papiers" #: ../kupfer/plugin/clipboard.py:84 msgid "Clipboard Files" msgstr "Fichiers du presse-papiers" #: ../kupfer/plugin/clipboard.py:92 msgid "Clear" msgstr "Effacer" #: ../kupfer/plugin/clipboard.py:104 msgid "Remove all recent clipboards" msgstr "Supprimer tous les éléments récents du presse-papiers" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Commandes du shell" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" "Exécuter des programmes en ligne de commande. Les actions marquées du " "symbole %s sont exécutées dans un sous-shell." #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Exécuter (en récupérant la sortie)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Exécuter le programme et récupérer les sorties" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 msgid "Pass to Command..." msgstr "Transmettre à la commande..." #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "" "Exécuter le programme en utilisant l'élément comme argument supplémentaire" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 msgid "Write to Command..." msgstr "Écrire vers la commande..." #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 msgid "Run program and supply text on the standard input" msgstr "Exécuter le programme et envoyer le texte sur l'entrée standard" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "Filtrer à travers la commande..." #: ../kupfer/plugin/commands.py:215 msgid "Run command-line programs" msgstr "Exécute des programmes en ligne de commande" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "GTK+" #: ../kupfer/plugin/core/alternatives.py:13 msgid "GNOME Terminal" msgstr "Terminal GNOME" #: ../kupfer/plugin/core/alternatives.py:22 msgid "XFCE Terminal" msgstr "Terminal XFCE" #: ../kupfer/plugin/core/alternatives.py:31 msgid "LXTerminal" msgstr "LXTerminal" #: ../kupfer/plugin/core/alternatives.py:40 msgid "X Terminal" msgstr "Terminal X" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "Urxvt" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Enregistrer sous..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Quitter" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Quitte Kupfer" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "À propos de Kupfer" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Affiche des informations sur les auteurs de Kupfer et la licence" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Manuel de Kupfer" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Obtenir de l'aide sur Kupfer" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Affiche la fenêtre des préférences de Kupfer" #: ../kupfer/plugin/core/__init__.py:64 msgid "Search Contents" msgstr "Recherche de contenu" #: ../kupfer/plugin/core/__init__.py:82 msgid "Search inside this catalog" msgstr "Rechercher à l'intérieur de ce catalogue" #: ../kupfer/plugin/core/__init__.py:90 msgid "Copy" msgstr "Copier" #: ../kupfer/plugin/core/__init__.py:105 msgid "Copy to clipboard" msgstr "Copier dans le presse-papiers" #: ../kupfer/plugin/core/__init__.py:127 msgid "Rescan" msgstr "Parcourir à nouveau" #: ../kupfer/plugin/core/__init__.py:142 msgid "Force reindex of this source" msgstr "Forcer la ré-indexation de cette source" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Dernière commande" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Éléments internes de Kupfer" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Dernier résultat" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Résultats de la commande" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Dictionnaire" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Rechercher un mot dans un dictionnaire" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Rechercher" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Documents" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "Documents récemment utilisés et dossiers en marque-page" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "Nombre maximal de jours pour les documents récents" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Éléments récents" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Documents utilisés récemment" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "Documents de %s" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Documents récemment utilisés pour %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Raccourcis" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Dossiers en marque-page" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Marque-pages d'Epiphany" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Index des marque-pages d'Epiphany" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Favoris" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "" "Marquer les éléments fréquemment utilisés et les enregistrer pour leur " "utilisation future" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "Bibliothèque d'éléments « favoris »" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Ajouter aux favoris" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Ajouter l'élément aux favoris" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Supprimer des favoris" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Supprime l'élément des favoris" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Actions sur les fichiers" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Actions supplémentaires sur les fichiers" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:211 msgid "Move To..." msgstr "Déplacer vers..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:253 msgid "Move file to new location" msgstr "Déplacer le fichier vers un nouvel emplacement" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Renommer..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:166 msgid "Copy To..." msgstr "Copier vers..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:207 msgid "Copy file to a chosen location" msgstr "Copier le fichier vers un emplacement choisi" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Marque-pages de Firefox" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Index des marque-pages de Firefox" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "Inclure les sites visités" #. TRANS: Multihead refers to support for multiple computer displays #. TRANS: In this case, it only concerns the special configuration #. TRANS: with multiple X "screens" #: ../kupfer/plugin/multihead.py:4 msgid "Multihead Support" msgstr "Prise en charge multi-écrans" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Fichier sélectionné" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" "Accéder à la sélection actuelle de nautilus grâce au greffon Nautilus de " "Kupfer" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Fichier sélectionné « %s »" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Fichiers sélectionnés" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Notes" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Notes Gnote ou Tomboy" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Travailler avec l'application" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Ouvrir avec l'application de notes" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Ajouter à la note..." #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Ajouter le texte à une note existante" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Créer une note" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Créer une nouvelle note à partir de ce texte" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Obtenir le résultat de la recherche dans les notes..." #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "Afficher les résultats de cette requête" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "aujourd'hui, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "hier, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Dernière mise à jour %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "" "Jouer, mettre en attente les pistes et parcourir la bibliothèque musicale" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Inclure les artistes au premier niveau" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Inclure les albums au premier niveau" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Inclure les pistes au premier niveau" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Lecture" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Reprendre la lecture dans Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Pause" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Met Rhythmbox en pause" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Suivant" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Aller à la piste suivante dans Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Précédent" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Aller à la piste précédente dans Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Afficher la lecture en cours" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Afficher le morceau en cours de lecture" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Effacer la file d'attente" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Lire les pistes dans Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Ajouter à la file d'attente" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Ajouter les pistes à la file d'attente de lecture" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "par %(artist)s sur %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "par %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Pistes de %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Albums" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Albums de la bibliothèque Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Artistes" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Artistes de la bibliothèque Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Chansons" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Chansons de la bibliothèque Rhythmbox" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "Gestion de la session GNOME" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "Éléments et actions spécifiques à l'environnement GNOME" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Fermer la session..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Fermer la session ou changer d'utilisateur" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Éteindre..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Éteindre, redémarrer ou mettre en veille l'ordinateur" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Verrouiller l'écran" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Activer l'économiseur d'écran et verrouiller" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "Gestion de la session XFCE" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Éléments et actions spécifiques à l'environnement XFCE" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Afficher le texte" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:58 msgid "Display text in a window" msgstr "Afficher le texte dans une fenêtre" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Afficher en gros" #: ../kupfer/plugin/show_text.py:66 msgid "Show Notification" msgstr "Afficher la notification" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Corbeille" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Accéder au contenu de la corbeille" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Déplacer vers la corbeille" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Déplacer le fichier vers la corbeille" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Restaurer" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Déplacer le fichier vers son emplacement original" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "La corbeille est vide" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "La corbeille contient un fichier" msgstr[1] "La corbeille contient %(num)s fichiers" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Raccourcis déclencheurs" #: ../kupfer/plugin/triggers.py:6 msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Attribuer des raccourcis clavier globaux (déclencheurs) aux éléments créés " "avec les commandes composées." #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Ajouter un raccourci déclencheur..." #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Supprimer le raccourci déclencheur" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "Actions sur les URL" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Télécharger et ouvrir" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Télécharger vers..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "Télécharger l'URL vers un emplacement choisi" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Volumes et disques" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Volumes et disques montés" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Volume monté sur %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Démonter" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Démonter ce volume" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Éjecter" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Démonter et éjecter ce média" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Rechercher sur le Web" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Rechercher sur le Web en utilisant les moteurs de recherche OpenSearch" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Rechercher avec..." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Rechercher..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Moteurs de recherche" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Rechercher sur Wikipedia" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Langue de Wikipedia" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "fr" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Rechercher ce terme sur %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Liste des fenêtres" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Toutes les fenêtres de tous les espaces de travail" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Activer" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Plier" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Déplier" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Minimiser" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Restaurer" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Maximiser" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Restaurer" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Maximiser verticalement" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Restaurer verticalement" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Fenêtre sur %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Fenêtre au premier plan" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Fenêtre suivante" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Afficher la fenêtre et aller sur son espace de travail" #: ../kupfer/plugin/windows.py:252 #, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "%d fenêtre" msgstr[1] "%d fenêtres" #: ../kupfer/plugin/windows.py:256 msgid "Active workspace" msgstr "Activer l'espace de travail" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Aller à cet espace de travail" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Espaces de travail" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Documents utilisés récemment dans Abiword" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Éléments récents d'Abiword" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Interface avec le gestionnaire de paquets APT" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Méthode d'installation" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Afficher les informations du paquet" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Installer" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Installer le paquet suivant la méthode configurée" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Paquets correspondant à « %s »" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Rechercher un paquet par nom..." #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "Parcourir les archives" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Parcourir l'intérieur des fichiers d'archives compressées" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "Contenu de %s" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "Ensemble d'icônes ASCII & unicode" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" "Génère les ensembles d'icônes ASCII et unicode qui utilisent les lettres et " "les symboles pour produire des icônes pour les objets trouvés dans Kupfer." #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "ASCII" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "Unicode" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Contrôle la lecture d'Audacious et sa liste de lecture" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Ajouter la piste à la file d'attente d'Audacious" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Retirer de la file d'attente" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Retirer la piste de la file d'attente d'Audacious" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Aller à la piste dans Audacious" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Reprendre la lecture dans Audacious" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Mettre en pause Audacious" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Aller à la piste suivante dans Audacious" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Aller à la piste précédente dans Audacious" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Vider la file d'attente d'Audacious" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Lecture aléatoire" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Basculer la lecture aléatoire dans Audacious" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Répéter" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Basculer la répétition dans Audacious" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Liste de lecture" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Marque-pages de Chromium" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Index des marque-pages de Chromium" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Contacts et actions pour Claws Mail" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Composer un nouveau courriel" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Composer un nouveau message dans Claws Mail" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Relever tous les courriels" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "Relever les nouveaux messages pour tous les comptes dans Claws Mail" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "Composer un courriel" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "Envoyer par courriel à..." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Composer un message dans Claws Mail et joindre le fichier" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Carnet d'adresses de Claws Mail" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Contacts depuis le carnet d'adresses de Claws Mail" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 msgid "Custom Terminal" msgstr "Terminal personnalisé" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "Configurer un émulateur de terminal personnalisé" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "Utiliser l'option" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "Thème personnalisé" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "Utiliser un thème de couleurs personnalisé" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "Thème :" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Client de messagerie par défaut" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "" "Composer un courriel en utilisant le gestionnaire par défaut mailto: du " "système" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Rechercher dans Devhelp" #: ../kupfer/plugin/duckduckgo.py:5 ../kupfer/plugin/duckduckgo.py:19 msgid "DuckDuckGo Search" msgstr "Rechercher avec DuckDuckGo" #: ../kupfer/plugin/duckduckgo.py:8 ../kupfer/plugin/duckduckgo.py:30 msgid "Search the web securely with DuckDuckGo" msgstr "Rechercher sur le Web en toute sécurité avec DuckDuckGo" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "Empathy" #: ../kupfer/plugin/empathy.py:6 msgid "Access to Empathy Contacts" msgstr "Accéder aux contacts Empathy" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Afficher les contacts déconnectés" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Disponible" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Absent" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Occupé" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Non disponible" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Invisible" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Déconnecté" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:93 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:197 msgid "Open Chat" msgstr "Ouvrir la fenêtre de discussion" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:121 #: ../kupfer/plugin/skype.py:243 msgid "Change Global Status To..." msgstr "Changer le statut global en..." #: ../kupfer/plugin/empathy.py:171 msgid "Empathy Contacts" msgstr "Contacts Empathy" #: ../kupfer/plugin/empathy.py:237 msgid "Empathy Account Status" msgstr "Statut du compte Empathy" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Contacts d'Evolution" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Composer un message dans Evolution" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Composer un message dans Evolution et joindre le fichier" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Carnet d'adresses d'Evolution" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Afficher les sites et gérer les adresses ftp par Filezilla" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Ouvrir le site avec Filezilla" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Sites Filezilla" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Sites de Filezilla" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Accéder aux contacts Gajim" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Libre pour discuter" #: ../kupfer/plugin/gajim.py:149 msgid "Gajim Contacts" msgstr "Contacts Gajim" #: ../kupfer/plugin/gajim.py:213 msgid "Gajim Account Status" msgstr "Statut du compte Gajim" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "Glob" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:234 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "Charger les contacts et composer un courriel dans Gmail" #: ../kupfer/plugin/gmail/__init__.py:33 msgid "Load contacts' pictures" msgstr "Charger les images des contacts" #: ../kupfer/plugin/gmail/__init__.py:39 msgid "Load additional information" msgstr "Charger des informations supplémentaires" #: ../kupfer/plugin/gmail/__init__.py:50 msgid "Work email" msgstr "Courriel professionnel" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Home email" msgstr "Courriel personnel" #: ../kupfer/plugin/gmail/__init__.py:52 msgid "Other email" msgstr "Autre courriel" #: ../kupfer/plugin/gmail/__init__.py:54 msgid "Work address" msgstr "Adresse professionnelle" #: ../kupfer/plugin/gmail/__init__.py:55 msgid "Home address" msgstr "Adresse personnelle" #: ../kupfer/plugin/gmail/__init__.py:56 msgid "Other address" msgstr "Autre adresse" #: ../kupfer/plugin/gmail/__init__.py:58 msgid "Car phone" msgstr "Téléphone de voiture" #: ../kupfer/plugin/gmail/__init__.py:59 msgid "Fax" msgstr "Fax" #: ../kupfer/plugin/gmail/__init__.py:61 msgid "Home phone" msgstr "Téléphone du domicile" #: ../kupfer/plugin/gmail/__init__.py:62 msgid "Home fax" msgstr "Fax du domicile" #: ../kupfer/plugin/gmail/__init__.py:63 msgid "Internal phone" msgstr "Téléphone interne" #: ../kupfer/plugin/gmail/__init__.py:64 msgid "Mobile" msgstr "Portable" #: ../kupfer/plugin/gmail/__init__.py:65 msgid "Other" msgstr "Autre" #: ../kupfer/plugin/gmail/__init__.py:66 msgid "VOIP" msgstr "VOIP" #: ../kupfer/plugin/gmail/__init__.py:67 msgid "Work phone" msgstr "Téléphone professionnel" #: ../kupfer/plugin/gmail/__init__.py:68 msgid "Work fax" msgstr "Fax professionnel" #: ../kupfer/plugin/gmail/__init__.py:93 msgid "Compose Email in Gmail" msgstr "Composer un courriel dans Gmail" #: ../kupfer/plugin/gmail/__init__.py:117 msgid "Open web browser and compose new email in Gmail" msgstr "Ouvrir le navigateur et composer un nouveau courriel dans Gmail" #: ../kupfer/plugin/gmail/__init__.py:123 msgid "Edit Contact in Gmail" msgstr "Modifier les contacts dans Gmail" #: ../kupfer/plugin/gmail/__init__.py:133 msgid "Open web browser and edit contact in Gmail" msgstr "Ouvrir le navigateur et modifier les contacts dans Gmail" #: ../kupfer/plugin/gmail/__init__.py:263 msgid "Contacts from Google services (Gmail)" msgstr "Contacts des services Google (Gmail)" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "Profils du terminal GNOME" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "Lancer les profils du terminal GNOME" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Afficher les albums et envoyer les fichiers vers Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "Utilisateurs à afficher : (séparés par une virgule)" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Charger les icônes des utilisateurs et des albums" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Envoyer des images" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Envoyer des images vers l'album Web Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Création de l'album :" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Album créé par Kupfer" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Fichier :" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "Un album" msgstr[1] "%(num)d albums" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "une photo" msgstr[1] "%(num)s photos" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Envoyer dans l'album Picasa..." #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Envoyer les fichiers vers l'album Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Envoyer vers Picasa en tant que nouvel album" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Créer un album à partir du dossier local sélectionné" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Albums Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Albums de l'utilisateur dans Picasa" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Rechercher sur Google" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Récupérer les résultats de Google et les afficher directement" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #, python-format msgid "Results for \"%s\"" msgstr "Résultats pour « %s »" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Afficher plus de résultats pour « %s »" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "%s résultats trouvés au total" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "Parcourir et créer de nouvelles tâches dans GTG" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "échéance : %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "début : %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "étiquette : %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Ouvrir la tâche dans Getting Things GNOME!" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Supprimer" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Supprime cette tâche pour toujours" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Marquer comme réalisée" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Marque cette tâche comme réalisée" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Annuler" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Marque cette tâche comme n'étant plus à faire" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Créer une tâche" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Crée une nouvelle tâche dans Getting Things GNOME" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "Gwibber" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" "Micro-blogage avec Gwibber. Permet l'envoi et la réception de messages à " "partir de réseaux sociaux comme Twitter, Identi.ca, etc. Nécessite le paquet " "« gwibber-service »." #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "Nombre maximum de messages à afficher" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s sur %(service)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s le %(when)s sur %(where)s" #: ../kupfer/plugin/gwibber.py:187 msgid "Send Message" msgstr "Envoyer un message" #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "Envoie un message vers tous les comptes Gwibber" #: ../kupfer/plugin/gwibber.py:210 msgid "Send Message To..." msgstr "Envoyer un message à..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "Envoie un message vers un compte Gwibber" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Envoyer un message..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "Envoie un message vers le compte Gwibber sélectionné" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Répondre..." #: ../kupfer/plugin/gwibber.py:314 msgid "Delete Message" msgstr "Supprimer un message" #: ../kupfer/plugin/gwibber.py:337 msgid "Send Private Message..." msgstr "Envoyer un message privé..." #: ../kupfer/plugin/gwibber.py:370 msgid "Send direct message to user" msgstr "Envoie un message direct à l'utilisateur" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "Renvoyer un tweet" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet To..." msgstr "Renvoyer un tweet à..." #: ../kupfer/plugin/gwibber.py:407 msgid "Retweet message to all Gwibber accounts" msgstr "Renvoyer un tweet à tous les comptes dans Gwibber" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "Renvoyer un tweet vers un compte Gwibber" #: ../kupfer/plugin/gwibber.py:413 msgid "Open in Browser" msgstr "Ouvrir dans le navigateur" #: ../kupfer/plugin/gwibber.py:419 msgid "Open message in default web browser" msgstr "Ouvre le message dans le navigateur Web par défaut" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 msgid "Gwibber Accounts" msgstr "Comptes Gwibber" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "Comptes configurés dans Gwibber" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "Messages Gwibber" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "Messages récents reçus par Gwibber" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "Message Gwibber vers %s" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "Flux Gwibber" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "Flux configurés dans Gwibber" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "Messages Gwibber dans %s" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "Gwibber (simple)" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "Envoie des mises à jour via le client de micro-blogage Gwibber" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "Envoyer des mises à jour" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "Impossible d'activer le service Gwibber" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Actions de haut-niveau" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Outils pour manipuler les commandes comme des objets" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Sélectionner dans Kupfer" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Résultat de %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Exécuter (récupérer le résultat)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Réutiliser le résultat de la commande en tant qu'objet de procuration" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Exécuter (ignorer le résultat)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Outils d'image" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Outils de transformation d'images" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Mise à l'échelle..." #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Redimensionne l'image pour correspondre aux nombres donnés en pixel" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Rotation dans le sens des aiguilles d'une montre" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Rotation dans le sens inverse des aiguilles d'une montre" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Rotation automatique" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Rotation JPEG (en dur) selon les informations EXIF (métadata)" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Greffons Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Accéder à la liste des greffons de Kupfer depuis Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Afficher les informations" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Afficher le code source" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "activé" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Localiser des fichiers" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Rechercher dans le système de fichiers en utilisant locate" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Ignorer la casse lors des recherches de fichiers" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "OpenOffice / LibreOffice" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Documents récemment utilisés dans OpenOffice/LibreOffice" #: ../kupfer/plugin/openoffice.py:83 msgid "OpenOffice/LibreOffice Recent Items" msgstr "Éléments récents OpenOffice/LibreOffice" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera Mail" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Contacts et actions pour Opera Mail" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Composer un nouveau message dans Opera Mail" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Contacts Opera Mail" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Contacts depuis Opera Mail" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Marque-pages d'Opera" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Liste des marque-pages Opera" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Accéder aux contacts de Pidgin" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d caractère)" msgstr[1] "%s (%d caractères)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Contacts Pidgin" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "Sessions PuTTY" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Accès rapide aux sessions PuTTY" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Démarrer la session" #: ../kupfer/plugin/qsicons/__init__.py:24 msgid "Quicksilver Icons" msgstr "Icônes Quicksilver" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "Quick Image Viewer" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "Afficher l'image" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "reStructuredText" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "Rendre avec reStructuredText et afficher le résultat" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Voir comme un document HTML" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "Activer les sessions GNU Screen" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Attachée" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Détachée" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "Session %(status)s (%(pid)s) créée le %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Sessions Screen" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Attacher" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:52 msgid "Send Keys" msgstr "Send Keys" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "Envoyer des évènements clavier synthétique en utilisant xautomation" #: ../kupfer/plugin/sendkeys.py:28 msgid "Paste to Foreground Window" msgstr "Coller vers la fenêtre au premier plan" #: ../kupfer/plugin/sendkeys.py:46 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "" "Copie dans le presse-papier et envoie Ctrl+V à la fenêtre au premier plan" #: ../kupfer/plugin/sendkeys.py:101 msgid "Send keys to foreground window" msgstr "Envoyer des touches à la fenêtre au premier plan" #: ../kupfer/plugin/sendkeys.py:106 msgid "Type Text" msgstr "Saisir du texte" #: ../kupfer/plugin/sendkeys.py:127 msgid "Type the text to foreground window" msgstr "Saisir du texte dans la fenêtre au premier plan" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Services système" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "Démarre, arrête ou redémarre les services système via les scripts init" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Commande de type sudo" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Démarrer le service" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Redémarrer le service" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Arrêter le service" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "Service %s" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Raccourcir les liens" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Créer des raccourcis pour les URLs longues" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Erreur" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Raccourcir avec..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Services" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 msgid "Show QRCode" msgstr "Afficher le code QR" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 msgid "Display text as QRCode in a window" msgstr "Afficher du texte sous la forme de code QR dans une fenêtre" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Accéder aux contacts Skype" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Appelez moi" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Déconnecté" #: ../kupfer/plugin/skype.py:179 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:218 msgid "Call" msgstr "Appeler" #: ../kupfer/plugin/skype.py:232 msgid "Place a call to contact" msgstr "Faire un appel vers un contact" #: ../kupfer/plugin/skype.py:267 msgid "Skype Contacts" msgstr "Contacts Skype" #: ../kupfer/plugin/skype.py:287 msgid "Skype Statuses" msgstr "Statuts Skype" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "Hôtes SSH" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "Ajouter les hôtes SSH trouvés dans ~/.ssh/config." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "Hôte SSH" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Se connecter" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "Se connecter à un hôte SSH" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "Hôtes SSH tels qu'indiqués dans ~/.ssh/config" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Aucune connexion D-Bus vers la session de bureau" #: ../kupfer/plugin_support.py:171 msgid "GNOME Keyring" msgstr "Trousseau GNOME" #: ../kupfer/plugin_support.py:172 msgid "KWallet" msgstr "KWallet" #: ../kupfer/plugin_support.py:173 msgid "Unencrypted File" msgstr "Fichier non chiffré" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Modèles de documents" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Créer de nouveaux documents depuis vos modèles" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "Modèle %s" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Fichier vide" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Nouveau dossier" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Créer un nouveau document..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Créer un nouveau document depuis un modèle" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Créer un nouveau document dans..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "Fichiers texte" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Ajouter à..." #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Ajouter..." #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Écrire dans..." #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Obtenir le contenu texte" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:185 #: ../kupfer/plugin/thunar.py:225 ../kupfer/plugin/thunar.py:278 #: ../kupfer/plugin/thunar.py:329 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:11 msgid "File manager Thunar actions" msgstr "Actions du gestionnaire de fichiers Thunar" #: ../kupfer/plugin/thunar.py:67 msgid "Select in File Manager" msgstr "Sélectionner dans le gestionnaire de fichiers" #: ../kupfer/plugin/thunar.py:95 msgid "Show Properties" msgstr "Afficher les propriétés" #: ../kupfer/plugin/thunar.py:118 msgid "Show information about file in file manager" msgstr "" "Affiche les informations sur le fichier dans le gestionnaire de fichiers" #: ../kupfer/plugin/thunar.py:127 msgid "Send To..." msgstr "Envoyer à..." #: ../kupfer/plugin/thunar.py:259 msgid "Symlink In..." msgstr "Lien symbolique dans..." #: ../kupfer/plugin/thunar.py:300 msgid "Create a symlink to file in a chosen location" msgstr "Créer un lien symbolique vers le fichier vers l'emplacement choisi" #: ../kupfer/plugin/thunar.py:304 msgid "Empty Trash" msgstr "Vider la corbeille" #: ../kupfer/plugin/thunar.py:344 msgid "Thunar Send To Objects" msgstr "Objets envoyés par Thunar" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Contacts et actions de Thunderbird/Icedove" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Composer un nouveau message dans Thunderbird" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Carnet d'adresses de Thunderbird" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Contacts du carnet d'adresses de Thunderbird" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Top" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "" "Affiche les tâches en cours d'exécution et permet de leur envoyer un signal" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Ordre de tri" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Ligne de commande" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "Utilisation du processeur (ordre descendant)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Utilisation de la mémoire (ordre descendant)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Envoyer un signal..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Signaux" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Tâches en cours d'exécution" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid : %(pid)s cpu : %(cpu)g%% mem : %(mem)g%% durée : %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Tâches en cours d'exécution pour l'utilisateur courant" #: ../kupfer/plugin/tracker1.py:10 msgid "Tracker" msgstr "Tracker" #: ../kupfer/plugin/tracker1.py:18 ../kupfer/plugin/tracker.py:15 msgid "Tracker desktop search integration" msgstr "Intégration avec le moteur de recherche Tracker pour le bureau" #: ../kupfer/plugin/tracker1.py:49 ../kupfer/plugin/tracker.py:41 msgid "Search in Tracker" msgstr "Rechercher dans Tracker" #: ../kupfer/plugin/tracker1.py:54 ../kupfer/plugin/tracker.py:46 msgid "Open Tracker Search Tool and search for this term" msgstr "Ouvrir le moteur de recherche Tracker et rechercher ce terme" #: ../kupfer/plugin/tracker1.py:62 ../kupfer/plugin/tracker.py:55 msgid "Get Tracker Results..." msgstr "Obtenir les résultats de Tracker..." #: ../kupfer/plugin/tracker1.py:71 ../kupfer/plugin/tracker.py:64 msgid "Show Tracker results for query" msgstr "Affiche les résultats de la requête de Tracker" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Étiquettes de Tracker" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Étiquettes de Tracker" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Parcourir les étiquettes de Tracker" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "Étiquette %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Éléments étiquetés %s avec Tracker" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Ajouter une étiquette..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Ajoute l'étiquette Tracker au fichier" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Retirer l'étiquette..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Retirer l'étiquette Tracker du fichier" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Volumes de l'historique de TrueCrypt" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "Volume TrueCrypt : %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Monter un volume" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Monter avec Truecrypt" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Essaie de monter le fichier en tant que volume Truecrypt" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Démonter tous les volumes" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "Volumes TrueCrypt" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Terminal Server Client" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Session sauvegardée dans Terminal Server Client" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "Sessions TSClient" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Sessions sauvegardées dans Terminal Server Client" #: ../kupfer/plugin/vim/__init__.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim/__init__.py:4 msgid "Recently used documents in Vim" msgstr "Documents utilisés récemment dans Vim" #: ../kupfer/plugin/vim/plugin.py:56 msgid "Vim Recent Documents" msgstr "Documents récents Vim" #: ../kupfer/plugin/vim/plugin.py:219 msgid "Close (Save All)" msgstr "Fermer (tout enregistrer)" #: ../kupfer/plugin/vim/plugin.py:237 msgid "Send..." msgstr "Envoyer..." #: ../kupfer/plugin/vim/plugin.py:264 msgid "Send ex command" msgstr "Envoyer une commande en mode ex" #: ../kupfer/plugin/vim/plugin.py:272 msgid "Insert in Vim..." msgstr "Insérer dans Vim..." #: ../kupfer/plugin/vim/plugin.py:309 msgid "Active Vim Sessions" msgstr "Sessions Vim actives" #: ../kupfer/plugin/vim/plugin.py:338 #, python-format msgid "Vim Session %s" msgstr "Sessions Vim %s" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Marque-pages et actions pour Vinagre" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Démarrer une session Vinagre" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Marque-pages Vinagre" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "Contrôle les machines virtuelles VirtualBox. Supporte à la fois la version " "de Sun et l'édition Open Source." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "Obliger l'utilisation de l'interface en ligne de commande" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Allumer" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Allumer sans affichage" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Envoyer le signal d'extinction" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Redémarrer" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Reprendre" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Sauvegarder l'état" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Éteindre" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "Machines VirtualBox" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:11 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "Accède aux pages stockées dans Zim - Un wiki pour le bureau" #: ../kupfer/plugin/zim.py:30 msgid "Page names start with :colon" msgstr "Les noms des pages commencent par « : » (deux points)" #: ../kupfer/plugin/zim.py:36 msgid "Default page name for quick notes" msgstr "Nom de la page par défaut pour les notes rapides" #: ../kupfer/plugin/zim.py:38 #, python-format msgid "Note %x %X" msgstr "Note %x %X" #: ../kupfer/plugin/zim.py:39 msgid "" "Strftime tags can be used: %H - hour, %M - minutes, etc\n" "Please check python documentation for details.\n" "NOTE: comma will be replaced by _" msgstr "" "Des étiquettes strftime peuvent être utilisées : %H - heure, %M - minutes, " "etc.\n" "Consultez la documentation python pour plus de détails.\n" "Note : les virgules seront remplacées par _" #: ../kupfer/plugin/zim.py:45 msgid "Default namespace for quick notes" msgstr "Espace de nom par défaut pour les notes rapides" #: ../kupfer/plugin/zim.py:80 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Page Zim du bloc-notes « %s »" #: ../kupfer/plugin/zim.py:89 msgid "Create Zim Page" msgstr "Créer une page Zim" #: ../kupfer/plugin/zim.py:96 msgid "Create page in default notebook" msgstr "Créer une page dans le bloc-notes par défaut" #: ../kupfer/plugin/zim.py:108 msgid "Create Zim Page In..." msgstr "Créer une page Zim dans..." #: ../kupfer/plugin/zim.py:132 msgid "Insert QuickNote into Zim" msgstr "Insérer des notes rapides dans Zim" #: ../kupfer/plugin/zim.py:142 msgid "Quick note selected text into Zim notebook" msgstr "" "Créer une note rapide à partir du texte sélectionné dans les bloc-notes de " "Zim" #: ../kupfer/plugin/zim.py:191 msgid "Create Subpage..." msgstr "Créer une sous-page..." #: ../kupfer/plugin/zim.py:370 msgid "Zim Notebooks" msgstr "Bloc-notes Zim" #: ../kupfer/plugin/zim.py:387 msgid "Zim Pages" msgstr "Pages Zim" #: ../kupfer/plugin/zim.py:415 msgid "Pages stored in Zim Notebooks" msgstr "Pages stockées dans les bloc-notes de Zim" kupfer-v208/po/gl.po000066400000000000000000002463201176220042200144320ustar00rootroot00000000000000# 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. # Fran Diéguez , 2010. # msgid "" msgstr "" "Project-Id-Version: kupfer\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2011-04-14 21:40+0200\n" "PO-Revision-Date: 2010-12-11 00:24+0100\n" "Last-Translator: Fran Diéguez \n" "Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "X-Poedit-Language: Galician\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "Iniciador de aplicativos" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "Ferramenta cómoda para controlar e acceder a aplicativos e documentos" #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Executar en Kupfer" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Gardouse a orde de Kupfer" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "Atallos de teclado do explorador" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "Atallos de teclado globais" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Iniciar" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:150 msgid "Catalog" msgstr "Catálogo" #: ../data/preferences.ui.h:5 #, fuzzy msgid "Desktop Environment" msgstr "Aplicativos para o contorno do escritorio" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "" #: ../data/preferences.ui.h:7 msgid "General" msgstr "Xeral" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "" #: ../data/preferences.ui.h:9 #, fuzzy msgid "Inclusion in Top Level Searches" msgstr "Incluír as cancións no nivel superior" #: ../data/preferences.ui.h:10 #, fuzzy msgid "Indexed Folders" msgstr "Novo cartafol" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "Teclado" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Preferencias de Kupfer" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "Engadidos" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:844 msgid "Reset" msgstr "Restabelecer" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "Mostrar a icona na área de notificacións" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "Abrir automaticamente ao iniciar a sesión " #: ../data/preferences.ui.h:19 #, fuzzy msgid "Terminal emulator:" msgstr "Abrir o terminal aquí" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "Usar ordes dunha soa tecla (espazo, /, punto, coma, etc.)" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Credenciais do usuario" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "_Cambiar" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "C_ontrasinal:" #: ../data/credentials_dialog.ui.h:4 msgid "_User:" msgstr "_Usuario:" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "Non foi posíbel ligar a combinación de teclas" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Prema a combinación de teclas desexada" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "Estabelecer o atallo do teclado" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "non mostrar a interface principal ao iniciar" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "lista de engadidos dispoñíbeis" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "activar a información de depuración" #: ../kupfer/main.py:46 msgid "run keyboard shortcut relay service on this display" msgstr "" #: ../kupfer/main.py:49 msgid "show usage help" msgstr "mostrar a axuda" #: ../kupfer/main.py:50 msgid "show version information" msgstr "mostrar a información da versión" #: ../kupfer/main.py:56 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Uso: kupfer [OPCIÓNS | FICHEIRO ...]" #: ../kupfer/main.py:67 msgid "Available plugins:" msgstr "Engadidos dispoñíbeis:" #: ../kupfer/main.py:114 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "Activación alternativa" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Truco da coma" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Escribir unha orde" #: ../kupfer/ui/accelerators.py:11 #, fuzzy msgid "Mark Default Action" msgstr "Estabelecer o aplicativo predefinido..." #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Restabelecer todo" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Seleccionar «Saír»" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Seleccionar «Ficheiro seleccionado»" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Seleccionar «Texto seleccionado»" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Mostrar a axuda" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Mostrar as preferencias" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "Cambiar ao primeiro panel" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Alternar o «Modo texto»" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s está baleiro" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "Non hai resultados en %(src)s para «%(query)s»" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Non hai resultados" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Teclear para buscar" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Teclear para buscar %s" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Sen acción" #: ../kupfer/ui/browser.py:1461 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1471 #, python-format msgid "Forget About \"%s\"" msgstr "" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1903 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Mostrar a interface principal" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Mostrar coa selección" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Descrición" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Autor" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Vesión" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Precísase o módulo Python «%s»" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Non foi posíbel ler o engadido por mor dun erro:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "desactivado" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Contido de" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Fontes" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Accións" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:589 msgid "Configuration" msgstr "Configuración" #: ../kupfer/ui/preferences.py:609 msgid "Set username and password" msgstr "Estabelecer o nome do usuario e o contrasinal" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:663 msgid "Choose a Directory" msgstr "Escoller un directorio" #: ../kupfer/ui/preferences.py:842 msgid "Reset all shortcuts to default values?" msgstr "" "Desexa restabelecer os valores predefinidos de todos os atallos do teclado?" #: ../kupfer/ui/preferences.py:850 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Orde" #: ../kupfer/ui/preferences.py:851 msgid "Shortcut" msgstr "Atallo" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "Marcos Lans - marcoslansgarza@gmail.com, 2010;" #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Un iniciador de aplicativos libre (GPLv3+)" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Este programa é software libre, vostede pode redistribuílo e/ou modificalo\n" "baixo os termos da Licenza Pública Xeral de GNU publicada pola Free\n" "Software Foundation, tanto a versión 3 como as posteriores.\n" "\n" "Este programa distribúese coa esperanza de que lle sexa útil, pero\n" "SEN GARANTÍA NINGUNHA, incluso sen a garantía de MERCANTIBILIDADE\n" "ou ADECUACIÓN A UN PROPÓSITO EN PARTICULAR. Vexa a Licenza \n" "Pública Xeral para ter máis detalles.\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "Non foi posíbel encontrar un Kupfer en execución" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Non foi posíbel executar «%s»" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "«%s» xerou un resultado" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "Non ten permisos para executar «%s» (non é executábel)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "A orde en «%s» non está dispoñíbel" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 #, fuzzy msgid "Text" msgstr "Mostrar o texto" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Executar despois do atraso..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Executar unha orde despois dun intervalo de tempo especificado" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Obxectos múltiples" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s obxecto" msgstr[1] "%s obxectos" #: ../kupfer/obj/contacts.py:87 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:107 msgid "Open" msgstr "Abrir" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Non existe un aplicativo predefinido para %(file)s (%(type)s)" #: ../kupfer/obj/fileactions.py:45 #, fuzzy, python-format msgid "Please use \"%s\"" msgstr "Ficheiro seleccionado «%s»" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Estabelecer o aplicativo predefinido..." #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Abrir co aplicativo predefinido" #: ../kupfer/obj/fileactions.py:77 msgid "Reveal" msgstr "Mostrar" #: ../kupfer/obj/fileactions.py:86 msgid "Open parent folder" msgstr "Abrir o cartafol pai" #: ../kupfer/obj/fileactions.py:92 msgid "Open Terminal Here" msgstr "Abrir o terminal aquí" #: ../kupfer/obj/fileactions.py:105 msgid "Open this location in a terminal" msgstr "Abrir esta localización no terminal" #: ../kupfer/obj/fileactions.py:113 msgid "Run in Terminal" msgstr "Executar no terminal" #: ../kupfer/obj/fileactions.py:113 msgid "Run (Execute)" msgstr "Executar" #: ../kupfer/obj/fileactions.py:133 msgid "Run this program in a Terminal" msgstr "Executar este programa no terminal" #: ../kupfer/obj/fileactions.py:135 msgid "Run this program" msgstr "Executar este programa" #: ../kupfer/obj/objects.py:248 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 msgid "Go To" msgstr "Ir a" #: ../kupfer/obj/objects.py:274 msgid "Open URL" msgstr "Abrir o URL" #: ../kupfer/obj/objects.py:285 msgid "Open URL with default viewer" msgstr "Abrir o URL co visualizador predefinido" #: ../kupfer/obj/objects.py:299 msgid "Launch" msgstr "Iniciar" #: ../kupfer/obj/objects.py:312 msgid "Show application window" msgstr "Mostrar a xanela do aplicativo" #: ../kupfer/obj/objects.py:313 msgid "Launch application" msgstr "Iniciar o aplicativo" #: ../kupfer/obj/objects.py:324 msgid "Launch Again" msgstr "Iniciar outra vez" #: ../kupfer/obj/objects.py:331 msgid "Launch another instance of this application" msgstr "Iniciar outra instancia deste aplicativo" #: ../kupfer/obj/objects.py:337 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Pechar" #: ../kupfer/obj/objects.py:345 msgid "Attempt to close all application windows" msgstr "Tentar pechar todas as xanelas do aplicativo" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:392 msgid "Run" msgstr "Executar" #: ../kupfer/obj/objects.py:402 msgid "Perform command" msgstr "Executar a orde" #: ../kupfer/obj/objects.py:416 #, fuzzy msgid "(Empty Text)" msgstr "Ficheiro baleiro" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:432 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "«%(text)s»" msgstr[1] "(%(num)d liñas) «%(text)s»" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s e outros." #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Fonte recursiva de %(dir)s, (%(levels)d niveis)" #: ../kupfer/obj/sources.py:103 #, python-format msgid "Directory source %s" msgstr "Directorio fonte %s" #: ../kupfer/obj/sources.py:113 msgid "Home Folder" msgstr "Cartafol persoal" #: ../kupfer/obj/sources.py:124 msgid "Catalog Index" msgstr "Índice do catálogo" #: ../kupfer/obj/sources.py:139 msgid "An index of all available sources" msgstr "Un índice de todas as fontes dispoñíbeis" #: ../kupfer/obj/sources.py:170 msgid "Root catalog" msgstr "Catálogo raíz" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Configurar o engadido" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "O engadido %s non está configurado" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "As credenciais de usuario son incorrectas para %s" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "" #: ../kupfer/plugin/core/alternatives.py:13 #, fuzzy msgid "GNOME Terminal" msgstr "Perfís do terminal de GNOME" #: ../kupfer/plugin/core/alternatives.py:22 #, fuzzy msgid "XFCE Terminal" msgstr "Executar no terminal" #: ../kupfer/plugin/core/alternatives.py:31 #, fuzzy msgid "LXTerminal" msgstr "Executar no terminal" #: ../kupfer/plugin/core/alternatives.py:40 #, fuzzy msgid "X Terminal" msgstr "Executar no terminal" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Gardar como..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Saír" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Saír de Kupfer" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "Sobre Kupfer" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Mostrar a información sobre os autores e a licenza de Kupfer" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Axuda de Kupfer" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Obter axuda con Kupfer" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Mostrar a xanela de preferencias de Kupfer" #: ../kupfer/plugin/core/__init__.py:65 msgid "Search Contents" msgstr "Contidos da busca" #: ../kupfer/plugin/core/__init__.py:83 msgid "Search inside this catalog" msgstr "Buscar neste catálogo" #: ../kupfer/plugin/core/__init__.py:91 msgid "Copy" msgstr "Copiar" #: ../kupfer/plugin/core/__init__.py:106 msgid "Copy to clipboard" msgstr "Copiar ao portapapeis" #: ../kupfer/plugin/core/__init__.py:128 msgid "Rescan" msgstr "Escanear outra vez" #: ../kupfer/plugin/core/__init__.py:143 msgid "Force reindex of this source" msgstr "Forzar a reindexación desta fonte" #: ../kupfer/plugin/core/selection.py:8 ../kupfer/plugin/core/selection.py:36 msgid "Selected Text" msgstr "Texto seleccionado" #: ../kupfer/plugin/core/selection.py:23 #, python-format msgid "Selected Text \"%s\"" msgstr "Texto seleccionado «%s»" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Última orde" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Obxectos internos de Kupfer" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Último resultado" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Resultados da orde" #: ../kupfer/plugin/archivemanager.py:1 #, fuzzy msgid "Archive Manager" msgstr "Arquivo" #: ../kupfer/plugin/archivemanager.py:9 #, fuzzy msgid "Use Archive Manager actions" msgstr "Accións do xestor de ficheiros Thunar" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Tipo de arquivo comprimido para «Crear un arquivo en»" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Extraer aquí" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Extraer o arquivo comprimido" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Crear un arquivo" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Crear o arquivo comprimido dun cartafol" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Crear un arquivo en..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Arquivo" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Aplicativos" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Todos os aplicativos e preferencias" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Aplicativos para o contorno do escritorio" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Abrir con…" #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Abrir con calquera aplicativo" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Estabelecer o aplicativo predefinido para abrir este tipo de ficheiro" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Calculadora" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Calcular as expresións que comezan con «=»" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Calcular" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:71 msgid "Clipboards" msgstr "Portapapeis" #: ../kupfer/plugin/clipboard.py:4 ../kupfer/plugin/clipboard.py:111 msgid "Recent clipboards" msgstr "Portapapeis recentes" #: ../kupfer/plugin/clipboard.py:20 msgid "Number of recent clipboards" msgstr "Número de portapapeis recentes" #: ../kupfer/plugin/clipboard.py:26 msgid "Include recent selections" msgstr "Incluír as seleccións recentes" #: ../kupfer/plugin/clipboard.py:32 msgid "Copy selection to primary clipboard" msgstr "Copiar as seleccións ao portapapeis primario" #: ../kupfer/plugin/clipboard.py:44 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Portapapeis «%(desc)s»" msgstr[1] "Portapapeis con %(num)d liñas «%(desc)s»" #: ../kupfer/plugin/clipboard.py:51 msgid "Clear" msgstr "Limpar" #: ../kupfer/plugin/clipboard.py:63 msgid "Remove all recent clipboards" msgstr "Eliminar os elementos recentes do portapeis" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Ordes da Shell" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Executar (obter a información de saída)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Executar o programa e mostrar a información de saída" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 #, fuzzy msgid "Pass to Command..." msgstr "Última orde" #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 #, fuzzy msgid "Write to Command..." msgstr "Escribir en…" #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 #, fuzzy msgid "Run program and supply text on the standard input" msgstr "Executar o programa e mostrar a información de saída" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "" #: ../kupfer/plugin/commands.py:215 #, fuzzy msgid "Run command-line programs" msgstr "Executar programas por liña de ordes" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Dicionario" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Buscar unha palabra no dicionario" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Buscar" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Documentos" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "Documentos usados recentemente e cartafoles marcados" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "Número máximo de días para os documentos recentes" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Elementos recentes" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Documentos usados recentemente" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "Documentos %s" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Documentos usados recentemente por %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Lugares" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Cartafoles marcados" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Marcadores de Epiphany" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Índice dos marcadores de Epiphany" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Favoritos" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "" "Marcar os elementos usados habitualmente e gardar os obxectos para usalos " "máis tarde" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "Andel de «Favoritos»" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Engadir aos favoritos" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Engadir un elemento ao andel de favoritos" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Eliminar dos favoritos" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Eliminar o elemento do andel de favoritos" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Accións sobre os ficheiros" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Máis accións sobre os ficheiros" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:210 msgid "Move To..." msgstr "Mover a..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:252 msgid "Move file to new location" msgstr "Mover o ficheiro a unha nova localización" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Renomear como..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:165 msgid "Copy To..." msgstr "Copiar a…" #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:206 msgid "Copy file to a chosen location" msgstr "Copiar o ficheiro á localización escollida" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Marcadores de Firefox" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Índice dos marcadores de Firefox" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "Incluír os sitios visitados" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Ficheiro seleccionado" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" "Proporciona a selección actual do nautilus usando a extensión para nautilus " "de Kupfer" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Ficheiro seleccionado «%s»" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Ficheiros seleccionados" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Notas" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Notas de GNote ou Tomboy" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Traballar con un aplicativo" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Abrir co aplicativo de notas" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Anexar á nota..." #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Engadir un texto a unha nota existente" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Crear unha nota" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Crear unha nota nova con este texto" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Buscar nas notas..." #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "Mostrar os resultados da busca desta consulta" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "hoxe, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "onte, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Última actualización %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "Reproducir, poñer as pistas na cola e explorar a biblioteca da música" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Incluír os artistas no nivel superior" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Incluír os álbums no nivel superior" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Incluír as cancións no nivel superior" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Reproducir" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Continuar a reprodución en Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Deter" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Deter a reprodución en Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Seguinte" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Saltar á pista seguinte en Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Anterior" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Saltar á pista anterior en Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Mostrar a reprodución en curso" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Mostrar que canción está en reprodución" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Limpar a cola" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Reproducir as pistas en Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Na cola" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Engadir as pistas á cola de reprodución" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "por %(artist)s de %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "por %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Pistas por %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Álbums" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Álbums musicais na biblioteca de Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Artistas" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Artistas musicais na biblioteca de Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Cancións" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Cancións da biblioteca de Rhythmbox" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "Xestión de sesións de GNOME" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "Elementos e accións especiais para o contorno de GNOME" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Terminar a sesión..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Terminar a sesión ou cambiar de usuario" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Apagar..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Apagar, reiniciar ou suspender o computador" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Bloquear a pantalla" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Activar o salvapantallas e bloquear" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "Xestión de sesións de XFCE" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Elementos e accións especiais para o contorno de XFCE" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Mostrar o texto" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:52 msgid "Display text in a window" msgstr "Mostrar o texto nunha xanela" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Tipo grande" #: ../kupfer/plugin/show_text.py:60 msgid "Show Notification" msgstr "Mostrar a notificación" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Lixo" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Acceder aos contidos do lixo" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Mover ao lixo" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Mover este ficheiro ao lixo" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Restabelecer" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Mover o ficheiro á localización orixinal" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "O lixo está baleiro" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "Hai un ficheiro no lixo" msgstr[1] "Hai %(num)s ficheiros no lixo" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Disparadores" #: ../kupfer/plugin/triggers.py:6 #, fuzzy msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Asignar combinacións globais de teclas (disparadores) aos obxectos creados " "con «Escribir unha orde» (Ctrl+Retorno)." #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Engadir un disparador..." #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Eliminar o disparador" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "Accións sobre os URL" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Descargar e abrir" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Descargar en…" #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "Descargar un URL nunha localización escollida" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Volumes e discos" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Volumes e discos montados" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Volume montado en %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Desmontar" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Desmontar este volume" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Expulsar" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Desmontar e expulsar este medio" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Buscar na web" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Buscar na web con motores OpenSearch" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Buscar con…" #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Buscar…" #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Motores de busca" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Buscar na Wikipedia" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Idioma da Wikipedia" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "gl" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Buscar este termo en %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Lista de xanelas" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Todas as xanelas en todos os espazos de traballo" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Activación" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Pregar" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Despregar" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Minimizar" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Restabelecer" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Maximizar" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Restabelecer" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Maximizar verticalmente" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Restabelecer verticalmente" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Xanela no %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Xanela en primeiro plano" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Seguinte xanela" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Saltar ao espazo de traballo desta xanela e focalizar" #: ../kupfer/plugin/windows.py:252 #, fuzzy, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "Seguinte xanela" msgstr[1] "Seguinte xanela" #: ../kupfer/plugin/windows.py:256 #, fuzzy msgid "Active workspace" msgstr "Saltar a este espazo de traballo" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Saltar a este espazo de traballo" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Espazos de traballo" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Documentos usados recentemente en Abiword" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Elementos recentes de Abiword" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Interface co xestor de paquetes APT" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Método de instalación" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Mostrar a información do paquete" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Instalar" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Instalar o paquete usando o método configurado" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Paquetes coincidentes con «%s»" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Buscar o paquete polo nome..." #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "Arquivadores profundos" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Permitir a exploración dos ficheiros nos arquivos comprimidos" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "Contido de %s" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Controlar a reprodución e as listas de Audacious" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Engadir unha pista á cola de reprodución de Audacious" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Retirar da cola" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Eliminar a pista da cola de reprodución de Audacious" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Ir á pista en Audacious" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Continuar a reprodución en Audacious" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Deter a reprodución en Audacious" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Ir á pista seguinte en Audacious" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Ir á pista anterior en Audacious" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Limpar a cola de reprodución de Audacious" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Aleatorio" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Cambiar o modo aleatorio en Audacious" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Repetir" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Cambiar o modo reprodución en Audacious" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Lista de reprodución" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Marcadores de Chromium" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Índice dos marcadores de Chromium" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Contactos e accións de Claws Mail" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Escribir un novo correo-e" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Escribir unha nova mensaxe en Claws Mail" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Recibir todos os correos-e" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "Recibir as novas mensaxes de todas as contas de ClawsMail" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "Escribir un correo-e" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "Enviar un correo-e a…" #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Escribir unha nova mensaxe en Claws Mail e anexarlle un ficheiro" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Axenda de enderezos de Claws Mail" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Contactos da axenda de enderezos de Claws Mail" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 #, fuzzy msgid "Custom Terminal" msgstr "Executar no terminal" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "Executar opción" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Cliente de correo-e predefinido" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "" "Escribir un correo-e usando o xestor de correo predefinido no sistema: " "manexador" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Buscar en Devhelp" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "" #: ../kupfer/plugin/empathy.py:6 #, fuzzy msgid "Access to Empathy Contacts" msgstr "Acceder aos contactos de Gajim" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Mostrar os contactos desconectados" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Dispoñíbel" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Ausente" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Ocupado" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Non dispoñíbel" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Invisíbel" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Desconectado" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:90 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:204 msgid "Open Chat" msgstr "Abrir unha conversa" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:118 #: ../kupfer/plugin/skype.py:250 msgid "Change Global Status To..." msgstr "Cambiar o estado global a..." #: ../kupfer/plugin/empathy.py:171 #, fuzzy msgid "Empathy Contacts" msgstr "Contactos de Gajim" #: ../kupfer/plugin/empathy.py:237 #, fuzzy msgid "Empathy Account Status" msgstr "Estado da conta de Gajim" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Contactos de Evolution" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Escribir unha nova mensaxe en Evolution" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Escribir unha nova mensaxe en Evolution e anexarlle un ficheiro" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Axenda de enderezos de Evolution" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Mostrar os sitios e manexar os enderezos ftp con Filezilla" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Abrir un sitio web con Filezilla" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Sitios web de Filezilla" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Sitios web de Filezilla" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Acceder aos contactos de Gajim" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Dispoñíbel para conversar" #: ../kupfer/plugin/gajim.py:146 msgid "Gajim Contacts" msgstr "Contactos de Gajim" #: ../kupfer/plugin/gajim.py:210 msgid "Gajim Account Status" msgstr "Estado da conta de Gajim" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "Perfís do terminal de GNOME" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "Iniciar os perfís do terminal de GNOME" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:144 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "Cargar os contactos e escribir un novo correo-e en Gmail" #: ../kupfer/plugin/gmail/__init__.py:32 msgid "Load contacts' pictures" msgstr "Cargar as imaxes dos contactos" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Compose Email in GMail" msgstr "Escribir un correo-e en Gmail" #: ../kupfer/plugin/gmail/__init__.py:74 msgid "Open web browser and compose new email in GMail" msgstr "Abrir o navegador web e escribir un novo correo-e en Gmail" #: ../kupfer/plugin/gmail/__init__.py:177 msgid "Contacts from Google services (Gmail)" msgstr "Contactos dos servizos de Google (Gmail)" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Mostrar os álbums e enviar os ficheiros a Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "Usuarios para mostrar (separados por comas):" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Cargar as iconas do usuario e do álbum" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Enviando as imaxes" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Enviando as imaxes ao álbum web de Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Creando un álbum:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Álbum creado por Kupfer" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Ficheiro:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "Un álbum" msgstr[1] "%(num)d álbums" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "Unha fotografía" msgstr[1] "%(num)s fotografías" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Enviar a un álbum de Picasa..." #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Enviar os ficheiros a un álbum de Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Enviar a Picasa como un novo álbum" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Crear un álbum desde o directorio local seleccionado" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Álbums de Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Álbums do usuario en Picasa" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Buscar en Google" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Buscar en Google mostrando os resultados directamente" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #, python-format msgid "Results for \"%s\"" msgstr "Resultados para «%s»" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Mostrar máis resultados para «%s»" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "%s encontrados en total" #: ../kupfer/plugin/google_translate.py:6 msgid "Google Translate" msgstr "Google Translate" #: ../kupfer/plugin/google_translate.py:8 #: ../kupfer/plugin/google_translate.py:153 msgid "Translate text with Google Translate" msgstr "Traducir un texto con Google Translate" #: ../kupfer/plugin/google_translate.py:83 msgid "Google Translate connection timed out" msgstr "A conexión con Google Translate expirou" #: ../kupfer/plugin/google_translate.py:86 msgid "Error connecting to Google Translate" msgstr "Produciuse un erro na conexión con Google Translate" #: ../kupfer/plugin/google_translate.py:136 #: ../kupfer/plugin/google_translate.py:223 msgid "Translate To..." msgstr "Traducir a…" #: ../kupfer/plugin/google_translate.py:179 #, python-format msgid "Translate into %s" msgstr "Traducir a %s" #: ../kupfer/plugin/google_translate.py:203 msgid "Languages" msgstr "Idiomas" #: ../kupfer/plugin/google_translate.py:238 msgid "Show translated page in browser" msgstr "Mostrar no navegador a páxina traducida" #: ../kupfer/plugin/google_translate.py:255 msgid "Show Translation To..." msgstr "Mostrar a tradución en..." #: ../kupfer/plugin/google_translate.py:271 msgid "Show translation in browser" msgstr "Mostrar a tradución no navegador" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "Explorar e crear novas tarefas en GTG" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "límite: %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "iniciar: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "etiquetas: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Abrir a tarefa en Getting Things GNOME" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Borrar" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Eliminar esta tarefa permanentemente" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Marcar como feita" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Marcar esta tarefa como feita" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Ignorar" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Marcar esta tarefa para non ser feita máis" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Crear unha tarefa" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Crear unha tarefa nova en Getting Things GNOME" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, fuzzy, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s %(when)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, fuzzy, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s" #: ../kupfer/plugin/gwibber.py:187 #, fuzzy msgid "Send Message" msgstr "Enviar unha mensaxe..." #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "" #: ../kupfer/plugin/gwibber.py:210 #, fuzzy msgid "Send Message To..." msgstr "Enviar unha mensaxe..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Enviar unha mensaxe..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Responder…" #: ../kupfer/plugin/gwibber.py:314 #, fuzzy msgid "Delete Message" msgstr "Enviar unha mensaxe..." #: ../kupfer/plugin/gwibber.py:337 #, fuzzy msgid "Send Private Message..." msgstr "Enviar unha mensaxe directa..." #: ../kupfer/plugin/gwibber.py:370 #, fuzzy msgid "Send direct message to user" msgstr "Enviar unha mensaxe directa a..." #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "" #: ../kupfer/plugin/gwibber.py:376 #, fuzzy msgid "Retweet To..." msgstr "Renomear como..." #: ../kupfer/plugin/gwibber.py:407 #, fuzzy msgid "Retweet message to all Gwibber accounts" msgstr "Recibir as novas mensaxes de todas as contas de ClawsMail" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:413 #, fuzzy msgid "Open in Browser" msgstr "Abrir o cartafol pai" #: ../kupfer/plugin/gwibber.py:419 #, fuzzy msgid "Open message in default web browser" msgstr "Abrir o URL co visualizador predefinido" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 #, fuzzy msgid "Gwibber Accounts" msgstr "Estado da conta de Gajim" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Accións prioritarias" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Ferramentas para traballar con ordes e obxectos" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Seleccionar en Kupfer" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Resultado de %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Executar (gardar o resultado)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Usar o resultado da orde como un obxecto proxy" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Executar (descartar o resultado)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Ferramentas de imaxe" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Ferramentas para a transformación de imaxes" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Escalar…" #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Escalar a imaxe para axustala ás dimensións indicadas" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Rotar cara á dereita" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Rotar cara á esquerda" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Rotación automática" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Rotar a imaxe JPEG (in situ) segundo os seus metadatos EXIF" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Engadidos de Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Acceder á lista de engadidos de Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Mostrar a información" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Mostrar o código fonte" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "activado" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Localizar ficheiros" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Buscar no sistema de ficheiros usando «locate»" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "" "ignorar a diferenciación entre maiúsc./minúsc. cando se busquen ficheiros" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 #, fuzzy msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Documentos usados recentemente en OpenOffice" #: ../kupfer/plugin/openoffice.py:83 #, fuzzy msgid "OpenOffice/LibreOffice Recent Items" msgstr "Elementos recentes de OpenOffice" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Marcadores de Opera" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Índice dos marcadores de Opera" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera Mail" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Contactos e accións de Opera Mail" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Escribir un novo correo-e en Opera Mail" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Contactos de Opera Mail" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Contactos de Opera Mail" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Acceder aos contactos de Pidgin" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d caracter)" msgstr[1] "%s (%d caracteres)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Contactos de Pidgin" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "Sesións de PuTTY" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Acceso rápido ás sesións de PuTTY" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Iniciar unha sesión" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "TextoRestructurado" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "Renderizar TextoRestructurado e mostrar o resultado" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Ver como documento HTML" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "Activar as sesións de GNU Screen" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Anexado" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Desanexado" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s sesión (%(pid)s) creada o %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Sesións de Screen" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Anexar" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:49 msgid "Send Keys" msgstr "" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "" #: ../kupfer/plugin/sendkeys.py:25 msgid "Paste to Foreground Window" msgstr "" #: ../kupfer/plugin/sendkeys.py:43 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:85 msgid "Send keys to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:90 msgid "Type Text" msgstr "" #: ../kupfer/plugin/sendkeys.py:111 msgid "Type the text to foreground window" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Servizos do sistema" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "" "Iniciar, parar ou reiniciar os servizos do sistema mediante os scripts de " "init" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Ordes do tipo sudo" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Iniciar o servizo" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Reiniciar o servizo" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Parar o servizo" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "Servizo %s" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Abreviar as ligazóns" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Crear abreviaturas para URLs longos" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Erro" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Abreviar con..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Servizos" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 #, fuzzy msgid "Show QRCode" msgstr "Mostrar o código fonte" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 #, fuzzy msgid "Display text as QRCode in a window" msgstr "Mostrar o texto nunha xanela" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Acceder aos contactos de Skype" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skypéame" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Sesión finalizada" #: ../kupfer/plugin/skype.py:183 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:225 msgid "Call" msgstr "Chamar" #: ../kupfer/plugin/skype.py:239 msgid "Place a call to contact" msgstr "Chamar ao contacto" #: ../kupfer/plugin/skype.py:274 msgid "Skype Contacts" msgstr "Contactos de Skype" #: ../kupfer/plugin/skype.py:294 msgid "Skype Statuses" msgstr "Estados de Skype" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "Servidores SSH" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "Engade os servidores SSH encontrados en ~/.ssh/config." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "Servidor SSH" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Conectar" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "Conectar co servidor SSH" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "Servidores SSH como os especificados en ~/.ssh/config" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Non hai conexión D-Bus coa sesión do escritorio" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Modelos de documentos" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Crear un novo documento a partir de un modelo" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "Modelo %s" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Ficheiro baleiro" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Novo cartafol" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Crear un novo documento..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Crear un novo documento con un modelo" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Crear un documento en..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "Ficheiros de texto" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Anexar a..." #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Anexar..." #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Escribir en…" #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Obter os contidos de texto" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:184 #: ../kupfer/plugin/thunar.py:224 ../kupfer/plugin/thunar.py:283 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:10 msgid "File manager Thunar actions" msgstr "Accións do xestor de ficheiros Thunar" #: ../kupfer/plugin/thunar.py:66 msgid "Select in File Manager" msgstr "Seleccionar un xestor de ficheiros" #: ../kupfer/plugin/thunar.py:94 msgid "Show Properties" msgstr "Mostrar as propiedades" #: ../kupfer/plugin/thunar.py:117 msgid "Show information about file in file manager" msgstr "Mostrar a información do ficheiro no xestor de ficheiros" #: ../kupfer/plugin/thunar.py:126 msgid "Send To..." msgstr "Enviar a..." #: ../kupfer/plugin/thunar.py:258 msgid "Empty Trash" msgstr "Baleirar o lixo" #: ../kupfer/plugin/thunar.py:298 msgid "Thunar Send To Objects" msgstr "Enviar a Obxectos Thunar" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Contactos e accións de Thunderbird/Icedove" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Escribir unha nova mensaxe en Thunderbird" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Axenda de Thunderbird" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Contactos da axenda de Thunderbird" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Arriba" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Mostrar as tarefas en execución e permitir que se lle manden sinais" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Ordenación" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Liña de ordes" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "Uso da CPU (descendente)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Uso da memoria (descendente)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Enviar unha sinal..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Sinais" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Tarefas en execución" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% tempo: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Tarefas en execución do usuario actual" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:15 ../kupfer/plugin/tracker1.py:18 msgid "Tracker desktop search integration" msgstr "Integración co aplicativo de buscas de escritorio Tracker" #: ../kupfer/plugin/tracker.py:41 ../kupfer/plugin/tracker1.py:49 msgid "Search in Tracker" msgstr "Buscar en Tracker" #: ../kupfer/plugin/tracker.py:46 ../kupfer/plugin/tracker1.py:54 msgid "Open Tracker Search Tool and search for this term" msgstr "Abrir Tracker e buscar este termo" #: ../kupfer/plugin/tracker.py:55 ../kupfer/plugin/tracker1.py:62 msgid "Get Tracker Results..." msgstr "Obter os resultados de Tracker…" #: ../kupfer/plugin/tracker.py:64 ../kupfer/plugin/tracker1.py:71 msgid "Show Tracker results for query" msgstr "Mostrar os resultados da consulta en Tracker" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Etiquetas de Tracker" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Etiquetas de Tracker" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Examinar as etiquetas de Tracker" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "Etiqueta %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Obxectos etiquetados %s con Tracker" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Engadir unha etiqueta..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Engadir unha etiqueta de tracker ao ficheiro" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Eliminar a etiqueta..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Eliminar a etiqueta de tracker do ficheiro" #: ../kupfer/plugin/tracker1.py:10 #, fuzzy msgid "Tracker" msgstr "Tracker 0.6" #. FIXME: Port tracker tag sources and actions #. to the new, much more powerful sparql + dbus API #. (using tracker-tag as in 0.6 is a plain hack and a dead end) #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Volumes do histórico de TrueCrypt" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "Volume de TrueCrypt: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Montar o volume" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Montar en TrueCrypt" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Tentar montar o ficheiro como un volume de TrueCrypt" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Desmontar todos os volumes" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "Volumes de TrueCrypt" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Terminal Server Client" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Sesión gardada en Terminal Server Client" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "Sesións de TSClient" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Sesións gardadas en Terminal Server Client" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Marcadores e accións de Vinagre" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Iniciar unha sesión de Vinagre" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Marcadores de Vinagre" #: ../kupfer/plugin/vim.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim.py:3 msgid "Recently used documents in Vim" msgstr "Documentos usados recentemente en Vim" #: ../kupfer/plugin/vim.py:46 msgid "Vim Recent Documents" msgstr "Documentos recentes de Vim" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "Controlar as máquinas virtuais de VirtualBox, compatíbel tanto coa " "VirtualBox de Sun como coa edición de fontes abertas." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Acender" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Encender «Headless»" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Enviar a sinal de apagado" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Reiniciar" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Continuar" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Gardar o estado" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Apagar" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "Máquinas de VirtualBox" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:10 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "" "Acceder ás páxinas gardadas en Zim - Unha wiki de escritorio e un " "esquematizador" #: ../kupfer/plugin/zim.py:28 msgid "Page names start with :colon" msgstr "Os nomes de páxinas comezan con :(dous puntos)" #: ../kupfer/plugin/zim.py:58 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Páxina Zim do caderno de notas «%s»" #: ../kupfer/plugin/zim.py:67 msgid "Create Zim Page" msgstr "Crear unha páxina Zim" #: ../kupfer/plugin/zim.py:74 msgid "Create page in default notebook" msgstr "Crear unha páxina no caderno de notas predefinido" #: ../kupfer/plugin/zim.py:84 msgid "Create Zim Page In..." msgstr "Crear unha páxina Zim en..." #: ../kupfer/plugin/zim.py:122 msgid "Create Subpage..." msgstr "Crear unha subpáxina..." #: ../kupfer/plugin/zim.py:243 msgid "Zim Notebooks" msgstr "Caderno de notas de Zim" #: ../kupfer/plugin/zim.py:259 msgid "Zim Pages" msgstr "Páxinas Zim" #: ../kupfer/plugin/zim.py:287 msgid "Pages stored in Zim Notebooks" msgstr "Páxinas gardadas no caderno de notas de Zim" #~ msgid "Directories" #~ msgstr "Directorios" #~ msgid "Interface" #~ msgstr "Interface" #~ msgid "Hide Kupfer when focus is lost" #~ msgstr "Ocultar Kupfer cando non teña o foco" #~ msgid "" #~ "Tick the box next to a source to make sure its objects are exported to " #~ "the top level of the catalog. An unticked source's contents are only " #~ "available by locating its subcatalog and entering it.\n" #~ "\n" #~ "Note: Kupfer is an integrator, not an indexer itself. Kupfer is not " #~ "designed to carry a catalog larger than a couple of thousand objects, and " #~ "may become slow if overly large subcatalogs are included in the top level." #~ msgstr "" #~ "Marque o cadro dunha fonte para que os seus obxectos se exporten ao nivel " #~ "superior do catálogo. Os contidos dunha fonte sen seleccionar unicamente " #~ "estarán dispoñíbeis localizando o seu subcatálogo e introducíndoo.\n" #~ "\n" #~ "Nota: Kupfer é un integrador, non un indexador. Non está deseñado para " #~ "manexar catálogos maiores de un par de miles de obxectos e pode resultar " #~ "moi lento se subcatálogos grandes son incluídos no nivel superior." #~ msgid "Text Matches" #~ msgstr "Resultados para o texto" #~ msgid "noun" #~ msgstr "substantivo" #~ msgid "verb" #~ msgstr "verbo" #~ msgid "adjective" #~ msgstr "adxectivo" #~ msgid "Twitter" #~ msgstr "Twitter" #~ msgid "Microblogging with Twitter: send updates and show friends' tweets" #~ msgstr "" #~ "Microblogueo con Twitter: enviar actualizacións e mostrar os tweets dos " #~ "amigos" #~ msgid "Load friends' pictures" #~ msgstr "Cargar as imaxes dos amigos" #~ msgid "Load friends' public tweets" #~ msgstr "Cargar os tweets públicos dos amigos" #~ msgid "Load timeline" #~ msgstr "Cargar a liña de tempo" #~ msgid "Post Update to Twitter" #~ msgstr "Publicar a actualización no Twitter" #~ msgid "Twitter Timeline" #~ msgstr "Liña de tempo de Twitter" #~ msgid "Twitter Friends" #~ msgstr "Amigos de Twitter" #~ msgid "Timeline for %s" #~ msgstr "Liña de tempo de %s" #~ msgid "OpenOffice" #~ msgstr "OpenOffice" #~ msgid "Preferred terminal" #~ msgstr "Terminal preferido" #~ msgid "" #~ "The preferred terminal emulator. It's used to launch the SSH sessions." #~ msgstr "" #~ "O emulador de terminal preferido. Úsase para iniciar as sesións SSH." #~ msgid "" #~ "The flag which makes the terminal execute everything following it inside " #~ "the terminal (e.g. '-x' for gnome-terminal and terminal, '-e' for konsole " #~ "and urxvt)." #~ msgstr "" #~ "A opción que fai que o terminal execute todas as instrucións que lle " #~ "siguen no propio terminal. (p.e. '-x' para gnome-terminal e terminal, '-" #~ "e' para konsole e urxvt)." #~ msgid "Tracker 0.8" #~ msgstr "Tracker 0.8" kupfer-v208/po/hu.po000066400000000000000000002452021176220042200144420ustar00rootroot00000000000000# Hungarian translations for the kupfer package # Copyright (C) 2009--2011 Ulrik Sverdrup # Hungarian translation by SanskritFritz (gmail) # This file is distributed under the same license as the kupfer package. (GPLv3) # msgid "" msgstr "" "Project-Id-Version: kupfer\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-04-24 18:13+0200\n" "PO-Revision-Date: \n" "Last-Translator: SanskritFritz (gmail)\n" "Language-Team: \n" "Language: Hungarian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "Alkalmazásindító" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "Ügyes kis kütyü alkalmazások indítására és dokumentumok elérésére" #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Végrehajtás Kupfer-ben" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Elmentett Kupfer parancs" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "Böngésző gyorsbillentyűk" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "Globális gyorsbillentyűk" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Start" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:150 msgid "Catalog" msgstr "Katalógus" #: ../data/preferences.ui.h:5 msgid "Desktop Environment" msgstr "Asztali környezet" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "Mappák, melyek fájljai mindig láthatók lesznek a katalógusban." #: ../data/preferences.ui.h:7 msgid "General" msgstr "Általános" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "Ikonkészlet:" #: ../data/preferences.ui.h:9 msgid "Inclusion in Top Level Searches" msgstr "A legfelső szinten is kereshető elemek" #: ../data/preferences.ui.h:10 msgid "Indexed Folders" msgstr "Indexelt mappák" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "Billentyűzet" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Kupfer beállítások" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" "A kijelölt források elemei mindig láthatók lesznek a kereső legfelső " "szintjén.\n" "A többi forrás tartalma a megfelelő alkatalógus kiválasztása után látható." #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "Beépülők" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:833 msgid "Reset" msgstr "Alapállapot" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "Ikon megjelenítése az értesítési területen" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "Bejelentkezés után automatikusan induljon el" #: ../data/preferences.ui.h:19 msgid "Terminal emulator:" msgstr "Terminálemulátor" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "" "Egyszerű billentyűparancsok használata (Szóköz, /, pont, / vessző stb.)" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Felhasználói jogok" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "Változtatás" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "_Jelszó:" #: ../data/credentials_dialog.ui.h:4 msgid "_User:" msgstr "_Felhasználó:" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "A billentyűparancs nem található" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Nyomd meg a kívánt billentyűkombinációt" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "Billentyűkombináció beállítása" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "ne jelenjen meg a főablak induláskor" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "választható beépülők listája" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "debug információ engedélyezése" #: ../kupfer/main.py:46 msgid "run keyboard shortcut relay service on this display" msgstr "Billentyűtovábbító szolgáltatás engedélyezése ezen a képernyőn" #: ../kupfer/main.py:49 msgid "show usage help" msgstr "kis segítség a használathoz" #: ../kupfer/main.py:50 msgid "show version information" msgstr "verzióinformáció" #: ../kupfer/main.py:56 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Használat: kupfer [ OPCIÓK | FÁJL ... ]" #: ../kupfer/main.py:67 msgid "Available plugins:" msgstr "Rendelkezésre álló beépülők:" #: ../kupfer/main.py:114 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "Alternatív aktiváló" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Vesszőtrükk" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Parancsösszeállító" #: ../kupfer/ui/accelerators.py:11 msgid "Mark Default Action" msgstr "Alapértelmezett művelet kijelölése" #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "Elem elfelejtése" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Visszaállít mindent" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Kilépés választása" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Kiválasztott fájl választása" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Kijelölt szöveg válalsztása" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Súgó" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Beállítások" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "Váltás az első panelre" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Szöveges mód ki/be" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s üres" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "%(src)s-ben nincs illeszkedés erre: \"%(query)s\"" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "A minta nem illeszkedik" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Kereséshez gépelj" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "%s kereséséhez gépelj" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Nincs parancs" #: ../kupfer/ui/browser.py:1451 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "Legyen \"%(action)s\" az alapértelmezett ehhez: \"%(object)s\"" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1461 #, python-format msgid "Forget About \"%s\"" msgstr "Felejtsd el ezt: \"%s\"" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1893 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Főablak megjelenítése" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Megjelenítés a kijelölt szöveggel" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:414 msgid "Description" msgstr "Leírás" #: ../kupfer/ui/preferences.py:414 msgid "Author" msgstr "Szerző" #: ../kupfer/ui/preferences.py:431 msgid "Version" msgstr "Verzió" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:441 #, python-format msgid "Python module '%s' is needed" msgstr "'%s' python modul szükséges ehhez" #: ../kupfer/ui/preferences.py:455 msgid "Plugin could not be read due to an error:" msgstr "A beépülő nem olvasható valamilyen hiba miatt:" #: ../kupfer/ui/preferences.py:463 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "letiltva" #: ../kupfer/ui/preferences.py:537 msgid "Content of" msgstr "Tartalom" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:546 msgid "Sources" msgstr "Források" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:550 msgid "Actions" msgstr "Parancsok" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:587 msgid "Configuration" msgstr "Beállítások" #: ../kupfer/ui/preferences.py:607 msgid "Set username and password" msgstr "Felhasználói név és jelszó beállítása" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:661 msgid "Choose a Directory" msgstr "Válassz mappát" #: ../kupfer/ui/preferences.py:831 msgid "Reset all shortcuts to default values?" msgstr "Minden billentyűparancs alapértelmezett legyen?" #: ../kupfer/ui/preferences.py:839 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Parancs" #: ../kupfer/ui/preferences.py:840 msgid "Shortcut" msgstr "Billentyűparancs" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "Fordítók" #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Szabad szoftver (GPLv3+) indító" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Ez a program szabad szoftver; terjeszthető illetve módosítható a\n" "Free Software Foundation által kiadott GNU General Public License\n" "dokumentumában leírtak; akár a licenc 3-as, akár (tetszőleges) későbbi\n" "változata szerint.\n" "\n" "Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz,\n" "de minden egyéb GARANCIA NÉLKÜL, az ELADHATÓSÁGRA vagy VALAMELY CÉLRA\n" "VALÓ ALKALMAZHATÓSÁGRA való származtatott garanciát is beleértve.\n" "További részleteket a GNU General Public License tartalmaz.\n" "\n" "A felhasználónak a programmal együtt meg kell kapnia a GNU General\n" "Public License egy példányát; ha mégsem kapta meg, akkor\n" "tekintse meg a oldalon.\n" "\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "Nem találtam aktívan futó Kupfer-t" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "Billentyűtovábbítás aktív a %s képernyőnek" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Nem tudtam végrehajtani: '%s'" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "\"%s\" adott ereményt" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "Engedély híján nem tudom futtatni: \"%s\" (nem végrehajtható)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "A parancs nem áll rendelkezésre itt: \"%s\"" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 msgid "Text" msgstr "Szöveg" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Futtatás némi szünet után..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Parancs végrehajtása megadott idő után" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Több elem" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s elem" msgstr[1] "%s elem" #: ../kupfer/obj/contacts.py:87 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "%s nem támogatja ezt a műveletet" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "Nem használható több elemmel egyszerre" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:79 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:107 msgid "Open" msgstr "Megnyitás" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Nincs alapértelmezett alkalmazás %(file)s (%(type)s)-hez" #: ../kupfer/obj/fileactions.py:45 #, python-format msgid "Please use \"%s\"" msgstr "Kérlek használd a \"%s\"-t" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Alapértelmezett alkalmazás beállítása..." #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Megnyitás alapértelmezett alkalmazással" #: ../kupfer/obj/fileactions.py:77 msgid "Reveal" msgstr "Megjelenítés" #: ../kupfer/obj/fileactions.py:86 msgid "Open parent folder" msgstr "Szülőkönyvtár megnyitása" #: ../kupfer/obj/fileactions.py:92 msgid "Open Terminal Here" msgstr "Terminál megnyitása itt" #: ../kupfer/obj/fileactions.py:105 msgid "Open this location in a terminal" msgstr "A hely megnyitása terminálban" #: ../kupfer/obj/fileactions.py:113 msgid "Run in Terminal" msgstr "Futtatás terminálban" #: ../kupfer/obj/fileactions.py:113 msgid "Run (Execute)" msgstr "Futtatás (végrehajtás)" #: ../kupfer/obj/fileactions.py:133 msgid "Run this program in a Terminal" msgstr "A program futtatása terminálban" #: ../kupfer/obj/fileactions.py:135 msgid "Run this program" msgstr "Futtasd ezt a programot" #: ../kupfer/obj/objects.py:248 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 msgid "Go To" msgstr "Ugrás" #: ../kupfer/obj/objects.py:274 msgid "Open URL" msgstr "URL megnyitása" #: ../kupfer/obj/objects.py:285 msgid "Open URL with default viewer" msgstr "URL megnyitása alapértelmezett nézővel" #: ../kupfer/obj/objects.py:299 msgid "Launch" msgstr "Indítás" #: ../kupfer/obj/objects.py:312 msgid "Show application window" msgstr "Alkalmazásablak megmutatása" #: ../kupfer/obj/objects.py:313 msgid "Launch application" msgstr "Alkalmazás indítása" #: ../kupfer/obj/objects.py:324 msgid "Launch Again" msgstr "Indítás még egyszer" #: ../kupfer/obj/objects.py:331 msgid "Launch another instance of this application" msgstr "Az alkalmazás még egy példányának indítása" #: ../kupfer/obj/objects.py:337 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Bezárás" #: ../kupfer/obj/objects.py:345 msgid "Attempt to close all application windows" msgstr "Kísérlet minden alkalmazásablak bezárására" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:392 msgid "Run" msgstr "Futtatás" #: ../kupfer/obj/objects.py:402 msgid "Perform command" msgstr "Parancs végrehajtása" #: ../kupfer/obj/objects.py:416 msgid "(Empty Text)" msgstr "(Üres szöveg)" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:432 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "\"%(text)s\"" msgstr[1] "(%(num)d sor) \"%(text)s\"" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s et. al." #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "%(dir)s rekurzív forrása, (%(levels)d szint)" #: ../kupfer/obj/sources.py:103 #, python-format msgid "Directory source %s" msgstr "Mappa forrás %s" #: ../kupfer/obj/sources.py:113 msgid "Home Folder" msgstr "Saját mappa" #: ../kupfer/obj/sources.py:124 msgid "Catalog Index" msgstr "Katalógus-index" #: ../kupfer/obj/sources.py:139 msgid "An index of all available sources" msgstr "A rendelkezésre álló források indexe" #: ../kupfer/obj/sources.py:170 msgid "Root catalog" msgstr "Gyökérkatalógus" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Kérlek konfiguráld a beépülőt" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "A %s beépülő nincs beállítva" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "Felhasználói jogok hiányoznak a %s-hez" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "GTK+" #: ../kupfer/plugin/core/alternatives.py:13 msgid "GNOME Terminal" msgstr "GNOME Terminal" #: ../kupfer/plugin/core/alternatives.py:22 msgid "XFCE Terminal" msgstr "XFCE Terminal" #: ../kupfer/plugin/core/alternatives.py:31 msgid "LXTerminal" msgstr "LXTerminal" #: ../kupfer/plugin/core/alternatives.py:40 msgid "X Terminal" msgstr "X Terminal" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "Urxvt" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Mentés másként..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Kilépés" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Kilépés a Kupfer-ből" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "Kupfer névjegy" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Lássunk valami infót a Kupfer alkotóiról és a licenszről" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Kupfer súgó" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Némi segítség a Kupfer használatához" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "A Kupfer beállításai" #: ../kupfer/plugin/core/__init__.py:65 msgid "Search Contents" msgstr "Keresés a tartalomban" #: ../kupfer/plugin/core/__init__.py:83 msgid "Search inside this catalog" msgstr "Keresés ebben a katalógusban" #: ../kupfer/plugin/core/__init__.py:91 msgid "Copy" msgstr "Másolás" #: ../kupfer/plugin/core/__init__.py:106 msgid "Copy to clipboard" msgstr "Másolás a vágólapra" #: ../kupfer/plugin/core/__init__.py:128 msgid "Rescan" msgstr "Újrakeresés" #: ../kupfer/plugin/core/__init__.py:143 msgid "Force reindex of this source" msgstr "Erőltesd a forrás újraindexelését" #: ../kupfer/plugin/core/selection.py:8 ../kupfer/plugin/core/selection.py:36 msgid "Selected Text" msgstr "Kijelölt szöveg" #: ../kupfer/plugin/core/selection.py:23 #, python-format msgid "Selected Text \"%s\"" msgstr "Kijelölt szöveg \"%s\"" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Utolsó parancs" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Kupfer belső elemei" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Utolső eredmény" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Parancs eredményei" #: ../kupfer/plugin/archivemanager.py:1 msgid "Archive Manager" msgstr "Archívumkezelő" #: ../kupfer/plugin/archivemanager.py:9 msgid "Use Archive Manager actions" msgstr "Archívumkezelő parancsainak használata" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Tömörtett archívum típusa a 'Készíts archívumot ide' parancshoz" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Kibontás itt" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Tömörített archívum kibontása" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Archívum készítése" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Tömörített archívum készítése mappából" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Készíts archívumot ide..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Archívum" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Alkalmazások" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Alkalmazások és beállításaik" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Alkalmazások az asztali környezethez" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Megnyitás mással..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Megnyitás bármely alkalmazással" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "E fájltípus megnyitásához az alapértelmezett alkalmazás beállítása" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Számológép" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "'='-el kezdődő kifejezések eredményének kiszámolása" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Számolás" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:71 msgid "Clipboards" msgstr "Vágólapok" #: ../kupfer/plugin/clipboard.py:4 ../kupfer/plugin/clipboard.py:111 msgid "Recent clipboards" msgstr "Legutóbbi vágólap-tartalmak" #: ../kupfer/plugin/clipboard.py:20 msgid "Number of recent clipboards" msgstr "Utolsó vágólapok száma" #: ../kupfer/plugin/clipboard.py:26 msgid "Include recent selections" msgstr "Legutolsó kijelölések beleszámítása" #: ../kupfer/plugin/clipboard.py:32 msgid "Copy selection to primary clipboard" msgstr "Kijelölés másolása az elsődleges vágólapra" #: ../kupfer/plugin/clipboard.py:44 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "\"%(desc)s\" vágólap" msgstr[1] "\"%(desc)s\" vágólap %(num)d sorral" #: ../kupfer/plugin/clipboard.py:51 msgid "Clear" msgstr "Törlés" #: ../kupfer/plugin/clipboard.py:63 msgid "Remove all recent clipboards" msgstr "Töröld az összes vágólapot" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Héjparancsok" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" "Parancssoros programok futtatása. Akciók %s szimbólummal jelölve alhéjban " "futnak." #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Futtatás (eredmény elkapása)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Program futtatása az eredmény visszaadásával" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 msgid "Pass to Command..." msgstr "Parancsnak argumentum..." #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "Parancs futtatása objektummal, mint paraméterrel" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 msgid "Write to Command..." msgstr "Kiírás parancsként..." #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 msgid "Run program and supply text on the standard input" msgstr "Program futtatása és szöveg megadása az alapbemeneten" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "Szűrés parancson keresztül..." #: ../kupfer/plugin/commands.py:210 msgid "Run command-line programs" msgstr "Parancssoros programok futtatása" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:20 msgid "Dictionary" msgstr "Szótár" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:46 msgid "Look up word in dictionary" msgstr "Szó keresése szótárban" #: ../kupfer/plugin/dictionary.py:29 msgid "Look Up" msgstr "Keresés" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Dokumentumok" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "Nemrég használt dokumentumok és könyvjelzővel jelölt mappák" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "Nemrég használt dokumentumok legfeljebb ennyi napja" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Legutóbbi elemek" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Nemrég használt dokumentumok" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "%s dokumentum" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Nemrég használt dokumentumok a %s-hez" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Helyek" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Könyvjelzővel jelölt mappák" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Epiphany könyvjelzők" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Epiphany könyvjelzők indexe" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Kedvencek" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "Gyakran használt elemek megjelölése és tárolása későbbi felhasználásra" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "A \"kedvenc\" elemek polca" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Hozzáadás a kedvencekhez" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Elem hozzáadása a kedvencek polcára" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Törlés a kedvencek közül" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Elem törlése a kedvencek polcáról" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Fájl akciók" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Még több fáljparancs" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:210 msgid "Move To..." msgstr "Mozgatás..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:252 msgid "Move file to new location" msgstr "Fájl új helyre mozgatása" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Átnevezés..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:165 msgid "Copy To..." msgstr "Másolás..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:206 msgid "Copy file to a chosen location" msgstr "Fájl másolása más helyre" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Firefox könyvjelzők" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Firefox könyvjelzők indexe" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "A látogatott oldalak is" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Kiválasztott fájl" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" "Hozzáférés a Nautilusban kiválasztott elemhez, a Kupfer Nautilus kiegészítő " "segítségével" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Kiválasztott fájl \"%s\"" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Kiválasztott fájlok" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:165 #: ../kupfer/plugin/notes.py:217 msgid "Notes" msgstr "Jegyzetek" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Gnote vagy Tomboy jegyzetek" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Alkalmazással való együttműködés" #: ../kupfer/plugin/notes.py:85 msgid "Open with notes application" msgstr "Megnyitás jegyzetelő alkalmazással" #: ../kupfer/plugin/notes.py:92 msgid "Append to Note..." msgstr "Hozzáadás jegyzethez..." #: ../kupfer/plugin/notes.py:115 msgid "Add text to existing note" msgstr "Szöveg hozzáadása létező jegyzethez" #: ../kupfer/plugin/notes.py:127 msgid "Create Note" msgstr "Jegyzet létrehozása" #: ../kupfer/plugin/notes.py:141 msgid "Create a new note from this text" msgstr "Jegyzet létrehozása ebből a szövegből" #: ../kupfer/plugin/notes.py:147 msgid "Get Note Search Results..." msgstr "Jegyzetek keresési eredményei..." #: ../kupfer/plugin/notes.py:160 msgid "Show search results for this query" msgstr "A lekérdezés keresési eredményei" #: ../kupfer/plugin/notes.py:200 #, python-format msgid "today, %s" msgstr "ma, %s" #: ../kupfer/plugin/notes.py:202 #, python-format msgid "yesterday, %s" msgstr "tegnap, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:206 #, python-format msgid "Last updated %s" msgstr "Utoljára frissítve %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:398 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:432 msgid "Play and enqueue tracks and browse the music library" msgstr "Számok lejátszása és sorbaállítása és a zenekönyvtár böngészése" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Művészek láthatók a felső szinten is" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Albumok láthatók a felső szinten is" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Dalok láthatók a felső szinten is" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Lejátszás" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Lejátszás visszakapcsolása Rhythmbox-ban" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Szünet" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Lejátszás szüneteltetése Rhythmbox-ban" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Következő" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Ugrás a következő számra Rhythmbox-ban" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Előző" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Ugrás az előző számra Rhythmbox-ban" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Mit játszik épp" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Megmutatja, milyen számot játszik épp le" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Sor ürítése" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Számok lejátszása Rhythmbox-ban" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Sorba állítás" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Számok hozzáadása a lejátszási sorhoz" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "%(artist)s - %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "%s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:310 #, python-format msgid "Tracks by %s" msgstr "%s számai" #: ../kupfer/plugin/rhythmbox.py:320 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Albumok" #: ../kupfer/plugin/rhythmbox.py:330 msgid "Music albums in Rhythmbox Library" msgstr "Rhythmbox könyvtár zenei albumai" #: ../kupfer/plugin/rhythmbox.py:341 msgid "Artists" msgstr "Művészek" #: ../kupfer/plugin/rhythmbox.py:351 msgid "Music artists in Rhythmbox Library" msgstr "Rhythmbox könyvtár zenei művészei" #: ../kupfer/plugin/rhythmbox.py:378 msgid "Songs" msgstr "Számok" #: ../kupfer/plugin/rhythmbox.py:388 msgid "Songs in Rhythmbox library" msgstr "Rhythmbox könyvtár zeneszámai" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "GNOME munkafolyamat-menedzsment" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "Speciális elemek és parancsok a GNOME környezethez" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Kilépés..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Kilépés vagy felhasználóváltás" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Kikapcsolás..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Kikapcsolás, újraindítás, vagy felfüggesztés" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Képernyő lezárása" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Képernyővédő engedélyezése és lezárás" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "XFCE munkafolyamat-menedzsment" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Speciális elemek és parancsok az XFCE környezethez" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Szöveg megjelenítése" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:52 msgid "Display text in a window" msgstr "Szöveg megjelenítése egy ablakban" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Nagy betűméret" #: ../kupfer/plugin/show_text.py:60 msgid "Show Notification" msgstr "Értesítés megjelenítése" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Szemétkosár" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Hozzáférés a szemétkosár elemeihez" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Kidobás a szemétkosárba" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "A fájl kidobása a szemétkosárba" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Visszaállítás" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "A fájl visszaállítása az eredeti helyére" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "A szemétkosár üres" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "A szemétkosárban egy fájl van" msgstr[1] "A szemétkosárban %(num)s fájl van" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Gyorsindítók" #: ../kupfer/plugin/triggers.py:6 msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Globális billenyűparancs hozzárendelése a 'Parancsösszeállító'-val " "létrehozott elemekhez." #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Hozzáadás a gyorsindítókhoz..." #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Gyorsindító törlése" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "URL akciók" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Letöltés és megnyitás" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Letöltés máshova..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "URL letöltése egy kiválasztott mappába" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Kötegek és lemezek" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Felcsatolt kötegek és lemezek" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Köteg ide csatolva: %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Lecsatolás" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "A köteg lecsatolása" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Kilökés" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Az adathordozó lecsatolása és kilökése" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Keresés a Web-en" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Keresés a Web-en OpenSearch keresőmotorokkal" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Keresés mással..." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Keresés..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Keresőmotorok" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Keresés a Wikipedia-n" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Wikipedia nyelv" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "hu" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "A kifejezés keresése itt: %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Ablaklista" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Minden ablak minden munkaterületen" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Aktiválás" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Ablak felgördítés" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Ablak legördítés" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Kicsinyítés" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Visszaállítás" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Teljes méretre" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Visszaállítás" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Teljes magasságra méretez" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Visszaállítás" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Ablak itt: %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Legelső ablak" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Következő ablak" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Ugrás az ablak munkaterületére és fókusz" #: ../kupfer/plugin/windows.py:252 #, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "%d ablak" msgstr[1] "%d ablak" #: ../kupfer/plugin/windows.py:256 msgid "Active workspace" msgstr "Aktív munkaterület" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Ugrás erre a munkaterületre" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Munkaterületek" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Nemrég használt dokumentumok Abiword-ben" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Legutóbbi elemek Abiword-ben" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Kapcsolódás az APT csomagkezelőhöz" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Telepítési mód" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Csomaginformációk megjelenítése" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Telepítés" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Csomag telepítése a belállított módon" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "\"%s\" mintájú csomagok" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Keresés csomagnévre..." #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "Mély archívumok" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Lehetővé teszi tömörített archívumok böngészését" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "%s tartalma" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "Ascii & Unicode ikonkészlet" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" "Ascii & Unicode ikonkészlet, betű- és szimbólumikonok használata a Kupfer " "objektumaihoz." #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "Ascii" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "Unicode" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Audacious lejátszás és lejátszási lista" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Szám hozzáadása az Audacious lejátszási sorhoz" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Elvétel a sorból" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Szám elvétele az Audacious lejátszási sorból" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Számhoz ugrás az Audacious-ban" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Lejátszás folytatása Audacious-ban" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Lejátszás szüneteltetése Audacious-ban" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Következő szám Audacious-ban" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Előző szám Audacious-ban" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Audacious lejátszási sor kiürítése" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Véletlenszerűen" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Véletlenszerű lejátszás ki/be az Audacious-ban" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Ismétlés" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Ismétlés ki/be az Audacious-ban" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Lejátszási lista" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Chromium könyvjelzők" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Chromium könyvjelzők indexe" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Claws Mail címtár és akciók" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:29 msgid "Compose New Email" msgstr "Új levél írása" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Új levél írása Claws Mail-ben" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Levelek fogadása" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "Levelek fogadása a Claws Mail mindegyik postafiókjába" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:45 msgid "Compose Email" msgstr "Levél írása" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "Elküldés levélben valakinek..." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Új levél írása és fájl csatolása Claws Mail-ben" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Claws Mail címjegyzék" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Címek a Claws Mail címjegyzékéből" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 msgid "Custom Terminal" msgstr "Egyedi terminál" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "Egyedi terminálemulátor beállítása" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "'Futtatható' jelölés" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "Egyedi téma" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "Egyedi színtéma használata" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "Téma:" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Alapértelmezett email-kliens" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "Új levél írása a rendszer alapértelmezett 'mailto:' kezelőjével" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Keresés a Devhelp-ben" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "Empathy" #: ../kupfer/plugin/empathy.py:6 msgid "Access to Empathy Contacts" msgstr "Hozzáférés az Empathy címtárhoz" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Kijelentkezett címek megjelenítése" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Elérhető" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Távol" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Elfoglalt" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Nem elérhető" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Láthatatlan" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Kijelentkezve" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:90 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:204 msgid "Open Chat" msgstr "Csevegés megnyitása" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:118 #: ../kupfer/plugin/skype.py:250 msgid "Change Global Status To..." msgstr "Globális státusz megváltozatása..." #: ../kupfer/plugin/empathy.py:171 msgid "Empathy Contacts" msgstr "Empathy címtár" #: ../kupfer/plugin/empathy.py:237 msgid "Empathy Account Status" msgstr "Empathy fiók státusz" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Evolution címtár" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Új levél írása Evolution-ban" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Új levél írása és fájl csatolása Evolution-ban" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Evolution címjegyzék" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Weboldalak és ftp címek kezelése Filezilla-val" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Weboldal megnyitása Filezilla-val" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Filezilla weboldalak" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Filezilla weboldalak" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Hozzáférés a Gajim címtárhoz" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Csevegésre kész" #: ../kupfer/plugin/gajim.py:146 msgid "Gajim Contacts" msgstr "Gajim címtár" #: ../kupfer/plugin/gajim.py:210 msgid "Gajim Account Status" msgstr "Gajim fiók státusz" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "Minta" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "GNOME terminál profilok" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "GNOME terminálprofilok megtekintése" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:144 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "Címek betöltése és új levél írása Gmail-ben" #: ../kupfer/plugin/gmail/__init__.py:32 msgid "Load contacts' pictures" msgstr "Kapcsolatok képeinek betöltése" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Compose Email in Gmail" msgstr "Levél írása Gmail-ben" #: ../kupfer/plugin/gmail/__init__.py:74 msgid "Open web browser and compose new email in Gmail" msgstr "Webböngészó indítása és új levél írása Gmail-ben" #: ../kupfer/plugin/gmail/__init__.py:177 msgid "Contacts from Google services (Gmail)" msgstr "Címtár betöltése a Google szolgáltatásokból (Gmail)" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Albumok megjelenítése és képek feltöltése a Picasa-ra" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "Megjelenítendő felhasználók (vesszővel elválasztva)" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Felhasználói és album ikonok betöltése" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Képek feltöltése" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Képek feltöltése Picasa webalbumba" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Album létrehozása" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Az albumot a Kupfer hozta létre" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Fájl:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "Egy album" msgstr[1] "%(num)d album" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "egy kép" msgstr[1] "%(num)s kép" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Feltöltés Picasa albumba..." #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Fájlok feltöltése Picasa albumba" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Feltöltés a Picasa-ra új albumba" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Album létrehozása a kijelölt mappából" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Picasa albumok" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Felhasználói albumok a Picasa-ban" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Google keresés" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Keresés a Google-ban az eredmények átvételével" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #, python-format msgid "Results for \"%s\"" msgstr "\"%s\" keresés eredményei" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Még több eredmény megjelenítése ehhez: \"%s\"" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "%s találat összesen" #: ../kupfer/plugin/google_translate.py:6 msgid "Google Translate" msgstr "Google fordító" #: ../kupfer/plugin/google_translate.py:8 #: ../kupfer/plugin/google_translate.py:153 msgid "Translate text with Google Translate" msgstr "Szöveg lefordítása Google fordítóval" #: ../kupfer/plugin/google_translate.py:83 msgid "Google Translate connection timed out" msgstr "Google fordítóval a kapcsolat megszakadt" #: ../kupfer/plugin/google_translate.py:86 msgid "Error connecting to Google Translate" msgstr "Nem sikerült kapcsolódni a Google fordítóhoz" #: ../kupfer/plugin/google_translate.py:136 #: ../kupfer/plugin/google_translate.py:223 msgid "Translate To..." msgstr "Fordítás..." #: ../kupfer/plugin/google_translate.py:179 #, python-format msgid "Translate into %s" msgstr "Fordítás %s-ra" #: ../kupfer/plugin/google_translate.py:203 msgid "Languages" msgstr "Nyelvek" #: ../kupfer/plugin/google_translate.py:238 msgid "Show translated page in browser" msgstr "A lefordított szöveg megjelenítése böngészőben" #: ../kupfer/plugin/google_translate.py:255 msgid "Show Translation To..." msgstr "Szöveg lefordítása erre..." #: ../kupfer/plugin/google_translate.py:271 msgid "Show translation in browser" msgstr "Fordítás megjelenítése böngészőben" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "Böngészés és új feladatok létrehozása GTG-ben" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "határidő: %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "kezdés: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "cimkék: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Feladat megnyitása a 'Getting Things GNOME'-ban" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Törlés" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Feladat végleges törlése" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Készre jelölés" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "A feladat készre jelölése" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Eldobás" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Feladat megjelölése 'nem szükséges'-ként" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Feladat létrehozása" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Feladat létrehozása a 'Getting Things GNOME'-ban" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "Gwibber" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" "Mikroblogolás Gwibber-rel. Küldeni és fogadni lehet üzeneteket közösségi " "hálózatokon, mint a Twitter vagy Identi.ca, stb. A 'gwibber-service' csomag " "szükséges hozzá." #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "Megjeleneített üzenetek maximális száma" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s - %(service)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s - %(where)s" #: ../kupfer/plugin/gwibber.py:187 msgid "Send Message" msgstr "Üzenet küldése" #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "Üzenet küldése mindegyik Gwibber fiókra" #: ../kupfer/plugin/gwibber.py:210 msgid "Send Message To..." msgstr "Üzenet küldése valakinek..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "Üzenet küldése egy Gwibber fiókra" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Üzenet küldése..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "Üzenet küldése a kijelölt Gwibber fiókra" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Válasz..." #: ../kupfer/plugin/gwibber.py:314 msgid "Delete Message" msgstr "Üzenet törlése" #: ../kupfer/plugin/gwibber.py:337 msgid "Send Private Message..." msgstr "Magánüzenet küldése..." #: ../kupfer/plugin/gwibber.py:370 msgid "Send direct message to user" msgstr "Közvetlen üzenet küldése egy felhasználónak" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "Retweet" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet To..." msgstr "Retweet valakinek..." #: ../kupfer/plugin/gwibber.py:407 msgid "Retweet message to all Gwibber accounts" msgstr "Retweet mindegyik Gwibber fiókra" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "Retweet egy Gwibber fiókra" #: ../kupfer/plugin/gwibber.py:413 msgid "Open in Browser" msgstr "Megnyitás böngészőben" #: ../kupfer/plugin/gwibber.py:419 msgid "Open message in default web browser" msgstr "Üzenet megnyitása az alapértelmezett webböngészőben" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 msgid "Gwibber Accounts" msgstr "Gwibber fiókok" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "Gwibber-ben beállított fiókok" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "Gwibber üzenetek" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "Legfrissebb Gwibber üzenetek" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "Gwibber üzenetek a %s szolgáltatáson" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "Gwibber folyamok" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "Gwibber-ben beállított folyamok" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "Gwibber üzenetek a %s folyamon" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "Gwibber (egyszerű)" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "Frissítések küldése a Gwibber mikroblogoló kliensen" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "Frissítés küldése" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "Nem sikerült aktiválni a Gwibber szolgáltatást" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Magasabbrendű akciók" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Eszközök, amik paracsokat objektumként használnak" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Kijelölés Kupfer-ben" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "%s (%s) eredménye" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Futtatás (az eredmény átvételével)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "A parancs eredményét helyettes objektumként kezelje" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Futtatás (az eredmény eldobásával)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Eszközök képek kezeléséhez" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Eszközök képek átalakításához és kezeléséhez" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Átméretezés..." #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Kép átméretezése bizonyos méretre" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Forgatás az óra szerint" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Forgatás az órával ellentétesen" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Automatikus forgatás" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "JPEG képek forgatása az EXIF adatoknak megfelelően" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Kupfer beépülők" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Beépülők listájának elérése Kupfer-ben" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Információ megjelenítése" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Forráskód megjelenítése" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "engedélyezett" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Fájlok keresése (locate)" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Fájlok keresése a locate segítségével" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Kis- és nagybetű ne számítson a keresésnél" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "OpenOffice / LibreOffice" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:128 msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Legutóbb használt dokumentumok OpenOffice/LibreOffice-ban" #: ../kupfer/plugin/openoffice.py:74 msgid "OpenOffice/LibreOffice Recent Items" msgstr "OpenOffice/LibreOffice legutóbbi elemek" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Opera könyvjelzők" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Opera könyvjelzők indexe" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera Mail" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Opera Mail címtár és parancsok" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Új levél írása Opera Mail-ben" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Opera Mail címtár" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Opera Mail címjegyzéke" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Pidgin címtár elérése" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d karakter)" msgstr[1] "%s (%d karakter)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Pidgin címtár" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "PuTTY munkafolyamatok" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "PuTTY munkafolyamatok elérése" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Munkafolyamat indítása" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "Gyors képnéző" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "Kép megtekintése" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "reStructuredText" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "reStructuredText formázása és megjelenítése" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Megtekintés HTML dokumentumként" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:81 msgid "Active GNU Screen sessions" msgstr "Aktív GNU Screen munkafolyamatok" #: ../kupfer/plugin/screen.py:50 msgid "Attached" msgstr "Kapcsolódva" #: ../kupfer/plugin/screen.py:51 msgid "Detached" msgstr "Leválasztva" #: ../kupfer/plugin/screen.py:54 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s munkafolyamat (%(pid)s) létrehozva: %(time)s" #: ../kupfer/plugin/screen.py:63 msgid "Screen Sessions" msgstr "Screen munkafolyamatok" #: ../kupfer/plugin/screen.py:91 msgid "Attach" msgstr "Kapcsolás" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:49 msgid "Send Keys" msgstr "Billentyűk küldése" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "Billentyűnyomás szimulálása xautomation segítségével" #: ../kupfer/plugin/sendkeys.py:25 msgid "Paste to Foreground Window" msgstr "Beillesztés a legelső ablakba" #: ../kupfer/plugin/sendkeys.py:43 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "Másolás a vágólapra és ctrl-v küldése a legelső ablakba" #: ../kupfer/plugin/sendkeys.py:85 msgid "Send keys to foreground window" msgstr "Billentyűnyomás küldése a legelső ablakba" #: ../kupfer/plugin/sendkeys.py:90 msgid "Type Text" msgstr "Szöveg beírása" #: ../kupfer/plugin/sendkeys.py:111 msgid "Type the text to foreground window" msgstr "Szöveg beírása a legelső ablakba" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Rendszerszolgáltatások" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "Rendszerszolgáltatások (újra)indítása, leállítása az init szkriptekkel" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Sudo-féle parancs" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Rendszerszolgáltatás indítása" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Rendszerszolgáltatás újraindítása" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Rendszerszolgáltatás leállítása" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "%s rendszerszolgáltatás" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Linkek rövidítése" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Hosszú URL-ek helyettesítése rövid változattal" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Hiba" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Rövidítés..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Szolgáltatások" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 msgid "Show QRCode" msgstr "QRCode megjelenítése" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 msgid "Display text as QRCode in a window" msgstr "Szöveg megjelenítése QRCode-ként egy ablakban" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Skype címtár elérése" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skype me" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Kijelentkezve" #: ../kupfer/plugin/skype.py:183 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:225 msgid "Call" msgstr "Hívás" #: ../kupfer/plugin/skype.py:239 msgid "Place a call to contact" msgstr "Partner hívása" #: ../kupfer/plugin/skype.py:274 msgid "Skype Contacts" msgstr "Skype címtár" #: ../kupfer/plugin/skype.py:294 msgid "Skype Statuses" msgstr "Skype státuszok" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "SSH kiszolgálók" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "SSH kiszolgálók listázása innen: ~/.ssh/config." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "SSH kiszolgáló" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Kapcsolódás" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "Kapcsolódás egy SSH kiszolgálóhoz" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "SSH kiszolgálók, ahogy ~/.ssh/config tartalmazza" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Nincs D-Bus kapcsolat az asztali munkafolyamattal" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Dokumentumsablonok" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Új dokumentum létrehozása sablonból" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "%s sablon" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Üres fájl" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Új mappa" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Új dokumentum létrehozása..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Új dokumentum létrehozása sablonból" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Dokumentum létrehozása máshol..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "Szövegfájlok" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Hozzáfűzés másikhoz..." #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Hozzáfűzés..." #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Mentés máshova..." #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Szöveg tartalmának átemelése" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:184 #: ../kupfer/plugin/thunar.py:224 ../kupfer/plugin/thunar.py:283 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:10 msgid "File manager Thunar actions" msgstr "Thunar fáljkezelő parancsok" #: ../kupfer/plugin/thunar.py:66 msgid "Select in File Manager" msgstr "Kijelölés fáljkezelőben" #: ../kupfer/plugin/thunar.py:94 msgid "Show Properties" msgstr "Tulajdonságok megjelenítése" #: ../kupfer/plugin/thunar.py:117 msgid "Show information about file in file manager" msgstr "A fájl tulajdonságainak megjelenítése a fáljkezelőben" #: ../kupfer/plugin/thunar.py:126 msgid "Send To..." msgstr "Küldés máshova..." #: ../kupfer/plugin/thunar.py:258 msgid "Empty Trash" msgstr "Szemétkosár kiürítése" #: ../kupfer/plugin/thunar.py:298 msgid "Thunar Send To Objects" msgstr "Thunar küldés objektumok" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Thunderbird/Icedove címtár és akciók" #: ../kupfer/plugin/thunderbird.py:36 msgid "Compose a new message in Thunderbird" msgstr "Új levél írása Thunderbird-ben" #: ../kupfer/plugin/thunderbird.py:69 msgid "Thunderbird Address Book" msgstr "Thunderbird címjegyzék" #: ../kupfer/plugin/thunderbird.py:93 msgid "Contacts from Thunderbird Address Book" msgstr "Címek a Thunderbird címtárából" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Top" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Futó taszkok megjelenítése és szignálok küldése" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Sorrend" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Parancssor" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "CPU használat" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Memóriahasználat (csökkenő)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Szignál küldése..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Szignálok" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Futó taszkok" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% idő: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Aktív felhasználó futó taszkjai" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:15 ../kupfer/plugin/tracker1.py:18 msgid "Tracker desktop search integration" msgstr "Tracker asztali kereső integráció" #: ../kupfer/plugin/tracker.py:41 ../kupfer/plugin/tracker1.py:49 msgid "Search in Tracker" msgstr "Keresés a Tracker-ben" #: ../kupfer/plugin/tracker.py:46 ../kupfer/plugin/tracker1.py:54 msgid "Open Tracker Search Tool and search for this term" msgstr "Tracker megnyitása és keresés a megadott kifejezésre" #: ../kupfer/plugin/tracker.py:55 ../kupfer/plugin/tracker1.py:62 msgid "Get Tracker Results..." msgstr "Tracker eredményeinek beemelése..." #: ../kupfer/plugin/tracker.py:64 ../kupfer/plugin/tracker1.py:71 msgid "Show Tracker results for query" msgstr "A Tracker keresés eredményének megjelenítése" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Tracker cimkék" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Tracker cimkék" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Tracker cimkék böngészése" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "%s cimke" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Elemek, Tracker-ben %s cimkével" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Cimke hozzáadása..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Tracker cimke hozzáadása fájlhoz" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Cimke eltávolítása..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Cimke eltávolítása fájlból" #: ../kupfer/plugin/tracker1.py:10 msgid "Tracker" msgstr "Tracker" #. FIXME: Port tracker tag sources and actions #. to the new, much more powerful sparql + dbus API #. (using tracker-tag as in 0.6 is a plain hack and a dead end) #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Korábban használt kötegek a TrueCrypt-ben" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "TrueCrypt köteg: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Köteg csatolása" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Felcsatolás TrueCrypt-ben" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Fájl felcsatolása TrueCrypt kötegként" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Minden köteg leválasztása" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "TrueCrypt kötegek" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Terminal Server Client" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Terminal Server Client-ben tárolt munkafolyamat" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "TSClient munkafolyamatok" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Terminal Server Client-ben tárolt munkafolyamatok" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Vinagre könyvjelzők és parancsok" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Vinagre munkafolyamat indítása" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Vinagre könyvjelzők" #: ../kupfer/plugin/vim.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim.py:3 msgid "Recently used documents in Vim" msgstr "Nemrég használt dokumentumok a Vim-ben" #: ../kupfer/plugin/vim.py:46 msgid "Vim Recent Documents" msgstr "Vim legutóbbi dokumentumok" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "VirtualBox virtuális gépek használata. Támogatja mind a Sun és az Open " "Source Edition-t" #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "Parancssori környezet kényszerítése" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Bekapcsolás" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Bekapcsolás felület nélküli üzemben" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Kikapcsolás szignál küldése" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Újraindítás" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Folytatás" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Állapot mentése" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Kikapcsolás" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "VirtualBox gépek" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:10 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "Hozzárérés Zim - Asztali Wiki-ben tárolt oldalakhoz" #: ../kupfer/plugin/zim.py:28 msgid "Page names start with :colon" msgstr "Az oldalak neve ezzel kezdődik: :colon" #: ../kupfer/plugin/zim.py:58 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Zim oldal a \"%s\" jegyzettömbből" #: ../kupfer/plugin/zim.py:67 msgid "Create Zim Page" msgstr "Zim oldal létrehozása" #: ../kupfer/plugin/zim.py:74 msgid "Create page in default notebook" msgstr "Új oldal létrehozása az alapértelmezett jegyzettömbben" #: ../kupfer/plugin/zim.py:84 msgid "Create Zim Page In..." msgstr "Zim oldal létrehozása máshol..." #: ../kupfer/plugin/zim.py:122 msgid "Create Subpage..." msgstr "Aloldal létrehozása..." #: ../kupfer/plugin/zim.py:243 msgid "Zim Notebooks" msgstr "Zim jegyzettömbök" #: ../kupfer/plugin/zim.py:259 msgid "Zim Pages" msgstr "Zim oldalak" #: ../kupfer/plugin/zim.py:287 msgid "Pages stored in Zim Notebooks" msgstr "Zim jegyzettömbben tárolt oldalak" kupfer-v208/po/it.po000066400000000000000000002470531176220042200144500ustar00rootroot00000000000000# Italian translation for the kupfer package # Copyright (C) 2009 Ulrik Sverdrup # This file is distributed under the same license as the kupfer package. (GPLv3) # # Andrea Zagli , 2009. # Francesco Marella , 2010. # msgid "" msgstr "" "Project-Id-Version: kupfer beta\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2011-04-14 21:40+0200\n" "PO-Revision-Date: 2010-08-24 20:06+0200\n" "Last-Translator: Francesco Marella \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "Lanciatore di applicazioni" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "Comodo comando e strumento di accesso per applicazioni e documenti" #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Esegui in Kupfer" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Comando salvato" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "Scorciatoie da tastiera del browser" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "Scorciatoie da tastiera globali" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Avvio" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:150 msgid "Catalog" msgstr "Catalogo" #: ../data/preferences.ui.h:5 #, fuzzy msgid "Desktop Environment" msgstr "Applicazioni per l'ambiente desktop" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "" #: ../data/preferences.ui.h:7 msgid "General" msgstr "Generale" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "" #: ../data/preferences.ui.h:9 #, fuzzy msgid "Inclusion in Top Level Searches" msgstr "Includere le canzoni nel livello principale" #: ../data/preferences.ui.h:10 #, fuzzy msgid "Indexed Folders" msgstr "Nuova cartella" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "Tastiera" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Preferenze di Kupfer" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "Plugin" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:844 msgid "Reset" msgstr "Ripristina" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "Mostrare l'icona nell'area di notifica" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "Avvia automaticamente all'accesso" #: ../data/preferences.ui.h:19 #, fuzzy msgid "Terminal emulator:" msgstr "Apri terminale qui" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "" "Usa pressione di singoli tasti per i comandi (Spazio, /, punto, virgola ecc.)" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Credenziali utente" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "_Cambia" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "_Password:" #: ../data/credentials_dialog.ui.h:4 msgid "_User:" msgstr "_Utente:" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "L'associazione di tasti non può essere associata" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Premere la combinazione di tasti desiderata" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "Impostazione scorciatoia da tastiera" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "non presentare l'interfaccia principale all'avvio" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "elenca i plugin disponibili" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "abilita informazioni di debug" #: ../kupfer/main.py:46 msgid "run keyboard shortcut relay service on this display" msgstr "" #: ../kupfer/main.py:49 msgid "show usage help" msgstr "mostra l'aiuto per l'uso" #: ../kupfer/main.py:50 msgid "show version information" msgstr "mostra informazioni sulla versione" #: ../kupfer/main.py:56 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Utilizzo: kupfer [ OPTIONS | FILE ... ]" #: ../kupfer/main.py:67 msgid "Available plugins:" msgstr "Plugin disponibili:" #: ../kupfer/main.py:114 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "Attivazione alternativa" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Posiziona selezione in pila" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Comando Componi" #: ../kupfer/ui/accelerators.py:11 #, fuzzy msgid "Mark Default Action" msgstr "Imposta applicazione predefinita..." #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Ripristina tutto" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Seleziona Esci" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Seleziona file selezionato" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Seleziona testo selezionato" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Mostra aiuto" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Mostra preferenze" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "Passa al primo riquadro" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Attiva/Disattiva modalità testo" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s è vuoto" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "Nessuna corrispondenza in %(src)s per \"%(query)s\"" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Nessuna corrispondenza" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Digita per cercare" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Digita per cercare in %s" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Nessuna azione" #: ../kupfer/ui/browser.py:1461 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1471 #, python-format msgid "Forget About \"%s\"" msgstr "" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1903 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Mostra interfaccia" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Mostra con selezione" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Descrizione" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Autore" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Versione" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Il modulo Python \"%s\" è necessario" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Il plugin non può essere letto a causa di un errore:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "disabilitato" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Contenuto di" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Sorgenti" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Azioni" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:589 msgid "Configuration" msgstr "Configurazione" #: ../kupfer/ui/preferences.py:609 msgid "Set username and password" msgstr "Imposta nome utente e password" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:663 msgid "Choose a Directory" msgstr "Scegli una cartella" #: ../kupfer/ui/preferences.py:842 msgid "Reset all shortcuts to default values?" msgstr "Reimpostare tutti i collegamenti ai valori predefiniti?" #: ../kupfer/ui/preferences.py:850 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Comando" #: ../kupfer/ui/preferences.py:851 msgid "Shortcut" msgstr "Collegamento" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "" "Andrea Zagli \n" "Francesco Marella " #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Un lanciatore software libero (GPLv3+)" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Questo programma è software libero, lo si può redistribuire e/o modificare\n" "in base ai termini della Licenza Pubblica Generale GNU (GNU GPL) come\n" "pubblicata dalla Free Software Foundation versione 3 o (a proprio\n" "piacimento) successiva.\n" "\n" "Questo programma è distribuito nella speranza che sia utile, ma SENZA " "ALCUNA\n" "GARANZIA, comprese anche la garanzia implicita di VENDIBILITÀ e di\n" "ADEGUATEZZA AD UN PARTICOLARE SCOPO. Vedere la Licenza Pubblica Generale " "GNU\n" "per maggiori dettagli.\n" "\n" "Insieme a questo programma dovrebbe essere stata fornita anche una copia\n" "della Licenza Pubblica Generale GNU. In caso contrario vedere .\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "Impossibile trovare Kupfer in esecuzione" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Impossibile eseguire \"%s\"" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "\"%s\" ha prodotto un risultato" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "Permessi insufficienti per eseguire \"%s\" (non eseguibile)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "Comando in \"%s\" non è disponibile" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 #, fuzzy msgid "Text" msgstr "Mostra testo" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Eseguire dopo un ritardo..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Eseguire comando dopo un intervallo di tempo specificato" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Oggetti multipli" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s oggetto" msgstr[1] "%s oggetti" #: ../kupfer/obj/contacts.py:87 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:107 msgid "Open" msgstr "Apri" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Nessuna applicazione predefinita per %(file)s (%(type)s)" #: ../kupfer/obj/fileactions.py:45 #, fuzzy, python-format msgid "Please use \"%s\"" msgstr "File selezionato \"%s\"" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Imposta applicazione predefinita..." #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Apri con applicazione predefinita" #: ../kupfer/obj/fileactions.py:77 msgid "Reveal" msgstr "Rivela" #: ../kupfer/obj/fileactions.py:86 msgid "Open parent folder" msgstr "Apre la cartella superiore" #: ../kupfer/obj/fileactions.py:92 msgid "Open Terminal Here" msgstr "Apri terminale qui" #: ../kupfer/obj/fileactions.py:105 msgid "Open this location in a terminal" msgstr "Apre questa posizione in un terminale" #: ../kupfer/obj/fileactions.py:113 msgid "Run in Terminal" msgstr "Esegui nel terminale" #: ../kupfer/obj/fileactions.py:113 msgid "Run (Execute)" msgstr "Esegui" #: ../kupfer/obj/fileactions.py:133 msgid "Run this program in a Terminal" msgstr "Esegue questo programma in un terminale" #: ../kupfer/obj/fileactions.py:135 msgid "Run this program" msgstr "Esegue questo programma" #: ../kupfer/obj/objects.py:248 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 msgid "Go To" msgstr "Vai a" #: ../kupfer/obj/objects.py:274 msgid "Open URL" msgstr "Apri URL" #: ../kupfer/obj/objects.py:285 msgid "Open URL with default viewer" msgstr "Apre URL con visualizzatore predefinito" #: ../kupfer/obj/objects.py:299 msgid "Launch" msgstr "Lancia" #: ../kupfer/obj/objects.py:312 msgid "Show application window" msgstr "Mostra finestra applicazione" #: ../kupfer/obj/objects.py:313 msgid "Launch application" msgstr "Lancia applicazione" #: ../kupfer/obj/objects.py:324 msgid "Launch Again" msgstr "Lancia di nuovo" #: ../kupfer/obj/objects.py:331 msgid "Launch another instance of this application" msgstr "Lancia un'altra istanza di questa applicazione" #: ../kupfer/obj/objects.py:337 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Chiudi" #: ../kupfer/obj/objects.py:345 msgid "Attempt to close all application windows" msgstr "Tenta di chiudere tutte le finestre dell'applicazione" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:392 msgid "Run" msgstr "Esegui" #: ../kupfer/obj/objects.py:402 msgid "Perform command" msgstr "Esegui comando" #: ../kupfer/obj/objects.py:416 #, fuzzy msgid "(Empty Text)" msgstr "File vuoto" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:432 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "\"%(text)s\"" msgstr[1] "(%(num)d righe) \"%(text)s\"" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s et. al." #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Sorgente ricorsiva di %(dir)s, (%(levels)d livelli)" #: ../kupfer/obj/sources.py:103 #, python-format msgid "Directory source %s" msgstr "Directory sorgente «%s»" #: ../kupfer/obj/sources.py:113 msgid "Home Folder" msgstr "Cartella home" #: ../kupfer/obj/sources.py:124 msgid "Catalog Index" msgstr "Indice del catalogo" #: ../kupfer/obj/sources.py:139 msgid "An index of all available sources" msgstr "Un indice di tutte le sorgenti disponibili" #: ../kupfer/obj/sources.py:170 msgid "Root catalog" msgstr "Catalogo radice" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Configura il plugin" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "Il plugin %s non è configurato" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "Credenziali utente non valide per %s" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "" #: ../kupfer/plugin/core/alternatives.py:13 #, fuzzy msgid "GNOME Terminal" msgstr "Profili del Terminale di GNOME" #: ../kupfer/plugin/core/alternatives.py:22 #, fuzzy msgid "XFCE Terminal" msgstr "Esegui nel terminale" #: ../kupfer/plugin/core/alternatives.py:31 #, fuzzy msgid "LXTerminal" msgstr "Esegui nel terminale" #: ../kupfer/plugin/core/alternatives.py:40 #, fuzzy msgid "X Terminal" msgstr "Esegui nel terminale" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Salva come..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Esci" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Esce da Kupfer" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "Informazioni su Kupfer" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Mostra informazioni sugli autori di Kupfer e sulla licenza" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Aiuto di Kupfer" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Ottieni aiuto su Kupfer" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Mostra la finestra delle preferenze di Kupfer" #: ../kupfer/plugin/core/__init__.py:65 msgid "Search Contents" msgstr "Cerca contenuto" #: ../kupfer/plugin/core/__init__.py:83 msgid "Search inside this catalog" msgstr "Cerca all'interno del catalogo" #: ../kupfer/plugin/core/__init__.py:91 msgid "Copy" msgstr "Copia" #: ../kupfer/plugin/core/__init__.py:106 msgid "Copy to clipboard" msgstr "Copia negli appunti" #: ../kupfer/plugin/core/__init__.py:128 msgid "Rescan" msgstr "Nuova scansione" #: ../kupfer/plugin/core/__init__.py:143 msgid "Force reindex of this source" msgstr "Forza la re-indicizzazione di questa sorgente" #: ../kupfer/plugin/core/selection.py:8 ../kupfer/plugin/core/selection.py:36 msgid "Selected Text" msgstr "Testo selezionato" #: ../kupfer/plugin/core/selection.py:23 #, python-format msgid "Selected Text \"%s\"" msgstr "Testo selezionato «%s»" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Ultimo comando" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Oggetti interni a Kupfer" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Ultimo risultato" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Risultati comando" #: ../kupfer/plugin/archivemanager.py:1 #, fuzzy msgid "Archive Manager" msgstr "Archivio" #: ../kupfer/plugin/archivemanager.py:9 #, fuzzy msgid "Use Archive Manager actions" msgstr "Azioni di Thunar" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Formato archivio compresso per 'Crea archivio in'" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Estrai qui" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Estrae l'archivio compresso" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Crea archivio" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Crea un archivio compresso dalla cartella" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Crea archivio in..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Archivio" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Applicazioni" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Tutte le applicazioni e le preferenze" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Applicazioni per l'ambiente desktop" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Apri con..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Apre con qualsiasi applicazione" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Imposta l'applicazione predefinita per questo tipo di file" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Calcolatrice" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Calcola espressioni che iniziano con '='" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Calcola" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:71 msgid "Clipboards" msgstr "Appunti" #: ../kupfer/plugin/clipboard.py:4 ../kupfer/plugin/clipboard.py:111 msgid "Recent clipboards" msgstr "Appunti recenti" #: ../kupfer/plugin/clipboard.py:20 msgid "Number of recent clipboards" msgstr "Numero di appunti recenti" #: ../kupfer/plugin/clipboard.py:26 msgid "Include recent selections" msgstr "Includere selezioni recenti" #: ../kupfer/plugin/clipboard.py:32 msgid "Copy selection to primary clipboard" msgstr "Copia selezione negli appunti primari" #: ../kupfer/plugin/clipboard.py:44 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Appunti \"%(desc)s\"" msgstr[1] "Appunti con %(num)d righe \"%(desc)s\"" #: ../kupfer/plugin/clipboard.py:51 msgid "Clear" msgstr "Cancella" #: ../kupfer/plugin/clipboard.py:63 msgid "Remove all recent clipboards" msgstr "Rimuovi tutti gli appunti recenti" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Comandi della shell" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Esegui (con output)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Esegui il programma e ritorna il suo risultato" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 #, fuzzy msgid "Pass to Command..." msgstr "Ultimo comando" #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 #, fuzzy msgid "Write to Command..." msgstr "Scrivi in... " #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 #, fuzzy msgid "Run program and supply text on the standard input" msgstr "Esegui il programma e ritorna il suo risultato" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "" #: ../kupfer/plugin/commands.py:215 #, fuzzy msgid "Run command-line programs" msgstr "Esegue programmi a riga di comando" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Dizionario" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Cerca una parola nel dizionario" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Cerca" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Documenti" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "Documenti utilizzati recentemente e cartelle aggiunte ai preferiti" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "Giorni massimi dei documenti recenti" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Voci recenti" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Documenti utilizzati recentemente" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "Documenti %s" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Documenti utilizzati recentemente per %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Risorse" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Cartelle aggiunte ai segnalibri" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Segnalibri di Epiphany" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Indice dei segnalibri di Epiphany" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Preferiti" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "" "Segna elementi usati comunemente e archivia oggetti per un utilizzo futuro" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "Lista di voci preferite" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Aggiungi ai preferiti" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Aggiunge la voce alla lista dei preferiti" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Rimuovi dai preferiti" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Rimuove la voce dalla lista dei preferiti" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Azioni su file" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Altre azioni su file" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:210 msgid "Move To..." msgstr "Sposta in..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:252 msgid "Move file to new location" msgstr "Sposta il file in una nuova posizione" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Rinomina in..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:165 msgid "Copy To..." msgstr "Copia in..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:206 msgid "Copy file to a chosen location" msgstr "Copia il file in una nuova posizione" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Segnalibri di Firefox" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Indice dei segnalibri di Firefox" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "Includere i siti visitati" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "File selezionato" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" "Fornisce la selezione corrente in nautilus, usando l'estensione per Nautilus " "di Kupfer" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "File selezionato \"%s\"" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "File selezionati" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Note" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Note di Gnote o Tomboy" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Utilizza l'applicazione" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Apre note con l'applicazione" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Aggiungi alle note..." #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Aggiunge testo a una nota esistente" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Crea nota" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Crea una nuova nota dal testo" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Recupero risultati di Note..." #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "Mostra i risultati della ricerca per l'interrogazione" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "oggi, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "ieri, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Ultimo aggiornamento %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "Riproduce, accoda tracce e sfoglia la libreria musicale" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Includere gli artisti nel livello principale" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Includere gli album nel livello principale" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Includere le canzoni nel livello principale" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Riproduci" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Riprende la riproduzione in Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Pausa" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Mette in pausa la riproduzione in Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Successiva" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Salta alla traccia successiva in Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Precedente" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Salta alla traccia precedente in Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Mostra riproduzione" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Mostra quale canzone è attualmente riprodotta" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Cancella coda" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Riproduce tracce in Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Accoda" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Aggiunge tracce alla coda di riproduzione" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "di %(artist)s da %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "di %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Traccia da %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Album" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Album musicali nella libreria di Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Artisti" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Artisti musicali nella libreria di Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Canzoni" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Canzoni nella libreria di Rhythmbox" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "Gestore sessioni di GNOME" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "Voci speciali e azioni per l'ambiente GNOME" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Uscita..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Esce o cambia utente" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Arresto..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Arresta, riavvia o sospende il computer" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Blocca lo schermo" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Abilita il salvaschermo e blocca" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "Gestore di sessione XFCE" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Voci speciali e azioni per l'ambiente XFCE" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Mostra testo" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:52 msgid "Display text in a window" msgstr "Mostra testo in finestra" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Carattere grande" #: ../kupfer/plugin/show_text.py:60 msgid "Show Notification" msgstr "Mostrare notifiche" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Cestino" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Accede al contenuto del cestino" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Sposta nel cestino" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Sposta questo file nel cestino" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Ripristina" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Sposta il file nella posizione originale" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "Il cestino è vuoto" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "Il cestino contiene un file" msgstr[1] "Il cestino contiene %(num)s file" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Trigger" #: ../kupfer/plugin/triggers.py:6 #, fuzzy msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Assegna associazione tasti globale (trigger) a oggetti creati con 'Componi " "comando' (Ctrl+Invio)." #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Aggiungi trigger..." #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Rimuovi trigger" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "Azioni su URL" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Scarica e apri" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Scarica in..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "Copia i file in una nuova posizione" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Volumi e dischi" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Volumi e dischi montati" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Volume montato su «%s»" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Smonta" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Smonta questo volume" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Espelli" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Smonta ed espelle questo supporto" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Cerca sul web" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Ricerca nel web con OpenSearch" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Ricerca con..." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Cerca contenuto..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Motori di ricerca" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Cerca in Wikipedia" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Lingua di Wikipedia" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "it" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Cerca questo termine in %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Elenco finestre" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Tutte le finestre in tutti gli spazi di lavoro" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Attiva" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Arrotola" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Srotola" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Minimizza" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Deminimizza" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Massimizza" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Demassimizza" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Massimizza verticalmente" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Demassimizza verticalmente" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Finestra in %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Finestra in primo piano" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Prossima finestra" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Salta nello spazio di lavoro di questa finestra e dà il focus" #: ../kupfer/plugin/windows.py:252 #, fuzzy, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "Prossima finestra" msgstr[1] "Prossima finestra" #: ../kupfer/plugin/windows.py:256 #, fuzzy msgid "Active workspace" msgstr "Salta in questo spazio di lavoro" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Salta in questo spazio di lavoro" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Spazi di lavoro" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Documenti utilizzati recentemente in Abiword" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Voci recenti di Abiword" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Interfaccia per il gestore di pacchetti APT" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Metodo di installazione" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Mostra informazioni sul pacchetto" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Installa" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Installa il pacchetto utilizzando il metodo configurato" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Pacchetti per \"%s\"" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Cerca per nome pacchetto..." #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "Azioni su archivi" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Permette la navigazione all'interno di archivi compressi" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "Contenuto di %s" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Controlla la riproduzione e la scaletta di Audacious" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Aggiunge la traccia alla coda di riproduzione di Audacious" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Togli dalla coda" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Rimuove tracce dalla coda di riproduzione di Audacious" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Salta alla traccia successiva in Audacious" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Riprende la riproduzione in Audacious" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Mette in pausa la riproduzione in Audacious" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Salta alla traccia successiva in Audacious" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Salta alla traccia precedente in Audacious" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Cancella la coda di riproduzione di Audacious" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Mischia" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Attiva/disattiva mischia in Audacious" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Ripeti" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Attiva/Disattiva ripeti in Audacious" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Scaletta" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Segnalibri di Chromium" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Indice dei segnalibri di Chromium" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Contatti e azioni di Claws Mail" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Componi nuovo messaggio di posta" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Compone nuovo messaggio di posta con Claws Mail" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Ricevi tutti i messaggi di posta" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "Riceve nuovi messaggi di posta per tutti gli account con ClawsMail" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "Componi nuovo messaggio di posta" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "Invia con messaggio di posta a..." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Compone nuovo messaggio di posta con Claws Mail e allega file" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Rubrica indirizzi di Claws Mail" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Contatti dalla rubrica indirizzi di Claws Mail" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 #, fuzzy msgid "Custom Terminal" msgstr "Esegui nel terminale" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "Flag esecuzione" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Client email predefinito" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "" "Compone nuovo messaggio di posta usando il gestore di posta predefinito" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Cerca in Devhelp" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "" #: ../kupfer/plugin/empathy.py:6 #, fuzzy msgid "Access to Empathy Contacts" msgstr "Accede ai contatti Gajim" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Mostrare i contatti non in linea" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Disponibile" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Assente" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Occupato" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Non disponibile" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Invisibile" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Fuori rete" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:90 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:204 msgid "Open Chat" msgstr "Apri chat" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:118 #: ../kupfer/plugin/skype.py:250 msgid "Change Global Status To..." msgstr "Cambia stato globale in..." #: ../kupfer/plugin/empathy.py:171 #, fuzzy msgid "Empathy Contacts" msgstr "Contatti Gajim" #: ../kupfer/plugin/empathy.py:237 #, fuzzy msgid "Empathy Account Status" msgstr "Stato account Gajim" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Contatti Evolution" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Componi nuovo messaggio in Evolution" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Compone nuovo messaggio in Evolution e allega file" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Rubrica indirizzi di Evolution" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Mostra siti e gestisce indirizzi ftp con Filezilla" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Apre il sito con Filezilla" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Siti Filezilla" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Siti di Filezilla" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Accede ai contatti Gajim" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Disponibile alla chat" #: ../kupfer/plugin/gajim.py:146 msgid "Gajim Contacts" msgstr "Contatti Gajim" #: ../kupfer/plugin/gajim.py:210 msgid "Gajim Account Status" msgstr "Stato account Gajim" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "Profili del Terminale di GNOME" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "Lancia profili del Terminale di GNOME" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:144 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "Carica contatti e compone un nuovo messaggio di posta in Gmail" #: ../kupfer/plugin/gmail/__init__.py:32 msgid "Load contacts' pictures" msgstr "Caricare immagini dei contatti" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Compose Email in GMail" msgstr "Componi nuovo messaggio di posta in GMail" #: ../kupfer/plugin/gmail/__init__.py:74 msgid "Open web browser and compose new email in GMail" msgstr "Apre il browser web per comporre un nuovo messaggio di posta in GMail" #: ../kupfer/plugin/gmail/__init__.py:177 msgid "Contacts from Google services (Gmail)" msgstr "Contatti dai servizi Google (Gmail)" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Mostra album e carica file in Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "Utenti da mostrare: (separati con virgola)" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Caricare gli utenti e le icone degli album" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Caricamento immagini" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Carica foto in Picasa Web Album" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Creazione album:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Album creati da Kupfer" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "File:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "Un album" msgstr[1] "%(num)d album" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "una foto" msgstr[1] "%(num)s foto" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Carica nell'album Picasa..." #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Carica file in un album Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Carica in Picasa come nuovo album" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Crea album dalle cartelle locali selezionate" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Album di picasa" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Album dell'utente in Picasa" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Cerca con Google" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Cerca con Google con risultati mostrati direttamente" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #, python-format msgid "Results for \"%s\"" msgstr "Risultati per \"%s\"" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Mostra più risultati per \"%s\"" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "%s trovati in totale" #: ../kupfer/plugin/google_translate.py:6 msgid "Google Translate" msgstr "Google Translate" #: ../kupfer/plugin/google_translate.py:8 #: ../kupfer/plugin/google_translate.py:153 msgid "Translate text with Google Translate" msgstr "Traduce testo con Google Translate" #: ../kupfer/plugin/google_translate.py:83 msgid "Google Translate connection timed out" msgstr "Connessione a Google Translate scaduta" #: ../kupfer/plugin/google_translate.py:86 msgid "Error connecting to Google Translate" msgstr "Errore di connessione a Google Translate" #: ../kupfer/plugin/google_translate.py:136 #: ../kupfer/plugin/google_translate.py:223 msgid "Translate To..." msgstr "Traduci..." #: ../kupfer/plugin/google_translate.py:179 #, python-format msgid "Translate into %s" msgstr "Traduci in %s" #: ../kupfer/plugin/google_translate.py:203 msgid "Languages" msgstr "Lingue" #: ../kupfer/plugin/google_translate.py:238 msgid "Show translated page in browser" msgstr "Mostra la pagina tradotta in finestra" #: ../kupfer/plugin/google_translate.py:255 msgid "Show Translation To..." msgstr "Mostra traduzione in..." #: ../kupfer/plugin/google_translate.py:271 msgid "Show translation in browser" msgstr "Mostra la traduzione nel browser" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "Sfoglia e crea nuove attività in GTG" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "da completare il: %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "inizia il: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "etichette: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Apri l'attività in Getting Things GNOME!" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Elimina" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Elimina definitivamente questa attività" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Marca completa" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Marca questa attività completa" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Rimuovi" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Marca questa attività come non più da completare" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Crea attività" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Crea una nuova attività in Getting Things GNOME" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, fuzzy, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s %(when)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, fuzzy, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s" #: ../kupfer/plugin/gwibber.py:187 #, fuzzy msgid "Send Message" msgstr "Invia messaggio..." #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "" #: ../kupfer/plugin/gwibber.py:210 #, fuzzy msgid "Send Message To..." msgstr "Invia messaggio..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Invia messaggio..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Rispondi..." #: ../kupfer/plugin/gwibber.py:314 #, fuzzy msgid "Delete Message" msgstr "Invia messaggio..." #: ../kupfer/plugin/gwibber.py:337 #, fuzzy msgid "Send Private Message..." msgstr "Invia messaggio diretto..." #: ../kupfer/plugin/gwibber.py:370 #, fuzzy msgid "Send direct message to user" msgstr "Invia messaggio diretto a..." #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "" #: ../kupfer/plugin/gwibber.py:376 #, fuzzy msgid "Retweet To..." msgstr "Rinomina in..." #: ../kupfer/plugin/gwibber.py:407 #, fuzzy msgid "Retweet message to all Gwibber accounts" msgstr "Riceve nuovi messaggi di posta per tutti gli account con ClawsMail" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:413 #, fuzzy msgid "Open in Browser" msgstr "Apre la cartella superiore" #: ../kupfer/plugin/gwibber.py:419 #, fuzzy msgid "Open message in default web browser" msgstr "Apre URL con visualizzatore predefinito" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 #, fuzzy msgid "Gwibber Accounts" msgstr "Stato account Gajim" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Azioni Higher-order" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Strumenti per lavorare con comandi e oggetti" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Seleziona in Kupfer" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Risultati per %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Esegui (Usa risultati)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Usa il risultato del comando come un oggetto proxy" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Esegui (Scarta risultati)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Strumenti per immagini" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Strumenti per la trasformazione delle immagini" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Scala..." #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Scala immagine per adattarla alle dimensioni fornite in pixel" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Rotazione oraria" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Rotazione anti-oraria" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Rotazione automatica" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Ruota immagine JPEG in base ai metadati EXIF associati" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Plugin" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Accede alla lista di plugin" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Mostra informazioni" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Mostra codice sorgente" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "abilitato" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Trova file" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Cerca nel filesystem con locate" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "" "Ignorare distinzione tra maiuscole/minuscole durante la ricerca dei file" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 #, fuzzy msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Documenti utilizzati recentemente in OpenOffice" #: ../kupfer/plugin/openoffice.py:83 #, fuzzy msgid "OpenOffice/LibreOffice Recent Items" msgstr "Voci recenti OpenOffice" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Segnalibri di Opera" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Indice dei segnalibri di Opera" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera Mail" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Contatti e azioni di Opera Mail" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Compone nuovo messaggio di posta con Opera Mail" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Contatti Opera Mail" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Contatti dalla rubrica indirizzi di Opera Mail" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Accedi ai contatti di Pidgin" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d carattere)" msgstr[1] "%s (%d caratteri)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Contatti Pidgin" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "Sessioni di PuTTY" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Accesso veloce alle sessioni PuTTY" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Avvia sessione" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "reStructuredText" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "Genera reStructuredText e mostra il risultato" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Mostra come Documento HTML" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "Sessioni attive di GNU Screen" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Attaccato" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Separato" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "Sessione %(status)s (%(pid)s) creata %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Sessioni di Screen" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Attacca" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:49 msgid "Send Keys" msgstr "" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "" #: ../kupfer/plugin/sendkeys.py:25 msgid "Paste to Foreground Window" msgstr "" #: ../kupfer/plugin/sendkeys.py:43 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:85 msgid "Send keys to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:90 msgid "Type Text" msgstr "" #: ../kupfer/plugin/sendkeys.py:111 msgid "Type the text to foreground window" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Servizi di sistema" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "Avvia, interrompe o riavvia servizi di sistema attraverso script init" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Comandi della shell" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Avvia servizio" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Riavvia servizio" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Interrompe servizio" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "Servizio %s" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Abbrevia collegamenti" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Crea alias brevi per URL lunghi" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Errore" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Abbrevia con..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Servizi" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 #, fuzzy msgid "Show QRCode" msgstr "Mostra codice sorgente" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 #, fuzzy msgid "Display text as QRCode in a window" msgstr "Mostra testo in finestra" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Accedi ai contatti Skype" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skype Me" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Scollegato" #: ../kupfer/plugin/skype.py:183 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:225 msgid "Call" msgstr "Chiama" #: ../kupfer/plugin/skype.py:239 msgid "Place a call to contact" msgstr "Chiama il contatto" #: ../kupfer/plugin/skype.py:274 msgid "Skype Contacts" msgstr "Contatti Skype" #: ../kupfer/plugin/skype.py:294 msgid "Skype Statuses" msgstr "Stati Skype" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "Host SSH" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "Aggiunge gli host SSH trovati in ~/.ssh/config." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "Host SSH" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Connetti" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "Connette a host SSH" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "Host SSH come specificato in ~/.ssh/config" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Connessione D-Bus alla sessione assente" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Modelli di documento" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Crea nuovi documenti dai modelli" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "%s modello" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "File vuoto" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Nuova cartella" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Crea nuovo documento..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Crea un nuovo documento da modello" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Crea nuovo documento in..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "File di testo" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Aggiungi a..." #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Aggiungi..." #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Scrivi in... " #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Cerca contenuto" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:184 #: ../kupfer/plugin/thunar.py:224 ../kupfer/plugin/thunar.py:283 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:10 msgid "File manager Thunar actions" msgstr "Azioni di Thunar" #: ../kupfer/plugin/thunar.py:66 msgid "Select in File Manager" msgstr "Seleziona nell'esploratore file" #: ../kupfer/plugin/thunar.py:94 msgid "Show Properties" msgstr "Mostra proprietà" #: ../kupfer/plugin/thunar.py:117 msgid "Show information about file in file manager" msgstr "Mostra informazioni sul file nell'esploratore file" #: ../kupfer/plugin/thunar.py:126 msgid "Send To..." msgstr "Invia a..." #: ../kupfer/plugin/thunar.py:258 msgid "Empty Trash" msgstr "Svuota cestino" #: ../kupfer/plugin/thunar.py:298 msgid "Thunar Send To Objects" msgstr "Thunar Invia ad oggetti" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Contatti e azioni di Thunderbird/Icedove" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Compone un nuovo messaggio di posta in Thunderbird" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Rubrica indirizzi di Thunderbird" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Contatti dalla rubrica indirizzi di Thunderbird" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Top" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Mostra i processi in esecuzione e permette di inviare segnali" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Ordina per" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Riga di comando" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "Utilizzo CPU (discendente)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Utilizzo di memoria (discendente)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Invia segnale..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Segnali" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Processi in esecuzione" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% tempo: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Processi in esecuzione per l'utente corrente" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:15 ../kupfer/plugin/tracker1.py:18 msgid "Tracker desktop search integration" msgstr "Integrazione con Tracker, ricerca scrivania" #: ../kupfer/plugin/tracker.py:41 ../kupfer/plugin/tracker1.py:49 msgid "Search in Tracker" msgstr "Cerca in Tracker" #: ../kupfer/plugin/tracker.py:46 ../kupfer/plugin/tracker1.py:54 msgid "Open Tracker Search Tool and search for this term" msgstr "Apre lo strumento di ricerca Tracker e cerca questo termine" #: ../kupfer/plugin/tracker.py:55 ../kupfer/plugin/tracker1.py:62 msgid "Get Tracker Results..." msgstr "Recupero risultati di Tracker..." #: ../kupfer/plugin/tracker.py:64 ../kupfer/plugin/tracker1.py:71 msgid "Show Tracker results for query" msgstr "Mostra i risultati di Tracker per l'interrogazione" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Etichette di Tracker" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Etichette di Tracker" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Esplora le etichette di Tracker" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "Etichetta %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Oggetti etichettati «%s» con Tracker" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Aggiungi etichetta..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Aggiunge l'etichetta di tracker al file" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Rimuovi etichetta..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Rimuove l'etichetta di tracker dal file" #: ../kupfer/plugin/tracker1.py:10 #, fuzzy msgid "Tracker" msgstr "Tracker 0.6" #. FIXME: Port tracker tag sources and actions #. to the new, much more powerful sparql + dbus API #. (using tracker-tag as in 0.6 is a plain hack and a dead end) #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Volumi TrueCrypt recenti" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "Volume TrueCrypt: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Monta questo volume" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Monta con Truecrypt" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Prova a montare il file come volume Truecrypt" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Smonta tutti i volumi" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "Volumi TrueCrypt" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Client per terminal server" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Sessione salvata nel client per terminal server" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "Sessioni del client per terminal server" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Sessioni salvate nel client per terminal server" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Visualizzatore di desktop remoti" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Voci speciali e azioni" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Avvia sessione Vinagre" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Segnalibri di Vinagre" #: ../kupfer/plugin/vim.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim.py:3 msgid "Recently used documents in Vim" msgstr "Documenti utilizzati recentemente in Vim" #: ../kupfer/plugin/vim.py:46 msgid "Vim Recent Documents" msgstr "Documenti utilizzati recentemente in VIM" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "Controlla macchine virtuali di VirtualBox. Supporta sia VirtualBox di Sun " "che la versione open source." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Accensione" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Accensione headless" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Invia segnale di spegnimento" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Riavvia" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Riprendi" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Salva stato" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Spegni" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "VirtualBox" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:10 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "" "Accede alle pagine memorizzate in Zim - Un wiki per la scrivania e " "organizzatore di testi" #: ../kupfer/plugin/zim.py:28 msgid "Page names start with :colon" msgstr "Il nome della pagina comincia con i due punti" #: ../kupfer/plugin/zim.py:58 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Pagina Zim da Blocco note \"%s\"" #: ../kupfer/plugin/zim.py:67 msgid "Create Zim Page" msgstr "Crea pagina Zim" #: ../kupfer/plugin/zim.py:74 msgid "Create page in default notebook" msgstr "Crea pagina nel blocco note predefinito" #: ../kupfer/plugin/zim.py:84 msgid "Create Zim Page In..." msgstr "Crea pagina Zim in..." #: ../kupfer/plugin/zim.py:122 msgid "Create Subpage..." msgstr "Crea sottopagina..." #: ../kupfer/plugin/zim.py:243 msgid "Zim Notebooks" msgstr "Blocchi note Zim" #: ../kupfer/plugin/zim.py:259 msgid "Zim Pages" msgstr "Pagine Zim" #: ../kupfer/plugin/zim.py:287 msgid "Pages stored in Zim Notebooks" msgstr "Pagine memorizzate nei blocchi note Zim" #~ msgid "Directories" #~ msgstr "Cartelle" #~ msgid "Interface" #~ msgstr "Interfaccia" #~ msgid "Hide Kupfer when focus is lost" #~ msgstr "Nascondere Kupfer quando perde il focus" #~ msgid "" #~ "Tick the box next to a source to make sure its objects are exported to " #~ "the top level of the catalog. An unticked source's contents are only " #~ "available by locating its subcatalog and entering it.\n" #~ "\n" #~ "Note: Kupfer is an integrator, not an indexer itself. Kupfer is not " #~ "designed to carry a catalog larger than a couple of thousand objects, and " #~ "may become slow if overly large subcatalogs are included in the top level." #~ msgstr "" #~ "Selezionare la casella accanto ad una fonte per assicurarsi che i suoi " #~ "oggetti vengano esportati al livello superiore del catalogo. I contenuti " #~ "di una fonte non selezionata sono disponibili solo individuando il suo " #~ "sotto catalogo ed entrandovi.\n" #~ "\n" #~ "Nota: Kupfer è un integratore, non un indicizzatore. Kupfer non è " #~ "progettato per gestire un catalogo più grande di alcune migliaia di " #~ "oggetti e potrebbe diventare lento se sotto cataloghi troppo grandi sono " #~ "inclusi nel livello principale." #~ msgid "Text Matches" #~ msgstr "Corrispondenze del testo" #~ msgid "noun" #~ msgstr "nome" #~ msgid "verb" #~ msgstr "verbo" #~ msgid "adjective" #~ msgstr "aggettivo" #~ msgid "Twitter" #~ msgstr "Twitter" #~ msgid "Microblogging with Twitter: send updates and show friends' tweets" #~ msgstr "" #~ "Microblogging con Twitter: invia aggiornamenti e mostra tweets da amici" #~ msgid "Load friends' pictures" #~ msgstr "Carica immagini di amici" #~ msgid "Load friends' public tweets" #~ msgstr "Carica tweets pubblici da amici" #~ msgid "Load timeline" #~ msgstr "Carica timeline" #~ msgid "Post Update to Twitter" #~ msgstr "Pubblica aggiornamento su Twitter" #~ msgid "Twitter Timeline" #~ msgstr "Timeline Twitter" #~ msgid "Twitter Friends" #~ msgstr "Amici Twitter" #~ msgid "Timeline for %s" #~ msgstr "Timeline per %s" #~ msgid "OpenOffice" #~ msgstr "OpenOffice" #~ msgid "Preferred terminal" #~ msgstr "Terminale preferito" #~ msgid "" #~ "The preferred terminal emulator. It's used to launch the SSH sessions." #~ msgstr "" #~ "Emulatore di terminale preferito. Utilizzato per lanciare le sessioni SSH." #~ msgid "" #~ "The flag which makes the terminal execute everything following it inside " #~ "the terminal (e.g. '-x' for gnome-terminal and terminal, '-e' for konsole " #~ "and urxvt)." #~ msgstr "" #~ "Flag che permette di eseguire tutto ciò che ne segue all'interno del " #~ "terminale (es. '-x' per gnome-terminal e terminal, '-e' per konsole e " #~ "urxvt)." #~ msgid "Tracker 0.8" #~ msgstr "Tracker 0.8" #~ msgid "Plugins may not be unloaded at runtime" #~ msgstr "Attivazione dei plugin dopo il riavvio" #~ msgid "Include in top level" #~ msgstr "Includere nel livello principale" #~ msgid "" #~ "If enabled, objects from the plugin's source(s) will be available in the " #~ "top level.\n" #~ "Sources are always available as subcatalogs in the top level." #~ msgstr "" #~ "Se abilitata, gli oggetti dal sorgente dei plugin saranno disponibili nel " #~ "livello principale.\n" #~ "I sorgenti sono sempre disponibili come sotto cataloghi nel livello " #~ "principale." #~ msgid "Keybinding" #~ msgstr "Associazione di tasti" #~ msgid "Applied" #~ msgstr "Applicato" #~ msgid "Gnome Session Management" #~ msgstr "Gestore sessioni di Gnome" #~ msgid "Special items and actions for Gnome environment" #~ msgstr "Voci speciali e azioni per l'ambiente Gnome" kupfer-v208/po/ko.po000066400000000000000000002500751176220042200144430ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: kupfer\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2011-04-14 21:40+0200\n" "PO-Revision-Date: \n" "Last-Translator: Kim Boram \n" "Language-Team: Kim Boram \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Poedit-Language: Korean\n" "X-Poedit-Country: KOREA, REPUBLIC OF\n" "X-Poedit-SourceCharset: utf-8\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "응용 프로그램 실행 아이콘" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "편리하게 응용프로그램이나 문서에 접근하고 명령을 내릴 수 있는 도구" #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "쿠퍼" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "쿠퍼에서 실행" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "저장된 쿠퍼 명령어" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "브라우저 키보드 바로 가기" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "전역 키보드 바로 가기" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "시작" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:150 msgid "Catalog" msgstr "카탈로그" #: ../data/preferences.ui.h:5 #, fuzzy msgid "Desktop Environment" msgstr "데스크톱 환경 응용 프로그램" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "" #: ../data/preferences.ui.h:7 msgid "General" msgstr "일반" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "" #: ../data/preferences.ui.h:9 #, fuzzy msgid "Inclusion in Top Level Searches" msgstr "최 상위에 노래 포함" #: ../data/preferences.ui.h:10 #, fuzzy msgid "Indexed Folders" msgstr "새 폴더" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "키보드" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "쿠퍼 기본 설정" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "플러그인" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:844 msgid "Reset" msgstr "초기화" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "알림 영역에 아이콘 보이기" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "로그인할 때 자동으로 시작" #: ../data/preferences.ui.h:19 #, fuzzy msgid "Terminal emulator:" msgstr "여기에서 터미널 열기" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "단독 키 스트로크 명령 사용 (스페이스, /, 마침표, 구 점 등.)" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "사용자 인증서" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "바꾸기(_C)" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "암호(_P):" #: ../data/credentials_dialog.ui.h:4 msgid "_User:" msgstr "사용자(_U):" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "키 조합을 묶을 수 없습니다" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "원하시는 키 조합을 눌러주십시오" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "키보드 바로 가기 설정" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "실행할 때 주 인터페이스를 보이지 않기" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "사용 가능한 플러그인 목록 보기" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "디버그 정보 활성화" #: ../kupfer/main.py:46 msgid "run keyboard shortcut relay service on this display" msgstr "" #: ../kupfer/main.py:49 msgid "show usage help" msgstr "사용법 도움말 보이기" #: ../kupfer/main.py:50 msgid "show version information" msgstr "버전 정보 보이기" #: ../kupfer/main.py:56 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "사용법: kupfer [ 옵션 | 파일 ... ]" #: ../kupfer/main.py:67 msgid "Available plugins:" msgstr "사용 가능 플러그인:" #: ../kupfer/main.py:114 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "대안 활성화" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "구점 트릭" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "명령어 구성" #: ../kupfer/ui/accelerators.py:11 #, fuzzy msgid "Mark Default Action" msgstr "기본 응용 프로그램 설정..." #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "모두 초기화" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "선택 끝내기" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "선택한 파일 선택" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "선택한 텍스트 선택" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "도움말 보이기" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "기본 설정 보이기" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "첫 패널로 전환" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "토글 텍스트 모드" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s이(가) 비어있음" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "%(src)s에서 \"%(query)s\"와 일치하는 항목 없음" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "일치하는 항목 없음" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "찾으려면 입력하세요" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "%s을(를) 검색하려면 입력하세요" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "동작 없음" #: ../kupfer/ui/browser.py:1461 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1471 #, python-format msgid "Forget About \"%s\"" msgstr "" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1903 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "주 인터페이스 보이기" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "선택 보이기" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "설명" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "저자" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "버전" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "파이선 모듈 '%s'이(가) 필요합니다" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "오류로 인해 플러그인을 읽을 수 없습니다:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "비 활성화 됨" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "내용" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "소스" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "동작" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:589 msgid "Configuration" msgstr "설정" #: ../kupfer/ui/preferences.py:609 msgid "Set username and password" msgstr "사용자 이름과 암호 설정" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:663 msgid "Choose a Directory" msgstr "디렉터리 선택" #: ../kupfer/ui/preferences.py:842 msgid "Reset all shortcuts to default values?" msgstr "모든 바로 가기를 기본 값으로 초기화하시겠습니까?" #: ../kupfer/ui/preferences.py:850 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "명령어" #: ../kupfer/ui/preferences.py:851 msgid "Shortcut" msgstr "바로 가기" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "김보람 " #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "자유 소프트웨어 (GPLv3+) 실행 아이콘" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "실행 중인 쿠퍼를 찾을 수 없습니다" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "'%s'을(를) 실행할 수 없습니다" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "\"%s\"이(가) 결과를 만들었습니다" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "\"%s\"을(를) 실행할 권한이 없습니다 (실행 권한 없음)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "\"%s\" 안의 명령을 실행할 수 없습니다" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 #, fuzzy msgid "Text" msgstr "텍스트 보이기" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "대기 후 실행..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "특정한 시간 동안 대기한 후 명령어를 실행합니다" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "다수의 개체" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s 개체" #: ../kupfer/obj/contacts.py:87 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:107 msgid "Open" msgstr "열기" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "%(file)s (%(type)s)을(를) 실행할 기본 응용 프로그램 없음" #: ../kupfer/obj/fileactions.py:45 #, fuzzy, python-format msgid "Please use \"%s\"" msgstr "선택한 파일 \"%s\"" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "기본 응용 프로그램 설정..." #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "기본 응용 프로그램으로 열기" #: ../kupfer/obj/fileactions.py:77 msgid "Reveal" msgstr "나타나기" #: ../kupfer/obj/fileactions.py:86 msgid "Open parent folder" msgstr "상위 폴더를 엽니다" #: ../kupfer/obj/fileactions.py:92 msgid "Open Terminal Here" msgstr "여기에서 터미널 열기" #: ../kupfer/obj/fileactions.py:105 msgid "Open this location in a terminal" msgstr "이 위치를 터미널로 엽니다" #: ../kupfer/obj/fileactions.py:113 msgid "Run in Terminal" msgstr "터미널에서 실행" #: ../kupfer/obj/fileactions.py:113 msgid "Run (Execute)" msgstr "실행" #: ../kupfer/obj/fileactions.py:133 msgid "Run this program in a Terminal" msgstr "이 프로그램을 터미널에서 실행합니다" #: ../kupfer/obj/fileactions.py:135 msgid "Run this program" msgstr "이 프로그램 실행" #: ../kupfer/obj/objects.py:248 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 msgid "Go To" msgstr "이동" #: ../kupfer/obj/objects.py:274 msgid "Open URL" msgstr "URL 열기" #: ../kupfer/obj/objects.py:285 msgid "Open URL with default viewer" msgstr "기본 프로그램으로 이 주소 열기" #: ../kupfer/obj/objects.py:299 msgid "Launch" msgstr "실행" #: ../kupfer/obj/objects.py:312 msgid "Show application window" msgstr "응용 프로그램 창 열기" #: ../kupfer/obj/objects.py:313 msgid "Launch application" msgstr "응용 프로그램 실행" #: ../kupfer/obj/objects.py:324 msgid "Launch Again" msgstr "다시 실행" #: ../kupfer/obj/objects.py:331 msgid "Launch another instance of this application" msgstr "또 다른 이 응용 프로그램 인스턴스를 실행합니다" #: ../kupfer/obj/objects.py:337 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "닫기" #: ../kupfer/obj/objects.py:345 msgid "Attempt to close all application windows" msgstr "모든 응용 프로그램 창을 닫기를 실행합니다" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:392 msgid "Run" msgstr "실행" #: ../kupfer/obj/objects.py:402 msgid "Perform command" msgstr "명령어 실행" #: ../kupfer/obj/objects.py:416 #, fuzzy msgid "(Empty Text)" msgstr "빈 파일" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:432 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "(%(num)d 줄) \"%(text)s\"" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s 등." #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "귀납적 소스 %(dir)s, (%(levels)d 레벨)" #: ../kupfer/obj/sources.py:103 #, python-format msgid "Directory source %s" msgstr "디렉터리 소스 %s" #: ../kupfer/obj/sources.py:113 msgid "Home Folder" msgstr "내 폴더" #: ../kupfer/obj/sources.py:124 msgid "Catalog Index" msgstr "카탈로그 인덱스" #: ../kupfer/obj/sources.py:139 msgid "An index of all available sources" msgstr "사용 가능한 모든 소스의 인덱스" #: ../kupfer/obj/sources.py:170 msgid "Root catalog" msgstr "루트 카탈로그" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "플러그인을 설정해 주십시오" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "플러그인 %s이(가) 설정되지 않았습니다" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "유효하지 않은 사용자 인증서 %s" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "" #: ../kupfer/plugin/core/alternatives.py:13 #, fuzzy msgid "GNOME Terminal" msgstr "그놈 터미널 프로필" #: ../kupfer/plugin/core/alternatives.py:22 #, fuzzy msgid "XFCE Terminal" msgstr "터미널에서 실행" #: ../kupfer/plugin/core/alternatives.py:31 #, fuzzy msgid "LXTerminal" msgstr "터미널에서 실행" #: ../kupfer/plugin/core/alternatives.py:40 #, fuzzy msgid "X Terminal" msgstr "터미널에서 실행" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "다른 이름으로 저장..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "끝내기" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "쿠퍼 끝내기" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "쿠퍼 정보" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "쿠퍼 제작자와 라이선스에 대한 정보를 보여줍니다" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "쿠퍼 도움말" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "쿠퍼에 대한 도움을 받습니다" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "쿠퍼 기본 설정 창 보이기" #: ../kupfer/plugin/core/__init__.py:65 msgid "Search Contents" msgstr "내용 검색" #: ../kupfer/plugin/core/__init__.py:83 msgid "Search inside this catalog" msgstr "이 카탈로그 안을 찾아봅니다" #: ../kupfer/plugin/core/__init__.py:91 msgid "Copy" msgstr "복사" #: ../kupfer/plugin/core/__init__.py:106 msgid "Copy to clipboard" msgstr "클립보드로 복사" #: ../kupfer/plugin/core/__init__.py:128 msgid "Rescan" msgstr "다시 읽기" #: ../kupfer/plugin/core/__init__.py:143 msgid "Force reindex of this source" msgstr "이 소스를 다시 인덱스 하게 합니다" #: ../kupfer/plugin/core/selection.py:8 ../kupfer/plugin/core/selection.py:36 msgid "Selected Text" msgstr "선택한 텍스트" #: ../kupfer/plugin/core/selection.py:23 #, python-format msgid "Selected Text \"%s\"" msgstr "선택한 텍스트 \"%s\"" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "마지막 명령어" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "내부 쿠퍼 개체" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "마지막 결과" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "명령어 결과" #: ../kupfer/plugin/archivemanager.py:1 #, fuzzy msgid "Archive Manager" msgstr "압축 파일" #: ../kupfer/plugin/archivemanager.py:9 #, fuzzy msgid "Use Archive Manager actions" msgstr "파일 관리자 Thunar 동작" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "'다음에서 압축 파일 만들기'를 위한 압축 파일 형식" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "여기에 풀기" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "압축 파일 여기에 풀기" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "압축 파일 만들기" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "폴더에서 압축 파일 만들기" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "다음에서 압축 파일 만들기..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "압축 파일" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "응용 프로그램" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "모든 응용 프로그램과 기본 설정" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "데스크톱 환경 응용 프로그램" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "다른 프로그램으로 열기..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "다른 프로그램으로 열기..." #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "이 파일 형식을 열 기본 응용 프로그램을 설정합니다" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "계산기" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "계산기 표현은 '=' 기호로 시작합니다" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "계산" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:71 msgid "Clipboards" msgstr "클립보드" #: ../kupfer/plugin/clipboard.py:4 ../kupfer/plugin/clipboard.py:111 msgid "Recent clipboards" msgstr "최근 클립보드" #: ../kupfer/plugin/clipboard.py:20 msgid "Number of recent clipboards" msgstr "최근 클립보드의 수" #: ../kupfer/plugin/clipboard.py:26 msgid "Include recent selections" msgstr "최근 선택 포함" #: ../kupfer/plugin/clipboard.py:32 msgid "Copy selection to primary clipboard" msgstr "선택한 것을 주 클립보드로 복사" #: ../kupfer/plugin/clipboard.py:44 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "%(num)d 줄 \"%(desc)s\" 클립보드" #: ../kupfer/plugin/clipboard.py:51 msgid "Clear" msgstr "지우기" #: ../kupfer/plugin/clipboard.py:63 msgid "Remove all recent clipboards" msgstr "모든 최근 클립보드 제거" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "쉘 명령어" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "실행 (출력 받기)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "프로그램을 실행하고 출력 결과를 되돌려 받습니다" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 #, fuzzy msgid "Pass to Command..." msgstr "마지막 명령어" #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 #, fuzzy msgid "Write to Command..." msgstr "다음에 쓰기..." #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 #, fuzzy msgid "Run program and supply text on the standard input" msgstr "프로그램을 실행하고 출력 결과를 되돌려 받습니다" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "" #: ../kupfer/plugin/commands.py:215 #, fuzzy msgid "Run command-line programs" msgstr "명령줄 프로그램 실행" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "사전" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "사전에서 단어를 찾아봅니다" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "찾기" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "문서" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "최근 사용한 문서와 책갈피 폴더" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "최근 문서에 표시할 최대 일 수" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "최근 항목" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "최근 사용한 문서" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "문서 %s" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "최근 사용한 문서 %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "위치" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "책갈피에 추가된 폴더" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "에피파니 책갈피" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "에피파니 책갈피 인덱스" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "즐겨찾기" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "다음에 사용하기 위해 자주 사용하는 항목과 보관된 개체 표시" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "\"Favorite\" 항목 칸" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "즐겨찾기에 추가" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "즐겨찾기 칸에 항목 추가" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "즐겨찾기에서 제거" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "항목을 즐겨찾기 칸에서 제거합니다" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "파일 동작" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "더 많은 파일 동작" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:210 msgid "Move To..." msgstr "다음으로 이동..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:252 msgid "Move file to new location" msgstr "파일을 새 위치로 옮깁니다" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "다음으로 이름 바꾸기..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:165 msgid "Copy To..." msgstr "다음으로 복사..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:206 msgid "Copy file to a chosen location" msgstr "선택한 위치로 파일을 복사합니다" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "파이어폭스 책갈피" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "파이어폭스 책갈피 인덱스" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "방문한 사이트 포함" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "선택한 파일" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "쿠퍼 노틸러스 확장 기능을 이용해 현재 노틸러스 선택을 제공합니다" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "선택한 파일 \"%s\"" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "선택한 파일" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "쪽지" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "G노트 또는 톰보이 쪽지" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "응용 프로그램으로 작업" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "쪽지 응용 프로그램으로 열기" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "쪽지에 추가..." #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "존재하는 쪽지에 텍스트를 추가합니다" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "쪽지 만들기" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "이 텍스트로 새 쪽지를 만듭니다" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "쪽지 검색 결과 가져오기..." #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "이 쿼리 검색 결과 보이기" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "오늘, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "어제, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "마지막 업데이트 %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "리듬박스" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "트랙을 연주하거나 재생 대기열에 추가하고 음악 라이브러리를 검색합니다" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "최 상위에 음악가 포함" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "최 상위에 앨범 포함" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "최 상위에 노래 포함" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "재생" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "리듬박스 재생을 계속합니다" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "일시 정지" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "리듬박스 재생을 잠시 정지합니다" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "다음" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "리듬박스를 다음 트랙으로 넘깁니다" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "이전" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "리듬박스를 이전 트랙으로 넘깁니다" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "재생 중인 노래 보이기" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "어떤 노래를 지금 재생하고 있는지 알려줍니다" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "대기열 지우기" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "리듬박스로 트랙을 연주합니다" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "대기열에 추가" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "재생 대기열에 트랙을 추가합니다" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "음악가 %(artist)s 앨범 %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "음악가 %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "트랙 음악가 %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "앨범" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "리듬박스 라이브러리 안의 음악 앨범" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "음악가" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "리듬박스 라이브러리 안의 음악가" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "노래" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "리듬박스 라이브러리 안의 노래" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "그놈 세션 관리" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "그놈 환경의 특별한 동작이나 항목" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "로그아웃..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "로그아웃 또는 사용자 바꾸기" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "시스템 종료..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "시스템을 종료하거나 다시 시작 또는 최대 절전 모드로 만듭니다" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "화면 잠그기" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "화면 보호기를 활성화 한 후 잠급니다" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "XFCE 세션 관리" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "XFCE 환경의 특별한 동작이나 항목" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "텍스트 보이기" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:52 msgid "Display text in a window" msgstr "창에 텍스트 표시" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "큰 형식" #: ../kupfer/plugin/show_text.py:60 msgid "Show Notification" msgstr "알림 보이기" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "휴지통" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "휴지통 항목에 접근합니다" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "휴지통에 버리기" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "이 파일을 휴지통에 버리기" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "되살리기" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "파일을 원래 위치로 되돌립니다" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "휴지통이 비어있습니다" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "휴지통에 %(num)s 개의 파일이 있습니다" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "트리거" #: ../kupfer/plugin/triggers.py:6 #, fuzzy msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "'명령 구성(컨트롤+리턴)'으로 만들어진 개체에 전역 키 조합(트리거)을 배정합니" "다." #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "트리거 추가..." #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "트리거 제거" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "URL 동작" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "다운로드한 후 열기" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "다음에 다운로드..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "선택한 위치에 URL을 다운로드합니다" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "볼륨과 디스크" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "마운트 된 볼륨과 디스크" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "%s에 마운트 된 볼륨" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "마운트 해제" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "이 볼륨 마운트 해제" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "꺼내기" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "마운트를 해제한 후 이 미디어를 꺼냅니다" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "웹 검색" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "OpenSearch 검색 엔진으로 웹을 검색합니다" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "다음으로 검색..." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "다음 항목 검색..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "검색 엔진" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "위키백과" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "위키백과 검색" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "위키백과 언어" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "영어" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "이 용어를 %s.wikipedia.org에서 검색합니다" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "창 목록" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "모든 작업 공간의 모든 창" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "활성화" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "말아올리기" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "말아올리기 해제" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "최소화" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "최소화 취소" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "최대화" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "최대화 취소" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "세로로 최대화" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "세로 최대화 취소" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "%(wkspc)s 위의 창" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "가장 앞의 창" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "다음 창" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "이 창이 있는 작업 공간으로 이동한 후 포커스 맞추기" #: ../kupfer/plugin/windows.py:252 #, fuzzy, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "다음 창" #: ../kupfer/plugin/windows.py:256 #, fuzzy msgid "Active workspace" msgstr "이 작업 공간으로 이동" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "이 작업 공간으로 이동" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "작업 공간" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "AbiWord" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Abiword가 최근 사용한 문서" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Abiword 최근 항목" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "패키지 관리자 APT 인터페이스" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "설치 방법" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "패키지 정보 보이기" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "설치" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "설정된 방법으로 패키지 설치" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "\"%s\"와(과) 패키지 일치" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "패키지 이름 검색..." #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "압축 파일 내부 검색" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "압축 파일 내부를 찾아볼 수 있게 합니다" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "%s 항목" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Audacious 재생 기능과 재생 목록을 조정합니다" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Audacious 재생 대기열에 트랙을 추가합니다" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "재생 대기열에서 제거" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Audacious 재생 대기열에서 트랙을 제거합니다" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Audacious 안의 트랙으로 이동" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Audacious 재생 계속" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Audacious 재생 일시 정지" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Audacious 다음 트랙으로 이동" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Audacious 이전 트랙으로 이동" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Audacious 재생 대기열 지우기" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "임의 연주" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Audacious 임의 연주 켜고 끄기" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "반복 연주" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Audacious 반복 연주 켜고 끄기" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "재생 목록" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "크로미움 책갈피" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "크로미움 책갈피 인덱스" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "클러 메일" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "클러 메일 연락처와 동작" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "새 메일 작성" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "클러 메일로 새 메시지를 작성합니다" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "모든 전자 메일 받기" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "클러 메일에 설정된 모든 계정에서 새 메시지를 받습니다" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "전자 메일 작성" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "전자 메일 보내기...." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "클러 메일로 새 메시지를 적성하고 파일을 첨부합니다" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "클러 메일 주소록" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "클러 메일 주소록 안의 연락처" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 #, fuzzy msgid "Custom Terminal" msgstr "터미널에서 실행" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "실행 플래그" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "기본 전자 메일 클라이언트" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "시스템 기본값으로 설정된 전자 메일 클라이언트로 전자 메일을 작성합니다" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "개발자 도움말" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "개발자 도움말 검색" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "" #: ../kupfer/plugin/empathy.py:6 #, fuzzy msgid "Access to Empathy Contacts" msgstr "Gajim 연락처에 접근" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "오프라인 연락처 보이기" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "사용 가능" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "자리 비움" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "다른 용무 중" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "사용 불가" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "보이지 않음" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "연결안됨" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:90 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:204 msgid "Open Chat" msgstr "대화 열기" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:118 #: ../kupfer/plugin/skype.py:250 msgid "Change Global Status To..." msgstr "전역 상태를 다음으로 바꾸기..." #: ../kupfer/plugin/empathy.py:171 #, fuzzy msgid "Empathy Contacts" msgstr "Gajim 연락처" #: ../kupfer/plugin/empathy.py:237 #, fuzzy msgid "Empathy Account Status" msgstr "Gajim 계정 상태" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "에볼루션" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "에볼루션 연락처" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "에볼루션으로 새 메시지 작성" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "에볼루션으로 새 메시지를 적성하고 파일을 첨부합니다" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "에볼루션 주소록" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "파일질라" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "파일질라로 사이트를 보고 FTP 주소를 다룹니다" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "파일질라로 사이트 열기" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "파일질라 사이트" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "파일질라 사이트" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Gajim 연락처에 접근" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "대화 가능" #: ../kupfer/plugin/gajim.py:146 msgid "Gajim Contacts" msgstr "Gajim 연락처" #: ../kupfer/plugin/gajim.py:210 msgid "Gajim Account Status" msgstr "Gajim 계정 상태" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "그놈 터미널 프로필" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "그놈 터미널 프로필 실행" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:144 msgid "Gmail" msgstr "지메일" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "지메일로 연락처를 불러오고 새 전자 메일을 작성합니다" #: ../kupfer/plugin/gmail/__init__.py:32 msgid "Load contacts' pictures" msgstr "연락처 그림 불러오기" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Compose Email in GMail" msgstr "지메일로 전자 메일 작성" #: ../kupfer/plugin/gmail/__init__.py:74 msgid "Open web browser and compose new email in GMail" msgstr "웹 브라우저를 연 후 지메일로 새 메시지를 작성합니다" #: ../kupfer/plugin/gmail/__init__.py:177 msgid "Contacts from Google services (Gmail)" msgstr "구글 서비스(지메일)안의 연락처" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "구글 피카사" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "피카사로 앨범을 보고 파일을 업로드합니다" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "볼 사용자: (,-separated)" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "사용자와 앨범 아이콘을 불러옵니다" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "그림 업로드 중" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "피카사 웹 엘범으로 사진을 업로드하는 중" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "앨범 만들기:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "쿠퍼로 만든 앨범" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "파일:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "%(num)d 개의 앨범" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "%(num)s 개의 사진" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "피카사 앨범에 업로드..." #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "파일을 피카사 앨범에 업로드" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "피카사에 새 앨범으로 업로드" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "선택한 로컬 디렉터리로 새 앨범 만들기" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "피카사 앨범" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "피카사 사용자 앨범" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "구글 검색" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "결과가 직접 표시되는 구글로 검색합니다" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #, python-format msgid "Results for \"%s\"" msgstr "\"%s\" 결과" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "\"%s\" 검색 결과 더 보이기" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "%s 전체 검색" #: ../kupfer/plugin/google_translate.py:6 msgid "Google Translate" msgstr "구글 번역" #: ../kupfer/plugin/google_translate.py:8 #: ../kupfer/plugin/google_translate.py:153 msgid "Translate text with Google Translate" msgstr "텍스트를 구글 번역으로 번역합니다" #: ../kupfer/plugin/google_translate.py:83 msgid "Google Translate connection timed out" msgstr "구글 번역 접속 시간 초과" #: ../kupfer/plugin/google_translate.py:86 msgid "Error connecting to Google Translate" msgstr "구글 번역에 연결하는 중 오류가 발생했습니다" #: ../kupfer/plugin/google_translate.py:136 #: ../kupfer/plugin/google_translate.py:223 msgid "Translate To..." msgstr "다음으로 번역..." #: ../kupfer/plugin/google_translate.py:179 #, python-format msgid "Translate into %s" msgstr "%s(으)로 번역" #: ../kupfer/plugin/google_translate.py:203 msgid "Languages" msgstr "언어" #: ../kupfer/plugin/google_translate.py:238 msgid "Show translated page in browser" msgstr "번역된 페이지 브라우저로 보이기" #: ../kupfer/plugin/google_translate.py:255 msgid "Show Translation To..." msgstr "다음으로 번역 보이기..." #: ../kupfer/plugin/google_translate.py:271 msgid "Show translation in browser" msgstr "브라우저로 변역 보이기" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "GTG를 찾아보고 새 작업을 만듭니다" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "기한: %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "시작: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "태그: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Getting Things GNOME!에 작업을 엽니다" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "삭제" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "이 작업을 영구적으로 제거" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "완료된 것으로 표시" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "이 작업을 완료한 것으로 표시" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "해제" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "이 작업을 더 이상 완료할 수 없는 것으로 표시" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "작업 만들기" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Getting Things GNOME에 새 작업 만들기" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, fuzzy, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s %(when)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, fuzzy, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s" #: ../kupfer/plugin/gwibber.py:187 #, fuzzy msgid "Send Message" msgstr "메시지 보내기..." #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "" #: ../kupfer/plugin/gwibber.py:210 #, fuzzy msgid "Send Message To..." msgstr "메시지 보내기..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "메시지 보내기..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "회신..." #: ../kupfer/plugin/gwibber.py:314 #, fuzzy msgid "Delete Message" msgstr "메시지 보내기..." #: ../kupfer/plugin/gwibber.py:337 #, fuzzy msgid "Send Private Message..." msgstr "직통 메시지 보내기..." #: ../kupfer/plugin/gwibber.py:370 #, fuzzy msgid "Send direct message to user" msgstr "다음 사람에게 직통 메시지 보내기..." #: ../kupfer/plugin/gwibber.py:376 #, fuzzy msgid "Retweet" msgstr "초기화" #: ../kupfer/plugin/gwibber.py:376 #, fuzzy msgid "Retweet To..." msgstr "다음으로 이름 바꾸기..." #: ../kupfer/plugin/gwibber.py:407 #, fuzzy msgid "Retweet message to all Gwibber accounts" msgstr "클러 메일에 설정된 모든 계정에서 새 메시지를 받습니다" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:413 #, fuzzy msgid "Open in Browser" msgstr "상위 폴더를 엽니다" #: ../kupfer/plugin/gwibber.py:419 #, fuzzy msgid "Open message in default web browser" msgstr "기본 프로그램으로 이 주소 열기" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 #, fuzzy msgid "Gwibber Accounts" msgstr "Gajim 계정 상태" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "고차 동작" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "명령을 개체로서 작업하기 위한 도구" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "쿠퍼에서 선택" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "%s (%s) 결과" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "실행 (결과 받기)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "프록시 개체로 명령 결과를 받습니다" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "실행 (결과 버리기)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "그림 도구" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "그림 변형 도구" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "크기 조정..." #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "주어진 픽셀 치수에 맞게 그림의 크기를 조정합니다 " #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "시계 방향으로 회전" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "시계 반대 방향으로 회전" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "자동 회전" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "사진의 EXIF 메타 정보에 따라 사진을 회전합니다" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "쿠퍼 플러그인" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "쿠퍼 플러그인 목록에 접근합니다" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "정보 보이기" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "소스 코드 보이기" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "활성화" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "파일 위치 찾기" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "locate를 이용해 파일 시스템을 검색합니다" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "파일을 찾을 때 대소문자를 무시합니다" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 #, fuzzy msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "오픈오피스가 사용한 최근 문서" #: ../kupfer/plugin/openoffice.py:83 #, fuzzy msgid "OpenOffice/LibreOffice Recent Items" msgstr "오픈 오피스 최근 항목" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "오페라 책갈피" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "오페라 책갈피 인덱스" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "오페라 메일" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "오페라 메일 연락처와 동작" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "오페라 메일로 새 메시지를 작성합니다" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "오페라 메일 연락처" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "오페라 메일 연락처" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "피진" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "피진 연락처에 접근" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d 개의 문자)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "피진 연락처" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "PuTTY 세션" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "PuTTY 세션으로 빠르게 접속" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "세션 시작" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "reStructuredText" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "reStructuredText 그리고 결과 보이기" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "HTML 문서로 보기" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU 스크린" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "GNU 스크린 세션 활성화" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "결합됨" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "분리됨" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s 세션 (%(pid)s) 만들어짐 %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "스크린 세션" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "결합" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:49 msgid "Send Keys" msgstr "" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "" #: ../kupfer/plugin/sendkeys.py:25 msgid "Paste to Foreground Window" msgstr "" #: ../kupfer/plugin/sendkeys.py:43 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:85 msgid "Send keys to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:90 msgid "Type Text" msgstr "" #: ../kupfer/plugin/sendkeys.py:111 msgid "Type the text to foreground window" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "시스템 서비스" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "init 스크립트로 시스템 서비스를 시작, 정지 또는 다시 시작합니다" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Sudo와 같은 명령" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "서비스 시작" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "서비스 다시 시작" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "서비스 정지" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "%s 서비스" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "줄여진 링크" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "긴 주소 대신 사용할 짧은 주소를 만듦" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "오류" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "다음으로 줄임..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "서비스" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 #, fuzzy msgid "Show QRCode" msgstr "소스 코드 보이기" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 #, fuzzy msgid "Display text as QRCode in a window" msgstr "창에 텍스트 표시" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "스카이프" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "스카이프 연락처에 접근" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skype Me" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "로그아웃 됨" #: ../kupfer/plugin/skype.py:183 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:225 msgid "Call" msgstr "연락" #: ../kupfer/plugin/skype.py:239 msgid "Place a call to contact" msgstr "연락처에 전화 걸기" #: ../kupfer/plugin/skype.py:274 msgid "Skype Contacts" msgstr "스카이프 연락처" #: ../kupfer/plugin/skype.py:294 msgid "Skype Statuses" msgstr "스카이프 상태" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "SSH 호스트" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "~/.ssh/config에서 발견된 SSH 호스트를 추가합니다." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "SSH 호스트" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "연결" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "SSH 호스트에 연결" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "~/.ssh/config에 지정된 SSH 호스트" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "데스크톱 세션에 D-Bus 연결 없음" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "문서 서식" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "서식을 이용해 새 문서를 만듭니다" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "%s 서식" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "빈 파일" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "새 폴더" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "새 문서 만들기..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "서식을 이용해 새 문서 만들기" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "다음에 문서 만들기..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "텍스트 파일" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "다음에 첨가..." #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "첨가..." #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "다음에 쓰기..." #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "텍스트 항목 가져오기" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:184 #: ../kupfer/plugin/thunar.py:224 ../kupfer/plugin/thunar.py:283 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:10 msgid "File manager Thunar actions" msgstr "파일 관리자 Thunar 동작" #: ../kupfer/plugin/thunar.py:66 msgid "Select in File Manager" msgstr "파일 관리자로 선택" #: ../kupfer/plugin/thunar.py:94 msgid "Show Properties" msgstr "속성 보이기" #: ../kupfer/plugin/thunar.py:117 msgid "Show information about file in file manager" msgstr "파일 관리자로 파일 정보를 봅니다" #: ../kupfer/plugin/thunar.py:126 msgid "Send To..." msgstr "보내기..." #: ../kupfer/plugin/thunar.py:258 msgid "Empty Trash" msgstr "휴지통 비우기" #: ../kupfer/plugin/thunar.py:298 msgid "Thunar Send To Objects" msgstr "Thunar 개체로 보내기" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "썬더버드" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "썬더버드/아이스도브 연락처와 동작" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "썬더버드로 새 메시지 작성" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "썬더버드 주소록" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "썬더버드 주소록 상의 연락처" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Top" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "실행 중인 작업을 보고 신호를 보낼 수 있게 합니다" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "정렬 순서" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "명령줄" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "CPU 사용 (내림차순)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "메모리 사용 (내림차순)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "신호 보내기..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "신호" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "실행 중인 작업" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "현재 사용자가 실행 중인 작업" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "트래커 0.6" #: ../kupfer/plugin/tracker.py:15 ../kupfer/plugin/tracker1.py:18 msgid "Tracker desktop search integration" msgstr "트래커 데스크톱 검색 통합" #: ../kupfer/plugin/tracker.py:41 ../kupfer/plugin/tracker1.py:49 msgid "Search in Tracker" msgstr "트래커로 검색" #: ../kupfer/plugin/tracker.py:46 ../kupfer/plugin/tracker1.py:54 msgid "Open Tracker Search Tool and search for this term" msgstr "트래커 검색 도구를 연 후 이 용어를 검색합니다" #: ../kupfer/plugin/tracker.py:55 ../kupfer/plugin/tracker1.py:62 msgid "Get Tracker Results..." msgstr "트래커 결과 가져오기..." #: ../kupfer/plugin/tracker.py:64 ../kupfer/plugin/tracker1.py:71 msgid "Show Tracker results for query" msgstr "쿼리의 트래커 결과 보이기" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "트래커 태그" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "트래커 태그" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "트래커 태그 찾아보기" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "태그 %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "트래커로 개체에 %s 태그를 붙였습니다" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "태그 추가..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "파일에 트래커 태그 추가" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "태그 제거..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "파일에서 트래커 태그를 제거합니다" #: ../kupfer/plugin/tracker1.py:10 #, fuzzy msgid "Tracker" msgstr "트래커 0.6" #. FIXME: Port tracker tag sources and actions #. to the new, much more powerful sparql + dbus API #. (using tracker-tag as in 0.6 is a plain hack and a dead end) #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "TrueCrypt 기록 볼륨" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "TrueCrypt 볼륨: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "볼륨 마운트" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Truecrypt에 마운트" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "파일을 Truecrypt 볼륨으로 마운트 시도" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "모든 볼륨 마운트 해제" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "TrueCrypt 볼륨" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "터미널 서버 클라이언트" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "터미널 서버 클라이언트에 저장된 세션" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "터미널 서버 클라이언트 세션" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "터미널 서버 클라이언트에 저장된 세션" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Vinagre 책갈피와 동작" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Vinagre 세션 시작" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Vinagre 책갈피" #: ../kupfer/plugin/vim.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim.py:3 msgid "Recently used documents in Vim" msgstr "Vim 최근 사용한 문서" #: ../kupfer/plugin/vim.py:46 msgid "Vim Recent Documents" msgstr "Vim 최근 문서" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "버추얼 박스" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "버추얼 박스 머신을 조작합니다. 오라클 버추얼 박스와 오픈 소스 에디션을 모두 " "지원합니다." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "시스템 시작" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "헤드레스 시스템 시작" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "시스템 종료 신호 보내기" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "다시 시작" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "계속" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "상태 저장" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "시스템 종료" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "버추얼 박스 머신" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:10 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "Zim에 보관된 페이지에 접근합니다 - 데스크톱 위키와 아우트라이너" #: ../kupfer/plugin/zim.py:28 msgid "Page names start with :colon" msgstr "페이지 이름은 콜론으로 시작합니다" #: ../kupfer/plugin/zim.py:58 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Notebook \"%s\"의 Zim Page" #: ../kupfer/plugin/zim.py:67 msgid "Create Zim Page" msgstr "Zim Page 만들기" #: ../kupfer/plugin/zim.py:74 msgid "Create page in default notebook" msgstr "기본 공책에 페이지 만들기" #: ../kupfer/plugin/zim.py:84 msgid "Create Zim Page In..." msgstr "다음에 Zim Page 만들기..." #: ../kupfer/plugin/zim.py:122 msgid "Create Subpage..." msgstr "하위 페이지 만들기..." #: ../kupfer/plugin/zim.py:243 msgid "Zim Notebooks" msgstr "Zim Notebooks" #: ../kupfer/plugin/zim.py:259 msgid "Zim Pages" msgstr "Zim 페이지" #: ../kupfer/plugin/zim.py:287 msgid "Pages stored in Zim Notebooks" msgstr "Zim Notebooks에 보관된 페이지" #~ msgid "Directories" #~ msgstr "디렉터리" #, fuzzy #~| msgid "Directories" #~ msgid "Icons" #~ msgstr "디렉터리" #~ msgid "Interface" #~ msgstr "인터페이스" #, fuzzy #~| msgid "Interface" #~ msgid "Terminal" #~ msgstr "인터페이스" #~ msgid "Text Matches" #~ msgstr "텍스트 일치" #, fuzzy #~| msgid "%s total found" #~ msgid "Command '%s' not found" #~ msgstr "%s 전체 검색" #~ msgid "noun" #~ msgstr "명사" #~ msgid "verb" #~ msgstr "동사" #~ msgid "adjective" #~ msgstr "형용사" #~ msgid "Tracker 0.8" #~ msgstr "트래커 0.8" #~ msgid "" #~ "Tick the box next to a source to make sure its objects are exported to " #~ "the top level of the catalog. An unticked source's contents are only " #~ "available by locating its subcatalog and entering it.\n" #~ "\n" #~ "Note: Kupfer is an integrator, not an indexer itself. Kupfer is not " #~ "designed to carry a catalog larger than a couple of thousand objects, and " #~ "may become slow if overly large subcatalogs are included in the top level." #~ msgstr "" #~ "개체를 최 상위 단계의 카탈로그로 내보내려면 소스 옆의 상자를 표시하십시" #~ "오. 표시되지 않은 소스의 항목은 하위 카탈로그에 이동해서 들어가야만 사용" #~ "할 수 있습니다.\n" #~ "\n" #~ "주의: 쿠퍼는 인테그레이터이지 인덱서가 아닙니다. 쿠퍼는 수 천 개체 이상의 " #~ "카탈로그를 가질 수 없고, 최 상위 단계에 필요 이상의 하위 카탈로그가 포함되" #~ "면 느려질 수 있습니다." #~ msgid "Twitter" #~ msgstr "트위터" #~ msgid "Microblogging with Twitter: send updates and show friends' tweets" #~ msgstr "" #~ "트위터로 마이크로 블로깅을 합니다: 업데이트를 보내고 친구의 트위트를 봅니" #~ "다" #~ msgid "Load friends' pictures" #~ msgstr "친구의 그림 불러오기" #~ msgid "Load friends' public tweets" #~ msgstr "친구의 공개 트위트 불러오기" #~ msgid "Load timeline" #~ msgstr "일정 불러오기" #~ msgid "Post Update to Twitter" #~ msgstr "트위터 계정에 업데이트 글을 올립니다" #~ msgid "Twitter Timeline" #~ msgstr "트위터 일정" #~ msgid "Twitter Friends" #~ msgstr "트위터 친구" #~ msgid "Timeline for %s" #~ msgstr "%s의 일정" #~ msgid "OpenOffice" #~ msgstr "오픈 오피스" #~ msgid "Preferred terminal" #~ msgstr "선호하는 터미널" #~ msgid "" #~ "The preferred terminal emulator. It's used to launch the SSH sessions." #~ msgstr "선호하는 터미널 에뮬레이터. SSH 세션을 실행하는데 사용됩니다." #~ msgid "" #~ "The flag which makes the terminal execute everything following it inside " #~ "the terminal (e.g. '-x' for gnome-terminal and terminal, '-e' for konsole " #~ "and urxvt)." #~ msgstr "" #~ "터미널 안에 따르는 모든 것을 터미널에서 실행할 수 있게 해주는 플래그 (예 " #~ "그놈 터미널과 터미널을 실행하려면 '-x' , konsole과 urxvt를 실행하려면 '-" #~ "e')." kupfer-v208/po/nb.po000066400000000000000000002123741176220042200144310ustar00rootroot00000000000000# Norwegian bokmål translation of kupfer # Copyright (C) 2007--2010 Ulrik Sverdrup # This file is distributed under the same license as the Kupfer package. # Kjartan Maraas , 2005-2010. # msgid "" msgstr "" "Project-Id-Version: kupfer\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2011-04-14 21:40+0200\n" "PO-Revision-Date: 2011-03-28 20:33+0200\n" "Last-Translator: Kjartan Maraas \n" "Language-Team: Norwegian bokmål \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "Programstarter" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "Praktiskt kommandoverktøy for programmer og dokumenter " #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Kjør i Kupfer" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Start" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:150 msgid "Catalog" msgstr "Katalog" #: ../data/preferences.ui.h:5 msgid "Desktop Environment" msgstr "" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "" #: ../data/preferences.ui.h:7 msgid "General" msgstr "Generelt" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "" #: ../data/preferences.ui.h:9 msgid "Inclusion in Top Level Searches" msgstr "" #: ../data/preferences.ui.h:10 msgid "Indexed Folders" msgstr "Indekserte mapper" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "Tastatur" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Brukervalg for Kupfer" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "Tillegg" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:844 msgid "Reset" msgstr "Nullstill" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "Vis ikon i statusfeltet" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "Start automatisk ved innlogging" #: ../data/preferences.ui.h:19 msgid "Terminal emulator:" msgstr "Terminalemulator:" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Brukerinformasjon" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "_Bruk" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "_Passord:" #: ../data/credentials_dialog.ui.h:4 msgid "_User:" msgstr "Br_uker:" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "Tastaturbinding kunne ikke bindes" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "ikke vis grensesnitt ved start" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "liste tilgjenelige tillegg" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "aktiver felsøkingsinformasjon" #: ../kupfer/main.py:46 msgid "run keyboard shortcut relay service on this display" msgstr "" #: ../kupfer/main.py:49 msgid "show usage help" msgstr "vis brukshjelp" #: ../kupfer/main.py:50 msgid "show version information" msgstr "vis versjonsinformasjon" #: ../kupfer/main.py:56 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Bruk: kupfer [ VALG | FIL ... ]" #: ../kupfer/main.py:67 msgid "Available plugins:" msgstr "Tilgjengelige tillegg:" #: ../kupfer/main.py:114 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 #, fuzzy msgid "Alternate Activate" msgstr "Lag arkiv" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 #, fuzzy msgid "Compose Command" msgstr "Siste kommando" #: ../kupfer/ui/accelerators.py:11 #, fuzzy msgid "Mark Default Action" msgstr "Velg standardprogram" #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "Glem objekt" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Nullstill alle" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Velg avslutt" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Velg markert fil" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Velg markert tekst" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Vis hjelp" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Vis brukervalg" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s er tom" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "Ingen treff i %(src)s for «%(query)s»" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Ingen treff" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Skriv for å søke" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Skriv for å søke i %s" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Ingen handling" #: ../kupfer/ui/browser.py:1461 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1471 #, python-format msgid "Forget About \"%s\"" msgstr "" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1903 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Vis med utvalg" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Beskrivelse" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Utvikler" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Versjon" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Python-modulen '%s' trenges" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Tillegget kunne ikke leses på grunn av en feil:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "deaktivert" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Innholdet av" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Kilder" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Handlinger" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:589 msgid "Configuration" msgstr "Konfigurasjon" #: ../kupfer/ui/preferences.py:609 msgid "Set username and password" msgstr "Sett brukernavn og passord" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:663 msgid "Choose a Directory" msgstr "Velg en katalog" #: ../kupfer/ui/preferences.py:842 msgid "Reset all shortcuts to default values?" msgstr "" #: ../kupfer/ui/preferences.py:850 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Kommando" #: ../kupfer/ui/preferences.py:851 msgid "Shortcut" msgstr "" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "Kjartan Maraas " #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "En programstarter og fri programvare (GPLv3+)" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Kunne ikke utføre «%s»" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 #, fuzzy msgid "Text" msgstr "Vis tekst" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Kjør etter ventetid..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Flere objekter" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "et objekt" msgstr[1] "%s objekter" #: ../kupfer/obj/contacts.py:87 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:107 msgid "Open" msgstr "Åpne" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Har ikke standardprogram for %(file)s (%(type)s)" #: ../kupfer/obj/fileactions.py:45 #, python-format msgid "Please use \"%s\"" msgstr "Vennligst bruk «%s»" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Velg standardprogram" #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Åpne med standardprogram" #: ../kupfer/obj/fileactions.py:77 msgid "Reveal" msgstr "Vis" #: ../kupfer/obj/fileactions.py:86 msgid "Open parent folder" msgstr "Åpne foreldermappe" #: ../kupfer/obj/fileactions.py:92 msgid "Open Terminal Here" msgstr "Åpne terminal her" #: ../kupfer/obj/fileactions.py:105 msgid "Open this location in a terminal" msgstr "Åpne plassen i en terminal" #: ../kupfer/obj/fileactions.py:113 msgid "Run in Terminal" msgstr "Kjør i terminal" #: ../kupfer/obj/fileactions.py:113 msgid "Run (Execute)" msgstr "Kjør" #: ../kupfer/obj/fileactions.py:133 msgid "Run this program in a Terminal" msgstr "Kjør dette programmet i en terminal" #: ../kupfer/obj/fileactions.py:135 msgid "Run this program" msgstr "Kjør dette programmet" #: ../kupfer/obj/objects.py:248 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 msgid "Go To" msgstr "Gå til" #: ../kupfer/obj/objects.py:274 msgid "Open URL" msgstr "Åpne URL" #: ../kupfer/obj/objects.py:285 msgid "Open URL with default viewer" msgstr "" #: ../kupfer/obj/objects.py:299 msgid "Launch" msgstr "Start" #: ../kupfer/obj/objects.py:312 msgid "Show application window" msgstr "Vis programvindu" #: ../kupfer/obj/objects.py:313 msgid "Launch application" msgstr "Start program" #: ../kupfer/obj/objects.py:324 msgid "Launch Again" msgstr "Start igjen" #: ../kupfer/obj/objects.py:331 msgid "Launch another instance of this application" msgstr "" #: ../kupfer/obj/objects.py:337 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Lukk" #: ../kupfer/obj/objects.py:345 #, fuzzy msgid "Attempt to close all application windows" msgstr "Vis programvindu" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:392 msgid "Run" msgstr "Kjør" #: ../kupfer/obj/objects.py:402 msgid "Perform command" msgstr "Utfør kommando" #: ../kupfer/obj/objects.py:416 msgid "(Empty Text)" msgstr "(Tom tekst)" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:432 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "«%(text)s»" msgstr[1] "(%(num)d linjer) «%(text)s»" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "" #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "" #: ../kupfer/obj/sources.py:103 #, python-format msgid "Directory source %s" msgstr "" #: ../kupfer/obj/sources.py:113 msgid "Home Folder" msgstr "Hjemmemappe" #: ../kupfer/obj/sources.py:124 msgid "Catalog Index" msgstr "Katalogindeks" #: ../kupfer/obj/sources.py:139 msgid "An index of all available sources" msgstr "En indeks med tilgjengelige kilder" #: ../kupfer/obj/sources.py:170 msgid "Root catalog" msgstr "Rotkatalog" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Vennligst konfigurer tillegg" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "Tillegg %s er ikke konfigurert" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "Ugyldig påloggingsinformasjon for %s" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "GTK+" #: ../kupfer/plugin/core/alternatives.py:13 msgid "GNOME Terminal" msgstr "GNOME-terminal" #: ../kupfer/plugin/core/alternatives.py:22 msgid "XFCE Terminal" msgstr "XFCE-terminal" #: ../kupfer/plugin/core/alternatives.py:31 msgid "LXTerminal" msgstr "LXTerminal" #: ../kupfer/plugin/core/alternatives.py:40 msgid "X Terminal" msgstr "X-terminal" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "Urxvt" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Lagre som..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Avslutt" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Avslutt Kupfer" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "Om Kupfer" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Vis informasjon om Kupfers utviklere og lisens" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Hjelp med Kupfer" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Få hjelp med Kupfer" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Vis Kupfers brukervalg" #: ../kupfer/plugin/core/__init__.py:65 msgid "Search Contents" msgstr "Søk i innhold" #: ../kupfer/plugin/core/__init__.py:83 msgid "Search inside this catalog" msgstr "Søk i denne katalogen" #: ../kupfer/plugin/core/__init__.py:91 msgid "Copy" msgstr "Kopier" #: ../kupfer/plugin/core/__init__.py:106 msgid "Copy to clipboard" msgstr "Kopier til utklippstavlen" #: ../kupfer/plugin/core/__init__.py:128 msgid "Rescan" msgstr "Søk på nytt" #: ../kupfer/plugin/core/__init__.py:143 msgid "Force reindex of this source" msgstr "" #: ../kupfer/plugin/core/selection.py:8 ../kupfer/plugin/core/selection.py:36 msgid "Selected Text" msgstr "Markert tekst" #: ../kupfer/plugin/core/selection.py:23 #, python-format msgid "Selected Text \"%s\"" msgstr "Markert tekst «%s»" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Siste kommando" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Interne Kupfer-objekter" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Siste resultat" #: ../kupfer/plugin/core/internal.py:66 #, fuzzy msgid "Command Results" msgstr "Kommandolinje" #: ../kupfer/plugin/archivemanager.py:1 msgid "Archive Manager" msgstr "Arkivhåndterer" #: ../kupfer/plugin/archivemanager.py:9 msgid "Use Archive Manager actions" msgstr "" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Pakk ut her" #: ../kupfer/plugin/archivemanager.py:64 #, fuzzy msgid "Extract compressed archive" msgstr "Henter ut arkiv" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Lag arkiv" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Lag arkiv i..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Arkiv" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Programmer" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Alle programmer og brukervalg" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Åpne med..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Åpne med valgfritt program" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Kalkulator" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Beregn" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:71 msgid "Clipboards" msgstr "Utklippstavler" #: ../kupfer/plugin/clipboard.py:4 ../kupfer/plugin/clipboard.py:111 msgid "Recent clipboards" msgstr "Nylige utklippstavler" #: ../kupfer/plugin/clipboard.py:20 msgid "Number of recent clipboards" msgstr "Antall nylige utklippstavler" #: ../kupfer/plugin/clipboard.py:26 msgid "Include recent selections" msgstr "Inkluder nylige markeringer" #: ../kupfer/plugin/clipboard.py:32 #, fuzzy msgid "Copy selection to primary clipboard" msgstr "Kopier til utklippstavlen" #: ../kupfer/plugin/clipboard.py:44 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "" msgstr[1] "" #: ../kupfer/plugin/clipboard.py:51 msgid "Clear" msgstr "Tøm" #: ../kupfer/plugin/clipboard.py:63 #, fuzzy msgid "Remove all recent clipboards" msgstr "Antall nylige utklippstavler" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Skallkommando" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" #: ../kupfer/plugin/commands.py:41 #, fuzzy msgid "Run (Get Output)" msgstr "Kjør" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 msgid "Pass to Command..." msgstr "Send til kommando …" #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 msgid "Write to Command..." msgstr "Skriv til kommando …" #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 msgid "Run program and supply text on the standard input" msgstr "" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "" #: ../kupfer/plugin/commands.py:215 #, fuzzy msgid "Run command-line programs" msgstr "Kjør dette programmet" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Ordbok" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Slå opp ord i ordbok" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Slå opp" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Dokumenter" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "" #: ../kupfer/plugin/documents.py:22 #, fuzzy msgid "Max recent document days" msgstr "Siste dokumenter" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Nylig brukte dokumenter" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Nylig brukte dokumenter" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "%s-dokumenter" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Nylig brukte dokumenter for %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Steder" #: ../kupfer/plugin/documents.py:164 #, fuzzy msgid "Bookmarked folders" msgstr "Navn på bokmerke" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 #, fuzzy msgid "Epiphany Bookmarks" msgstr "Åpne bokmerke %s" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Favoritter" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Legg til favoritt" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Ta bort favoritt" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "" #: ../kupfer/plugin/fileactions.py:1 #, fuzzy msgid "File Actions" msgstr "Handlinger" #: ../kupfer/plugin/fileactions.py:9 #, fuzzy msgid "More file actions" msgstr "Vis tidligere brukte handlinger" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:210 msgid "Move To..." msgstr "Flytt til..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:252 msgid "Move file to new location" msgstr "" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Endre navn til..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:165 msgid "Copy To..." msgstr "Kopier til..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:206 msgid "Copy file to a chosen location" msgstr "" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Firefox-bokmerker" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Markert fil" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Markert fil «%s»" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Markerte filer" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Notater" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Søk i dine Gnote- eller Tomboy-notater" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Tilføy til notat …" #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Lag notat" #: ../kupfer/plugin/notes.py:154 #, fuzzy msgid "Create a new note from this text" msgstr "Opprett nye filer fra dine maler" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Hent søketreff i notater …" #: ../kupfer/plugin/notes.py:173 #, fuzzy msgid "Show search results for this query" msgstr "Vis søkeoppføring" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "idag, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "igår, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Sist oppdatert %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Spill av" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Pause" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Neste" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Forrige" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Tøm kø" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Legg i kø" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "av %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Spor av %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Album" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Artister" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Sanger" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Logg ut..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Slå av..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Lås skjermen" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Vis tekst" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:52 msgid "Display text in a window" msgstr "Vis tekst i et vindu" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Vis med stor tekst" #: ../kupfer/plugin/show_text.py:60 msgid "Show Notification" msgstr "Vis varsling" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Papirkurv" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Flytt til papirkurven" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Gjenopprett" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "Papirkurven er tom" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "Papirkurven inneholder én fil" msgstr[1] "Papirkurven inneholder %(num)s filer" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Utløsere" #: ../kupfer/plugin/triggers.py:6 msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "" #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "URL-handlinger" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Last ned og åpne" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Last ned til …" #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Volum og disker" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Monterte volum og disker" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Volum montert %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Avmonter" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Avmonter dette volumet" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Løs ut" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Avmonter og løs ut dette mediet" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Søk på nettet" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 #, fuzzy msgid "Search the web with OpenSearch search engines" msgstr "Søk på nettet med nettleserens innstillinger for søk" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Søk med …" #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Søk etter …" #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Søkemotorer" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Søk i Wikipedia" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Wikipedia-språk" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "no" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Søk etter dette begrepet i %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Vinduliste" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Alle vinduer på alle arbeidsområder" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Slå på" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Skyggelegg" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Minimer" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Gjenopprett" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Maksimer" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Neste vindu" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "" #: ../kupfer/plugin/windows.py:252 #, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "%d vindu" msgstr[1] "%d vinduer" #: ../kupfer/plugin/windows.py:256 msgid "Active workspace" msgstr "Aktivt arbeidsområde" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Hopp til dette arbeidsområdet" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Arbeidsområder" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 #, fuzzy msgid "Recently used documents in Abiword" msgstr "Siste dokumenter" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Installasjonsmetode" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Vis pakkeinformasjon" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Installer" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Søke etter pakkenavn …" #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "Dype arkiver" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "Innholdet av %s" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Gjenta" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Spilleliste" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 #, fuzzy msgid "Chromium Bookmarks" msgstr "del.icio.us bokmerker" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "" #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "" #: ../kupfer/plugin/clawsmail.py:116 #, fuzzy msgid "Claws Mail Address Book" msgstr "E-post (adressebok)" #: ../kupfer/plugin/clawsmail.py:164 #, fuzzy msgid "Contacts from Claws Mail Address Book" msgstr "E-post (adressebok)" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 msgid "Custom Terminal" msgstr "Egendefinert terminal" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "" #: ../kupfer/plugin/custom_terminal.py:18 #, fuzzy msgid "Execute flag" msgstr "Kjør i Kupfer" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "Tema:" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Forvalgt e-postklient" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Søk i Devhelp" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "Empathy" #: ../kupfer/plugin/empathy.py:6 msgid "Access to Empathy Contacts" msgstr "" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Vis frakoblede kontakter" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Tilgjengelig" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Borte" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Opptatt" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Ikke tilgjengelig" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Usynlig" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Frakoblet" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:90 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:204 msgid "Open Chat" msgstr "Åpne prat" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:118 #: ../kupfer/plugin/skype.py:250 msgid "Change Global Status To..." msgstr "" #: ../kupfer/plugin/empathy.py:171 msgid "Empathy Contacts" msgstr "Empathy-kontakter" #: ../kupfer/plugin/empathy.py:237 msgid "Empathy Account Status" msgstr "" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Evolution kontakter" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Evolution adressebok" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Ledig for prat" #: ../kupfer/plugin/gajim.py:146 msgid "Gajim Contacts" msgstr "Gajim-kontakter" #: ../kupfer/plugin/gajim.py:210 msgid "Gajim Account Status" msgstr "" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 #, fuzzy msgid "GNOME Terminal Profiles" msgstr "Åpne terminal her" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:144 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "" #: ../kupfer/plugin/gmail/__init__.py:32 msgid "Load contacts' pictures" msgstr "" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Compose Email in GMail" msgstr "" #: ../kupfer/plugin/gmail/__init__.py:74 msgid "Open web browser and compose new email in GMail" msgstr "" #: ../kupfer/plugin/gmail/__init__.py:177 msgid "Contacts from Google services (Gmail)" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Fil:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "" msgstr[1] "" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "" msgstr[1] "" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Google søk" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #, python-format msgid "Results for \"%s\"" msgstr "" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "" #: ../kupfer/plugin/google_translate.py:6 msgid "Google Translate" msgstr "" #: ../kupfer/plugin/google_translate.py:8 #: ../kupfer/plugin/google_translate.py:153 msgid "Translate text with Google Translate" msgstr "" #: ../kupfer/plugin/google_translate.py:83 msgid "Google Translate connection timed out" msgstr "" #: ../kupfer/plugin/google_translate.py:86 msgid "Error connecting to Google Translate" msgstr "" #: ../kupfer/plugin/google_translate.py:136 #: ../kupfer/plugin/google_translate.py:223 msgid "Translate To..." msgstr "Oversett til..." #: ../kupfer/plugin/google_translate.py:179 #, python-format msgid "Translate into %s" msgstr "Oversett til %s" #: ../kupfer/plugin/google_translate.py:203 msgid "Languages" msgstr "Språk" #: ../kupfer/plugin/google_translate.py:238 msgid "Show translated page in browser" msgstr "" #: ../kupfer/plugin/google_translate.py:255 msgid "Show Translation To..." msgstr "" #: ../kupfer/plugin/google_translate.py:271 msgid "Show translation in browser" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Merk denne oppgaven som utført" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Lag oppgave" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, python-format msgid "%(user)s on %(service)s" msgstr "" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s på %(where)s" #: ../kupfer/plugin/gwibber.py:187 msgid "Send Message" msgstr "Send melding" #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "Send melding til alle Gwibber-kontoer" #: ../kupfer/plugin/gwibber.py:210 msgid "Send Message To..." msgstr "Send melding til …" #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "Send melding til en Gwibber-konto" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Send melding..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "Send melding til valgt Gwibber-konto" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Svar …" #: ../kupfer/plugin/gwibber.py:314 msgid "Delete Message" msgstr "Slett melding" #: ../kupfer/plugin/gwibber.py:337 msgid "Send Private Message..." msgstr "Send privat melding …" #: ../kupfer/plugin/gwibber.py:370 msgid "Send direct message to user" msgstr "Send direktemelding til bruker" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "" #: ../kupfer/plugin/gwibber.py:376 #, fuzzy msgid "Retweet To..." msgstr "Endre navn til..." #: ../kupfer/plugin/gwibber.py:407 msgid "Retweet message to all Gwibber accounts" msgstr "" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:413 msgid "Open in Browser" msgstr "Åpne i nettleser" #: ../kupfer/plugin/gwibber.py:419 msgid "Open message in default web browser" msgstr "Åpne melding i forvalgt nettleser" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 msgid "Gwibber Accounts" msgstr "Gwibber-kontoer" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "Send oppdatering" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "" #: ../kupfer/plugin/higherorder.py:1 #, fuzzy msgid "Higher-order Actions" msgstr "Handlinger for datamaskinen" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Velg i Kupfer" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Resultat for %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Bildeverktøy" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "" #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Vis kildekode" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "aktivert" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Finn filer" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 #, fuzzy msgid "Search filesystem using locate" msgstr "Søk etter %s med Beagle" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 #, fuzzy msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Siste dokumenter" #: ../kupfer/plugin/openoffice.py:83 msgid "OpenOffice/LibreOffice Recent Items" msgstr "" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Opera-bokmerker" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 #, fuzzy msgid "Index of Opera bookmarks" msgstr "Åpne bokmerke %s" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera e-post" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "" #: ../kupfer/plugin/operamail.py:64 #, fuzzy msgid "Opera Mail Contacts" msgstr "Rediger kontakt %s" #: ../kupfer/plugin/operamail.py:120 #, fuzzy msgid "Contacts from Opera Mail" msgstr "E-post (adressebok)" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d tegn)" msgstr[1] "%s (%d tegn)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Pidgin-kontakter" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "PuTTY-økter" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Start økt" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "Vis vilde" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Vis som HTML-dokument" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Tilkoblet" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Frakoblet" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Skjermøkter" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Fest" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:49 msgid "Send Keys" msgstr "Send taster" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "" #: ../kupfer/plugin/sendkeys.py:25 msgid "Paste to Foreground Window" msgstr "" #: ../kupfer/plugin/sendkeys.py:43 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:85 msgid "Send keys to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:90 msgid "Type Text" msgstr "Skriv tekst" #: ../kupfer/plugin/sendkeys.py:111 msgid "Type the text to foreground window" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Systemtjenester" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Start tjeneste" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Start tjenesten på nytt" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Stopp tjeneste" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Feil" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "" #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Tjenester" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 #, fuzzy msgid "Show QRCode" msgstr "Vis tekst" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 #, fuzzy msgid "Display text as QRCode in a window" msgstr "Vis tekst i et vindu" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Logget ut" #: ../kupfer/plugin/skype.py:183 #, python-format msgid "[%(status)s] %(userid)s" msgstr "" #: ../kupfer/plugin/skype.py:225 msgid "Call" msgstr "" #: ../kupfer/plugin/skype.py:239 msgid "Place a call to contact" msgstr "" #: ../kupfer/plugin/skype.py:274 msgid "Skype Contacts" msgstr "" #: ../kupfer/plugin/skype.py:294 msgid "Skype Statuses" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "" #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Dokumentmaler" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Lag nye dokumenter fra dine maler" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "%s mal" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Tom fil" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Ny mappe" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Lag nytt dokument..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Lag ett nytt dokument fra mal" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Lag dokument i …" #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "Tekstfiler" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Legg til i …" #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Legg til …" #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Skriv til …" #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Hent tekstinnhold" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:184 #: ../kupfer/plugin/thunar.py:224 ../kupfer/plugin/thunar.py:283 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:10 msgid "File manager Thunar actions" msgstr "" #: ../kupfer/plugin/thunar.py:66 msgid "Select in File Manager" msgstr "" #: ../kupfer/plugin/thunar.py:94 msgid "Show Properties" msgstr "Vis egenskaper" #: ../kupfer/plugin/thunar.py:117 msgid "Show information about file in file manager" msgstr "" #: ../kupfer/plugin/thunar.py:126 msgid "Send To..." msgstr "Send til …" #: ../kupfer/plugin/thunar.py:258 msgid "Empty Trash" msgstr "Tøm papirkurven" #: ../kupfer/plugin/thunar.py:298 msgid "Thunar Send To Objects" msgstr "" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Thunderbird adressebok" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Sorteringsrekkefølge" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Kommandolinje" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Send signal" #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Signaler" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Kjørende oppgaver" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "" #: ../kupfer/plugin/tracker.py:15 ../kupfer/plugin/tracker1.py:18 msgid "Tracker desktop search integration" msgstr "" #: ../kupfer/plugin/tracker.py:41 ../kupfer/plugin/tracker1.py:49 msgid "Search in Tracker" msgstr "" #: ../kupfer/plugin/tracker.py:46 ../kupfer/plugin/tracker1.py:54 msgid "Open Tracker Search Tool and search for this term" msgstr "" #: ../kupfer/plugin/tracker.py:55 ../kupfer/plugin/tracker1.py:62 msgid "Get Tracker Results..." msgstr "" #: ../kupfer/plugin/tracker.py:64 ../kupfer/plugin/tracker1.py:71 msgid "Show Tracker results for query" msgstr "" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "" #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "" #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "" #: ../kupfer/plugin/tracker1.py:10 msgid "Tracker" msgstr "" #. FIXME: Port tracker tag sources and actions #. to the new, much more powerful sparql + dbus API #. (using tracker-tag as in 0.6 is a plain hack and a dead end) #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Start Vinagre-økt" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Vinagre-bokmerker" #: ../kupfer/plugin/vim.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim.py:3 #, fuzzy msgid "Recently used documents in Vim" msgstr "Siste dokumenter" #: ../kupfer/plugin/vim.py:46 #, fuzzy msgid "Vim Recent Documents" msgstr "Nylig brukte dokumenter" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Start på nytt" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "" #: ../kupfer/plugin/zim.py:10 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "" #: ../kupfer/plugin/zim.py:28 msgid "Page names start with :colon" msgstr "" #: ../kupfer/plugin/zim.py:58 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "" #: ../kupfer/plugin/zim.py:67 #, fuzzy msgid "Create Zim Page" msgstr "Opprett dokument" #: ../kupfer/plugin/zim.py:74 msgid "Create page in default notebook" msgstr "" #: ../kupfer/plugin/zim.py:84 msgid "Create Zim Page In..." msgstr "" #: ../kupfer/plugin/zim.py:122 msgid "Create Subpage..." msgstr "" #: ../kupfer/plugin/zim.py:243 msgid "Zim Notebooks" msgstr "" #: ../kupfer/plugin/zim.py:259 msgid "Zim Pages" msgstr "Zim-sider" #: ../kupfer/plugin/zim.py:287 msgid "Pages stored in Zim Notebooks" msgstr "" #~ msgid "Text Matches" #~ msgstr "Treff i tekst" kupfer-v208/po/nl.po000066400000000000000000002355621176220042200144470ustar00rootroot00000000000000# Dutch translations for the kupfer package # Nederlandse vertaling voor kupfer. # Copyright (C) 2009 Ulrik Sverdrup # This file is distributed under the same license as the kupfer package. # Martin Koelewijn , 2009. # msgid "" msgstr "" "Project-Id-Version: kupfer beta\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2011-04-14 21:40+0200\n" "PO-Revision-Date: 2009-10-12 01:54+0200\n" "Last-Translator: Martin Koelewijn \n" "Language-Team: Dutch\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "Programmastarter" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "Handige opdracht- en toegangshulp voor programma's en documenten" #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer-exec.desktop.in.h:1 #, fuzzy msgid "Execute in Kupfer" msgstr "Selecteren in Kupfer" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Start" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:150 msgid "Catalog" msgstr "Catalogus" #: ../data/preferences.ui.h:5 #, fuzzy msgid "Desktop Environment" msgstr "Programma's voor Desktopomgeving" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "" #: ../data/preferences.ui.h:7 msgid "General" msgstr "Algemeen" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "" #: ../data/preferences.ui.h:9 #, fuzzy msgid "Inclusion in Top Level Searches" msgstr "Liederen opnemen in eerste level" #: ../data/preferences.ui.h:10 #, fuzzy msgid "Indexed Folders" msgstr "Persoonlijke map" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Kupfer Voorkeuren" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "Plug-ins" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:844 msgid "Reset" msgstr "" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "Pictogram tonen in systeemvak" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "Automatisch starten bij aanmelden" #: ../data/preferences.ui.h:19 #, fuzzy msgid "Terminal emulator:" msgstr "Hier Terminal openen" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "" #: ../data/credentials_dialog.ui.h:4 msgid "_User:" msgstr "" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "Sneltoets kon niet worden toegepast" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "hoofdscherm niet tonen bij opstarten" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "Maak lijst beschikbare plug-ins" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "debug info activeren" #: ../kupfer/main.py:46 msgid "run keyboard shortcut relay service on this display" msgstr "" #: ../kupfer/main.py:49 msgid "show usage help" msgstr "gebruikshulp tonen" #: ../kupfer/main.py:50 msgid "show version information" msgstr "versie-informatie tonen" #: ../kupfer/main.py:56 #, fuzzy msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Gebruik: kupfer [OPTIES | ZOEKTERM]" #: ../kupfer/main.py:67 msgid "Available plugins:" msgstr "Beschikbare plug-ins:" #: ../kupfer/main.py:114 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 #, fuzzy msgid "Alternate Activate" msgstr "Archiveren" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 #, fuzzy msgid "Compose Command" msgstr "Opstellen e-mail" #: ../kupfer/ui/accelerators.py:11 #, fuzzy msgid "Mark Default Action" msgstr "Standaardprogramma instellen..." #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "" #: ../kupfer/ui/accelerators.py:14 #, fuzzy msgid "Select Quit" msgstr "Geselecteerde tekst" #: ../kupfer/ui/accelerators.py:15 #, fuzzy msgid "Select Selected File" msgstr "Geselecteerd bestand" #: ../kupfer/ui/accelerators.py:16 #, fuzzy msgid "Select Selected Text" msgstr "Geselecteerde tekst" #: ../kupfer/ui/accelerators.py:17 #, fuzzy msgid "Show Help" msgstr "Tekst tonen" #: ../kupfer/ui/accelerators.py:18 #, fuzzy msgid "Show Preferences" msgstr "Kupfer Voorkeuren" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s is leeg" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "Geen treffers in %(src)s voor \"%(query)s\"" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Geen treffers" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Typ om te zoeken" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Typ om %s te doorzoeken" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Geen actie" #: ../kupfer/ui/browser.py:1461 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1471 #, python-format msgid "Forget About \"%s\"" msgstr "" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1903 ../kupfer/ui/preferences.py:58 #, fuzzy msgid "Show Main Interface" msgstr "Toon offline kennissen" #: ../kupfer/ui/preferences.py:59 #, fuzzy msgid "Show with Selection" msgstr "Werken met programma" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Omschrijving" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Auteur" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Versie" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Python module '%s' is vereist" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Plugin kon niet worden gelezen vanwege een fout:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "uitgeschakeld" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Inhoud van" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Bronnen" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Acties" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:589 msgid "Configuration" msgstr "Configuratie" #: ../kupfer/ui/preferences.py:609 msgid "Set username and password" msgstr "" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:663 msgid "Choose a Directory" msgstr "Kies een map" #: ../kupfer/ui/preferences.py:842 msgid "Reset all shortcuts to default values?" msgstr "" #: ../kupfer/ui/preferences.py:850 ../kupfer/plugin/custom_terminal.py:12 #, fuzzy msgid "Command" msgstr "Algemeen" #: ../kupfer/ui/preferences.py:851 msgid "Shortcut" msgstr "" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "vertaal-erkenning" #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Een gratis (GPLv3+) programmastarter" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Dit programma is gratis software; je mag het verspreiden en / of\n" "wijzigen onder voorwaarden van de GNU General Public License zoals\n" "gepubliceerd bij de Free Software Foundation, versie 3 van de License\n" "of (als je wilt) een latere versie.\n" "\n" "Dit programma is verspreid in de hoop dat het nuttig zal zijn, maar\n" "ZONDER ENIGE GARANTIE; zelfs zonder impliciete garanties van, zoals\n" "de Engelsen zeggen, MERCHANTABILITY of FITNESS FOR A PARTICULAR PURPOSE.\n" "Lees de GNU General Public License voor meer details.\n" "\n" "Je zou een kopie van de GNU General Public License samen met dit pro-\n" "gramma moeten hebben gehad. Zo niet, lees .\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 #, fuzzy msgid "Text" msgstr "Tekst tonen" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Uitvoeren na..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Opdracht uitvoeren na bepaalde interval" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Meerdere objecten" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s object" msgstr[1] "%s object" #: ../kupfer/obj/contacts.py:87 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:107 msgid "Open" msgstr "Openen" #: ../kupfer/obj/fileactions.py:43 #, fuzzy, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Stel standaardprogramma in om dit bestandstype te openen" #: ../kupfer/obj/fileactions.py:45 #, fuzzy, python-format msgid "Please use \"%s\"" msgstr "Geselecteerd bestand \"%s\"" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Standaardprogramma instellen..." #: ../kupfer/obj/fileactions.py:71 #, fuzzy msgid "Open with default application" msgstr "Open met een programma" #: ../kupfer/obj/fileactions.py:77 msgid "Reveal" msgstr "Tonen" #: ../kupfer/obj/fileactions.py:86 msgid "Open parent folder" msgstr "Bovenliggende map openen" #: ../kupfer/obj/fileactions.py:92 msgid "Open Terminal Here" msgstr "Hier Terminal openen" #: ../kupfer/obj/fileactions.py:105 msgid "Open this location in a terminal" msgstr "Deze locatie in een terminal openen" #: ../kupfer/obj/fileactions.py:113 msgid "Run in Terminal" msgstr "Uitvoeren in Terminal" #: ../kupfer/obj/fileactions.py:113 msgid "Run (Execute)" msgstr "Uitvoeren" #: ../kupfer/obj/fileactions.py:133 msgid "Run this program in a Terminal" msgstr "Dit programma uitvoeren in een Terminal" #: ../kupfer/obj/fileactions.py:135 msgid "Run this program" msgstr "Dit programma uitvoeren" #: ../kupfer/obj/objects.py:248 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 msgid "Go To" msgstr "Ga naar" #: ../kupfer/obj/objects.py:274 msgid "Open URL" msgstr "URL openen" #: ../kupfer/obj/objects.py:285 msgid "Open URL with default viewer" msgstr "Open URL met standaardprogramma" #: ../kupfer/obj/objects.py:299 msgid "Launch" msgstr "Starten" #: ../kupfer/obj/objects.py:312 msgid "Show application window" msgstr "Programmavenster tonen" #: ../kupfer/obj/objects.py:313 msgid "Launch application" msgstr "Programma starten" #: ../kupfer/obj/objects.py:324 msgid "Launch Again" msgstr "Nogmaals starten" #: ../kupfer/obj/objects.py:331 msgid "Launch another instance of this application" msgstr "Start nog een versie van dit programma" #: ../kupfer/obj/objects.py:337 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Sluiten" #: ../kupfer/obj/objects.py:345 #, fuzzy msgid "Attempt to close all application windows" msgstr "Probeer alle programmavensters te sluiten" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:392 msgid "Run" msgstr "Uitvoeren" #: ../kupfer/obj/objects.py:402 msgid "Perform command" msgstr "Opdracht uitvoeren" #: ../kupfer/obj/objects.py:416 #, fuzzy msgid "(Empty Text)" msgstr "Leeg bestand" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:432 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "\"%(text)s\"" msgstr[1] "(%(num)d lines) \"%(text)s\"" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s e.a." #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Recursieve bron van %(dir)s, (%(levels)d levels)" #: ../kupfer/obj/sources.py:103 #, python-format msgid "Directory source %s" msgstr "" #: ../kupfer/obj/sources.py:113 msgid "Home Folder" msgstr "Persoonlijke map" #: ../kupfer/obj/sources.py:124 msgid "Catalog Index" msgstr "Catalogusindex" #: ../kupfer/obj/sources.py:139 msgid "An index of all available sources" msgstr "Een index van alle beschikbare bronnen" #: ../kupfer/obj/sources.py:170 msgid "Root catalog" msgstr "Systeemcatalogus" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "" #: ../kupfer/obj/special.py:32 #, fuzzy, python-format msgid "Invalid user credentials for %s" msgstr "Pas gebruikte documenten voor %s" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "" #: ../kupfer/plugin/core/alternatives.py:13 #, fuzzy msgid "GNOME Terminal" msgstr "Hier Terminal openen" #: ../kupfer/plugin/core/alternatives.py:22 #, fuzzy msgid "XFCE Terminal" msgstr "Uitvoeren in Terminal" #: ../kupfer/plugin/core/alternatives.py:31 #, fuzzy msgid "LXTerminal" msgstr "Uitvoeren in Terminal" #: ../kupfer/plugin/core/alternatives.py:40 #, fuzzy msgid "X Terminal" msgstr "Uitvoeren in Terminal" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "" #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Stoppen" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Kupfer sluiten" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "Over Kupfer" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Toon informatie over Kupfers auteurs en licensie" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Kupfer Help" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Zoek hulp met Kupfer" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Voorkeurenscherm voor Kupfer tonen" #: ../kupfer/plugin/core/__init__.py:65 msgid "Search Contents" msgstr "Inhoud doorzoeken" #: ../kupfer/plugin/core/__init__.py:83 msgid "Search inside this catalog" msgstr "In deze catalogus zoeken" #: ../kupfer/plugin/core/__init__.py:91 msgid "Copy" msgstr "Kopiëren" #: ../kupfer/plugin/core/__init__.py:106 msgid "Copy to clipboard" msgstr "Kopieer naar klembord" #: ../kupfer/plugin/core/__init__.py:128 msgid "Rescan" msgstr "Opnieuw scannen" #: ../kupfer/plugin/core/__init__.py:143 msgid "Force reindex of this source" msgstr "Herindexering van deze bron forceren" #: ../kupfer/plugin/core/selection.py:8 ../kupfer/plugin/core/selection.py:36 msgid "Selected Text" msgstr "Geselecteerde tekst" #: ../kupfer/plugin/core/selection.py:23 #, python-format msgid "Selected Text \"%s\"" msgstr "Geselecteerde tekst \"%s\"" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Laatste opdracht" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Interne kupfer-objecten" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "" #: ../kupfer/plugin/archivemanager.py:1 msgid "Archive Manager" msgstr "" #: ../kupfer/plugin/archivemanager.py:9 msgid "Use Archive Manager actions" msgstr "" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Type gecomprimeerd archief voor 'Archiveren in'" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Hier uitpakken" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Gecomprimeerd archief uitpakken" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Archiveren" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Een map comprimeren tot archief" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Archiveren in..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 #, fuzzy msgid "Archive" msgstr "Archiveren" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Programma's" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Alle programma's en voorkeuren" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Programma's voor Desktopomgeving" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Openen met..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Open met een programma" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Stel standaardprogramma in om dit bestandstype te openen" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Rekenmachine" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Bereken expressies die beginnen met '='" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Berekenen" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:71 msgid "Clipboards" msgstr "Klemborden" #: ../kupfer/plugin/clipboard.py:4 ../kupfer/plugin/clipboard.py:111 msgid "Recent clipboards" msgstr "Recente klemborden" #: ../kupfer/plugin/clipboard.py:20 msgid "Number of recent clipboards" msgstr "Aantal recente klemborden" #: ../kupfer/plugin/clipboard.py:26 #, fuzzy msgid "Include recent selections" msgstr "Levert huidige selectie" #: ../kupfer/plugin/clipboard.py:32 #, fuzzy msgid "Copy selection to primary clipboard" msgstr "Kopieer naar klembord" #: ../kupfer/plugin/clipboard.py:44 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Klembord \"%(desc)s\"" msgstr[1] "Klembord met %(num)d regels \"%(desc)s\"" #: ../kupfer/plugin/clipboard.py:51 #, fuzzy msgid "Clear" msgstr "Lijst legen" #: ../kupfer/plugin/clipboard.py:63 #, fuzzy msgid "Remove all recent clipboards" msgstr "Aantal recente klemborden" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Shell opdrachten" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" #: ../kupfer/plugin/commands.py:41 #, fuzzy msgid "Run (Get Output)" msgstr "Uitvoeren" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 #, fuzzy msgid "Pass to Command..." msgstr "Laatste opdracht" #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 msgid "Write to Command..." msgstr "" #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 msgid "Run program and supply text on the standard input" msgstr "" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "" #: ../kupfer/plugin/commands.py:215 #, fuzzy msgid "Run command-line programs" msgstr "Start opdrachtregelprogramma" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Woordenboek" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Woord opzoeken in woordenboek" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Opzoeken" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Documenten" #: ../kupfer/plugin/documents.py:4 #, fuzzy msgid "Recently used documents and bookmarked folders" msgstr "Pas gebruikte documenten in Abiword" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "Max dagen recente documenten" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Recente items" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Pas gebruikte documenten" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "%s Documenten" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Pas gebruikte documenten voor %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Locaties" #: ../kupfer/plugin/documents.py:164 #, fuzzy msgid "Bookmarked folders" msgstr "Persoonlijke map" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Epiphany Favorieten" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Index van Epiphany favorieten" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Favorieten" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "Veelgebruikte items markeren en objecten opslaan" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "Plank met \"favoriete\" items" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Toevoegen aan Favorieten" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Item toevoegen aan plank met favorieten" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Verwijderen uit Favorieten" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Item verwijderen van plank met favorieten" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Bestandsacties" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Meer bestandsacties" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:210 msgid "Move To..." msgstr "Verplaatsen naar..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:252 msgid "Move file to new location" msgstr "Bestand verplaatsen naar nieuwe locatie" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Hernoemen als..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:165 msgid "Copy To..." msgstr "Kopiëren naar..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:206 msgid "Copy file to a chosen location" msgstr "Bestand kopiëren naar opgegeven locatie" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Firefox Favorieten" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Index van Firefox favorieten" #: ../kupfer/plugin/firefox.py:26 #, fuzzy msgid "Include visited sites" msgstr "Artiesten opnemen in eerste level" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Geselecteerd bestand" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "Levert huidige selectie in nautilus met Kupfer's Nautilus Extension" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Geselecteerd bestand \"%s\"" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Geselecteerd bestanden" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Notities" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Gnote of Tomboy notities" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Werken met programma" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Openen met notitieprogramma" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Toevoegen aan Notitie" #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Tekst toevoegen aan bestaande notitie" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Notitie maken" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Nieuwe notitie maken van deze tekst" #: ../kupfer/plugin/notes.py:160 #, fuzzy msgid "Get Note Search Results..." msgstr "Haal Tracker Resultaten" #: ../kupfer/plugin/notes.py:173 #, fuzzy msgid "Show search results for this query" msgstr "Toon Tracker resultaten voor zoekopdracht" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "vandaag, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "gisteren, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Laatst geupdated %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "" "Nummers spelen en toevoegen aan speellijst en muziekbibliotheek doorzoeken" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Artiesten opnemen in eerste level" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Albums opnemen in eerste level" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Liederen opnemen in eerste level" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Afspelen" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Afspelen hervatten in Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Pauze" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Pauzeer afspelen in Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Volgende" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Spring naar volgende nummer in Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Vorige" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Spring naar vorige nummer in Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Toon huidige" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Laat zien welk nummer wordt gespeeld" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Lijst legen" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Speel nummers in Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Toevoegen" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Voeg nummers toe aan speellijst" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "door %(artist)s uit %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "door %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Nummers van %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Albums" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Muziekalbums in Rhythmboxbibliotheek" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Artiesten" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Muzikanten in Rhythmboxbibliotheek" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Liedjes" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Liedjes in Rhythmboxbibliotheek" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 #, fuzzy msgid "GNOME Session Management" msgstr "XFCE Sessiebeheer" #: ../kupfer/plugin/session_gnome.py:3 #, fuzzy msgid "Special items and actions for GNOME environment" msgstr "Speciale items en acties voor XFCE-omgeving" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Afmelden..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Afmelden of gebruiker wisselen" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Afsluiten..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Afsluiten, herstarten of suspenderen" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Scherm vergrendelen" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Schermbeveiliging activeren en vergrendelen" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "XFCE Sessiebeheer" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Speciale items en acties voor XFCE-omgeving" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Tekst tonen" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:52 msgid "Display text in a window" msgstr "Tekst tonen in venster" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Groot type" #: ../kupfer/plugin/show_text.py:60 msgid "Show Notification" msgstr "Toon melding" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Prullenbak" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Toegang tot prullenbak" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Verplaatsen naar Prullenbak" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Gooi dit bestand in Prullenbak" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Herstellen" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Zet bestand terug op oorspronkelijke locatie" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "Prullenbak is leeg" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "Prullenbak bevat één bestand" msgstr[1] "Prullenbak bevat %(num)s bestanden" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "" #: ../kupfer/plugin/triggers.py:6 #, fuzzy msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Sneltoetsen (triggers) toewijzen aan objecten gemaakt met " "'Samenstellen'Opdracht' (Ctrl+Return)." #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Trigger Toevoegen..." #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Trigger verwijderen..." #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "URL Acties" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Downloaden en openen" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Downloaden naar..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "URL downloaden naar een gegeven locatie" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Volumes en schijven" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Aangekoppelde volumes en schijven" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Volume aankoppelen naar %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Ontkoppelen" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Dit volume ontkoppelen" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Uitspugen" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Ontkoppelen en medium uitspugen" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Het Web doorzoeken" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Het web doorzoeken met OpenSearch zoekmotoren" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Zoeken met..." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Zoeken naar..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Zoekmotoren" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Zoeken in Wikipedia" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Wikipedia taal" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "en" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Zoeken naar deze term in %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Schermlijst" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Alle schermen op alle werkplaatsen" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Activeren" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Oprollen" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Uitrollen" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Minimaliseren" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Ontminimaliseren" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Maximaliseren" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Ontmaximaliseren" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Verticaal maximaliseren" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Verticaal ontmaximaliseren" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Scherm op %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Voorste venster" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Naar werkplaats springen van dit scherm en focus geven" #: ../kupfer/plugin/windows.py:252 #, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "" msgstr[1] "" #: ../kupfer/plugin/windows.py:256 #, fuzzy msgid "Active workspace" msgstr "Naar werkplaats springen" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Naar werkplaats springen" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Werkplaatsen" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Pas gebruikte documenten in Abiword" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Abiword recente items" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Interface met pakkettenbeheerder APT" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Installatiemethode" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Pakket-informatie tonen" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Installeren" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Pakket installeren met ingestelde methode" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Pakketten met \"%s\"" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Zoek pakketnaam..." #: ../kupfer/plugin/archiveinside.py:8 #, fuzzy msgid "Deep Archives" msgstr "Archiveren" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "" #: ../kupfer/plugin/archiveinside.py:49 #, fuzzy, python-format msgid "Content of %s" msgstr "Inhoud van" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Beheer Audacious' gedrag en afspeellijst" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Voeg nummer toe aan afspeellijst" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Verwijderen" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Verwijder nummer uit Audacious'afspeellijst" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Spring naar nummer in Rhythmbox" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Afspelen hervatten in Audacious" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Pauzeer afspelen in Audacious" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Spring naar volgende nummer in Audacious" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Spring naar vorige nummer in Audacious" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Audacious afspeellijst legen" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Shuffle" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Shuffle in Audacious aan-uit" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Herhalen" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Herhalen in Audacious aan-uit" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Afspeellijst" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Chromium Favorieten" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Index van Chromium favorieten" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Claws Mail Adressen en Acties" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Nieuwe e-mail opstellen" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Nieuwe e-mail opstellen met Claws Mail" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Alle e-mail ophalen" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "Alle nieuwe e-mail van alle accounts ophalen met Claws Mail" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "Opstellen e-mail" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "In e-mail sturen naar..." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Nieuwe e-mail opstellen met Claws Mail en bestand bijvoegen" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Claws Mail Adresboek" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Adressen uit Claws Mail Adresboek" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 #, fuzzy msgid "Custom Terminal" msgstr "Uitvoeren in Terminal" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Standaard E-mailprogramma" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "E-mail opstellen met standaard mailto: programma" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Devhelp doorzoeken" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "" #: ../kupfer/plugin/empathy.py:6 #, fuzzy msgid "Access to Empathy Contacts" msgstr "Toegang tot Gajim Contacten" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Toon offline kennissen" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Beschikbaar" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Afwezig" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Bezig" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Niet beschikbaar" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Onzichtbaar" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Offline" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:90 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:204 msgid "Open Chat" msgstr "Chat openen" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:118 #: ../kupfer/plugin/skype.py:250 msgid "Change Global Status To..." msgstr "Algemene status veranderen naar..." #: ../kupfer/plugin/empathy.py:171 #, fuzzy msgid "Empathy Contacts" msgstr "Gajim Contacten" #: ../kupfer/plugin/empathy.py:237 #, fuzzy msgid "Empathy Account Status" msgstr "Gajim Account status" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 #, fuzzy msgid "Evolution contacts" msgstr "Toon offline kennissen" #: ../kupfer/plugin/evolution.py:31 #, fuzzy msgid "Compose a new message in Evolution" msgstr "Nieuwe e-mail opstellen met Claws Mail" #: ../kupfer/plugin/evolution.py:92 #, fuzzy msgid "Compose new message in Evolution and attach file" msgstr "Nieuwe e-mail opstellen met Claws Mail en bestand bijvoegen" #: ../kupfer/plugin/evolution.py:100 #, fuzzy msgid "Evolution Address Book" msgstr "Claws Mail Adresboek" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Toegang tot Gajim Contacten" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Vrij om the chatten" #: ../kupfer/plugin/gajim.py:146 msgid "Gajim Contacts" msgstr "Gajim Contacten" #: ../kupfer/plugin/gajim.py:210 msgid "Gajim Account Status" msgstr "Gajim Account status" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 #, fuzzy msgid "GNOME Terminal Profiles" msgstr "Gnome Terminal profielen" #: ../kupfer/plugin/gnome_terminal.py:3 #, fuzzy msgid "Launch GNOME Terminal profiles" msgstr "Start Gnome Terminal profielen" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:144 msgid "Gmail" msgstr "" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "" #: ../kupfer/plugin/gmail/__init__.py:32 msgid "Load contacts' pictures" msgstr "" #: ../kupfer/plugin/gmail/__init__.py:51 #, fuzzy msgid "Compose Email in GMail" msgstr "Opstellen e-mail" #: ../kupfer/plugin/gmail/__init__.py:74 msgid "Open web browser and compose new email in GMail" msgstr "" #: ../kupfer/plugin/gmail/__init__.py:177 msgid "Contacts from Google services (Gmail)" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 #, fuzzy msgid "Google Picasa" msgstr "Google Translate" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:105 #, fuzzy msgid "Album created by Kupfer" msgstr "Over Kupfer" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "" msgstr[1] "" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "" msgstr[1] "" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 #, fuzzy msgid "Picasa Albums" msgstr "Albums" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #, python-format msgid "Results for \"%s\"" msgstr "Resultaten voor \"%s\"" #: ../kupfer/plugin/google_search.py:91 #, fuzzy, python-format msgid "Show More Results For \"%s\"" msgstr "Resultaten voor \"%s\"" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "" #: ../kupfer/plugin/google_translate.py:6 msgid "Google Translate" msgstr "Google Translate" #: ../kupfer/plugin/google_translate.py:8 #: ../kupfer/plugin/google_translate.py:153 msgid "Translate text with Google Translate" msgstr "Tekst vertalen met Google Translate" #: ../kupfer/plugin/google_translate.py:83 msgid "Google Translate connection timed out" msgstr "" #: ../kupfer/plugin/google_translate.py:86 msgid "Error connecting to Google Translate" msgstr "Fout bij verbinden met Google Translate" #: ../kupfer/plugin/google_translate.py:136 #: ../kupfer/plugin/google_translate.py:223 msgid "Translate To..." msgstr "Vertalen naar..." #: ../kupfer/plugin/google_translate.py:179 #, python-format msgid "Translate into %s" msgstr "Vertalen naar %s" #: ../kupfer/plugin/google_translate.py:203 msgid "Languages" msgstr "Talen" #: ../kupfer/plugin/google_translate.py:238 msgid "Show translated page in browser" msgstr "Vertaalde pagina tonen in browser" #: ../kupfer/plugin/google_translate.py:255 msgid "Show Translation To..." msgstr "Vertaling tonen aan..." #: ../kupfer/plugin/google_translate.py:271 msgid "Show translation in browser" msgstr "Vertaling tonen in browser" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "" #: ../kupfer/plugin/gtg.py:168 #, fuzzy msgid "Create Task" msgstr "Notitie maken" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, fuzzy, python-format msgid "%(user)s on %(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "" #: ../kupfer/plugin/gwibber.py:187 #, fuzzy msgid "Send Message" msgstr "Stuur bericht..." #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "" #: ../kupfer/plugin/gwibber.py:210 #, fuzzy msgid "Send Message To..." msgstr "Stuur bericht..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Stuur bericht..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "" #: ../kupfer/plugin/gwibber.py:314 #, fuzzy msgid "Delete Message" msgstr "Stuur bericht..." #: ../kupfer/plugin/gwibber.py:337 #, fuzzy msgid "Send Private Message..." msgstr "Stuur bericht..." #: ../kupfer/plugin/gwibber.py:370 msgid "Send direct message to user" msgstr "" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "" #: ../kupfer/plugin/gwibber.py:376 #, fuzzy msgid "Retweet To..." msgstr "Hernoemen als..." #: ../kupfer/plugin/gwibber.py:407 #, fuzzy msgid "Retweet message to all Gwibber accounts" msgstr "Alle nieuwe e-mail van alle accounts ophalen met Claws Mail" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:413 #, fuzzy msgid "Open in Browser" msgstr "Map openen" #: ../kupfer/plugin/gwibber.py:419 #, fuzzy msgid "Open message in default web browser" msgstr "Openen met standaardprogramma" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 #, fuzzy msgid "Gwibber Accounts" msgstr "Gajim Account status" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Belangrijkere acties" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Middelen om met opdrachten als objecten te werken" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Selecteren in Kupfer" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Resultaat van %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Uitvoeren (Neem resultaat)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Neem uitkomst opdracht als proxyobject" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Uitvoeren (Negeer uitkomst)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Tools voor afbeeldingen" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Bewerkingstools voor Afbeeldingen" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Schalen..." #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Afbeelding schalen om in opgegeven pixelgrootte te passen" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Draaien met klok mee" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Draaien tegen klok in" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Automatisch draaien" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Draai JPEG (in-place) volgens zijn EXIF metadata" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Kupfer Plug-ins" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Toegang tot Kupfer plug-in lijst in Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "versie-informatie tonen" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Broncode tonen" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "ingeschakeld" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Bestanden opsporen" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Bestandssysteem doorzoeken met \"locate\"" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Hoofdletters negeren bij zoeken bestanden" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 #, fuzzy msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Pas gebruikte documenten in OpenOffice" #: ../kupfer/plugin/openoffice.py:83 #, fuzzy msgid "OpenOffice/LibreOffice Recent Items" msgstr "OpenOfficeRecente items" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Opera Favorieten" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Index van Opera favorieten" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 #, fuzzy msgid "Opera Mail" msgstr "Claws Mail" #: ../kupfer/plugin/operamail.py:5 #, fuzzy msgid "Opera Mail contacts and actions" msgstr "Claws Mail Adressen en Acties" #: ../kupfer/plugin/operamail.py:32 #, fuzzy msgid "Compose a new message in Opera Mail" msgstr "Nieuwe e-mail opstellen met Claws Mail" #: ../kupfer/plugin/operamail.py:64 #, fuzzy msgid "Opera Mail Contacts" msgstr "Gajim Contacten" #: ../kupfer/plugin/operamail.py:120 #, fuzzy msgid "Contacts from Opera Mail" msgstr "Adressen uit Claws Mail Adresboek" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Toegang tot Pidgin Contacten" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "" msgstr[1] "" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Pidgin Contacten" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "PuTTY sessies" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Snelle toegang tot PuTTY sessies" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Sessie starten" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Bekijken als HTML-document" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Scherm" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "Actieve GNU Schermsessies" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Vastgemaakt" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Losgekoppeld" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s sessie (%(pid)s) begonnen %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Schermsessies" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Vastkoppelen" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:49 msgid "Send Keys" msgstr "" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "" #: ../kupfer/plugin/sendkeys.py:25 msgid "Paste to Foreground Window" msgstr "" #: ../kupfer/plugin/sendkeys.py:43 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:85 msgid "Send keys to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:90 msgid "Type Text" msgstr "" #: ../kupfer/plugin/sendkeys.py:111 msgid "Type the text to foreground window" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Sudo-achtige opdracht" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Verkort links" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Maak korte aliases van lange URLs" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Fout" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Verkorten met..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 #, fuzzy msgid "Show QRCode" msgstr "Broncode tonen" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 #, fuzzy msgid "Display text as QRCode in a window" msgstr "Tekst tonen in venster" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Toegang tot Skype Contacten" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skype me" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Afgemeld" #: ../kupfer/plugin/skype.py:183 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:225 msgid "Call" msgstr "Bellen" #: ../kupfer/plugin/skype.py:239 msgid "Place a call to contact" msgstr "" #: ../kupfer/plugin/skype.py:274 msgid "Skype Contacts" msgstr "Skype Contacten" #: ../kupfer/plugin/skype.py:294 msgid "Skype Statuses" msgstr "Skype statussen" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "" #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Geen D-Bus verbinding met desktopsessie" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Documentsjablonen" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Nieuwe documenten maken vanuit sjablonen" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "%s sjabloon" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Leeg bestand" #: ../kupfer/plugin/templates.py:47 #, fuzzy msgid "New Folder" msgstr "Persoonlijke map" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Maak nieuw document..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Maak nieuw document vanuit sjabloon" #: ../kupfer/plugin/templates.py:103 #, fuzzy msgid "Create Document In..." msgstr "Maak nieuw document..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "" #: ../kupfer/plugin/textfiles.py:51 #, fuzzy msgid "Append To..." msgstr "Toevoegen aan Notitie" #: ../kupfer/plugin/textfiles.py:75 #, fuzzy msgid "Append..." msgstr "Toevoegen aan Notitie" #: ../kupfer/plugin/textfiles.py:79 #, fuzzy msgid "Write To..." msgstr "Vertalen naar..." #: ../kupfer/plugin/textfiles.py:111 #, fuzzy msgid "Get Text Contents" msgstr "Inhoud doorzoeken" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:184 #: ../kupfer/plugin/thunar.py:224 ../kupfer/plugin/thunar.py:283 msgid "Thunar" msgstr "" #: ../kupfer/plugin/thunar.py:10 msgid "File manager Thunar actions" msgstr "" #: ../kupfer/plugin/thunar.py:66 #, fuzzy msgid "Select in File Manager" msgstr "Selecteren in Kupfer" #: ../kupfer/plugin/thunar.py:94 msgid "Show Properties" msgstr "" #: ../kupfer/plugin/thunar.py:117 #, fuzzy msgid "Show information about file in file manager" msgstr "Toon informatie over Kupfers auteurs en licensie" #: ../kupfer/plugin/thunar.py:126 #, fuzzy msgid "Send To..." msgstr "Hernoemen als..." #: ../kupfer/plugin/thunar.py:258 #, fuzzy msgid "Empty Trash" msgstr "Prullenbak" #: ../kupfer/plugin/thunar.py:298 msgid "Thunar Send To Objects" msgstr "" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Thunderbird/Icedove Adressen en Acties" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Opstellen nieuw bericht in Thunderbird" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Thunderbird adresboek" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Adressen uit Thunderbird Adresboek" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Top" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Toon actieve taken en toestaan signalen " #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "CPU-gebruik (aflopend)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Geheugengebruik (aflopend)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Zend signaal..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Signalen" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Actieve taken" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Actieve taken voor huidige gebruiker" #: ../kupfer/plugin/tracker.py:5 #, fuzzy msgid "Tracker 0.6" msgstr "Tracker" #: ../kupfer/plugin/tracker.py:15 ../kupfer/plugin/tracker1.py:18 msgid "Tracker desktop search integration" msgstr "Tracker's \"doorzoek desktop\" integratie " #: ../kupfer/plugin/tracker.py:41 ../kupfer/plugin/tracker1.py:49 msgid "Search in Tracker" msgstr "Zoek in Tracker" #: ../kupfer/plugin/tracker.py:46 ../kupfer/plugin/tracker1.py:54 msgid "Open Tracker Search Tool and search for this term" msgstr "Tracker Search Tool openen en naar deze term zoeken" #: ../kupfer/plugin/tracker.py:55 ../kupfer/plugin/tracker1.py:62 msgid "Get Tracker Results..." msgstr "Haal Tracker Resultaten" #: ../kupfer/plugin/tracker.py:64 ../kupfer/plugin/tracker1.py:71 msgid "Show Tracker results for query" msgstr "Toon Tracker resultaten voor zoekopdracht" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Tracker tags" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Tracker tags" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Tracker's tags doorzoeken" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "Tag %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Objecten getagged %s met Tracker" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Tag Toevoegen..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Voeg tracker tag toe aan bestand" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Tag verwijderen..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Tracker tag van bestand verwijderen" #: ../kupfer/plugin/tracker1.py:10 msgid "Tracker" msgstr "Tracker" #. FIXME: Port tracker tag sources and actions #. to the new, much more powerful sparql + dbus API #. (using tracker-tag as in 0.6 is a plain hack and a dead end) #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Volumes uit TrueCrypt geschiedenis" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "TrueCrypt volume: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Volume aankoppelen" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Aankoppelen in TrueCrypt" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Probeer bestand als Truecrypt volume aan te koppelen" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Alle volumes ontkoppelen" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "TrueCrypt Volumes" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Terminal Server Client" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Sessie opgeslagen in Terminal Server Client" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "TSClient sessies" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Opgeslagen sessies in Terminal Server Client" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Vinagre favorieten en acties" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Vinagre-sessie starten" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Vinagre Favorieten" #: ../kupfer/plugin/vim.py:1 #, fuzzy msgid "Vim" msgstr "Zim" #: ../kupfer/plugin/vim.py:3 #, fuzzy msgid "Recently used documents in Vim" msgstr "Pas gebruikte documenten in Abiword" #: ../kupfer/plugin/vim.py:46 #, fuzzy msgid "Vim Recent Documents" msgstr "Pas gebruikte documenten" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "VirtualBox Virtual Machines beheren. Ondersteunt zowel Sun Virtualboxals de " "Open Source Edition." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Aanzetten" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Zend \"uitzetten\" signaal" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Herstarten" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Doorgaan" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Status opslaan" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Uitzetten" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "VirtualBox Machines" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:10 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "Toegang to pagina's opgeslagen in Zim - Een Desktop-Wiki" #: ../kupfer/plugin/zim.py:28 msgid "Page names start with :colon" msgstr "Paginanamen beginnen met :dubbelepunt" #: ../kupfer/plugin/zim.py:58 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Zim pagina uit Notitieboek \"%s\"" #: ../kupfer/plugin/zim.py:67 msgid "Create Zim Page" msgstr "Zim-pagina aanmaken" #: ../kupfer/plugin/zim.py:74 msgid "Create page in default notebook" msgstr "Pagina in standaard notitieboek aanmaken" #: ../kupfer/plugin/zim.py:84 msgid "Create Zim Page In..." msgstr "Zim-pagina aanmaken in..." #: ../kupfer/plugin/zim.py:122 msgid "Create Subpage..." msgstr "Subpagina aanmaken..." #: ../kupfer/plugin/zim.py:243 msgid "Zim Notebooks" msgstr "Zim Notitieboeken" #: ../kupfer/plugin/zim.py:259 msgid "Zim Pages" msgstr "Zim-pagina's" #: ../kupfer/plugin/zim.py:287 msgid "Pages stored in Zim Notebooks" msgstr "Pagina's opgeslagen in Zim Notitieboeken" #~ msgid "Directories" #~ msgstr "Mappen" #~ msgid "Interface" #~ msgstr "Uiterlijk" #~ msgid "Keybinding" #~ msgstr "Sneltoets" #~ msgid "Plugins activate after restart" #~ msgstr "Plug-ins laden na herstart" #~ msgid "To configure kupfer, edit:" #~ msgstr "Om kupfer te configureren, bewerk:" #~ msgid "The default config for reference is at:" #~ msgstr "De standaard-configuratie bevindt zich in:" #~ msgid "Applied" #~ msgstr "Toegepast" #~ msgid "Text Matches" #~ msgstr "Tekst treffers" #~ msgid "Open with %s" #~ msgstr "Openen met %s" #~ msgid "Recently used documents and nautilus places" #~ msgstr "Pas gebruikte documenten en nautilus locaties" #~ msgid "Bookmarked locations in Nautilus" #~ msgstr "Favoriete locaties in Nautilus" #~ msgid "Special items and actions for Gnome environment" #~ msgstr "Speciale items en acties voor Gnome-omgeving" #~ msgid "noun" #~ msgstr "zelfst. nw." #~ msgid "verb" #~ msgstr "werkwoord" #~ msgid "adjective" #~ msgstr "bijv. nw." #~ msgid "OpenOffice" #~ msgstr "OpenOffice" #~ msgid "Include in top level" #~ msgstr "Opnemen in eerste level" #~ msgid "" #~ "If enabled, objects from the plugin's source(s) will be available in the " #~ "top level.\n" #~ "Sources are always available as subcatalogs in the top level." #~ msgstr "" #~ "Indien geactiveerd, zullen objecten van de plug-inbronnen beschikbaar " #~ "zijn in het toplevel.\n" #~ "Bronnen zijn altijd beschikbaar als subcatalogi in het toplevel." #~ msgid "Do" #~ msgstr "Doen" #~ msgid "Compose New Mail To" #~ msgstr "Nieuwe e-mail opstallen aan" #~ msgid "Special Items" #~ msgstr "Speciale items" #~ msgid "Items and special actions" #~ msgstr "Items en speciale acties" #~ msgid "Kupfer items and actions" #~ msgstr "Kupfer items en acties" #~ msgid "(Simple) favorites plugin" #~ msgstr "(Eenvoudige) favorietenplug-in" #~ msgid "(no description)" #~ msgstr "(geen omschrijving)" #~ msgid " %(name)-20s %(version)-4s %(description)s" #~ msgstr " %(name)-20s %(version)-4s %(description)s" #~ msgid "Free-text Queries" #~ msgstr "Vrije-tekst zoekopdrachten" #~ msgid "Basic support for free-text queries" #~ msgstr "Basale ondersteuning van vrije-tekst zoekopdrachten" #~ msgid "Filesystem Text Matches" #~ msgstr "Bestandssysteem Tekst Treffers" #~ msgid "URL Text Matches" #~ msgstr "URL Tekst Treffers" #~ msgid "Searching..." #~ msgstr "Zoeken..." #~ msgid "Searching %(source)s..." #~ msgstr "Zoeken in %(source)s ..." kupfer-v208/po/pl.po000066400000000000000000002602121176220042200144370ustar00rootroot00000000000000# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # Aviary.pl # Jeśli masz jakiekolwiek uwagi odnoszące się do tłumaczenia lub chcesz # pomóc w jego rozwijaniu i pielęgnowaniu, napisz do nas: # gnomepl@aviary.pl # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- msgid "" msgstr "" "Project-Id-Version: kupfer\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-02-25 21:08+0100\n" "PO-Revision-Date: 2012-02-25 21:09+0100\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Poedit-Language: Polish\n" "X-Poedit-Country: Poland\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "Aktywator programów" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "Wygodne narzędzie do uruchamiania programów i otwierania dokumentów" #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Wykonaj w programie Kupfer" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Zapisane polecenie programu Kupfer" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Dane użytkownika" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "_Zmień" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "_Hasło:" #: ../data/credentials_dialog.ui.h:4 msgid "_User:" msgstr "_Użytkownik:" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "Przypisanie klawisza się nie powiodło" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Proszę nacisnąć żądaną kombinację klawiszy" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "Wybór klawisza skrótu" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "Skróty klawiszowe przeglądarki" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "Globalne skróty klawiszowe" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Początek" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:156 msgid "Catalog" msgstr "Katalog" #: ../data/preferences.ui.h:5 msgid "Desktop Environment" msgstr "Środowisko graficzne" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "" "Katalogi, których pliki będą zawsze dostępne w katalogu programu Kupfer." #: ../data/preferences.ui.h:7 ../kupfer/plugin/gmail/__init__.py:60 msgid "General" msgstr "Ogólne" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "Zestaw ikon:" #: ../data/preferences.ui.h:9 msgid "Inclusion in Top Level Searches" msgstr "Zawartość najwyższego poziomu katalogu" #: ../data/preferences.ui.h:10 msgid "Indexed Folders" msgstr "Indeksowane katalogi" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "Klawiatura" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Preferencje programu Kupfer" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" "Obiekty zaznaczonych źródeł zostaną umieszczone na najwyższym poziomie listy " "wyszukiwania.\n" "Zawartość odznaczonych źródeł jest dostępna jedynie przez podkatalogi listy." #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "Wtyczki" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:849 msgid "Reset" msgstr "Przywróć" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "Ikona w obszarze powiadamiania" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "Automatycznie uruchamianie po zalogowaniu" #: ../data/preferences.ui.h:19 msgid "Terminal emulator:" msgstr "Emulator terminala:" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "" "Włączenie jednoklawiszowych poleceń (spacja, /, kropka, przecinek itp.)" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Nie można wykonać \"%s\"" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "\"%s\" zwróciło wynik" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "Brak uprawień do uruchomienia \"%s\" (plik nie jest wykonywalny)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "Polecenie w \"%s\" jest niedostępne" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "Przekazywanie klawiszy jest aktywne dla ekranu %s" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "bez wyświetlania głównego okna po uruchomieniu" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "wyświetla listę dostępnych wtyczek" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "włącza informacje debugowania" #. TRANS: --exec-helper=HELPER is an internal command #. TRANS: that executes a helper program that is part of kupfer #: ../kupfer/main.py:49 msgid "run plugin helper" msgstr "uruchamia program pomocniczy wtyczek" #: ../kupfer/main.py:52 msgid "show usage help" msgstr "wyświetla ekran pomocy" #: ../kupfer/main.py:53 msgid "show version information" msgstr "wyświetla informację o wersji" #: ../kupfer/main.py:59 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Użycie: kupfer [ OPCJE | PLIK... ]" #: ../kupfer/main.py:70 msgid "Available plugins:" msgstr "Dostępne wtyczki:" #: ../kupfer/main.py:121 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "Alternatywna aktywacja" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Sztuczka z przecinkiem" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Polecenie komponowania" #: ../kupfer/ui/accelerators.py:11 msgid "Mark Default Action" msgstr "Oznaczenie domyślnego działania" #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "Zapomnienie o obiekcie" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Przywrócenie wszystkiego" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Przejście do \"Zakończ\"" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Przejście do zaznaczonego pliku" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Przejście do zaznaczonego tekstu" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Wyświetlenie pomocy" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Wyświetlenie preferencji" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "Przejście do pierwszego panelu" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Przełączenie trybu tekstowego" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s jest puste" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "Brak wyników w %(src)s dla \"%(query)s\"" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Brak wyników" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Wprowadzenie tekstu wyszuka" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Wprowadzenie tekstu wyszuka %s" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Brak działania" #: ../kupfer/ui/browser.py:1513 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "Zaznaczenie \"%(action)s\" jako domyśle dla \"%(object)s\"" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1523 #, python-format msgid "Forget About \"%s\"" msgstr "Zapomnij o \"%s\"" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1960 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Wyświetlanie głównego interfejsu" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Wyświetlanie zaznaczenia" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Opis" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Autor" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Wersja" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Wymagany jest moduł języka Python \"%s\"" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Wtyczka nie może zostać odczytana z powodu błędu:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "wyłączone" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Zawartość" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Źródła" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Działania" #: ../kupfer/ui/preferences.py:575 #, python-format msgid "Using encrypted password storage: %s" msgstr "Używanie zaszyfrowanego przechowywania haseł: %s" #: ../kupfer/ui/preferences.py:577 #, python-format msgid "Using password storage: %s" msgstr "Używanie przechowywania haseł: %s" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:594 msgid "Configuration" msgstr "Konfiguracja" #: ../kupfer/ui/preferences.py:614 msgid "Set username and password" msgstr "Proszę ustawić nazwę użytkownika i hasło" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:668 msgid "Choose a Directory" msgstr "Wybór katalog" #: ../kupfer/ui/preferences.py:847 msgid "Reset all shortcuts to default values?" msgstr "Przywrócić wszystkie skróty klawiszowe do ich domyślnych wartości?" #: ../kupfer/ui/preferences.py:855 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Polecenie" #: ../kupfer/ui/preferences.py:856 msgid "Shortcut" msgstr "Skrót klawiszowy" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "" "Maciej Kwiatkowski , 2009\n" "Karol Będkowski , 2009, 2010, 2011\n" "Aviary.pl , 2011, 2012" #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Aktywator programów na wolnej licencji (GPLv3+)" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Niniejszy program jest wolnym oprogramowaniem; można go rozprowadzać dalej\n" "i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU, wydanej\n" "przez Fundację Wolnego Oprogramowania (Free Software Foundation) - według\n" "wersji trzeciej tej Licencji lub którejś z późniejszych wersji.\n" "\n" "Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny\n" "- jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej gwarancji\n" "PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. W celu\n" "uzyskania bliższych informacji należy zapoznać się z Powszechną Licencją\n" "Publiczną GNU.\n" "\n" "Z pewnością wraz z niniejszym programem dostarczono także egzemplarz\n" "Powszechnej Licencji Publicznej GNU (GNU General Public License); jeśli nie\n" "- proszę odwiedzić stronę internetową .\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "Nie można odnaleźć uruchomionego programu Kupfer" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 msgid "Text" msgstr "Tekst" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Uruchom z opóźnieniem..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Wykonuje polecenie po podanym czasie" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Wiele obiektów" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s obiekt" msgstr[1] "%s obiekty" msgstr[2] "%s obiektów" #: ../kupfer/obj/contacts.py:129 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/contacts.py:131 msgid "unknown" msgstr "nieznane" #: ../kupfer/obj/contacts.py:144 msgid "Aim" msgstr "AIM" #: ../kupfer/obj/contacts.py:151 msgid "Google Talk" msgstr "Google Talk" #: ../kupfer/obj/contacts.py:159 msgid "ICQ" msgstr "ICQ" #: ../kupfer/obj/contacts.py:166 msgid "MSN" msgstr "MSN" #: ../kupfer/obj/contacts.py:173 msgid "QQ" msgstr "QQ" #: ../kupfer/obj/contacts.py:180 msgid "Yahoo" msgstr "Yahoo" #. -*- coding: UTF-8 -*- #: ../kupfer/obj/contacts.py:187 ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "%s nie obsługuje tego działania" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "Nie może być użyte z wieloma obiektami" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:176 msgid "Open" msgstr "Otwórz" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Brak domyślnego programu dla %(file)s (%(type)s)" #: ../kupfer/obj/fileactions.py:45 #, python-format msgid "Please use \"%s\"" msgstr "Proszę użyć \"%s\"" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Ustaw domyślny program..." #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Otwiera za pomocą domyślnego programu" #: ../kupfer/obj/fileactions.py:74 msgid "Reveal" msgstr "Wyświetl" #: ../kupfer/obj/fileactions.py:83 msgid "Open parent folder" msgstr "Otwiera katalog nadrzędny" #: ../kupfer/obj/fileactions.py:89 msgid "Open Terminal Here" msgstr "Uruchom terminal w tym miejscu" #: ../kupfer/obj/fileactions.py:102 msgid "Open this location in a terminal" msgstr "Otwiera to położenie w terminalu" #: ../kupfer/obj/fileactions.py:110 msgid "Run in Terminal" msgstr "Uruchom w terminalu" #: ../kupfer/obj/fileactions.py:110 msgid "Run (Execute)" msgstr "Uruchom (wykonaj)" #: ../kupfer/obj/fileactions.py:130 msgid "Run this program in a Terminal" msgstr "Uruchamia ten program w terminalu" #: ../kupfer/obj/fileactions.py:132 msgid "Run this program" msgstr "Uruchamia ten program" #: ../kupfer/obj/objects.py:252 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 ../kupfer/plugin/vim/plugin.py:172 msgid "Go To" msgstr "Przejdź do" #: ../kupfer/obj/objects.py:278 msgid "Open URL" msgstr "Otwórz adres URL" #: ../kupfer/obj/objects.py:289 msgid "Open URL with default viewer" msgstr "Otwiera adres URL za pomocą domyślnej przeglądarki" #: ../kupfer/obj/objects.py:303 msgid "Launch" msgstr "Uruchom" #: ../kupfer/obj/objects.py:316 msgid "Show application window" msgstr "Wyświetla okno programu" #: ../kupfer/obj/objects.py:317 msgid "Launch application" msgstr "Uruchamia program" #: ../kupfer/obj/objects.py:328 msgid "Launch Again" msgstr "Uruchom jeszcze raz" #: ../kupfer/obj/objects.py:335 msgid "Launch another instance of this application" msgstr "Uruchamia kolejną kopię tego programu" #: ../kupfer/obj/objects.py:341 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Zamknij" #: ../kupfer/obj/objects.py:349 msgid "Attempt to close all application windows" msgstr "Próbuje zamknąć wszystkie okna programu" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:396 msgid "Run" msgstr "Uruchom" #: ../kupfer/obj/objects.py:406 msgid "Perform command" msgstr "Wykonuje polecenie" #: ../kupfer/obj/objects.py:419 msgid "(Empty Text)" msgstr "(Brak tekstu)" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:449 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "(%(num)d wiersz) \"%(text)s\"" msgstr[1] "(%(num)d wiersze) \"%(text)s\"" msgstr[2] "(%(num)d wierzszy) \"%(text)s\"" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s i inni" #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Rekurencyjne źródło %(dir)s, (%(levels)d poziomów)" #: ../kupfer/obj/sources.py:108 #, python-format msgid "Directory source %s" msgstr "Źródło katalogu %s" #: ../kupfer/obj/sources.py:118 msgid "Home Folder" msgstr "Katalog domowy" #: ../kupfer/obj/sources.py:129 msgid "Catalog Index" msgstr "Indeks katalogu" #: ../kupfer/obj/sources.py:144 msgid "An index of all available sources" msgstr "Indeks wszystkich dostępnych źródeł" #: ../kupfer/obj/sources.py:176 msgid "Root catalog" msgstr "Katalog główny" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Proszę skonfigurować wtyczkę" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "Wtyczka %s nie jest skonfigurowana" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "Nieprawidłowe dane użytkownika dla %s" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Programy" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Wszystkie programy i preferencje" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Programy środowiska graficznego" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Otwórz za pomocą..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Otwiera za pomocą innego programu" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Ustawia domyślny program dla tego typu plików" #: ../kupfer/plugin/archivemanager.py:1 msgid "Archive Manager" msgstr "Menedżer archiwów" #: ../kupfer/plugin/archivemanager.py:9 msgid "Use Archive Manager actions" msgstr "Działania menedżera archiwów" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Typ skompresowanego archiwum dla \"Utwórz archiwum w\"" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Rozpakuj tutaj" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Rozpakowuje skompresowane archiwum" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Utwórz archiwum" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Tworzy skompresowane archiwum z katalogu" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Utwórz archiwum w..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Archiwum" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Kalkulator" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Oblicza wyrażenia zaczynające się od znaku \"=\"" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Oblicz" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:112 msgid "Clipboards" msgstr "Schowki" #: ../kupfer/plugin/clipboard.py:4 msgid "Recent clipboards and clipboard proxy objects" msgstr "Ostatnie schowki i ich obiekty pośredniczące" #: ../kupfer/plugin/clipboard.py:24 msgid "Number of recent clipboards to remember" msgstr "Liczba ostatnich schowków do pamiętania" #: ../kupfer/plugin/clipboard.py:30 msgid "Include selected text in clipboard history" msgstr "Dołączenie zaznaczonego tekstu w historii schowka" #: ../kupfer/plugin/clipboard.py:36 msgid "Copy selected text to primary clipboard" msgstr "Kopiuje zaznaczony tekst do podstawowego schowka" #: ../kupfer/plugin/clipboard.py:47 msgid "Selected Text" msgstr "Zaznaczony tekst" #: ../kupfer/plugin/clipboard.py:57 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Schowek z %(num)d wierszem \"%(desc)s\"" msgstr[1] "Schowek z %(num)d wierszami \"%(desc)s\"" msgstr[2] "Schowek z %(num)d wierszami \"%(desc)s\"" #: ../kupfer/plugin/clipboard.py:64 msgid "Clipboard Text" msgstr "Tekst w schowku" #: ../kupfer/plugin/clipboard.py:74 msgid "Clipboard File" msgstr "Plik w schowku" #: ../kupfer/plugin/clipboard.py:84 msgid "Clipboard Files" msgstr "Pliki w schowku" #: ../kupfer/plugin/clipboard.py:92 msgid "Clear" msgstr "Wyczyść" #: ../kupfer/plugin/clipboard.py:104 msgid "Remove all recent clipboards" msgstr "Usuwa wszystkie ostatnie schowki" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Polecenia powłoki" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" "Uruchamianie programów wiersza poleceń. Działania oznaczone symbolem %s " "uruchamiane są w podpowłoce." #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Uruchom (pobierz wynik)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Uruchamia program i zwraca jego wynik" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 msgid "Pass to Command..." msgstr "Przekaż do polecenia..." #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "Uruchomia program z obiektem jako dodatkowym parametrem" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 msgid "Write to Command..." msgstr "Zapisz do polecenia..." #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 msgid "Run program and supply text on the standard input" msgstr "Uruchamia program i przesyła tekst do standardowego wejścia" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "Filtruj przez polecenie..." #: ../kupfer/plugin/commands.py:215 msgid "Run command-line programs" msgstr "Uruchamia programy wiersza poleceń" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "GTK+" #: ../kupfer/plugin/core/alternatives.py:13 msgid "GNOME Terminal" msgstr "Terminal GNOME" #: ../kupfer/plugin/core/alternatives.py:22 msgid "XFCE Terminal" msgstr "Terminal XFCE" #: ../kupfer/plugin/core/alternatives.py:31 msgid "LXTerminal" msgstr "LXTerminal" #: ../kupfer/plugin/core/alternatives.py:40 msgid "X Terminal" msgstr "X Terminal" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "Urxvt" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Zapisz jako..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Zakończ" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Kończy działanie programu Kupfer" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "O programie Kupfer" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Wyświetla informacje o autorach i licencji programu Kupfer" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Pomoc programu Kupfer" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Wyświetla pomocy programu Kupfer" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Wyświetla okno preferencji programu Kupfer" #: ../kupfer/plugin/core/__init__.py:64 msgid "Search Contents" msgstr "Wyszukiwanie zawartości" #: ../kupfer/plugin/core/__init__.py:82 msgid "Search inside this catalog" msgstr "Wyszukuje wewnątrz tego katalogu" #: ../kupfer/plugin/core/__init__.py:90 msgid "Copy" msgstr "Skopiuj" #: ../kupfer/plugin/core/__init__.py:105 msgid "Copy to clipboard" msgstr "Kopiuje do schowka" #: ../kupfer/plugin/core/__init__.py:127 msgid "Rescan" msgstr "Odśwież" #: ../kupfer/plugin/core/__init__.py:142 msgid "Force reindex of this source" msgstr "Wymusza ponowne zindeksowanie tego źródła" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Ostatnie polecenie" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Obiekty wewnętrzne programu Kupfer" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Ostatni wynik" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Wynik polecenia" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Słownik" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Wyszukuje słowa w słowniku" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Znajdź" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Dokumenty" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "Ostatnio używane dokumenty i katalogi w zakładkach" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "Maksymalna liczba dni dla ostatnio używanych dokumentów" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Ostatnie elementy" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Ostatnio używane dokumenty" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "Dokumenty %s" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Ostatnio używane dokumenty programu %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Miejsca" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Katalogi w zakładkach" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Zakładki programu Epiphany" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Indeks zakładek programu Epiphany" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Ulubione" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "" "Zaznaczenie często używanych elementów i zachowanie ich do późniejszego " "użycia" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "Półka \"ulubionych\" elementów" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Dodaj do ulubionych" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Dodaje element do półki z ulubionymi" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Usuń z ulubionych" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Usuwa element z półki ulubionych" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Działania na plikach" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Dodatkowe działania na plikach" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:211 msgid "Move To..." msgstr "Przenieś do..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:253 msgid "Move file to new location" msgstr "Przenosi plik do nowego położenia" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Zmień nazwę na..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:166 msgid "Copy To..." msgstr "Skopiuj do..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:207 msgid "Copy file to a chosen location" msgstr "Kopiuje plik do wybranego położenia" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Zakładki programu Firefox" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Indeks zakładek programu Firefox" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "Dołączenie odwiedzonych miejsc" #. TRANS: Multihead refers to support for multiple computer displays #. TRANS: In this case, it only concerns the special configuration #. TRANS: with multiple X "screens" #: ../kupfer/plugin/multihead.py:4 msgid "Multihead Support" msgstr "Obsługa wielu ekranów" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Zaznaczony plik" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" "Bieżące zaznaczenie w programie Nautilus (z pomocą rozszerzenia Kupfer dla " "programu Nautilus)" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Zaznaczony plik \"%s\"" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Zaznaczone pliki" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Notatki" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Notatki w programie Gnote lub Tomboy" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Współpraca z programem" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Otwiera za pomocą programu notatek" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Dołącz do notatki..." #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Dodaje tekst do istniejącej notatki" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Utwórz notatkę" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Tworzy nową notatkę zawierającą ten tekst" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Wyszukaj wśród notatek..." #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "Wyświetla wyniki szukania dla zapytania" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "dziś, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "wczoraj, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Ostatnia aktualizacja: %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "" "Odtwarzanie i kolejkowanie utworów oraz przeglądanie kolekcji muzycznej" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Wyświetlanie wykonawców na najwyższym poziomie listy" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Wyświetlanie albumów na najwyższym poziomie listy" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Wyświetlanie utworów na najwyższym poziomie listy" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Odtwarzaj" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Wznawia odtwarzanie w programie Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Wstrzymaj" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Wstrzymuje odtwarzanie w programie Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Następny" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Przechodzi do następnego utworu w programie Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Poprzedni" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Przechodzi do poprzedniego utworu w programie Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Wyświetl odtwarzany" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Wyświetla obecnie odtwarzany utwór" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Wyczyść kolejkę" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Odtwarza utwory w programie Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Dodaj do kolejki" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Dodaje utwory do kolejki odtwarzania" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr " %(artist)s z %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr " %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Utwory wykonawcy %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Albumy" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Albumy w kolekcji programu Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Wykonawcy" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Wykonawcy w kolekcji programu Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Utwory" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Utwory w kolekcji programu Rhythmbox" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "Menedżer sesji GNOME" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "Specjalne elementy i działania dla środowiska GNOME" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Wyloguj..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Wylogowuje lub zmienia użytkownika" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Wyłącz..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Wyłącza, uruchamia ponownie lub usypia komputer" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Zablokuj ekran" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Wygasza i blokuje ekran" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "Menedżer sesji Xfce" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Specjalne elementy i działania dla środowiska Xfce" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Wyświetl tekst" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:58 msgid "Display text in a window" msgstr "Wyświetla tekst w oknie" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Duży napis" #: ../kupfer/plugin/show_text.py:66 msgid "Show Notification" msgstr "Wyświetl powiadomienie" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Kosz" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Dostęp do zawartości kosza" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Przenieś do kosza" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Przenosi plik do kosza" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Przywróć" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Przenosi plik z powrotem do pierwotnego położenia" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "Kosz jest pusty" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "W koszu jest %(num)s plik" msgstr[1] "W koszu są %(num)s pliki" msgstr[2] "W koszu jest %(num)s plików" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Wyzwalacze" #: ../kupfer/plugin/triggers.py:6 msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Przypisanie skrótów klawiszowych (wyzwalaczy) do obiektów utworzonych przez " "\"Polecenie komponowania\"." #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Dodaj wyzwalacz..." #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Usuń wyzwalacz" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "Działania adresów URL" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Pobierz i otwórz" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Pobierz do..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "Pobiera adres URL do wybranego położenia" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Woluminy i dyski" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Zamontowane woluminy i dyski" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Wolumin zamontowany w %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Odmontuj" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Odmontowuje ten wolumin" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Wysuń" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Odmontowuje i wysuwa ten nośnik" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Wyszukiwanie w sieci WWW" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Wyszukiwanie w sieci za pomocą wyszukiwarek OpenSearch" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Znajdź za pomocą..." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Znajdź..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Wyszukiwarki" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Znajdź w Wikipedii" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Język Wikipedii" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "pl" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Wyszukuje to wyrażenie w serwisie %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Lista okien" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Wszystkie okna ze wszystkich obszarów roboczych" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Aktywuj" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Zwiń" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Rozwiń" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Zminimalizuj" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Przywróć" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Zmaksymalizuj" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Przywróć" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Zmaksymalizuj w pionie" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Przywróć w pionie" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Okno na %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Okno na wierzchu" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Następne okno" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Przechodzi do obszaru roboczego okna i uaktywnia je" #: ../kupfer/plugin/windows.py:252 #, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "%d okno" msgstr[1] "%d okna" msgstr[2] "%d okien" #: ../kupfer/plugin/windows.py:256 msgid "Active workspace" msgstr "Aktywny obszar roboczy" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Przechodzi do obszaru roboczego" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Obszary robocze" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Ostatnio używane dokumenty programu Abiword" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Ostatnie dokumenty programu Abiword" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Współpraca z menedżerem pakietów APT" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Metoda instalacji" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Wyświetl informacje o pakiecie" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Zainstaluj" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Instaluje pakiet używając skonfigurowanej metody" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Pakiety pasujące do \"%s\"" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Znajdź pakiet o nazwie..." #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "Przeglądane archiwów" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Dostęp do zawartości skompresowanych archiwów" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "Zawartość %s" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "Ikony ASCII i unikodu" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" "Dostarcza zestaw ikon ASCII i unikodu, które używają liter i symboli do " "utworzenia ikon dla obiektów zgromadzonych w programie Kupfer." #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "ASCII" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "Unikod" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Kontrolowanie odtwarzania i list odtwarzania programu Audacious" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Dodaje utwór do kolejki odtwarzania programu Audacious" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Usuń z kolejki" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Usuwa utwór z kolejki odtwarzania programu Audacious" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Przechodzi do utworu w programie Audacious" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Wznawia odtwarzanie w programie Audacious" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Wstrzymuje odtwarzanie w programie Audacious" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Przechodzi do następnego utworu w programie Audacious" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Przechodzi do poprzedniego utworu w programie Audacious" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Czyści kolejkę odtwarzania programu Audacious" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Odtwarzaj losowo" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Przełącza odtwarzanie w losowej kolejności w programie Audacious" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Powtórz" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Przełącza powtarzanie w programie Audacious" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Lista odtwarzania" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Zakładki programu Chromium" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Zakładki programu Chromium" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Kontakty i działania programu Claws Mail" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Napisz nową wiadomość e-mail" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Tworzy nową wiadomość w programie Claws Mail" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Pobierz wszystkie wiadomości" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "Pobiera wiadomości ze wszystkich kont programu Claws Mail" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "Utwórz wiadomość e-mail" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "Wyślij w wiadomości e-mail do..." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Tworzy nową wiadomość w programie Claws Mail i załącza plik" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Książka adresowa programu Claws Mail" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Kontakty z książki adresowej programu Claws Mail" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 msgid "Custom Terminal" msgstr "Terminal użytkownika" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "Konfiguracja własnego emulatora terminala" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "Parametr wykonania" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "Motyw użytkownika" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "Użycie własnego motywu kolorów" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "Motyw:" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Domyślny klient poczty" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "Tworzenie wiadomości e-mail używając domyślnego klienta poczty" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Wyszukiwanie w programie Devhelp" #: ../kupfer/plugin/duckduckgo.py:5 ../kupfer/plugin/duckduckgo.py:19 msgid "DuckDuckGo Search" msgstr "Wyszukiwanie w serwisie DuckDuckGo" #: ../kupfer/plugin/duckduckgo.py:8 ../kupfer/plugin/duckduckgo.py:30 msgid "Search the web securely with DuckDuckGo" msgstr "Bezpieczne wyszukiwanie w sieci za pomocą serwisu DuckDuckGo" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "Empathy" #: ../kupfer/plugin/empathy.py:6 msgid "Access to Empathy Contacts" msgstr "Dostęp do kontaktów programu Empathy" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Wyświetlanie kontaktów offline" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Dostępny" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Zaraz wracam" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Zajęty" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Nieobecny" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Niewidoczny" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Rozłączony" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:93 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:197 msgid "Open Chat" msgstr "Rozpocznij rozmowę" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:121 #: ../kupfer/plugin/skype.py:243 msgid "Change Global Status To..." msgstr "Zmień globalny stan na..." #: ../kupfer/plugin/empathy.py:171 msgid "Empathy Contacts" msgstr "Kontakty programu Empathy" #: ../kupfer/plugin/empathy.py:237 msgid "Empathy Account Status" msgstr "Stan konta programu Empathy" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Kontakty programu Evolution" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Tworzy nową wiadomość w programie Evolution" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Tworzy nową wiadomość w programie Evolution i załącza plik" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Książka adresowa programu Evolution" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Wyświetla witryny i obsługuje adresy FTP przez program Filezilla" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Otwórz witrynę za pomocą programu Filezilla" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Witryny programu Filezilla" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Witryny programu Filezilli" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Dostęp do kontaktów programu Gajim" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Chętny do rozmowy" #: ../kupfer/plugin/gajim.py:149 msgid "Gajim Contacts" msgstr "Kontakty programu Gajim" #: ../kupfer/plugin/gajim.py:213 msgid "Gajim Account Status" msgstr "Stan konta programu Gajim" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "Wyrażenie regularne" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:234 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "" "Wczytuje kontakty i umożliwia tworzenie nowych wiadomości e-mail w serwisie " "Gmail" #: ../kupfer/plugin/gmail/__init__.py:33 msgid "Load contacts' pictures" msgstr "Pobieranie obrazów kontaktów" #: ../kupfer/plugin/gmail/__init__.py:39 msgid "Load additional information" msgstr "Wczytuje dodatkowe informacje" #: ../kupfer/plugin/gmail/__init__.py:50 msgid "Work email" msgstr "Służbowy adres e-mail" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Home email" msgstr "Domowy adres e-mail" #: ../kupfer/plugin/gmail/__init__.py:52 msgid "Other email" msgstr "Inny adres e-mail" #: ../kupfer/plugin/gmail/__init__.py:54 msgid "Work address" msgstr "Adres służbowy" #: ../kupfer/plugin/gmail/__init__.py:55 msgid "Home address" msgstr "Adres domowy" #: ../kupfer/plugin/gmail/__init__.py:56 msgid "Other address" msgstr "Inny adres" #: ../kupfer/plugin/gmail/__init__.py:58 msgid "Car phone" msgstr "Telefon samochodowy" #: ../kupfer/plugin/gmail/__init__.py:59 msgid "Fax" msgstr "Faks" #: ../kupfer/plugin/gmail/__init__.py:61 msgid "Home phone" msgstr "Telefon domowy" #: ../kupfer/plugin/gmail/__init__.py:62 msgid "Home fax" msgstr "Faks domowy" #: ../kupfer/plugin/gmail/__init__.py:63 msgid "Internal phone" msgstr "Telefon wewnętrzny" #: ../kupfer/plugin/gmail/__init__.py:64 msgid "Mobile" msgstr "Komórka" #: ../kupfer/plugin/gmail/__init__.py:65 msgid "Other" msgstr "Inne" #: ../kupfer/plugin/gmail/__init__.py:66 msgid "VOIP" msgstr "VoIP" #: ../kupfer/plugin/gmail/__init__.py:67 msgid "Work phone" msgstr "Telefon służbowy" #: ../kupfer/plugin/gmail/__init__.py:68 msgid "Work fax" msgstr "Faks służbowy" #: ../kupfer/plugin/gmail/__init__.py:93 msgid "Compose Email in Gmail" msgstr "Utwórz wiadomość e-mail w serwisie Gmail" #: ../kupfer/plugin/gmail/__init__.py:117 msgid "Open web browser and compose new email in Gmail" msgstr "" "Otwiera przeglądarkę WWW i tworzy nową wiadomość e-mail w serwisie Gmail" #: ../kupfer/plugin/gmail/__init__.py:123 msgid "Edit Contact in Gmail" msgstr "Modyfikuj kontakt w serwisie Gmail" #: ../kupfer/plugin/gmail/__init__.py:133 msgid "Open web browser and edit contact in Gmail" msgstr "Otwiera przeglądarkę WWW i modyfikuje kontakt w serwisie Gmail" #: ../kupfer/plugin/gmail/__init__.py:263 msgid "Contacts from Google services (Gmail)" msgstr "Kontakty z usług firmy Google (Gmail)" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "Profile Terminala GNOME" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "Uruchomianie profili Terminala GNOME" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Wyświetla albumy i umożliwia wysyłanie plików do serwisu Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "Wyświetlani użytkownicy (oddzieleni przecinkami):" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Pobieranie ikon użytkowników i albumów" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Wysyłanie obrazów" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Wysyłanie obrazów do serwisu Picasa Web Album" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Tworzenie albumu:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Album utworzony przez program Kupfer" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Plik:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "%(num)d album" msgstr[1] "%(num)d albumy" msgstr[2] "%(num)d albumów" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "%(num)s zdjęcie" msgstr[1] "%(num)s zdjęcia" msgstr[2] "%(num)s zdjęć" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Prześlij do albumu serwisu Picasa..." #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Przesyła pliki do albumu serwisu Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Prześlij do serwisu Picasa jako nowy album" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Towrzy album na podstawie zaznaczonego lokalnego katalogu" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Albumy serwisu Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Albumy użytkownika w serwisie Picasa" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Wyszukiwanie w serwisie Google" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Wyszukuje w serwisie Google i bezpośrednio wyświetla wyniki" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #, python-format msgid "Results for \"%s\"" msgstr "Wyniki dla \"%s\"" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Wyświetl więcej wyników dla \"%s\"" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "Odnaleziono razem: %s" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "Przeglądanie i tworzenie nowych zadań w programie GTG" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "do: %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "początek: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "etykiety: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Otwiera zadanie w programie Getting Things GNOME" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Usuń" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Trwale usuwa to zadanie" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Wykonane" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Oznacza zadanie jako wykonane" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Pomiń" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Oznacza zadanie jako zadanie do pominięcia" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Utwórz zadanie" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Tworzy nowe zadanie w programie Getting Things GNOME" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "Gwibber" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" "Mikroblogowanie za pomocą programu Gwibber. Umożliwia wysyłanie i odbieranie " "wiadomości z sieci społecznych, takich jak Twitter, Identi.ca itd. Wymaga " "pakietu \"gwibber-service\"." #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "Maksymalna liczba wiadomości do wyświetlania" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s w serwisie %(service)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s w serwisie %(where)s" #: ../kupfer/plugin/gwibber.py:187 msgid "Send Message" msgstr "Wyślij wiadomość" #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "Wysyła wiadomość do wszystkich kont programu Gwibber" #: ../kupfer/plugin/gwibber.py:210 msgid "Send Message To..." msgstr "Wyślij wiadomość do..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "Wysyła wiadomość do kont programu Gwibber" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Wyślij wiadomość..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "Wysyła wiadomość do zaznaczonego konta programu Gwibber" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Odpowiedz..." #: ../kupfer/plugin/gwibber.py:314 msgid "Delete Message" msgstr "Usuń wiadomość" #: ../kupfer/plugin/gwibber.py:337 msgid "Send Private Message..." msgstr "Wyślij prywatną wiadomość..." #: ../kupfer/plugin/gwibber.py:370 msgid "Send direct message to user" msgstr "Wysyła bezpośrednią wiadomość do użytkownika" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "Prześlij dalej" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet To..." msgstr "Prześlij dalej do..." #: ../kupfer/plugin/gwibber.py:407 msgid "Retweet message to all Gwibber accounts" msgstr "Przesyła wiadomość do wszystkich kont programu Gwibber" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "Przesyła wiadomość do konta programu Gwibber" #: ../kupfer/plugin/gwibber.py:413 msgid "Open in Browser" msgstr "Otwórz w przeglądarce" #: ../kupfer/plugin/gwibber.py:419 msgid "Open message in default web browser" msgstr "Otwiera wiadomość w domyślnej przeglądarce" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 msgid "Gwibber Accounts" msgstr "Konta programu Gwibber" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "Konta skonfigurowane w programie Gwibber" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "Wiadomości programu Gwibber" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "Ostatnie wiadomości odebrane przez program Gwibber" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "Wiadomości programu Gwibber dla serwisu %s" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "Strumienie programu Gwibber" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "Strumienie skonfigurowane w programie Gwibber" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "Wiadomości programu Gwibber w strumieniu %s" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "Gwibber (prosty)" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "Wysyła aktualizacje przez klienta mikroblogowania Gwibber" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "Wyślij aktualizację" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "Nie można aktywować serwisu Gwibber" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Wysokopoziomowe działania" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Narzędzia do pracy z poleceniami jako obiektami" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Wybierz w programie Kupfer" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Wyniki dla %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Uruchom (pobierz rezultat)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Użyje wynik polecenia jako obiekt pośredniczący" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Uruchom (porzuć rezultat)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Narzędzia do obrazów" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Narzędzia do przekształcania plików graficznych" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Skaluj..." #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Dopasowuje obraz do wybranego rozmiaru w pikselach" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Obróć zgodnie z ruchem wskazówek zegara" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Obróć odwrotnie do ruchu wskazówek zegara" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Obróć automatycznie" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Obróć plik JPEG zgodnie z jego danymi EXIF" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Wtyczki programu Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Dostęp do listy wtyczek programu Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Wyświetl informacje" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Wyświetl kod źródłowy" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "włączona" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Znajdź pliki" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Przeszukuje system plików za pomocą programu locate" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Ignorowanie wielkości liter podczas wyszukiwania plików" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "OpenOffice.org/LibreOffice" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Ostatnio używane dokumenty programu OpenOffice.org/LibreOffice" #: ../kupfer/plugin/openoffice.py:83 msgid "OpenOffice/LibreOffice Recent Items" msgstr "Ostatnie dokumenty programu OpenOffice.org/LibreOffice" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera Mail" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Kontakty i działania programu Opera Mail" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Tworzy nową wiadomość w programie Opera Mail" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Kontakty programu Opera Mail" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Kontakty z książki adresowej Opera Mail" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Zakładki programu Opera" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Indeks zakładek programu Opera" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Dostęp do kontaktów programu Pidgin" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d znak)" msgstr[1] "%s (%d znaki)" msgstr[2] "%s (%d znaków)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Kontakty programu Pidgin" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "Sesje programu PuTTY" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Szybki dostęp do sesji programu PuTTY" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Uruchom sesję" #: ../kupfer/plugin/qsicons/__init__.py:24 msgid "Quicksilver Icons" msgstr "Ikony Quicksilver" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "Szybki podgląd obrazów" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "Wyświetl obraz" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "reStructuredText" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "Renderuje pliki w formacie reStructuredText i wyświetla wynik" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Wyświetl jako dokument HTML" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "Aktywuj sesje GNU Screen" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Podłączone" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Odłączone" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "Sesja %(status)s (%(pid)s) utworzona %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Sesje programu Screen" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Podłącz" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:52 msgid "Send Keys" msgstr "Wyślij klawisz" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "Wysyła sztuczne naciśnięcie klawiszy używając programu xautomation" #: ../kupfer/plugin/sendkeys.py:28 msgid "Paste to Foreground Window" msgstr "Wyślij do okna na wierzchu" #: ../kupfer/plugin/sendkeys.py:46 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "Skopiuj do schowka i wyślij Ctrl+V do okna na wierzchu" #: ../kupfer/plugin/sendkeys.py:101 msgid "Send keys to foreground window" msgstr "Wysyła klawisze do okna na wierzchu" #: ../kupfer/plugin/sendkeys.py:106 msgid "Type Text" msgstr "Napisz tekst" #: ../kupfer/plugin/sendkeys.py:127 msgid "Type the text to foreground window" msgstr "\"Napisanie\" tekstu w oknie na wierzchu" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Usługi systemowe" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "" "Uruchamia, zatrzymuje lub ponownie uruchamia usługi systemowe przez skrypty " "inicjacyjne" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Polecenie podobne do sudo" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Uruchom usługę" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Uruchom ponownie usługę" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Zatrzymaj usługę" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "Usługa %s" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Skróć linki" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Tworzenie skrótów do długich adresów URL" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Błąd" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Skróć za pomocą..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Usługi" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 msgid "Show QRCode" msgstr "Wyświetl QRCode" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 msgid "Display text as QRCode in a window" msgstr "Wyświetla tekst jako QRCode w oknie" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Dostęp do kontaktów programu Skype" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skype Me" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Wylogowano" #: ../kupfer/plugin/skype.py:179 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:218 msgid "Call" msgstr "Zadzwoń" #: ../kupfer/plugin/skype.py:232 msgid "Place a call to contact" msgstr "Nawiązuje połączenie z kontaktem" #: ../kupfer/plugin/skype.py:267 msgid "Skype Contacts" msgstr "Kontakty programu Skype" #: ../kupfer/plugin/skype.py:287 msgid "Skype Statuses" msgstr "Stany programu Skype" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "Komputery SSH" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "Dodaje komputery SSH odnalezione w ~/.ssh/config." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "Komputer SSH" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Połącz" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "Łączy z komputerem SSH" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "Komputery SSH określone w ~/.ssh/config" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Brak połączenia usługi D-Bus do sesji pulpitu" #: ../kupfer/plugin_support.py:171 msgid "GNOME Keyring" msgstr "Baza kluczy GNOME" #: ../kupfer/plugin_support.py:172 msgid "KWallet" msgstr "KWallet" #: ../kupfer/plugin_support.py:173 msgid "Unencrypted File" msgstr "Niezaszyfrowany plik" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Szablony dokumentów" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Tworzy nowe dokumenty na podstawie szablonów" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "Szablon %s" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Pusty plik" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Pusty katalog" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Utwórz nowy dokument..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Tworzy nowy dokument na podstawie szablonu" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Utwórz dokument w..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "Pliki tekstowe" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Dopisz do..." #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Dopisz..." #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Zapisz do..." #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Pobiera zawartość pliku tekstowego" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:185 #: ../kupfer/plugin/thunar.py:225 ../kupfer/plugin/thunar.py:278 #: ../kupfer/plugin/thunar.py:329 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:11 msgid "File manager Thunar actions" msgstr "Działania menedżera plików Thunar" #: ../kupfer/plugin/thunar.py:67 msgid "Select in File Manager" msgstr "Zaznacz w menedżerze plików" #: ../kupfer/plugin/thunar.py:95 msgid "Show Properties" msgstr "Wyświetl właściwości" #: ../kupfer/plugin/thunar.py:118 msgid "Show information about file in file manager" msgstr "Wyświetla informacje o pliku w menedżerze plików" #: ../kupfer/plugin/thunar.py:127 msgid "Send To..." msgstr "Wyślij do..." #: ../kupfer/plugin/thunar.py:259 msgid "Symlink In..." msgstr "Utwórz dowiązanie symboliczne..." #: ../kupfer/plugin/thunar.py:300 msgid "Create a symlink to file in a chosen location" msgstr "Tworzy dowiązanie symboliczne do wybranego położenia" #: ../kupfer/plugin/thunar.py:304 msgid "Empty Trash" msgstr "Opóźnij kosz" #: ../kupfer/plugin/thunar.py:344 msgid "Thunar Send To Objects" msgstr "Obiekty \"Wyślij do\" programu Thunar" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Kontakty i działania programu Thunderbird/Icedove" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Tworzy nową wiadomość w programie Thunderbird" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Książka adresowa programu Thunderbird" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Kontakty z książki adresowej programu Thunderbird" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Top" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Wyświetla uruchomione zadania i umożliwia wysłanie sygnałów do nich" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Kolejność porządkowania" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Wiersz poleceń" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "Użycie procesora (malejąco)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Użycie pamięci (malejąco)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Wyślij sygnał..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Sygnały" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Uruchomione zadania" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "PID: %(pid)s procesor: %(cpu)g%% pamięć: %(mem)g%% czas: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Uruchomione zadania bieżącego użytkownika" #: ../kupfer/plugin/tracker1.py:10 msgid "Tracker" msgstr "Tracker" #: ../kupfer/plugin/tracker1.py:18 ../kupfer/plugin/tracker.py:15 msgid "Tracker desktop search integration" msgstr "Integracja z programem Tracker" #: ../kupfer/plugin/tracker1.py:49 ../kupfer/plugin/tracker.py:41 msgid "Search in Tracker" msgstr "Znajdź w programie Tracker" #: ../kupfer/plugin/tracker1.py:54 ../kupfer/plugin/tracker.py:46 msgid "Open Tracker Search Tool and search for this term" msgstr "Otwiera narzędzie Tracker i wyszukuje to wyrażenie" #: ../kupfer/plugin/tracker1.py:62 ../kupfer/plugin/tracker.py:55 msgid "Get Tracker Results..." msgstr "Pobierz wyniki programu Tracker..." #: ../kupfer/plugin/tracker1.py:71 ../kupfer/plugin/tracker.py:64 msgid "Show Tracker results for query" msgstr "Wyświetla wyniki wyszukiwania programu Tracker dla zapytania" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Etykiety programu Tracker" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Etykiety programu Tracker" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Przegląda etykiety programu Tracker" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "Etykieta %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Obiekty zawierające etykietę %s w programie Tracker" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Dodaj etykietę..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Dodaje etykietę programu Tracker do pliku" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Usuń etykietę..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Usuwa etykietę programu Tracker z pliku" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Woluminy z historii programu TrueCrypt" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "Wolumin programu TrueCrypt: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Zamontuj wolumin" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Zamontuj w programie TrueCrypt" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Próbuje zamontować plik jako wolumin programu TrueCrypt" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Odmontuj wszystkie woluminy" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "Woluminy programu TrueCrypt" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Klient usług terminala" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Sesje zapisane w Kliencie Usług Terminala" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "Sesje Klienta Usług Terminala" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Sesje zapisane w Kliencie Usług Terminala" #: ../kupfer/plugin/vim/__init__.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim/__init__.py:4 msgid "Recently used documents in Vim" msgstr "Ostatnio używane dokumenty w programie Vim" #: ../kupfer/plugin/vim/plugin.py:56 msgid "Vim Recent Documents" msgstr "Ostatnio używane dokumenty programu Vim" #: ../kupfer/plugin/vim/plugin.py:219 msgid "Close (Save All)" msgstr "Zamknij (zapisz wszystkie)" #: ../kupfer/plugin/vim/plugin.py:237 msgid "Send..." msgstr "Wyślij..." #: ../kupfer/plugin/vim/plugin.py:264 msgid "Send ex command" msgstr "Wysyła polecenie ex" #: ../kupfer/plugin/vim/plugin.py:272 msgid "Insert in Vim..." msgstr "Wstaw w programie Vim..." #: ../kupfer/plugin/vim/plugin.py:309 msgid "Active Vim Sessions" msgstr "Aktywuj sesje programu Vim" #: ../kupfer/plugin/vim/plugin.py:338 #, python-format msgid "Vim Session %s" msgstr "Sesja programu Vim %s" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Zakładki i działania programu Vinagre" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Rozpocznij sesję programu Vinagre" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Zakładki programu Vinagre" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "Kontrolowanie maszyn wirtualnych VirtualBox. Obsługuje zarówno program " "VirtualBox firmy Sun, jak i edycję Open Source." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "Wymuszenie użycia interfejsu tekstowego" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Uruchom" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Uruchom bez ekranu" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Wyślij sygnał wyłączenia" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Uruchom ponownie" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Wznów" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Zapisz stan" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Wyłącz" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "Maszyny wirtualne programu VirtualBox" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:11 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "Dostęp do stron zapisanych w programie Zim" #: ../kupfer/plugin/zim.py:30 msgid "Page names start with :colon" msgstr "Nazwy stron rozpoczynają się od dwukropka" #: ../kupfer/plugin/zim.py:36 msgid "Default page name for quick notes" msgstr "Domyślna nazwa strony dla szybkich notatek" #: ../kupfer/plugin/zim.py:38 #, python-format msgid "Note %x %X" msgstr "Notatka %x %X" #: ../kupfer/plugin/zim.py:39 msgid "" "Strftime tags can be used: %H - hour, %M - minutes, etc\n" "Please check python documentation for details.\n" "NOTE: comma will be replaced by _" msgstr "" "Można używać znaczników strftime: %H - godzina, %M - minuta itp.\n" "Więcej informacji można znaleźć w dokumentacji języka Python.\n" "Uwaga: przecinki zostaną zastąpione znakiem _" #: ../kupfer/plugin/zim.py:45 msgid "Default namespace for quick notes" msgstr "Domyślna przestrzeń nazw dla szybkich notatek" #: ../kupfer/plugin/zim.py:80 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Strona programu Zim w notatniku \"%s\"" #: ../kupfer/plugin/zim.py:89 msgid "Create Zim Page" msgstr "Utwórz stronę programu Zim" #: ../kupfer/plugin/zim.py:96 msgid "Create page in default notebook" msgstr "Tworzy stronę w domyślnym notatniku" #: ../kupfer/plugin/zim.py:108 msgid "Create Zim Page In..." msgstr "Utwórz stronę programu Zim w..." #: ../kupfer/plugin/zim.py:132 msgid "Insert QuickNote into Zim" msgstr "Wstaw szybką notatkę do programu Zim" #: ../kupfer/plugin/zim.py:142 msgid "Quick note selected text into Zim notebook" msgstr "Tworzy notatkę z zaznaczonego tekstu w notatniku programu Zim" #: ../kupfer/plugin/zim.py:191 msgid "Create Subpage..." msgstr "Utwórz podstronę..." #: ../kupfer/plugin/zim.py:370 msgid "Zim Notebooks" msgstr "Notatniki programu Zim" #: ../kupfer/plugin/zim.py:387 msgid "Zim Pages" msgstr "Strony programu Zim" #: ../kupfer/plugin/zim.py:415 msgid "Pages stored in Zim Notebooks" msgstr "Strony w notatnikach programu Zim" kupfer-v208/po/pt.po000066400000000000000000002414531176220042200144550ustar00rootroot00000000000000# Portuguese translation for the kupfer package # Traducção para Português de Kupfer # Copyright (C) 2009 Ulrik Sverdrup # This file is distributed under the same license as the kupfer package. (GPLv3) # Ulrik Sverdrup , 2009. # msgid "" msgstr "" "Project-Id-Version: kupfer beta\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2011-04-14 21:40+0200\n" "PO-Revision-Date: 2009-09-05 20:19+0200\n" "Last-Translator: Carlos Pais \n" "Language-Team:\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "Lançador de Aplicações" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "Ferramenta conveniente para acesso e gestão de aplicações e documentos" #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer-exec.desktop.in.h:1 #, fuzzy msgid "Execute in Kupfer" msgstr "Seleccionar no Kupfer" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Início" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:150 msgid "Catalog" msgstr "Catálogo" #: ../data/preferences.ui.h:5 #, fuzzy msgid "Desktop Environment" msgstr "Aplicações para Ambiente Gráfico" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "" #: ../data/preferences.ui.h:7 msgid "General" msgstr "Geral" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "" #: ../data/preferences.ui.h:9 #, fuzzy msgid "Inclusion in Top Level Searches" msgstr "Incluir músicas no nível superior" #: ../data/preferences.ui.h:10 #, fuzzy msgid "Indexed Folders" msgstr "Abrir pasta" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Preferências de Kupfer" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "Extensões" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:844 msgid "Reset" msgstr "" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "Apresentar ícone na área de notificação" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "Iniciar automaticamente no início da sessão" #: ../data/preferences.ui.h:19 #, fuzzy msgid "Terminal emulator:" msgstr "Abrir Terminal Aqui" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "" #: ../data/credentials_dialog.ui.h:4 #, fuzzy msgid "_User:" msgstr "Uso:" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "Atalho de teclado não encontrado" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "não apresentar interface principal ao iniciar" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "listar extensões disponíveis:" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "activar mensagens de depuração" #: ../kupfer/main.py:46 msgid "run keyboard shortcut relay service on this display" msgstr "" #: ../kupfer/main.py:49 msgid "show usage help" msgstr "Apresentar ajuda" #: ../kupfer/main.py:50 msgid "show version information" msgstr "Apresentar versão da aplicação" #: ../kupfer/main.py:56 #, fuzzy msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Utilização: kupfer [OPÇÕES | PESQUISA]" #: ../kupfer/main.py:67 msgid "Available plugins:" msgstr "Extensões disponíveis:" #: ../kupfer/main.py:114 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 #, fuzzy msgid "Alternate Activate" msgstr "Criar Arquivo" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 #, fuzzy msgid "Compose Command" msgstr "Compor Novo Email" #: ../kupfer/ui/accelerators.py:11 #, fuzzy msgid "Mark Default Action" msgstr "Escolher Aplicação por Omissão..." #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "" #: ../kupfer/ui/accelerators.py:14 #, fuzzy msgid "Select Quit" msgstr "Texto seleccionado" #: ../kupfer/ui/accelerators.py:15 #, fuzzy msgid "Select Selected File" msgstr "Ficheiro Seleccionado" #: ../kupfer/ui/accelerators.py:16 #, fuzzy msgid "Select Selected Text" msgstr "Texto seleccionado" #: ../kupfer/ui/accelerators.py:17 #, fuzzy msgid "Show Help" msgstr "Apresentar Texto" #: ../kupfer/ui/accelerators.py:18 #, fuzzy msgid "Show Preferences" msgstr "Preferências de Kupfer" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s está vazio" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "Sem resultados em %(src)s para \"%(query)s\"" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Sem resultados" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Escrever p/ buscar" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Escrever p/ buscar %s" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Sem acção" #: ../kupfer/ui/browser.py:1461 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1471 #, python-format msgid "Forget About \"%s\"" msgstr "" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1903 ../kupfer/ui/preferences.py:58 #, fuzzy msgid "Show Main Interface" msgstr "Apresentar contactos desligados" #: ../kupfer/ui/preferences.py:59 #, fuzzy msgid "Show with Selection" msgstr "Usar a aplicação" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Descrição" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Autor" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Versão" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Módulo de Python '%s' é necessário" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Plugin não pode ser lido devido ao erro:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "desactivado" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Conteúdo de" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Fontes" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Acções" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:589 msgid "Configuration" msgstr "Configuração" #: ../kupfer/ui/preferences.py:609 msgid "Set username and password" msgstr "" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:663 msgid "Choose a Directory" msgstr "Escolha um Directório" #: ../kupfer/ui/preferences.py:842 msgid "Reset all shortcuts to default values?" msgstr "" #: ../kupfer/ui/preferences.py:850 ../kupfer/plugin/custom_terminal.py:12 #, fuzzy msgid "Command" msgstr "Linha de Comandos" #: ../kupfer/ui/preferences.py:851 msgid "Shortcut" msgstr "" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "Carlos Pais " #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Um lançador de aplicações livre (GPLv3+)" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Kupfer é uma aplicação livre; pode redistribuí-la e/ou alterá-la sob os " "termos\n" "da Licença Pública Geral GNU tal como publicada pela Free Software\n" "Foundation; ou a versão 3 da Licença ou, (à sua discrição) qualquer versão\n" "posterior.\n" "\n" "Kupfer é distribuído na expectativa de que será útil, mas SEM QUALQUER\n" "GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE ou ADEQUAÇÃO A\n" "UM PROPÓSITO ESPECÍFICO. Consulte a Licença Pública Genérica GNU para mais\n" "detalhes.\n" "\n" "Deverá ter recebido uma cópia da Licença Pública Genérica GNU juntamente " "com\n" "o Kupfer; caso contrário, escreva para Free Software Foundation, Inc., 59\n" "Temple Place, Suite 330, Boston, MA 02111-1307 USA (em inglês)\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 #, fuzzy msgid "Text" msgstr "Apresentar Texto" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Executar após..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Executar comando depois de um intervalo de tempo especificado" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Múltiplos Objectos" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "objecto %s" msgstr[1] "objectos %s" #: ../kupfer/obj/contacts.py:87 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:107 msgid "Open" msgstr "Abrir" #: ../kupfer/obj/fileactions.py:43 #, fuzzy, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Escolher aplicação por omissão para abrir este tipo de ficheiro" #: ../kupfer/obj/fileactions.py:45 #, fuzzy, python-format msgid "Please use \"%s\"" msgstr "Ficheiro Seleccionado \"%s\"" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Escolher Aplicação por Omissão..." #: ../kupfer/obj/fileactions.py:71 #, fuzzy msgid "Open with default application" msgstr "Abrir com qualquer aplicação" #: ../kupfer/obj/fileactions.py:77 msgid "Reveal" msgstr "Apresentar" #: ../kupfer/obj/fileactions.py:86 msgid "Open parent folder" msgstr "Abrir pasta pai" #: ../kupfer/obj/fileactions.py:92 msgid "Open Terminal Here" msgstr "Abrir Terminal Aqui" #: ../kupfer/obj/fileactions.py:105 msgid "Open this location in a terminal" msgstr "Abrir esta localização numa consola" #: ../kupfer/obj/fileactions.py:113 msgid "Run in Terminal" msgstr "Executar na Consola" #: ../kupfer/obj/fileactions.py:113 msgid "Run (Execute)" msgstr "Executar" #: ../kupfer/obj/fileactions.py:133 msgid "Run this program in a Terminal" msgstr "Executar esta aplicação numa Consola" #: ../kupfer/obj/fileactions.py:135 msgid "Run this program" msgstr "Executar esta aplicação" #: ../kupfer/obj/objects.py:248 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 msgid "Go To" msgstr "Ir Para" #: ../kupfer/obj/objects.py:274 msgid "Open URL" msgstr "Abrir URL" #: ../kupfer/obj/objects.py:285 msgid "Open URL with default viewer" msgstr "Abrir URL com navegador por omissão" #: ../kupfer/obj/objects.py:299 msgid "Launch" msgstr "Iniciar" #: ../kupfer/obj/objects.py:312 msgid "Show application window" msgstr "Apresentar janela da aplicação" #: ../kupfer/obj/objects.py:313 msgid "Launch application" msgstr "Iniciar aplicação" #: ../kupfer/obj/objects.py:324 msgid "Launch Again" msgstr "Iniciar de novo" #: ../kupfer/obj/objects.py:331 msgid "Launch another instance of this application" msgstr "Iniciar outra instância desta aplicação" #: ../kupfer/obj/objects.py:337 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Fechar" #: ../kupfer/obj/objects.py:345 #, fuzzy msgid "Attempt to close all application windows" msgstr "Tentativa para fechar todas as janelas de aplicações" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:392 msgid "Run" msgstr "Executar" #: ../kupfer/obj/objects.py:402 msgid "Perform command" msgstr "Realizar acção" #: ../kupfer/obj/objects.py:416 #, fuzzy msgid "(Empty Text)" msgstr "Ficheiro Vazio" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:432 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "\"%(text)s\"" msgstr[1] "(%(num)d lineas) \"%(text)s\"" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s et. al." #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Fonte recursiva de %(dir)s, (%(levels)d níveis)" #: ../kupfer/obj/sources.py:103 #, python-format msgid "Directory source %s" msgstr "Directório fonte %s" #: ../kupfer/obj/sources.py:113 msgid "Home Folder" msgstr "Pasta Pessoal" #: ../kupfer/obj/sources.py:124 msgid "Catalog Index" msgstr "Índice de Catálogo" #: ../kupfer/obj/sources.py:139 msgid "An index of all available sources" msgstr "Um índice de todas as fontes disponíveis" #: ../kupfer/obj/sources.py:170 msgid "Root catalog" msgstr "Catálogo Raíz" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "" #: ../kupfer/obj/special.py:32 #, fuzzy, python-format msgid "Invalid user credentials for %s" msgstr "Documentos Recientes para %s" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "" #: ../kupfer/plugin/core/alternatives.py:13 #, fuzzy msgid "GNOME Terminal" msgstr "Abrir Terminal Aqui" #: ../kupfer/plugin/core/alternatives.py:22 #, fuzzy msgid "XFCE Terminal" msgstr "Executar na Consola" #: ../kupfer/plugin/core/alternatives.py:31 #, fuzzy msgid "LXTerminal" msgstr "Executar na Consola" #: ../kupfer/plugin/core/alternatives.py:40 #, fuzzy msgid "X Terminal" msgstr "Executar na Consola" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 #, fuzzy msgid "Save As..." msgstr "Redimensionar" #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Sair" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Fechar Kupfer" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "Sobre Kupfer" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Apresentar informação sobre os autores de Kupfer e licença" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Ajuda do Kupfer" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Buscar ajuda para Kupfer" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Apresentar janela de preferências de Kupfer" #: ../kupfer/plugin/core/__init__.py:65 msgid "Search Contents" msgstr "Procurar conteúdo" #: ../kupfer/plugin/core/__init__.py:83 msgid "Search inside this catalog" msgstr "Procurar dentro do catálogo" #: ../kupfer/plugin/core/__init__.py:91 msgid "Copy" msgstr "Copiar" #: ../kupfer/plugin/core/__init__.py:106 msgid "Copy to clipboard" msgstr "Copiar para a área de transferência" #: ../kupfer/plugin/core/__init__.py:128 msgid "Rescan" msgstr "Redigitalizar" #: ../kupfer/plugin/core/__init__.py:143 msgid "Force reindex of this source" msgstr "Forçar reindexação desta fonte" #: ../kupfer/plugin/core/selection.py:8 ../kupfer/plugin/core/selection.py:36 msgid "Selected Text" msgstr "Texto seleccionado" #: ../kupfer/plugin/core/selection.py:23 #, python-format msgid "Selected Text \"%s\"" msgstr "Texto seleccionado \"%s\"" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Último Comando" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Objectos Internos de Kupfer" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "" #: ../kupfer/plugin/core/internal.py:66 #, fuzzy msgid "Command Results" msgstr "Linha de Comandos" #: ../kupfer/plugin/archivemanager.py:1 msgid "Archive Manager" msgstr "" #: ../kupfer/plugin/archivemanager.py:9 msgid "Use Archive Manager actions" msgstr "" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Tipo de formato de compressão para 'Criar arquivo em'" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Extrair Aqui" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Extrair arquivo comprimido" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Criar Arquivo" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Criar arquivo comprimido da pasta" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Criar Arquivo Em..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 #, fuzzy msgid "Archive" msgstr "Criar Arquivo" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Aplicações" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Todas as Aplicações e preferências" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Aplicações para Ambiente Gráfico" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Abrir com..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Abrir com qualquer aplicação" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Escolher aplicação por omissão para abrir este tipo de ficheiro" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Calculadora" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Calcular expressões começadas por '='" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Calcular" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:71 msgid "Clipboards" msgstr "Elementos na Área de Transferência" #: ../kupfer/plugin/clipboard.py:4 ../kupfer/plugin/clipboard.py:111 msgid "Recent clipboards" msgstr "Elementos recentes na Área de Transferência" #: ../kupfer/plugin/clipboard.py:20 msgid "Number of recent clipboards" msgstr "Número de elementos recentes na área de transferência" #: ../kupfer/plugin/clipboard.py:26 #, fuzzy msgid "Include recent selections" msgstr "Fornece a selecção actual" #: ../kupfer/plugin/clipboard.py:32 #, fuzzy msgid "Copy selection to primary clipboard" msgstr "Copiar para a área de transferência" #: ../kupfer/plugin/clipboard.py:44 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "área de transferência \"%(desc)s\"" msgstr[1] "área de transferência com %(num)d linhas \"%(desc)s\"" #: ../kupfer/plugin/clipboard.py:51 #, fuzzy msgid "Clear" msgstr "Apagar lista de espera" #: ../kupfer/plugin/clipboard.py:63 #, fuzzy msgid "Remove all recent clipboards" msgstr "Número de elementos recentes na área de transferência" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Comandos de consola" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" #: ../kupfer/plugin/commands.py:41 #, fuzzy msgid "Run (Get Output)" msgstr "Executar" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 #, fuzzy msgid "Pass to Command..." msgstr "Último Comando" #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 #, fuzzy msgid "Write to Command..." msgstr "Traduzir Para..." #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 msgid "Run program and supply text on the standard input" msgstr "" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "" #: ../kupfer/plugin/commands.py:215 #, fuzzy msgid "Run command-line programs" msgstr "Executar aplicações de consola" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Dicionário" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Procurar palavra em dicionário" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Procurar" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Documentos" #: ../kupfer/plugin/documents.py:4 #, fuzzy msgid "Recently used documents and bookmarked folders" msgstr "Documentos recentemente utilizados em Abiword" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "No. máximo de dias para documentos recientes" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Itens Recentes" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Documentos usados recentemente" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "%s Documentos" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Documentos Recientes para %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Locais" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Marcadores de Epiphany" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Índice de marcadores de Epiphany" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Favoritos" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "" "Marcar itens normalmente usados e armazenar objectos para uso posterior" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "Prateleira de itens favoritos" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Adicionar aos Favoritos" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Adicionar item à prateleira dos favoritos" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Eliminar dos Favoritos" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Eliminar item da prateleira dos favoritos" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Acções sobre ficheiros" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Mais acções sobre ficheiros" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:210 msgid "Move To..." msgstr "Mover Para..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:252 msgid "Move file to new location" msgstr "Mover ficheiro para nova localização" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Renomear Para..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:165 msgid "Copy To..." msgstr "Copiar Para..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:206 msgid "Copy file to a chosen location" msgstr "Copiar ficheiro para uma localização escolhida" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Marcadores do Firefox" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Índice de Marcadores do Firefox" #: ../kupfer/plugin/firefox.py:26 #, fuzzy msgid "Include visited sites" msgstr "Incluir artistas no nível superior" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Ficheiro Seleccionado" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" "Fornece a selecção actual do nautilus, ao usar a Extensão Nautilus do Kupfer" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Ficheiro Seleccionado \"%s\"" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Ficheiros Seleccionado" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Notas" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Notas de Gnote ou Tomboy" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Usar a aplicação" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Abrir com aplicação de notas" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Agregar à Nota..." #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Adicionar texto a nota existente" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Criar Nota" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Criar uma nova nota a partir deste texto" #: ../kupfer/plugin/notes.py:160 #, fuzzy msgid "Get Note Search Results..." msgstr "Obter resultados de Tracker..." #: ../kupfer/plugin/notes.py:173 #, fuzzy msgid "Show search results for this query" msgstr "Apresentar resultados de Tracker para consulta" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "hoje, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "ontem, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Última actualização %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "" "Reproduzir e pôr em fila de espera músicas e navegar a biblioteca de música" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Incluir artistas no nível superior" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Incluir album no nível superior" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Incluir músicas no nível superior" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Reproduzir" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Continuar reprodução no Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Pausar" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Pausar reprodução no Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Seguinte" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Saltar para a faixa seguinte no Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Anterior" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Saltar para a faixa anterior no Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Apresentar a Reproduzir" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Apresentar que música se está reproduzir actualmente" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Apagar lista de espera" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Reproduzir faixas no Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Colocar em fila de espera" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Adicionar faixas à lista de reprodução" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "por %(artist)s de %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "por %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Faixas por %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Albúns" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Albumes en la Libreria de Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Artista" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Artistas na biblioteca do Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Músicas" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Músicas na biblioteca do Rhythmbox" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "" #: ../kupfer/plugin/session_gnome.py:3 #, fuzzy msgid "Special items and actions for GNOME environment" msgstr "Itens e acções especiais para XFCE" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Terminar sessão..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Terminar sessão ou alternar utilizador" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Desligar..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Desligar, reiniciar ou suspender o computador" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Trancar ecrã" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Iniciar protecção de ecrã e trancar" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Itens e acções especiais para XFCE" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Apresentar Texto" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:52 msgid "Display text in a window" msgstr "Apresentar texto numa janela" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Tipo Grande" #: ../kupfer/plugin/show_text.py:60 msgid "Show Notification" msgstr "Apresentar Notificação" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Lixo" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Aceder ao conteúdo do lixo" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Mover para Lixo" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Mover este ficheiro para Lixo" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Restaurar" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Mover ficheiro para localização original" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "O Lixo está vazio" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "O Lixo contém um ficheiro" msgstr[1] "O Lixo contém %(num)s ficheiros" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "" #: ../kupfer/plugin/triggers.py:6 #, fuzzy msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Designar atalhos globais (triggers) a objectos criados com 'Compose " "Comando' (Ctrl+Return)." #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Adicionar Trigger..." #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Eliminar Trigger..." #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "Acções de URL" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Descarregar e Abrir" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Descarregar para..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "Descarregar URL numa localização escolhida" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Unidades" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Unidades montadas" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Unidade montada em %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Desmontar" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Desmontar este volume" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Ejectar" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Desmontar e ejectar esta média" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Procurar na Web" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Procurar na Web com os motores de pesquisa OpenSearch" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Procurar com..." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Procurar Por..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Motores de Pesquisa" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Procurar na Wikipedia" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Linguagem da Wikipedia" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "pt" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Procurar por este termo em %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Lista de Janelas" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Todas as janelas em todas as áreas de trabalho" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Activar" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Com sombra" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Sem sombra" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Minimizar" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Restaurar" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Maximizar" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Restaurar" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Maximizar Verticamente" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Restaurar Verticalmente" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Janelas em %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Janela Mais no Topo" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Saltar para a área de trabalho desta janela e focar" #: ../kupfer/plugin/windows.py:252 #, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "" msgstr[1] "" #: ../kupfer/plugin/windows.py:256 #, fuzzy msgid "Active workspace" msgstr "Saltar para esta a área de trabalho" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Saltar para esta a área de trabalho" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Área de trabalho" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Documentos recentemente utilizados em Abiword" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Itens Recentes de Abiword" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Interface com o gestor de pacotes APT" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Método de Instalação" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Apresentar Informação do Pacote" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Instalar" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Instalar pacote usando o método configurado" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Pacotes correspondentes \"%s\"" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Procurar Nome de um Pacote..." #: ../kupfer/plugin/archiveinside.py:8 #, fuzzy msgid "Deep Archives" msgstr "Criar Arquivo" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "" #: ../kupfer/plugin/archiveinside.py:49 #, fuzzy, python-format msgid "Content of %s" msgstr "Conteúdo de" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Controlar a lista e reprodução do Audacious " #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Adicionar faixas à lista de reprodução do Audacious" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Tirar da fila de espera" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Remover faixa da lista de reprodução de Audacious" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Saltar para a faixa no Audacious" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Continuar reprodução no Audacious" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Pausar reprodução no Audacious" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Saltar para a faixa seguinte no Audacious" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Saltar para a faixa anterior no Audacious" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Apagar a lista de espera de Audacious" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Misturar" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Activar Misturar no Audacious" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Repetir" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Activar repetição no Audacious" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Lista de Reprodução" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Marcadores do Chromium" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Índice dos Marcadores do Chromium" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Contactos e acções do Claws Mail" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Compor Novo Email" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Compor Novo Email com Claws Mail" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Receber Todos os Emails" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "Receber novas mensagens de todos os contactos do Claws Mail" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "Compor Novo Email" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "Enviar Email Para..." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Compor nova mensagem no Claws Mail e adicionar ficheiro" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Livro de Endereços do Claws Mail" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Contactos da Livro de Endereços do Claws Mail " #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 #, fuzzy msgid "Custom Terminal" msgstr "Executar na Consola" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "" #: ../kupfer/plugin/custom_terminal.py:18 #, fuzzy msgid "Execute flag" msgstr "Seleccionar no Kupfer" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Cliente Email por Omissão" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "Compor email usando o mailto: padrão do sistema" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Procurar em Devhelp" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "" #: ../kupfer/plugin/empathy.py:6 #, fuzzy msgid "Access to Empathy Contacts" msgstr "Aceder aos Contactos do Gajim" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Apresentar contactos desligados" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Disponível" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Ausente" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Ocupado" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Não disponível" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Invisível" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Desligado" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:90 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:204 msgid "Open Chat" msgstr "Abrir Conversação" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:118 #: ../kupfer/plugin/skype.py:250 msgid "Change Global Status To..." msgstr "Mudar Estado Global Para..." #: ../kupfer/plugin/empathy.py:171 #, fuzzy msgid "Empathy Contacts" msgstr "Contactos do Gajim" #: ../kupfer/plugin/empathy.py:237 #, fuzzy msgid "Empathy Account Status" msgstr "Estado da Conta do Gajim" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 #, fuzzy msgid "Evolution contacts" msgstr "Apresentar contactos desligados" #: ../kupfer/plugin/evolution.py:31 #, fuzzy msgid "Compose a new message in Evolution" msgstr "Compor Novo Email com Claws Mail" #: ../kupfer/plugin/evolution.py:92 #, fuzzy msgid "Compose new message in Evolution and attach file" msgstr "Compor nova mensagem no Claws Mail e adicionar ficheiro" #: ../kupfer/plugin/evolution.py:100 #, fuzzy msgid "Evolution Address Book" msgstr "Livro de Endereços do Claws Mail" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Aceder aos Contactos do Gajim" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Disponível para Conversação" #: ../kupfer/plugin/gajim.py:146 msgid "Gajim Contacts" msgstr "Contactos do Gajim" #: ../kupfer/plugin/gajim.py:210 msgid "Gajim Account Status" msgstr "Estado da Conta do Gajim" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 #, fuzzy msgid "GNOME Terminal Profiles" msgstr "Perfis do Gnome Terminal" #: ../kupfer/plugin/gnome_terminal.py:3 #, fuzzy msgid "Launch GNOME Terminal profiles" msgstr "Lançar perfis do Gnome Terminal" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:144 #, fuzzy msgid "Gmail" msgstr "Gajim" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "" #: ../kupfer/plugin/gmail/__init__.py:32 msgid "Load contacts' pictures" msgstr "" #: ../kupfer/plugin/gmail/__init__.py:51 #, fuzzy msgid "Compose Email in GMail" msgstr "Compor Novo Email" #: ../kupfer/plugin/gmail/__init__.py:74 msgid "Open web browser and compose new email in GMail" msgstr "" #: ../kupfer/plugin/gmail/__init__.py:177 msgid "Contacts from Google services (Gmail)" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 #, fuzzy msgid "Google Picasa" msgstr "Google Translate" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:105 #, fuzzy msgid "Album created by Kupfer" msgstr "Sobre Kupfer" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "" msgstr[1] "" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "" msgstr[1] "" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 #, fuzzy msgid "Picasa Albums" msgstr "Albúns" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #, python-format msgid "Results for \"%s\"" msgstr "Resultados para \"%s\"" #: ../kupfer/plugin/google_search.py:91 #, fuzzy, python-format msgid "Show More Results For \"%s\"" msgstr "Resultados para \"%s\"" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "" #: ../kupfer/plugin/google_translate.py:6 msgid "Google Translate" msgstr "Google Translate" #: ../kupfer/plugin/google_translate.py:8 #: ../kupfer/plugin/google_translate.py:153 msgid "Translate text with Google Translate" msgstr "Traduzir texto com Google Translate" #: ../kupfer/plugin/google_translate.py:83 msgid "Google Translate connection timed out" msgstr "A conecção do Google Translate terminou" #: ../kupfer/plugin/google_translate.py:86 msgid "Error connecting to Google Translate" msgstr "Erro ao conectar ao Google Translate" #: ../kupfer/plugin/google_translate.py:136 #: ../kupfer/plugin/google_translate.py:223 msgid "Translate To..." msgstr "Traduzir Para..." #: ../kupfer/plugin/google_translate.py:179 #, python-format msgid "Translate into %s" msgstr "Traduzir para %s" #: ../kupfer/plugin/google_translate.py:203 msgid "Languages" msgstr "Idiomas" #: ../kupfer/plugin/google_translate.py:238 msgid "Show translated page in browser" msgstr "Apresentar página traduzida no Navegador" #: ../kupfer/plugin/google_translate.py:255 msgid "Show Translation To..." msgstr "Apresentar Tradução Para..." #: ../kupfer/plugin/google_translate.py:271 msgid "Show translation in browser" msgstr "Apresentar tradução no Navegador" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "" #: ../kupfer/plugin/gtg.py:168 #, fuzzy msgid "Create Task" msgstr "Criar Nota" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, python-format msgid "%(user)s on %(service)s" msgstr "" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "" #: ../kupfer/plugin/gwibber.py:187 #, fuzzy msgid "Send Message" msgstr "Enviar Mensagem..." #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "" #: ../kupfer/plugin/gwibber.py:210 #, fuzzy msgid "Send Message To..." msgstr "Enviar Mensagem..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Enviar Mensagem..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "" #: ../kupfer/plugin/gwibber.py:314 #, fuzzy msgid "Delete Message" msgstr "Enviar Mensagem..." #: ../kupfer/plugin/gwibber.py:337 #, fuzzy msgid "Send Private Message..." msgstr "Enviar Mensagem..." #: ../kupfer/plugin/gwibber.py:370 #, fuzzy msgid "Send direct message to user" msgstr "Enviar Mensagem..." #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "" #: ../kupfer/plugin/gwibber.py:376 #, fuzzy msgid "Retweet To..." msgstr "Renomear Para..." #: ../kupfer/plugin/gwibber.py:407 #, fuzzy msgid "Retweet message to all Gwibber accounts" msgstr "Receber novas mensagens de todos os contactos do Claws Mail" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:413 #, fuzzy msgid "Open in Browser" msgstr "Abrir pasta pai" #: ../kupfer/plugin/gwibber.py:419 #, fuzzy msgid "Open message in default web browser" msgstr "Abrir com gestor por omissão" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 #, fuzzy msgid "Gwibber Accounts" msgstr "Estado da Conta do Gajim" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Acções de alto nível" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Ferramentas para trabalhar com comandos como objectos" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Seleccionar no Kupfer" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Resultados de %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Executar (Obter Resultado)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Receber o resultado do comando como um objecto proxy" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Executar (Descartar Resultado)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Ferramentas de Imagem" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Ferramentas de Transformação de Imagem" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Redimensionar" #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Redimensionar imagem para caber num espaço dado (em pixeis)" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Rodar para Direita" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Rodar para Esquerda" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Rodar Automaticamente" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Rodar JPEG (no sítio) segundo a sua EXIF meta-data" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Extensões do Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Aceder à lista de extensões a partir do Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Apresentar Informação" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Apresentar Código Fonte" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "activado" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Procurar Ficheiros" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Procurar no sistema de ficheiros usando locate" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Não diferenciar maiúsculas de minúsculas ao procurar por ficheiros" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 #, fuzzy msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Documentos recentemente utilizados no OpenOffice" #: ../kupfer/plugin/openoffice.py:83 #, fuzzy msgid "OpenOffice/LibreOffice Recent Items" msgstr "Itens Recentes do OpenOffice" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Marcadores do Opera" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Índice de marcadores do Opera" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 #, fuzzy msgid "Opera Mail" msgstr "Claws Mail" #: ../kupfer/plugin/operamail.py:5 #, fuzzy msgid "Opera Mail contacts and actions" msgstr "Contactos e acções do Claws Mail" #: ../kupfer/plugin/operamail.py:32 #, fuzzy msgid "Compose a new message in Opera Mail" msgstr "Compor Novo Email com Claws Mail" #: ../kupfer/plugin/operamail.py:64 #, fuzzy msgid "Opera Mail Contacts" msgstr "Contactos do Gajim" #: ../kupfer/plugin/operamail.py:120 #, fuzzy msgid "Contacts from Opera Mail" msgstr "Contactos da Livro de Endereços do Claws Mail " #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Aceder aos Contactos do Gajim" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d caracter)" msgstr[1] "%s (%d caracteres)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Contactos do Pidgin" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "Sessões do PuTTy" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Acesso rápido às sessões do PuTTy" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Iniciar Sessão" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "reStructuredText" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "Renderizar reStructuredText e apresentar resultado" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Ver como Documento HTML" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "Sessões activas do GNU Screen" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Anexado" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Não anexado" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s sessão %(pid)s) criada %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Sessões de GNU Screen" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Anexar" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:49 msgid "Send Keys" msgstr "" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "" #: ../kupfer/plugin/sendkeys.py:25 msgid "Paste to Foreground Window" msgstr "" #: ../kupfer/plugin/sendkeys.py:43 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:85 msgid "Send keys to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:90 msgid "Type Text" msgstr "" #: ../kupfer/plugin/sendkeys.py:111 msgid "Type the text to foreground window" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Serviços de Sistema" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "Iniciar, parar or reiniciar serviços de sistema via init scripts" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Comando do tipo Sudo" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Iniciar Serviço" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Reinciar Serviço" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Parar Serviço" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "%s Serviço" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Encolher Links" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Criar um pequeno URL equivalente para URLs longos" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Erro" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Encurtar Com..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "%s Serviços" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 #, fuzzy msgid "Show QRCode" msgstr "Apresentar Código Fonte" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 #, fuzzy msgid "Display text as QRCode in a window" msgstr "Apresentar texto numa janela" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Aceder aos Contactos do Skype" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skype Me" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Desligado" #: ../kupfer/plugin/skype.py:183 #, python-format msgid "[%(status)s] %(userid)s" msgstr "" #: ../kupfer/plugin/skype.py:225 msgid "Call" msgstr "Telefonar" #: ../kupfer/plugin/skype.py:239 msgid "Place a call to contact" msgstr "Coloque uma chamada para contactar" #: ../kupfer/plugin/skype.py:274 msgid "Skype Contacts" msgstr "Contactos do Skype" #: ../kupfer/plugin/skype.py:294 msgid "Skype Statuses" msgstr "Estados do Skype" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "" #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Sem conecção D-Bus para o seu desktop" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Documentos" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Criar novos documentos a partir dos seus templates" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "%s template" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Ficheiro Vazio" #: ../kupfer/plugin/templates.py:47 #, fuzzy msgid "New Folder" msgstr "Abrir pasta" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Criar Novo Documento..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Criar um novo documento a partir de um template" #: ../kupfer/plugin/templates.py:103 #, fuzzy msgid "Create Document In..." msgstr "Criar Novo Documento..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "" #: ../kupfer/plugin/textfiles.py:51 #, fuzzy msgid "Append To..." msgstr "Agregar à Nota..." #: ../kupfer/plugin/textfiles.py:75 #, fuzzy msgid "Append..." msgstr "Agregar à Nota..." #: ../kupfer/plugin/textfiles.py:79 #, fuzzy msgid "Write To..." msgstr "Traduzir Para..." #: ../kupfer/plugin/textfiles.py:111 #, fuzzy msgid "Get Text Contents" msgstr "Procurar conteúdo" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:184 #: ../kupfer/plugin/thunar.py:224 ../kupfer/plugin/thunar.py:283 msgid "Thunar" msgstr "" #: ../kupfer/plugin/thunar.py:10 msgid "File manager Thunar actions" msgstr "" #: ../kupfer/plugin/thunar.py:66 #, fuzzy msgid "Select in File Manager" msgstr "Seleccionar no Kupfer" #: ../kupfer/plugin/thunar.py:94 msgid "Show Properties" msgstr "" #: ../kupfer/plugin/thunar.py:117 #, fuzzy msgid "Show information about file in file manager" msgstr "Apresentar informação sobre os autores de Kupfer e licença" #: ../kupfer/plugin/thunar.py:126 #, fuzzy msgid "Send To..." msgstr "Agregar à Nota..." #: ../kupfer/plugin/thunar.py:258 #, fuzzy msgid "Empty Trash" msgstr "Lixo" #: ../kupfer/plugin/thunar.py:298 msgid "Thunar Send To Objects" msgstr "" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Contactos e Acções do Thunderbird/Icedove" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Compor uma nova mensagem no Thunderbird" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Livro de Endereços de Thunderbird" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Contactos da Livro de Endereços do Thunderbird" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Topo" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Apresentar tarefas a correr e permitir mandar sinais para elas" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Colocar ordem" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Linha de Comandos" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "Uso do CPU (decrescendo)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Uso da memória (decrescer)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Enviar Sinal..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Sinais" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Tarefas a correr" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% tempo: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Tarefas a correr para o utilizador actual" #: ../kupfer/plugin/tracker.py:5 #, fuzzy msgid "Tracker 0.6" msgstr "Tracker" #: ../kupfer/plugin/tracker.py:15 ../kupfer/plugin/tracker1.py:18 msgid "Tracker desktop search integration" msgstr "Integração com o Tracker" #: ../kupfer/plugin/tracker.py:41 ../kupfer/plugin/tracker1.py:49 msgid "Search in Tracker" msgstr "Procurar em Tracker" #: ../kupfer/plugin/tracker.py:46 ../kupfer/plugin/tracker1.py:54 msgid "Open Tracker Search Tool and search for this term" msgstr "Abrir ferramenta de procura de Tracker e procurar por este termo" #: ../kupfer/plugin/tracker.py:55 ../kupfer/plugin/tracker1.py:62 msgid "Get Tracker Results..." msgstr "Obter resultados de Tracker..." #: ../kupfer/plugin/tracker.py:64 ../kupfer/plugin/tracker1.py:71 msgid "Show Tracker results for query" msgstr "Apresentar resultados de Tracker para consulta" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Tags de Tracker" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Tags de Tracker" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Navegar Tags de Tracker" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "Tag %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Objectos com tag %s no Tracker" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Adicionar Tag..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Adicionar Tag de tracker ao ficheiro" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Eliminar Tag..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Eliminar Tag do tracker do ficheiro" #: ../kupfer/plugin/tracker1.py:10 msgid "Tracker" msgstr "Tracker" #. FIXME: Port tracker tag sources and actions #. to the new, much more powerful sparql + dbus API #. (using tracker-tag as in 0.6 is a plain hack and a dead end) #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Volumes do histórico de TrueCrypt" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "Volume de TrueCrypt: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Montar Volume" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Montar no Truecrypt" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Tentar montar ficheiro como um volume do Truecrypt" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Desmontar Todos os Volumes" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "Volumes do TrueCrypt" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Terminal Server Client" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Sessão gravada no Terminal Server Client" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "Sessões de TSClient" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Sessões gravadas no Terminal Server Client" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Marcadorese acções do Vinagre" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Iniciar Sessão do Vinagre" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Marcadores do Vinagre" #: ../kupfer/plugin/vim.py:1 #, fuzzy msgid "Vim" msgstr "Zim" #: ../kupfer/plugin/vim.py:3 #, fuzzy msgid "Recently used documents in Vim" msgstr "Documentos recentemente utilizados em Abiword" #: ../kupfer/plugin/vim.py:46 #, fuzzy msgid "Vim Recent Documents" msgstr "Documentos usados recentemente" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "Controlar Máquinas Virtuais do VirtualBox. Suporta Sun VirtualBox e Open " "Source Edition." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Ligar" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Ligar (Headless)" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Enviar Sinal para Desligar" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Reinciar" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Resumir" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Gravar Estado" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Desligar" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "Máquinas do VirtualBox" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:10 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "Aceder a Páginas gravadas em Zim - Wiki Pessoal" #: ../kupfer/plugin/zim.py:28 msgid "Page names start with :colon" msgstr "Nomes das páginas começam por ':'" #: ../kupfer/plugin/zim.py:58 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Página Zim do bloco de notas \"%s\"" #: ../kupfer/plugin/zim.py:67 msgid "Create Zim Page" msgstr "Criar Página Zim" #: ../kupfer/plugin/zim.py:74 msgid "Create page in default notebook" msgstr "Criar página no bloco de notas por omissão" #: ../kupfer/plugin/zim.py:84 msgid "Create Zim Page In..." msgstr "Criar Página Zim Em..." #: ../kupfer/plugin/zim.py:122 msgid "Create Subpage..." msgstr "Criar sub página" #: ../kupfer/plugin/zim.py:243 msgid "Zim Notebooks" msgstr "Blocos de Notas Zim" #: ../kupfer/plugin/zim.py:259 msgid "Zim Pages" msgstr "Páginas Zim" #: ../kupfer/plugin/zim.py:287 msgid "Pages stored in Zim Notebooks" msgstr "Páginas guardadas no Bloco de Notas Zim" #~ msgid "Directories" #~ msgstr "Directórios" #~ msgid "Interface" #~ msgstr "Interface" #~ msgid "Keybinding" #~ msgstr "Atalhos de Teclado" #~ msgid "Applied" #~ msgstr "Aplicado" #~ msgid "Text Matches" #~ msgstr "Equivalências de Texto" #~ msgid "Special items and actions for Gnome environment" #~ msgstr "Itens e acções especiais para Gnome" #~ msgid "noun" #~ msgstr "nome" #~ msgid "verb" #~ msgstr "verbo" #~ msgid "adjective" #~ msgstr "adjectivo" #, fuzzy #~ msgid "Timeline for %s" #~ msgstr "Preferências para \"%s\"" #~ msgid "OpenOffice" #~ msgstr "OpenOffice" #~ msgid "Include in top level" #~ msgstr "Incluir no nível superior" #~ msgid "" #~ "If enabled, objects from the plugin's source(s) will be available in the " #~ "top level.\n" #~ "Sources are always available as subcatalogs in the top level." #~ msgstr "" #~ "Se activo, objectos da(s) fonte(s) das Extensões estarão disponíveis no " #~ "nivel superior.\n" #~ "As fontes estão sempre disponíveis como subcatálogos no nível superior." #~ msgid "To configure kupfer, edit:" #~ msgstr "Para configurar kupfer, editar:" #~ msgid "The default config for reference is at:" #~ msgstr "A configuração por omissão está em:" #~ msgid "Open with %s" #~ msgstr "Abrir com %s" #~ msgid "Recently used documents and nautilus places" #~ msgstr "Documentos recentes e locais de Nautilus" #~ msgid "Bookmarked locations in Nautilus" #~ msgstr "Locais nos marcadores em Nautilus" #~ msgid "Do" #~ msgstr "Fazer" #~ msgid "Compose New Mail To" #~ msgstr "Compor Novo Mail Para" #~ msgid "Common" #~ msgstr "Comum" #~ msgid "Special Items" #~ msgstr "Itens especiais" #~ msgid "Items and special actions" #~ msgstr "Itens e acções especiais" #~ msgid "Kupfer items and actions" #~ msgstr "Itens e acções de Kupfer" #~ msgid "(Simple) favorites plugin" #~ msgstr "(Simple) extensão para favoritos" #~ msgid "(no description)" #~ msgstr "(sem descrição)" #~ msgid " %(name)-20s %(version)-4s %(description)s" #~ msgstr " %(name)-20s %(version)-4s %(description)s" #~ msgid "Free-text Queries" #~ msgstr "Pesquisas de Free-text" #~ msgid "Basic support for free-text queries" #~ msgstr "Suporte básico para pesquisas de free-text" #~ msgid "Filesystem Text Matches" #~ msgstr "Equivalências de texto no Sistema de ficheiros" #~ msgid "URL Text Matches" #~ msgstr "Equivalências de texto nas URLs" #~ msgid "Searching..." #~ msgstr "A procurar..." #~ msgid "Searching %(source)s..." #~ msgstr "A procurar em %(source)s..." #~ msgid "" #~ "%(program)s: %(desc)s\n" #~ "\t%(copyright)s\n" #~ "\t%(website)s\n" #~ msgstr "" #~ "%(program)s: %(desc)s\n" #~ "\t%(copyright)s\n" #~ "\t%(website)s\n" #~ msgid "Core" #~ msgstr "Nucleo" #~ msgid "%d lines" #~ msgstr "%d lineas" #~ msgid "Clipboard" #~ msgstr "Portapapeles" kupfer-v208/po/pt_BR.po000066400000000000000000002500011176220042200150250ustar00rootroot00000000000000# Brazilian Portuguese translation for kupfer. # Copyright (C) 2011 kupfer's COPYRIGHT HOLDER # This file is distributed under the same license as the kupfer package. # Djavan Fagundes , 2011. msgid "" msgstr "" "Project-Id-Version: kupfer master\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2011-05-03 14:15+0000\n" "PO-Revision-Date: 2011-05-05 16:34-0200\n" "Last-Translator: Djavan Fagundes \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.6.1\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "Lançador de aplicativos" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "" "Uma conveniente ferramenta de comando e acesso para aplicativos e documentos" #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Executar no Kupfer" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Comando Kupfer salvo" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "Navegar nos atalhos de teclado" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "Atalhos de teclado globais" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Iniciar" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:156 msgid "Catalog" msgstr "Catálogo" #: ../data/preferences.ui.h:5 msgid "Desktop Environment" msgstr "Ambiente de trabalho" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "Pastas cujos arquivos estão sempre disponíveis no catálogo." #: ../data/preferences.ui.h:7 msgid "General" msgstr "Geral" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "Conjunto de ícones:" #: ../data/preferences.ui.h:9 msgid "Inclusion in Top Level Searches" msgstr "Inclusão em pesquisas de nível superior" #: ../data/preferences.ui.h:10 msgid "Indexed Folders" msgstr "Pastas indexadas" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "Teclado" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Preferências do Kupfer" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" "Fontes marcadas têm seus objetos incluídos nas pesquisas de nível superior.\n" "Conteúdo de uma fonte não marcados só está disponível para localizar seu " "subcatálogo." #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "Plug-ins" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:849 msgid "Reset" msgstr "Redefinir" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "Mostrar ícone na área de notificação" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "Iniciar automaticamente ao iniciar sessão" #: ../data/preferences.ui.h:19 msgid "Terminal emulator:" msgstr "Emulador de terminal:" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "" "Usar comandos de pressionamento de tecla única (espaço, /, período, vírgula, " "etc.)" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Credenciais do usuário" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "_Alterar" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "_Password:" #: ../data/credentials_dialog.ui.h:4 msgid "_User:" msgstr "_Usuário:" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "Associação de tecla não pôde ser vinculada" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Por favor, pressione a combinação de teclas desejada" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "Definir atalho de teclado" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "não apresentam a interface principal no lançamento" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "lista plug-ins disponíveis" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "ativar informações de depuração" #. TRANS: --exec-helper=HELPER is an internal command #. TRANS: that executes a helper program that is part of kupfer #: ../kupfer/main.py:49 msgid "run plugin helper" msgstr "executar o plug-in helper" #: ../kupfer/main.py:52 msgid "show usage help" msgstr "mostrar uso da ajuda" #: ../kupfer/main.py:53 msgid "show version information" msgstr "exibir informações da versão" #: ../kupfer/main.py:59 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Uso: kupfer [ OPCOES | ARQUIVO...]" #: ../kupfer/main.py:70 msgid "Available plugins:" msgstr "Plug-ins disponíveis:" #: ../kupfer/main.py:121 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "Ativar o suplente" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Truque da vírgula" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Compor comando" #: ../kupfer/ui/accelerators.py:11 msgid "Mark Default Action" msgstr "Marcar ação padrão" #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "Esquecer objeto" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Redefinir tudo" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Selecionar sair" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Selecione o arquivo selecionado" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Selecione o texto selecionado" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Mostrar ajuda" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Mostrar as preferências" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "Alterne para o primeiro painel" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Alternar para o modo texto" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s está vazio" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "Nenhuma correspondência em %(src)s para \"%(query)s\"" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Nenhuma correspondência" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Digite para pesquisar" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Digite para pesquisar %s" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Nenhuma ação" #: ../kupfer/ui/browser.py:1506 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "Tornar \"%(action)s\" padrão para \"%(object)s\"" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1516 #, python-format msgid "Forget About \"%s\"" msgstr "Esquecer sobre \"%s\"" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1948 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Exibir interface principal" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Exibir com seleção" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Descrição" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Autor" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Versão" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Módulo Python \"%s\" é necessário" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Plug-in não pôde ser lido devido a um erro:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "desativado" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Conteúdo de" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Fontes" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Ações" #: ../kupfer/ui/preferences.py:575 #, python-format msgid "Using encrypted password storage: %s" msgstr "Usando armazenamento de senha criptografada: %s" #: ../kupfer/ui/preferences.py:577 #, python-format msgid "Using password storage: %s" msgstr "Usando armazenamento de senha: %s" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:594 msgid "Configuration" msgstr "Configuração" #: ../kupfer/ui/preferences.py:614 msgid "Set username and password" msgstr "Definir o nome de usuário e senha" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:668 msgid "Choose a Directory" msgstr "Escolha um diretório" #: ../kupfer/ui/preferences.py:847 msgid "Reset all shortcuts to default values?" msgstr "Redefinir todos os atalhos para os valores padrão?" #: ../kupfer/ui/preferences.py:855 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Comando" #: ../kupfer/ui/preferences.py:856 msgid "Shortcut" msgstr "Atalho" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "Djavan Fagundes " #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Um iniciador de software livre (GPLv3+)" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Este programa é um software livre; você pode redistribuí-lo e/ou modificá-lo\n" "sob os termos da Licença Pública Geral GNU publicada pela Free Software \n" "Foundation; qualquer versão 2 da Licença, ou (a seu critério) outra versão \n" "posterior. \n" "\n" "Este programa é distribuído na expectativa de que seja útil, mas SEM NENHUMA\n" "GARANTIA; sem mesmo implicar garantias de COMERCIABILIDADE ou ADAPTAÇÃO A\n" "UM PROPÓSITO PARTICULAR. Veja a Licença Pública Geral GNU (GPL) para mais\n" "detalhes.\n" "\n" "Você deve ter recebido uma cópia da Licença Pública Geral GNU\n" "junto com este programa; caso contrário, veja " ".\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "Não foi possível encontrar a execução do Kupfer" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "Retransmissão de teclado está ativa para exibir %s" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Não foi possível realizar \"%s\"" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "\"%s\" produziu um resultado" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "Nenhuma permissão para executar \"%s\" (não executável)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "Comando em \"%s\" não está disponível" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 msgid "Text" msgstr "Texto" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Executar após atraso..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Execute o comando após um intervalo de tempo especificado" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Vários objetos" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "Objeto %s" msgstr[1] "Objetos %s" #: ../kupfer/obj/contacts.py:87 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "%s não suporta esta operação" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "Não pode ser usado com vários objetos" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:107 msgid "Open" msgstr "Open" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Nenhum aplicativo padrão para %(file)s (%(type)s)" #: ../kupfer/obj/fileactions.py:45 #, python-format msgid "Please use \"%s\"" msgstr "Por favor, use \"%s\"" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Definir aplicativo padrão..." #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Abrir com o aplicativo padrão" #: ../kupfer/obj/fileactions.py:74 msgid "Reveal" msgstr "Revelar" #: ../kupfer/obj/fileactions.py:83 msgid "Open parent folder" msgstr "Abrir a pasta pai" #: ../kupfer/obj/fileactions.py:89 msgid "Open Terminal Here" msgstr "Abrir terminal aqui" #: ../kupfer/obj/fileactions.py:102 msgid "Open this location in a terminal" msgstr "Abrir este local em um terminal" #: ../kupfer/obj/fileactions.py:110 msgid "Run in Terminal" msgstr "Executar em terminal" #: ../kupfer/obj/fileactions.py:110 msgid "Run (Execute)" msgstr "Run (executar)" #: ../kupfer/obj/fileactions.py:130 msgid "Run this program in a Terminal" msgstr "Executar este programa em um terminal" #: ../kupfer/obj/fileactions.py:132 msgid "Run this program" msgstr "Executar este programa" #: ../kupfer/obj/objects.py:252 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 ../kupfer/plugin/vim/plugin.py:172 msgid "Go To" msgstr "Ir para" #: ../kupfer/obj/objects.py:278 msgid "Open URL" msgstr "Abrir URL" #: ../kupfer/obj/objects.py:289 msgid "Open URL with default viewer" msgstr "Abrir URL com visualizador padrão" #: ../kupfer/obj/objects.py:303 msgid "Launch" msgstr "Lançamento" #: ../kupfer/obj/objects.py:316 msgid "Show application window" msgstr "Show janela do aplicativo" #: ../kupfer/obj/objects.py:317 msgid "Launch application" msgstr "Inicie o aplicativo" #: ../kupfer/obj/objects.py:328 msgid "Launch Again" msgstr "Lançar novamente" #: ../kupfer/obj/objects.py:335 msgid "Launch another instance of this application" msgstr "Inicie outra instância deste aplicativo" #: ../kupfer/obj/objects.py:341 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Fechar" #: ../kupfer/obj/objects.py:349 msgid "Attempt to close all application windows" msgstr "Tentando fechar todas as janelas de aplicativos" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:396 msgid "Run" msgstr "Executar" #: ../kupfer/obj/objects.py:406 msgid "Perform command" msgstr "Executar comando" #: ../kupfer/obj/objects.py:419 msgid "(Empty Text)" msgstr "(Texto vazio)" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:449 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "\"%(text)s\"" msgstr[1] "(%(num)d linhas) \"%(text)s\"" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s et. al." #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Fonte recursiva de %(dir)s, (%(levels)d níveis)" #: ../kupfer/obj/sources.py:108 #, python-format msgid "Directory source %s" msgstr "Diretório fonte %s" #: ../kupfer/obj/sources.py:118 msgid "Home Folder" msgstr "Pasta Home" #: ../kupfer/obj/sources.py:129 msgid "Catalog Index" msgstr "Índice de catálogo" #: ../kupfer/obj/sources.py:144 msgid "An index of all available sources" msgstr "Um índice de todas as fontes disponíveis" #: ../kupfer/obj/sources.py:176 msgid "Root catalog" msgstr "Catálogo raiz" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Por favor, configure o plug-in" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "Plug-in %s não está configurado." #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "Credenciais de usuário inválidas para %s" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "GTK+" #: ../kupfer/plugin/core/alternatives.py:13 msgid "GNOME Terminal" msgstr "GNOME Terminal" #: ../kupfer/plugin/core/alternatives.py:22 msgid "XFCE Terminal" msgstr "XFCE Terminal" #: ../kupfer/plugin/core/alternatives.py:31 msgid "LXTerminal" msgstr "LXTerminal" #: ../kupfer/plugin/core/alternatives.py:40 msgid "X Terminal" msgstr "Terminal do X" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "Urxvt" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Salvar como..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Sair" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Sair do Kupfer" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "Sobre o Kupfer" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Mostrar informações sobre autores do Kupfer e licença" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Ajuda do Kupfer" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Obtenha ajuda com Kupfer" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Mostrar a janela de preferências para o Kupfer" #: ../kupfer/plugin/core/__init__.py:64 msgid "Search Contents" msgstr "Pesquisar conteúdo" #: ../kupfer/plugin/core/__init__.py:82 msgid "Search inside this catalog" msgstr "Pesquisar dentro deste catálogo" #: ../kupfer/plugin/core/__init__.py:90 msgid "Copy" msgstr "Cópia" #: ../kupfer/plugin/core/__init__.py:105 msgid "Copy to clipboard" msgstr "Copiar para área de transferência" #: ../kupfer/plugin/core/__init__.py:127 msgid "Rescan" msgstr "Escanear novamente" #: ../kupfer/plugin/core/__init__.py:142 msgid "Force reindex of this source" msgstr "Força a reindexação desta fonte" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Último comando" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Objetos internos do Kupfer" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Último resultado" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Resultados do comando" #: ../kupfer/plugin/archivemanager.py:1 msgid "Archive Manager" msgstr "Gerenciador de arquivos" #: ../kupfer/plugin/archivemanager.py:9 msgid "Use Archive Manager actions" msgstr "Usar ações do gerenciador de arquivo" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Tipo de compactação de arquivo para \"Criar arquivo em\"" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Extrair aqui" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Extrair arquivo compactado" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Criar arquivo" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Criar um arquivo compactado da pasta" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Criar arquivo em..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Pacote" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Aplicativos" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Todos os aplicativos e preferências" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Aplicativos para ambiente de trabalho" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Abrir com..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Abrir com qualquer aplicativo" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Definir aplicativo padrão para abrir este tipo de arquivo" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Calculadora" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Calcular expressões começando com \"=\"" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Calcular" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:112 msgid "Clipboards" msgstr "Áreas de transferência" #: ../kupfer/plugin/clipboard.py:4 msgid "Recent clipboards and clipboard proxy objects" msgstr "Transferências recentes e objetos proxy da área de transferência" #: ../kupfer/plugin/clipboard.py:24 msgid "Number of recent clipboards to remember" msgstr "Número de itens recentes da área de transferência para guardar" #: ../kupfer/plugin/clipboard.py:30 msgid "Include selected text in clipboard history" msgstr "Incluir o texto selecionado no histórico de transferência" #: ../kupfer/plugin/clipboard.py:36 msgid "Copy selected text to primary clipboard" msgstr "Copiar o texto selecionado para a área de transferência do principal" #: ../kupfer/plugin/clipboard.py:47 msgid "Selected Text" msgstr "Texto selecionado" #: ../kupfer/plugin/clipboard.py:57 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Área de transferência \"%(desc)s\"" msgstr[1] "Área de transferência com %(num)d linhas \"%(desc)s\"" #: ../kupfer/plugin/clipboard.py:64 msgid "Clipboard Text" msgstr "Texto da área de transferência" #: ../kupfer/plugin/clipboard.py:74 msgid "Clipboard File" msgstr "Arquivo da área de transferência" #: ../kupfer/plugin/clipboard.py:84 msgid "Clipboard Files" msgstr "Arquivos da área de transferência" #: ../kupfer/plugin/clipboard.py:92 msgid "Clear" msgstr "Limpar" #: ../kupfer/plugin/clipboard.py:104 msgid "Remove all recent clipboards" msgstr "Remover todas as transferências recentes" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Comandos do shell" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" "Executar programas de linha de comando. Ações marcadas com o símbolo %s " "executam em um subshell." #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Executar (pegar saída)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Executa o programa e retornar sua saída" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 msgid "Pass to Command..." msgstr "Passar para o comando..." #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "Executar o programa com o objeto como um parâmetro adicional" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 msgid "Write to Command..." msgstr "Escreva para comando..." #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 msgid "Run program and supply text on the standard input" msgstr "Executar o programa e fornecer texto da entrada padrão" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "Filtrar através do comando..." #: ../kupfer/plugin/commands.py:215 msgid "Run command-line programs" msgstr "Executar programas de linha de comando" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Dicionário" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Procurar palavra no dicionário" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Procurar" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Documentos" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "Documentos usados ​​recentemente e pastas favoritas" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "Máximo de dias de documentos recentes" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Itens recentes" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Documentos usados recentemente" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "%s documentos" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Documentos usados recentemente para %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Locais" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Pastas favoritas" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Favoritos do Epiphany" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Índice de favoritos do Epiphany" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Favoritos" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "" "Marcar os itens usados com freqüência e armazenar objetos para uso posterior" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "Prateleira de itens \"Favoritos\"" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Adicionar a Favoritos" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Adicionar o item à prateleira de favoritos" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Remover dos favoritos" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Remover item de prateleira de favoritos" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Ações de arquivo" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Mais ações de arquivo" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:211 msgid "Move To..." msgstr "Mova para..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:253 msgid "Move file to new location" msgstr "Mover arquivos para o novo local" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Renomear para..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:166 msgid "Copy To..." msgstr "Copiar para ..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:207 msgid "Copy file to a chosen location" msgstr "Copiar arquivos para um local escolhido" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Favoritos do Firefox" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Índice de favoritos do Firefox" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "Incluir sites visitados" #. TRANS: Multihead refers to support for multiple computer displays #. TRANS: In this case, it only concerns the special configuration #. TRANS: with multiple X "screens" #: ../kupfer/plugin/multihead.py:4 msgid "Multihead Support" msgstr "Suporte multihead" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Arquivo selecionado" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" "Fornece a seleção atual do nautilus, usando a extensão Nautilus do Kupfer" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Arquivo \"%s\" selecionado" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Arquivos selecionados" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Notas" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Notas do Gnote ou Tomboy" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Trabalhar com aplicativos" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Abrir com o aplicativo de notas" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Anexar à nota ..." #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Adicionar texto para a nota existente" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Criar nota" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Criar uma nova nota deste texto" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Obter resultados de pesquisa de nota..." #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "Mostrar resultados de pesquisa para esta consulta" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "hoje, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "ontem, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Última atualização %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "Reproduzir e enfileirar faixas e procurar a biblioteca de música" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Incluir artistas no nível superior" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Incluir álbuns em nível superior" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Incluir músicas no nível superior" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Reproduzir" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Retomar a reprodução no Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Pausar" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Pausar a reprodução no Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Próximo" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Saltar para a próxima faixa no Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Anterior" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Saltar para a faixa anterior no Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Exibir reprodução" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Dizer que música é que joga" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Limpar a fila" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Reproduz as faixas no Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Enfileirado" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Adicionar faixas para a fila de reprodução" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "por %(artist)s de %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "por %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Faixas por %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Álbuns" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Álbuns de música no na biblioteca do Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Artistas" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Artistas da música na biblioteca do Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Músicas" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Músicas na biblioteca do Rhythmbox" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "Gerenciamento de sessão do GNOME" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "Itens especiais e ações para o ambiente GNOME" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Encerrar sessão..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Encerra a sessão ou alterar o usuário" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Desligar..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Desliga, reinicia ou suspende o computador" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Tela do fechamento" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Habilitar a proteção de tela e bloquear" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "Gerenciamento de sessão do XFCE" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Itens especiais e ações para ambiente XFCE" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Mostrar texto" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:58 msgid "Display text in a window" msgstr "Exibe o texto em uma janela" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Tipo grande" #: ../kupfer/plugin/show_text.py:66 msgid "Show Notification" msgstr "Mostrar notificação" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Lixeira" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Acessar conteúdo da lixeira" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Mover para a lixeira" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Mova este arquivo para a lixeira" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Restaurar" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Mover arquivo de volta ao local original" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "A lixeira está vazia" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "A lixeira contém um arquivo" msgstr[1] "A lixeira contém %(num)s arquivos" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Disparadores" #: ../kupfer/plugin/triggers.py:6 msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Atribuir teclas de atalho global (disparadores) aos objetos criados com " "\"Compor comando\"." #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Adicione disparador..." #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Remover disparador" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "Ações de URL" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Baixar e abrir" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Faça o download para..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "URL de download para um local escolhido" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Discos e volumes" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Volumes montados e discos" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Volume montado em %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Desmontar" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Desmontar este volume" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Ejetar" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Desmontar e ejetar essa mídia" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Pesquisar na Web" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Pesquisar na web com mecanismo de busca OpenSearch" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Pesquisa com..." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Pesquisar por ..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Mecanismos de busca" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Pesquisar na Wikipédia" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Idioma da Wikipédia" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "en" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Procurar por este termo em %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Lista de janelas" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Todas as janelas em todos as áreas de trabalho" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Ativar" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Sombrear" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Remover sombra" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Minimizar" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Restaurar" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Maximizar" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Desfazer maximizar" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Maximizar verticalmente" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Desfazer maximizar verticalmente" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Janela em %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Mais à frente da janela" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Próxima janela" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Saltar e focar para esta janela da área de trabalho" #: ../kupfer/plugin/windows.py:252 #, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "%d janela" msgstr[1] "%d janelas" #: ../kupfer/plugin/windows.py:256 msgid "Active workspace" msgstr "Áreas de trabalho ativas" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Ir para esta área de trabalho" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Áreas de trabalho" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Documentos usados recentemente no Abiword" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Itens recentes do Abiword" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Interface com o gerenciador de pacotes APT" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Método de instalação" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Mostrar informações de pacote" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Instalar" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Instalar pacotes usando o método configurado" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Pacotes correspondentes \"%s\"" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Pesquisar nome do pacote..." #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "Arquivos profundos" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Permite a navegação dentro de arquivos compactados" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "Conteúdo de %s" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "Definição de ícones ASCII & Unicode" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" "Fornece a definição de ícones Ascii e Unicode que usam letras e símbolos " "para produzir ícones para os objetos encontrados no Kupfer." #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "ASCII" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "Unicode" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Controlar a reprodução e lista de reprodução do Audacious" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Adicionar faixas para a fila de reprodução do Audacious" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Desfazer fila" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Remover faixa da fila de reprodução do Audacious" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Saltar para a faixa no Audacious" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Retomar a reprodução no Audacious" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Pausar a reprodução no Audacious" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Saltar para a próxima faixa no Audacious" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Saltar para a faixa anterior no Audacious" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Limpar a fila de reprodução do Audacious" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Aleatória" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Alternar para modo aleatório no Audacious" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Repetir" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Alternar para repetição no Audacious" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Lista de reprodução" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Favoritos do Chromium" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Índice de favoritos do Chromium" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Ações e contatos do Claws Mail" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Compor novo e-mail" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Compor uma nova mensagem no Claws Mail" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Receber todos os E-mails" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "Receber novas mensagens de todas as contas no ClawsMail" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "Compor e-mail" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "Enviar um e-mail para..." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Compor nova mensagem no Claws Mail e anexar arquivo" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Catálogo de endereços do Claws Mail" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Contatos do catálogo de endereços do Claws Mail" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 msgid "Custom Terminal" msgstr "Terminal personalizado" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "Configurar um emulador de terminal personalizado" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "Executar flag" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "Tema personalizado" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "Usar um tema de cor personalizada" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "Tema:" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Cliente de e-mail padrão" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "Compor e-mail usando mailto padrão do sistema: manipulador" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Pesquisa no Devhelp" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "Empathy" #: ../kupfer/plugin/empathy.py:6 msgid "Access to Empathy Contacts" msgstr "Acessar aos contatos do Empathy" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Mostrar contatos desconectados" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Disponível" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Ausente" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Ocupado" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Não disponível" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Invisível" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Desconectado" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:90 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:204 msgid "Open Chat" msgstr "Abrir conversa" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:118 #: ../kupfer/plugin/skype.py:250 msgid "Change Global Status To..." msgstr "Alterar status global para..." #: ../kupfer/plugin/empathy.py:171 msgid "Empathy Contacts" msgstr "Contatos do Empathy" #: ../kupfer/plugin/empathy.py:237 msgid "Empathy Account Status" msgstr "Status de conta do Empathy" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Contatos do Evolution" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Compor uma nova mensagem no Evolution" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Compor nova mensagem no Evolução e anexar arquivo" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Catálogo de endereços do Evolution" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Mostrar sites e manipular endereços ftp pelo Filezilla" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Abrir site com Filezilla" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Sites do Filezilla" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Sites do Filezilla" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Acesso aos contatos do Gajim" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Livre para conversa" #: ../kupfer/plugin/gajim.py:146 msgid "Gajim Contacts" msgstr "Contatos do Gajim" #: ../kupfer/plugin/gajim.py:210 msgid "Gajim Account Status" msgstr "Status da conta do Gajim" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "Glob" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "Perfis do GNOME Terminal" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "Lançar perfis do GNOME Terminal" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:144 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "Carregar contatos e compor novo e-mail no Gmail" #: ../kupfer/plugin/gmail/__init__.py:32 msgid "Load contacts' pictures" msgstr "Carregar figuras dos contatos" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Compose Email in Gmail" msgstr "Compor e-mail no Gmail" #: ../kupfer/plugin/gmail/__init__.py:74 msgid "Open web browser and compose new email in Gmail" msgstr "Abre o navegador de internet e compõe novo e-mail no Gmail" #: ../kupfer/plugin/gmail/__init__.py:177 msgid "Contacts from Google services (Gmail)" msgstr "Contatos de serviços do Google (Gmail)" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Mostrar álbuns e fazer upload de arquivos para o Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "Usuários para mostrar: (, -separados)" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Carregar ícones e álbuns do usuário" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Enviando imagens" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Enviando fotos para o álbum web do Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Criando o álbum:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Álbum criado por Kupfer" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Arquivo:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "Um álbum" msgstr[1] "%(num)d álbuns" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "uma foto" msgstr[1] "%(num)s fotos" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Enviar para álbum do Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Enviar arquivos para álbum do Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Enviar para o Picasa como novo álbum" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Criar um álbum do diretório local selecionado" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Álbuns do Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Álbuns de usuário no Picasa" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Pesquisa do Google" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Pesquisa do Google com resultados mostrados diretamente" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #, python-format msgid "Results for \"%s\"" msgstr "Resultados para \"%s\"" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Mostrar mais resultados para %s\"" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "Total encontrado %s" #: ../kupfer/plugin/google_translate.py:6 msgid "Google Translate" msgstr "Google Translate" #: ../kupfer/plugin/google_translate.py:8 #: ../kupfer/plugin/google_translate.py:153 msgid "Translate text with Google Translate" msgstr "Traduzir texto com o Google Translate" #: ../kupfer/plugin/google_translate.py:83 msgid "Google Translate connection timed out" msgstr "A conexão com o Google Translate expirou" #: ../kupfer/plugin/google_translate.py:86 msgid "Error connecting to Google Translate" msgstr "Erro ao conectar ao Google Translate" #: ../kupfer/plugin/google_translate.py:136 #: ../kupfer/plugin/google_translate.py:223 msgid "Translate To..." msgstr "Traduzir para ..." #: ../kupfer/plugin/google_translate.py:179 #, python-format msgid "Translate into %s" msgstr "Traduzir em %s" #: ../kupfer/plugin/google_translate.py:203 msgid "Languages" msgstr "Idiomas" #: ../kupfer/plugin/google_translate.py:238 msgid "Show translated page in browser" msgstr "Visualizar página traduzida no navegador" #: ../kupfer/plugin/google_translate.py:255 msgid "Show Translation To..." msgstr "Mostra tradução para..." #: ../kupfer/plugin/google_translate.py:271 msgid "Show translation in browser" msgstr "Mostrar tradução no navegador" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Google Translate" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "Procurar e criar novas tarefas no GTG" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "vencimento: %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "Início: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "etiquetas: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Tarefa aberta no Getting Things GNOME!" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Remover" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Remove permanentemente esta tarefa" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Marcar como feito" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Marca esta tarefa como concluída" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Desconsiderar" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Marca esta tarefa como uma tarefa que não deve ser feita mais" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Criar tarefa" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Criar nova tarefa no Getting Things GNOME" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "Google Translate" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" "Microblogging é com o Gwibber. Permite enviar e receber mensagens de redes " "sociais como o Twitter, identi.ca etc. Requer o pacote \"gwibber-service\"." #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "Número máximo de mensagens para mostrar" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s no %(service)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s via %(where)s" #: ../kupfer/plugin/gwibber.py:187 msgid "Send Message" msgstr "Enviar mensagem" #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "Enviar mensagem para todas as contas do Gwibber" #: ../kupfer/plugin/gwibber.py:210 msgid "Send Message To..." msgstr "Enviar mensagem para ..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "Enviar mensagem para uma conta do Gwibber" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Enviar mensagem ..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "Enviar mensagem para a conta do Gwibber selecionada" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Resposta..." #: ../kupfer/plugin/gwibber.py:314 msgid "Delete Message" msgstr "Apagar mensagem" #: ../kupfer/plugin/gwibber.py:337 msgid "Send Private Message..." msgstr "Enviar mensagem privada..." #: ../kupfer/plugin/gwibber.py:370 msgid "Send direct message to user" msgstr "Envia uma mensagem direta para o usuário" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "Retweet" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet To..." msgstr "Reenviar para..." #: ../kupfer/plugin/gwibber.py:407 msgid "Retweet message to all Gwibber accounts" msgstr "Reenvia a mensagem para todas as contas do Gwibber" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "Reenvia mensagem para uma conta do Gwibber" #: ../kupfer/plugin/gwibber.py:413 msgid "Open in Browser" msgstr "Abrir no navegador" #: ../kupfer/plugin/gwibber.py:419 msgid "Open message in default web browser" msgstr "Abrir uma mensagem no navegador padrão" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 msgid "Gwibber Accounts" msgstr "Contas de Gwibber" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "Contas configuradas no Gwibber" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "Mensagens do Gwibber" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "Mensagens recentes recebidas pelo Gwibber" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "Mensagens do Gwibber para %s" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "Fluxos do Gwibber" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "Fluxos configurados no Gwibber" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "Mensagens do Gwibber em %s" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "Gwibber (simples)" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "Envia atualizações através do cliente de microblogging Gwibber" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "Enviar atualização" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "Não é possível ativar o serviço do Gwibber" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Ações de ordem superior" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Ferramentas para trabalhar com comandos como objetos" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Selecione no Kupfer" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Resultado de %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Executar (obter resultado)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Capturar o resultado de comando como um objeto proxy" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Executar (descartar resultado)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Ferramentas de imagem" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Ferramentas de transformação de imagens" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Escala..." #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Escala da imagem para caber dentro de determinada medida de pixels" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Girar no sentido horário" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Girar no sentido anti-horário" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Girar automaticamente" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Girar JPEG (no local) de acordo com seus metadados EXIF" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Plug-ins do Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Acessar a lista de plug-ins do Kupfer no Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Mostrar informações" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Mostrar o código-fonte" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "habilitado" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Localizar arquivos" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Procurar no sistema de arquivos usando o locate" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Ignorar distinções ao pesquisar arquivos" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "Google Translate" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Documentos usados recentemente no OpenOffice/LibreOffice" #: ../kupfer/plugin/openoffice.py:83 msgid "OpenOffice/LibreOffice Recent Items" msgstr "Itens recentes do OpenOffice/LibreOffice" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Marcadores do Opera" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Índice de favoritos do Firefox" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera Mail" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Ações e contatos do Opera Mail" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Compor uma nova mensagem no Opera Mail" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Contatos do Opera Mail" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Contatos do Opera Mail" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Acessar aos contatos do Pidgin" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d caractere)" msgstr[1] "%s (%d caracteres)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Contatos do Pidgin" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "Sessões do PuTTY" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Acesso rápido às sessões do PuTTY" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Iniciar sessão" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "Visualizador rápido de imagens" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "Ver imagem" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "reStructuredText" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "Renderizar reStructuredText e mostrar o resultado" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Ver como documento HTML" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "Sessões ativas do GNU Screen" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Anexado" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Desanexado" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s sessão (%(pid)s) criada %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Sessões de tela" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Anexar" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:52 msgid "Send Keys" msgstr "Enviar chaves" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "Enviar eventos de teclado sintético usando xautomation" #: ../kupfer/plugin/sendkeys.py:28 msgid "Paste to Foreground Window" msgstr "Colar a janela de primeiro plano" #: ../kupfer/plugin/sendkeys.py:46 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "" "Copiar para a área de transferência e enviar Ctrl+V para a janela de " "primeiro plano" #: ../kupfer/plugin/sendkeys.py:101 msgid "Send keys to foreground window" msgstr "Enviar as teclas para a janela de primeiro plano" #: ../kupfer/plugin/sendkeys.py:106 msgid "Type Text" msgstr "Tipo de Texto" #: ../kupfer/plugin/sendkeys.py:127 msgid "Type the text to foreground window" msgstr "Digite o texto da janela de primeiro plano" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Serviços do sistema" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "" "Iniciar, parar ou reiniciar os serviços do sistema através de scripts de " "inicialização" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Comando sudo-like" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Iniciar o serviço" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Reiniciar o serviço" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Parar o serviço" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "%s serviço" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Encurtar links" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Criar aliases curto de URLs longas" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Erro" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Encurtar com ..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Serviços" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 msgid "Show QRCode" msgstr "Mostrar QRCode" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 msgid "Display text as QRCode in a window" msgstr "Exibir texto como QRCode em uma janela." #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Acesse os contatos do Skype" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skype Me" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Encerrar sessão" #: ../kupfer/plugin/skype.py:183 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:225 msgid "Call" msgstr "Chamada" #: ../kupfer/plugin/skype.py:239 msgid "Place a call to contact" msgstr "Faz uma chamada para contato" #: ../kupfer/plugin/skype.py:274 msgid "Skype Contacts" msgstr "Contatos do Skype" #: ../kupfer/plugin/skype.py:294 msgid "Skype Statuses" msgstr "Status do Skype" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "Hosts SSH" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "Adiciona as máquinas SSH encontradas em ~/.ssh/config." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "Host SSH" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Conectar" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "Conectar-se ao host SSH" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "Hosts SSH como especificado em ~/.ssh/config" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Nenhuma conexão de D-Bus para sessão de desktop" #: ../kupfer/plugin_support.py:171 msgid "GNOME Keyring" msgstr "Chaveiro do GNOME" #: ../kupfer/plugin_support.py:172 msgid "KWallet" msgstr "KWallet" #: ../kupfer/plugin_support.py:173 msgid "Unencrypted File" msgstr "Arquivo não-criptografado" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Modelos de documento" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Cria novos documentos a partir de seus modelos" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "Modelo %s" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Arquivo vazio" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Nova pasta" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Criar novo documento..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Crie um novo documento a partir do modelo" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Criar documento em..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "ArquivosTexto" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Anexar em..." #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Anexar..." #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Gravar em..." #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Obter o conteúdo de texto" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:185 #: ../kupfer/plugin/thunar.py:225 ../kupfer/plugin/thunar.py:278 #: ../kupfer/plugin/thunar.py:329 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:11 msgid "File manager Thunar actions" msgstr "Ações do gerenciador de arquivos Thunar" #: ../kupfer/plugin/thunar.py:67 msgid "Select in File Manager" msgstr "Selecione no gerenciador de arquivos" #: ../kupfer/plugin/thunar.py:95 msgid "Show Properties" msgstr "Mostrar propriedades" #: ../kupfer/plugin/thunar.py:118 msgid "Show information about file in file manager" msgstr "Mostrar informações sobre o arquivo no gerenciador de arquivos" #: ../kupfer/plugin/thunar.py:127 msgid "Send To..." msgstr "Enviar para ..." #: ../kupfer/plugin/thunar.py:259 msgid "Symlink In..." msgstr "Link simbólico em..." #: ../kupfer/plugin/thunar.py:300 msgid "Create a symlink to file in a chosen location" msgstr "Cria um link simbólico para o arquivo em um local escolhido" #: ../kupfer/plugin/thunar.py:304 msgid "Empty Trash" msgstr "Esvaziar lixeira" #: ../kupfer/plugin/thunar.py:344 msgid "Thunar Send To Objects" msgstr "Enviar para objetos do Thunar" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Contatos e ações do Thunderbird/Icedove" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Compor uma nova mensagem no Thunderbird" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Catálogo de endereços do Thunderbird" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Contatos do catálogo de endereços do Thunderbird" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Top" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Mostra as tarefas em execução e permite o envio de sinais para eles" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Ordem de classificação" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Linha de comando" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "Uso da CPU (descendente)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Uso de memória (descendente)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Enviar sinal..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Sinais" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Executando tarefas" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% tempo: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Tarefas em execução para o usuário atual" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:15 ../kupfer/plugin/tracker1.py:18 msgid "Tracker desktop search integration" msgstr "Integração de busca no desktop do Tracker" #: ../kupfer/plugin/tracker.py:41 ../kupfer/plugin/tracker1.py:49 msgid "Search in Tracker" msgstr "Procurar no Tracker" #: ../kupfer/plugin/tracker.py:46 ../kupfer/plugin/tracker1.py:54 msgid "Open Tracker Search Tool and search for this term" msgstr "Abre a ferramenta de pesquisa Tracker e procura por este termo" #: ../kupfer/plugin/tracker.py:55 ../kupfer/plugin/tracker1.py:62 msgid "Get Tracker Results..." msgstr "Obter resultados do Tracker..." #: ../kupfer/plugin/tracker.py:64 ../kupfer/plugin/tracker1.py:71 msgid "Show Tracker results for query" msgstr "Mostrar resultados do Tracker para consulta" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Etiquetas do Tracker" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Etiquetas do Tracker" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Navegar nas etiquetas do Tracker" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "Etiqueta %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Objetos %s etiquetados com o Tracker" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Adicionar etiqueta ..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Adiciona uma etiqueta para o arquivo" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Remover etiqueta..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Remover etiqueta do tracker do arquivo" #: ../kupfer/plugin/tracker1.py:10 msgid "Tracker" msgstr "Tracker" #. FIXME: Port tracker tag sources and actions #. to the new, much more powerful sparql + dbus API #. (using tracker-tag as in 0.6 is a plain hack and a dead end) #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Histórico de volumes do TrueCrypt" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "Volume TrueCrypt: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Montar volume" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Montar no Truecrypt" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Tente montar arquivos como um volume Truecrypt" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Desmontar todos os volumes" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "Volumes TrueCrypt" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Cliente do terminal server" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Sessão salva no cliente do terminal server" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "Sessões TSClient" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Sessões salvas no cliente do terminal server" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Ações e favoritos do Vinagre" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Iniciar sessão do Vinagre" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Favoritos do Vinagre" #: ../kupfer/plugin/vim/__init__.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim/__init__.py:4 msgid "Recently used documents in Vim" msgstr "Documentos usados recentemente no Vim" #: ../kupfer/plugin/vim/plugin.py:56 msgid "Vim Recent Documents" msgstr "Documentos recentes do Vim" #: ../kupfer/plugin/vim/plugin.py:219 msgid "Close (Save All)" msgstr "Fechar (salvar tudo)" #: ../kupfer/plugin/vim/plugin.py:237 msgid "Send..." msgstr "Enviar..." #: ../kupfer/plugin/vim/plugin.py:264 msgid "Send ex command" msgstr "Enviar o comando ex" #: ../kupfer/plugin/vim/plugin.py:272 msgid "Insert in Vim..." msgstr "Inserir no Vim..." #: ../kupfer/plugin/vim/plugin.py:309 msgid "Active Vim Sessions" msgstr "Sessões ativas do Vim" #: ../kupfer/plugin/vim/plugin.py:338 #, python-format msgid "Vim Session %s" msgstr "Vim sessão %s" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "Controla as máquinas virtuais do VirtualBox. Oferece suporte ao Sun " "VirtualBox e Open Source Edition." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "Forçar o uso da interface CLI" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Ligar" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Ligar sem monitor" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Enviar sinal de desligamento" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Reiniciar" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Retomar" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Salvar estado" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Desligar" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "Máquinas do VirtualBox" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:10 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "" "Acessar páginas armazenadas no Zim - Um ambiente Wiki e próprio para escrita" #: ../kupfer/plugin/zim.py:28 msgid "Page names start with :colon" msgstr "Nomes das páginas começam como :colon" #: ../kupfer/plugin/zim.py:58 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Página Zim do caderno \"%s\"" #: ../kupfer/plugin/zim.py:67 msgid "Create Zim Page" msgstr "Criar página no Zim" #: ../kupfer/plugin/zim.py:74 msgid "Create page in default notebook" msgstr "Criar página no caderno padrão" #: ../kupfer/plugin/zim.py:84 msgid "Create Zim Page In..." msgstr "Criar página do Zim em..." #: ../kupfer/plugin/zim.py:122 msgid "Create Subpage..." msgstr "Crie subpágina..." #: ../kupfer/plugin/zim.py:243 msgid "Zim Notebooks" msgstr "Cadernos do Zim" #: ../kupfer/plugin/zim.py:259 msgid "Zim Pages" msgstr "Páginas do Zim" #: ../kupfer/plugin/zim.py:287 msgid "Pages stored in Zim Notebooks" msgstr "Páginas armazenadas em cadernos do Zim" kupfer-v208/po/ru.po000066400000000000000000003072641176220042200144630ustar00rootroot00000000000000# Russian translation for kupfer. # Copyright (C) 2012 kupfer's COPYRIGHT HOLDER # This file is distributed under the same license as the kupfer package. # Nikolay Barbariyskiy , 2012. # msgid "" msgstr "" "Project-Id-Version: kupfer master\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2012-05-22 15:22+0000\n" "PO-Revision-Date: 2012-05-17 03:49+0100\n" "Last-Translator: Barbariyskiy Nikolay \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../auxdata/kupfer.desktop.in.h:1 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Application Launcher" msgstr "Средство запуска приложений" #: ../auxdata/kupfer.desktop.in.h:3 msgid "Convenient command and access tool for applications and documents" msgstr "Удобный инструмент для быстрого доступа к программам и документам" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Выполнить в Kupfer" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Сохраннёные команды Kupfer" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Учетные данные пользователя" #: ../data/credentials_dialog.ui.h:2 msgid "_User:" msgstr "_Пользователь" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "_Пароль" #: ../data/credentials_dialog.ui.h:4 msgid "_Change" msgstr "_Изменить" #: ../data/getkey_dialog.ui.h:1 msgid "Set Keyboard Shortcut" msgstr "Установить сочетание клавиш" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Пожалуйста, нажмите требуемое сочетание клавиш" #: ../data/getkey_dialog.ui.h:3 msgid "Keybinding could not be bound" msgstr "Данное сочетание клавишь не может быть использовано" #: ../data/preferences.ui.h:1 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Настройки Kupfer" #: ../data/preferences.ui.h:2 msgid "Start automatically on login" msgstr "Запустить автоматически при входе в систему" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Запустить" #: ../data/preferences.ui.h:4 msgid "Show icon in notification area" msgstr "Показать значок в области уведомления" #: ../data/preferences.ui.h:5 msgid "Icon set:" msgstr "Тип значка:" #: ../data/preferences.ui.h:6 msgid "Terminal emulator:" msgstr "Эмулятор терминала" #: ../data/preferences.ui.h:7 msgid "Desktop Environment" msgstr "Рабочая среда" #: ../data/preferences.ui.h:8 ../kupfer/plugin/gmail/__init__.py:60 msgid "General" msgstr "Общие" #: ../data/preferences.ui.h:9 msgid "Global Keyboard Shortcuts" msgstr "Глобальные сочетания клавиш" #: ../data/preferences.ui.h:10 ../kupfer/ui/preferences.py:849 msgid "Reset" msgstr "Перезапустить" #: ../data/preferences.ui.h:11 msgid "Browser Keyboard Shortcuts" msgstr "Сочетания клавиш браузера" #: ../data/preferences.ui.h:12 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "Использовать одноклавишные команды (Пробел, /, точка, запятая)" #: ../data/preferences.ui.h:13 msgid "Keyboard" msgstr "Клавиатура" #: ../data/preferences.ui.h:14 msgid "Plugins" msgstr "Плагины" #: ../data/preferences.ui.h:15 msgid "Inclusion in Top Level Searches" msgstr "Включение в высокоуровневые поиски" #: ../data/preferences.ui.h:16 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" "Отмеченные источники включают свои объекты в высокоуровневый поиск.\n" "Содержание неотмеченных источников может быть доступно только в подкаталоге." #: ../data/preferences.ui.h:18 msgid "Indexed Folders" msgstr "Индексированные папки" #: ../data/preferences.ui.h:19 msgid "Folders whose files are always available in the catalog." msgstr "Папки, файлы которых всегда доступны в каталоге." #: ../data/preferences.ui.h:20 ../kupfer/obj/sources.py:157 msgid "Catalog" msgstr "Каталог" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Не удалось выполнить '%s'" #: ../kupfer/core/commandexec.py:268 #, fuzzy, python-format msgid "\"%s\" produced a result" msgstr "\"%s\" привела результат" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "Нет разрешения на запуск \"%s\" (не исполняемый файл)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "Команда в \"%s\" не доступна" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "Клавиатура активна для дисплея %s" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "не показывать основной интерфейс при запуске" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "список доступных плагинов" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "включить информацию отладки" #. TRANS: --exec-helper=HELPER is an internal command #. TRANS: that executes a helper program that is part of kupfer #: ../kupfer/main.py:49 msgid "run plugin helper" msgstr "запустить плагин helper" #: ../kupfer/main.py:52 msgid "show usage help" msgstr "показать справку использования" #: ../kupfer/main.py:53 msgid "show version information" msgstr "показать информацию о версии" #: ../kupfer/main.py:59 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Использование: kupfer [Параметры | Файл ... ]" #: ../kupfer/main.py:70 msgid "Available plugins:" msgstr "Доступные плагины:" #: ../kupfer/main.py:121 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "Alternate Activate" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Назначить одно действие для многих объектов" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Составить команду" #: ../kupfer/ui/accelerators.py:11 msgid "Mark Default Action" msgstr "Отметить действие по умолчанию" #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "Забыть обьект" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Сбросить все" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Закончить" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Выбрать выбранный фаил" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Выбрать выбранный текст" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Показать справку" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Показать окно настроек" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "Переключиться на первую область" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Переключить в текстовый режим" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s пуст" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "нет совпадений в %(src)s для \"%(query)s\"" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Нет совпадений" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Введите поисковый запрос" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Введите поисковый запрос %s" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Действие не назначено" #: ../kupfer/ui/browser.py:1513 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "Сделать \"%(action)s\" действием по умолчанию для \"%(object)s\"" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1523 #, python-format msgid "Forget About \"%s\"" msgstr "Забыть о \"%s\"" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1960 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Показать основной интерфейс" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Показать с выбором" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Описание" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Автор" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Версия" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Необходим модуль Python '%s'" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Плагин не может быть прочитан из-за ошибки:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "отключен" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Содержание" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Источники" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Действия" #: ../kupfer/ui/preferences.py:575 #, python-format msgid "Using encrypted password storage: %s" msgstr "При помощи зашифрованного хранилища паролей: %s" #: ../kupfer/ui/preferences.py:577 #, python-format msgid "Using password storage: %s" msgstr "При помощи хранилища паролей: %s" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:594 msgid "Configuration" msgstr "Конфигурация" #: ../kupfer/ui/preferences.py:614 msgid "Set username and password" msgstr "Установить имя пользователя и пароль" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:668 msgid "Choose a Directory" msgstr "Выберите папку" #: ../kupfer/ui/preferences.py:847 msgid "Reset all shortcuts to default values?" msgstr "Восстановить значения ярлыков на значение по умолчанию?" #: ../kupfer/ui/preferences.py:855 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Команда" #: ../kupfer/ui/preferences.py:856 msgid "Shortcut" msgstr "Ярлык" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "Список переводчиков" #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Средство запуска бесплатного (GPLv3+) программного обеспечения" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Эта программа является свободным программным обеспечением вы можете " "распространять и / или изменять \n" "его в соответствии с условиями GNU General Public License, опубликованной \n" "Free Software Foundation, версии 3 лицензии, или \n" "(по вашему выбору) любой более поздней версии. \n" "\n" "Эта программа распространяется в надежде, что она будет полезна, \n" "но БЕЗ ВСЯКИХ ГАРАНТИЙ, даже без подразумеваемой гарантии \n" "Или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ. См. \n" "GNU General Public License для более подробной информации. \n" " \n" " Вы должны были получить копию GNU General Public License \n" "Вместе с этой программой. Если нет, см. . \n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "Не удалось найти запущенный Kupfer" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 msgid "Text" msgstr "Текст" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Запустить после задержки" #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Выполнить команду через определённый интервал времени" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Множественные объекты" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s объект" msgstr[1] "%s объекта" msgstr[2] "%s объектов" #: ../kupfer/obj/contacts.py:129 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/contacts.py:131 msgid "unknown" msgstr "неизвестный" #: ../kupfer/obj/contacts.py:144 msgid "Aim" msgstr "Aim" #: ../kupfer/obj/contacts.py:151 msgid "Google Talk" msgstr "Google Talk" #: ../kupfer/obj/contacts.py:159 msgid "ICQ" msgstr "ICQ" #: ../kupfer/obj/contacts.py:166 msgid "MSN" msgstr "MSN" #: ../kupfer/obj/contacts.py:173 msgid "QQ" msgstr "QQ" #: ../kupfer/obj/contacts.py:180 msgid "Yahoo" msgstr "Yahoo" #. -*- coding: UTF-8 -*- #: ../kupfer/obj/contacts.py:187 ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "%s не поддерживает данную операцию" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "Не может быть использовано с несколькими объектами" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:176 msgid "Open" msgstr "Открыть" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Не было найдено приложение по умолчанию для %(file)s (%(type)s)" #: ../kupfer/obj/fileactions.py:45 #, python-format msgid "Please use \"%s\"" msgstr "Пожалуйста, используйте \"%s\"" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Установить приложение по умолчанию" #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Открыть с помощью приложения по умолчанию" #: ../kupfer/obj/fileactions.py:74 msgid "Reveal" msgstr "Показать" #: ../kupfer/obj/fileactions.py:83 msgid "Open parent folder" msgstr "Открыть родительскую папку" #: ../kupfer/obj/fileactions.py:89 msgid "Open Terminal Here" msgstr "Открыть терминал здесь" #: ../kupfer/obj/fileactions.py:102 msgid "Open this location in a terminal" msgstr "Открыть это расположение в терминале" #: ../kupfer/obj/fileactions.py:110 msgid "Run in Terminal" msgstr "Запустить в терминале" #: ../kupfer/obj/fileactions.py:110 msgid "Run (Execute)" msgstr "Запустить (Выполнить)" #: ../kupfer/obj/fileactions.py:130 msgid "Run this program in a Terminal" msgstr "Запустить программу в терминале" #: ../kupfer/obj/fileactions.py:132 msgid "Run this program" msgstr "Запустить программу" #: ../kupfer/obj/objects.py:252 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 ../kupfer/plugin/vim/plugin.py:172 msgid "Go To" msgstr "Перейти" #: ../kupfer/obj/objects.py:278 msgid "Open URL" msgstr "Открыть URL" #: ../kupfer/obj/objects.py:289 msgid "Open URL with default viewer" msgstr "Открыть URL при помощи средства просмотра по умолчанию" #: ../kupfer/obj/objects.py:303 msgid "Launch" msgstr "Запустить" #: ../kupfer/obj/objects.py:316 msgid "Show application window" msgstr "Показать окно приложения" #: ../kupfer/obj/objects.py:317 msgid "Launch application" msgstr "Запустить приложение" #: ../kupfer/obj/objects.py:328 msgid "Launch Again" msgstr "Запустить снова" #: ../kupfer/obj/objects.py:335 msgid "Launch another instance of this application" msgstr "Запустить другую инстанцию приложения" #: ../kupfer/obj/objects.py:341 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Закрыть" #: ../kupfer/obj/objects.py:349 msgid "Attempt to close all application windows" msgstr "Попытка закрыть все окна приложений" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:396 msgid "Run" msgstr "Запустить" #: ../kupfer/obj/objects.py:406 msgid "Perform command" msgstr "Выполнить команду" #: ../kupfer/obj/objects.py:419 msgid "(Empty Text)" msgstr "(пустой текст)" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:449 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "(%(num)d строка) \"%(text)s\"" msgstr[1] "(%(num)d строки) \"%(text)s\"" msgstr[2] "(%(num)d строк) \"%(text)s\"" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s и другие." #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Рекурсивные источники %(dir)s, (%(levels)d levels)" #: ../kupfer/obj/sources.py:108 #, python-format msgid "Directory source %s" msgstr "Источник каталога %s" #: ../kupfer/obj/sources.py:119 msgid "Home Folder" msgstr "Домашняя папка" #: ../kupfer/obj/sources.py:130 msgid "Catalog Index" msgstr "Индекс каталога" #: ../kupfer/obj/sources.py:145 msgid "An index of all available sources" msgstr "Индекс всех доступных источников" #: ../kupfer/obj/sources.py:177 msgid "Root catalog" msgstr "Корневой каталок" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Пожалуйста, настройте плагин" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "Плагин %s не настроен" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "Неправельные учетные данные пользователя для %s" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Приложения" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Все приложения и настройки" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Приложения для рабочей среды" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Открыть в ..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Открыть с помощью любого приложения" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Установить приложение по умолчанию для открытия данного типа файлов" #: ../kupfer/plugin/archivemanager.py:1 msgid "Archive Manager" msgstr "Менеджер Архивов" #: ../kupfer/plugin/archivemanager.py:9 msgid "Use Archive Manager actions" msgstr "Использовать действие Менеджера Архивов" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Тип сжатого архива для 'Создать архив в'" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Извлечь здесь" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Извлечь сжатый архив" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Создать Архив" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Создать сжатый архив из папки" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Создать архив в..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Архив" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Калькулятор" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Вычисление значения выражения, начинающегося с '='" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Вычислить" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:112 msgid "Clipboards" msgstr "Буфер обмена" #: ../kupfer/plugin/clipboard.py:4 msgid "Recent clipboards and clipboard proxy objects" msgstr "Недавние объекты и прокси объекты буфера обмена" #: ../kupfer/plugin/clipboard.py:24 msgid "Number of recent clipboards to remember" msgstr "Количество запоминаемых буферов обмена," #: ../kupfer/plugin/clipboard.py:30 msgid "Include selected text in clipboard history" msgstr "Добавить выделенный текст в историю буфера обмена" #: ../kupfer/plugin/clipboard.py:36 msgid "Copy selected text to primary clipboard" msgstr "Скопировать выделенный текст в основной буфер обмена" #: ../kupfer/plugin/clipboard.py:47 msgid "Selected Text" msgstr "Выделенный текст" #: ../kupfer/plugin/clipboard.py:57 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Буфер обмена содержит %(num)d строку \"%(desc)s\"" msgstr[1] "Буфер обмена содержит %(num)d строки \"%(desc)s\"" msgstr[2] "Буфер обмена содержит %(num)d строк \"%(desc)s\"" #: ../kupfer/plugin/clipboard.py:64 msgid "Clipboard Text" msgstr "Текс в буфере обмена " #: ../kupfer/plugin/clipboard.py:74 msgid "Clipboard File" msgstr "Файл в буфере обмена" #: ../kupfer/plugin/clipboard.py:84 msgid "Clipboard Files" msgstr "Файлы в буфере обмена" #: ../kupfer/plugin/clipboard.py:92 msgid "Clear" msgstr "Очистить" #: ../kupfer/plugin/clipboard.py:104 msgid "Remove all recent clipboards" msgstr "Очистить буфер обмена" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Команды Shell" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" "Запуск консольных программ. Действия отмеченные символом %s будут запущены в " "дочернем процессе" #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Запустить (Получить результат)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Запустить программу и возвратить результат" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 msgid "Pass to Command..." msgstr "Передать команде..." #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "Запустить программу с объектом в качестве дополнительного параметра" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 msgid "Write to Command..." msgstr "Записать в команду..." #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 msgid "Run program and supply text on the standard input" msgstr "Запустить програму и передать текс на стандартый ввод" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "" #: ../kupfer/plugin/commands.py:215 msgid "Run command-line programs" msgstr "Запуск консольных программ" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "GTK+" #: ../kupfer/plugin/core/alternatives.py:13 msgid "GNOME Terminal" msgstr "терминал GNOME" #: ../kupfer/plugin/core/alternatives.py:22 msgid "XFCE Terminal" msgstr "Терминал XFCE" #: ../kupfer/plugin/core/alternatives.py:31 msgid "LXTerminal" msgstr "LXTerminal" #: ../kupfer/plugin/core/alternatives.py:40 msgid "X Terminal" msgstr "X Терминал" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "Urxvt" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Сохранить как..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Выйти" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Завершить Kupfer" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "О программе Kupfer" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Отобразить информацию об авторах и лицензии Kupfer" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Справка Kupfer" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Получить справку Kupfer" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Показать окно настроек Kupfer" #: ../kupfer/plugin/core/__init__.py:64 msgid "Search Contents" msgstr "Поиск содержания" #: ../kupfer/plugin/core/__init__.py:82 msgid "Search inside this catalog" msgstr "Поиск внутри каталога" #: ../kupfer/plugin/core/__init__.py:90 msgid "Copy" msgstr "Копировать" #: ../kupfer/plugin/core/__init__.py:105 msgid "Copy to clipboard" msgstr "Копировать в буфер обмена" #: ../kupfer/plugin/core/__init__.py:127 msgid "Rescan" msgstr "Повторить поиск" #: ../kupfer/plugin/core/__init__.py:142 msgid "Force reindex of this source" msgstr "Форсировать рейндексацию данного источника" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Последняя команда" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Внутренние объекты Kupfer" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Последний результат" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Результаты команды" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Словарь" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Искать слово в словаре" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Искать" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Документы" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "Недавно используемые документы и избранные папки" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Последние элементы" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Недавно используемые документы" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "%s Доументы" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Недавно используемые документы для %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Места" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Избранные папки" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Закладки Epiphany" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Список закладок Epiphany" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Избранные" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "" "Отметить часто используемые элементы и хранить объекты для последующего " "использования" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "\"Избранные \" элементы" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Добавить в Избранное" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Добавить элемент в избранное" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Удалить из Избраного" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Удалить элемент из избранного" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Действия над файлом" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Другие действия с файлом" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:211 msgid "Move To..." msgstr "Переместитесь в..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:253 msgid "Move file to new location" msgstr "Переместите файл на новое место" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Переименовать в..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:166 msgid "Copy To..." msgstr "Копировать в..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:207 msgid "Copy file to a chosen location" msgstr "Копировать файл в выбранное место" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Закладки Firefox" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Список закладок Firefox" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "Включая посещенные сайты" #. TRANS: Multihead refers to support for multiple computer displays #. TRANS: In this case, it only concerns the special configuration #. TRANS: with multiple X "screens" #: ../kupfer/plugin/multihead.py:4 msgid "Multihead Support" msgstr "Поддержка нескольких мониторов" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Выбранный Файл" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Выбранный файл \"%s\"" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Выбранные файлы" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Заметки" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Заметки Gnote или Tomboy" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Работа с приложением" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Открыть с помощью приложения для работы с заметками" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Добавить к заметке..." #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Добавить текст в существующую заметку" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Создать заметку" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Создать новую заметку из данного текста" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Получить результаты поиска заметок" #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "Показать результаты поиска по данному запросу" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "сегодня, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "вчера, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Последнее обновление %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "" "Воспроизведение и добавление треков в очередь , просмотр библиотеки музыки" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Включая популярных исполнителей" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Включая популярные альбомы" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Включая популярные песни" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Воспроизвести" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Возобновить воспроизведение в Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Пауза" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Приостановить воспроизведение в Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Следующая" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Перейти к следующему треку в Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Предыдущая" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Перейти к предыдущему треку в Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Отобразить воспроизведение" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Сообщить, какая песня сейчас играет" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Очистите очередь" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Воспроизвести трек в Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Добавить в очередь" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Добавить трек в очередь воспроизведения" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "Исполнитель: %(artist)s, альбом: %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "Исполнитель: %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Исполнитель треков: %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Альбом" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Музыкальные альбомы в библиотеки Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Исполнитель" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Исполнители в библиотеки Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Песни" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Песни в библиотеки Rhythmbox" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "Управление сеансами GNOME" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "Специальные элементы и действия для среды GNOME" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Завершить сеанс..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Выйдите из системы или измените пользователя" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Выключить компьютер..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Выключить, перезагрузить или приостановить компьютер" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Заблокировать экран" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Включить заставку экрана и блокировку" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "Управление сеансами XFCE" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Специальные элементы и действия для среды XFCE" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Отобразить текс" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:58 msgid "Display text in a window" msgstr "Отобразить текст в окне" #: ../kupfer/plugin/show_text.py:37 #, fuzzy msgid "Large Type" msgstr "Большой тип" #: ../kupfer/plugin/show_text.py:66 msgid "Show Notification" msgstr "Отобразить уведомление" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Мусорная корзина" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Доступ к содержанию мусорной корзины" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Переместить в мусорную корзину" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Переместите этот файл в мусорную корзину" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Восстановить" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Переместить файл на прежнее место" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "Мусорная корзина пуста" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "В мусорной корзине находится %(num)s файл" msgstr[1] "В мусорной корзине находится %(num)s файла" msgstr[2] "В мусорной корзине находится %(num)s файлов" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Триггеры" #: ../kupfer/plugin/triggers.py:6 msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Назначить глобальных сочетаний клавиш (триггеров) для объектов, созданных " "при помощи действия 'Составить команду'" #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Добавить триггер" #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Удалить триггер" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "Действия URL" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Загрузить и открыть" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Скачать в..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "Скачать URL в выбранное место" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Тома и Диски" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Монтированые тома и диски" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Том монтирован в %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Размонтировать" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Размонтировать этот том" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Извлечь" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Размонтировать и извлечь этот носитель" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Поиск в Интернете" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Поиск в Интернете при помощи поисковой системы OpenSearch" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Поиск при помощи..." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Поиск..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Поисковые системы" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedia" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Поиск в Википедии" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Язык Википедии" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "en" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Поиск этого термина на %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Список окон" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Все окна на всех рабочих столах" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Активировать" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Скрутить в заголовок" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Раскрутить из заголовка" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Свернуть" #: ../kupfer/plugin/windows.py:25 #, fuzzy msgid "Unminimize" msgstr "Развернуть" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Развернуть" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Развернуть вертикально" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Окно находится на %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Переднее окно" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Следующие окно" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Перейти к этому рабочему окну " #: ../kupfer/plugin/windows.py:252 #, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "%d окно" msgstr[1] "%d окна" msgstr[2] "%d окон" #: ../kupfer/plugin/windows.py:256 msgid "Active workspace" msgstr "Активный рабочий стол" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Перейти к этому рабочему столу" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Рабочие столы" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Документы, недавно используемый в Abiword" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Недавние элементы Abiword" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Взаимодействие с менеджером пакетов APT" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Метод установки" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Отобразить Информация о пакете" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Установить" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Установить пакет с помощью настроенного метода" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Пакеты соответствующие \"%s\"" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Поиск имени пакеты..." #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "Deep Archives" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Позволяет просматривать файлы внутри архива" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "Содержание %s" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "Набор значков Ascii и Unicode" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" "Обеспечивает наборы значков Ascii и Unicode , которые используют буквы и " "символы , чтобы создавать значки для объектов, найденных в Kupfer." #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "Ascii" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "Unicode" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Управление воспроизведением и плейлистами Audacious " #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Добавить трек в очередь воспроизведения Audacious" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Убрать из очереди" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Удалить трек из очереди воспроизведения Audacious" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Перейти к треку в Audacious" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Возобновить воспроизведение в Audacious" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Приостановить воспроизведение в Audacious" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Перейти к следующему треку в Audacious" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Перейти к предыдущему треку в Audacious" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Очистить очередь воспроизведения Audacious" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Перемешать" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Переключить в режим перемешивание в Audacious" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Повторить" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Переключить в режим повтора в Audacious" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Плейлист" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Закладки Chromium" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Список закладок Chromium" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Контакты и действия Claws Mail" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:31 msgid "Compose New Email" msgstr "Создать новое электронное письмо" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Создать новое сообщение в Claws Mail" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Получите все электронные письма" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "Получать новые сообщения из всех учетных записей в ClawsMail" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:47 msgid "Compose Email" msgstr "Создать электронное письмо" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "Отправить в электронном письме..." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Создать новое сообщение в Claws Mail и прикрепить файл" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Адресная книга Claws Mail" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Контакты из адресной книги Claws Mail" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 msgid "Custom Terminal" msgstr "Пользовательский терминал" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "Настройка пользовательского эмулятора терминала" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "Выполнить флаг" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "Пользовательская тема" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "Использовие пользовательской цветовой схемы" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "Тема:" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Почтовый клиент по умолчанию" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "Создание нового электронного письма в почтовом клиенте по умолчанию" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Поиск в Devhelp" #: ../kupfer/plugin/duckduckgo.py:5 ../kupfer/plugin/duckduckgo.py:19 msgid "DuckDuckGo Search" msgstr "Поиск DuckDuckGo" #: ../kupfer/plugin/duckduckgo.py:8 ../kupfer/plugin/duckduckgo.py:30 msgid "Search the web securely with DuckDuckGo" msgstr "Безопасный поис в Интернете с DuckDuckGo" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "Empathy" #: ../kupfer/plugin/empathy.py:6 msgid "Access to Empathy Contacts" msgstr "Доступ к контактам Empathy" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Показать контакты не в сети" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Доступные " #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Отошёл" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Занят" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Не доступен" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Невидимый" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Не в сети" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:93 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:197 msgid "Open Chat" msgstr "Открыть чат" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:121 #: ../kupfer/plugin/skype.py:243 msgid "Change Global Status To..." msgstr "Изменить глобальный статус на..." #: ../kupfer/plugin/empathy.py:171 msgid "Empathy Contacts" msgstr "Контакты Empathy" #: ../kupfer/plugin/empathy.py:237 msgid "Empathy Account Status" msgstr "Статус учётной записи Empathy" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Контакты Evolution" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Создать новое сообщение в Evolution" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Создать новое сообщение в Evolution и прикрепить файл" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Адресная книга Evolution" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Отображение сайтов и обработка ftp адресов с помощью Filezilla" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Открыть сайт с помощью Filezilla" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Сайты Filezilla" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Сайты из Filezilla" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Доступ к контактам Gajim" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Cвободен для общения" #: ../kupfer/plugin/gajim.py:149 msgid "Gajim Contacts" msgstr "Контакты Gajim" #: ../kupfer/plugin/gajim.py:213 msgid "Gajim Account Status" msgstr "Статус учётной записи Gajim" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "Glob" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:234 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "Загрузка контактов и создие новых сообщений в Gmail" #: ../kupfer/plugin/gmail/__init__.py:33 msgid "Load contacts' pictures" msgstr "Загрузить картинки контактов" #: ../kupfer/plugin/gmail/__init__.py:39 msgid "Load additional information" msgstr "Загрузить дополнительную информацию " #: ../kupfer/plugin/gmail/__init__.py:50 msgid "Work email" msgstr "Рабочий email" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Home email" msgstr "Домашний email" #: ../kupfer/plugin/gmail/__init__.py:52 msgid "Other email" msgstr "Другие email" #: ../kupfer/plugin/gmail/__init__.py:54 msgid "Work address" msgstr "Рабочий адрес" #: ../kupfer/plugin/gmail/__init__.py:55 msgid "Home address" msgstr "Домашний адрес" #: ../kupfer/plugin/gmail/__init__.py:56 msgid "Other address" msgstr "Другой адрес" #: ../kupfer/plugin/gmail/__init__.py:58 msgid "Car phone" msgstr "Автомобильный телефон" #: ../kupfer/plugin/gmail/__init__.py:59 msgid "Fax" msgstr "Факс" #: ../kupfer/plugin/gmail/__init__.py:61 msgid "Home phone" msgstr "Домашний телефон" #: ../kupfer/plugin/gmail/__init__.py:62 msgid "Home fax" msgstr "Домашний Факс" #: ../kupfer/plugin/gmail/__init__.py:63 msgid "Internal phone" msgstr "Внутренний телефон" #: ../kupfer/plugin/gmail/__init__.py:64 msgid "Mobile" msgstr "Мобильный телефон" #: ../kupfer/plugin/gmail/__init__.py:65 msgid "Other" msgstr "Другой" #: ../kupfer/plugin/gmail/__init__.py:66 msgid "VOIP" msgstr "VOIP" #: ../kupfer/plugin/gmail/__init__.py:67 msgid "Work phone" msgstr "Рабочий телефон" #: ../kupfer/plugin/gmail/__init__.py:68 msgid "Work fax" msgstr "Рабочий Факс" #: ../kupfer/plugin/gmail/__init__.py:93 msgid "Compose Email in Gmail" msgstr "Создать электронное письмо в Gmail" #: ../kupfer/plugin/gmail/__init__.py:117 msgid "Open web browser and compose new email in Gmail" msgstr "Открыть веб-браузер и создать новое электронное письмо в Gmail" #: ../kupfer/plugin/gmail/__init__.py:123 msgid "Edit Contact in Gmail" msgstr "Редактировать контакты в Gmail" #: ../kupfer/plugin/gmail/__init__.py:133 msgid "Open web browser and edit contact in Gmail" msgstr "Открыть веб-браузер и редактировать контакты в Gmail" #: ../kupfer/plugin/gmail/__init__.py:263 msgid "Contacts from Google services (Gmail)" msgstr "Контакты из служеб Google (Gmail)" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "Профили терминала GNOME" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "Запустить профили терминала GNOME" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Отображение альбомов и загрузка файлов на Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:35 #, fuzzy msgid "Users to show: (,-separated)" msgstr "Пользователи для отображения: (разделитель-\",\")" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Загрузить пользователей и значки альбомов" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Загрузка изображений" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Загрузка изображений в веб-альбом Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Создание альбома:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Альбом созданный Kupfer" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Файл:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "%(num)d альбом" msgstr[1] "%(num)d альбома" msgstr[2] "%(num)d альбомов" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "%(num)s фото" msgstr[1] "%(num)s фото" msgstr[2] "%(num)s фото" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Загрузить в альбом Picasa ..." #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Загрузить файлы в альбом Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Загрузить в Picasa как новый альбом" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Создать альбом из выбранной папки" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Альбомы Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Пользовательские альбомы в Picasa" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Поиск Google" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Поиск в Google с прямым отображением результатов" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #, python-format msgid "Results for \"%s\"" msgstr "Результаты для \"%s\"" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Отобразить больше результатов для \"%s\"" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "Всего найденно %s " #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "Просмотр и создание новых задач в GTG" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "до: %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "от: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "теги: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Открыть задачу в Getting Things GNOME!" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Удалить" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Безвозвратно удалить эту задачу" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Выполнено" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Отметить эту задачу, как выполненную" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Отклонить" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Отменить данную задачу как не используемую" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Создать задачу" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Создать новую задачу в Getting Things GNOME" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "Gwibber" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" "Микроблогинг с Gwibber. Позволяет отправлять и получать сообщения из " "социальных сетей, таких как Twitter, Identi.ca и т.д. Необходим пакет " "'gwibber-service'." #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "Максимальное количество отображаемых сообщений" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s на %(service)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s написал в %(where)s" #: ../kupfer/plugin/gwibber.py:187 msgid "Send Message" msgstr "Отправить сообщение" #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "Отправить сообщение для всех учетных записей Gwibber" #: ../kupfer/plugin/gwibber.py:210 msgid "Send Message To..." msgstr "Отправить сообщение для..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "Отправит сообщение на учетную запись Gwibber" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Отправить сообщение..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "Отправьте сообщение для выбранной учетной записи Gwibber" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Ответить..." #: ../kupfer/plugin/gwibber.py:314 msgid "Delete Message" msgstr "Удалить сообщение" #: ../kupfer/plugin/gwibber.py:337 msgid "Send Private Message..." msgstr "Отправить личное сообщение..." #: ../kupfer/plugin/gwibber.py:370 msgid "Send direct message to user" msgstr "Отправить персональное сообщение для пользователя" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "Ретвит" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet To..." msgstr "Ретвит к..." #: ../kupfer/plugin/gwibber.py:407 msgid "Retweet message to all Gwibber accounts" msgstr "Ретвит сообщения для всех учетных записей Gwibber" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "Ретвит сообщения для учётной записи Gwibber" #: ../kupfer/plugin/gwibber.py:413 msgid "Open in Browser" msgstr "Открыть в браузере" #: ../kupfer/plugin/gwibber.py:419 msgid "Open message in default web browser" msgstr "Открыть сообщение в веб-браузере по умолчанию" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 msgid "Gwibber Accounts" msgstr "Учетные записи Gwibber" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "Учетные записи, настроенные в Gwibber" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "Сообщения Gwibber" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "Последние сообщения, полученные в Gwibber" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "Gwibber сообщения для %s" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "Потоки Gwibber" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "Потоки, настроенные в Gwibber" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "Сообщения Gwibber в %s" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "Gwibber (Простой)" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "Отправление обновлений через клиент микроблоггинга Gwibber" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "Отправить обновление" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "Не удалось активировать службу Gwibber" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Действия с высоким приоритетом" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Инструменты для работы с командами как с объектами" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Выбрать в Kupfer" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Результат для %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Запустить (Получить результат)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Получить результат команды как прокси-объект" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Запустить (Отменить результат)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Инструменты для работы с изображением" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Инструменты трансформирования изображений" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Масштабировать" #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Поворот по часовой стрелке" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Поворот против часовой стрелки" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Автоповорот" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Повернуть JPEG (на месте) в соответствии с метаданными EXIF" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Плагины Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Получить доступ к списку плагинов Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Отобразить информацию" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Отобразить исходный код" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "включен" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Определить местоположение файлов" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Поиск по файловой системе с помощью locate" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Не учитывать регистр при поиске файлов" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "OpenOffice / LibreOffice" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:136 msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Документы, недавно используемые в OpenOffice/LibreOffice" #: ../kupfer/plugin/openoffice.py:84 msgid "OpenOffice/LibreOffice Recent Items" msgstr "Последние элементы OpenOffice/LibreOffice" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera Mail" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Контакты и действия Opera Mail" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Создать новое сообщение в Opera Mail" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Контакты Opera Mail" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Контакты из Opera Mail" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Закладки Opera" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Список закладок Opera" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Доступ к контактам Pidgin" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d символ)" msgstr[1] "%s (%d символа)" msgstr[2] "%s (%d символов)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Контакты Pidgin" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "Сеансы PuTTY" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Быстрый доступ к сеансам PuTTY" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Начать сеанс" #: ../kupfer/plugin/qsicons/__init__.py:24 msgid "Quicksilver Icons" msgstr "Значки Quicksilver" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "Quick Image Viewer" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "Просмотр изображения" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "reStructuredText" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "Обработка и отображение результатов reStructuredText " #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Просмотреть как HTML документ" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "Активные сеансы GNU Screen " #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Прикрепленн" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Отсоединён" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s сеанс (%(pid)s) создан %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Screen Sessions" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Прикрепить" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:52 msgid "Send Keys" msgstr "Отправить нажатие клавиш" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "" "Отправление синтетических событий клавиатуры, с использованием xautomation" #: ../kupfer/plugin/sendkeys.py:28 msgid "Paste to Foreground Window" msgstr "Встасить в активное окно" #: ../kupfer/plugin/sendkeys.py:46 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "Копировать в буфер обмена и отправить Ctrl+V активному окну" #: ../kupfer/plugin/sendkeys.py:101 msgid "Send keys to foreground window" msgstr "Отправить не активному окну нажатие клавиш" #: ../kupfer/plugin/sendkeys.py:106 msgid "Type Text" msgstr "Ввести текс" #: ../kupfer/plugin/sendkeys.py:127 msgid "Type the text to foreground window" msgstr "Ввести текст в активное окно" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Системные службы" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "Запуск, остановка или перезапуск системных служб через init скрипты" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Sudo-подобная команда" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Запустить службу" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Перезапустить службу" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Остановить службу" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "%s служба" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Сократить Ссылки" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Создание короткие алиасов для длинных URL" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Ошибка" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Сократить с помощью..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Службы" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 msgid "Show QRCode" msgstr "Отобразить QR-код" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 msgid "Display text as QRCode in a window" msgstr "Отобразить текст в окне , как QR-код" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Доступ к контактам Skype" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skype Me" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Вышел из системы" #: ../kupfer/plugin/skype.py:179 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:218 msgid "Call" msgstr "Позвонить" #: ../kupfer/plugin/skype.py:232 msgid "Place a call to contact" msgstr "Позвонить контакту" #: ../kupfer/plugin/skype.py:267 msgid "Skype Contacts" msgstr "Контакты Skype" #: ../kupfer/plugin/skype.py:287 msgid "Skype Statuses" msgstr "Skype статусы" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "SSH хосты" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "Добавить хосты найденные в ~/.ssh/config." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "SSH хост" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Подключить" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "Подключить к SSH хосту" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "SSH хосты определённые в ~/.ssh/config" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Не найдено DBus соединение для данного сеанса рабочего стола" #: ../kupfer/plugin_support.py:171 msgid "GNOME Keyring" msgstr "GNOME Keyring" #: ../kupfer/plugin_support.py:172 msgid "KWallet" msgstr "KWallet" #: ../kupfer/plugin_support.py:173 msgid "Unencrypted File" msgstr "Незашифрованный файл" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Шаблоны документов" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Создать новый документ из шаблона" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "%s шаблон" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Пустой файл" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Новая папка" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Создать новый документ..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Создать новый документ из шаблона" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Создать документ из..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "Текстовые файлы" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Добавьте к..." #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Добавить..." #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Записать в..." #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Получить содержание текста" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:185 #: ../kupfer/plugin/thunar.py:225 ../kupfer/plugin/thunar.py:278 #: ../kupfer/plugin/thunar.py:329 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:11 msgid "File manager Thunar actions" msgstr "Действия файлового менеджера Thunar" #: ../kupfer/plugin/thunar.py:67 msgid "Select in File Manager" msgstr "Выбрать в файловом менеджере" #: ../kupfer/plugin/thunar.py:95 msgid "Show Properties" msgstr "Отобразить свойства" #: ../kupfer/plugin/thunar.py:118 msgid "Show information about file in file manager" msgstr "Отобразить информацию о файле в файловом менеджере" #: ../kupfer/plugin/thunar.py:127 msgid "Send To..." msgstr "Отправить ..." #: ../kupfer/plugin/thunar.py:259 msgid "Symlink In..." msgstr "Символьная ссылка в..." #: ../kupfer/plugin/thunar.py:300 msgid "Create a symlink to file in a chosen location" msgstr "Создать символьную ссылку в выбранном месте" #: ../kupfer/plugin/thunar.py:304 msgid "Empty Trash" msgstr "Очистить корзину" #: ../kupfer/plugin/thunar.py:344 msgid "Thunar Send To Objects" msgstr "Thunar отправить объектам" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Контакты и действия Thunderbird/Icedove" #: ../kupfer/plugin/thunderbird.py:38 msgid "Compose a new message in Thunderbird" msgstr "Создать новое сообщение в Thunderbird" #: ../kupfer/plugin/thunderbird.py:74 msgid "Thunderbird Address Book" msgstr "Адресная книга Thunderbird" #: ../kupfer/plugin/thunderbird.py:99 msgid "Contacts from Thunderbird Address Book" msgstr "Контакты из адресной книги Thunderbird" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Top" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Отображение запущенныч задач и возможность посылать им сигналы" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Порядок сортировки" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Командная строка " #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "Использование ЦП (по убыванию)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Использование памяти (по убыванию)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Отправить сигнал..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Сигналы" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Запущенные задачи" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s ЦПУ: %(cpu)g%% ОЗУ: %(mem)g%% время: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Запущенные задачи для текущего пользователя" #: ../kupfer/plugin/tracker1.py:10 msgid "Tracker" msgstr "Tracker" #: ../kupfer/plugin/tracker1.py:18 ../kupfer/plugin/tracker.py:15 msgid "Tracker desktop search integration" msgstr "Интегрированная поисковая система Track" #: ../kupfer/plugin/tracker1.py:49 ../kupfer/plugin/tracker.py:41 msgid "Search in Tracker" msgstr "Поиск в Tracker" #: ../kupfer/plugin/tracker1.py:54 ../kupfer/plugin/tracker.py:46 msgid "Open Tracker Search Tool and search for this term" msgstr "Открыть Поиск Tracker и начать поиск этого выражения " #: ../kupfer/plugin/tracker1.py:62 ../kupfer/plugin/tracker.py:55 msgid "Get Tracker Results..." msgstr "Получить результаты Tracker..." #: ../kupfer/plugin/tracker1.py:71 ../kupfer/plugin/tracker.py:64 msgid "Show Tracker results for query" msgstr "Отобразить результаты запроса Tracker " #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Теги Tracker" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Теги Tracker" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Просмотреть теги Tracker" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "Тег %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Объекты отмеченные тегом %s с помощью Tracker" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Добавить тег..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Добавить тег tracker в файл" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Удалить тег..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Удалить тег tracker из файла" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Разделы из истории TrueCrypt" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "Раздел TrueCrypt: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Монтировать раздел" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Монтировать в Truecrypt" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Попробовать смонтировать файл как раздел Truecrypt" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Размонтировать все разделы" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "Разделы TrueCrypt" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Terminal Server Client" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Сеанс сохраный в Terminal Server Client" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr " TSClient" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Сеансы сохранённые в Terminal Server Client" #: ../kupfer/plugin/vim/__init__.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim/__init__.py:4 msgid "Recently used documents in Vim" msgstr "Документы, недавно используемые в Vim" #: ../kupfer/plugin/vim/plugin.py:56 msgid "Vim Recent Documents" msgstr "Недавние документы Vim" #: ../kupfer/plugin/vim/plugin.py:219 msgid "Close (Save All)" msgstr "Закрыть (Сохранить все)" #: ../kupfer/plugin/vim/plugin.py:237 msgid "Send..." msgstr "Отправить..." #: ../kupfer/plugin/vim/plugin.py:264 msgid "Send ex command" msgstr "Отправить ex-команду" #: ../kupfer/plugin/vim/plugin.py:272 msgid "Insert in Vim..." msgstr "Вставить в Vim..." #: ../kupfer/plugin/vim/plugin.py:309 msgid "Active Vim Sessions" msgstr "Активные сеансы Vim" #: ../kupfer/plugin/vim/plugin.py:338 #, python-format msgid "Vim Session %s" msgstr "Vim cеанс: %s" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Закладки и действия Vinagre" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Запустить сеанс Vinagre" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Закладки Vinagre" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "Управление виртуальными машинами VirtualBox. Поддерживаются как Sun " "VirtualBox так и Open Source Edition." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "Форсировать использование интерфейса CLI " #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Включить" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Запустить без X сервера" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Послать сигнал выключения" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Перезагрузить" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Возобновить" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Сохранить состояние" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Выключить" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "Машины VirtualBox" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:11 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "Доступ к страницам, сохранённым в Zim " #: ../kupfer/plugin/zim.py:30 msgid "Page names start with :colon" msgstr "Название страниц начинаются с \":\" двоеточия" #: ../kupfer/plugin/zim.py:36 msgid "Default page name for quick notes" msgstr "Названия быстрых заметок по умолчанию" #: ../kupfer/plugin/zim.py:38 #, python-format msgid "Note %x %X" msgstr "Заметка %x %X" #: ../kupfer/plugin/zim.py:39 msgid "" "Strftime tags can be used: %H - hour, %M - minutes, etc\n" "Please check python documentation for details.\n" "NOTE: comma will be replaced by _" msgstr "" "Strftime-теги могут быть использованы как: %H - часы, %M - минуты, и т.д\n" "Для получения дополнительной информации ознакомьтесь с документацией " "python.\n" "ПРИМЕЧАНИЕ: запятые будут заменены на _" #: ../kupfer/plugin/zim.py:45 msgid "Default namespace for quick notes" msgstr "Пространство имён быстрых заметок по умолчанию" #: ../kupfer/plugin/zim.py:80 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Zim страница из записной книжки \"%s\"" #: ../kupfer/plugin/zim.py:89 msgid "Create Zim Page" msgstr "Создать страницу Zim" #: ../kupfer/plugin/zim.py:96 msgid "Create page in default notebook" msgstr "Создать страицу в записной книжке по умолчанию" #: ../kupfer/plugin/zim.py:108 msgid "Create Zim Page In..." msgstr "Создать страицу Zim в..." #: ../kupfer/plugin/zim.py:132 msgid "Insert QuickNote into Zim" msgstr "Вставить быструю заметку в Zim" #: ../kupfer/plugin/zim.py:142 msgid "Quick note selected text into Zim notebook" msgstr "Создать быструю заметку из выбранного текста в записной книжке Zim" #: ../kupfer/plugin/zim.py:191 msgid "Create Subpage..." msgstr "Создать подстраницу" #: ../kupfer/plugin/zim.py:370 msgid "Zim Notebooks" msgstr "Записная книжка Zim" #: ../kupfer/plugin/zim.py:387 msgid "Zim Pages" msgstr "Zim страницы" #: ../kupfer/plugin/zim.py:415 msgid "Pages stored in Zim Notebooks" msgstr "Страницы, сохранённые в записной книжке Zim " kupfer-v208/po/sl.po000066400000000000000000002611061176220042200144450ustar00rootroot00000000000000# Slovenian translations for kupfer. # Copyright (C) 2006 Free Software Foundation, Inc. # This file is distributed under the same license as the kupfer package. # # Andrej Žnidaršič , 2009 - 2010. # msgid "" msgstr "" "Project-Id-Version: kupfer master\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2012-02-27 13:52+0000\n" "PO-Revision-Date: 2012-02-28 20:21+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenian GNOME Translation Team \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-Country: SLOVENIA\n" "X-Poedit-Language: Slovenian\n" "X-Poedit-SourceCharset: utf-8\n" #: ../auxdata/kupfer.desktop.in.h:1 #: ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Application Launcher" msgstr "Zaganjalnik programov" #: ../auxdata/kupfer.desktop.in.h:3 msgid "Convenient command and access tool for applications and documents" msgstr "Prikladno orodje za izvajanje ukazov in dostopa do programov in dokumentov" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Izvedi v Kupferju" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Shranjen ukaz Kupfer" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Uporabniška poverila" #: ../data/credentials_dialog.ui.h:2 msgid "_User:" msgstr "_Uporabnik:" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "_Geslo:" #: ../data/credentials_dialog.ui.h:4 msgid "_Change" msgstr "_Spremeni" #: ../data/getkey_dialog.ui.h:1 msgid "Set Keyboard Shortcut" msgstr "Nastavi tipkovno bližnjico" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Pritisnite želeno kombinacijo tipk" #: ../data/getkey_dialog.ui.h:3 msgid "Keybinding could not be bound" msgstr "Tipkovna bližnjica ne more biti vezana" #: ../data/preferences.ui.h:1 #: ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Možnosti Kupfer" #: ../data/preferences.ui.h:2 msgid "Start automatically on login" msgstr "Samodejno zaženi ob prijavi" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Zaženi" #: ../data/preferences.ui.h:4 msgid "Show icon in notification area" msgstr "Pokaži ikono v obvestilnem področju" #: ../data/preferences.ui.h:5 msgid "Icon set:" msgstr "Zbirka ikon:" #: ../data/preferences.ui.h:6 msgid "Terminal emulator:" msgstr "Posnemovalnik terminala:" #: ../data/preferences.ui.h:7 msgid "Desktop Environment" msgstr "Namizno okolje" #: ../data/preferences.ui.h:8 #: ../kupfer/plugin/gmail/__init__.py:60 msgid "General" msgstr "Splošno" #: ../data/preferences.ui.h:9 msgid "Global Keyboard Shortcuts" msgstr "Splošne tipkovne bližnjice" #: ../data/preferences.ui.h:10 #: ../kupfer/ui/preferences.py:849 msgid "Reset" msgstr "Ponastavi" #: ../data/preferences.ui.h:11 msgid "Browser Keyboard Shortcuts" msgstr "Tipkovne bližnjice brskalnika" #: ../data/preferences.ui.h:12 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "Uporabi ukaze enega udarca tipk (presledek, /, pika, vejica, itn.)" #: ../data/preferences.ui.h:13 msgid "Keyboard" msgstr "Tipkovnica" #: ../data/preferences.ui.h:14 msgid "Plugins" msgstr "Vstavki" #: ../data/preferences.ui.h:15 msgid "Inclusion in Top Level Searches" msgstr "Vključitev v iskanja vrhnje ravni" #: ../data/preferences.ui.h:16 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" "Označeni viri imajo svoje predmete vključene v iskanjih vrhnje ravni.\n" "Neoznačena vsebina vira je na voljo le z iskanjem njenega podkataloga." #: ../data/preferences.ui.h:18 msgid "Indexed Folders" msgstr "Mape, uporabljene za pripravo kazala" #: ../data/preferences.ui.h:19 msgid "Folders whose files are always available in the catalog." msgstr "Mape katerih datoteke so vedno vidne v katalogu." #: ../data/preferences.ui.h:20 #: ../kupfer/obj/sources.py:156 msgid "Catalog" msgstr "Katalog" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "Ni mogoče izvesti '%s'" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "\"%s\" je proizvedel rezultat" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "Ni dovoljenja za zagon \"%s\" (ni izvedljivo)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "Ukaz v \"%s\" ni na voljo" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "Rele tipkovnice je dejaven za zaslon %s" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "ob zagonu ne pokaži glavnega vmesnika" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "razvrsti dostopne vstavke" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "omogoči podatke razhroščevanja" #. TRANS: --exec-helper=HELPER is an internal command #. TRANS: that executes a helper program that is part of kupfer #: ../kupfer/main.py:49 msgid "run plugin helper" msgstr "poženi vstavek pomočnika" #: ../kupfer/main.py:52 msgid "show usage help" msgstr "pokaži uporabo pomoči" #: ../kupfer/main.py:53 msgid "show version information" msgstr "pokaži podrobnosti različice" #: ../kupfer/main.py:59 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Uporaba: kupfer [MOŽNOSTI | DATOTEKA ...]" #: ../kupfer/main.py:70 msgid "Available plugins:" msgstr "Razpoložljivi vstavki:" #: ../kupfer/main.py:121 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "Dodatno omogoči" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Trik vejice" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Sestavi ukaz" #: ../kupfer/ui/accelerators.py:11 msgid "Mark Default Action" msgstr "Označi privzeto dejanje" #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "Pozabi predmet" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Ponastavi vse" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Izberi končaj" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Izberi izbrano datoteko" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Izberi izbrano besedilo" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Pokaži pomoč" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Pokaži možnost" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "Preklopi na prvi pladenj" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Preklopi besedilni način" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s je prazen" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "V %(src)s ni zadetkov za \"%(query)s\"" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Ni zadetkov" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Vtipkajte za iskanje" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "Vtipkajte za iskanje %s" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Ni dejanja" #: ../kupfer/ui/browser.py:1513 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "Naredi \"%(action)s\" privzeto za \"%(object)s\"" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1523 #, python-format msgid "Forget About \"%s\"" msgstr "Pozabi \"%s\"" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1960 #: ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Pokaži glavni vmesnik" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Pokaži z izbiro" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Opis" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Avtor" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Različica" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "Zahtevan je Python modul '%s'" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "Vstavka ni mogoče prebrati zaradi napake:" #: ../kupfer/ui/preferences.py:465 #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "onemogočeno" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "Vsebina" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Viri" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Dejanja" #: ../kupfer/ui/preferences.py:575 #, python-format msgid "Using encrypted password storage: %s" msgstr "Uporabi šifrirane shrambe gesel: %s" #: ../kupfer/ui/preferences.py:577 #, python-format msgid "Using password storage: %s" msgstr "Uporaba shrambe gesla: %s" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:594 msgid "Configuration" msgstr "Nastavitev" #: ../kupfer/ui/preferences.py:614 msgid "Set username and password" msgstr "Nastavi uporabniško ime in geslo" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:668 msgid "Choose a Directory" msgstr "Izbor mape" #: ../kupfer/ui/preferences.py:847 msgid "Reset all shortcuts to default values?" msgstr "Ali naj bodo vse bližnjice ponastavljene na privzete vrednosti?" #: ../kupfer/ui/preferences.py:855 #: ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Ukaz" #: ../kupfer/ui/preferences.py:856 msgid "Shortcut" msgstr "Bližnjica" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "Andrej Žnidaršič, " #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Zaganjalnik proste programske opreme (GPLv3+)" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Ta program je prosta programska oprema; lahko ga razširjate\n" "in/ali spreminjate pod pogoji GNU Splošnega javnega dovoljenja kot\n" "je objavljeno pri Free Software Foundation; ali različico 2 Licence\n" "ali (na vašo željo) katerakoli kasnejša različica.\n" "\n" "Ta program je distribuiran v upanju da bo uporaben, toda BREZ\n" "KAKRŠNIHKOLI ZAGOTOVIL; tudi brez impliciranih zagotovila za PRODAJO\n" "ali PRIMERNOST ZA DOLOČEN NAMEN. Oglejte si\n" "GNU General Public Licence za več podrobnosti.\n" "\n" "Skupaj s programom bi morali prejeti tudi kopijo splošnega javnega potrdila;\n" "v primeru, da kopije niste prejeli, si oglejte .\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "Ni mogoče najti Kupferja v teku" #: ../kupfer/obj/base.py:457 #: ../kupfer/plugin/core/text.py:22 msgid "Text" msgstr "Besedilo" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Zaženi po zamiku ..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Izvede ukaz po določenem časovnem zamiku" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Več predmetov" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s predmetov" msgstr[1] "%s predmet" msgstr[2] "%s predmeta" msgstr[3] "%s predmeti" #: ../kupfer/obj/contacts.py:129 #: ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/contacts.py:131 msgid "unknown" msgstr "neznano" #: ../kupfer/obj/contacts.py:144 msgid "Aim" msgstr "AIM" #: ../kupfer/obj/contacts.py:151 msgid "Google Talk" msgstr "Google Talk" #: ../kupfer/obj/contacts.py:159 msgid "ICQ" msgstr "ICQ" #: ../kupfer/obj/contacts.py:166 msgid "MSN" msgstr "MSN" #: ../kupfer/obj/contacts.py:173 msgid "QQ" msgstr "QQ" #: ../kupfer/obj/contacts.py:180 msgid "Yahoo" msgstr "Yahoo" #. -*- coding: UTF-8 -*- #: ../kupfer/obj/contacts.py:187 #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "%s ne podpira tega opravila" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "Ni mogoče uporabiti z več predmeti" #: ../kupfer/obj/fileactions.py:30 #: ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 #: ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:176 msgid "Open" msgstr "Odpri" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Ni privzetega programa za %(file)s (%(type)s)" #: ../kupfer/obj/fileactions.py:45 #, python-format msgid "Please use \"%s\"" msgstr "Uporabite \"%s\"" #: ../kupfer/obj/fileactions.py:45 #: ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Nastavi privzeti program ..." #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Odpri s privzetim programom" #: ../kupfer/obj/fileactions.py:74 msgid "Reveal" msgstr "Razkrij" #: ../kupfer/obj/fileactions.py:83 msgid "Open parent folder" msgstr "Odpri nadrejeno mapo" #: ../kupfer/obj/fileactions.py:89 msgid "Open Terminal Here" msgstr "Odpri terminal tukaj" #: ../kupfer/obj/fileactions.py:102 msgid "Open this location in a terminal" msgstr "Odpri to mesto v terminalu" #: ../kupfer/obj/fileactions.py:110 msgid "Run in Terminal" msgstr "Zaženi v terminalu" #: ../kupfer/obj/fileactions.py:110 msgid "Run (Execute)" msgstr "Zaženi (izvedi)" #: ../kupfer/obj/fileactions.py:130 msgid "Run this program in a Terminal" msgstr "Zaženi ta program v teminalu" #: ../kupfer/obj/fileactions.py:132 msgid "Run this program" msgstr "Zaženi ta program" #: ../kupfer/obj/objects.py:252 #: ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 #: ../kupfer/plugin/vim/plugin.py:172 msgid "Go To" msgstr "Pojdi na" #: ../kupfer/obj/objects.py:278 msgid "Open URL" msgstr "Odpri URL" #: ../kupfer/obj/objects.py:289 msgid "Open URL with default viewer" msgstr "Odpri URL s privzetim pregledovalnikom" #: ../kupfer/obj/objects.py:303 msgid "Launch" msgstr "Zaženi" #: ../kupfer/obj/objects.py:316 msgid "Show application window" msgstr "Pokaže okno programa" #: ../kupfer/obj/objects.py:317 msgid "Launch application" msgstr "Zaženi program" #: ../kupfer/obj/objects.py:328 msgid "Launch Again" msgstr "Zaženi še enkrat" #: ../kupfer/obj/objects.py:335 msgid "Launch another instance of this application" msgstr "Zažene še en primerek tega programa" #: ../kupfer/obj/objects.py:341 #: ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Zapri" #: ../kupfer/obj/objects.py:349 msgid "Attempt to close all application windows" msgstr "Poskusi zapreti vsa okna programa" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:396 msgid "Run" msgstr "Zaženi" #: ../kupfer/obj/objects.py:406 msgid "Perform command" msgstr "Izvede ukaz" #: ../kupfer/obj/objects.py:419 msgid "(Empty Text)" msgstr "(Prazno besedilo)" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:449 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "(%(num)d vrstic) \"%(text)s\"" msgstr[1] "(%(num)d vrstica) \"%(text)s\"" msgstr[2] "(%(num)d vrstici) \"%(text)s\"" msgstr[3] "(%(num)d vrstice) \"%(text)s\"" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 #: ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s in ostali" #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Rekurziven vir %(dir)s, (%(levels)d ravni)" #: ../kupfer/obj/sources.py:108 #, python-format msgid "Directory source %s" msgstr "Vir slovarja %s" #: ../kupfer/obj/sources.py:118 msgid "Home Folder" msgstr "Domača mapa" #: ../kupfer/obj/sources.py:129 msgid "Catalog Index" msgstr "Kazalo kataloga" #: ../kupfer/obj/sources.py:144 msgid "An index of all available sources" msgstr "Kazalo vseh razpoložljivih virov" #: ../kupfer/obj/sources.py:176 msgid "Root catalog" msgstr "Korenski katalog" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Nastavitve vstavek" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "Vstavek %s ni nastavljen" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "Neveljavna uporabniška poverila za %s" #: ../kupfer/plugin/applications.py:2 #: ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Programi" #: ../kupfer/plugin/applications.py:8 #: ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Vsi programi in možnosti" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Programi za namizno okolje" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Odpri z ..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Odpri s katerimkoli programom" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Nastavi privzet program za odpiranje te vrste datotek" #: ../kupfer/plugin/archivemanager.py:1 msgid "Archive Manager" msgstr "Upravljalnik arhivov" #: ../kupfer/plugin/archivemanager.py:9 msgid "Use Archive Manager actions" msgstr "Uporabi dejanja upravljalnika arhivov" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "Vrsta stisnjenega arhiva za 'Ustvari arhiv v'" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Razširi sem" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Razširi stisnjen arhiv" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Ustvari arhiv" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Ustvari stisnjen arhiv iz mape" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Ustvari arhiv v ..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Arhiv" #: ../kupfer/plugin/calculator.py:2 #: ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Računalo" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "Izračuna izraze, ki se začnejo z '='" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Izračunaj" #: ../kupfer/plugin/clipboard.py:1 #: ../kupfer/plugin/clipboard.py:112 msgid "Clipboards" msgstr "Odložišča" #: ../kupfer/plugin/clipboard.py:4 msgid "Recent clipboards and clipboard proxy objects" msgstr "Nedavna odložišča in predmeti posredniškega strežnika odložišča" #: ../kupfer/plugin/clipboard.py:24 msgid "Number of recent clipboards to remember" msgstr "Število nedavnih odložišč za pomnjenje" #: ../kupfer/plugin/clipboard.py:30 msgid "Include selected text in clipboard history" msgstr "V zgodovino odložišča vključi izbrano besedilo" #: ../kupfer/plugin/clipboard.py:36 msgid "Copy selected text to primary clipboard" msgstr "Kopira izbrano besedilo v osnovno odložišče" #: ../kupfer/plugin/clipboard.py:47 msgid "Selected Text" msgstr "Izbrano besedilo" #: ../kupfer/plugin/clipboard.py:57 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Odložišče z %(num)d vrsticami \"%(desc)s\"" msgstr[1] "Odložišče z %(num)d vrstico \"%(desc)s\"" msgstr[2] "Odložišče z %(num)d vrsticama \"%(desc)s\"" msgstr[3] "Odložišče z %(num)d vrsticami \"%(desc)s\"" #: ../kupfer/plugin/clipboard.py:64 msgid "Clipboard Text" msgstr "Besedila odložišča" #: ../kupfer/plugin/clipboard.py:74 msgid "Clipboard File" msgstr "Datoteka odložišča" #: ../kupfer/plugin/clipboard.py:84 msgid "Clipboard Files" msgstr "Datoteke odložišča" #: ../kupfer/plugin/clipboard.py:92 msgid "Clear" msgstr "Počisti" #: ../kupfer/plugin/clipboard.py:104 msgid "Remove all recent clipboards" msgstr "Odstrani vsa nedavna odložišča" #: ../kupfer/plugin/commands.py:1 #: ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Ukazi lupine" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "Run command-line programs. Actions marked with the symbol %s run in a subshell." msgstr "Požene programe ukazne vrstice. Dejanja označena s simbolom %s tečejo v podlupini." #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Poženi (Dobi izhod)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Zažene program in vrne njegov izhod" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 msgid "Pass to Command..." msgstr "Podaj ukazu ..." #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "Zažene program s predmetom kot dodanim parametrom" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 msgid "Write to Command..." msgstr "Zapiši v ukaz ..." #: ../kupfer/plugin/commands.py:149 #: ../kupfer/plugin/commands.py:161 msgid "Run program and supply text on the standard input" msgstr "Poženi program in dovedi besedilo na standardnem vhodu" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "Filtriraj skozi ukaz ..." #: ../kupfer/plugin/commands.py:215 msgid "Run command-line programs" msgstr "Poženi programe ukaze vrstice" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "GTK+" #: ../kupfer/plugin/core/alternatives.py:13 msgid "GNOME Terminal" msgstr "GNOME Terminal" #: ../kupfer/plugin/core/alternatives.py:22 msgid "XFCE Terminal" msgstr "XFCE Terminal" #: ../kupfer/plugin/core/alternatives.py:31 msgid "LXTerminal" msgstr "LXTerminal" #: ../kupfer/plugin/core/alternatives.py:40 msgid "X Terminal" msgstr "X Terminal" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "Urxvt" #: ../kupfer/plugin/core/commands.py:13 #: ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Shrani kot ..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Končaj" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Konča program Kupfer" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "O programu" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Pokaže podrobnosti o avtorjih in dovoljenju programa Kupfer" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Pomoč Kupfer" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Dobi pomoč s Kupferjem" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Prikaz okna možnosti za Kupfer" #: ../kupfer/plugin/core/__init__.py:64 msgid "Search Contents" msgstr "Vsebina iskanja" #: ../kupfer/plugin/core/__init__.py:82 msgid "Search inside this catalog" msgstr "Poišči znotraj kataloga" #: ../kupfer/plugin/core/__init__.py:90 msgid "Copy" msgstr "Kopiraj" #: ../kupfer/plugin/core/__init__.py:105 msgid "Copy to clipboard" msgstr "Kopiraj v odložišče" #: ../kupfer/plugin/core/__init__.py:127 msgid "Rescan" msgstr "Ponovno preišči" #: ../kupfer/plugin/core/__init__.py:142 msgid "Force reindex of this source" msgstr "Vsili ponovno preiskovanje tega vira" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Zadnji ukaz" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Notranji predmeti Kupfer" #: ../kupfer/plugin/core/internal.py:46 #: ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Zadnji rezultat" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Rezultati ukaza" #: ../kupfer/plugin/dictionary.py:1 #: ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Slovar" #: ../kupfer/plugin/dictionary.py:3 #: ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Poišči besedo v slovarju" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Poišči" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Dokumenti" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "Nedavno uporabljeni dokumenti in zaznamovane mape" # Sem kar malo podaljšal, ker se mi zdi da drugače ni smiselno... #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "Največja starost nedavnih dokumentov v dnevih" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Nedavni predmeti" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Nedavno uporabljeni dokumenti" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "%s dokumentov" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "Nedavno uporabljeni dokumenti za %s" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Mesta" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Zaznamovane mape" #: ../kupfer/plugin/epiphany.py:1 #: ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Zaznamki Epihphany" #: ../kupfer/plugin/epiphany.py:3 #: ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Kazalo zaznamkov Epiphany" #: ../kupfer/plugin/favorites.py:1 #: ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Priljubljene" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "Označi pogosto uporabljene predmete in shrani predmete za kasnejšo uporabo" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "Polica \"Priljubljenih\" predmetov" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Dodaj med priljubljene" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Doda predmet na polico priljubljenih" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Odstrani iz priljubljenih" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Odstrani predmete iz police priljubljenih" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Dejanja datotek" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Več dejanj datotek" #: ../kupfer/plugin/fileactions.py:40 #: ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:211 msgid "Move To..." msgstr "Premakni v ..." #: ../kupfer/plugin/fileactions.py:67 #: ../kupfer/plugin/thunar.py:253 msgid "Move file to new location" msgstr "Premakne datoteko na novo mesto" #: ../kupfer/plugin/fileactions.py:80 #: ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Preimenuj v ..." #: ../kupfer/plugin/fileactions.py:145 #: ../kupfer/plugin/thunar.py:166 msgid "Copy To..." msgstr "Kopiraj v ..." #: ../kupfer/plugin/fileactions.py:186 #: ../kupfer/plugin/thunar.py:207 msgid "Copy file to a chosen location" msgstr "Kopiraj datoteko na izbrano mesto" #: ../kupfer/plugin/firefox.py:4 #: ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Zaznamki Firefox" #: ../kupfer/plugin/firefox.py:6 #: ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Kazalo zaznamkov Firefox" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "Vključi obiskane strani" #. TRANS: Multihead refers to support for multiple computer displays #. TRANS: In this case, it only concerns the special configuration #. TRANS: with multiple X "screens" #: ../kupfer/plugin/multihead.py:4 msgid "Multihead Support" msgstr "Podpora večnitenja" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Izbrana datoteka" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "Zagotavlja trenuten izbor Nautilusa z uporabo Kupferjeve razširitve Nautilus" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "Izbrana datoteka \"%s\"" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Izbrane datoteke" #: ../kupfer/plugin/notes.py:6 #: ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Sporočilca" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Gnote ali Tomboy sporočilca" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Delo s programom" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Odpri s programom sporočilc" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Pripni sporočilcu ..." #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Doda besedilo obstoječemu sporočilcu" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Ustvari sporočilce" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Ustvari novo sporočilce iz tega besedila" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Dobi rezultate iskanja sporočilc ..." #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "Pokaži rezultate iskanja za to poizvedbo" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "danes, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "včeraj, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "Zadnjič posodobljeno %s" #: ../kupfer/plugin/rhythmbox.py:1 #: ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 #: ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "Predvaja in uvršča skladbe in brska po glasbeni knjižnici" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "Vključi izvajalce v zgornji ravni" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "Vključi albume v zgornji ravni" #: ../kupfer/plugin/rhythmbox.py:34 #: ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "Vključi skladbe v zgornji ravni" #: ../kupfer/plugin/rhythmbox.py:63 #: ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 #: ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Predvajaj" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Nadaljevanje predvajanja v Rhythmboxu" #: ../kupfer/plugin/rhythmbox.py:73 #: ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Premor" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Premor predvajanja v Rhyhtmboxu" #: ../kupfer/plugin/rhythmbox.py:83 #: ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Naslednja" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Skoči na naslednjo skladbo v Rhyhtmboxu" #: ../kupfer/plugin/rhythmbox.py:93 #: ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Predhodna" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Skoči na predhodno skladbo v Rhythmboxu" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Pokaži predvajajočo" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Pove katera skladba se trenutno predvaja" #: ../kupfer/plugin/rhythmbox.py:115 #: ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Počisti vrsto" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Predvajanje skladb v Rhythmboxu" #: ../kupfer/plugin/rhythmbox.py:161 #: ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Uvrsti" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Doda skladbe v predvajalno vrsto" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "od %(artist)s iz %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "od %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "Skladbe od %s" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Albumi" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Glasbeni albumi v knjižnici Rhyhtmbox" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Izvajalci" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Izvajalci glasbe v knjižnici Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Pesmi" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Pesmi v knjižnici Rhythmbox" #: ../kupfer/plugin/session_gnome.py:1 #: ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "Upravljanje seje Gnome" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "Posebni predmeti in dejanja za okolje Gnome" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Odjava ..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Odjava ali sprememba uporabnika" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Izklop ..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Izklop, ponoven zagon ali dajanje računalnika v mirovanje" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Zakleni zaslon" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Omogoči ohranjevalnik zaslona in zaklepanje" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 #: ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "Upravljanje seje XFCE" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "Posebni predmeti in dejanja za okolje XFCE" #: ../kupfer/plugin/show_text.py:1 #: ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Pokaži besedilo" #: ../kupfer/plugin/show_text.py:7 #: ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:58 msgid "Display text in a window" msgstr "Pokaže besedilo v oknu" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Velika vrsta" #: ../kupfer/plugin/show_text.py:66 msgid "Show Notification" msgstr "Pokaži obvestilo" #: ../kupfer/plugin/trash.py:1 #: ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Smeti" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Dostop do vsebine smeti" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Premakni v smeti" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Premakne datoteko v smeti" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Obnovi" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Premakne datoteke nazaj na izvirno mesto" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "Smeti so prazne" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "Smeti vsebujejo %(num)s datotek" msgstr[1] "Smeti vsebujejo %(num)s datoteko" msgstr[2] "Smeti vsebujejo %(num)s datoteki" msgstr[3] "Smeti vsebujejo %(num)s datoteke" #: ../kupfer/plugin/triggers.py:1 #: ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "Sprožilci" #: ../kupfer/plugin/triggers.py:6 msgid "Assign global keybindings (triggers) to objects created with 'Compose Command'." msgstr "Določanje splošnih tipkovnih bližnjic (sprožilcev) do predmetov ustvarjenih z 'Ukazom Ustvari'" #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "Dodaj sprožilec ..." #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "Odstrani sprožilec" #: ../kupfer/plugin/urlactions.py:1 #: ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "Dejanja URL-ja" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "Prejmi in odpri" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "Prejmi v ..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "Prejmi URL na izbrano mesto" #: ../kupfer/plugin/volumes.py:1 #: ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Nosilci in diski" #: ../kupfer/plugin/volumes.py:3 #: ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Priklopljeni nosilci in diski" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "Nosilec je priklopljen na %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Odklopi" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Odklopi nosilec" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Izvrzi" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Odklopi in izvrže nosilec" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Išči po spletu" #: ../kupfer/plugin/websearch.py:8 #: ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "Iskanje po spletu z iskalniki OpenSearch" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Išči z ..." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Išči za ..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Iskalniki" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Wikipedija" #: ../kupfer/plugin/wikipedia.py:8 #: ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Išči v wikipediji" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Jezik Wikipedije" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "en" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Išče ta izraz v %s.wikipedia.org" #: ../kupfer/plugin/windows.py:1 #: ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Seznam oken" #: ../kupfer/plugin/windows.py:3 #: ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Vsa okna na vseh delovnih površinah" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Zaženi" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Zasenči" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Brez senčenja" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Skrči" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Povečaj" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Razpni" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Pomanjšaj razpeto" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Razpni navpično" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Pomanjšaj razpeto navpično" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "Okno na %(wkspc)s" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Sprednje okno" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Naslednje okno" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Skoči na delovno površino tega okna in izbere okno" #: ../kupfer/plugin/windows.py:252 #, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "%d oken" msgstr[1] "%d okno" msgstr[2] "%d okni" msgstr[3] "%d okna" #: ../kupfer/plugin/windows.py:256 msgid "Active workspace" msgstr "Dejavna delovna površina" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Skoči na to delovno površino" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Delovne površine" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 #: ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Nedavno uporabljeni dokumenti v Abiwordu" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Nedavni predmeti Abiword" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "Vmesnik z upravljalnikom paketov APT" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Način namestitve" #: ../kupfer/plugin/apt_tools.py:61 #: ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Prikaz podatkov o paketu" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Namesti" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "Namesti paket z nastavljeno metodo" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "Paketi skladni z \"%s\"" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Poišči ime paketa ..." #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "Globoki arhivi" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Dovoli brskanje v stisnjenih arhivskih datotekah" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "Vsebina %s" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "Ascii in Unicode zbirka ikon" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "Provides the Ascii and Unicode icon sets that use letters and symbols to produce icons for the objects found in Kupfer." msgstr "Zagotavlja znakovna niza Ascii in Unicode, ki uporabljata črke in simbole za proizvajanje ikon za predmete, ki jih je mogoče najti v Kupfer." #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "Ascii" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "Unicode" #: ../kupfer/plugin/audacious.py:1 #: ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "Nadzira predvajanje in seznam predvajanja Audacious" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Doda skladbo čakalni vrsti predvajanja Audaciousa" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Odstrani iz vrste" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Odstrani skladbo iz čakalne vrste predvajanja Audaciousa" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "Skoči na skladbo v Audaciousu" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Nadaljevanje predvajanja v Audaciousu" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Premor predvajanja v Audaciousu" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Skoči na naslednjo skladbo v Audaciousu" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Skoči na predhodno skladbo v Audaciousu" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Počisti čakalno vrsto Audaciousa" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Mešaj" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "Preklopi mešanje v Audaciousu" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Ponovi" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "Preklopi ponavljanje v Audaciousu" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Seznam predvajanja" #: ../kupfer/plugin/chromium.py:1 #: ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Zaznamki Chromium" #: ../kupfer/plugin/chromium.py:3 #: ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Kazalo zaznamkov Chromium" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Stiki in dejanja Claws Mail" #: ../kupfer/plugin/clawsmail.py:26 #: ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 #: ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Sestavi novo pošto" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Sestavi novo pošto v ClawsMail" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Prejmi vso pošto" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "oPrejme novo pošte za vse račune v ClawsMail" #: ../kupfer/plugin/clawsmail.py:56 #: ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 #: ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "Sestavi e-pošto" #: ../kupfer/plugin/clawsmail.py:81 #: ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "Pošlji v e-pošti ..." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "Sestavi novo sporočiloo v Claws mail in pripne datoteko" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Imenik Claws Mail" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Stiki iz imenika Claws Mail" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 msgid "Custom Terminal" msgstr "Terminal po meri" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "Nastavi posnemovalnik terminala po meri" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "Izvedi zastavico" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "Tema po meri" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "Uporabi barvo teme po meri" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "Tema:" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Privzeti odjemalec elektronske pošte" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "Sestavi elektronsko pošto s privzetim sistemskim mailto: ročnik" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 #: ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Iskanje v Devhelp" #: ../kupfer/plugin/duckduckgo.py:5 #: ../kupfer/plugin/duckduckgo.py:19 msgid "DuckDuckGo Search" msgstr "Iskanje DuckDuckGo" #: ../kupfer/plugin/duckduckgo.py:8 #: ../kupfer/plugin/duckduckgo.py:30 msgid "Search the web securely with DuckDuckGo" msgstr "Varno Iskanje po spletu z iskalnikom DuckDuckGo" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "Empathy" #: ../kupfer/plugin/empathy.py:6 msgid "Access to Empathy Contacts" msgstr "Dostop do stikov Empathy" #: ../kupfer/plugin/empathy.py:25 #: ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Pokaži nepovezane stike" #: ../kupfer/plugin/empathy.py:34 #: ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 #: ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Na voljo" #: ../kupfer/plugin/empathy.py:35 #: ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 #: ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Odsoten" #: ../kupfer/plugin/empathy.py:36 #: ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Zaposlen" #: ../kupfer/plugin/empathy.py:37 #: ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Ni na voljo" #: ../kupfer/plugin/empathy.py:38 #: ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Neviden" #: ../kupfer/plugin/empathy.py:39 #: ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Nepovezan" #: ../kupfer/plugin/empathy.py:96 #: ../kupfer/plugin/gajim.py:93 #: ../kupfer/plugin/pidgin.py:97 #: ../kupfer/plugin/skype.py:197 msgid "Open Chat" msgstr "Odpri klepet" #: ../kupfer/plugin/empathy.py:129 #: ../kupfer/plugin/gajim.py:121 #: ../kupfer/plugin/skype.py:243 msgid "Change Global Status To..." msgstr "Spremeni splošno stanje v ..." #: ../kupfer/plugin/empathy.py:171 msgid "Empathy Contacts" msgstr "Stiki Empathy" #: ../kupfer/plugin/empathy.py:237 msgid "Empathy Account Status" msgstr "Stanje računa Empathy" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 #: ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Stiki Evolution" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Sestavi novo sporočilo v Evolution" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Sestavi novo sporočilo v Evolution in priloži datoteko" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Imenik Evolution" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Pokaže strani in upravlja naslove ftp s Filezillo" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Odpri strani s programom Filezilla" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Strani Filezille" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Strani s Filezille" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Dostop do stikov Gajim" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Dostopen za pogovor" #: ../kupfer/plugin/gajim.py:149 msgid "Gajim Contacts" msgstr "Stiki Gajim" #: ../kupfer/plugin/gajim.py:213 msgid "Gajim Account Status" msgstr "Stanje računa Gajim" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 #: ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "Glob" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 #: ../kupfer/plugin/gmail/__init__.py:234 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "Nalaganje stikov in sestavljanje nove elektronske pošte v Gmailu" #: ../kupfer/plugin/gmail/__init__.py:33 msgid "Load contacts' pictures" msgstr "Naloži slike stikov" #: ../kupfer/plugin/gmail/__init__.py:39 msgid "Load additional information" msgstr "Naloži dodatne podrobnosti" #: ../kupfer/plugin/gmail/__init__.py:50 msgid "Work email" msgstr "Službena elektronska pošta" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Home email" msgstr "Domača elektronska pošta" #: ../kupfer/plugin/gmail/__init__.py:52 msgid "Other email" msgstr "Druga elektronska pošta" #: ../kupfer/plugin/gmail/__init__.py:54 msgid "Work address" msgstr "Službeni naslov" #: ../kupfer/plugin/gmail/__init__.py:55 msgid "Home address" msgstr "Domači naslov" #: ../kupfer/plugin/gmail/__init__.py:56 msgid "Other address" msgstr "Drug naslov" #: ../kupfer/plugin/gmail/__init__.py:58 msgid "Car phone" msgstr "Telefon v avtu" #: ../kupfer/plugin/gmail/__init__.py:59 msgid "Fax" msgstr "Faks" #: ../kupfer/plugin/gmail/__init__.py:61 msgid "Home phone" msgstr "Domači telefon" #: ../kupfer/plugin/gmail/__init__.py:62 msgid "Home fax" msgstr "Domači faks" #: ../kupfer/plugin/gmail/__init__.py:63 msgid "Internal phone" msgstr "Interni telefon" #: ../kupfer/plugin/gmail/__init__.py:64 msgid "Mobile" msgstr "Mobilni telefon" #: ../kupfer/plugin/gmail/__init__.py:65 msgid "Other" msgstr "Ostalo" #: ../kupfer/plugin/gmail/__init__.py:66 msgid "VOIP" msgstr "VOIP" #: ../kupfer/plugin/gmail/__init__.py:67 msgid "Work phone" msgstr "Službeni telefon" #: ../kupfer/plugin/gmail/__init__.py:68 msgid "Work fax" msgstr "Službeni faks" #: ../kupfer/plugin/gmail/__init__.py:93 msgid "Compose Email in Gmail" msgstr "Sestavi elektronsko pošto v Gmailu" #: ../kupfer/plugin/gmail/__init__.py:117 msgid "Open web browser and compose new email in Gmail" msgstr "Odpre spletno stran sestavljanja novega elektronskega sporočila v Gmailu" #: ../kupfer/plugin/gmail/__init__.py:123 msgid "Edit Contact in Gmail" msgstr "Uredi stik v Gmailu" #: ../kupfer/plugin/gmail/__init__.py:133 msgid "Open web browser and edit contact in Gmail" msgstr "Odpre spletno stran urejanja stikov v Gmailu" #: ../kupfer/plugin/gmail/__init__.py:263 msgid "Contacts from Google services (Gmail)" msgstr "Stiki iz storitev Google (Google pošta)" #: ../kupfer/plugin/gnome_terminal.py:1 #: ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "Profili Gnome Terminala" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "Zažene profile Gnome Terminala" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Prikaz albumov in pošiljanje datotek v Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "Uporabniki za prikaz: (,-ločeno)" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Nalaganje ikon uporabnikov in albumov" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Pošiljanje slik" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Pošiljanje slik na spletni album Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Ustvarjanje albuma:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Album je ustvarjen s Kupfer" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Datoteka:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "%(num)d albumov" msgstr[1] "%(num)d album" msgstr[2] "%(num)d albuma" msgstr[3] "%(num)d albumi" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "%(num)s fotografij" msgstr[1] "%(num)s fotografija" msgstr[2] "%(num)s fotografiji" msgstr[3] "%(num)s fotografije" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Pošlji na album Picasa ..." #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Pošlji datoteke v album Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Pošlji na Picaso kot nov album" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Ustvari album iz izbrane krajevne mape" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Albumi Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Uporabniški albumi v Picasi" #: ../kupfer/plugin/google_search.py:1 #: ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Google iskalnik" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Išči v Google z neposredno prikazanimi rezultati" #: ../kupfer/plugin/google_search.py:58 #: ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker1.py:168 #: ../kupfer/plugin/tracker1.py:179 #: ../kupfer/plugin/tracker.py:72 #: ../kupfer/plugin/tracker.py:113 #, python-format msgid "Results for \"%s\"" msgstr "Rezultati za \"%s\"" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "Pokaži več rezultatov za \"%s\"" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "%s skupaj najdenih" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "Brskanje in ustvarjanje novih opravil v GTG" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "rok: %s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "začni: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "oznake: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Odpri opravilo v Getting Things GNOME!" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Izbriši" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Trajno odstrani to nalogo" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Označi končano" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Označi to nalogo kot končano" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Zavrzi" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Označi to nalogo kot takšno, ki je ni treba več opraviti " #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Ustvari novo nalogo" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "Ustvari novo opravilo v Getting Things GNOME" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "Gwibber" #: ../kupfer/plugin/gwibber.py:6 msgid "Microblogging with Gwibber. Allows sending and receiving messages from social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-service'." msgstr "Mikrobloganje v Gwibberju. Omogoča pošiljanje in prejemanje sporočil iz družabnih omrežij kot so Twitter, Identi.ca, itd. Zahteva paket 'gwibber-service'." #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "Največje število prikazanih sporočil" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s na %(service)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s na %(where)s" #: ../kupfer/plugin/gwibber.py:187 msgid "Send Message" msgstr "Pošlji sporočilo" #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "Pošlji sporočilo na vse račune Gwibber" #: ../kupfer/plugin/gwibber.py:210 msgid "Send Message To..." msgstr "Pošlji sporočilo osebi ..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "Pošlji sporočilo za račun Gwibber" #: ../kupfer/plugin/gwibber.py:243 #: ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Pošlji sporočilo ..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "Pošlji sporočilo na izbran račun Gwibber" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Odgovori ..." #: ../kupfer/plugin/gwibber.py:314 msgid "Delete Message" msgstr "Izbriši sporočilo" #: ../kupfer/plugin/gwibber.py:337 msgid "Send Private Message..." msgstr "Pošlji zasebno sporočilo ..." #: ../kupfer/plugin/gwibber.py:370 msgid "Send direct message to user" msgstr "Pošlji neposredno sporočilo uporabniku" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "Ponovno objavi" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet To..." msgstr "Ponovno objavi na ..." #: ../kupfer/plugin/gwibber.py:407 msgid "Retweet message to all Gwibber accounts" msgstr "Ponovno objavi sporočilo na vse račune Gwibber" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "Ponovno objavi sporočilo na račun Gwibber" #: ../kupfer/plugin/gwibber.py:413 msgid "Open in Browser" msgstr "Odpri v brskalniku" #: ../kupfer/plugin/gwibber.py:419 msgid "Open message in default web browser" msgstr "Odpri sporočilo v privzetem spletnem brkslaniku" #: ../kupfer/plugin/gwibber.py:425 #: ../kupfer/plugin/gwibber.py:463 msgid "Gwibber Accounts" msgstr "Računi Gwibber" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "Računi nastavljeni v Gwibberju" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "Sporočila Gwibber" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "Nedavna sporočila, ki jih je prejel Gwibber" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "Sporočila Gwibber za %s" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "Pretoki Gwibber" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "Pretoki nastavljeni v programu Gwibber" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "Sporočila Gwibber v %s" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "Gwibber (enostavno)" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "Pošlji posodobitve preko odjemalca mikrobloganja Gwibber" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "Pošlji posodobitev" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "Ni mogoče omogočiti storitve Gwibber" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Dejanja višjega reda" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "Orodja za delo z ukazi kot s predmeti" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Izberi v Kupferju" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "Rezultat %s (%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Poženi (vzemi rezultat)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "Prevzemi rezultat ukaza kot posredniški predmet" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Poženi (zavrzi rezultat)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Orodja slike" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Orodja preoblikovanja slike" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Prilagodi velikost ..." #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Prilagodi velikost znotraj danih meritev točk " #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Zavrti desno" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Zavrti levo" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Samodejno vrtenje" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Vrtenje JPEG (na mestu) glede na metapodatke EXIF" #: ../kupfer/plugin/kupfer_plugins.py:1 #: ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Vstavki Kupfer" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Dostop do Kupferjevega seznama vstavkov v Kupferju" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Pokaži podrobnosti" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Prikaži izvorno kodo" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "omogočeno" #: ../kupfer/plugin/locate.py:1 #: ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "Najdi datoteke" #: ../kupfer/plugin/locate.py:5 #: ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "Iskanje po datotečnemu sistemu z locate" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Prezri različne velikosti črk pri iskanju datotek" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "OpenOffice /LibreOffice" #: ../kupfer/plugin/openoffice.py:5 #: ../kupfer/plugin/openoffice.py:135 msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Nedavno uporabljeni dokumenti v OpenOffice/LIbreOffice" #: ../kupfer/plugin/openoffice.py:83 msgid "OpenOffice/LibreOffice Recent Items" msgstr "Nedavni predmeti OpenOffice/LibreOffice" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera pošta" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Stiki in dejanja Opera pošte" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Sestavi novo pošto v Opera pošti" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Usklajevanje stikov Opera pošte" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Stiki iz Opera pošte" #: ../kupfer/plugin/opera.py:4 #: ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Zaznamki Opera" #: ../kupfer/plugin/opera.py:6 #: ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Kazalo zaznamkov Opera" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Dostop do stikov Pidgin" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d znakov)" msgstr[1] "%s (%d znak)" msgstr[2] "%s (%d znaka)" msgstr[3] "%s (%d znaki)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Stiki Pidgin" #: ../kupfer/plugin/putty.py:5 #: ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "Seje PuTTY" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "Hiter dostop do sej PuTTY" #: ../kupfer/plugin/putty.py:46 #: ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Zaženi sejo" #: ../kupfer/plugin/qsicons/__init__.py:24 msgid "Quicksilver Icons" msgstr "Ikone Quicksilver" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "Pregledovalnik slik Qucik" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "Ogled slike" # Kaže da je to neko ime, ki ga ni treba prevajati ... #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "reStructuredText" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "Izris reStructuredText in prikaz rezultata" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "Pogled kot dokument HTML" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU zaslon" #: ../kupfer/plugin/screen.py:3 #: ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "Dejavne seje zaslona GNU" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Priloženo" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Odstranjeno" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s seja (%(pid)s) ustvarjena ob %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Zaslonske seje" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Priloži" #: ../kupfer/plugin/sendkeys.py:2 #: ../kupfer/plugin/sendkeys.py:52 msgid "Send Keys" msgstr "Pošlji ključe" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "Pošlji sintetične dogodke tipkovne z xautomation" #: ../kupfer/plugin/sendkeys.py:28 msgid "Paste to Foreground Window" msgstr "Prilepi v okno v ospredju" #: ../kupfer/plugin/sendkeys.py:46 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "Kopiraj na odložišče in pošlji Ctrl+V na okno v ospredju" #: ../kupfer/plugin/sendkeys.py:101 msgid "Send keys to foreground window" msgstr "Pošljite tipke na okno v ospredju" #: ../kupfer/plugin/sendkeys.py:106 msgid "Type Text" msgstr "Vpišite besedilo" #: ../kupfer/plugin/sendkeys.py:127 msgid "Type the text to foreground window" msgstr "Vpišite besedilo v okno v ospredju" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 #: ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Sistemske storitve" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "Zagon, zaustavitev ali ponoven zagon sistemskih storitev preko skriptov init" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "Sudo-podoben ukaz" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Zaženi storitev" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Ponovno zaženi storitev" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Zaustavi storitev" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "Storitev %s" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Skrajšaj povezave" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Ustvari kratke vzdevke dolgih URL-jev" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "Napaka" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Skrajšaj z ..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Storitve" #: ../kupfer/plugin/show_qrcode.py:5 #: ../kupfer/plugin/show_qrcode.py:25 msgid "Show QRCode" msgstr "Pokaži QRKodo" #: ../kupfer/plugin/show_qrcode.py:9 #: ../kupfer/plugin/show_qrcode.py:60 msgid "Display text as QRCode in a window" msgstr "Pokaže besedilo kot QRKodo v oknu" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Dostop do stikov Skype" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skype-aj me" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Odjavljen" #: ../kupfer/plugin/skype.py:179 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:218 msgid "Call" msgstr "Pokliči" #: ../kupfer/plugin/skype.py:232 msgid "Place a call to contact" msgstr "Klic stika" #: ../kupfer/plugin/skype.py:267 msgid "Skype Contacts" msgstr "Stiki Skype" #: ../kupfer/plugin/skype.py:287 msgid "Skype Statuses" msgstr "Stanja Skype" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 #: ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "Gostitelji SSH" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "Doda gostitelje SSH najdene v ~/.ssh/config." #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "Gostitelj SSH" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Poveži se" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "Poveži se z gostiteljem SSH" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "Gostitelji SSH kot so navedeni v ~/.ssh/config" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Ni povezave D-Bus s sejo namizja" #: ../kupfer/plugin_support.py:171 msgid "GNOME Keyring" msgstr "Zbirka ključev GNOME" #: ../kupfer/plugin_support.py:172 msgid "KWallet" msgstr "KWallet" #: ../kupfer/plugin_support.py:173 msgid "Unencrypted File" msgstr "Nešifrirana datoteka" #: ../kupfer/plugin/templates.py:1 #: ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Predloge dokumenta" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Ustvari nove dokumente iz vaših predlog" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "predloga %s" #: ../kupfer/plugin/templates.py:37 #: ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Prazna datoteka" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Nova mapa" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Ustvari nov dokument ..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Ustvari nov dokument iz predloge" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Ustvari dokument v ..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "Besedilne datoteke" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "Pripni k ..." #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Pripni ..." #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Zapiši na ..." #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Dobi vsebino besedila" #: ../kupfer/plugin/thunar.py:1 #: ../kupfer/plugin/thunar.py:185 #: ../kupfer/plugin/thunar.py:225 #: ../kupfer/plugin/thunar.py:278 #: ../kupfer/plugin/thunar.py:329 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:11 msgid "File manager Thunar actions" msgstr "Dejanja upravljalnika datotek Thunar" #: ../kupfer/plugin/thunar.py:67 msgid "Select in File Manager" msgstr "Izberi v upravljalniku datotek" #: ../kupfer/plugin/thunar.py:95 msgid "Show Properties" msgstr "Pokaži lastnosti" #: ../kupfer/plugin/thunar.py:118 msgid "Show information about file in file manager" msgstr "Pokaže podrobnosti o datoteki v upravljalniku datotek" #: ../kupfer/plugin/thunar.py:127 msgid "Send To..." msgstr "Pošlji ..." #: ../kupfer/plugin/thunar.py:259 msgid "Symlink In..." msgstr "Simbolna povezava do ..." #: ../kupfer/plugin/thunar.py:300 msgid "Create a symlink to file in a chosen location" msgstr "Ustvari simbolno povezavo do datoteke na izbranem mestu" #: ../kupfer/plugin/thunar.py:304 msgid "Empty Trash" msgstr "Izprazni smeti" #: ../kupfer/plugin/thunar.py:344 msgid "Thunar Send To Objects" msgstr "Thunar pošlji predmetom" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Stiki in dejanja Thunderbird/Icedove" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Sestavi novo sporočilo v Thunderbird" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Imenik Thunderbird" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Stiki iz imenika Thunderbird" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Top" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Prikaže opravila v teku in dovoli pošiljanje signalov k njim" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Vrstni red" #: ../kupfer/plugin/top.py:25 #: ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Ukazna vrstica" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "Uporaba CPE (naraščajoče)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 #: ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Uporaba pomnilnika (padajoče)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Pošlji signal ..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Signali" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Opravila v teku" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s cpe: %(cpu)g%% spomin: %(mem)g%% čas: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Opravila v teku za trenutnega uporabnika" # Tukaj je tracker ime programa #: ../kupfer/plugin/tracker1.py:10 msgid "Tracker" msgstr "Tracker" #: ../kupfer/plugin/tracker1.py:18 #: ../kupfer/plugin/tracker.py:15 msgid "Tracker desktop search integration" msgstr "Povezava s Tracker namiznim iskanjem" #: ../kupfer/plugin/tracker1.py:49 #: ../kupfer/plugin/tracker.py:41 msgid "Search in Tracker" msgstr "Išči v Trackerju" #: ../kupfer/plugin/tracker1.py:54 #: ../kupfer/plugin/tracker.py:46 msgid "Open Tracker Search Tool and search for this term" msgstr "Odpre iskalno orodje Tracker in išče ta izraz" #: ../kupfer/plugin/tracker1.py:62 #: ../kupfer/plugin/tracker.py:55 msgid "Get Tracker Results..." msgstr "Dobi rezultate Trackerja ..." #: ../kupfer/plugin/tracker1.py:71 #: ../kupfer/plugin/tracker.py:64 msgid "Show Tracker results for query" msgstr "Pokaži rezultate Trackerja za poizvedbo" # Tukaj je tracker ime programa #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:165 #: ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Oznake Trackerja" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Oznake Trackerja" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Prebrskaj oznake Trackerja" #: ../kupfer/plugin/tracker.py:197 #: ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "Oznaka %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Predmeti označeni %s s Trackerjem" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Dodaj oznako ..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Dodaj oznako sledilnika v datoteko" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Odstrani oznako ..." # sledilec ali sledilnik??? #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Odstrani oznako sledilnika iz datoteke" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 #: ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "Nosilci iz zgodovine TrueCrypt" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "Nosilec TrueCrypt: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Priklopi nosilec" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "Priklopi v Truecrypt" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Poskusi priklopiti datoteko kot nosilec Truecrypt" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Odklopi vse nosilce" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "Nosilci TrueCrypt" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Terminalni strežniški odjemalec" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Seja shranjena v Terminalnem strežniškem odjemalcu" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "Seje TSOdjemalca" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Shranjene seje v Terminalnem strežniškem odjemalcu" #: ../kupfer/plugin/vim/__init__.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim/__init__.py:4 msgid "Recently used documents in Vim" msgstr "Nedavno uporabljeni dokumenti v Vim" #: ../kupfer/plugin/vim/plugin.py:56 msgid "Vim Recent Documents" msgstr "Nedavni dokumenti Vim" #: ../kupfer/plugin/vim/plugin.py:219 msgid "Close (Save All)" msgstr "Zapri (shrani vse)" #: ../kupfer/plugin/vim/plugin.py:237 msgid "Send..." msgstr "Pošlji ..." #: ../kupfer/plugin/vim/plugin.py:264 msgid "Send ex command" msgstr "Pošlji ukaz ex" #: ../kupfer/plugin/vim/plugin.py:272 msgid "Insert in Vim..." msgstr "Vstavi v Vim ..." #: ../kupfer/plugin/vim/plugin.py:309 msgid "Active Vim Sessions" msgstr "Dejavne seje Vim" #: ../kupfer/plugin/vim/plugin.py:338 #, python-format msgid "Vim Session %s" msgstr "Seja Vim %s" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Zaznamki in dejanja Vinarge" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Zaženi sejo Vinagre" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Zaznamki Vinagre" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open Source Edition." msgstr "Nadzor navideznih računalnikov VirtualBox. Podpira Sun VirtualBox in odprtokodno izdajo." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "Prisili uporabno vmesnika CLI" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Vključi" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "Vključi brez glave" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Pošlji signal izklopa" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Ponovni zagon" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Nadaljuj" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Shrani stanje" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Izklop" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "Naprave VirtualBox" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:11 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "Dostop do strani shranjenih v Zim - namiznemu Wikiju in načrtovalniku" #: ../kupfer/plugin/zim.py:30 msgid "Page names start with :colon" msgstr "Imena strani se začnejo s :stolpec" #: ../kupfer/plugin/zim.py:36 msgid "Default page name for quick notes" msgstr "Privzeto ime strani hitrih opomb" #: ../kupfer/plugin/zim.py:38 #, python-format msgid "Note %x %X" msgstr "Opomba %x %X" #: ../kupfer/plugin/zim.py:39 msgid "" "Strftime tags can be used: %H - hour, %M - minutes, etc\n" "Please check python documentation for details.\n" "NOTE: comma will be replaced by _" msgstr "" "Oznake strftime, ki jih je mogoče uporabiti: %H - ure, %M - minute, idr.\n" "Preverite dokumentacijo python za več podrobnosti.\n" "OPOMBA: vejica bo zamenjana z vezajem (_)" #: ../kupfer/plugin/zim.py:45 msgid "Default namespace for quick notes" msgstr "Privzeti imenski prostor hitrih opomb" #: ../kupfer/plugin/zim.py:80 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Stran Zim iz beležke \"%s\"" #: ../kupfer/plugin/zim.py:89 msgid "Create Zim Page" msgstr "Ustvari stran Zim" #: ../kupfer/plugin/zim.py:96 msgid "Create page in default notebook" msgstr "Ustvari stran v privzeti beležki" #: ../kupfer/plugin/zim.py:108 msgid "Create Zim Page In..." msgstr "Ustvari stran Zim v ..." #: ../kupfer/plugin/zim.py:132 msgid "Insert QuickNote into Zim" msgstr "Vstavi hitro opombo v Zim" #: ../kupfer/plugin/zim.py:142 msgid "Quick note selected text into Zim notebook" msgstr "Izbrano besedilo hitre opombe v beležnici Zim" #: ../kupfer/plugin/zim.py:191 msgid "Create Subpage..." msgstr "Ustvari podstran ..." #: ../kupfer/plugin/zim.py:370 msgid "Zim Notebooks" msgstr "Beležke Zim" #: ../kupfer/plugin/zim.py:387 msgid "Zim Pages" msgstr "Strani Zim" #: ../kupfer/plugin/zim.py:415 msgid "Pages stored in Zim Notebooks" msgstr "Strani shranjene v beležkah Zim" #~ msgid "Translate text with Google Translate" #~ msgstr "Prevede besedilo z Google prevajalnikom" #~ msgid "Google Translate connection timed out" #~ msgstr "Povezava z Google prevajalnikom je zakasnela" #~ msgid "Error connecting to Google Translate" #~ msgstr "Napaka med povezovanjem z Google prevajalnikom" #~ msgid "Translate To..." #~ msgstr "Prevedi v ..." #~ msgid "Translate into %s" #~ msgstr "Prevedi v %s" #~ msgid "Languages" #~ msgstr "Jeziki" #~ msgid "Show translated page in browser" #~ msgstr "Pokaži prevedeno stran v brskalniku" #~ msgid "Show Translation To..." #~ msgstr "Pokaži prevod v ..." #~ msgid "Show translation in browser" #~ msgstr "Pokaži prevod v brskalniku" #~ msgid "run keyboard shortcut relay service on this display" #~ msgstr "Poženite rele tipkovne bližnjice na tem zaslonu" #~ msgid "Selected Text \"%s\"" #~ msgstr "Izbrano besedilo \"%s\"" #~ msgid "Recent clipboards" #~ msgstr "Nedavna odložišča" #~ msgid "Include recent selections" #~ msgstr "Vključi nedavne izbire" #~ msgid "Text Matches" #~ msgstr "Zadetki besedila" #~ msgid "noun" #~ msgstr "samostalnik" #~ msgid "verb" #~ msgstr "glagol" #~ msgid "adjective" #~ msgstr "pridevnik" #~ msgid "Directories" #~ msgstr "Mape" #~ msgid "Exported Objects from Plugins" #~ msgstr "Izvoženi predmeti iz vstavkov" #~ msgid "Interface" #~ msgstr "Vmesnik" #~ msgid "Hide Kupfer when focus is lost" #~ msgstr "Skrij program ob izgubi žarišča" #~ msgid "Twitter" #~ msgstr "Twitter" #~ msgid "Microblogging with Twitter: send updates and show friends' tweets" #~ msgstr "" #~ "Mikrobloganje s Twitterjem: pošiljanje posodobitev in prikaz tweetov " #~ "prijateljev" #~ msgid "Load friends' pictures" #~ msgstr "Naloži slike prijateljev" #~ msgid "Load friends' public tweets" #~ msgstr "Nalaganje javnih tweetov prijateljev" #~ msgid "Load timeline" #~ msgstr "Naloži časovnico" #~ msgid "Post Update to Twitter" #~ msgstr "Pošlji posodobitev na Twitter" #~ msgid "Send Direct Message..." #~ msgstr "Pošlji neposredno sporočilo ..." #~ msgid "Send Direct Message To..." #~ msgstr "Pošlji neposredno sporočilo osebi ..." #~ msgid "%(user)s %(when)s" #~ msgstr "%(user)s %(when)s" #~ msgid "Twitter Timeline" #~ msgstr "Časovnica Twitter" #~ msgid "Twitter Friends" #~ msgstr "Prijatelji Twitter" #~ msgid "Timeline for %s" #~ msgstr "Časovnica za %s" #~ msgid "Preferred terminal" #~ msgstr "Prednostni terminal" #~ msgid "" #~ "The preferred terminal emulator. It's used to launch the SSH sessions." #~ msgstr "" #~ "Prednostni posnemovalnik terminala. Uporabljen za zaganjanje sej SSH." #~ msgid "" #~ "The flag which makes the terminal execute everything following it inside " #~ "the terminal (e.g. '-x' for gnome-terminal and terminal, '-e' for konsole " #~ "and urxvt)." #~ msgstr "" #~ "Zastavica, ki terminal prisili v izvedbo vsega in mu sledi znotraj " #~ "terminala (na primer '-x' za gnome-terminal in terminal '-e' za konsole " #~ "in urxvt)." kupfer-v208/po/sv.po000066400000000000000000001517411176220042200144620ustar00rootroot00000000000000# Swedish translations for the kupfer package # Svenska översättningar för paketet kupfer. # Copyright (C) 2009 Ulrik Sverdrup # This file is distributed under the same license as the kupfer package. (GPLv3) # Ulrik Sverdrup , 2009. # # PLEASE ask Ulrik before you change or add anything to the Swedish localization # PLEASE ask Ulrik before you change or add anything to the Swedish localization # msgid "" msgstr "" "Project-Id-Version: kupfer beta\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-02-25 17:28+0100\n" "PO-Revision-Date: 2009-06-23 20:19+0200\n" "Last-Translator: Ulrik Sverdrup \n" "Language-Team: Swedish\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Application Launcher" msgstr "Programstartare" msgid "Convenient command and access tool for applications and documents" msgstr "Praktiskt kommandoprogram för åtkomst av program och dokument" msgid "Kupfer" msgstr "Kupfer" msgid "Execute in Kupfer" msgstr "Kör i Kupfer" msgid "Saved Kupfer Command" msgstr "Sparat Kupfer-kommando" msgid "User credentials" msgstr "Användaruppgifter" msgid "_Change" msgstr "_Ändra" msgid "_Password:" msgstr "_Lösenord:" msgid "_User:" msgstr "_Användare:" msgid "Keybinding could not be bound" msgstr "Snabbtangenten kunde inte bindas" msgid "Please press desired key combination" msgstr "Tryck önskad tangentkombination" msgid "Set Keyboard Shortcut" msgstr "Ställ in tangentgenväg" msgid "Browser Keyboard Shortcuts" msgstr "Tangentbordsgenvägar i bläddrare" msgid "Global Keyboard Shortcuts" msgstr "Globala tangentbordsgenvägar" msgid "Start" msgstr "Start" msgid "Catalog" msgstr "Katalog" msgid "Desktop Environment" msgstr "Skrivbordsmiljö" msgid "Folders whose files are always available in the catalog." msgstr "Mappar vars innehåll alltid finns tillgängligt i katalogen." msgid "General" msgstr "Allmänt" msgid "Icon set:" msgstr "Ikonuppsättning:" msgid "Inclusion in Top Level Searches" msgstr "Inkluderade i sökningar på toppnivån" msgid "Indexed Folders" msgstr "Indexerade mappar" msgid "Keyboard" msgstr "Tangentbord" msgid "Kupfer Preferences" msgstr "Inställningar för Kupfer" msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" "Objekt från markerade källor är inkluderade i sökningar på toppnivån.\n" "Använd kommandot ‘Sök inuti’ på en avmarkerad källa för att söka i dess " "innehåll." msgid "Plugins" msgstr "Insticksmoduler" msgid "Reset" msgstr "Återställ" msgid "Show icon in notification area" msgstr "Visa ikon i notifieringsytan" msgid "Start automatically on login" msgstr "Starta automatiskt vid inloggning" msgid "Terminal emulator:" msgstr "Terminalemulator:" msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "" "Använd enstaka tangenter som kommandon (Blanksteg, /, punkt, komma etc.)" #, python-format msgid "Could not to carry out '%s'" msgstr "Kunde inte utföra “%s”" #, python-format msgid "\"%s\" produced a result" msgstr "“%s” lämnade ett resultat" #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "Utan rättighet att utföra “%s” (ej körbar)" #, python-format msgid "Command in \"%s\" is not available" msgstr "Kommando i “%s” är ej tillgängligt" #, python-format msgid "Keyboard relay is active for display %s" msgstr "Vidaresänding av snabbtangenter är aktivt på display %s" msgid "do not present main interface on launch" msgstr "visa ej fönster vid start" msgid "list available plugins" msgstr "lista tillgängliga insticksmoduler" msgid "enable debug info" msgstr "felsökningsläge" #. TRANS: --exec-helper=HELPER is an internal command #. TRANS: that executes a helper program that is part of kupfer msgid "run plugin helper" msgstr "kör hjälpprogram för insticksmodul" msgid "show usage help" msgstr "visa hjälpmeddelande" msgid "show version information" msgstr "visa programversion" msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Användning: kupfer [ FLAGGOR | FIL ... ]" msgid "Available plugins:" msgstr "Tillgängliga insticksmoduler:" #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface msgid "Alternate Activate" msgstr "Alternativ aktivera" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action msgid "Comma Trick" msgstr "Kommatricket" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) msgid "Compose Command" msgstr "Bygg kommando" msgid "Mark Default Action" msgstr "Sätt standardkommando" msgid "Forget Object" msgstr "Glöm objekt" msgid "Reset All" msgstr "Återställ alla" msgid "Select Quit" msgstr "Välj Avsluta" msgid "Select Selected File" msgstr "Välj markerad fil" msgid "Select Selected Text" msgstr "Välj markering" msgid "Show Help" msgstr "Visa hjälp" msgid "Show Preferences" msgstr "Visa inställningar" msgid "Switch to First Pane" msgstr "Välj första rutan" msgid "Toggle Text Mode" msgstr "Växla fritextläge" #, python-format msgid "%s is empty" msgstr "%s är tom" #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "Inga träffar i %(src)s för “%(query)s”" msgid "No matches" msgstr "Inga träffar" msgid "Type to search" msgstr "Skriv för att söka" #, python-format msgid "Type to search %s" msgstr "Skriv för att söka i %s" msgid "No action" msgstr "Inget kommando" #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "Gör “%(action)s” till standard för “%(object)s”" #. TRANS: Removing learned and/or configured bonus search score #, python-format msgid "Forget About \"%s\"" msgstr "Glöm bort “%s”" #. TRANS: Names of global keyboard shortcuts msgid "Show Main Interface" msgstr "Visa huvudgränssnitt" msgid "Show with Selection" msgstr "Visa med markering" #. TRANS: Plugin info fields msgid "Description" msgstr "Beskrivning" msgid "Author" msgstr "Upphovsman" msgid "Version" msgstr "Version" #. TRANS: Error message when Plugin needs a Python module to load #, python-format msgid "Python module '%s' is needed" msgstr "Behöver Python-modulen ‘%s’" msgid "Plugin could not be read due to an error:" msgstr "Insticksmodulen kunde inte läsas in på grund av ett fel:" msgid "disabled" msgstr "ej aktiverad" msgid "Content of" msgstr "Innehålls i" #. TRANS: Plugin contents header msgid "Sources" msgstr "Källor" #. TRANS: Plugin contents header msgid "Actions" msgstr "Kommandon" #, python-format msgid "Using encrypted password storage: %s" msgstr "Använder krypterad lösenordslagring: %s" #, python-format msgid "Using password storage: %s" msgstr "Använder lösenordslagring: %s" #. TRANS: Plugin-specific configuration (header) msgid "Configuration" msgstr "Inställningar" msgid "Set username and password" msgstr "Ställ in användaruppgifter" #. TRANS: File Chooser Title msgid "Choose a Directory" msgstr "Välj mapp" msgid "Reset all shortcuts to default values?" msgstr "Återställ alla genvägar till standardinställningen?" msgid "Command" msgstr "Kommando" msgid "Shortcut" msgstr "Genväg" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language msgid "translator-credits" msgstr "Ulrik Sverdrup " msgid "A free software (GPLv3+) launcher" msgstr "En startare och ett stycke fri programvara (GPLv3+)" msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Detta program är fri programvara. Du kan distribuera det och/eller\n" "modifiera det under villkoren i GNU General Public License, publicerad\n" "av Free Software Foundation, antingen version 3 eller (om du så vill)\n" "någon senare version. \n" "\n" "Detta program distribueras i hopp om att det ska vara användbart, men\n" "UTAN NÅGON SOM HELST GARANTI, även utan underförstådd garanti om\n" "SÄLJBARHET eller LÄMPLIGHET FÖR NÅGOT SPECIELLT ÄNDAMÅL.\n" "Se GNU General Public License för ytterligare information.\n" "\n" "Du bör ha fått en kopia av GNU General Public License tillsammans med\n" "detta program. Om inte, .\n" #. follows strings used elsewhere msgid "Could not find running Kupfer" msgstr "Hittade ingen aktiv Kupfer-process" msgid "Text" msgstr "Text" msgid "Run after Delay..." msgstr "Utför med fördröjning..." msgid "Perform command after a specified time interval" msgstr "Utför kommando efter angivet tidsintervall" msgid "Multiple Objects" msgstr "Flera objekt" #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s objekt" msgstr[1] "%s objekt" #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" msgid "unknown" msgstr "okänd" msgid "Aim" msgstr "Aim" msgid "Google Talk" msgstr "Google Talk" msgid "ICQ" msgstr "ICQ" msgid "MSN" msgstr "MSN" msgid "QQ" msgstr "QQ" msgid "Yahoo" msgstr "Yahoo" #. -*- coding: UTF-8 -*- msgid "Skype" msgstr "Skype" #, python-format msgid "%s does not support this operation" msgstr "%s stödjer inte operationen" msgid "Can not be used with multiple objects" msgstr "Kan inte användas med flera objekt" msgid "Open" msgstr "Öppna" #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "Det finns inget förvalt program för “%(file)s” (%(type)s)." #, python-format msgid "Please use \"%s\"" msgstr "V.v. använd “%s”" msgid "Set Default Application..." msgstr "Välj standardprogram..." msgid "Open with default application" msgstr "Öppna med förvalt program" msgid "Reveal" msgstr "Visa" msgid "Open parent folder" msgstr "Öppna föräldermapp i filhanteraren" msgid "Open Terminal Here" msgstr "Öppna i terminalfönster" msgid "Open this location in a terminal" msgstr "Öppna platsen i terminalfönster" msgid "Run in Terminal" msgstr "Kör i terminalfönster" msgid "Run (Execute)" msgstr "Kör" msgid "Run this program in a Terminal" msgstr "Kör programmet i terminalfönster" msgid "Run this program" msgstr "Kör programmet" msgid "Go To" msgstr "Gå till" msgid "Open URL" msgstr "Öppna URL" msgid "Open URL with default viewer" msgstr "Öppna URL med standardprogram" msgid "Launch" msgstr "Starta" msgid "Show application window" msgstr "Visa programfönster" msgid "Launch application" msgstr "Starta program" msgid "Launch Again" msgstr "Starta igen" msgid "Launch another instance of this application" msgstr "Starta programmet igen" msgid "Close" msgstr "Stäng" msgid "Attempt to close all application windows" msgstr "Försök att stänga alla programmets fönster" #. TRANS: 'Run' as in Perform a (saved) command msgid "Run" msgstr "Utför" msgid "Perform command" msgstr "Utför kommando" msgid "(Empty Text)" msgstr "(Tom text)" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "“%(text)s”" msgstr[1] "(%(num)d lines) “%(text)s”" #. TRANS: Multiple artist description "Artist1 et. al. " #, python-format msgid "%s et. al." msgstr "%s et. al." #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "Rekursiv källa %(dir)s, (%(levels)d nivåer)" #, python-format msgid "Directory source %s" msgstr "Katalogkälla %s" msgid "Home Folder" msgstr "Hemmapp" msgid "Catalog Index" msgstr "Katalogindex" msgid "An index of all available sources" msgstr "Index över alla tilgängliga kataloger" msgid "Root catalog" msgstr "Rotkatalog" msgid "Please Configure Plugin" msgstr "V.v. konfigurera insticksmodulen" #, python-format msgid "Plugin %s is not configured" msgstr "%s är inte konfigurerad" #, python-format msgid "Invalid user credentials for %s" msgstr "Ogiltiga användaruppgifter för %s" msgid "Applications" msgstr "Program" msgid "All applications and preferences" msgstr "Alla program och inställningspaneler" msgid "Applications for Desktop Environment" msgstr "Program för skrivbordsmiljö" msgid "Open With..." msgstr "Öppna med..." msgid "Open with any application" msgstr "Öppna med godtyckligt program" msgid "Set default application to open this file type" msgstr "Välj förvalsprogram att öppna filer av den här typen med." msgid "Archive Manager" msgstr "Arkivhanterare" msgid "Use Archive Manager actions" msgstr "Använd funktioner i arkivhanteraren" msgid "Compressed archive type for 'Create Archive In'" msgstr "Arkivtyp för ‘Skapa arkiv i’" msgid "Extract Here" msgstr "Packa upp här" msgid "Extract compressed archive" msgstr "Packa upp komprimerad fil" msgid "Create Archive" msgstr "Skapa arkiv" msgid "Create a compressed archive from folder" msgstr "Skapa komprimerat arkiv av mappen" msgid "Create Archive In..." msgstr "Skapa arkiv i..." #. TRANS: Default filename (no extension) for 'Create Archive In...' msgid "Archive" msgstr "Arkiv" msgid "Calculator" msgstr "Miniräknare" msgid "Calculate expressions starting with '='" msgstr "Beräkna uttryck som börjar med “=”" msgid "Calculate" msgstr "Beräkna" msgid "Clipboards" msgstr "Urklipp" msgid "Recent clipboards and clipboard proxy objects" msgstr "Senaste urklipp och proxyobjekt till urklipp" msgid "Number of recent clipboards to remember" msgstr "Antal senaste urklipp som sparas" msgid "Include selected text in clipboard history" msgstr "Inkludera markerad text i historiken" msgid "Copy selected text to primary clipboard" msgstr "Kopiera markerad text till urklippet" msgid "Selected Text" msgstr "Markering" #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Urklipp “%(desc)s”" msgstr[1] "Urklipp med %(num)d rader “%(desc)s”" msgid "Clipboard Text" msgstr "Urklippt text" msgid "Clipboard File" msgstr "Urklippt fil" msgid "Clipboard Files" msgstr "Urklippta filer" msgid "Clear" msgstr "Rensa" msgid "Remove all recent clipboards" msgstr "Ta bort senaste urklipp" msgid "Shell Commands" msgstr "Skalkommandon" #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" "Kör skalkommandon. Kommandon markerade med symbolen %s kör i ett underskal." msgid "Run (Get Output)" msgstr "Kör (Hämta utdata)" msgid "Run program and return its output" msgstr "Kör ett program och returnera dess utdata" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command msgid "Pass to Command..." msgstr "Skicka till kommando..." msgid "Run program with object as an additional parameter" msgstr "Kör ett program och skicka objektet som sista parameter" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin msgid "Write to Command..." msgstr "Skriv till kommando..." msgid "Run program and supply text on the standard input" msgstr "Kör ett program och skriv texten på std. in" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. msgid "Filter through Command..." msgstr "Filtrera genom kommando..." msgid "Run command-line programs" msgstr "Kör kommandoradsprogram" msgid "GTK+" msgstr "GTK+" msgid "GNOME Terminal" msgstr "GNOME-terminal" msgid "XFCE Terminal" msgstr "XFCE-terminal" msgid "LXTerminal" msgstr "LXTerminal" msgid "X Terminal" msgstr "X-terminal" msgid "Urxvt" msgstr "Urxvt" msgid "Save As..." msgstr "Spara som..." msgid "Quit" msgstr "Avsluta" msgid "Quit Kupfer" msgstr "Avsluta Kupfer" msgid "About Kupfer" msgstr "Om Kupfer" msgid "Show information about Kupfer authors and license" msgstr "Visa information om Kupfers upphovsmän och licens" msgid "Kupfer Help" msgstr "Hjälp med Kupfer" msgid "Get help with Kupfer" msgstr "Öppna Kupfers användardokumentation" msgid "Show preferences window for Kupfer" msgstr "Visa Kupfers inställningsfönster" msgid "Search Contents" msgstr "Sök inuti" msgid "Search inside this catalog" msgstr "Sök bland objekt i katalogen" msgid "Copy" msgstr "Kopiera" msgid "Copy to clipboard" msgstr "Kopiera till urklipp" msgid "Rescan" msgstr "Uppdatera" msgid "Force reindex of this source" msgstr "Tvinga omläsning av källan" msgid "Last Command" msgstr "Senaste kommando" msgid "Internal Kupfer Objects" msgstr "Interna Kupfer-objekt" msgid "Last Result" msgstr "Senaste resultat" msgid "Command Results" msgstr "Kommandoresultat" msgid "Dictionary" msgstr "Ordbok" msgid "Look up word in dictionary" msgstr "Slå upp ord i ordboken" msgid "Look Up" msgstr "Slå upp" msgid "Documents" msgstr "Dokument" msgid "Recently used documents and bookmarked folders" msgstr "Senaste dokument och bokmärkta platser" msgid "Max recent document days" msgstr "Maximal ålder för senaste dokument (dagar)" msgid "Recent Items" msgstr "Senaste dokument" msgid "Recently used documents" msgstr "Senast använda dokument" #, python-format msgid "%s Documents" msgstr "%s-dokument" #, python-format msgid "Recently used documents for %s" msgstr "Senaste dokument för %s" msgid "Places" msgstr "Platser" msgid "Bookmarked folders" msgstr "Bokmärkta mappar" msgid "Epiphany Bookmarks" msgstr "Epiphany-bokmärken" msgid "Index of Epiphany bookmarks" msgstr "Index över Epiphany-bokmärken" msgid "Favorites" msgstr "Favoriter" msgid "Mark commonly used items and store objects for later use" msgstr "Märk ofta använda objekt eller lagra objekt för senare användning" msgid "Shelf of \"Favorite\" items" msgstr "Plats för favoritobjekt" msgid "Add to Favorites" msgstr "Lägg till favorit" msgid "Add item to favorites shelf" msgstr "Lägg till objekt till favorithyllan" msgid "Remove from Favorites" msgstr "Ta bort favorit" msgid "Remove item from favorites shelf" msgstr "Ta bort objekt från favorithyllan" msgid "File Actions" msgstr "Filkommandon" msgid "More file actions" msgstr "Fler filkommandon" msgid "Move To..." msgstr "Flytta till..." msgid "Move file to new location" msgstr "Flytta till ny plats" msgid "Rename To..." msgstr "Byt namn..." msgid "Copy To..." msgstr "Kopiera till..." msgid "Copy file to a chosen location" msgstr "Kopiera filen till vald plats" msgid "Firefox Bookmarks" msgstr "Firefox-bokmärken" msgid "Index of Firefox bookmarks" msgstr "Index över Firefox-bokmärken" msgid "Include visited sites" msgstr "Inkludera besökta sidor" #. TRANS: Multihead refers to support for multiple computer displays #. TRANS: In this case, it only concerns the special configuration #. TRANS: with multiple X "screens" msgid "Multihead Support" msgstr "Stöd för flera skärmar (“multihead”)" msgid "Selected File" msgstr "Markerad fil" msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" "Tillhandahåller aktuell markering i Nautilus, med Kupfers insticksmodul för " "Nautilus" #, python-format msgid "Selected File \"%s\"" msgstr "Markerad fil “%s”" msgid "Selected Files" msgstr "Markerade filer" msgid "Notes" msgstr "Anteckningar" msgid "Gnote or Tomboy notes" msgstr "Gnote- eller Tomboy-anteckningar" msgid "Work with application" msgstr "Använd program" msgid "Open with notes application" msgstr "Öppna med anteckningsprogarm" msgid "Append to Note..." msgstr "Lägg till anteckning..." msgid "Add text to existing note" msgstr "Tillfoga texten till existerande anteckning" msgid "Create Note" msgstr "Skapa anteckning" msgid "Create a new note from this text" msgstr "Skapa en ny anteckning från texten" msgid "Get Note Search Results..." msgstr "Hämta träffar i anteckningar..." msgid "Show search results for this query" msgstr "Visa träffar för denna sökning" #, python-format msgid "today, %s" msgstr "idag, %s" #, python-format msgid "yesterday, %s" msgstr "igår, %s" #. TRANS: Note description, %s is last changed time in locale format #, python-format msgid "Last updated %s" msgstr "Senast ändrad %s" msgid "Rhythmbox" msgstr "Rhythmbox" msgid "Play and enqueue tracks and browse the music library" msgstr "Spela spår och sök i musikbiblioteket" msgid "Include artists in top level" msgstr "Inkludera artister i toppnivån" msgid "Include albums in top level" msgstr "Inkludera album i toppnivån" msgid "Include songs in top level" msgstr "Inkludera låtar i toppnivån" msgid "Play" msgstr "Spela upp" msgid "Resume playback in Rhythmbox" msgstr "Starta uppspelning i Rhythmbox" msgid "Pause" msgstr "Paus" msgid "Pause playback in Rhythmbox" msgstr "Pausa uppspelning i Rhythmbox" msgid "Next" msgstr "Nästa" msgid "Jump to next track in Rhythmbox" msgstr "Hoppa till nästa spår i Rhythmbox" msgid "Previous" msgstr "Föregående" msgid "Jump to previous track in Rhythmbox" msgstr "Hoppa till föregående spår i Rhythmbox" msgid "Show Playing" msgstr "Vilken låt?" msgid "Tell which song is currently playing" msgstr "Visa vilken låt som spelas just nu" msgid "Clear Queue" msgstr "Rensa kön" msgid "Play tracks in Rhythmbox" msgstr "Spela upp spår i Rhythmbox" msgid "Enqueue" msgstr "Köa" msgid "Add tracks to the play queue" msgstr "Lägg till spår i spelkön" #. TRANS: Song description #, python-format msgid "by %(artist)s from %(album)s" msgstr "av %(artist)s från %(album)s" #. TRANS: Album description "by Artist" #, python-format msgid "by %s" msgstr "av %s" #. TRANS: Artist songs collection description #, python-format msgid "Tracks by %s" msgstr "Spår av %s" msgid "Albums" msgstr "Album" msgid "Music albums in Rhythmbox Library" msgstr "Album i Rhythmboxs bibliotek" msgid "Artists" msgstr "Artister" msgid "Music artists in Rhythmbox Library" msgstr "Artister i Rhythmboxs bibliotek" msgid "Songs" msgstr "Låtar" msgid "Songs in Rhythmbox library" msgstr "Låtar i Rhythmboxs bibliotek" msgid "GNOME Session Management" msgstr "Sessionshantering i GNOME" msgid "Special items and actions for GNOME environment" msgstr "Speicella objekt och kommandon för GNOME" msgid "Log Out..." msgstr "Logga ut..." msgid "Log out or change user" msgstr "Logga ut eller byt användare" msgid "Shut Down..." msgstr "Stäng av..." msgid "Shut down, restart or suspend computer" msgstr "Stäng av, starta om eller sätt datorn i vänteläge" msgid "Lock Screen" msgstr "Lås skärmen" msgid "Enable screensaver and lock" msgstr "Aktivera skärmsläckaren och lås skärmen" #. -*- coding: utf-8 -* msgid "XFCE Session Management" msgstr "Sessionshantering i XFCE" msgid "Special items and actions for XFCE environment" msgstr "Speicella objekt och kommandon för XFCE" msgid "Show Text" msgstr "Visa text" msgid "Display text in a window" msgstr "Visa text i ett fönster" msgid "Large Type" msgstr "Visa med stor text" msgid "Show Notification" msgstr "Visa notifiering" msgid "Trash" msgstr "Papperskorg" msgid "Access trash contents" msgstr "Tillgång till papperskorgens innehåll" msgid "Move to Trash" msgstr "Flytta till papperskorgen" msgid "Move this file to trash" msgstr "Flytta filen till papperskorgen" msgid "Restore" msgstr "Återskapa" msgid "Move file back to original location" msgstr "Flytta tillbaka till ursprunglig plats" msgid "Trash is empty" msgstr "Papperskorgen är tom" #. proper translation of plural #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "Papperskorgen innehåller ett objekt" msgstr[1] "Papperskorgen innehåller %(num)s objekt" msgid "Triggers" msgstr "Utlösare" msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" "Tilldela globala tangentbordsgenvägar till kommandon skapade med ‘Bygg " "kommando’" msgid "Add Trigger..." msgstr "Lägg till utlösare..." msgid "Remove Trigger" msgstr "Ta bort utlösare" msgid "URL Actions" msgstr "URL-kommandon" msgid "Download and Open" msgstr "Hämta och öppna" msgid "Download To..." msgstr "Hämta till..." msgid "Download URL to a chosen location" msgstr "Hämta till en vald plats" msgid "Volumes and Disks" msgstr "Volymer" msgid "Mounted volumes and disks" msgstr "Monterade volymer och löstagbara enheter" #, python-format msgid "Volume mounted at %s" msgstr "Volym monterad vid %s" msgid "Unmount" msgstr "Avmontera" msgid "Unmount this volume" msgstr "Avmontera volym" msgid "Eject" msgstr "Mata ut" msgid "Unmount and eject this media" msgstr "Avmontera och mata ut media" msgid "Search the Web" msgstr "Webbsökning" msgid "Search the web with OpenSearch search engines" msgstr "Sök webben med OpenSearch-sökmotorer" msgid "Search With..." msgstr "Sök med..." msgid "Search For..." msgstr "Sök efter..." msgid "Search Engines" msgstr "Sökmotorer" msgid "Wikipedia" msgstr "Wikipedia" msgid "Search in Wikipedia" msgstr "Sök i Wikipedia" msgid "Wikipedia language" msgstr "Wikipedia-språk" #. TRANS: Default wikipedia language code msgid "en" msgstr "sv" #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Sök efter denna termen i %s.wikipedia.org" msgid "Window List" msgstr "Fönsterlista" msgid "All windows on all workspaces" msgstr "Alla fönster på alla arbetsytor" msgid "Activate" msgstr "Aktivera" msgid "Shade" msgstr "Rulla upp" msgid "Unshade" msgstr "Rulla ner" msgid "Minimize" msgstr "Minimera" msgid "Unminimize" msgstr "Avminimera" msgid "Maximize" msgstr "Maximera" msgid "Unmaximize" msgstr "Avmaximera" msgid "Maximize Vertically" msgstr "Maximera vertikalt" msgid "Unmaximize Vertically" msgstr "Avmaximera vertikalt" #. TRANS: Window on (Workspace name), window description #, python-format msgid "Window on %(wkspc)s" msgstr "Fönster på %(wkspc)s" msgid "Frontmost Window" msgstr "Främsta fönster" msgid "Next Window" msgstr "Nästa fönster" msgid "Jump to this window's workspace and focus" msgstr "Gå till fönstrets arbetsyta och aktivera" #, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "%d fönster" msgstr[1] "%d fönster" msgid "Active workspace" msgstr "Aktiv arbetsyta" msgid "Jump to this workspace" msgstr "Hoppa till arbetsytan" msgid "Workspaces" msgstr "Arbetsytor" msgid "Abiword" msgstr "Abiword" msgid "Recently used documents in Abiword" msgstr "Senaste dokument i Abiword" msgid "Abiword Recent Items" msgstr "Abiwords senaste dokument" msgid "APT" msgstr "APT" msgid "Interface with the package manager APT" msgstr "Arbeta med pakethanteraren APT" msgid "Installation method" msgstr "Installationsmetod" msgid "Show Package Information" msgstr "Visa paketinformation" msgid "Install" msgstr "Installera" msgid "Install package using the configured method" msgstr "Installera paket m.h.a den konfigurerade metoden" #, python-format msgid "Packages matching \"%s\"" msgstr "Paketträffar för “%s”" msgid "Search Package Name..." msgstr "Sök paketnamn..." msgid "Deep Archives" msgstr "Djupa arkiv" msgid "Allow browsing inside compressed archive files" msgstr "Tillåt att titta inuti komprimerade filer" #, python-format msgid "Content of %s" msgstr "Innehåll för %s" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ msgid "Ascii & Unicode Icon Set" msgstr "Ascii & Unicode ikonuppsättningar" msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" "Ikonuppsättningarna Ascii respektive Unicode använder bokstäver och symboler " "som ikoner för objekt i Kupfer." msgid "Ascii" msgstr "Ascii" msgid "Unicode" msgstr "Unicode" msgid "Audacious" msgstr "Audacious" msgid "Control Audacious playback and playlist" msgstr "Kontrollera Audacious uppspelning och spellista" msgid "Add track to the Audacious play queue" msgstr "Lägg till spår i spelkön" msgid "Dequeue" msgstr "Ta ur kön" msgid "Remove track from the Audacious play queue" msgstr "Ta bort spår från spelkön" msgid "Jump to track in Audacious" msgstr "Hoppa till nästa spår i Audacious" msgid "Resume playback in Audacious" msgstr "Starta uppspelning i Audacious" msgid "Pause playback in Audacious" msgstr "Pausa uppspelning i Audacious" msgid "Jump to next track in Audacious" msgstr "Hoppa till nästa spår i Audacious" msgid "Jump to previous track in Audacious" msgstr "Hoppa till föregående spår i Audacious" msgid "Clear the Audacious play queue" msgstr "Rensa Audacious spelkö" msgid "Shuffle" msgstr "Blanda" msgid "Toggle shuffle in Audacious" msgstr "Växla blandad uppspelning i Audacious" msgid "Repeat" msgstr "Upprepa" msgid "Toggle repeat in Audacious" msgstr "Växla repetera i Audacious" msgid "Playlist" msgstr "Spellista" msgid "Chromium Bookmarks" msgstr "Chromium-bokmärken" msgid "Index of Chromium bookmarks" msgstr "Index över Chromium-bokmärken" #. -*- coding: UTF-8 -*- msgid "Claws Mail" msgstr "Claws Mail" msgid "Claws Mail Contacts and Actions" msgstr "Claws Mail-kontakter och kommandon" msgid "Compose New Email" msgstr "Skriv nytt e-postmeddelande" msgid "Compose a new message in Claws Mail" msgstr "Skriv nytt meddelande med Claws Mail" msgid "Receive All Email" msgstr "Hämta all e-post" msgid "Receive new messages from all accounts in ClawsMail" msgstr "Hämta nya meddelanden från alla konton i Claws Mail" msgid "Compose Email" msgstr "Skriv e-postmeddelande" msgid "Send in Email To..." msgstr "Skicka med e-post till..." msgid "Compose new message in Claws Mail and attach file" msgstr "Skapa nytt meddelande i ClawsMail och bifoga filen" msgid "Claws Mail Address Book" msgstr "Claws Mail-adressbok" msgid "Contacts from Claws Mail Address Book" msgstr "Kontakter från Claws Mail" msgid "Custom Terminal" msgstr "Valfri terminal" msgid "Configure a custom terminal emulator" msgstr "Konfigurera en valfri terminal" msgid "Execute flag" msgstr "Kör-flagga" msgid "Custom Theme" msgstr "Valfritt tema" msgid "Use a custom color theme" msgstr "Använd ett valfritt färgtema" msgid "Theme:" msgstr "Tema:" msgid "Default Email Client" msgstr "Förvald e-postläsare" msgid "Compose email using the system's default mailto: handler" msgstr "Skriv nytt e-postmeddelande m.h.a systemets mailto:-hanterare" msgid "Devhelp" msgstr "Devhelp" msgid "Search in Devhelp" msgstr "Sök i Devhelp" msgid "DuckDuckGo Search" msgstr "Sök med DuckDuckGo" msgid "Search the web securely with DuckDuckGo" msgstr "Sök webben med https med DuckDuckGo" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: msgid "Empathy" msgstr "Empathy" msgid "Access to Empathy Contacts" msgstr "Tillgång till Empathy-kontakter" msgid "Show offline contacts" msgstr "Visa frånkopplade kontakter" msgid "Available" msgstr "Tillgänglig" msgid "Away" msgstr "Frånvarande" msgid "Busy" msgstr "Stör inte" msgid "Not Available" msgstr "Ej tillgänglig" msgid "Invisible" msgstr "Osynlig" msgid "Offline" msgstr "Frånkopplad" msgid "Open Chat" msgstr "Öppna chatt" msgid "Change Global Status To..." msgstr "Ändra global status till..." msgid "Empathy Contacts" msgstr "Empathy-kontakter" msgid "Empathy Account Status" msgstr "Empathy-status" msgid "Evolution" msgstr "Evolution" msgid "Evolution contacts" msgstr "Evolution-kontakter" msgid "Compose a new message in Evolution" msgstr "Skriv nytt meddelande med Evolution" msgid "Compose new message in Evolution and attach file" msgstr "Skapa nytt meddelande i Evolution och bifoga filen" msgid "Evolution Address Book" msgstr "Evolution-adressbok" #. -*- coding: UTF-8 -*- msgid "Filezilla" msgstr "Filezilla" msgid "Show sites and handle ftp addresses by Filezilla" msgstr "Visa platser och hantera ftp-adresser från Filezilla" msgid "Open Site with Filezilla" msgstr "Öppna plats med Filezilla" msgid "Filezilla Sites" msgstr "Filezilla-platser" msgid "Sites from Filezilla" msgstr "Platser från Filezilla" #. -*- coding: UTF-8 -*- msgid "Gajim" msgstr "Gajim" msgid "Access to Gajim Contacts" msgstr "Tillgång till Gajim-kontakter" msgid "Free for Chat" msgstr "Free for Chat" msgid "Gajim Contacts" msgstr "Gajim-kontakter" msgid "Gajim Account Status" msgstr "Gajim status" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. msgid "Glob" msgstr "Glob" #. -*- coding: UTF-8 -*- msgid "Gmail" msgstr "Gmail" msgid "Load contacts and compose new email in Gmail" msgstr "Lista kontakter och skriv nya meddelanden i Gmail" msgid "Load contacts' pictures" msgstr "Läs in kontaktikoner" msgid "Load additional information" msgstr "Visa ytterligare information" msgid "Work email" msgstr "E-post (arbete)" msgid "Home email" msgstr "E-post (hem)" msgid "Other email" msgstr "Annan e-post" msgid "Work address" msgstr "Adress (arbete)" msgid "Home address" msgstr "Adress (hem)" msgid "Other address" msgstr "Annan adress" msgid "Car phone" msgstr "Biltelefon" msgid "Fax" msgstr "Fax" msgid "Home phone" msgstr "Telefon (hem)" msgid "Home fax" msgstr "Fax (hem)" msgid "Internal phone" msgstr "Intern telefon" msgid "Mobile" msgstr "Mobiltelefon" msgid "Other" msgstr "Annan" msgid "VOIP" msgstr "VOIP" msgid "Work phone" msgstr "Telefon (Arbete)" msgid "Work fax" msgstr "Fax (arbete)" msgid "Compose Email in Gmail" msgstr "Skriv e-postmeddelande i Gmail" msgid "Open web browser and compose new email in Gmail" msgstr "Skriv nytt meddelande i Gmail (i webbläsare)" msgid "Edit Contact in Gmail" msgstr "Redigera kontakt i Gmail" msgid "Open web browser and edit contact in Gmail" msgstr "Skriv nytt meddelande i Gmail (i webbläsare)" msgid "Contacts from Google services (Gmail)" msgstr "Kontakter från Google-tjänster (Gmail)" msgid "GNOME Terminal Profiles" msgstr "GNOME-terminal-profiler" msgid "Launch GNOME Terminal profiles" msgstr "Starta GNOME-terminal-profiler" #. -*- coding: UTF-8 -*- msgid "Google Picasa" msgstr "Google Picasa" msgid "Show albums and upload files to Picasa" msgstr "Visa album och ladda upp bilder till Picasa" msgid "Users to show: (,-separated)" msgstr "Användare att visa: (,-separerade)" msgid "Load user and album icons" msgstr "Läs in användar- och albumikoner" msgid "Uploading Pictures" msgstr "Skickar foton" msgid "Uploading pictures to Picasa Web Album" msgstr "Skickar foton till Picasa Webbalbum" msgid "Creating album:" msgstr "Skapar album:" msgid "Album created by Kupfer" msgstr "Album skapat av Kupfer" msgid "File:" msgstr "Fil:" #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "Ett album" msgstr[1] "%(num)d album" #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "ett foto" msgstr[1] "%(num)s foton" msgid "Upload to Picasa Album..." msgstr "Skicka till Picasa-album..." msgid "Upload files to Picasa album" msgstr "Skicka foton till ett album" msgid "Upload to Picasa as New Album" msgstr "Skicka till Picasa som nytt album" msgid "Create album from selected local directory" msgstr "Skapa album från markerad mapp" msgid "Picasa Albums" msgstr "Picasa-album" msgid "User albums in Picasa" msgstr "Användaralbum i Picasa" msgid "Google Search" msgstr "Sök med Google" msgid "Search Google with results shown directly" msgstr "Sök med Google och visa resultat direkt" #, python-format msgid "Results for \"%s\"" msgstr "Resultat för “%s”" #, python-format msgid "Show More Results For \"%s\"" msgstr "Visa fler resultat för “%s”" #, python-format msgid "%s total found" msgstr "%s funna totalt" #. -*- coding: UTF-8 -*- msgid "Getting Things GNOME" msgstr "Getting Things GNOME!" msgid "Browse and create new tasks in GTG" msgstr "Bläddra i och skapa nya uppgifter i GTG" #, python-format msgid "due: %s" msgstr "förfaller: %s" #, python-format msgid "start: %s" msgstr "start: %s" #, python-format msgid "tags: %s" msgstr "taggar: %s" msgid "Open task in Getting Things GNOME!" msgstr "Öppna uppgift i Getting Things GNOME" msgid "Delete" msgstr "Radera" msgid "Permanently remove this task" msgstr "Ta bort uppgift permanent" msgid "Mark Done" msgstr "Markera som slutförd" msgid "Mark this task as done" msgstr "Markera uppgift som slutförd" msgid "Dismiss" msgstr "Avfärda" msgid "Mark this task as not to be done anymore" msgstr "Markera att uppgiften inte ska göras längre" msgid "Create Task" msgstr "Skapa uppgift" msgid "Create new task in Getting Things GNOME" msgstr "Skapa ny uppgift i Getting Things GNOME" msgid "Gwibber" msgstr "Gwibber" msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" "Mikroblogga med Gwibber. Skicka och ta emot meddeladen från sociala nätverk " "som Twitter, Identi.ca etc. Kräver paketet ‘gwibber-service’." msgid "Maximum number of messages to show" msgstr "Maximalt antal visade meddelanden" #. TRANS: Account description, similar to "John on Identi.ca" #, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s på %(service)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s på %(where)s" msgid "Send Message" msgstr "Skicka meddelande" msgid "Send message to all Gwibber accounts" msgstr "Skicka meddelande till alla Gwibber-konton" msgid "Send Message To..." msgstr "Skicka meddelande till..." msgid "Send message to a Gwibber account" msgstr "Skicka meddelande till ett Gwibber-konton" msgid "Send Message..." msgstr "Skicka meddelande..." msgid "Send message to selected Gwibber account" msgstr "Skicka meddelande till valt Gwibber-konto" msgid "Reply..." msgstr "Svara..." msgid "Delete Message" msgstr "Radera meddelande" msgid "Send Private Message..." msgstr "Skicka direktmeddelande..." msgid "Send direct message to user" msgstr "Skicka direktmeddelande till..." msgid "Retweet" msgstr "Upprepa" msgid "Retweet To..." msgstr "Upprepa på..." msgid "Retweet message to all Gwibber accounts" msgstr "Upprepa meddelandet på alla konton i Gwibber" msgid "Retweet message to a Gwibber account" msgstr "Upprepa meddelandet på ett konto i Gwibber" msgid "Open in Browser" msgstr "Öppna i webbläsaren" msgid "Open message in default web browser" msgstr "Öppna meddelandet med webbläsaren" msgid "Gwibber Accounts" msgstr "Gwibber-konton" msgid "Accounts configured in Gwibber" msgstr "Konton konfigurerade i Gwibber" msgid "Gwibber Messages" msgstr "Gwibber-meddelanden" msgid "Recent messages received by Gwibber" msgstr "Nyligen mottagna meddelanden i Gwibber" #. TRANS: %s is a service name #, python-format msgid "Gwibber Messages for %s" msgstr "Gwibber-meddelanden för %s" msgid "Gwibber Streams" msgstr "Gwibber-flöden" msgid "Streams configured in Gwibber" msgstr "Flöden konfigurerade i Gwibber" #. TRANS: Gwibber messages in %s :: %s is a Stream name #, python-format msgid "Gwibber Messages in %s" msgstr "Gwibber-meddelanden i %s" msgid "Gwibber (Simple)" msgstr "Gwibber (enkel)" msgid "Send updates via the microblogging client Gwibber" msgstr "Skicka uppdateringar via mikrobloggklienten Gwibber" msgid "Send Update" msgstr "Skicka uppdatering" msgid "Unable to activate Gwibber service" msgstr "Kunde inte aktivera Gwibber-tjänsten" msgid "Higher-order Actions" msgstr "Högre ordningens kommandon" msgid "Tools to work with commands as objects" msgstr "Verktyg för att jobba med kommandon som objekt" msgid "Select in Kupfer" msgstr "Välj i Kupfer" #, python-format msgid "Result of %s (%s)" msgstr "Resultat av %s (%s)" msgid "Run (Take Result)" msgstr "Utför (Ta resultat)" msgid "Take the command result as a proxy object" msgstr "Ta kommandoresultat som proxyobjekt" msgid "Run (Discard Result)" msgstr "Utför (Kasta bort resultat)" msgid "Image Tools" msgstr "Bildverktyg" msgid "Image transformation tools" msgstr "Bildtranformeringskommandon" msgid "Scale..." msgstr "Skala..." msgid "Scale image to fit inside given pixel measure(s)" msgstr "Skala bilden för att passa inom given storlek" msgid "Rotate Clockwise" msgstr "Rotera medurs" msgid "Rotate Counter-Clockwise" msgstr "Rotera moturs" msgid "Autorotate" msgstr "Autorotera" msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "Rotera JPEG (på plats) enligt EXIF-metadata" msgid "Kupfer Plugins" msgstr "Kupfers insticksmoduler" msgid "Access Kupfer's plugin list in Kupfer" msgstr "Lista Kupfers insticksmoduler i Kupfer" msgid "Show Information" msgstr "Visa information" msgid "Show Source Code" msgstr "Visa källkod" msgid "enabled" msgstr "aktiverad" msgid "Locate Files" msgstr "Locate" msgid "Search filesystem using locate" msgstr "Sök filsystemet med ‘locate’" msgid "Ignore case distinctions when searching files" msgstr "Ignorera skillnad i gemener och VERSALER" #. -*- coding: UTF-8 -*- msgid "OpenOffice / LibreOffice" msgstr "OpenOffice / LibreOffice" msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "Senaste dokument i OpenOffice/LibreOffice" msgid "OpenOffice/LibreOffice Recent Items" msgstr "OpenOffice/LibreOffice senaste dokument" #. -*- coding: UTF-8 -*- msgid "Opera Mail" msgstr "Opera Mail" msgid "Opera Mail contacts and actions" msgstr "Opera Mail-kontakter och kommandon" msgid "Compose a new message in Opera Mail" msgstr "Skriv nytt meddelande med Opera Mail" msgid "Opera Mail Contacts" msgstr "Opera Mail-kontakter" msgid "Contacts from Opera Mail" msgstr "Kontakter från Opera Mail" msgid "Opera Bookmarks" msgstr "Opera-bokmärken" msgid "Index of Opera bookmarks" msgstr "Index över Opera-bokmärken" msgid "Pidgin" msgstr "Pidgin" msgid "Access to Pidgin Contacts" msgstr "Tillgång till Pidgin-kontakter" #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d tecken)" msgstr[1] "%s (%d tecken)" msgid "Pidgin Contacts" msgstr "Pidgin-kontakter" msgid "PuTTY Sessions" msgstr "PuTTY-sessioner" msgid "Quick access to PuTTY Sessions" msgstr "Snabb access till PuTTY-sessioner" msgid "Start Session" msgstr "Starta Session" msgid "Quicksilver Icons" msgstr "Quicksilver-ikoner" msgid "Quick Image Viewer" msgstr "Snabb bildvisare" msgid "View Image" msgstr "Visa bild" msgid "reStructuredText" msgstr "reStructuredText" msgid "Render reStructuredText and show the result" msgstr "Rendera reStructuredText-dokument och visa resultatet" msgid "View as HTML Document" msgstr "Visa som HTML-dokument" msgid "GNU Screen" msgstr "GNU Screen" msgid "Active GNU Screen sessions" msgstr "Aktiva GNU Screen-sessioner" msgid "Attached" msgstr "Ansluten" msgid "Detached" msgstr "Frånkopplad" #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s session (%(pid)s) skapad %(time)s" msgid "Screen Sessions" msgstr "Screen-sessioner" msgid "Attach" msgstr "Anslut till" msgid "Send Keys" msgstr "Skicka tangenter" msgid "Send synthetic keyboard events using xautomation" msgstr "Skicka syntetiska tangentbordshändelser m.h.a. xautomation" msgid "Paste to Foreground Window" msgstr "Klistra in i främsta fönstret" msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "Kopiera till urklippet och skicka Ctrl+V till främsta fönstret" msgid "Send keys to foreground window" msgstr "Skicka tangenter till främsta fönstret" msgid "Type Text" msgstr "Skriv text" msgid "Type the text to foreground window" msgstr "Skriv texten till främsta fönstret" #. -*- coding: UTF-8 -*- msgid "System Services" msgstr "Systemtjänster" msgid "Start, stop or restart system services via init scripts" msgstr "Starta, stoppa eller starta om systemtjänster m.h.a initskript" msgid "Sudo-like Command" msgstr "Sudo-likt kommando" msgid "Start Service" msgstr "Starta tjänst" msgid "Restart Service" msgstr "Starta om tjänst" msgid "Stop Service" msgstr "Stoppa tjänst" #, python-format msgid "%s Service" msgstr "%s" #. -*- coding: UTF-8 -*- msgid "Shorten Links" msgstr "Förkorta länkar" msgid "Create short aliases of long URLs" msgstr "Skapa korta alias för långa webbadresser" msgid "Error" msgstr "Fel" msgid "Shorten With..." msgstr "Förkorta med..." msgid "Services" msgstr "Service" msgid "Show QRCode" msgstr "Visa QRCode" msgid "Display text as QRCode in a window" msgstr "Visa text som QRCode i ett fönster" msgid "Access to Skype contacts" msgstr "Tillgång till Skype-kontakter" msgid "Skype Me" msgstr "Skype Me" msgid "Logged Out" msgstr "Frånkopplad" #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" msgid "Call" msgstr "Ring" msgid "Place a call to contact" msgstr "Påbörja samtal med kontakten" msgid "Skype Contacts" msgstr "Skype-kontakter" msgid "Skype Statuses" msgstr "Skype-status" #. -*- coding: UTF-8 -*- msgid "SSH Hosts" msgstr "SSH-värdar" msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "Tillhandahåller SSH-värdar från ~/.ssh/config" msgid "SSH host" msgstr "SSH-värd" msgid "Connect" msgstr "Anslut" msgid "Connect to SSH host" msgstr "Anslut till SSH-värd" msgid "SSH hosts as specified in ~/.ssh/config" msgstr "SSH-värdar konfigurerade i ~/.ssh/config" msgid "No D-Bus connection to desktop session" msgstr "Ingen D-Bus-anslutning till sessionen" msgid "GNOME Keyring" msgstr "GNOME-nyckelring" msgid "KWallet" msgstr "KWallet" msgid "Unencrypted File" msgstr "Ej krypterad fil" msgid "Document Templates" msgstr "Dokumentmallar" msgid "Create new documents from your templates" msgstr "Skapa dokument från mallar" #, python-format msgid "%s template" msgstr "%s-mall" msgid "Empty File" msgstr "Tom fil" msgid "New Folder" msgstr "Ny mapp" msgid "Create New Document..." msgstr "Skapa nytt dokument..." msgid "Create a new document from template" msgstr "Skapa nytt dokument från mall" msgid "Create Document In..." msgstr "Skapa dokument i..." msgid "Textfiles" msgstr "Textfiler" msgid "Append To..." msgstr "Lägg till..." msgid "Append..." msgstr "Lägg till..." msgid "Write To..." msgstr "Skriv till..." msgid "Get Text Contents" msgstr "Hämta textinnehåll" msgid "Thunar" msgstr "Thunar" msgid "File manager Thunar actions" msgstr "Kommandon i filhanteraren Thunar" msgid "Select in File Manager" msgstr "Välj i filhanteraren" msgid "Show Properties" msgstr "Visa egenskaper" msgid "Show information about file in file manager" msgstr "Visa information om filen i filhanteraren" msgid "Send To..." msgstr "Skicka till..." msgid "Symlink In..." msgstr "Mjuk länk (symlink) i..." msgid "Create a symlink to file in a chosen location" msgstr "Skapa mjuk länk till filen vid vald plats" msgid "Empty Trash" msgstr "Töm papperskorgen" msgid "Thunar Send To Objects" msgstr "Thunar Skicka till-objekt" msgid "Thunderbird" msgstr "Thunderbird" msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Thunderbird eller Icedove-kontakter och kommandon" msgid "Compose a new message in Thunderbird" msgstr "Skriv nytt mail i Thunderbird" msgid "Thunderbird Address Book" msgstr "Thunderbird adressbok" msgid "Contacts from Thunderbird Address Book" msgstr "Kontakter från Thunderbird" msgid "Top" msgstr "Aktiviteter" msgid "Show running tasks and allow sending signals to them" msgstr "Visa aktuella processer och skicka signaler till dem" msgid "Sort Order" msgstr "Sortering" msgid "Commandline" msgstr "Kommandorad" msgid "CPU usage (descending)" msgstr "Processoranvändning" #. sort processes (top don't allow to sort via cmd line) msgid "Memory usage (descending)" msgstr "Minnesanvändning" msgid "Send Signal..." msgstr "Skicka signal..." msgid "Signals" msgstr "Signaler" msgid "Running Tasks" msgstr "Aktuella processer" #. default: by cpu #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgid "Running tasks for current user" msgstr "Aktuella processer för nuvarande användare" msgid "Tracker" msgstr "Tracker" msgid "Tracker desktop search integration" msgstr "Integration med sökprogrammet Tracker" msgid "Search in Tracker" msgstr "Sök i Tracker" msgid "Open Tracker Search Tool and search for this term" msgstr "Sök efter denna term i Sökverktyget Tracker" msgid "Get Tracker Results..." msgstr "Hämta träffar från Tracker..." msgid "Show Tracker results for query" msgstr "Visa träffar för sökning med Tracker" msgid "Tracker 0.6" msgstr "Tracker 0.6" msgid "Tracker tags" msgstr "Tracker-taggar" msgid "Tracker Tags" msgstr "Tracker-taggar" msgid "Browse Tracker's tags" msgstr "Bläddra i Trackers taggar" #, python-format msgid "Tag %s" msgstr "Taggen %s" #, python-format msgid "Objects tagged %s with Tracker" msgstr "Objekt taggade %s med Tracker" msgid "Add Tag..." msgstr "Lägg till tagg..." msgid "Add tracker tag to file" msgstr "Lägg till tracker-tagg till filen" msgid "Remove Tag..." msgstr "Ta bort tagg..." msgid "Remove tracker tag from file" msgstr "Ta bort tracker-tagg från filen" #. -*- coding: UTF-8 -*- msgid "TrueCrypt" msgstr "TrueCrypt" msgid "Volumes from TrueCrypt history" msgstr "Volymer från TrueCrypt-historien" #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "TrueCrypt-volym %(file)s" msgid "Mount Volume" msgstr "Montera volym" msgid "Mount in Truecrypt" msgstr "Montera i Truecrypt" msgid "Try to mount file as Truecrypt volume" msgstr "Försök montera filen som Truecrypt-volym" msgid "Dismount All Volumes" msgstr "Avmontera alla volymer" msgid "TrueCrypt Volumes" msgstr "TrueCrypt-volymer" msgid "Terminal Server Client" msgstr "Terminal Server Client" msgid "Session saved in Terminal Server Client" msgstr "Sparad session in Terminal Server Client" msgid "TSClient sessions" msgstr "TSClient-sessioner" msgid "Saved sessions in Terminal Server Client" msgstr "Sparade sessioner in Terminal Server Client" msgid "Vim" msgstr "Vim" msgid "Recently used documents in Vim" msgstr "Senaste dokument i Vim" msgid "Vim Recent Documents" msgstr "Senast använda dokument i Vim" msgid "Close (Save All)" msgstr "Stäng (Spara alla)" msgid "Send..." msgstr "Skicka till..." msgid "Send ex command" msgstr "Sparat Kupfer-kommando" msgid "Insert in Vim..." msgstr "Infoga i Vim..." msgid "Active Vim Sessions" msgstr "Aktiva Vim-sessioner" #, python-format msgid "Vim Session %s" msgstr "Vim-session %s" msgid "Vinagre" msgstr "Vinagre" msgid "Vinagre bookmarks and actions" msgstr "Vinagre-kommandon och bokmärken" msgid "Start Vinagre Session" msgstr "Starta Vinagre-session" msgid "Vinagre Bookmarks" msgstr "Vinagre-bokmärken" #. -*- coding: UTF-8 -*- msgid "VirtualBox" msgstr "VirtualBox" msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "Kontrollera VirtualBox virtuella maskiner. Stöder både Sun VirtualBox och " "Open Source Edition." msgid "Force use CLI interface" msgstr "Tvinga CLI-gränssnitt" msgid "Power On" msgstr "Starta" msgid "Power On Headless" msgstr "Starta headless" msgid "Send Power Off Signal" msgstr "Skicka avstängningssignal" msgid "Reboot" msgstr "Starta om" #. VM_STATE_PAUSED msgid "Resume" msgstr "Återuppta" msgid "Save State" msgstr "Spara tillstånd" msgid "Power Off" msgstr "Stäng av" msgid "VirtualBox Machines" msgstr "VirtualBox virtuella maskiner" msgid "Zim" msgstr "Zim" msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "Tillgång till sidor i Zim" msgid "Page names start with :colon" msgstr "Sidnamn börjar med :kolon" msgid "Default page name for quick notes" msgstr "Namn för snabbanteckningar" #, python-format msgid "Note %x %X" msgstr "Anteckning %x %X" msgid "" "Strftime tags can be used: %H - hour, %M - minutes, etc\n" "Please check python documentation for details.\n" "NOTE: comma will be replaced by _" msgstr "" "Du kan använda ’strftime’-format: %H - timme, %M - minut, etc\n" "Se pythons dokumentation för detaljer\n" "Notera att kommatecken ersätts med _" msgid "Default namespace for quick notes" msgstr "Namnrymd för snabbanteckningar" #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Zim-sida från anteckningsblock “%s”" msgid "Create Zim Page" msgstr "Skapa Zim-sida" msgid "Create page in default notebook" msgstr "Skapa sida i förvalt anteckningsblock" msgid "Create Zim Page In..." msgstr "Skapa Zim-sida i..." msgid "Insert QuickNote into Zim" msgstr "Infoga snabbanteckning i Zim" msgid "Quick note selected text into Zim notebook" msgstr "Markerad text som snabbanteckning i Zim" msgid "Create Subpage..." msgstr "Skapa undersida..." msgid "Zim Notebooks" msgstr "Zim-anteckingsblock" msgid "Zim Pages" msgstr "Zim-sidor" msgid "Pages stored in Zim Notebooks" msgstr "Sidor i Zim-anteckningsblock" kupfer-v208/po/tr.po000066400000000000000000002347071176220042200144630ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2011-04-14 21:40+0200\n" "PO-Revision-Date: \n" "Last-Translator: Deran Delice \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "Uygulama Çalıştırıcı" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "" #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "Kupfer içinde çalıştır" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "Kayıtlı Kupfer Komutu" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "Klavye Kısayollarını Görüntüle" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "Genel Klavye Kısayolları" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "Başlat" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:150 msgid "Catalog" msgstr "Katalog" #: ../data/preferences.ui.h:5 #, fuzzy msgid "Desktop Environment" msgstr "Masaüstü Ortamı İçin Uygulamalar" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "" #: ../data/preferences.ui.h:7 msgid "General" msgstr "Genel" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "" #: ../data/preferences.ui.h:9 msgid "Inclusion in Top Level Searches" msgstr "" #: ../data/preferences.ui.h:10 #, fuzzy msgid "Indexed Folders" msgstr "Yeni Klasör" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "Klavye" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "Kupfer Özellikleri" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "Eklentiler" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:844 msgid "Reset" msgstr "Sıfırla" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "Bildirim alanında simge görüntüle" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "Oturum açıldığında başlat" #: ../data/preferences.ui.h:19 #, fuzzy msgid "Terminal emulator:" msgstr "Uçbirimi Burada Aç" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "Tek klavye kısayolu komutu kullan (Boşluk,/,virgül gibi)" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "Kullanıcı kimlik bilgileri" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "_Değiştir" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "_Şifre:" #: ../data/credentials_dialog.ui.h:4 msgid "_User:" msgstr "_Kullanıcı:" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "Klavye kısayolu bulunamadı" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "Lütfen istenen tuş bileşimini girin" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "Klavye Kısayolu Ayarla" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "açılışta uygulama penceresini gösterme" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "kullanılabilir eklenti listesi" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "hata ayıklama bilgisini etkinleştir" #: ../kupfer/main.py:46 msgid "run keyboard shortcut relay service on this display" msgstr "" #: ../kupfer/main.py:49 msgid "show usage help" msgstr "kullanım yardımını göster" #: ../kupfer/main.py:50 msgid "show version information" msgstr "sürüm bilgisini göster" #: ../kupfer/main.py:56 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "Kullanımı: kupfer [ OPTIONS | FILE ... ]" #: ../kupfer/main.py:67 msgid "Available plugins:" msgstr "Uygun eklentiler:" #: ../kupfer/main.py:114 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 msgid "Alternate Activate" msgstr "" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 msgid "Comma Trick" msgstr "Virgül Hileleri" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "Komut Oluştur" #: ../kupfer/ui/accelerators.py:11 #, fuzzy msgid "Mark Default Action" msgstr "Öntanımlı Uygulama Olarak Ayarla...." #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "Tümünü Sıfırla" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "Çıkış Yap" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "Seçilmiş Dosyayı Seç" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "Seçilmiş Yazıyı Seç" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "Yardımı Göster" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "Ayarları Göster" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "Metin Kipine Geç" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s boş" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "Eşleşme bulunamadı" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "Aramak için yazın" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr " %s'da aramak için yazın " #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "Eylem yok" #: ../kupfer/ui/browser.py:1461 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1471 #, python-format msgid "Forget About \"%s\"" msgstr "" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1903 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "Uygulama Penceresini Göster" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "Seçim ile Göster" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "Açıklama" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "Yazar" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "Sürüm" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "'%s' Python modülü gerekli" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "devre dışı" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "İçeriği" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "Kaynaklar" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "Eylemler" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:589 msgid "Configuration" msgstr "Ayarlar" #: ../kupfer/ui/preferences.py:609 msgid "Set username and password" msgstr "Kullanıcı adı, şifre ayarla" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:663 msgid "Choose a Directory" msgstr "Bir klasör seçin" #: ../kupfer/ui/preferences.py:842 msgid "Reset all shortcuts to default values?" msgstr "Tüm kısayollar öntanımlı değerlerine sıfırlansın mı ?" #: ../kupfer/ui/preferences.py:850 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "Komut" #: ../kupfer/ui/preferences.py:851 msgid "Shortcut" msgstr "Kısayol" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "M. Deran Delice" #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "Özgür Yazılım Lisanslı (GPLv3+) Başlatıcı yazılımı" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "Kupfer özgür yazılımdır ve Özgür Yazılım Vakfı tarafından yayınlanan\n" "GNU Genel Kamu Lisansı sürüm 2 veya daha sonraki bir sürümün şartları\n" "altında yeniden dağıtabilir ve/veya değiştirebilirsiniz.\n" "Bu program HERHANGİ BİR GARANTİ OLMADAN; hatta dolaylı olarak ORTALAMA\n" "BİR KALİTE GARANTİSİ veya ÖZEL BİR AMAÇ İÇİN UYGUNLUĞU bile olmadan \n" "faydalı olması umuduyla dağıtılmaktadır.Bu program ile birlikte GNU Genel " "Kamu Lisansının\n" "bir kopyasını almış olmanız gereklidir; eğer almadıysanız adresinden gözatabilirsiniz.\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "Çalışan Kupfer bulunamadı." #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "'%s' taşınamıyor" #: ../kupfer/core/commandexec.py:268 #, fuzzy, python-format msgid "\"%s\" produced a result" msgstr "\"%s\" bir sonuç üretti" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "" " \"%s\" dosyasını çalıştırmak için yeterli izniniz yok (çalıştırılabilir " "değil)" #: ../kupfer/core/execfile.py:47 #, fuzzy, python-format msgid "Command in \"%s\" is not available" msgstr "\"%s\" komutu bulunamadı" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 #, fuzzy msgid "Text" msgstr "Yazıyı Göster" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "Gecikmeden sonra çalıştır..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "Belirtilen süre gecikmesinin ardından komutu çalıştır" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "Çoklu Nesneler" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s nesne" msgstr[1] "%s nesne" #: ../kupfer/obj/contacts.py:87 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:107 msgid "Open" msgstr "Aç" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "%(file)s (%(type)s) dosya türü için öntenımlı uygulama yok" #: ../kupfer/obj/fileactions.py:45 #, fuzzy, python-format msgid "Please use \"%s\"" msgstr " \"%s\" Seçili Dosya" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "Öntanımlı Uygulama Olarak Ayarla...." #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "Öntanımlı uygulama ile aç" #: ../kupfer/obj/fileactions.py:77 msgid "Reveal" msgstr "Göster" #: ../kupfer/obj/fileactions.py:86 msgid "Open parent folder" msgstr "Üst dizini aç" #: ../kupfer/obj/fileactions.py:92 msgid "Open Terminal Here" msgstr "Uçbirimi Burada Aç" #: ../kupfer/obj/fileactions.py:105 msgid "Open this location in a terminal" msgstr "Bu konumu uçbirimde aç" #: ../kupfer/obj/fileactions.py:113 msgid "Run in Terminal" msgstr "Uçbirimde çalıştır" #: ../kupfer/obj/fileactions.py:113 msgid "Run (Execute)" msgstr "Çalıştır" #: ../kupfer/obj/fileactions.py:133 msgid "Run this program in a Terminal" msgstr "Bu uygulamayı uçbirimde çalıştır" #: ../kupfer/obj/fileactions.py:135 msgid "Run this program" msgstr "Bu uygulamayı çalıştır" #: ../kupfer/obj/objects.py:248 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 msgid "Go To" msgstr "Git" #: ../kupfer/obj/objects.py:274 msgid "Open URL" msgstr "Bağlantı aç" #: ../kupfer/obj/objects.py:285 msgid "Open URL with default viewer" msgstr "Öntanımlı görüntüleyici ile bağlantı aç" #: ../kupfer/obj/objects.py:299 msgid "Launch" msgstr "Çalıştır" #: ../kupfer/obj/objects.py:312 msgid "Show application window" msgstr "Uygulama penceresini göster" #: ../kupfer/obj/objects.py:313 msgid "Launch application" msgstr "Uygulamayı çalıştır" #: ../kupfer/obj/objects.py:324 msgid "Launch Again" msgstr "Tekrar Çalıştır" #: ../kupfer/obj/objects.py:331 msgid "Launch another instance of this application" msgstr "Bu uygulamadan bir tane daha çalıştır" #: ../kupfer/obj/objects.py:337 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "Kapat" #: ../kupfer/obj/objects.py:345 msgid "Attempt to close all application windows" msgstr "Tüm uygulama pencereleri kapatılmaya çalışıldı" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:392 msgid "Run" msgstr "Çalıştır" #: ../kupfer/obj/objects.py:402 msgid "Perform command" msgstr "Komutu uygula" #: ../kupfer/obj/objects.py:416 #, fuzzy msgid "(Empty Text)" msgstr "Boş Dosya" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:432 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "\"%(text)s\"" msgstr[1] "(%(num)d satır) \"%(text)s\"" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "" #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "" #: ../kupfer/obj/sources.py:103 #, python-format msgid "Directory source %s" msgstr "%s Sözlük Kaynağı" #: ../kupfer/obj/sources.py:113 msgid "Home Folder" msgstr "Ev Klasörü" #: ../kupfer/obj/sources.py:124 msgid "Catalog Index" msgstr "Katalog İçeriği" #: ../kupfer/obj/sources.py:139 msgid "An index of all available sources" msgstr "Uygun tüm kaynakların listesi" #: ../kupfer/obj/sources.py:170 msgid "Root catalog" msgstr "Yönetici katalogu" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "Lütfen Eklentiyi Yapılandırın" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "%s eklentisi yapılandırılmamış" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "%s için geçersiz kullanıcı bilgisi" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "" #: ../kupfer/plugin/core/alternatives.py:13 #, fuzzy msgid "GNOME Terminal" msgstr "GNOME Uçbirim Profilleri" #: ../kupfer/plugin/core/alternatives.py:22 #, fuzzy msgid "XFCE Terminal" msgstr "Uçbirimde çalıştır" #: ../kupfer/plugin/core/alternatives.py:31 #, fuzzy msgid "LXTerminal" msgstr "Uçbirimde çalıştır" #: ../kupfer/plugin/core/alternatives.py:40 #, fuzzy msgid "X Terminal" msgstr "Uçbirimde çalıştır" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "Farklı Kaydet..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "Çıkış" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "Kupfer'dan çık" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "Kupfer Hakkında" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "Kupfer geliştiricileri ve lisansı hakkında bilgileri göster" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Kupfer Yardım" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "Kupfer ile ilgili yardım alın" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "Kupfer seçenekleri penceresini göster" #: ../kupfer/plugin/core/__init__.py:65 msgid "Search Contents" msgstr "İçeriği Ara" #: ../kupfer/plugin/core/__init__.py:83 msgid "Search inside this catalog" msgstr "Bu katalog içinde ara" #: ../kupfer/plugin/core/__init__.py:91 msgid "Copy" msgstr "Kopyala" #: ../kupfer/plugin/core/__init__.py:106 msgid "Copy to clipboard" msgstr "Panoya kopyala" #: ../kupfer/plugin/core/__init__.py:128 msgid "Rescan" msgstr "Yeniden Tara" #: ../kupfer/plugin/core/__init__.py:143 msgid "Force reindex of this source" msgstr "Bu kaynağı yeniden taramak için zorla" #: ../kupfer/plugin/core/selection.py:8 ../kupfer/plugin/core/selection.py:36 msgid "Selected Text" msgstr "Seçili Yazı" #: ../kupfer/plugin/core/selection.py:23 #, fuzzy, python-format msgid "Selected Text \"%s\"" msgstr "\"%s\" Seçili Yazı" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "Son Komut" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Dahili Kupfer Nesneleri" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "Son Sonuçlar" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "Komut Sonuçları" #: ../kupfer/plugin/archivemanager.py:1 #, fuzzy msgid "Archive Manager" msgstr "Arşiv" #: ../kupfer/plugin/archivemanager.py:9 #, fuzzy msgid "Use Archive Manager actions" msgstr "Dosya yöneticisi Thunar eylemleri" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "Buraya Aç" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "Sıkıştırılmış arşivi çıkar" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "Arşiv Oluştur" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "Klasörü sıkıştır" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "Arşiv Oluştur..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "Arşiv" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "Uygulamalar" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "Tüm uygulamalar ve ayarları" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "Masaüstü Ortamı İçin Uygulamalar" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "Birlikte Aç..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "Herhangi bir uygulama ile aç" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "Bu dosya türü için öntanımlı uygulama olarak ayarla" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "Hesap Makinesi" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "'=' ile başlayan ifadeleri hesapla" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "Hesapla" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:71 msgid "Clipboards" msgstr "Panolar" #: ../kupfer/plugin/clipboard.py:4 ../kupfer/plugin/clipboard.py:111 msgid "Recent clipboards" msgstr "En son kullanılan panolar" #: ../kupfer/plugin/clipboard.py:20 msgid "Number of recent clipboards" msgstr "Son kullanılan pano sayısı" #: ../kupfer/plugin/clipboard.py:26 msgid "Include recent selections" msgstr "Son seçilenleri içer" #: ../kupfer/plugin/clipboard.py:32 msgid "Copy selection to primary clipboard" msgstr "Seçimi birincil panoya kopyala" #: ../kupfer/plugin/clipboard.py:44 #, fuzzy, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "Pano \"%(desc)s\"" msgstr[1] "%(num)d satırlı pano \"%(desc)s\"" #: ../kupfer/plugin/clipboard.py:51 msgid "Clear" msgstr "Temizle" #: ../kupfer/plugin/clipboard.py:63 msgid "Remove all recent clipboards" msgstr "Son kullanılan panoları sil" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "Kabuk Komutları" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "Çalıştır (Sonuçları Getir)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "Uygulamayı çalıştır ve sonucunu getir" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 #, fuzzy msgid "Pass to Command..." msgstr "Son Komut" #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 #, fuzzy msgid "Write to Command..." msgstr "Yaz..." #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 #, fuzzy msgid "Run program and supply text on the standard input" msgstr "Uygulamayı çalıştır ve sonucunu getir" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "" #: ../kupfer/plugin/commands.py:215 #, fuzzy msgid "Run command-line programs" msgstr "Komutsatırı uygulamalarını çalıştır" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "Sözlük" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "Sözlükte kelime ara" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "Gözat" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "Belgeler" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "En son kullanılan belgeler ve yerimlenmiş dizinler" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "En son kullanılan belgelere eklenmesi için en geç süre" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "Son Kullanılan Öğeler" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "Son kullanılan belgeler" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "%s Belgeleri" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "%s için son kullanılan belgeler" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "Yerler" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "Yerimi dizinleri" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Epiphany Yerimleri" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Epiphany Yerimleri İçeriği" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "Sık Kullanılanlar" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "Sıkça kullanılan öğleri işaretle ve daha sonra kullanmak için sakla" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "\"Sık Kullanılanlar\" Bölümü öğeleri" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "Beğenilenlere Ekle" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "Öğeyi sık kullanılanlara ekle" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "Beğenilenlerden Kaldır" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "Öğeyi sık kullanılanlardan kaldır" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "Dosya İşlemleri" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "Daha fazla dosya eylemi" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:210 msgid "Move To..." msgstr "Taşı..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:252 msgid "Move file to new location" msgstr "Dosyayı yeni bir konuma taşı" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "Yeniden Adlandır..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:165 msgid "Copy To..." msgstr "Kopyala..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:206 msgid "Copy file to a chosen location" msgstr "Dosyayı seçilen konuma kopyala" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Firefox Yerimleri" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Firefox yerimleri içeriği" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "Ziyaret edilen siteleride içer" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "Seçili Dosya" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "" #: ../kupfer/plugin/nautilusselection.py:25 #, fuzzy, python-format msgid "Selected File \"%s\"" msgstr " \"%s\" Seçili Dosya" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "Seçili Dosyalar" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "Notlar" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Gnote veya Tomboy notları" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "Uygulama ile çalıştır" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "Not uygulaması ile aç" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "Nota Ekle..." #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "Varolan bir nota yazı ekle" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "Not Oluştur" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "Bu yazıdan yeni bir not oluştur" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "Not Arama Sonuçlarını Getir..." #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "Bu sorgu için arama sonuçlarını göster" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "bugün, %s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "dün, %s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "son güncelleme%s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "" "Müzik kütüphanenize göz atın, şarkıları çalma listesine ekleyi ve oynatın" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "Oynat" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "Rhythmbox'da çalmayı sürdür" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "Duraklat" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "Rhythmbox'da çalmayı duraklat" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "Sonraki" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "Rhythmbox'da sonraki şarkıya atla" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "Önceki" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "Rhythmbox'da önceki şarkıya atla" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "Oynatılan Dosyayı Göster" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "Hangi şarkının çaldığını söyle" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "Çalma Listesini Temizle" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "Şarkıları Rhythmbox'ta çal" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "Çalma Listesi" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "Şarkıları çalma listesine ekle" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "%(artist)s tarafından %(album)s albümünde" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "%s tarafından" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "%s Şarkıları" #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "Albümler" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Rhythmbox Kütüphanesindeki albümler" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "Sanatçılar" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "Rhythmbox Kütüphanesindeki şarkıcılar" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "Şarkılar" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "Rhythmbox Kütüphanesindeki şarkılar" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "GNOME Oturum Yönetimi" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "GNOME masaüstü ortamı için özel öğeler ve eylemler" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "Oturumu Kapat..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "Oturumu kapat veya kullanıcı değiştir" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "Kapat..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "Kapat, yeniden başlat veya askıya al" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "Ekranı Kilitle" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "Ekran koruyucu ve kilitleme etkin" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "XFCE Oturum Yönetimi" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "XFCE masaüstü ortamı için özel öğeler ve eylemler" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "Yazıyı Göster" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:52 msgid "Display text in a window" msgstr "Yazıyı pencere içinde göster" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "Büyük Yaz" #: ../kupfer/plugin/show_text.py:60 msgid "Show Notification" msgstr "Uyarı Görüntüle" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "Çöp" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "Çöpün içeriğine erişin" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "Çöpe Taşı" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "Bu dosyayı çöpe gönder" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "Geri Yükle" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "Dosyayı eski konumuna döndür" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "Çöp boş" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "Çöpte bir dosya var" msgstr[1] "Çöpte %(num)s dosya var" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "" #: ../kupfer/plugin/triggers.py:6 msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "" #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "" #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "URL Eylemleri" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "İndir ve Aç" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "İndir..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "Seçili konuma bağlantıyı indirin" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "Diskler ve Bölümler" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "Bağlı birim ve diskler" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "%s bölüm bağlı" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "Ayır" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "Bölümü ayır" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "Çıkar" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "Ayır ve ortam aygıtını çıkar" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "Web'de ara" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "OpenSearch destekleyen arama motorları ile web'de ara" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "Birlikte Ara...." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "Ara..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "Arama Motorları" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "Vikipedi" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "Vikipedi'de ara" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "Vikipedi Dili" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "tr" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "Bu ifadeyi %s.wikipedia.org 'da ara" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "Pencere Listesi" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "Tüm çalışma alanlarındaki bütün pencereler" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "Etkin" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "Sar" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "Genişlet" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "Küçült" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "Büyüt" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "Ekranı Kapla" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "Küçült" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "Dikey Büyüt" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "Dikey Küçült" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, fuzzy, python-format msgid "Window on %(wkspc)s" msgstr "Pencere %(wkspc)s alanında" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "Öndeki Pencere" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "Sonraki Pencere" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "Bu pencerenin çalışma alanına geç ve odaklan" #: ../kupfer/plugin/windows.py:252 #, fuzzy, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "Sonraki Pencere" msgstr[1] "Sonraki Pencere" #: ../kupfer/plugin/windows.py:256 #, fuzzy msgid "Active workspace" msgstr "Bu çalışma alanına geç" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "Bu çalışma alanına geç" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "Çalışma Alanları" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Abiword'de en son kullanılan dosyalar" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Abiword Son Öğeler" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "Yükleme Yöntemi" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "Paket Bilgisini Göster" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "Yükle" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "\"%s\" ile eşleşen paketler" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "Paket İsmi Ara." #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "Sıkıştırılmış arşiv dosyalarının içini görmenizi sağlar" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "%s İçeriği" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr " Audacious Oynatım ve Çalma listesini denetle" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "Şarkıyı Audacious oynatma listesine ekle" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "Çalma Listesinden Çıkar" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "Şarkıyı Audacious parça listesinden sil" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "Audacious'ta oynatımı sürdür" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "Audacious'ta oynatımı durdur" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "Audacious'ta sonraki şarkıya geç" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "Audacious'ta önceki şarkıya dön" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "Audacious Çalıma listesini temizle" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "Karışık" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "Tekrarla" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "Oynatma Listesi" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Chromium Yerimleri" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Chromium yerimleri içeriği" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws Mail" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Claws Mail Kişi ve eylemleri" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "Yeni E-posta yaz" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "Claws Mail'de yeni ileti yaz" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "Tüm E-postaları al" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "ClawsMail'de ki tüm hesapların yeni iletilerini al" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "E-Posta yaz" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "E-posta gönder..." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Claws Mail Adres Defteri" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Claws Mail Adres Defterindeki Kişiler" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 #, fuzzy msgid "Custom Terminal" msgstr "Uçbirimde çalıştır" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "Öntanımlı E-posta İstemcisi" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "Devhelp'te ara" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "" #: ../kupfer/plugin/empathy.py:6 #, fuzzy msgid "Access to Empathy Contacts" msgstr "Gajim Kişilerine Erişin" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "Çevrimdışı kişileri göster" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "Uygun" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "Uzakta" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "Meşgul" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "Uygun Değil" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "Görünmez" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "Çevrimdışı" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:90 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:204 msgid "Open Chat" msgstr "Sohbet Başlat" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:118 #: ../kupfer/plugin/skype.py:250 msgid "Change Global Status To..." msgstr "Genel durumu değiştir..." #: ../kupfer/plugin/empathy.py:171 #, fuzzy msgid "Empathy Contacts" msgstr "Gajim Kişileri" #: ../kupfer/plugin/empathy.py:237 #, fuzzy msgid "Empathy Account Status" msgstr "Gajim Hesap Durumu" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Evolution kişileri" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "Evolution'da yeni ileti yaz" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "Evolution'da yeni ileti yaz ve dosya ekle" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Evolution Adres Defteri" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "" "Filezilla kullanarak siteleri görüntüleyin veya ftp adreslerinizi yönetin." #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "Siteyi Filezilla ile aç" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Filezilla Siteleri" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "Filezilla'da ki siteler" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "Gajim Kişilerine Erişin" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "Sohbet için uygun" #: ../kupfer/plugin/gajim.py:146 msgid "Gajim Contacts" msgstr "Gajim Kişileri" #: ../kupfer/plugin/gajim.py:210 msgid "Gajim Account Status" msgstr "Gajim Hesap Durumu" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "GNOME Uçbirim Profilleri" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "GNOME Uçbirim Profillerini çalıştır" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:144 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "Kişileri yükle ve Gmail'de yeni e-posta yaz" #: ../kupfer/plugin/gmail/__init__.py:32 msgid "Load contacts' pictures" msgstr "Kişi resimlerini yükle" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Compose Email in GMail" msgstr "GMail'de E-Posta Yaz" #: ../kupfer/plugin/gmail/__init__.py:74 msgid "Open web browser and compose new email in GMail" msgstr "Bir web tarayıcı aç ve Gmail'de yeni e-posta yaz" #: ../kupfer/plugin/gmail/__init__.py:177 msgid "Contacts from Google services (Gmail)" msgstr "Google Servis Kişileri (Gmail)" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "Albümleri göster ve Picasa'ya dosyları yükle" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "Gösterilecek kullanıcılar: (,-virgülle ayrılmış)" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "Kullanıcıları ve albüm simgelerini yükle" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "Resimler yükleniyor" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "Resimler, Picasa Web Albümleri'ne yükleniyor" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "Oluşturulan albüm:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Albüm Kupfer tarafından oluşturulmuştur." #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "Dosya:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "Bir albüm" msgstr[1] "%(num)d albüm" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "Bir fotoğraf" msgstr[1] "%(num)s fotoğraf" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "Picasa Albümlerine Yükle..." #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "Dosyaları Picasa albümlerine yükle" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "Picasa'ya Yeni Albüm Olarak Yükle" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "Seçili yerel klasörden albüm oluştur" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Picasa Albümleri" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "Picasa'da ki kullanıcı albümleri" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Google Arama" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "Google'da hemen görüntülenen sonuçlar ile arama yapın" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #, python-format msgid "Results for \"%s\"" msgstr "\"%s\" için sonuçlar" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr " \"%s\" İçin Daha Fazla Sonuç Göster" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "Toplam %s bulundu" #: ../kupfer/plugin/google_translate.py:6 msgid "Google Translate" msgstr "Google Çeviri" #: ../kupfer/plugin/google_translate.py:8 #: ../kupfer/plugin/google_translate.py:153 msgid "Translate text with Google Translate" msgstr "Google Çeviri kullanarak yazıyı tercüme et" #: ../kupfer/plugin/google_translate.py:83 msgid "Google Translate connection timed out" msgstr "Google Çeviri bağlantısı zaman aşımına uğradı." #: ../kupfer/plugin/google_translate.py:86 msgid "Error connecting to Google Translate" msgstr "Google Çeviriye bağlanırken hata" #: ../kupfer/plugin/google_translate.py:136 #: ../kupfer/plugin/google_translate.py:223 msgid "Translate To..." msgstr "Çevir..." #: ../kupfer/plugin/google_translate.py:179 #, fuzzy, python-format msgid "Translate into %s" msgstr "%s Çevir" #: ../kupfer/plugin/google_translate.py:203 msgid "Languages" msgstr "Diller" #: ../kupfer/plugin/google_translate.py:238 msgid "Show translated page in browser" msgstr "Çevirilen sayfayı tarayıcıda göster" #: ../kupfer/plugin/google_translate.py:255 msgid "Show Translation To..." msgstr "Çeviriyi göster..." #: ../kupfer/plugin/google_translate.py:271 msgid "Show translation in browser" msgstr "Çeviriyi tarayıcıda göster" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "GNOME'la, hayatını yaşa!" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "GHY'da bulunan görevlere göz at ve yenilerini oluştur" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "başlat: %s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "etiket: %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "Gnome'la, Hayatını Yaşa'da görev aç" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "Sil" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "Bu görevi kalıcı olark sil" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "Tamamlanmış Olarak İşaretle" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "Bunu Tamamlandı Olarak İşaretle" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "Kapat" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "Yapılmayacak olarak işaretle" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "Görev Oluştur" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "GNOME'la, hayatını yaşa'da yeni görev oluştur" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, fuzzy, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s %(when)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, fuzzy, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s" #: ../kupfer/plugin/gwibber.py:187 #, fuzzy msgid "Send Message" msgstr "Mesaj Gönder..." #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "" #: ../kupfer/plugin/gwibber.py:210 #, fuzzy msgid "Send Message To..." msgstr "Mesaj Gönder..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "Mesaj Gönder..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "Yanıtla..." #: ../kupfer/plugin/gwibber.py:314 #, fuzzy msgid "Delete Message" msgstr "Mesaj Gönder..." #: ../kupfer/plugin/gwibber.py:337 #, fuzzy msgid "Send Private Message..." msgstr "Mesaj Gönder..." #: ../kupfer/plugin/gwibber.py:370 msgid "Send direct message to user" msgstr "" #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "" #: ../kupfer/plugin/gwibber.py:376 #, fuzzy msgid "Retweet To..." msgstr "Yeniden Adlandır..." #: ../kupfer/plugin/gwibber.py:407 #, fuzzy msgid "Retweet message to all Gwibber accounts" msgstr "ClawsMail'de ki tüm hesapların yeni iletilerini al" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:413 #, fuzzy msgid "Open in Browser" msgstr "Üst dizini aç" #: ../kupfer/plugin/gwibber.py:419 #, fuzzy msgid "Open message in default web browser" msgstr "Öntanımlı görüntüleyici ile bağlantı aç" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 #, fuzzy msgid "Gwibber Accounts" msgstr "Gajim Hesap Durumu" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:495 msgid "Gwibber Messages" msgstr "" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "" #: ../kupfer/plugin/gwibber.py:543 msgid "Gwibber Streams" msgstr "" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:3 msgid "Gwibber (Simple)" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "Yüksek Öncelikli Eylemler" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "Kupfer'da seç" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr " %s (%s) sonuçları" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "Çalıştır (Sonuçları al)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "Çalıştır (Sonuçları Alma)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "Resim Araçları" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "Resim dönüştürme araçları" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "Boyutlandır..." #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "Resimi verilen piksel uzunluğuna göre boyutlandır" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "Saat Yönünde Döndür" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "Saat Yönünün Tersine Döndür" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "Otomatik Döndür" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Kupfer Eklentileri" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "Kupfer eklenti listesine Kupfer içinde erişin" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "Bilgi Göster" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "Kaynak Kodu Göster" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "etkin" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 #, fuzzy msgid "Locate Files" msgstr "Dosyaları yerleştir" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "Dosyaları ararken karakter boyutunu önemseme" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 #, fuzzy msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "OpenOffice'de en son kullanılan belgeler" #: ../kupfer/plugin/openoffice.py:83 #, fuzzy msgid "OpenOffice/LibreOffice Recent Items" msgstr "OpenOffice Son Kullanılan Öğeler" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Opera Yerimleri" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Opera Yerimleri İçeriği" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera Mail" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Opera Mail Kişi ve Eylemleri" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "Opera Mail'de yeni bir mesaj yaz" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Opera Mail Kişileri" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Opera Mail'de ki kişiler" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "Pidgin Kişilerine Eriş" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d karakter)" msgstr[1] "%s (%d karakter)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Pidgin Kişileri" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "PuTTY Oturumları" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "PuTTY Oturumlarına hızlı erişim" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "Oturum Başlat" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "HTML olarak görüntüle" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "Eklenmiş" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "Ayrılmış" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s oturumu (%(pid)s) %(time)s tarihinde oluşturuldu" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Ekran Oturumları" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "Ekle" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:49 msgid "Send Keys" msgstr "" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "" #: ../kupfer/plugin/sendkeys.py:25 msgid "Paste to Foreground Window" msgstr "" #: ../kupfer/plugin/sendkeys.py:43 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:85 msgid "Send keys to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:90 msgid "Type Text" msgstr "" #: ../kupfer/plugin/sendkeys.py:111 msgid "Type the text to foreground window" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "Sistem Servisleri" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "" #: ../kupfer/plugin/services.py:18 #, fuzzy msgid "Sudo-like Command" msgstr "Sudo benzeri komut" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "Servisi Başlat" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "Servisi Yeniden Başlat" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "Servisi Durdur" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "%s Servisi" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "Kısaltılmış Bağlantılar" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "Uzun bağlantılarınızı kısaltın" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "HatA" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "Kısaltıldı..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "Servisler" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 #, fuzzy msgid "Show QRCode" msgstr "Kaynak Kodu Göster" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 #, fuzzy msgid "Display text as QRCode in a window" msgstr "Yazıyı pencere içinde göster" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "Skype kişilerine erişin" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "Oturum Kapatılmış" #: ../kupfer/plugin/skype.py:183 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:225 msgid "Call" msgstr "Ara" #: ../kupfer/plugin/skype.py:239 msgid "Place a call to contact" msgstr "Kişi arayın" #: ../kupfer/plugin/skype.py:274 msgid "Skype Contacts" msgstr "Skype Kişileri" #: ../kupfer/plugin/skype.py:294 msgid "Skype Statuses" msgstr "Skype Durumları" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "SSH Sunucular" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "~/.ssh/config dosyasında ki SSH sunucularına ekler" #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "SSH Sunucu" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "Bağlan" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "SSH Sunucuya Bağlan" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "~/.ssh/config dosyasında belirtilen SSH sunucuları" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "Masaüstü oturumu için D-Bus bağlantısı yok" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "Şablonlar" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "Şablonlarından yeni belge oluştur" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "%s şablonu" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "Boş Dosya" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "Yeni Klasör" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "Yeni Belge Oluştur..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "Şablondan yeni belge oluştur" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "Belge Oluştur..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "Yazıdosyaları" #: ../kupfer/plugin/textfiles.py:51 #, fuzzy msgid "Append To..." msgstr "Ekle..." #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "Ekle..." #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "Yaz..." #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "Yazı içeriğini getir" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:184 #: ../kupfer/plugin/thunar.py:224 ../kupfer/plugin/thunar.py:283 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:10 msgid "File manager Thunar actions" msgstr "Dosya yöneticisi Thunar eylemleri" #: ../kupfer/plugin/thunar.py:66 msgid "Select in File Manager" msgstr "Dosya Yöneticisinde Seç" #: ../kupfer/plugin/thunar.py:94 msgid "Show Properties" msgstr "Özellikleri Göster" #: ../kupfer/plugin/thunar.py:117 msgid "Show information about file in file manager" msgstr "Dosya bilgilerini dosya yöneticisinde göster" #: ../kupfer/plugin/thunar.py:126 msgid "Send To..." msgstr "Gönder..." #: ../kupfer/plugin/thunar.py:258 msgid "Empty Trash" msgstr "Çöpü Boşalt" #: ../kupfer/plugin/thunar.py:298 msgid "Thunar Send To Objects" msgstr "" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Thunderbird/Icedove Kişi ve Eylemleri" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "Thunderbird'de yeni ileti yaz" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Thunderbird Adres Defteri" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Thunderbird Adres defteri kişileri" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "Üst" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "Yürütülen işlemleri gösterir ve onlara sinyal göndermenizi sağlar" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "Sıralama Düzeni" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "Komutsatırı" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "CPU kullanımı (azalan)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "Bellek kullanımı (azalan)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "Sinyal Gönder..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "Sinyaller" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "Çaşılan İşlemler" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s işl: %(cpu)g%% haf: %(mem)g%% süre: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "Aktif kullanıcı içi yürütülen işlemler" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:15 ../kupfer/plugin/tracker1.py:18 msgid "Tracker desktop search integration" msgstr "Tracker masaüstü arama bütünleşmesi" #: ../kupfer/plugin/tracker.py:41 ../kupfer/plugin/tracker1.py:49 msgid "Search in Tracker" msgstr "Tracker'da ara" #: ../kupfer/plugin/tracker.py:46 ../kupfer/plugin/tracker1.py:54 msgid "Open Tracker Search Tool and search for this term" msgstr "Tracker arama aracını aç ve bu terim için ara" #: ../kupfer/plugin/tracker.py:55 ../kupfer/plugin/tracker1.py:62 msgid "Get Tracker Results..." msgstr "Tracker sonuçlarını getir" #: ../kupfer/plugin/tracker.py:64 ../kupfer/plugin/tracker1.py:71 msgid "Show Tracker results for query" msgstr "Bu sorgu için Tracker sonuçlarını göster" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Tracker etiketleri" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Tracker etiketleri" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "Tracker etiketlerine gözat" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "%s Etiket" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "Tracker'da %s ile etiketlenmiş dosyalar" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "Etiket Ekle..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "Dosyaya Tracker etiketi ekle" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "Etiketi Sil..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "Dosyanın Tracker etiketini sil" #: ../kupfer/plugin/tracker1.py:10 #, fuzzy msgid "Tracker" msgstr "Tracker 0.6" #. FIXME: Port tracker tag sources and actions #. to the new, much more powerful sparql + dbus API #. (using tracker-tag as in 0.6 is a plain hack and a dead end) #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "TrueCrypt geçmişinden birimler" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "TrueCrypt Birimi: %(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "Birimi Bağla" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "TrueCrypt'ta bağla" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "Dosyayı TrueCrypt Birimi olarak bağlamayı dene" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "Bütün Birimlerin Bağını Kaldır" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "TrueCrypt Birimleri" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "Uçbirim sunucu istemcisi" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "Oturum, uçbirim sunucu istemcisine kayıt edildi" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "TSClient oturumları" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "Uçbirim sunucu istemcisine kayıtlı oturumlar" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Vinagre Yerimleri ve Eylemleri" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "Vinagre Oturumu Başlat" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Vinagre Yerimleri" #: ../kupfer/plugin/vim.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim.py:3 msgid "Recently used documents in Vim" msgstr "Vim'de en son kullanılan belgeler" #: ../kupfer/plugin/vim.py:46 msgid "Vim Recent Documents" msgstr "Vim En son kullanılan belgeler" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "" "VirtualBox Sanal makinelerini yönetin. Sun VirtualBox veya Açık kaynaklı " "sürümlerini destekler." #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "Aç" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "Makineye Kapatma Sinyali Gönder" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "Yeniden Başlat" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "Sürdür" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "Şu an ki durumu kaydet" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "Kapat" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "VirtualBox Makineleri" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:10 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "" #: ../kupfer/plugin/zim.py:28 msgid "Page names start with :colon" msgstr "" #: ../kupfer/plugin/zim.py:58 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "" #: ../kupfer/plugin/zim.py:67 msgid "Create Zim Page" msgstr "Zim Sayfası Oluştur" #: ../kupfer/plugin/zim.py:74 msgid "Create page in default notebook" msgstr "Öntanımlı not defterinde sayfa oluştur" #: ../kupfer/plugin/zim.py:84 msgid "Create Zim Page In..." msgstr "" #: ../kupfer/plugin/zim.py:122 msgid "Create Subpage..." msgstr "" #: ../kupfer/plugin/zim.py:243 msgid "Zim Notebooks" msgstr "" #: ../kupfer/plugin/zim.py:259 msgid "Zim Pages" msgstr "Zim Sayfaları" #: ../kupfer/plugin/zim.py:287 msgid "Pages stored in Zim Notebooks" msgstr "" #~ msgid "Directories" #~ msgstr "Klasörler" #~ msgid "Interface" #~ msgstr "Arayüz" #~ msgid "Hide Kupfer when focus is lost" #~ msgstr "Başka pencereye odaklanıldığında uygulamayı gizle" #~ msgid "Text Matches" #~ msgstr "Eşleşmeler" #~ msgid "noun" #~ msgstr "isim" #~ msgid "verb" #~ msgstr "fiil" #~ msgid "adjective" #~ msgstr "sıfat" #~ msgid "Twitter" #~ msgstr "Twitter" #~ msgid "Load friends' pictures" #~ msgstr "Arkadaşlarının resimlerini yükle" #~ msgid "Load timeline" #~ msgstr "Zaman çizelgesini yülke" #~ msgid "Post Update to Twitter" #~ msgstr "Twitter hesabınıza güncellemeleri gönderin" #~ msgid "Twitter Timeline" #~ msgstr "Twitter Zaman Çizelgesi" #~ msgid "Twitter Friends" #~ msgstr "Twitter Arkadaşları" #~ msgid "Timeline for %s" #~ msgstr "%s için zaman çizelgesi" #~ msgid "OpenOffice" #~ msgstr "OpenOffice" #~ msgid "Preferred terminal" #~ msgstr "Tercih edilen uçbirim" #~ msgid "Tracker 0.8" #~ msgstr "Tracker 0.8" kupfer-v208/po/wscript000066400000000000000000000001561176220042200151010ustar00rootroot00000000000000def build(bld): bld.new_task_gen( features = 'intltool_po', appname = bld.env["PACKAGE"]) kupfer-v208/po/zh_CN.po000066400000000000000000002371701176220042200150340ustar00rootroot00000000000000# Simplified Chinese translation of kupfer # Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. # This file is distributed under the same license as the kupfer package. # lh , 2009. # du baodao , 2010. # Yinghua Wang , 2011. # Aron Xu , 2011. # msgid "" msgstr "" "Project-Id-Version: kupfer master\n" "Report-Msgid-Bugs-To: http://bugs.launchpad.net/kupfer\n" "POT-Creation-Date: 2011-04-14 21:40+0200\n" "PO-Revision-Date: 2011-03-05 15:03+0800\n" "Last-Translator: Yinghua Wang \n" "Language-Team: Chinese (simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" #: ../auxdata/kupfer.desktop.in.h:1 msgid "Application Launcher" msgstr "程序启动器" #: ../auxdata/kupfer.desktop.in.h:2 msgid "Convenient command and access tool for applications and documents" msgstr "方便的命令和操作程序或文档的工具" #: ../auxdata/kupfer.desktop.in.h:3 ../kupfer/version.py:15 #: ../kupfer/plugin/core/contents.py:91 msgid "Kupfer" msgstr "Kupfer" #: ../auxdata/kupfer-exec.desktop.in.h:1 msgid "Execute in Kupfer" msgstr "在 Kupfer 中执行" #: ../auxdata/kupfer-mimetypes.xml.in.h:1 msgid "Saved Kupfer Command" msgstr "已保存的 Kupfer 命令" #: ../data/preferences.ui.h:1 msgid "Browser Keyboard Shortcuts" msgstr "浏览键盘快捷键" #: ../data/preferences.ui.h:2 msgid "Global Keyboard Shortcuts" msgstr "全局快捷键" #: ../data/preferences.ui.h:3 msgid "Start" msgstr "开始" #: ../data/preferences.ui.h:4 ../kupfer/obj/sources.py:150 msgid "Catalog" msgstr "类别" #: ../data/preferences.ui.h:5 #, fuzzy msgid "Desktop Environment" msgstr "桌面环境的应用程序" #: ../data/preferences.ui.h:6 msgid "Folders whose files are always available in the catalog." msgstr "" #: ../data/preferences.ui.h:7 msgid "General" msgstr "常规" #: ../data/preferences.ui.h:8 msgid "Icon set:" msgstr "" #: ../data/preferences.ui.h:9 #, fuzzy msgid "Inclusion in Top Level Searches" msgstr "把歌曲放到顶端" #: ../data/preferences.ui.h:10 #, fuzzy msgid "Indexed Folders" msgstr "新文件夹" #: ../data/preferences.ui.h:11 msgid "Keyboard" msgstr "键盘" #: ../data/preferences.ui.h:12 ../kupfer/plugin/core/contents.py:78 msgid "Kupfer Preferences" msgstr "首选项" #: ../data/preferences.ui.h:13 msgid "" "Marked sources have their objects included in top level searches.\n" "An unmarked source's contents are only available by locating its subcatalog." msgstr "" #: ../data/preferences.ui.h:15 msgid "Plugins" msgstr "插件" #: ../data/preferences.ui.h:16 ../kupfer/ui/preferences.py:844 msgid "Reset" msgstr "重置" #: ../data/preferences.ui.h:17 msgid "Show icon in notification area" msgstr "在系统通知区域显示图标" #: ../data/preferences.ui.h:18 msgid "Start automatically on login" msgstr "登录后自启动" #: ../data/preferences.ui.h:19 #, fuzzy msgid "Terminal emulator:" msgstr "在此处开启终端" #: ../data/preferences.ui.h:20 msgid "Use single keystroke commands (Space, /, period, comma etc.)" msgstr "使用单键命令(空格键、/ 键、逗号键等)" #: ../data/credentials_dialog.ui.h:1 msgid "User credentials" msgstr "用户证书" #: ../data/credentials_dialog.ui.h:2 msgid "_Change" msgstr "更改(_C)" #: ../data/credentials_dialog.ui.h:3 msgid "_Password:" msgstr "密码(_P):" #: ../data/credentials_dialog.ui.h:4 msgid "_User:" msgstr "用户(_U)" #: ../data/getkey_dialog.ui.h:1 msgid "Keybinding could not be bound" msgstr "无法进行按键绑定" #: ../data/getkey_dialog.ui.h:2 msgid "Please press desired key combination" msgstr "请按下想使用的组合键" #: ../data/getkey_dialog.ui.h:3 msgid "Set Keyboard Shortcut" msgstr "设置键盘快捷键" #: ../kupfer/main.py:43 msgid "do not present main interface on launch" msgstr "启动后不显示主界面" #: ../kupfer/main.py:44 msgid "list available plugins" msgstr "列出可用插件" #: ../kupfer/main.py:45 msgid "enable debug info" msgstr "显示调试信息" #: ../kupfer/main.py:46 msgid "run keyboard shortcut relay service on this display" msgstr "" #: ../kupfer/main.py:49 msgid "show usage help" msgstr "显示用法帮助" #: ../kupfer/main.py:50 msgid "show version information" msgstr "显示版本信息" #: ../kupfer/main.py:56 msgid "Usage: kupfer [ OPTIONS | FILE ... ]" msgstr "用法:kupfer [选项|文件 ... ]" #: ../kupfer/main.py:67 msgid "Available plugins:" msgstr "可用插件:" #: ../kupfer/main.py:114 #, python-format msgid "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" msgstr "" "%(PROGRAM_NAME)s: %(SHORT_DESCRIPTION)s\n" "\t%(COPYRIGHT)s\n" "\t%(WEBSITE)s\n" #. TRANS: Names of accelerators in the interface #: ../kupfer/ui/accelerators.py:4 #, fuzzy msgid "Alternate Activate" msgstr "备选激活键" #. TRANS: The "Comma Trick"/"Put Selection on Stack" allows the #. TRANS: user to select many objects to be used for one action #: ../kupfer/ui/accelerators.py:7 #, fuzzy msgid "Comma Trick" msgstr "逗号键增强" #. TRANS: "Compose Command" makes one object out of the selected #. TRANS: object + action (+iobject) #: ../kupfer/ui/accelerators.py:10 msgid "Compose Command" msgstr "编辑命令" #: ../kupfer/ui/accelerators.py:11 #, fuzzy msgid "Mark Default Action" msgstr "设置默认程序..." #: ../kupfer/ui/accelerators.py:12 msgid "Forget Object" msgstr "" #: ../kupfer/ui/accelerators.py:13 msgid "Reset All" msgstr "全部重置" #: ../kupfer/ui/accelerators.py:14 msgid "Select Quit" msgstr "选择退出" #: ../kupfer/ui/accelerators.py:15 msgid "Select Selected File" msgstr "选择已选的文件" #: ../kupfer/ui/accelerators.py:16 msgid "Select Selected Text" msgstr "选择已选的文本" #: ../kupfer/ui/accelerators.py:17 msgid "Show Help" msgstr "显示帮助" #: ../kupfer/ui/accelerators.py:18 msgid "Show Preferences" msgstr "显示属性" #: ../kupfer/ui/accelerators.py:19 msgid "Switch to First Pane" msgstr "切换到第一个窗格" #: ../kupfer/ui/accelerators.py:20 msgid "Toggle Text Mode" msgstr "切换文本模式" #: ../kupfer/ui/browser.py:888 #, python-format msgid "%s is empty" msgstr "%s 是空的" #: ../kupfer/ui/browser.py:892 #, python-format msgid "No matches in %(src)s for \"%(query)s\"" msgstr "在 %(src)s 中没有符合“%(query)s”的" #: ../kupfer/ui/browser.py:898 msgid "No matches" msgstr "无匹配" #: ../kupfer/ui/browser.py:903 msgid "Type to search" msgstr "输入进行搜索" #: ../kupfer/ui/browser.py:909 #, python-format msgid "Type to search %s" msgstr "输入以搜索 %s" #: ../kupfer/ui/browser.py:924 msgid "No action" msgstr "无操作" #: ../kupfer/ui/browser.py:1461 #, python-format msgid "Make \"%(action)s\" Default for \"%(object)s\"" msgstr "" #. TRANS: Removing learned and/or configured bonus search score #: ../kupfer/ui/browser.py:1471 #, python-format msgid "Forget About \"%s\"" msgstr "" #. TRANS: Names of global keyboard shortcuts #: ../kupfer/ui/browser.py:1903 ../kupfer/ui/preferences.py:58 msgid "Show Main Interface" msgstr "显示主界面" #: ../kupfer/ui/preferences.py:59 msgid "Show with Selection" msgstr "选择时显示" #. TRANS: Plugin info fields #: ../kupfer/ui/preferences.py:416 msgid "Description" msgstr "描述" #: ../kupfer/ui/preferences.py:416 msgid "Author" msgstr "作者" #: ../kupfer/ui/preferences.py:433 msgid "Version" msgstr "版本" #. TRANS: Error message when Plugin needs a Python module to load #: ../kupfer/ui/preferences.py:443 #, python-format msgid "Python module '%s' is needed" msgstr "需要 Python 模块“%s”" #: ../kupfer/ui/preferences.py:457 msgid "Plugin could not be read due to an error:" msgstr "因为如下原因插件无法启用:" #: ../kupfer/ui/preferences.py:465 ../kupfer/plugin/kupfer_plugins.py:80 msgid "disabled" msgstr "已禁用" #: ../kupfer/ui/preferences.py:539 msgid "Content of" msgstr "此项的内容" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:548 msgid "Sources" msgstr "资源" #. TRANS: Plugin contents header #: ../kupfer/ui/preferences.py:552 msgid "Actions" msgstr "操作" #. TRANS: Plugin-specific configuration (header) #: ../kupfer/ui/preferences.py:589 msgid "Configuration" msgstr "配置" #: ../kupfer/ui/preferences.py:609 msgid "Set username and password" msgstr "设置用户名和密码" #. TRANS: File Chooser Title #: ../kupfer/ui/preferences.py:663 msgid "Choose a Directory" msgstr "选择一个目录" #: ../kupfer/ui/preferences.py:842 msgid "Reset all shortcuts to default values?" msgstr "重置所有的快捷键为默认值?" #: ../kupfer/ui/preferences.py:850 ../kupfer/plugin/custom_terminal.py:12 msgid "Command" msgstr "命令" #: ../kupfer/ui/preferences.py:851 msgid "Shortcut" msgstr "快捷键" #. TRANS: Don't translate literally! #. TRANS: This should be a list of all translators of this language #: ../kupfer/version.py:73 msgid "translator-credits" msgstr "lh " #: ../kupfer/version.py:78 msgid "A free software (GPLv3+) launcher" msgstr "一个启动器(自由软件(GPLv3+))" #: ../kupfer/version.py:81 msgid "" "\n" "This program is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .\n" msgstr "" "\n" "本程序是自由软件;您可以在自由软件基金会发布的 GNU 通用公共许可证\n" "下重新发布或修改它;许可证应使用第三版本或您所选择的更新的版本。\n" "\n" "发布本程序的目的是希望它对您有用。但我们并不为它提供任何形式的担保,\n" "也无法保证它可以在特定用途中得到您希望的结果。请参看 GNU GPL 许\n" "可中的更多细节。\n" "\n" "您应该在收到此程序的同时收到了 GNU GPL 协议的副本;如果您没有收\n" "到的话,请参见 。\n" #. follows strings used elsewhere #: ../kupfer/version.py:98 msgid "Could not find running Kupfer" msgstr "找不到运行中的 Kupfer" #: ../kupfer/keyrelay.py:62 #, python-format msgid "Keyboard relay is active for display %s" msgstr "" #: ../kupfer/core/commandexec.py:239 #, python-format msgid "Could not to carry out '%s'" msgstr "无法执行 “%s”" #: ../kupfer/core/commandexec.py:268 #, python-format msgid "\"%s\" produced a result" msgstr "“%s”产生了一个结果" #: ../kupfer/core/execfile.py:30 #, python-format msgid "No permission to run \"%s\" (not executable)" msgstr "没有权限运行“%s”(缺少可执行属性)" #: ../kupfer/core/execfile.py:47 #, python-format msgid "Command in \"%s\" is not available" msgstr "“%s”命令无效" #: ../kupfer/obj/base.py:457 ../kupfer/plugin/core/text.py:22 #, fuzzy msgid "Text" msgstr "显示文本" #: ../kupfer/obj/compose.py:15 msgid "Run after Delay..." msgstr "延迟后运行..." #: ../kupfer/obj/compose.py:36 msgid "Perform command after a specified time interval" msgstr "在指定时长后运行命令" #: ../kupfer/obj/compose.py:95 msgid "Multiple Objects" msgstr "多个对象" #: ../kupfer/obj/compose.py:126 #, python-format msgid "%s object" msgid_plural "%s objects" msgstr[0] "%s 个对象" msgstr[1] "%s 个对象" #: ../kupfer/obj/contacts.py:87 ../kupfer/plugin/pidgin.py:156 #, python-format msgid "[%(status)s] %(userid)s/%(service)s" msgstr "[%(status)s] %(userid)s/%(service)s" #: ../kupfer/obj/exceptions.py:19 #, python-format msgid "%s does not support this operation" msgstr "" #: ../kupfer/obj/exceptions.py:24 msgid "Can not be used with multiple objects" msgstr "" #: ../kupfer/obj/fileactions.py:30 ../kupfer/plugin/notes.py:89 #: ../kupfer/plugin/gnome_terminal.py:36 ../kupfer/plugin/gtg.py:108 #: ../kupfer/plugin/zim.py:107 msgid "Open" msgstr "打开" #: ../kupfer/obj/fileactions.py:43 #, python-format msgid "No default application for %(file)s (%(type)s)" msgstr "没有打开 %(file)s (%(type)s) 文件的默认程序" #: ../kupfer/obj/fileactions.py:45 #, fuzzy, python-format msgid "Please use \"%s\"" msgstr "选择文件“%s”" #: ../kupfer/obj/fileactions.py:45 ../kupfer/plugin/applications.py:109 msgid "Set Default Application..." msgstr "设置默认程序..." #: ../kupfer/obj/fileactions.py:71 msgid "Open with default application" msgstr "使用默认程序打开" #: ../kupfer/obj/fileactions.py:77 msgid "Reveal" msgstr "显示" #: ../kupfer/obj/fileactions.py:86 msgid "Open parent folder" msgstr "打开所在目录" #: ../kupfer/obj/fileactions.py:92 msgid "Open Terminal Here" msgstr "在此处开启终端" #: ../kupfer/obj/fileactions.py:105 msgid "Open this location in a terminal" msgstr "在终端中进入这个位置" #: ../kupfer/obj/fileactions.py:113 msgid "Run in Terminal" msgstr "终端中运行" #: ../kupfer/obj/fileactions.py:113 msgid "Run (Execute)" msgstr "运行(执行)" #: ../kupfer/obj/fileactions.py:133 msgid "Run this program in a Terminal" msgstr "在终端中运行此程序" #: ../kupfer/obj/fileactions.py:135 msgid "Run this program" msgstr "运行这个程序" #: ../kupfer/obj/objects.py:248 ../kupfer/plugin/windows.py:105 #: ../kupfer/plugin/windows.py:264 msgid "Go To" msgstr "转到" #: ../kupfer/obj/objects.py:274 msgid "Open URL" msgstr "打开链接" #: ../kupfer/obj/objects.py:285 msgid "Open URL with default viewer" msgstr "用默认查看器打开链接" #: ../kupfer/obj/objects.py:299 msgid "Launch" msgstr "启动" #: ../kupfer/obj/objects.py:312 msgid "Show application window" msgstr "显示程序窗口" #: ../kupfer/obj/objects.py:313 msgid "Launch application" msgstr "启动程序" #: ../kupfer/obj/objects.py:324 msgid "Launch Again" msgstr "再次启动" #: ../kupfer/obj/objects.py:331 msgid "Launch another instance of this application" msgstr "开启此程序的另一个实例" #: ../kupfer/obj/objects.py:337 ../kupfer/plugin/windows.py:37 msgid "Close" msgstr "关闭" #: ../kupfer/obj/objects.py:345 msgid "Attempt to close all application windows" msgstr "尝试关闭所有程序窗口" #. TRANS: 'Run' as in Perform a (saved) command #: ../kupfer/obj/objects.py:392 msgid "Run" msgstr "运行" #: ../kupfer/obj/objects.py:402 msgid "Perform command" msgstr "执行命令" #: ../kupfer/obj/objects.py:416 msgid "(Empty Text)" msgstr "(空文本)" #. TRANS: This is description for a TextLeaf, a free-text search #. TRANS: The plural parameter is the number of lines %(num)d #: ../kupfer/obj/objects.py:432 #, python-format msgid "\"%(text)s\"" msgid_plural "(%(num)d lines) \"%(text)s\"" msgstr[0] "\"%(text)s\"" msgstr[1] "(%(num)d 行) ”%(text)s“" #. TRANS: Multiple artist description "Artist1 et. al. " #: ../kupfer/obj/sources.py:24 ../kupfer/plugin/rhythmbox.py:247 #, python-format msgid "%s et. al." msgstr "%s 等" #: ../kupfer/obj/sources.py:54 #, python-format msgid "Recursive source of %(dir)s, (%(levels)d levels)" msgstr "%(dir)s 有 %(levels)d 层" #: ../kupfer/obj/sources.py:103 #, python-format msgid "Directory source %s" msgstr "目录资源 %s" #: ../kupfer/obj/sources.py:113 msgid "Home Folder" msgstr "主文件夹" #: ../kupfer/obj/sources.py:124 msgid "Catalog Index" msgstr "类别索引" #: ../kupfer/obj/sources.py:139 msgid "An index of all available sources" msgstr "一个所有可用资源的索引" #: ../kupfer/obj/sources.py:170 msgid "Root catalog" msgstr "主类别" #: ../kupfer/obj/special.py:10 msgid "Please Configure Plugin" msgstr "请配置插件" #: ../kupfer/obj/special.py:11 #, python-format msgid "Plugin %s is not configured" msgstr "插件 %s 没有配置" #: ../kupfer/obj/special.py:32 #, python-format msgid "Invalid user credentials for %s" msgstr "%s 的用户证书无效" #: ../kupfer/plugin/core/alternatives.py:7 msgid "GTK+" msgstr "" #: ../kupfer/plugin/core/alternatives.py:13 #, fuzzy msgid "GNOME Terminal" msgstr "GNOME 终端配置" #: ../kupfer/plugin/core/alternatives.py:22 #, fuzzy msgid "XFCE Terminal" msgstr "终端中运行" #: ../kupfer/plugin/core/alternatives.py:31 #, fuzzy msgid "LXTerminal" msgstr "终端中运行" #: ../kupfer/plugin/core/alternatives.py:40 #, fuzzy msgid "X Terminal" msgstr "终端中运行" #: ../kupfer/plugin/core/alternatives.py:49 msgid "Urxvt" msgstr "" #: ../kupfer/plugin/core/commands.py:13 ../kupfer/plugin/core/commands.py:32 msgid "Save As..." msgstr "另存为..." #: ../kupfer/plugin/core/contents.py:41 msgid "Quit" msgstr "退出" #: ../kupfer/plugin/core/contents.py:46 msgid "Quit Kupfer" msgstr "退出 Kupfer" #: ../kupfer/plugin/core/contents.py:52 msgid "About Kupfer" msgstr "关于 Kupfer" #: ../kupfer/plugin/core/contents.py:59 msgid "Show information about Kupfer authors and license" msgstr "显示有关 Kupfer 作者和许可证的信息" #: ../kupfer/plugin/core/contents.py:65 msgid "Kupfer Help" msgstr "Kupfer 帮助" #: ../kupfer/plugin/core/contents.py:72 msgid "Get help with Kupfer" msgstr "获取 Kupfer 帮助" #: ../kupfer/plugin/core/contents.py:85 msgid "Show preferences window for Kupfer" msgstr "显示 Kupfer 首选项窗口" #: ../kupfer/plugin/core/__init__.py:65 msgid "Search Contents" msgstr "搜索内容" #: ../kupfer/plugin/core/__init__.py:83 msgid "Search inside this catalog" msgstr "在此类别中搜索" #: ../kupfer/plugin/core/__init__.py:91 msgid "Copy" msgstr "复制" #: ../kupfer/plugin/core/__init__.py:106 msgid "Copy to clipboard" msgstr "复制到剪切板" #: ../kupfer/plugin/core/__init__.py:128 msgid "Rescan" msgstr "重新检索" #: ../kupfer/plugin/core/__init__.py:143 msgid "Force reindex of this source" msgstr "强行重新索引这个资源" #: ../kupfer/plugin/core/selection.py:8 ../kupfer/plugin/core/selection.py:36 msgid "Selected Text" msgstr "选中文本" #: ../kupfer/plugin/core/selection.py:23 #, python-format msgid "Selected Text \"%s\"" msgstr "选中文本“%s”" #: ../kupfer/plugin/core/internal.py:13 msgid "Last Command" msgstr "最近的命令" #: ../kupfer/plugin/core/internal.py:24 msgid "Internal Kupfer Objects" msgstr "Kupfer 内部对象" #: ../kupfer/plugin/core/internal.py:46 ../kupfer/plugin/core/internal.py:48 msgid "Last Result" msgstr "最近的结果" #: ../kupfer/plugin/core/internal.py:66 msgid "Command Results" msgstr "命令结果" #: ../kupfer/plugin/archivemanager.py:1 #, fuzzy msgid "Archive Manager" msgstr "压缩包" #: ../kupfer/plugin/archivemanager.py:9 #, fuzzy msgid "Use Archive Manager actions" msgstr "文件管理器 Thunar 动作" #: ../kupfer/plugin/archivemanager.py:27 msgid "Compressed archive type for 'Create Archive In'" msgstr "'创建压缩包'的压缩档案类型" #: ../kupfer/plugin/archivemanager.py:44 msgid "Extract Here" msgstr "解压到这里" #: ../kupfer/plugin/archivemanager.py:64 msgid "Extract compressed archive" msgstr "解压压缩包" #: ../kupfer/plugin/archivemanager.py:70 msgid "Create Archive" msgstr "创建压缩包" #: ../kupfer/plugin/archivemanager.py:86 #: ../kupfer/plugin/archivemanager.py:129 msgid "Create a compressed archive from folder" msgstr "将文件夹打包" #: ../kupfer/plugin/archivemanager.py:92 msgid "Create Archive In..." msgstr "创建压缩包..." #. TRANS: Default filename (no extension) for 'Create Archive In...' #: ../kupfer/plugin/archivemanager.py:115 msgid "Archive" msgstr "压缩包" #: ../kupfer/plugin/applications.py:2 ../kupfer/plugin/applications.py:38 msgid "Applications" msgstr "应用程序" #: ../kupfer/plugin/applications.py:8 ../kupfer/plugin/applications.py:74 msgid "All applications and preferences" msgstr "所有的应用程序和设置" #: ../kupfer/plugin/applications.py:23 msgid "Applications for Desktop Environment" msgstr "桌面环境的应用程序" #: ../kupfer/plugin/applications.py:83 msgid "Open With..." msgstr "打开方式..." #: ../kupfer/plugin/applications.py:105 msgid "Open with any application" msgstr "使用任意可用程序打开" #: ../kupfer/plugin/applications.py:124 msgid "Set default application to open this file type" msgstr "设置打开此类文件的默认程序" #: ../kupfer/plugin/calculator.py:2 ../kupfer/plugin/calculator.py:69 msgid "Calculator" msgstr "计算器" #: ../kupfer/plugin/calculator.py:4 msgid "Calculate expressions starting with '='" msgstr "输入'='开始计算" #: ../kupfer/plugin/calculator.py:101 msgid "Calculate" msgstr "计算" #: ../kupfer/plugin/clipboard.py:1 ../kupfer/plugin/clipboard.py:71 msgid "Clipboards" msgstr "剪贴板" #: ../kupfer/plugin/clipboard.py:4 ../kupfer/plugin/clipboard.py:111 msgid "Recent clipboards" msgstr "最近的剪贴板" #: ../kupfer/plugin/clipboard.py:20 msgid "Number of recent clipboards" msgstr "最近剪贴板的数目" #: ../kupfer/plugin/clipboard.py:26 msgid "Include recent selections" msgstr "包括最近选取" #: ../kupfer/plugin/clipboard.py:32 msgid "Copy selection to primary clipboard" msgstr "复制选定内容到剪贴板" #: ../kupfer/plugin/clipboard.py:44 #, python-format msgid "Clipboard \"%(desc)s\"" msgid_plural "Clipboard with %(num)d lines \"%(desc)s\"" msgstr[0] "剪贴板 \"%(desc)s\"" msgstr[1] "剪贴板 %(num)d 行 \"%(desc)s\"" #: ../kupfer/plugin/clipboard.py:51 msgid "Clear" msgstr "清除" #: ../kupfer/plugin/clipboard.py:63 msgid "Remove all recent clipboards" msgstr "清除所有最近的剪贴板" #: ../kupfer/plugin/commands.py:1 ../kupfer/plugin/commands.py:187 msgid "Shell Commands" msgstr "命令行" #: ../kupfer/plugin/commands.py:9 #, python-format msgid "" "Run command-line programs. Actions marked with the symbol %s run in a " "subshell." msgstr "" #: ../kupfer/plugin/commands.py:41 msgid "Run (Get Output)" msgstr "运行(获得输出)" #: ../kupfer/plugin/commands.py:59 msgid "Run program and return its output" msgstr "运行程序并返回它的结果" #. TRANS: The user starts a program (command) and the text #. TRANS: is an argument to the command #: ../kupfer/plugin/commands.py:65 msgid "Pass to Command..." msgstr "传递给命令..." #: ../kupfer/plugin/commands.py:107 msgid "Run program with object as an additional parameter" msgstr "以对象为附加参数运行程序" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin #: ../kupfer/plugin/commands.py:115 #, fuzzy msgid "Write to Command..." msgstr "发送到命令..." #: ../kupfer/plugin/commands.py:149 ../kupfer/plugin/commands.py:161 msgid "Run program and supply text on the standard input" msgstr "运行程序并在标准输出上提供文本反馈" #. TRANS: The user starts a program (command) and #. TRANS: the text is written on stdin, and we #. TRANS: present the output (stdout) to the user. #: ../kupfer/plugin/commands.py:157 msgid "Filter through Command..." msgstr "筛选命令..." #: ../kupfer/plugin/commands.py:215 #, fuzzy msgid "Run command-line programs" msgstr "运行命令行程序" #: ../kupfer/plugin/dictionary.py:1 ../kupfer/plugin/dictionary.py:21 msgid "Dictionary" msgstr "字典" #: ../kupfer/plugin/dictionary.py:3 ../kupfer/plugin/dictionary.py:47 msgid "Look up word in dictionary" msgstr "在字典中查找单词" #: ../kupfer/plugin/dictionary.py:30 msgid "Look Up" msgstr "寻找" #: ../kupfer/plugin/documents.py:1 msgid "Documents" msgstr "文档" #: ../kupfer/plugin/documents.py:4 msgid "Recently used documents and bookmarked folders" msgstr "最近使用的文档和保存为书签的文件夹" #: ../kupfer/plugin/documents.py:22 msgid "Max recent document days" msgstr "最大最近文档天数" #: ../kupfer/plugin/documents.py:32 msgid "Recent Items" msgstr "最近的项目" #: ../kupfer/plugin/documents.py:78 msgid "Recently used documents" msgstr "最近打开文档" #: ../kupfer/plugin/documents.py:88 #, python-format msgid "%s Documents" msgstr "%s 个文档" #: ../kupfer/plugin/documents.py:113 #, python-format msgid "Recently used documents for %s" msgstr "%s 最近使用的文档" #: ../kupfer/plugin/documents.py:132 msgid "Places" msgstr "位置" #: ../kupfer/plugin/documents.py:164 msgid "Bookmarked folders" msgstr "加入书签的文件夹" #: ../kupfer/plugin/epiphany.py:1 ../kupfer/plugin/epiphany.py:18 msgid "Epiphany Bookmarks" msgstr "Epiphany 书签" #: ../kupfer/plugin/epiphany.py:3 ../kupfer/plugin/epiphany.py:35 msgid "Index of Epiphany bookmarks" msgstr "Epiphany 书签的索引" #: ../kupfer/plugin/favorites.py:1 ../kupfer/plugin/favorites.py:21 msgid "Favorites" msgstr "收藏" #: ../kupfer/plugin/favorites.py:4 msgid "Mark commonly used items and store objects for later use" msgstr "标记常用项并存储对象以备后用" #: ../kupfer/plugin/favorites.py:127 msgid "Shelf of \"Favorite\" items" msgstr "项目的“收藏”夹" #: ../kupfer/plugin/favorites.py:140 msgid "Add to Favorites" msgstr "添加到收藏" #: ../kupfer/plugin/favorites.py:148 msgid "Add item to favorites shelf" msgstr "添加项目到收藏夹" #: ../kupfer/plugin/favorites.py:155 msgid "Remove from Favorites" msgstr "从收藏中删除" #: ../kupfer/plugin/favorites.py:163 msgid "Remove item from favorites shelf" msgstr "从收藏夹中删除项目" #: ../kupfer/plugin/fileactions.py:1 msgid "File Actions" msgstr "文件操作" #: ../kupfer/plugin/fileactions.py:9 msgid "More file actions" msgstr "更多文件操作" #: ../kupfer/plugin/fileactions.py:40 ../kupfer/plugin/windows.py:122 #: ../kupfer/plugin/thunar.py:210 msgid "Move To..." msgstr "移动到..." #: ../kupfer/plugin/fileactions.py:67 ../kupfer/plugin/thunar.py:252 msgid "Move file to new location" msgstr "移动文件到一个新位置" #: ../kupfer/plugin/fileactions.py:80 ../kupfer/plugin/fileactions.py:103 msgid "Rename To..." msgstr "重命名为..." #: ../kupfer/plugin/fileactions.py:145 ../kupfer/plugin/thunar.py:165 msgid "Copy To..." msgstr "复制到..." #: ../kupfer/plugin/fileactions.py:186 ../kupfer/plugin/thunar.py:206 msgid "Copy file to a chosen location" msgstr "复制文件到一个选择好的位置" #: ../kupfer/plugin/firefox.py:4 ../kupfer/plugin/firefox.py:36 msgid "Firefox Bookmarks" msgstr "Firefox 网络浏览器书签" #: ../kupfer/plugin/firefox.py:6 ../kupfer/plugin/firefox.py:120 msgid "Index of Firefox bookmarks" msgstr "Firefox 网络浏览器书签索引" #: ../kupfer/plugin/firefox.py:26 msgid "Include visited sites" msgstr "包含访问过的站点" #: ../kupfer/plugin/nautilusselection.py:1 #: ../kupfer/plugin/nautilusselection.py:46 msgid "Selected File" msgstr "选择的文件" #: ../kupfer/plugin/nautilusselection.py:3 msgid "Provides current nautilus selection, using Kupfer's Nautilus Extension" msgstr "提供当前 Nautilus 的选择,使用 Kupfer 的 Nautilus 扩展" #: ../kupfer/plugin/nautilusselection.py:25 #, python-format msgid "Selected File \"%s\"" msgstr "选择文件“%s”" #: ../kupfer/plugin/nautilusselection.py:34 msgid "Selected Files" msgstr "选中的文件" #: ../kupfer/plugin/notes.py:6 ../kupfer/plugin/notes.py:178 #: ../kupfer/plugin/notes.py:230 msgid "Notes" msgstr "便笺" #: ../kupfer/plugin/notes.py:13 msgid "Gnote or Tomboy notes" msgstr "Gnote 或者 Tomboy 便笺" #: ../kupfer/plugin/notes.py:35 msgid "Work with application" msgstr "和应用程序一同工作" #: ../kupfer/plugin/notes.py:95 msgid "Open with notes application" msgstr "用便笺程序打开" #: ../kupfer/plugin/notes.py:102 msgid "Append to Note..." msgstr "添加到便笺..." #: ../kupfer/plugin/notes.py:125 msgid "Add text to existing note" msgstr "添加文本到已有的便笺" #: ../kupfer/plugin/notes.py:140 msgid "Create Note" msgstr "创建便笺" #: ../kupfer/plugin/notes.py:154 msgid "Create a new note from this text" msgstr "用此文本创建新的便笺" #: ../kupfer/plugin/notes.py:160 msgid "Get Note Search Results..." msgstr "获得便笺搜索结果..." #: ../kupfer/plugin/notes.py:173 msgid "Show search results for this query" msgstr "显示本次查询的搜索结果结果" #: ../kupfer/plugin/notes.py:213 #, python-format msgid "today, %s" msgstr "今天,%s" #: ../kupfer/plugin/notes.py:215 #, python-format msgid "yesterday, %s" msgstr "昨天,%s" #. TRANS: Note description, %s is last changed time in locale format #: ../kupfer/plugin/notes.py:219 #, python-format msgid "Last updated %s" msgstr "上次更新 %s" #: ../kupfer/plugin/rhythmbox.py:1 ../kupfer/plugin/rhythmbox.py:399 msgid "Rhythmbox" msgstr "Rhythmbox" #: ../kupfer/plugin/rhythmbox.py:3 ../kupfer/plugin/rhythmbox.py:433 msgid "Play and enqueue tracks and browse the music library" msgstr "播放,新增音轨,浏览音乐库" #: ../kupfer/plugin/rhythmbox.py:22 msgid "Include artists in top level" msgstr "把艺术家放到顶端" #: ../kupfer/plugin/rhythmbox.py:28 msgid "Include albums in top level" msgstr "把专辑放到顶端" #: ../kupfer/plugin/rhythmbox.py:34 ../kupfer/plugin/audacious.py:20 msgid "Include songs in top level" msgstr "把歌曲放到顶端" #: ../kupfer/plugin/rhythmbox.py:63 ../kupfer/plugin/rhythmbox.py:131 #: ../kupfer/plugin/audacious.py:82 ../kupfer/plugin/audacious.py:92 msgid "Play" msgstr "播放" #: ../kupfer/plugin/rhythmbox.py:67 msgid "Resume playback in Rhythmbox" msgstr "恢复 Rhythmbox 播放" #: ../kupfer/plugin/rhythmbox.py:73 ../kupfer/plugin/audacious.py:102 #: ../kupfer/plugin/virtualbox/__init__.py:93 msgid "Pause" msgstr "暂停" #: ../kupfer/plugin/rhythmbox.py:77 msgid "Pause playback in Rhythmbox" msgstr "暂停 Rhythmbox 播放" #: ../kupfer/plugin/rhythmbox.py:83 ../kupfer/plugin/audacious.py:112 msgid "Next" msgstr "下一首" #: ../kupfer/plugin/rhythmbox.py:87 msgid "Jump to next track in Rhythmbox" msgstr "跳到下一首歌曲" #: ../kupfer/plugin/rhythmbox.py:93 ../kupfer/plugin/audacious.py:122 msgid "Previous" msgstr "前一首" #: ../kupfer/plugin/rhythmbox.py:97 msgid "Jump to previous track in Rhythmbox" msgstr "跳到前一首歌曲" #: ../kupfer/plugin/rhythmbox.py:103 msgid "Show Playing" msgstr "显示正在播放" #: ../kupfer/plugin/rhythmbox.py:107 msgid "Tell which song is currently playing" msgstr "显示正在播放的歌曲" #: ../kupfer/plugin/rhythmbox.py:115 ../kupfer/plugin/audacious.py:132 msgid "Clear Queue" msgstr "清除队列" #: ../kupfer/plugin/rhythmbox.py:155 msgid "Play tracks in Rhythmbox" msgstr "在 Rhythmbox 里面播放音轨" #: ../kupfer/plugin/rhythmbox.py:161 ../kupfer/plugin/audacious.py:58 msgid "Enqueue" msgstr "打开" #: ../kupfer/plugin/rhythmbox.py:172 msgid "Add tracks to the play queue" msgstr "新增音轨到播放队列" #. TRANS: Song description #: ../kupfer/plugin/rhythmbox.py:195 #, python-format msgid "by %(artist)s from %(album)s" msgstr "艺术家 %(artist)s 专辑 %(album)s" #. TRANS: Album description "by Artist" #: ../kupfer/plugin/rhythmbox.py:250 #, python-format msgid "by %s" msgstr "艺术家 %s" #. TRANS: Artist songs collection description #: ../kupfer/plugin/rhythmbox.py:311 #, python-format msgid "Tracks by %s" msgstr "音轨 %s " #: ../kupfer/plugin/rhythmbox.py:321 #: ../kupfer/plugin/google_picasa/__init__.py:444 msgid "Albums" msgstr "专辑" #: ../kupfer/plugin/rhythmbox.py:331 msgid "Music albums in Rhythmbox Library" msgstr "Rhythmbox 媒体库中的音乐专辑" #: ../kupfer/plugin/rhythmbox.py:342 msgid "Artists" msgstr "艺术家" #: ../kupfer/plugin/rhythmbox.py:352 msgid "Music artists in Rhythmbox Library" msgstr "媒体库中的音乐艺术家" #: ../kupfer/plugin/rhythmbox.py:379 msgid "Songs" msgstr "歌曲" #: ../kupfer/plugin/rhythmbox.py:389 msgid "Songs in Rhythmbox library" msgstr "媒体库中的歌曲" #: ../kupfer/plugin/session_gnome.py:1 ../kupfer/plugin/session_gnome.py:20 msgid "GNOME Session Management" msgstr "GNOME 会话管理器" #: ../kupfer/plugin/session_gnome.py:3 msgid "Special items and actions for GNOME environment" msgstr "GNOME 环境的特殊项目和操作" #: ../kupfer/plugin/session_support.py:31 msgid "Log Out..." msgstr "注销..." #: ../kupfer/plugin/session_support.py:34 msgid "Log out or change user" msgstr "注销或者更改用户" #: ../kupfer/plugin/session_support.py:41 msgid "Shut Down..." msgstr "关机..." #: ../kupfer/plugin/session_support.py:44 msgid "Shut down, restart or suspend computer" msgstr "关机,重启或者待机" #: ../kupfer/plugin/session_support.py:51 msgid "Lock Screen" msgstr "锁住屏幕" #: ../kupfer/plugin/session_support.py:54 msgid "Enable screensaver and lock" msgstr "启用屏保和锁屏" #. -*- coding: utf-8 -* #: ../kupfer/plugin/session_xfce.py:3 ../kupfer/plugin/session_xfce.py:20 msgid "XFCE Session Management" msgstr "XFCE 会话管理器" #: ../kupfer/plugin/session_xfce.py:5 msgid "Special items and actions for XFCE environment" msgstr "XFCE 环境的特殊项目和操作" #: ../kupfer/plugin/show_text.py:1 ../kupfer/plugin/show_text.py:18 #: ../kupfer/plugin/show_text.py:25 msgid "Show Text" msgstr "显示文本" #: ../kupfer/plugin/show_text.py:7 ../kupfer/plugin/show_text.py:31 #: ../kupfer/plugin/show_text.py:52 msgid "Display text in a window" msgstr "在窗口中显示文本" #: ../kupfer/plugin/show_text.py:37 msgid "Large Type" msgstr "大字体显示" #: ../kupfer/plugin/show_text.py:60 msgid "Show Notification" msgstr "在系统通知区域显示图标" #: ../kupfer/plugin/trash.py:1 ../kupfer/plugin/trash.py:173 msgid "Trash" msgstr "回收站" #: ../kupfer/plugin/trash.py:4 msgid "Access trash contents" msgstr "访问回收站的内容" #: ../kupfer/plugin/trash.py:23 msgid "Move to Trash" msgstr "移动到回收站" #: ../kupfer/plugin/trash.py:39 msgid "Move this file to trash" msgstr "移动这个文件到回收站" #: ../kupfer/plugin/trash.py:48 msgid "Restore" msgstr "还原" #: ../kupfer/plugin/trash.py:67 msgid "Move file back to original location" msgstr "移动文件回原来的位置" #: ../kupfer/plugin/trash.py:161 msgid "Trash is empty" msgstr "回收站为空" #. proper translation of plural #: ../kupfer/plugin/trash.py:163 #, python-format msgid "Trash contains one file" msgid_plural "Trash contains %(num)s files" msgstr[0] "回收站有一个文件" msgstr[1] "回收站有%(num)s个文件" #: ../kupfer/plugin/triggers.py:1 ../kupfer/plugin/triggers.py:50 msgid "Triggers" msgstr "触发器" #: ../kupfer/plugin/triggers.py:6 #, fuzzy msgid "" "Assign global keybindings (triggers) to objects created with 'Compose " "Command'." msgstr "将全局按键绑定(触发器)分配给使用“复合命令”(Ctrl+回车键)创建的对象。" #: ../kupfer/plugin/triggers.py:161 msgid "Add Trigger..." msgstr "添加触发器..." #: ../kupfer/plugin/triggers.py:180 msgid "Remove Trigger" msgstr "删除触发器" #: ../kupfer/plugin/urlactions.py:1 ../kupfer/plugin/urlactions.py:8 msgid "URL Actions" msgstr "超链接操作" #: ../kupfer/plugin/urlactions.py:63 msgid "Download and Open" msgstr "下载并打开" #: ../kupfer/plugin/urlactions.py:83 msgid "Download To..." msgstr "下载到..." #: ../kupfer/plugin/urlactions.py:104 msgid "Download URL to a chosen location" msgstr "下载目标到一个选定的路径" #: ../kupfer/plugin/volumes.py:1 ../kupfer/plugin/volumes.py:91 msgid "Volumes and Disks" msgstr "磁盘和分区" #: ../kupfer/plugin/volumes.py:3 ../kupfer/plugin/volumes.py:101 msgid "Mounted volumes and disks" msgstr "挂载的磁盘和分区" #: ../kupfer/plugin/volumes.py:42 #, python-format msgid "Volume mounted at %s" msgstr "分区挂载在 %s" #: ../kupfer/plugin/volumes.py:51 msgid "Unmount" msgstr "卸载" #: ../kupfer/plugin/volumes.py:78 msgid "Unmount this volume" msgstr "卸载此分区" #: ../kupfer/plugin/volumes.py:85 msgid "Eject" msgstr "弹出" #: ../kupfer/plugin/volumes.py:88 msgid "Unmount and eject this media" msgstr "卸载和弹出此媒体" #: ../kupfer/plugin/websearch.py:1 msgid "Search the Web" msgstr "搜索互联网" #: ../kupfer/plugin/websearch.py:8 ../kupfer/plugin/websearch.py:63 #: ../kupfer/plugin/websearch.py:90 msgid "Search the web with OpenSearch search engines" msgstr "使用 OpenSearch 搜索引擎搜索互联网" #: ../kupfer/plugin/websearch.py:44 msgid "Search With..." msgstr "搜索方式..." #: ../kupfer/plugin/websearch.py:73 msgid "Search For..." msgstr "搜索内容..." #: ../kupfer/plugin/websearch.py:114 msgid "Search Engines" msgstr "搜索引擎" #: ../kupfer/plugin/wikipedia.py:5 msgid "Wikipedia" msgstr "维基百科" #: ../kupfer/plugin/wikipedia.py:8 ../kupfer/plugin/wikipedia.py:31 msgid "Search in Wikipedia" msgstr "在维基百科中搜索" #: ../kupfer/plugin/wikipedia.py:21 msgid "Wikipedia language" msgstr "维基百科语言" #. TRANS: Default wikipedia language code #: ../kupfer/plugin/wikipedia.py:24 msgid "en" msgstr "en" #: ../kupfer/plugin/wikipedia.py:44 #, python-format msgid "Search for this term in %s.wikipedia.org" msgstr "在 %s.wikipedia.org 中搜索项目" #: ../kupfer/plugin/windows.py:1 ../kupfer/plugin/windows.py:210 msgid "Window List" msgstr "窗口列表" #: ../kupfer/plugin/windows.py:3 ../kupfer/plugin/windows.py:233 msgid "All windows on all workspaces" msgstr "所有工作区的所有窗口" #: ../kupfer/plugin/windows.py:18 msgid "Activate" msgstr "激活" #: ../kupfer/plugin/windows.py:22 msgid "Shade" msgstr "卷起" #: ../kupfer/plugin/windows.py:22 msgid "Unshade" msgstr "取消卷起" #: ../kupfer/plugin/windows.py:25 msgid "Minimize" msgstr "最小化" #: ../kupfer/plugin/windows.py:25 msgid "Unminimize" msgstr "取消最小化" #: ../kupfer/plugin/windows.py:29 msgid "Maximize" msgstr "最大化" #: ../kupfer/plugin/windows.py:29 msgid "Unmaximize" msgstr "还原大小" #: ../kupfer/plugin/windows.py:33 msgid "Maximize Vertically" msgstr "垂直最大化" #: ../kupfer/plugin/windows.py:33 msgid "Unmaximize Vertically" msgstr "垂直最大化还原" #. TRANS: Window on (Workspace name), window description #: ../kupfer/plugin/windows.py:48 #, python-format msgid "Window on %(wkspc)s" msgstr "在 %(wkspc)s 中的窗口" #: ../kupfer/plugin/windows.py:56 msgid "Frontmost Window" msgstr "最前端的窗口" #: ../kupfer/plugin/windows.py:85 msgid "Next Window" msgstr "下个窗口" #: ../kupfer/plugin/windows.py:116 msgid "Jump to this window's workspace and focus" msgstr "跳转到此窗口所在工作区并激活此窗口" #: ../kupfer/plugin/windows.py:252 #, fuzzy, python-format msgid "%d window" msgid_plural "%d windows" msgstr[0] "下个窗口" msgstr[1] "下个窗口" #: ../kupfer/plugin/windows.py:256 #, fuzzy msgid "Active workspace" msgstr "跳转到此工作区" #: ../kupfer/plugin/windows.py:274 msgid "Jump to this workspace" msgstr "跳转到此工作区" #: ../kupfer/plugin/windows.py:281 msgid "Workspaces" msgstr "工作区" #: ../kupfer/plugin/abiword.py:1 msgid "Abiword" msgstr "Abiword" #: ../kupfer/plugin/abiword.py:3 ../kupfer/plugin/abiword.py:88 msgid "Recently used documents in Abiword" msgstr "Abiword 最近使用的文档" #: ../kupfer/plugin/abiword.py:34 msgid "Abiword Recent Items" msgstr "Abiword 的最近项目" #: ../kupfer/plugin/apt_tools.py:1 msgid "APT" msgstr "APT" #: ../kupfer/plugin/apt_tools.py:9 msgid "Interface with the package manager APT" msgstr "APT 包管理器接口" #: ../kupfer/plugin/apt_tools.py:25 msgid "Installation method" msgstr "安装方法" #: ../kupfer/plugin/apt_tools.py:61 ../kupfer/plugin/apt_tools.py:66 msgid "Show Package Information" msgstr "显示软件包信息" #: ../kupfer/plugin/apt_tools.py:87 msgid "Install" msgstr "安装" #: ../kupfer/plugin/apt_tools.py:103 msgid "Install package using the configured method" msgstr "使用配置的方法安装软件包" #: ../kupfer/plugin/apt_tools.py:122 #, python-format msgid "Packages matching \"%s\"" msgstr "符合“%s”的软件包" #: ../kupfer/plugin/apt_tools.py:154 msgid "Search Package Name..." msgstr "搜索软件包(按名称)..." #: ../kupfer/plugin/archiveinside.py:8 msgid "Deep Archives" msgstr "深层档案" #: ../kupfer/plugin/archiveinside.py:10 msgid "Allow browsing inside compressed archive files" msgstr "允许浏览压缩文档内的内容" #: ../kupfer/plugin/archiveinside.py:49 #, python-format msgid "Content of %s" msgstr "%s 的内容" #. encoding: utf-8 #. don't panic! This is just because it's crazy and fun! ツ #: ../kupfer/plugin/asciiunicodeiconset.py:3 msgid "Ascii & Unicode Icon Set" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:5 msgid "" "Provides the Ascii and Unicode icon sets that use letters and symbols to " "produce icons for the objects found in Kupfer." msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:21 msgid "Ascii" msgstr "" #: ../kupfer/plugin/asciiunicodeiconset.py:23 msgid "Unicode" msgstr "" #: ../kupfer/plugin/audacious.py:1 ../kupfer/plugin/audacious.py:187 msgid "Audacious" msgstr "Audacious" #: ../kupfer/plugin/audacious.py:3 msgid "Control Audacious playback and playlist" msgstr "控制 Audacious 的回放和播放列表" #: ../kupfer/plugin/audacious.py:62 msgid "Add track to the Audacious play queue" msgstr "向 Audacious 播放队列添加音轨" #: ../kupfer/plugin/audacious.py:70 msgid "Dequeue" msgstr "离队" #: ../kupfer/plugin/audacious.py:74 msgid "Remove track from the Audacious play queue" msgstr "从 Audacious 播放队列中移除音轨" #: ../kupfer/plugin/audacious.py:86 msgid "Jump to track in Audacious" msgstr "跳到 Audacious 中的音轨" #: ../kupfer/plugin/audacious.py:96 msgid "Resume playback in Audacious" msgstr "恢复 Audacious 回放" #: ../kupfer/plugin/audacious.py:106 msgid "Pause playback in Audacious" msgstr "暂停 Audacious 回放" #: ../kupfer/plugin/audacious.py:116 msgid "Jump to next track in Audacious" msgstr "跳到 Audacious 中的下一音轨" #: ../kupfer/plugin/audacious.py:126 msgid "Jump to previous track in Audacious" msgstr "跳到 Audacious 中的前一音轨" #: ../kupfer/plugin/audacious.py:136 msgid "Clear the Audacious play queue" msgstr "清空 Audacious 播放队列" #: ../kupfer/plugin/audacious.py:142 msgid "Shuffle" msgstr "打乱" #: ../kupfer/plugin/audacious.py:146 msgid "Toggle shuffle in Audacious" msgstr "在 Audacious 中切换乱序" #: ../kupfer/plugin/audacious.py:152 msgid "Repeat" msgstr "反复" #: ../kupfer/plugin/audacious.py:156 msgid "Toggle repeat in Audacious" msgstr "切换 Audacious 中的重复" #: ../kupfer/plugin/audacious.py:171 msgid "Playlist" msgstr "播放列表" #: ../kupfer/plugin/chromium.py:1 ../kupfer/plugin/chromium.py:16 msgid "Chromium Bookmarks" msgstr "Chromium 书签" #: ../kupfer/plugin/chromium.py:3 ../kupfer/plugin/chromium.py:43 msgid "Index of Chromium bookmarks" msgstr "Chromium 书签的索引" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/clawsmail.py:2 msgid "Claws Mail" msgstr "Claws 邮件" #: ../kupfer/plugin/clawsmail.py:5 msgid "Claws Mail Contacts and Actions" msgstr "Claws 邮件联系人和操作" #: ../kupfer/plugin/clawsmail.py:26 ../kupfer/plugin/evolution.py:24 #: ../kupfer/plugin/operamail.py:26 ../kupfer/plugin/thunderbird.py:25 msgid "Compose New Email" msgstr "编写新邮件" #: ../kupfer/plugin/clawsmail.py:32 msgid "Compose a new message in Claws Mail" msgstr "使用 Claws 编写新邮件" #: ../kupfer/plugin/clawsmail.py:41 msgid "Receive All Email" msgstr "接收所有邮件" #: ../kupfer/plugin/clawsmail.py:47 msgid "Receive new messages from all accounts in ClawsMail" msgstr "通过 Claws 接收所有账户的新邮件" #: ../kupfer/plugin/clawsmail.py:56 ../kupfer/plugin/defaultmail.py:18 #: ../kupfer/plugin/evolution.py:40 ../kupfer/plugin/operamail.py:41 #: ../kupfer/plugin/thunderbird.py:41 msgid "Compose Email" msgstr "编写新邮件" #: ../kupfer/plugin/clawsmail.py:81 ../kupfer/plugin/defaultmail.py:43 #: ../kupfer/plugin/evolution.py:65 msgid "Send in Email To..." msgstr "发送邮件到..." #: ../kupfer/plugin/clawsmail.py:107 msgid "Compose new message in Claws Mail and attach file" msgstr "使用 Claws 编写新邮件并添加附件" #: ../kupfer/plugin/clawsmail.py:116 msgid "Claws Mail Address Book" msgstr "Claws 邮件地址簿" #: ../kupfer/plugin/clawsmail.py:164 msgid "Contacts from Claws Mail Address Book" msgstr "Claws 地址簿中的联系人" #: ../kupfer/plugin/custom_terminal.py:1 #: ../kupfer/plugin/custom_terminal.py:39 #, fuzzy msgid "Custom Terminal" msgstr "终端中运行" #: ../kupfer/plugin/custom_terminal.py:2 msgid "Configure a custom terminal emulator" msgstr "" #: ../kupfer/plugin/custom_terminal.py:18 msgid "Execute flag" msgstr "执行标志" #: ../kupfer/plugin/customtheme.py:1 msgid "Custom Theme" msgstr "" #: ../kupfer/plugin/customtheme.py:3 msgid "Use a custom color theme" msgstr "" #: ../kupfer/plugin/customtheme.py:110 msgid "Theme:" msgstr "" #: ../kupfer/plugin/defaultmail.py:1 msgid "Default Email Client" msgstr "默认电子邮件客户端" #: ../kupfer/plugin/defaultmail.py:6 msgid "Compose email using the system's default mailto: handler" msgstr "使用系统默认的 mailto: 处理器编辑邮件" #: ../kupfer/plugin/devhelp.py:1 msgid "Devhelp" msgstr "Devhelp" #: ../kupfer/plugin/devhelp.py:3 ../kupfer/plugin/devhelp.py:13 msgid "Search in Devhelp" msgstr "在 Devhelp 中查找" #. -*- coding: UTF-8 -*- #. vim: set noexpandtab ts=8 sw=8: #: ../kupfer/plugin/empathy.py:3 msgid "Empathy" msgstr "" #: ../kupfer/plugin/empathy.py:6 #, fuzzy msgid "Access to Empathy Contacts" msgstr "访问 Gajim 联系人" #: ../kupfer/plugin/empathy.py:25 ../kupfer/plugin/pidgin.py:29 msgid "Show offline contacts" msgstr "显示离线联系人" #: ../kupfer/plugin/empathy.py:34 ../kupfer/plugin/gajim.py:26 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:30 msgid "Available" msgstr "在线" #: ../kupfer/plugin/empathy.py:35 ../kupfer/plugin/gajim.py:28 #: ../kupfer/plugin/pidgin.py:158 ../kupfer/plugin/skype.py:32 msgid "Away" msgstr "离开" #: ../kupfer/plugin/empathy.py:36 ../kupfer/plugin/gajim.py:30 #: ../kupfer/plugin/skype.py:34 msgid "Busy" msgstr "忙碌" #: ../kupfer/plugin/empathy.py:37 ../kupfer/plugin/gajim.py:29 #: ../kupfer/plugin/skype.py:33 msgid "Not Available" msgstr "不可用" #: ../kupfer/plugin/empathy.py:38 ../kupfer/plugin/gajim.py:31 #: ../kupfer/plugin/skype.py:35 msgid "Invisible" msgstr "隐身" #: ../kupfer/plugin/empathy.py:39 ../kupfer/plugin/gajim.py:32 #: ../kupfer/plugin/skype.py:36 msgid "Offline" msgstr "离线" #: ../kupfer/plugin/empathy.py:96 ../kupfer/plugin/gajim.py:90 #: ../kupfer/plugin/pidgin.py:97 ../kupfer/plugin/skype.py:204 msgid "Open Chat" msgstr "开始聊天" #: ../kupfer/plugin/empathy.py:129 ../kupfer/plugin/gajim.py:118 #: ../kupfer/plugin/skype.py:250 msgid "Change Global Status To..." msgstr "更改全局状态为..." #: ../kupfer/plugin/empathy.py:171 #, fuzzy msgid "Empathy Contacts" msgstr "Gajim 联系人" #: ../kupfer/plugin/empathy.py:237 #, fuzzy msgid "Empathy Account Status" msgstr "Gajim 账户状态" #: ../kupfer/plugin/evolution.py:4 msgid "Evolution" msgstr "Evolution" #: ../kupfer/plugin/evolution.py:7 ../kupfer/plugin/evolution.py:119 msgid "Evolution contacts" msgstr "Evolution 联系人" #: ../kupfer/plugin/evolution.py:31 msgid "Compose a new message in Evolution" msgstr "使用 Evolution 编写新邮件" #: ../kupfer/plugin/evolution.py:92 msgid "Compose new message in Evolution and attach file" msgstr "使用 Evolution 编写新邮件并添加附件" #: ../kupfer/plugin/evolution.py:100 msgid "Evolution Address Book" msgstr "Evolution 地址簿" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/filezilla.py:3 msgid "Filezilla" msgstr "Filezilla" #: ../kupfer/plugin/filezilla.py:6 msgid "Show sites and handle ftp addresses by Filezilla" msgstr "显示站点并使用 Filezilla 处理 ftp 地址" #: ../kupfer/plugin/filezilla.py:42 msgid "Open Site with Filezilla" msgstr "用 Filezilla 打开站点" #: ../kupfer/plugin/filezilla.py:87 msgid "Filezilla Sites" msgstr "Filezilla 网站" #: ../kupfer/plugin/filezilla.py:122 msgid "Sites from Filezilla" msgstr "来自 filezilla 的网站" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gajim.py:2 msgid "Gajim" msgstr "Gajim" #: ../kupfer/plugin/gajim.py:5 msgid "Access to Gajim Contacts" msgstr "访问 Gajim 联系人" #: ../kupfer/plugin/gajim.py:27 msgid "Free for Chat" msgstr "可以交谈" #: ../kupfer/plugin/gajim.py:146 msgid "Gajim Contacts" msgstr "Gajim 联系人" #: ../kupfer/plugin/gajim.py:210 msgid "Gajim Account Status" msgstr "Gajim 账户状态" #. TRANS: "Glob" is the matching files like a shell with "*.py" etc. #: ../kupfer/plugin/glob.py:3 ../kupfer/plugin/glob.py:17 msgid "Glob" msgstr "" #: ../kupfer/plugin/gnome_terminal.py:1 ../kupfer/plugin/gnome_terminal.py:56 msgid "GNOME Terminal Profiles" msgstr "GNOME 终端配置" #: ../kupfer/plugin/gnome_terminal.py:3 msgid "Launch GNOME Terminal profiles" msgstr "启动 GNOME 终端配置" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gmail/__init__.py:2 ../kupfer/plugin/gmail/__init__.py:144 msgid "Gmail" msgstr "Gmail" #: ../kupfer/plugin/gmail/__init__.py:5 msgid "Load contacts and compose new email in Gmail" msgstr "载入联系人并在 Gmail 中编写新邮件" #: ../kupfer/plugin/gmail/__init__.py:32 msgid "Load contacts' pictures" msgstr "载入联系人图片" #: ../kupfer/plugin/gmail/__init__.py:51 msgid "Compose Email in GMail" msgstr "在 GMail 中编写新邮件" #: ../kupfer/plugin/gmail/__init__.py:74 msgid "Open web browser and compose new email in GMail" msgstr "打开浏览器并在 Gmail 中创作一封新的电子邮件" #: ../kupfer/plugin/gmail/__init__.py:177 msgid "Contacts from Google services (Gmail)" msgstr "来自 Google 服务(Gmail) 的联系人" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/google_picasa/__init__.py:2 msgid "Google Picasa" msgstr "Google Picasa" #: ../kupfer/plugin/google_picasa/__init__.py:5 msgid "Show albums and upload files to Picasa" msgstr "在 Picasa 中显示相册和上传的文件" #: ../kupfer/plugin/google_picasa/__init__.py:35 msgid "Users to show: (,-separated)" msgstr "要显示的用户:(用 , 分隔)" #: ../kupfer/plugin/google_picasa/__init__.py:41 msgid "Load user and album icons" msgstr "载入用户和相册图标" #: ../kupfer/plugin/google_picasa/__init__.py:92 msgid "Uploading Pictures" msgstr "正在上传图片" #: ../kupfer/plugin/google_picasa/__init__.py:93 msgid "Uploading pictures to Picasa Web Album" msgstr "正在上传图片到 Picasa Web 相册" #: ../kupfer/plugin/google_picasa/__init__.py:102 msgid "Creating album:" msgstr "正在创建相册:" #: ../kupfer/plugin/google_picasa/__init__.py:105 msgid "Album created by Kupfer" msgstr "Kupfer 创建的相册" #: ../kupfer/plugin/google_picasa/__init__.py:112 msgid "File:" msgstr "文件:" #: ../kupfer/plugin/google_picasa/__init__.py:252 #, python-format msgid "One album" msgid_plural "%(num)d albums" msgstr[0] "一个相册" msgstr[1] "%(num)d 个相册" #: ../kupfer/plugin/google_picasa/__init__.py:279 #, python-format msgid "one photo" msgid_plural "%(num)s photos" msgstr[0] "一幅照片" msgstr[1] "%(num)s 幅照片" #: ../kupfer/plugin/google_picasa/__init__.py:299 msgid "Upload to Picasa Album..." msgstr "上传到 Picasa 相册..." #: ../kupfer/plugin/google_picasa/__init__.py:343 msgid "Upload files to Picasa album" msgstr "上传文件到 Picasa 相册" #: ../kupfer/plugin/google_picasa/__init__.py:349 msgid "Upload to Picasa as New Album" msgstr "上传到 Picasa 的新相册" #: ../kupfer/plugin/google_picasa/__init__.py:377 msgid "Create album from selected local directory" msgstr "从选中的本地目录创建相册" #: ../kupfer/plugin/google_picasa/__init__.py:381 #: ../kupfer/plugin/google_picasa/__init__.py:404 msgid "Picasa Albums" msgstr "Picasa 相册" #: ../kupfer/plugin/google_picasa/__init__.py:436 msgid "User albums in Picasa" msgstr "在 Picasa 中使用相册" #: ../kupfer/plugin/google_search.py:1 ../kupfer/plugin/google_search.py:30 msgid "Google Search" msgstr "Google 搜索" #: ../kupfer/plugin/google_search.py:3 msgid "Search Google with results shown directly" msgstr "搜索 Google 并直接显示结果" #: ../kupfer/plugin/google_search.py:58 ../kupfer/plugin/locate.py:46 #: ../kupfer/plugin/tracker.py:72 ../kupfer/plugin/tracker.py:113 #: ../kupfer/plugin/tracker1.py:168 ../kupfer/plugin/tracker1.py:179 #, python-format msgid "Results for \"%s\"" msgstr "“%s”的结果" #: ../kupfer/plugin/google_search.py:91 #, python-format msgid "Show More Results For \"%s\"" msgstr "显示更多“%s”的结果" #: ../kupfer/plugin/google_search.py:92 #, python-format msgid "%s total found" msgstr "总共发现:%s" #: ../kupfer/plugin/google_translate.py:6 msgid "Google Translate" msgstr "Google Transalte" #: ../kupfer/plugin/google_translate.py:8 #: ../kupfer/plugin/google_translate.py:153 msgid "Translate text with Google Translate" msgstr "使用 Google Translate 翻译文本" #: ../kupfer/plugin/google_translate.py:83 msgid "Google Translate connection timed out" msgstr "连接到 Google Translate 超时" #: ../kupfer/plugin/google_translate.py:86 msgid "Error connecting to Google Translate" msgstr "连接到 Google Translate 出错" #: ../kupfer/plugin/google_translate.py:136 #: ../kupfer/plugin/google_translate.py:223 msgid "Translate To..." msgstr "翻译为..." #: ../kupfer/plugin/google_translate.py:179 #, python-format msgid "Translate into %s" msgstr "翻译为 %s" #: ../kupfer/plugin/google_translate.py:203 msgid "Languages" msgstr "语言" #: ../kupfer/plugin/google_translate.py:238 msgid "Show translated page in browser" msgstr "在浏览器中显示翻译后的页面" #: ../kupfer/plugin/google_translate.py:255 msgid "Show Translation To..." msgstr "显示翻译到..." #: ../kupfer/plugin/google_translate.py:271 msgid "Show translation in browser" msgstr "在浏览器显示翻译" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/gtg.py:2 msgid "Getting Things GNOME" msgstr "Getting Things GNOME" #: ../kupfer/plugin/gtg.py:5 msgid "Browse and create new tasks in GTG" msgstr "在 GTG 中浏览和创建新任务" #: ../kupfer/plugin/gtg.py:87 #, python-format msgid "due: %s" msgstr "到期:%s" #: ../kupfer/plugin/gtg.py:89 #, python-format msgid "start: %s" msgstr "开始:%s" #: ../kupfer/plugin/gtg.py:91 #, python-format msgid "tags: %s" msgstr "标签 %s" #: ../kupfer/plugin/gtg.py:118 msgid "Open task in Getting Things GNOME!" msgstr "在 Getting Things GNOME 中打开新任务" #: ../kupfer/plugin/gtg.py:125 msgid "Delete" msgstr "删除" #: ../kupfer/plugin/gtg.py:135 msgid "Permanently remove this task" msgstr "永远移除此任务" #: ../kupfer/plugin/gtg.py:140 msgid "Mark Done" msgstr "标记完成" #: ../kupfer/plugin/gtg.py:149 msgid "Mark this task as done" msgstr "将此任务标记为已完成" #: ../kupfer/plugin/gtg.py:154 msgid "Dismiss" msgstr "解除" #: ../kupfer/plugin/gtg.py:163 msgid "Mark this task as not to be done anymore" msgstr "标志此任务为未完成" #: ../kupfer/plugin/gtg.py:168 msgid "Create Task" msgstr "创建任务" #: ../kupfer/plugin/gtg.py:182 msgid "Create new task in Getting Things GNOME" msgstr "在 Getting Things GNOME 中创建新任务" #: ../kupfer/plugin/gwibber.py:3 msgid "Gwibber" msgstr "Gwibber" #: ../kupfer/plugin/gwibber.py:6 msgid "" "Microblogging with Gwibber. Allows sending and receiving messages from " "social networks like Twitter, Identi.ca etc. Requires the package 'gwibber-" "service'." msgstr "" #: ../kupfer/plugin/gwibber.py:45 msgid "Maximum number of messages to show" msgstr "" #. TRANS: Account description, similar to "John on Identi.ca" #: ../kupfer/plugin/gwibber.py:98 #, fuzzy, python-format msgid "%(user)s on %(service)s" msgstr "%(user)s %(when)s" #. TRANS: Gwibber Message description #. TRANS: Similar to "John May 5 2011 11:40 on Identi.ca" #. TRANS: the %(user)s and similar tokens must be unchanged #: ../kupfer/plugin/gwibber.py:153 #, fuzzy, python-format msgid "%(user)s %(when)s on %(where)s" msgstr "%(user)s %(when)s" #: ../kupfer/plugin/gwibber.py:187 #, fuzzy msgid "Send Message" msgstr "发送消息..." #: ../kupfer/plugin/gwibber.py:205 msgid "Send message to all Gwibber accounts" msgstr "" #: ../kupfer/plugin/gwibber.py:210 #, fuzzy msgid "Send Message To..." msgstr "发送消息..." #: ../kupfer/plugin/gwibber.py:238 msgid "Send message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:243 ../kupfer/plugin/pidgin.py:120 msgid "Send Message..." msgstr "发送消息..." #: ../kupfer/plugin/gwibber.py:273 msgid "Send message to selected Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:278 msgid "Reply..." msgstr "回复..." #: ../kupfer/plugin/gwibber.py:314 #, fuzzy msgid "Delete Message" msgstr "发送消息..." #: ../kupfer/plugin/gwibber.py:337 #, fuzzy msgid "Send Private Message..." msgstr "发送直接消息..." #: ../kupfer/plugin/gwibber.py:370 #, fuzzy msgid "Send direct message to user" msgstr "发送直接消息到..." #: ../kupfer/plugin/gwibber.py:376 msgid "Retweet" msgstr "" #: ../kupfer/plugin/gwibber.py:376 #, fuzzy msgid "Retweet To..." msgstr "重命名为..." #: ../kupfer/plugin/gwibber.py:407 #, fuzzy msgid "Retweet message to all Gwibber accounts" msgstr "通过 Claws 接收所有账户的新邮件" #: ../kupfer/plugin/gwibber.py:408 msgid "Retweet message to a Gwibber account" msgstr "" #: ../kupfer/plugin/gwibber.py:413 #, fuzzy msgid "Open in Browser" msgstr "打开所在目录" #: ../kupfer/plugin/gwibber.py:419 #, fuzzy msgid "Open message in default web browser" msgstr "用默认查看器打开链接" #: ../kupfer/plugin/gwibber.py:425 ../kupfer/plugin/gwibber.py:463 #, fuzzy msgid "Gwibber Accounts" msgstr "Gajim 账户状态" #: ../kupfer/plugin/gwibber.py:456 msgid "Accounts configured in Gwibber" msgstr "" #: ../kupfer/plugin/gwibber.py:495 #, fuzzy msgid "Gwibber Messages" msgstr "Gwibber" #: ../kupfer/plugin/gwibber.py:518 msgid "Recent messages received by Gwibber" msgstr "" #. TRANS: %s is a service name #: ../kupfer/plugin/gwibber.py:527 #, python-format msgid "Gwibber Messages for %s" msgstr "" #: ../kupfer/plugin/gwibber.py:543 #, fuzzy msgid "Gwibber Streams" msgstr "Gwibber" #: ../kupfer/plugin/gwibber.py:566 msgid "Streams configured in Gwibber" msgstr "" #. TRANS: Gwibber messages in %s :: %s is a Stream name #: ../kupfer/plugin/gwibber.py:574 #, python-format msgid "Gwibber Messages in %s" msgstr "" #: ../kupfer/plugin/gwibber_simple.py:3 #, fuzzy msgid "Gwibber (Simple)" msgstr "Gwibber" #: ../kupfer/plugin/gwibber_simple.py:7 msgid "Send updates via the microblogging client Gwibber" msgstr "通过微博客户端 Gwibber(硅博)发送更新" #: ../kupfer/plugin/gwibber_simple.py:45 msgid "Send Update" msgstr "发送更新" #: ../kupfer/plugin/gwibber_simple.py:65 msgid "Unable to activate Gwibber service" msgstr "无法激活 Gwibber 服务" #: ../kupfer/plugin/higherorder.py:1 msgid "Higher-order Actions" msgstr "高优先级操作" #: ../kupfer/plugin/higherorder.py:7 msgid "Tools to work with commands as objects" msgstr "将命令视为对象进行操作的工具" #: ../kupfer/plugin/higherorder.py:20 msgid "Select in Kupfer" msgstr "在 Kupfer 中选择" #: ../kupfer/plugin/higherorder.py:59 #, python-format msgid "Result of %s (%s)" msgstr "“%s”的结果(%s)" #: ../kupfer/plugin/higherorder.py:75 msgid "Run (Take Result)" msgstr "运行(得到结果)" #: ../kupfer/plugin/higherorder.py:90 msgid "Take the command result as a proxy object" msgstr "把此命令的结果作为代理对象" #: ../kupfer/plugin/higherorder.py:95 msgid "Run (Discard Result)" msgstr "运行(忽略结果)" #: ../kupfer/plugin/image.py:1 msgid "Image Tools" msgstr "图像工具" #: ../kupfer/plugin/image.py:10 msgid "Image transformation tools" msgstr "图像转换工具" #: ../kupfer/plugin/image.py:25 msgid "Scale..." msgstr "缩放..." #: ../kupfer/plugin/image.py:77 msgid "Scale image to fit inside given pixel measure(s)" msgstr "缩放图像来适合内部指定的像素单位" #: ../kupfer/plugin/image.py:112 msgid "Rotate Clockwise" msgstr "顺时针旋转" #: ../kupfer/plugin/image.py:119 msgid "Rotate Counter-Clockwise" msgstr "逆时针旋转" #: ../kupfer/plugin/image.py:126 msgid "Autorotate" msgstr "自动旋转" #: ../kupfer/plugin/image.py:155 msgid "Rotate JPEG (in-place) according to its EXIF metadata" msgstr "根据自身 EXIF 数据旋转 JPEG 文件" #: ../kupfer/plugin/kupfer_plugins.py:1 ../kupfer/plugin/kupfer_plugins.py:86 msgid "Kupfer Plugins" msgstr "Kupfer 插件" #: ../kupfer/plugin/kupfer_plugins.py:3 msgid "Access Kupfer's plugin list in Kupfer" msgstr "在 Kupfer 中访问 Kupfer 插件" #: ../kupfer/plugin/kupfer_plugins.py:19 msgid "Show Information" msgstr "显示信息" #: ../kupfer/plugin/kupfer_plugins.py:35 msgid "Show Source Code" msgstr "显示源代码" #: ../kupfer/plugin/kupfer_plugins.py:80 msgid "enabled" msgstr "已启用" #: ../kupfer/plugin/locate.py:1 ../kupfer/plugin/locate.py:28 msgid "Locate Files" msgstr "查找文件" #: ../kupfer/plugin/locate.py:5 ../kupfer/plugin/locate.py:38 msgid "Search filesystem using locate" msgstr "使用 locate 搜索文件系统" #: ../kupfer/plugin/locate.py:20 msgid "Ignore case distinctions when searching files" msgstr "搜索文件时忽略大小写" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/openoffice.py:3 msgid "OpenOffice / LibreOffice" msgstr "OpenOffice / LibreOffice" #: ../kupfer/plugin/openoffice.py:5 ../kupfer/plugin/openoffice.py:135 msgid "Recently used documents in OpenOffice/LibreOffice" msgstr "OpenOffice/LibreOffice 最近使用的文档" #: ../kupfer/plugin/openoffice.py:83 msgid "OpenOffice/LibreOffice Recent Items" msgstr "OpenOffice/LibreOffice 最近项目" #: ../kupfer/plugin/opera.py:4 ../kupfer/plugin/opera.py:22 msgid "Opera Bookmarks" msgstr "Opera 书签" #: ../kupfer/plugin/opera.py:6 ../kupfer/plugin/opera.py:54 msgid "Index of Opera bookmarks" msgstr "Opera 书签的索引" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/operamail.py:2 msgid "Opera Mail" msgstr "Opera 邮件" #: ../kupfer/plugin/operamail.py:5 msgid "Opera Mail contacts and actions" msgstr "Opera Mail 邮件联系人和操作" #: ../kupfer/plugin/operamail.py:32 msgid "Compose a new message in Opera Mail" msgstr "在 Opera Mail 中创建新消息" #: ../kupfer/plugin/operamail.py:64 msgid "Opera Mail Contacts" msgstr "Opera Mail 联系人" #: ../kupfer/plugin/operamail.py:120 msgid "Contacts from Opera Mail" msgstr "Opera Mail 地址簿中的联系人" #: ../kupfer/plugin/pidgin.py:3 msgid "Pidgin" msgstr "Pidgin" #: ../kupfer/plugin/pidgin.py:9 msgid "Access to Pidgin Contacts" msgstr "访问 Pidgin 联系人" #: ../kupfer/plugin/pidgin.py:111 #, python-format msgid "%s (%d character)" msgid_plural "%s (%d characters)" msgstr[0] "%s (%d 个字符)" msgstr[1] "%s (%d 个字符)" #: ../kupfer/plugin/pidgin.py:192 msgid "Pidgin Contacts" msgstr "Pidgin 联系人" #: ../kupfer/plugin/putty.py:5 ../kupfer/plugin/putty.py:80 msgid "PuTTY Sessions" msgstr "PuTTY 会话" #: ../kupfer/plugin/putty.py:8 msgid "Quick access to PuTTY Sessions" msgstr "快速操作 PuTTY 会话" #: ../kupfer/plugin/putty.py:46 ../kupfer/plugin/tsclient.py:50 msgid "Start Session" msgstr "开始新的会话" #: ../kupfer/plugin/quickview.py:1 msgid "Quick Image Viewer" msgstr "" #: ../kupfer/plugin/quickview.py:53 msgid "View Image" msgstr "" #: ../kupfer/plugin/rst.py:1 msgid "reStructuredText" msgstr "重构文本" #: ../kupfer/plugin/rst.py:3 msgid "Render reStructuredText and show the result" msgstr "渲染重构文本然后显示结果" #: ../kupfer/plugin/rst.py:18 msgid "View as HTML Document" msgstr "以 HTML 文档方式查看" #: ../kupfer/plugin/screen.py:1 msgid "GNU Screen" msgstr "GNU Screen" #: ../kupfer/plugin/screen.py:3 ../kupfer/plugin/screen.py:89 msgid "Active GNU Screen sessions" msgstr "活动的 GNU Screen 会话" #: ../kupfer/plugin/screen.py:57 msgid "Attached" msgstr "已连接" #: ../kupfer/plugin/screen.py:58 msgid "Detached" msgstr "已断开" #: ../kupfer/plugin/screen.py:61 #, python-format msgid "%(status)s session (%(pid)s) created %(time)s" msgstr "%(status)s 会话 (%(pid)s) 创建 %(time)s" #: ../kupfer/plugin/screen.py:70 msgid "Screen Sessions" msgstr "Screen 会话" #: ../kupfer/plugin/screen.py:99 msgid "Attach" msgstr "附加" #: ../kupfer/plugin/sendkeys.py:2 ../kupfer/plugin/sendkeys.py:49 #, fuzzy msgid "Send Keys" msgstr "发送更新" #: ../kupfer/plugin/sendkeys.py:8 msgid "Send synthetic keyboard events using xautomation" msgstr "" #: ../kupfer/plugin/sendkeys.py:25 msgid "Paste to Foreground Window" msgstr "" #: ../kupfer/plugin/sendkeys.py:43 msgid "Copy to clipboard and send Ctrl+V to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:85 msgid "Send keys to foreground window" msgstr "" #: ../kupfer/plugin/sendkeys.py:90 msgid "Type Text" msgstr "" #: ../kupfer/plugin/sendkeys.py:111 msgid "Type the text to foreground window" msgstr "" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/services.py:2 ../kupfer/plugin/services.py:96 msgid "System Services" msgstr "系统服务" #: ../kupfer/plugin/services.py:4 msgid "Start, stop or restart system services via init scripts" msgstr "通过脚本开始、停止或者重启系统服务" #: ../kupfer/plugin/services.py:18 msgid "Sudo-like Command" msgstr "类 Sudo 命令" #: ../kupfer/plugin/services.py:78 msgid "Start Service" msgstr "开始服务" #: ../kupfer/plugin/services.py:84 msgid "Restart Service" msgstr "重启服务" #: ../kupfer/plugin/services.py:90 msgid "Stop Service" msgstr "停止服务" #: ../kupfer/plugin/services.py:126 #, python-format msgid "%s Service" msgstr "%s 服务" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/shorten_links.py:2 msgid "Shorten Links" msgstr "缩短的链接" #: ../kupfer/plugin/shorten_links.py:4 msgid "Create short aliases of long URLs" msgstr "为长 URLs 创建短别名" #: ../kupfer/plugin/shorten_links.py:48 msgid "Error" msgstr "错误" #: ../kupfer/plugin/shorten_links.py:121 msgid "Shorten With..." msgstr "取短方式..." #: ../kupfer/plugin/shorten_links.py:151 msgid "Services" msgstr "服务" #: ../kupfer/plugin/show_qrcode.py:5 ../kupfer/plugin/show_qrcode.py:25 #, fuzzy msgid "Show QRCode" msgstr "显示源代码" #: ../kupfer/plugin/show_qrcode.py:9 ../kupfer/plugin/show_qrcode.py:60 #, fuzzy msgid "Display text as QRCode in a window" msgstr "在窗口中显示文本" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/skype.py:2 msgid "Skype" msgstr "Skype" #: ../kupfer/plugin/skype.py:5 msgid "Access to Skype contacts" msgstr "联系 Spype 中的联系人" #: ../kupfer/plugin/skype.py:31 msgid "Skype Me" msgstr "Skype 我" #: ../kupfer/plugin/skype.py:37 msgid "Logged Out" msgstr "注销" #: ../kupfer/plugin/skype.py:183 #, python-format msgid "[%(status)s] %(userid)s" msgstr "[%(status)s] %(userid)s" #: ../kupfer/plugin/skype.py:225 msgid "Call" msgstr "呼叫" #: ../kupfer/plugin/skype.py:239 msgid "Place a call to contact" msgstr "呼叫联系人" #: ../kupfer/plugin/skype.py:274 msgid "Skype Contacts" msgstr "Skype 联系人" #: ../kupfer/plugin/skype.py:294 msgid "Skype Statuses" msgstr "Skype 状态" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/ssh_hosts.py:2 ../kupfer/plugin/ssh_hosts.py:70 msgid "SSH Hosts" msgstr "SSH 主机" #: ../kupfer/plugin/ssh_hosts.py:3 msgid "Adds the SSH hosts found in ~/.ssh/config." msgstr "添加此 SSH 主机到 ~/.ssh/config 。" #: ../kupfer/plugin/ssh_hosts.py:32 msgid "SSH host" msgstr "SSH 主机" #: ../kupfer/plugin/ssh_hosts.py:43 msgid "Connect" msgstr "连接" #: ../kupfer/plugin/ssh_hosts.py:49 msgid "Connect to SSH host" msgstr "连接到 SSH 主机" #: ../kupfer/plugin/ssh_hosts.py:102 msgid "SSH hosts as specified in ~/.ssh/config" msgstr "~/.ssh/config 中指定的 SSH 主机" #: ../kupfer/plugin_support.py:144 msgid "No D-Bus connection to desktop session" msgstr "没有到桌面会话的 D-Bus 连接" #: ../kupfer/plugin/templates.py:1 ../kupfer/plugin/templates.py:107 msgid "Document Templates" msgstr "文档模板" #: ../kupfer/plugin/templates.py:4 msgid "Create new documents from your templates" msgstr "从你的模板创建新文档" #: ../kupfer/plugin/templates.py:24 #, python-format msgid "%s template" msgstr "%s 模板" #: ../kupfer/plugin/templates.py:37 ../kupfer/plugin/textfiles.py:86 msgid "Empty File" msgstr "空文件" #: ../kupfer/plugin/templates.py:47 msgid "New Folder" msgstr "新文件夹" #: ../kupfer/plugin/templates.py:57 msgid "Create New Document..." msgstr "创建新文档..." #: ../kupfer/plugin/templates.py:96 msgid "Create a new document from template" msgstr "从模板创建新文档" #: ../kupfer/plugin/templates.py:103 msgid "Create Document In..." msgstr "创建文档到..." #: ../kupfer/plugin/textfiles.py:13 msgid "Textfiles" msgstr "文本文件" #: ../kupfer/plugin/textfiles.py:51 msgid "Append To..." msgstr "追加到..." #: ../kupfer/plugin/textfiles.py:75 msgid "Append..." msgstr "追加..." #: ../kupfer/plugin/textfiles.py:79 msgid "Write To..." msgstr "写入..." #: ../kupfer/plugin/textfiles.py:111 msgid "Get Text Contents" msgstr "获得文本内容" #: ../kupfer/plugin/thunar.py:1 ../kupfer/plugin/thunar.py:184 #: ../kupfer/plugin/thunar.py:224 ../kupfer/plugin/thunar.py:283 msgid "Thunar" msgstr "Thunar" #: ../kupfer/plugin/thunar.py:10 msgid "File manager Thunar actions" msgstr "文件管理器 Thunar 动作" #: ../kupfer/plugin/thunar.py:66 msgid "Select in File Manager" msgstr "在文件管理器中选择" #: ../kupfer/plugin/thunar.py:94 msgid "Show Properties" msgstr "显示属性" #: ../kupfer/plugin/thunar.py:117 msgid "Show information about file in file manager" msgstr "显示有关文件管理器的信息" #: ../kupfer/plugin/thunar.py:126 msgid "Send To..." msgstr "发送到..." #: ../kupfer/plugin/thunar.py:258 msgid "Empty Trash" msgstr "清空回收站" #: ../kupfer/plugin/thunar.py:298 msgid "Thunar Send To Objects" msgstr "Thunar 发送到对象" #: ../kupfer/plugin/thunderbird.py:4 msgid "Thunderbird" msgstr "Thunderbird" #: ../kupfer/plugin/thunderbird.py:7 msgid "Thunderbird/Icedove Contacts and Actions" msgstr "Thunderbird/Icedove 邮件联系人和操作" #: ../kupfer/plugin/thunderbird.py:32 msgid "Compose a new message in Thunderbird" msgstr "在 Thunderbird 中编辑新消息" #: ../kupfer/plugin/thunderbird.py:66 msgid "Thunderbird Address Book" msgstr "Thunderbird 地址薄" #: ../kupfer/plugin/thunderbird.py:91 msgid "Contacts from Thunderbird Address Book" msgstr "Thunderbird 地址簿中的联系人" #: ../kupfer/plugin/top.py:4 msgid "Top" msgstr "顶部" #: ../kupfer/plugin/top.py:6 msgid "Show running tasks and allow sending signals to them" msgstr "显示运行的任务并允许向它们发送信号" #: ../kupfer/plugin/top.py:23 msgid "Sort Order" msgstr "排列顺序" #: ../kupfer/plugin/top.py:25 ../kupfer/plugin/top.py:26 #: ../kupfer/plugin/top.py:115 msgid "Commandline" msgstr "命令行" #: ../kupfer/plugin/top.py:26 msgid "CPU usage (descending)" msgstr "CPU 使用量(降序)" #. sort processes (top don't allow to sort via cmd line) #: ../kupfer/plugin/top.py:27 ../kupfer/plugin/top.py:112 msgid "Memory usage (descending)" msgstr "内存使用量(降序)" #: ../kupfer/plugin/top.py:49 msgid "Send Signal..." msgstr "发送信号..." #: ../kupfer/plugin/top.py:79 msgid "Signals" msgstr "信号" #: ../kupfer/plugin/top.py:91 msgid "Running Tasks" msgstr "运行任务" #. default: by cpu #: ../kupfer/plugin/top.py:119 #, python-format msgid "pid: %(pid)s cpu: %(cpu)g%% mem: %(mem)g%% time: %(time)s" msgstr "pid: %(pid)s cpu: %(cpu)g%% 内存: %(mem)g%% 时间: %(time)s" #: ../kupfer/plugin/top.py:139 msgid "Running tasks for current user" msgstr "为当前用户运行任务" #: ../kupfer/plugin/tracker.py:5 msgid "Tracker 0.6" msgstr "Tracker 0.6" #: ../kupfer/plugin/tracker.py:15 ../kupfer/plugin/tracker1.py:18 msgid "Tracker desktop search integration" msgstr "集成 Tracker 桌面搜索" #: ../kupfer/plugin/tracker.py:41 ../kupfer/plugin/tracker1.py:49 msgid "Search in Tracker" msgstr "在 Tracker 中搜索" #: ../kupfer/plugin/tracker.py:46 ../kupfer/plugin/tracker1.py:54 msgid "Open Tracker Search Tool and search for this term" msgstr "开启 Tracker 搜索工具然后搜索这个项目" #: ../kupfer/plugin/tracker.py:55 ../kupfer/plugin/tracker1.py:62 msgid "Get Tracker Results..." msgstr "取得 Tracker 结果..." #: ../kupfer/plugin/tracker.py:64 ../kupfer/plugin/tracker1.py:71 msgid "Show Tracker results for query" msgstr "显示 Tracker 结果" #: ../kupfer/plugin/tracker.py:165 ../kupfer/plugin/tracker.py:171 msgid "Tracker tags" msgstr "Tracker 标签" #: ../kupfer/plugin/tracker.py:180 msgid "Tracker Tags" msgstr "Tracker 标签" #: ../kupfer/plugin/tracker.py:186 msgid "Browse Tracker's tags" msgstr "浏览 Tracker 的标签" #: ../kupfer/plugin/tracker.py:197 ../kupfer/plugin/tracker.py:204 #, python-format msgid "Tag %s" msgstr "标签 %s" #: ../kupfer/plugin/tracker.py:211 #, python-format msgid "Objects tagged %s with Tracker" msgstr "用 Tracker 给目标加上标签%s" #: ../kupfer/plugin/tracker.py:223 msgid "Add Tag..." msgstr "添加标签..." #: ../kupfer/plugin/tracker.py:249 msgid "Add tracker tag to file" msgstr "给文件添加 tracker 标签" #: ../kupfer/plugin/tracker.py:255 msgid "Remove Tag..." msgstr "删除标签..." #: ../kupfer/plugin/tracker.py:274 msgid "Remove tracker tag from file" msgstr "删除文件的 tracker 标签" #: ../kupfer/plugin/tracker1.py:10 #, fuzzy msgid "Tracker" msgstr "Tracker 0.6" #. FIXME: Port tracker tag sources and actions #. to the new, much more powerful sparql + dbus API #. (using tracker-tag as in 0.6 is a plain hack and a dead end) #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/truecrypt.py:3 msgid "TrueCrypt" msgstr "TrueCrypt" #: ../kupfer/plugin/truecrypt.py:6 ../kupfer/plugin/truecrypt.py:140 msgid "Volumes from TrueCrypt history" msgstr "TrueCrypt 历史记录中的分区" #: ../kupfer/plugin/truecrypt.py:44 #, python-format msgid "TrueCrypt volume: %(file)s" msgstr "Truecrypt 分区:%(file)s" #: ../kupfer/plugin/truecrypt.py:52 msgid "Mount Volume" msgstr "挂载分区" #: ../kupfer/plugin/truecrypt.py:63 msgid "Mount in Truecrypt" msgstr "在 Truecrypt 中挂载" #: ../kupfer/plugin/truecrypt.py:72 msgid "Try to mount file as Truecrypt volume" msgstr "尝试挂载为 Truecrypt 分区" #: ../kupfer/plugin/truecrypt.py:80 msgid "Dismount All Volumes" msgstr "卸载全部分区" #: ../kupfer/plugin/truecrypt.py:98 msgid "TrueCrypt Volumes" msgstr "%(file)s 分区" #: ../kupfer/plugin/tsclient.py:4 msgid "Terminal Server Client" msgstr "终端服务器客户端" #: ../kupfer/plugin/tsclient.py:7 msgid "Session saved in Terminal Server Client" msgstr "终端服务客户端中保存的会话" #: ../kupfer/plugin/tsclient.py:72 msgid "TSClient sessions" msgstr "TSClient 会话" #: ../kupfer/plugin/tsclient.py:94 msgid "Saved sessions in Terminal Server Client" msgstr "终端服务客户端中保存的会话" #: ../kupfer/plugin/vinagre.py:4 msgid "Vinagre" msgstr "Vinagre" #: ../kupfer/plugin/vinagre.py:7 msgid "Vinagre bookmarks and actions" msgstr "Vinagre 书签和操作" #: ../kupfer/plugin/vinagre.py:34 msgid "Start Vinagre Session" msgstr "开始 Vinagre 会话" #: ../kupfer/plugin/vinagre.py:72 msgid "Vinagre Bookmarks" msgstr "Vinagre 的书签" #: ../kupfer/plugin/vim.py:1 msgid "Vim" msgstr "Vim" #: ../kupfer/plugin/vim.py:3 msgid "Recently used documents in Vim" msgstr "Vim 最近使用的文档" #: ../kupfer/plugin/vim.py:46 msgid "Vim Recent Documents" msgstr "Vim 最近打开文档" #. -*- coding: UTF-8 -*- #: ../kupfer/plugin/virtualbox/__init__.py:3 msgid "VirtualBox" msgstr "VirtualBox" #: ../kupfer/plugin/virtualbox/__init__.py:5 msgid "" "Control VirtualBox Virtual Machines. Supports both Sun VirtualBox and Open " "Source Edition." msgstr "操作 VirtualBox 虚拟机。支持 Sun VirtualBox 和开源版本。" #: ../kupfer/plugin/virtualbox/__init__.py:22 msgid "Force use CLI interface" msgstr "" #: ../kupfer/plugin/virtualbox/__init__.py:86 #: ../kupfer/plugin/virtualbox/__init__.py:97 msgid "Power On" msgstr "开机" #: ../kupfer/plugin/virtualbox/__init__.py:88 #: ../kupfer/plugin/virtualbox/__init__.py:99 msgid "Power On Headless" msgstr "黑屏开机" #: ../kupfer/plugin/virtualbox/__init__.py:91 msgid "Send Power Off Signal" msgstr "发送关机信号" #: ../kupfer/plugin/virtualbox/__init__.py:94 msgid "Reboot" msgstr "重启" #. VM_STATE_PAUSED #: ../kupfer/plugin/virtualbox/__init__.py:102 msgid "Resume" msgstr "恢复" #: ../kupfer/plugin/virtualbox/__init__.py:105 msgid "Save State" msgstr "保存状态" #: ../kupfer/plugin/virtualbox/__init__.py:107 msgid "Power Off" msgstr "关闭" #: ../kupfer/plugin/virtualbox/__init__.py:131 msgid "VirtualBox Machines" msgstr "VirtualBox 机器" #: ../kupfer/plugin/zim.py:4 msgid "Zim" msgstr "Zim" #: ../kupfer/plugin/zim.py:10 msgid "Access to Pages stored in Zim - A Desktop Wiki and Outliner" msgstr "连接到 Zim 中保存的页面, Zim - 一个桌面笔记和注释工具" #: ../kupfer/plugin/zim.py:28 msgid "Page names start with :colon" msgstr "页面名称以 :colon 开始" #: ../kupfer/plugin/zim.py:58 #, python-format msgid "Zim Page from Notebook \"%s\"" msgstr "Zim 中笔记本的页面\"%s\"" #: ../kupfer/plugin/zim.py:67 msgid "Create Zim Page" msgstr "创建 Zim 新页" #: ../kupfer/plugin/zim.py:74 msgid "Create page in default notebook" msgstr "在默认 Zim 记事本中创建新页面" #: ../kupfer/plugin/zim.py:84 msgid "Create Zim Page In..." msgstr "创建 Zim 页面到..." #: ../kupfer/plugin/zim.py:122 msgid "Create Subpage..." msgstr "新建子页面..." #: ../kupfer/plugin/zim.py:243 msgid "Zim Notebooks" msgstr "Zim 笔记本" #: ../kupfer/plugin/zim.py:259 msgid "Zim Pages" msgstr "Zim 页面" #: ../kupfer/plugin/zim.py:287 msgid "Pages stored in Zim Notebooks" msgstr "Zim 笔记本中保存的页面" #~ msgid "Directories" #~ msgstr "目录" #~ msgid "Interface" #~ msgstr "界面" #~ msgid "Hide Kupfer when focus is lost" #~ msgstr "在失去焦点时隐藏 Kupfer" #, fuzzy #~ msgid "" #~ "Tick the box next to a source to make sure its objects are exported to " #~ "the top level of the catalog. An unticked source's contents are only " #~ "available by locating its subcatalog and entering it.\n" #~ "\n" #~ "Note: Kupfer is an integrator, not an indexer itself. Kupfer is not " #~ "designed to carry a catalog larger than a couple of thousand objects, and " #~ "may become slow if overly large subcatalogs are included in the top level." #~ msgstr "" #~ "勾选资源边的选择框来确保其对象导出到顶层分类中。未勾选的资源的内容只能通过" #~ "定位它的子分类并进入分类才能使用。\n" #~ "\n" #~ "注意:Kupfer 是一个解释器,本身不是索引程序。Kupfer 不能操作有好几千个对象" #~ "的分类。如果顶层分类的子类过多,它可能会变得很慢。" #~ msgid "Text Matches" #~ msgstr "符合的文本" #~ msgid "noun" #~ msgstr "名词" #~ msgid "verb" #~ msgstr "动词" #~ msgid "adjective" #~ msgstr "形容词" #~ msgid "Twitter" #~ msgstr "Twitter" #~ msgid "Microblogging with Twitter: send updates and show friends' tweets" #~ msgstr "使用 Twitter 微博:发送更新并显示朋友的推特" #~ msgid "Load friends' pictures" #~ msgstr "载入朋友的图片" #~ msgid "Load friends' public tweets" #~ msgstr "加载朋友的公共推特" #~ msgid "Load timeline" #~ msgstr "载入时间轴" #~ msgid "Post Update to Twitter" #~ msgstr "向 Twitter 投递更新" #~ msgid "Twitter Timeline" #~ msgstr "Twitter 时间轴" #~ msgid "Twitter Friends" #~ msgstr "Twitter 好友" #~ msgid "Timeline for %s" #~ msgstr "%s 的 时间轴" #~ msgid "Preferred terminal" #~ msgstr "首选的终端" #~ msgid "" #~ "The preferred terminal emulator. It's used to launch the SSH sessions." #~ msgstr "首选的终端模拟器。用来启动 SSH 会话。" #~ msgid "" #~ "The flag which makes the terminal execute everything following it inside " #~ "the terminal (e.g. '-x' for gnome-terminal and terminal, '-e' for konsole " #~ "and urxvt)." #~ msgstr "" #~ "让终端后面的所有命令在该终端中执行的标志选项(如“-x”代表 gnome-terminal 和" #~ "终端,“-e”代表 konsole 和 urxvt)。" #~ msgid "Tracker 0.8" #~ msgstr "Tracker 0.8" #~ msgid "OpenOffice" #~ msgstr "OpenOffice" kupfer-v208/waf000077500000000000000000000077601176220042200135600ustar00rootroot00000000000000#!/usr/bin/env python # encoding: ISO8859-1 # Thomas Nagy, 2005-2011 """ 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. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 os, sys VERSION="1.6.11" REVISION="x" INSTALL="x" C1='x' C2='x' cwd = os.getcwd() join = os.path.join if sys.hexversion<0x206000f: raise ImportError('Python >= 2.6 is required to create the waf file') WAF='waf' def b(x): return x if sys.hexversion>0x300000f: WAF='waf3' def b(x): return x.encode() def err(m): print(('\033[91mError: %s\033[0m' % m)) sys.exit(1) def unpack_wafdir(dir): f = open(sys.argv[0],'rb') c = 'corrupt archive (%d)' while 1: line = f.readline() if not line: err('run waf-light from a folder containing waflib') if line == b('#==>\n'): txt = f.readline() if not txt: err(c % 1) if f.readline() != b('#<==\n'): err(c % 2) break if not txt: err(c % 3) txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')) import shutil, tarfile try: shutil.rmtree(dir) except OSError: pass try: for x in ['Tools', 'extras']: os.makedirs(join(dir, 'waflib', x)) except OSError: err("Cannot unpack waf lib into %s\nMove waf into a writeable directory" % dir) os.chdir(dir) tmp = 't.bz2' t = open(tmp,'wb') t.write(txt) t.close() try: t = tarfile.open(tmp) except: try: os.system('bunzip2 t.bz2') t = tarfile.open('t') tmp = 't' except: os.chdir(cwd) try: shutil.rmtree(dir) except OSError: pass err("Waf cannot be unpacked, check that bzip2 support is present") for x in t: t.extract(x) t.close() for x in ['Tools', 'extras']: os.chmod(join('waflib',x), 493) if sys.hexversion<0x300000f: sys.path = [join(dir, 'waflib')] + sys.path import fixpy2 fixpy2.fixdir(dir) os.unlink(tmp) os.chdir(cwd) try: dir = unicode(dir, 'mbcs') except: pass try: from ctypes import windll windll.kernel32.SetFileAttributesW(dir, 2) except: pass def test(dir): try: os.stat(join(dir, 'waflib')) return os.path.abspath(dir) except OSError: pass def find_lib(): name = sys.argv[0] base = os.path.dirname(os.path.abspath(name)) #devs use $WAFDIR w=test(os.environ.get('WAFDIR', '')) if w: return w #waf-light if name.endswith('waf-light'): w = test(base) if w: return w err('waf-light requires waflib -> export WAFDIR=/folder') dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) for i in [INSTALL,'/usr','/usr/local','/opt']: w = test(i + '/lib/' + dirname) if w: return w #waf-local dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname) w = test(dir) if w: return w #unpack unpack_wafdir(dir) return dir wafdir = find_lib() sys.path.insert(0, wafdir) if __name__ == '__main__': import waflib.extras.compat15#PRELUDE from waflib import Scripting Scripting.waf_entry_point(cwd, VERSION, wafdir) kupfer-v208/waflib/000077500000000000000000000000001176220042200143075ustar00rootroot00000000000000kupfer-v208/waflib/Build.py000066400000000000000000001070421176220042200157240ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) """ Classes related to the build phase (build, clean, install, step, etc) The inheritance tree is the following: """ import os, sys, errno, re, shutil try: import cPickle except: import pickle as cPickle from waflib import Runner, TaskGen, Utils, ConfigSet, Task, Logs, Options, Context, Errors import waflib.Node CACHE_DIR = 'c4che' """Location of the cache files""" CACHE_SUFFIX = '_cache.py' """Suffix for the cache files""" INSTALL = 1337 """Positive value '->' install, see :py:attr:`waflib.Build.BuildContext.is_install`""" UNINSTALL = -1337 """Negative value '<-' uninstall, see :py:attr:`waflib.Build.BuildContext.is_install`""" SAVED_ATTRS = 'root node_deps raw_deps task_sigs'.split() """Build class members to save between the runs (root, node_deps, raw_deps, task_sigs)""" CFG_FILES = 'cfg_files' """Files from the build directory to hash before starting the build (``config.h`` written during the configuration)""" POST_AT_ONCE = 0 """Post mode: all task generators are posted before the build really starts""" POST_LAZY = 1 """Post mode: post the task generators group after group""" POST_BOTH = 2 """Post mode: post the task generators at once, then re-check them for each group""" class BuildContext(Context.Context): '''executes the build''' cmd = 'build' variant = '' def __init__(self, **kw): super(BuildContext, self).__init__(**kw) self.is_install = 0 """Non-zero value when installing or uninstalling file""" self.top_dir = kw.get('top_dir', Context.top_dir) self.run_dir = kw.get('run_dir', Context.run_dir) self.post_mode = POST_AT_ONCE """post the task generators at once, group-by-group, or both""" # output directory - may be set until the nodes are considered self.out_dir = kw.get('out_dir', Context.out_dir) self.cache_dir = kw.get('cache_dir', None) if not self.cache_dir: self.cache_dir = self.out_dir + os.sep + CACHE_DIR # map names to environments, the '' must be defined self.all_envs = {} # ======================================= # # cache variables self.task_sigs = {} """Signatures of the tasks (persists between build executions)""" self.node_deps = {} """Dict of node dependencies found by :py:meth:`waflib.Task.Task.scan` (persists between build executions)""" self.raw_deps = {} """Dict of custom data returned by :py:meth:`waflib.Task.Task.scan` (persists between build executions)""" # list of folders that are already scanned # so that we do not need to stat them one more time self.cache_dir_contents = {} self.task_gen_cache_names = {} self.launch_dir = Context.launch_dir self.jobs = Options.options.jobs self.targets = Options.options.targets self.keep = Options.options.keep self.cache_global = Options.cache_global self.nocache = Options.options.nocache self.progress_bar = Options.options.progress_bar ############ stuff below has not been reviewed # Manual dependencies. self.deps_man = Utils.defaultdict(list) """Manual dependencies set by :py:meth:`waflib.Build.BuildContext.add_manual_dependency`""" # just the structure here self.current_group = 0 """ Current build group """ self.groups = [] """ List containing lists of task generators """ self.group_names = {} """ Map group names to the group lists. See :py:meth:`waflib.Build.BuildContext.add_group` """ def get_variant_dir(self): """Getter for the variant_dir attribute""" if not self.variant: return self.out_dir return os.path.join(self.out_dir, self.variant) variant_dir = property(get_variant_dir, None) def __call__(self, *k, **kw): """ Create a task generator and add it to the current build group. The following forms are equivalent:: def build(bld): tg = bld(a=1, b=2) def build(bld): tg = bld() tg.a = 1 tg.b = 2 def build(bld): tg = TaskGen.task_gen(a=1, b=2) bld.add_to_group(tg, None) :param group: group name to add the task generator to :type group: string """ kw['bld'] = self ret = TaskGen.task_gen(*k, **kw) self.task_gen_cache_names = {} # reset the cache, each time self.add_to_group(ret, group=kw.get('group', None)) return ret def __copy__(self): """Implemented to prevents copies of build contexts (raises an exception)""" raise Errors.WafError('build contexts are not supposed to be copied') def install_files(self, *k, **kw): """Actual implementation provided by :py:meth:`waflib.Build.InstallContext.install_files`""" pass def install_as(self, *k, **kw): """Actual implementation provided by :py:meth:`waflib.Build.InstallContext.install_as`""" pass def symlink_as(self, *k, **kw): """Actual implementation provided by :py:meth:`waflib.Build.InstallContext.symlink_as`""" pass def load_envs(self): """ The configuration command creates files of the form ``build/c4che/NAMEcache.py``. This method creates a :py:class:`waflib.ConfigSet.ConfigSet` instance for each ``NAME`` by reading those files. The config sets are then stored in the dict :py:attr:`waflib.Build.BuildContext.allenvs`. """ node = self.root.find_node(self.cache_dir) if not node: raise Errors.WafError('The project was not configured: run "waf configure" first!') lst = node.ant_glob('**/*%s' % CACHE_SUFFIX, quiet=True) if not lst: raise Errors.WafError('The cache directory is empty: reconfigure the project') for x in lst: name = x.path_from(node).replace(CACHE_SUFFIX, '').replace('\\', '/') env = ConfigSet.ConfigSet(x.abspath()) self.all_envs[name] = env for f in env[CFG_FILES]: newnode = self.root.find_resource(f) try: h = Utils.h_file(newnode.abspath()) except (IOError, AttributeError): Logs.error('cannot find %r' % f) h = Utils.SIG_NIL newnode.sig = h def init_dirs(self): """ Initialize the project directory and the build directory by creating the nodes :py:attr:`waflib.Build.BuildContext.srcnode` and :py:attr:`waflib.Build.BuildContext.bldnode` corresponding to ``top_dir`` and ``variant_dir`` respectively. The ``bldnode`` directory will be created if it does not exist. """ if not (os.path.isabs(self.top_dir) and os.path.isabs(self.out_dir)): raise Errors.WafError('The project was not configured: run "waf configure" first!') self.path = self.srcnode = self.root.find_dir(self.top_dir) self.bldnode = self.root.make_node(self.variant_dir) self.bldnode.mkdir() def execute(self): """ Restore the data from previous builds and call :py:meth:`waflib.Build.BuildContext.execute_build`. Overrides from :py:func:`waflib.Context.Context.execute` """ self.restore() if not self.all_envs: self.load_envs() self.execute_build() def execute_build(self): """ Execute the build by: * reading the scripts (see :py:meth:`waflib.Context.Context.recurse`) * calling :py:meth:`waflib.Build.BuildContext.pre_build` to call user build functions * calling :py:meth:`waflib.Build.BuildContext.compile` to process the tasks * calling :py:meth:`waflib.Build.BuildContext.post_build` to call user build functions """ Logs.info("Waf: Entering directory `%s'" % self.variant_dir) self.recurse([self.run_dir]) self.pre_build() # display the time elapsed in the progress bar self.timer = Utils.Timer() if self.progress_bar: sys.stderr.write(Logs.colors.cursor_off) try: self.compile() finally: if self.progress_bar == 1: c = len(self.returned_tasks) or 1 self.to_log(self.progress_line(c, c, Logs.colors.BLUE, Logs.colors.NORMAL)) print('') sys.stdout.flush() sys.stderr.write(Logs.colors.cursor_on) Logs.info("Waf: Leaving directory `%s'" % self.variant_dir) self.post_build() def restore(self): """ Load the data from a previous run, sets the attributes listed in :py:const:`waflib.Build.SAVED_ATTRS` """ try: env = ConfigSet.ConfigSet(os.path.join(self.cache_dir, 'build.config.py')) except (IOError, OSError): pass else: if env['version'] < Context.HEXVERSION: raise Errors.WafError('Version mismatch! reconfigure the project') for t in env['tools']: self.setup(**t) f = None try: dbfn = os.path.join(self.variant_dir, Context.DBFILE) try: f = open(dbfn, 'rb') except (IOError, EOFError): # handle missing file/empty file Logs.debug('build: could not load the build cache %s (missing)' % dbfn) else: try: waflib.Node.pickle_lock.acquire() waflib.Node.Nod3 = self.node_class try: data = cPickle.load(f) except Exception as e: Logs.debug('build: could not pickle the build cache %s: %r' % (dbfn, e)) else: for x in SAVED_ATTRS: setattr(self, x, data[x]) finally: waflib.Node.pickle_lock.release() finally: if f: f.close() self.init_dirs() def store(self): """ Store the data for next runs, sets the attributes listed in :py:const:`waflib.Build.SAVED_ATTRS`. Uses a temporary file to avoid problems on ctrl+c. """ data = {} for x in SAVED_ATTRS: data[x] = getattr(self, x) db = os.path.join(self.variant_dir, Context.DBFILE) try: waflib.Node.pickle_lock.acquire() waflib.Node.Nod3 = self.node_class f = None try: f = open(db + '.tmp', 'wb') cPickle.dump(data, f) finally: if f: f.close() finally: waflib.Node.pickle_lock.release() try: st = os.stat(db) os.unlink(db) if not Utils.is_win32: # win32 has no chown but we're paranoid os.chown(db + '.tmp', st.st_uid, st.st_gid) except (AttributeError, OSError): pass # do not use shutil.move (copy is not thread-safe) os.rename(db + '.tmp', db) def compile(self): """ Run the build by creating an instance of :py:class:`waflib.Runner.Parallel` The cache file is not written if the build is up to date (no task executed). """ Logs.debug('build: compile()') # use another object to perform the producer-consumer logic (reduce the complexity) self.producer = Runner.Parallel(self, self.jobs) self.producer.biter = self.get_build_iterator() self.returned_tasks = [] # not part of the API yet try: self.producer.start() except KeyboardInterrupt: self.store() raise else: if self.producer.dirty: self.store() if self.producer.error: raise Errors.BuildError(self.producer.error) def setup(self, tool, tooldir=None, funs=None): """ Import waf tools, used to import those accessed during the configuration:: def configure(conf): conf.load('glib2') def build(bld): pass # glib2 is imported implicitly :param tool: tool list :type tool: list :param tooldir: optional tool directory (sys.path) :type tooldir: list of string :param funs: unused variable """ if isinstance(tool, list): for i in tool: self.setup(i, tooldir) return module = Context.load_tool(tool, tooldir) if hasattr(module, "setup"): module.setup(self) def get_env(self): """Getter for the env property""" try: return self.all_envs[self.variant] except KeyError: return self.all_envs[''] def set_env(self, val): """Setter for the env property""" self.all_envs[self.variant] = val env = property(get_env, set_env) def add_manual_dependency(self, path, value): """ Adds a dependency from a node object to a value:: def build(bld): bld.add_manual_dependency( bld.path.find_resource('wscript'), bld.root.find_resource('/etc/fstab')) :param path: file path :type path: string or :py:class:`waflib.Node.Node` :param value: value to depend on :type value: :py:class:`waflib.Node.Node`, string, or function returning a string """ if isinstance(path, waflib.Node.Node): node = path elif os.path.isabs(path): node = self.root.find_resource(path) else: node = self.path.find_resource(path) self.deps_man[id(node)].append(value) def launch_node(self): """Returns the launch directory as a :py:class:`waflib.Node.Node` object""" try: # private cache return self.p_ln except AttributeError: self.p_ln = self.root.find_dir(self.launch_dir) return self.p_ln def hash_env_vars(self, env, vars_lst): """ Hash configuration set variables:: def build(bld): bld.hash_env_vars(bld.env, ['CXX', 'CC']) :param env: Configuration Set :type env: :py:class:`waflib.ConfigSet.ConfigSet` :param vars_lst: list of variables :type vars_list: list of string """ if not env.table: env = env.parent if not env: return Utils.SIG_NIL idx = str(id(env)) + str(vars_lst) try: cache = self.cache_env except AttributeError: cache = self.cache_env = {} else: try: return self.cache_env[idx] except KeyError: pass lst = [env[a] for a in vars_lst] ret = Utils.h_list(lst) Logs.debug('envhash: %s %r', Utils.to_hex(ret), lst) cache[idx] = ret return ret def get_tgen_by_name(self, name): """ Retrieves a task generator from its name or its target name the name must be unique:: def build(bld): tg = bld(name='foo') tg == bld.get_tgen_by_name('foo') """ cache = self.task_gen_cache_names if not cache: # create the index lazily for g in self.groups: for tg in g: try: cache[tg.name] = tg except AttributeError: # raised if not a task generator, which should be uncommon pass try: return cache[name] except KeyError: raise Errors.WafError('Could not find a task generator for the name %r' % name) def progress_line(self, state, total, col1, col2): """ Compute the progress bar used by ``waf -p`` """ n = len(str(total)) Utils.rot_idx += 1 ind = Utils.rot_chr[Utils.rot_idx % 4] pc = (100.*state)/total eta = str(self.timer) fs = "[%%%dd/%%%dd][%%s%%2d%%%%%%s][%s][" % (n, n, ind) left = fs % (state, total, col1, pc, col2) right = '][%s%s%s]' % (col1, eta, col2) cols = Logs.get_term_cols() - len(left) - len(right) + 2*len(col1) + 2*len(col2) if cols < 7: cols = 7 ratio = ((cols*state)//total) - 1 bar = ('='*ratio+'>').ljust(cols) msg = Utils.indicator % (left, bar, right) return msg def declare_chain(self, *k, **kw): """ Wrapper for :py:func:`waflib.TaskGen.declare_chain` provided for convenience """ return TaskGen.declare_chain(*k, **kw) def pre_build(self): """Execute user-defined methods before the build starts, see :py:meth:`waflib.Build.BuildContext.add_pre_fun`""" for m in getattr(self, 'pre_funs', []): m(self) def post_build(self): """Executes the user-defined methods after the build is successful, see :py:meth:`waflib.Build.BuildContext.add_post_fun`""" for m in getattr(self, 'post_funs', []): m(self) def add_pre_fun(self, meth): """ Bind a method to execute after the scripts are read and before the build starts:: def mycallback(bld): print("Hello, world!") def build(bld): bld.add_pre_fun(mycallback) """ try: self.pre_funs.append(meth) except AttributeError: self.pre_funs = [meth] def add_post_fun(self, meth): """ Bind a method to execute immediately after the build is successful:: def call_ldconfig(bld): bld.exec_command('/sbin/ldconfig') def build(bld): if bld.cmd == 'install': bld.add_pre_fun(call_ldconfig) """ try: self.post_funs.append(meth) except AttributeError: self.post_funs = [meth] def get_group(self, x): """ Get the group x, or return the current group if x is None :param x: name or number or None :type x: string, int or None """ if not self.groups: self.add_group() if x is None: return self.groups[self.current_group] if x in self.group_names: return self.group_names[x] return self.groups[x] def add_to_group(self, tgen, group=None): """add a task or a task generator for the build""" # paranoid assert(isinstance(tgen, TaskGen.task_gen) or isinstance(tgen, Task.TaskBase)) tgen.bld = self self.get_group(group).append(tgen) def get_group_name(self, g): """name for the group g (utility)""" if not isinstance(g, list): g = self.groups[g] for x in self.group_names: if id(self.group_names[x]) == id(g): return x return '' def get_group_idx(self, tg): """ Index of the group containing the task generator given as argument:: def build(bld): tg = bld(name='nada') 0 == bld.get_group_idx(tg) :param tg: Task generator object :type tg: :py:class:`waflib.TaskGen.task_gen` """ se = id(tg) for i in range(len(self.groups)): for t in self.groups[i]: if id(t) == se: return i return None def add_group(self, name=None, move=True): """ Add a new group of tasks/task generators. By default the new group becomes the default group for new task generators. :param name: name for this group :type name: string :param move: set the group created as default group (True by default) :type move: bool """ #if self.groups and not self.groups[0].tasks: # error('add_group: an empty group is already present') if name and name in self.group_names: Logs.error('add_group: name %s already present' % name) g = [] self.group_names[name] = g self.groups.append(g) if move: self.current_group = len(self.groups) - 1 def set_group(self, idx): """ Set the current group to be idx: now new task generators will be added to this group by default:: def build(bld): bld(rule='touch ${TGT}', target='foo.txt') bld.add_group() # now the current group is 1 bld(rule='touch ${TGT}', target='bar.txt') bld.set_group(0) # now the current group is 0 bld(rule='touch ${TGT}', target='truc.txt') # build truc.txt before bar.txt :param idx: group name or group index :type idx: string or int """ if isinstance(idx, str): g = self.group_names[idx] for i in range(len(self.groups)): if id(g) == id(self.groups[i]): self.current_group = i else: self.current_group = idx def total(self): """ Approximate task count: this value may be inaccurate if task generators are posted lazily (see :py:attr:`waflib.Build.BuildContext.post_mode`). The value :py:attr:`waflib.Runner.Parallel.total` is updated during the task execution. """ total = 0 for group in self.groups: for tg in group: try: total += len(tg.tasks) except AttributeError: total += 1 return total def get_targets(self): """ Return the task generator corresponding to the 'targets' list, used by :py:meth:`waflib.Build.BuildContext.get_build_iterator`:: $ waf --targets=myprogram,myshlib """ to_post = [] min_grp = 0 for name in self.targets.split(','): tg = self.get_tgen_by_name(name) if not tg: raise Errors.WafError('target %r does not exist' % name) m = self.get_group_idx(tg) if m > min_grp: min_grp = m to_post = [tg] elif m == min_grp: to_post.append(tg) return (min_grp, to_post) def post_group(self): """ Post the task generators from the group indexed by self.cur, used by :py:meth:`waflib.Build.BuildContext.get_build_iterator` """ if self.targets == '*': for tg in self.groups[self.cur]: try: f = tg.post except AttributeError: pass else: f() elif self.targets: if self.cur < self._min_grp: for tg in self.groups[self.cur]: try: f = tg.post except AttributeError: pass else: f() else: for tg in self._exact_tg: tg.post() else: ln = self.launch_node() for tg in self.groups[self.cur]: try: f = tg.post except AttributeError: pass else: if tg.path.is_child_of(ln): f() def get_tasks_group(self, idx): """ Return all the tasks for the group of num idx, used by :py:meth:`waflib.Build.BuildContext.get_build_iterator` """ tasks = [] for tg in self.groups[idx]: # TODO a try-except might be more efficient if isinstance(tg, Task.TaskBase): tasks.append(tg) else: tasks.extend(tg.tasks) return tasks def get_build_iterator(self): """ Creates a generator object that returns lists of tasks executable in parallel (yield) :return: tasks which can be executed immediatly :rtype: list of :py:class:`waflib.Task.TaskBase` """ self.cur = 0 if self.targets and self.targets != '*': (self._min_grp, self._exact_tg) = self.get_targets() global lazy_post if self.post_mode != POST_LAZY: while self.cur < len(self.groups): self.post_group() self.cur += 1 self.cur = 0 while self.cur < len(self.groups): # first post the task generators for the group if self.post_mode != POST_AT_ONCE: self.post_group() # then extract the tasks tasks = self.get_tasks_group(self.cur) # if the constraints are set properly (ext_in/ext_out, before/after) # the call to set_file_constraints may be removed (can be a 15% penalty on no-op rebuilds) # (but leave set_file_constraints for the installation step) # # if the tasks have only files, set_file_constraints is required but set_precedence_constraints is not necessary # Task.set_file_constraints(tasks) Task.set_precedence_constraints(tasks) self.cur_tasks = tasks self.cur += 1 if not tasks: # return something else the build will stop continue yield tasks while 1: yield [] #def install_dir(self, path, env=None): # """ # Create empty folders for the installation (very rarely used) TODO # """ # return class inst(Task.Task): """ Special task used for installing files and symlinks, it behaves both like a task and like a task generator """ color = 'CYAN' def post(self): """ Same interface as in :py:meth:`waflib.TaskGen.task_gen.post` """ buf = [] for x in self.source: if isinstance(x, waflib.Node.Node): y = x else: y = self.path.find_resource(x) if not y: if Logs.verbose: Logs.warn('Could not find %s immediately (may cause broken builds)' % x) idx = self.generator.bld.get_group_idx(self) for tg in self.generator.bld.groups[idx]: if not isinstance(tg, inst) and id(tg) != id(self): tg.post() y = self.path.find_resource(x) if y: break else: raise Errors.WafError('could not find %r in %r' % (x, self.path)) buf.append(y) self.inputs = buf def runnable_status(self): """ Installation tasks are always executed, so this method returns either :py:const:`waflib.Task.ASK_LATER` or :py:const:`waflib.Task.RUN_ME`. """ ret = super(inst, self).runnable_status() if ret == Task.SKIP_ME: return Task.RUN_ME return ret def __str__(self): """Return an empty string to disable the display""" return '' def run(self): """The attribute 'exec_task' holds the method to execute""" return self.generator.exec_task() def get_install_path(self, destdir=True): """ Installation path obtained from ``self.dest`` and prefixed by the destdir. The variables such as '${PREFIX}/bin' are substituted. """ dest = Utils.subst_vars(self.dest, self.env) dest = dest.replace('/', os.sep) if destdir and Options.options.destdir: dest = os.path.join(Options.options.destdir, os.path.splitdrive(dest)[1].lstrip(os.sep)) return dest def exec_install_files(self): """ Predefined method for installing files """ destpath = self.get_install_path() if not destpath: raise Errors.WafError('unknown installation path %r' % self.generator) for x, y in zip(self.source, self.inputs): if self.relative_trick: destfile = os.path.join(destpath, y.path_from(self.path)) Utils.check_dir(os.path.dirname(destfile)) else: destfile = os.path.join(destpath, y.name) self.generator.bld.do_install(y.abspath(), destfile, self.chmod) def exec_install_as(self): """ Predefined method for installing one file with a given name """ destfile = self.get_install_path() self.generator.bld.do_install(self.inputs[0].abspath(), destfile, self.chmod) def exec_symlink_as(self): """ Predefined method for installing a symlink """ destfile = self.get_install_path() self.generator.bld.do_link(self.link, destfile) class InstallContext(BuildContext): '''installs the targets on the system''' cmd = 'install' def __init__(self, **kw): super(InstallContext, self).__init__(**kw) # list of targets to uninstall for removing the empty folders after uninstalling self.uninstall = [] self.is_install = INSTALL def do_install(self, src, tgt, chmod=Utils.O644): """ Copy a file from src to tgt with given file permissions. The actual copy is not performed if the source and target file have the same size and the same timestamps. When the copy occurs, the file is first removed and then copied (prevent stale inodes). This method is overridden in :py:meth:`waflib.Build.UninstallContext.do_install` to remove the file. :param src: file name as absolute path :type src: string :param tgt: file destination, as absolute path :type tgt: string :param chmod: installation mode :type chmod: int """ d, _ = os.path.split(tgt) if not d: raise Errors.WafError('Invalid installation given %r->%r' % (src, tgt)) Utils.check_dir(d) srclbl = src.replace(self.srcnode.abspath() + os.sep, '') if not Options.options.force: # check if the file is already there to avoid a copy try: st1 = os.stat(tgt) st2 = os.stat(src) except OSError: pass else: # same size and identical timestamps -> make no copy if st1.st_mtime + 2 >= st2.st_mtime and st1.st_size == st2.st_size: if not self.progress_bar: Logs.info('- install %s (from %s)' % (tgt, srclbl)) return False if not self.progress_bar: Logs.info('+ install %s (from %s)' % (tgt, srclbl)) # following is for shared libs and stale inodes (-_-) try: os.remove(tgt) except OSError: pass try: shutil.copy2(src, tgt) os.chmod(tgt, chmod) except IOError: try: os.stat(src) except (OSError, IOError): Logs.error('File %r does not exist' % src) raise Errors.WafError('Could not install the file %r' % tgt) def do_link(self, src, tgt): """ Create a symlink from tgt to src. This method is overridden in :py:meth:`waflib.Build.UninstallContext.do_link` to remove the symlink. :param src: file name as absolute path :type src: string :param tgt: file destination, as absolute path :type tgt: string """ d, _ = os.path.split(tgt) Utils.check_dir(d) link = False if not os.path.islink(tgt): link = True elif os.readlink(tgt) != src: link = True if link: try: os.remove(tgt) except OSError: pass if not self.progress_bar: Logs.info('+ symlink %s (to %s)' % (tgt, src)) os.symlink(src, tgt) else: if not self.progress_bar: Logs.info('- symlink %s (to %s)' % (tgt, src)) def run_task_now(self, tsk, postpone): """ This method is called by :py:meth:`waflib.Build.InstallContext.install_files`, :py:meth:`waflib.Build.InstallContext.install_as` and :py:meth:`waflib.Build.InstallContext.symlink_as` immediately after the installation task is created. Its role is to force the immediate execution if necessary, that is when ``postpone=False`` was given. """ tsk.post() if not postpone: if tsk.runnable_status() == Task.ASK_LATER: raise self.WafError('cannot post the task %r' % tsk) tsk.run() def install_files(self, dest, files, env=None, chmod=Utils.O644, relative_trick=False, cwd=None, add=True, postpone=True): """ Create a task to install files on the system:: def build(bld): bld.install_files('${DATADIR}', self.path.find_resource('wscript')) :param dest: absolute path of the destination directory :type dest: string :param files: input files :type files: list of strings or list of nodes :param env: configuration set for performing substitutions in dest :type env: Configuration set :param relative_trick: preserve the folder hierarchy when installing whole folders :type relative_trick: bool :param cwd: parent node for searching srcfile, when srcfile is not a :py:class:`waflib.Node.Node` :type cwd: :py:class:`waflib.Node.Node` :param add: add the task created to a build group - set ``False`` only if the installation task is created after the build has started :type add: bool :param postpone: execute the task immediately to perform the installation :type postpone: bool """ tsk = inst(env=env or self.env) tsk.bld = self tsk.path = cwd or self.path tsk.chmod = chmod if isinstance(files, waflib.Node.Node): tsk.source = [files] else: tsk.source = Utils.to_list(files) tsk.dest = dest tsk.exec_task = tsk.exec_install_files tsk.relative_trick = relative_trick if add: self.add_to_group(tsk) self.run_task_now(tsk, postpone) return tsk def install_as(self, dest, srcfile, env=None, chmod=Utils.O644, cwd=None, add=True, postpone=True): """ Create a task to install a file on the system with a different name:: def build(bld): bld.install_as('${PREFIX}/bin', 'myapp', chmod=Utils.O755) :param dest: absolute path of the destination file :type dest: string :param srcfile: input file :type srcfile: string or node :param cwd: parent node for searching srcfile, when srcfile is not a :py:class:`waflib.Node.Node` :type cwd: :py:class:`waflib.Node.Node` :param env: configuration set for performing substitutions in dest :type env: Configuration set :param add: add the task created to a build group - set ``False`` only if the installation task is created after the build has started :type add: bool :param postpone: execute the task immediately to perform the installation :type postpone: bool """ tsk = inst(env=env or self.env) tsk.bld = self tsk.path = cwd or self.path tsk.chmod = chmod tsk.source = [srcfile] tsk.dest = dest tsk.exec_task = tsk.exec_install_as if add: self.add_to_group(tsk) self.run_task_now(tsk, postpone) return tsk def symlink_as(self, dest, src, env=None, cwd=None, add=True, postpone=True): """ Create a task to install a symlink:: def build(bld): bld.symlink_as('${PREFIX}/lib/libfoo.so', 'libfoo.so.1.2.3') :param dest: absolute path of the symlink :type dest: string :param src: absolute or relative path of the link :type src: string :param env: configuration set for performing substitutions in dest :type env: Configuration set :param add: add the task created to a build group - set ``False`` only if the installation task is created after the build has started :type add: bool :param postpone: execute the task immediately to perform the installation :type postpone: bool """ if Utils.is_win32: # symlinks *cannot* work on that platform return tsk = inst(env=env or self.env) tsk.bld = self tsk.dest = dest tsk.path = cwd or self.path tsk.source = [] tsk.link = src tsk.exec_task = tsk.exec_symlink_as if add: self.add_to_group(tsk) self.run_task_now(tsk, postpone) return tsk class UninstallContext(InstallContext): '''removes the targets installed''' cmd = 'uninstall' def __init__(self, **kw): super(UninstallContext, self).__init__(**kw) self.is_install = UNINSTALL def do_install(self, src, tgt, chmod=Utils.O644): """See :py:meth:`waflib.Build.InstallContext.do_install`""" if not self.progress_bar: Logs.info('- remove %s' % tgt) self.uninstall.append(tgt) try: os.remove(tgt) except OSError as e: if e.errno != errno.ENOENT: if not getattr(self, 'uninstall_error', None): self.uninstall_error = True Logs.warn('build: some files could not be uninstalled (retry with -vv to list them)') if Logs.verbose > 1: Logs.warn('could not remove %s (error code %r)' % (e.filename, e.errno)) # TODO ita refactor this into a post build action to uninstall the folders (optimization) while tgt: tgt = os.path.dirname(tgt) try: os.rmdir(tgt) except OSError: break def do_link(self, src, tgt): """See :py:meth:`waflib.Build.InstallContext.do_link`""" try: if not self.progress_bar: Logs.info('- unlink %s' % tgt) os.remove(tgt) except OSError: pass # TODO ita refactor this into a post build action to uninstall the folders (optimization)? while tgt: tgt = os.path.dirname(tgt) try: os.rmdir(tgt) except OSError: break def execute(self): """ See :py:func:`waflib.Context.Context.execute` """ try: # do not execute any tasks def runnable_status(self): return Task.SKIP_ME setattr(Task.Task, 'runnable_status_back', Task.Task.runnable_status) setattr(Task.Task, 'runnable_status', runnable_status) super(UninstallContext, self).execute() finally: setattr(Task.Task, 'runnable_status', Task.Task.runnable_status_back) class CleanContext(BuildContext): '''cleans the project''' cmd = 'clean' def execute(self): """ See :py:func:`waflib.Context.Context.execute` """ self.restore() if not self.all_envs: self.load_envs() self.recurse([self.run_dir]) try: self.clean() finally: self.store() def clean(self): """clean the data and some files in the build dir .. well, TODO""" Logs.debug('build: clean called') if self.bldnode != self.srcnode: # would lead to a disaster if top == out lst = [self.root.find_or_declare(f) for f in self.env[CFG_FILES]] for n in self.bldnode.ant_glob('**/*', excl='lock* *conf_check_*/** config.log c4che/*', quiet=True): if n in lst: continue n.delete() self.root.children = {} for v in 'node_deps task_sigs raw_deps'.split(): setattr(self, v, {}) class ListContext(BuildContext): '''lists the targets to execute''' cmd = 'list' def execute(self): """ See :py:func:`waflib.Context.Context.execute`. """ self.restore() if not self.all_envs: self.load_envs() self.recurse([self.run_dir]) self.pre_build() # display the time elapsed in the progress bar self.timer = Utils.Timer() for g in self.groups: for tg in g: try: f = tg.post except AttributeError: pass else: f() try: # force the cache initialization self.get_tgen_by_name('') except: pass lst = list(self.task_gen_cache_names.keys()) lst.sort() for k in lst: Logs.pprint('GREEN', k) class StepContext(BuildContext): '''executes tasks in a step-by-step fashion, for debugging''' cmd = 'step' def __init__(self, **kw): super(StepContext, self).__init__(**kw) self.files = Options.options.files def compile(self): """ Compile the tasks matching the input/output files given (regular expression matching). Derived from :py:meth:`waflib.Build.BuildContext.compile`:: $ waf step --files=foo.c,bar.c,in:truc.c,out:bar.o $ waf step --files=in:foo.cpp.1.o # link task only """ if not self.files: Logs.warn('Add a pattern for the debug build, for example "waf step --files=main.c,app"') BuildContext.compile(self) return for g in self.groups: for tg in g: try: f = tg.post except AttributeError: pass else: f() for pat in self.files.split(','): matcher = self.get_matcher(pat) for tg in g: if isinstance(tg, Task.TaskBase): lst = [tg] else: lst = tg.tasks for tsk in lst: do_exec = False for node in getattr(tsk, 'inputs', []): if matcher(node, output=False): do_exec = True break for node in getattr(tsk, 'outputs', []): if matcher(node, output=True): do_exec = True break if do_exec: ret = tsk.run() Logs.info('%s -> exit %r' % (str(tsk), ret)) def get_matcher(self, pat): # this returns a function inn = True out = True if pat.startswith('in:'): out = False pat = pat.replace('in:', '') elif pat.startswith('out:'): inn = False pat = pat.replace('out:', '') anode = self.root.find_node(pat) pattern = None if not anode: if not pat.startswith('^'): pat = '^.+?%s' % pat if not pat.endswith('$'): pat = '%s$' % pat pattern = re.compile(pat) def match(node, output): if output == True and not out: return False if output == False and not inn: return False if anode: return anode == node else: return pattern.match(node.abspath()) return match BuildContext.store = Utils.nogc(BuildContext.store) BuildContext.restore = Utils.nogc(BuildContext.restore) kupfer-v208/waflib/ConfigSet.py000066400000000000000000000173041176220042200165470ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) """ ConfigSet: a special dict The values put in :py:class:`ConfigSet` must be lists """ import copy, re, os from waflib import Logs, Utils re_imp = re.compile('^(#)*?([^#=]*?)\ =\ (.*?)$', re.M) class ConfigSet(object): """ A dict that honor serialization and parent relationships. The serialization format is human-readable (python-like) and performed by using eval() and repr(). For high performance prefer pickle. Do not store functions as they are not serializable. The values can be accessed by attributes or by keys:: from waflib.ConfigSet import ConfigSet env = ConfigSet() env.FOO = 'test' env['FOO'] = 'test' """ __slots__ = ('table', 'parent') def __init__(self, filename=None): self.table = {} """ Internal dict holding the object values """ #self.parent = None if filename: self.load(filename) def __contains__(self, key): """ Enable the *in* syntax:: if 'foo' in env: print env['foo'] """ if key in self.table: return True try: return self.parent.__contains__(key) except AttributeError: return False # parent may not exist def keys(self): """Dict interface (unknown purpose)""" keys = set() cur = self while cur: keys.update(cur.table.keys()) cur = getattr(cur, 'parent', None) keys = list(keys) keys.sort() return keys def __str__(self): """Text representation of the ConfigSet (for debugging purposes)""" return "\n".join(["%r %r" % (x, self.__getitem__(x)) for x in self.keys()]) def __getitem__(self, key): """ Dictionary interface: get value from key:: def configure(conf): conf.env['foo'] = {} print(env['foo']) """ try: while 1: x = self.table.get(key, None) if not x is None: return x self = self.parent except AttributeError: return [] def __setitem__(self, key, value): """ Dictionary interface: get value from key """ self.table[key] = value def __delitem__(self, key): """ Dictionary interface: get value from key """ self[key] = [] def __getattr__(self, name): """ Attribute access provided for convenience. The following forms are equivalent:: def configure(conf): conf.env.value conf.env['value'] """ if name in self.__slots__: return object.__getattr__(self, name) else: return self[name] def __setattr__(self, name, value): """ Attribute access provided for convenience. The following forms are equivalent:: def configure(conf): conf.env.value = x env['value'] = x """ if name in self.__slots__: object.__setattr__(self, name, value) else: self[name] = value def __delattr__(self, name): """ Attribute access provided for convenience. The following forms are equivalent:: def configure(conf): del env.value del env['value'] """ if name in self.__slots__: object.__delattr__(self, name) else: del self[name] def derive(self): """ Returns a new ConfigSet deriving from self. The copy returned will be a shallow copy:: from waflib.ConfigSet import ConfigSet env = ConfigSet() env.append_value('CFLAGS', ['-O2']) child = env.derive() child.CFLAGS.append('test') # warning! this will modify 'env' child.CFLAGS = ['-O3'] # new list, ok child.append_value('CFLAGS', ['-O3']) # ok Use :py:func:`ConfigSet.detach` to detach the child from the parent. """ newenv = ConfigSet() newenv.parent = self return newenv def detach(self): """ Detach self from its parent (if existing) Modifying the parent :py:class:`ConfigSet` will not change the current object Modifying this :py:class:`ConfigSet` will not modify the parent one. """ tbl = self.get_merged_dict() try: delattr(self, 'parent') except AttributeError: pass else: keys = tbl.keys() for x in keys: tbl[x] = copy.deepcopy(tbl[x]) self.table = tbl def get_flat(self, key): """ Return a value as a string. If the input is a list, the value returned is space-separated. :param key: key to use :type key: string """ s = self[key] if isinstance(s, str): return s return ' '.join(s) def _get_list_value_for_modification(self, key): """ Return a list value for further modification. The list may be modified inplace and there is no need to do this afterwards:: self.table[var] = value """ try: value = self.table[key] except KeyError: try: value = self.parent[key] except AttributeError: value = [] if isinstance(value, list): value = value[:] else: value = [value] else: if not isinstance(value, list): value = [value] self.table[key] = value return value def append_value(self, var, val): """ Appends a value to the specified config key:: def build(bld): bld.env.append_value('CFLAGS', ['-O2']) The value must be a list or a tuple """ current_value = self._get_list_value_for_modification(var) if isinstance(val, str): # if there were string everywhere we could optimize this val = [val] current_value.extend(val) def prepend_value(self, var, val): """ Prepends a value to the specified item:: def configure(conf): conf.env.prepend_value('CFLAGS', ['-O2']) The value must be a list or a tuple """ if isinstance(val, str): val = [val] self.table[var] = val + self._get_list_value_for_modification(var) def append_unique(self, var, val): """ Append a value to the specified item only if it's not already present:: def build(bld): bld.env.append_unique('CFLAGS', ['-O2', '-g']) The value must be a list or a tuple """ if isinstance(val, str): val = [val] current_value = self._get_list_value_for_modification(var) for x in val: if x not in current_value: current_value.append(x) def get_merged_dict(self): """ Compute the merged dictionary from the fusion of self and all its parent :rtype: a ConfigSet object """ table_list = [] env = self while 1: table_list.insert(0, env.table) try: env = env.parent except AttributeError: break merged_table = {} for table in table_list: merged_table.update(table) return merged_table def store(self, filename): """ Write the :py:class:`ConfigSet` data into a file. See :py:meth:`ConfigSet.load` for reading such files. :param filename: file to use :type filename: string """ try: os.makedirs(os.path.split(filename)[0]) except OSError: pass f = None try: f = open(filename, 'w') merged_table = self.get_merged_dict() keys = list(merged_table.keys()) keys.sort() for k in keys: if k != 'undo_stack': f.write('%s = %r\n' % (k, merged_table[k])) finally: if f: f.close() def load(self, filename): """ Retrieve the :py:class:`ConfigSet` data from a file. See :py:meth:`ConfigSet.store` for writing such files :param filename: file to use :type filename: string """ tbl = self.table code = Utils.readf(filename) for m in re_imp.finditer(code): g = m.group tbl[g(2)] = eval(g(3)) Logs.debug('env: %s' % str(self.table)) def update(self, d): """ Dictionary interface: replace values from another dict :param d: object to use the value from :type d: dict-like object """ for k, v in d.items(): self[k] = v def stash(self): """ Store the object state, to provide a kind of transaction support:: env = ConfigSet() env.stash() try: env.append_value('CFLAGS', '-O3') call_some_method(env) finally: env.revert() The history is kept in a stack, and is lost during the serialization by :py:meth:`ConfigSet.store` """ self.undo_stack = self.undo_stack + [self.table] self.table = self.table.copy() def revert(self): """ Reverts the object to a previous state. See :py:meth:`ConfigSet.stash` """ self.table = self.undo_stack.pop(-1) kupfer-v208/waflib/Configure.py000066400000000000000000000372151176220042200166120ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) """ Configuration system A :py:class:`waflib.Configure.ConfigurationContext` instance is created when ``waf configure`` is called, it is used to: * create data dictionaries (ConfigSet instances) * store the list of modules to import * hold configuration routines such as ``find_program``, etc """ import os, shlex, sys, time from waflib import ConfigSet, Utils, Options, Logs, Context, Build, Errors try: from urllib import request except: from urllib import urlopen else: urlopen = request.urlopen BREAK = 'break' """In case of a configuration error, break""" CONTINUE = 'continue' """In case of a configuration error, continue""" WAF_CONFIG_LOG = 'config.log' """Name of the configuration log file""" autoconfig = False """Execute the configuration automatically""" conf_template = '''# project %(app)s configured on %(now)s by # waf %(wafver)s (abi %(abi)s, python %(pyver)x on %(systype)s) # using %(args)s #''' def download_check(node): """ Hook to check for the tools which are downloaded. Replace with your function if necessary. """ pass def download_tool(tool, force=False, ctx=None): """ Download a Waf tool from the remote repository defined in :py:const:`waflib.Context.remote_repo`:: $ waf configure --download """ for x in Utils.to_list(Context.remote_repo): for sub in Utils.to_list(Context.remote_locs): url = '/'.join((x, sub, tool + '.py')) try: web = urlopen(url) try: if web.getcode() != 200: continue except AttributeError: pass except Exception: # on python3 urlopen throws an exception # python 2.3 does not have getcode and throws an exception to fail continue else: tmp = ctx.root.make_node(os.sep.join((Context.waf_dir, 'waflib', 'extras', tool + '.py'))) tmp.write(web.read()) Logs.warn('Downloaded %s from %s' % (tool, url)) download_check(tmp) try: module = Context.load_tool(tool) except: Logs.warn('The tool %s from %s is unusable' % (tool, url)) try: tmp.delete() except: pass continue return module raise Errors.WafError('Could not load the Waf tool') class ConfigurationContext(Context.Context): '''configures the project''' cmd = 'configure' error_handlers = [] """ Additional functions to handle configuration errors """ def __init__(self, **kw): super(ConfigurationContext, self).__init__(**kw) self.environ = dict(os.environ) self.all_envs = {} self.top_dir = None self.out_dir = None self.tools = [] # tools loaded in the configuration, and that will be loaded when building self.hash = 0 self.files = [] self.tool_cache = [] self.setenv('') def setenv(self, name, env=None): """ Set a new config set for conf.env. If a config set of that name already exists, recall it without modification. The name is the filename prefix to save to ``c4che/NAME_cache.py``, and it is also used as *variants* by the build commands. Though related to variants, whatever kind of data may be stored in the config set:: def configure(cfg): cfg.env.ONE = 1 cfg.setenv('foo') cfg.env.ONE = 2 def build(bld): 2 == bld.env_of_name('foo').ONE :param name: name of the configuration set :type name: string :param env: ConfigSet to copy, or an empty ConfigSet is created :type env: :py:class:`waflib.ConfigSet.ConfigSet` """ if name not in self.all_envs or env: if not env: env = ConfigSet.ConfigSet() self.prepare_env(env) else: env = env.derive() self.all_envs[name] = env self.variant = name def get_env(self): """Getter for the env property""" return self.all_envs[self.variant] def set_env(self, val): """Setter for the env property""" self.all_envs[self.variant] = val env = property(get_env, set_env) def init_dirs(self): """ Initialize the project directory and the build directory """ top = self.top_dir if not top: top = Options.options.top if not top: top = getattr(Context.g_module, Context.TOP, None) if not top: top = self.path.abspath() top = os.path.abspath(top) self.srcnode = (os.path.isabs(top) and self.root or self.path).find_dir(top) assert(self.srcnode) out = self.out_dir if not out: out = Options.options.out if not out: out = getattr(Context.g_module, Context.OUT, None) if not out: out = Options.lockfile.replace('.lock-waf_%s_' % sys.platform, '').replace('.lock-waf', '') self.bldnode = (os.path.isabs(out) and self.root or self.path).make_node(out) self.bldnode.mkdir() if not os.path.isdir(self.bldnode.abspath()): conf.fatal('could not create the build directory %s' % self.bldnode.abspath()) def execute(self): """ See :py:func:`waflib.Context.Context.execute` """ self.init_dirs() self.cachedir = self.bldnode.make_node(Build.CACHE_DIR) self.cachedir.mkdir() path = os.path.join(self.bldnode.abspath(), WAF_CONFIG_LOG) self.logger = Logs.make_logger(path, 'cfg') app = getattr(Context.g_module, 'APPNAME', '') if app: ver = getattr(Context.g_module, 'VERSION', '') if ver: app = "%s (%s)" % (app, ver) now = time.ctime() pyver = sys.hexversion systype = sys.platform args = " ".join(sys.argv) wafver = Context.WAFVERSION abi = Context.ABI self.to_log(conf_template % vars()) self.msg('Setting top to', self.srcnode.abspath()) self.msg('Setting out to', self.bldnode.abspath()) if id(self.srcnode) == id(self.bldnode): Logs.warn('Setting top == out (remember to use "update_outputs")') elif id(self.path) != id(self.srcnode): if self.srcnode.is_child_of(self.path): Logs.warn('Are you certain that you do not want to set top="." ?') super(ConfigurationContext, self).execute() self.store() Context.top_dir = self.srcnode.abspath() Context.out_dir = self.bldnode.abspath() # this will write a configure lock so that subsequent builds will # consider the current path as the root directory (see prepare_impl). # to remove: use 'waf distclean' env = ConfigSet.ConfigSet() env['argv'] = sys.argv env['options'] = Options.options.__dict__ env.run_dir = Context.run_dir env.top_dir = Context.top_dir env.out_dir = Context.out_dir # conf.hash & conf.files hold wscript files paths and hash # (used only by Configure.autoconfig) env['hash'] = self.hash env['files'] = self.files env['environ'] = dict(self.environ) if not self.env.NO_LOCK_IN_RUN: env.store(Context.run_dir + os.sep + Options.lockfile) if not self.env.NO_LOCK_IN_TOP: env.store(Context.top_dir + os.sep + Options.lockfile) if not self.env.NO_LOCK_IN_OUT: env.store(Context.out_dir + os.sep + Options.lockfile) def prepare_env(self, env): """ Insert *PREFIX*, *BINDIR* and *LIBDIR* values into ``env`` :type env: :py:class:`waflib.ConfigSet.ConfigSet` :param env: a ConfigSet, usually ``conf.env`` """ if not env.PREFIX: env.PREFIX = os.path.abspath(os.path.expanduser(Options.options.prefix)) if not env.BINDIR: env.BINDIR = Utils.subst_vars('${PREFIX}/bin', env) if not env.LIBDIR: env.LIBDIR = Utils.subst_vars('${PREFIX}/lib', env) def store(self): """Save the config results into the cache file""" n = self.cachedir.make_node('build.config.py') n.write('version = 0x%x\ntools = %r\n' % (Context.HEXVERSION, self.tools)) if not self.all_envs: self.fatal('nothing to store in the configuration context!') for key in self.all_envs: tmpenv = self.all_envs[key] tmpenv.store(os.path.join(self.cachedir.abspath(), key + Build.CACHE_SUFFIX)) def load(self, input, tooldir=None, funs=None, download=True): """ Load Waf tools, which will be imported whenever a build is started. :param input: waf tools to import :type input: list of string :param tooldir: paths for the imports :type tooldir: list of string :param funs: functions to execute from the waf tools :type funs: list of string :param download: whether to download the tool from the waf repository :type download: bool """ tools = Utils.to_list(input) if tooldir: tooldir = Utils.to_list(tooldir) for tool in tools: # avoid loading the same tool more than once with the same functions # used by composite projects mag = (tool, id(self.env), funs) if mag in self.tool_cache: self.to_log('(tool %s is already loaded, skipping)' % tool) continue self.tool_cache.append(mag) module = None try: module = Context.load_tool(tool, tooldir) except ImportError as e: if Options.options.download: module = download_tool(tool, ctx=self) if not module: self.fatal('Could not load the Waf tool %r or download a suitable replacement from the repository (sys.path %r)\n%s' % (tool, sys.path, e)) else: self.fatal('Could not load the Waf tool %r from %r (try the --download option?):\n%s' % (tool, sys.path, e)) except Exception as e: self.to_log('imp %r (%r & %r)' % (tool, tooldir, funs)) self.to_log(Utils.ex_stack()) raise if funs is not None: self.eval_rules(funs) else: func = getattr(module, 'configure', None) if func: if type(func) is type(Utils.readf): func(self) else: self.eval_rules(func) self.tools.append({'tool':tool, 'tooldir':tooldir, 'funs':funs}) def post_recurse(self, node): """ Records the path and a hash of the scripts visited, see :py:meth:`waflib.Context.Context.post_recurse` :param node: script :type node: :py:class:`waflib.Node.Node` """ super(ConfigurationContext, self).post_recurse(node) self.hash = hash((self.hash, node.read('rb'))) self.files.append(node.abspath()) def eval_rules(self, rules): """ Execute the configuration tests. The method :py:meth:`waflib.Configure.ConfigurationContext.err_handler` is used to process the eventual exceptions :param rules: list of configuration method names :type rules: list of string """ self.rules = Utils.to_list(rules) for x in self.rules: f = getattr(self, x) if not f: self.fatal("No such method '%s'." % x) try: f() except Exception as e: ret = self.err_handler(x, e) if ret == BREAK: break elif ret == CONTINUE: continue else: raise def err_handler(self, fun, error): """ Error handler for the configuration tests, the default is to let the exception raise :param fun: configuration test :type fun: method :param error: exception :type error: exception """ pass def conf(f): """ Decorator: attach new configuration functions to :py:class:`waflib.Build.BuildContext` and :py:class:`waflib.Configure.ConfigurationContext`. The methods bound will accept a parameter named 'mandatory' to disable the configuration errors:: def configure(conf): conf.find_program('abc', mandatory=False) :param f: method to bind :type f: function """ def fun(*k, **kw): mandatory = True if 'mandatory' in kw: mandatory = kw['mandatory'] del kw['mandatory'] try: return f(*k, **kw) except Errors.ConfigurationError as e: if mandatory: raise e setattr(ConfigurationContext, f.__name__, fun) setattr(Build.BuildContext, f.__name__, fun) return f @conf def add_os_flags(self, var, dest=None): """ Import operating system environment values into ``conf.env`` dict:: def configure(conf): conf.add_os_flags('CFLAGS') :param var: variable to use :type var: string :param dest: destination variable, by default the same as var :type dest: string """ # do not use 'get' to make certain the variable is not defined try: self.env.append_value(dest or var, shlex.split(self.environ[var])) except KeyError: pass @conf def cmd_to_list(self, cmd): """ Detect if a command is written in pseudo shell like ``ccache g++`` and return a list. :param cmd: command :type cmd: a string or a list of string """ if isinstance(cmd, str) and cmd.find(' '): try: os.stat(cmd) except OSError: return shlex.split(cmd) else: return [cmd] return cmd @conf def check_waf_version(self, mini='1.6.0', maxi='1.7.0'): """ check for the waf version Versions should be supplied as hex. 0x01000000 means 1.0.0, 0x010408 means 1.4.8, etc. :type mini: number, tuple or string :param mini: Minimum required version :type maxi: number, tuple or string :param maxi: Maximum allowed version """ self.start_msg('Checking for waf version in %s-%s' % (str(mini), str(maxi))) ver = Context.HEXVERSION if Utils.num2ver(mini) > ver: self.fatal('waf version should be at least %r (%r found)' % (Utils.num2ver(mini), ver)) if Utils.num2ver(maxi) < ver: self.fatal('waf version should be at most %r (%r found)' % (Utils.num2ver(maxi), ver)) self.end_msg('ok') @conf def find_file(self, filename, path_list=[]): """ Find a file in a list of paths :param filename: name of the file to search for :param path_list: list of directories to search :return: the first occurrence filename or '' if filename could not be found """ for n in Utils.to_list(filename): for d in Utils.to_list(path_list): p = os.path.join(d, n) if os.path.exists(p): return p self.fatal('Could not find %r' % filename) @conf def find_program(self, filename, **kw): """ Search for a program on the operating system When var is used, you may set os.environ[var] to help find a specific program version, for example:: $ VALAC=/usr/bin/valac_test waf configure :param path_list: paths to use for searching :type param_list: list of string :param var: store the result to conf.env[var], by default use filename.upper() :type var: string :param ext: list of extensions for the binary (do not add an extension for portability) :type ext: list of string """ exts = kw.get('exts', Utils.is_win32 and '.exe,.com,.bat,.cmd' or ',.sh,.pl,.py') environ = kw.get('environ', os.environ) ret = '' filename = Utils.to_list(filename) var = kw.get('var', '') if not var: var = filename[0].upper() if self.env[var]: ret = self.env[var] elif var in environ: ret = environ[var] path_list = kw.get('path_list', '') if not ret: if path_list: path_list = Utils.to_list(path_list) else: path_list = environ.get('PATH', '').split(os.pathsep) if not isinstance(filename, list): filename = [filename] for a in exts.split(','): if ret: break for b in filename: if ret: break for c in path_list: if ret: break x = os.path.expanduser(os.path.join(c, b + a)) if os.path.isfile(x): ret = x if not ret and Utils.winreg: ret = Utils.get_registry_app_path(Utils.winreg.HKEY_CURRENT_USER, filename) if not ret and Utils.winreg: ret = Utils.get_registry_app_path(Utils.winreg.HKEY_LOCAL_MACHINE, filename) self.msg('Checking for program ' + ','.join(filename), ret or False) self.to_log('find program=%r paths=%r var=%r -> %r' % (filename, path_list, var, ret)) if not ret: self.fatal(kw.get('errmsg', '') or 'Could not find the program %s' % ','.join(filename)) if var: self.env[var] = ret return ret @conf def find_perl_program(self, filename, path_list=[], var=None, environ=None, exts=''): """ Search for a perl program on the operating system :param filename: file to search for :type filename: string :param path_list: list of paths to look into :type path_list: list of string :param var: store the results into *conf.env.var* :type var: string :param environ: operating system environment to pass to :py:func:`waflib.Configure.find_program` :type environ: dict :param exts: extensions given to :py:func:`waflib.Configure.find_program` :type exts: list """ try: app = self.find_program(filename, path_list=path_list, var=var, environ=environ, exts=exts) except: self.find_program('perl', var='PERL') app = self.find_file(filename, os.environ['PATH'].split(os.pathsep)) if not app: raise if var: self.env[var] = Utils.to_list(self.env['PERL']) + [app] self.msg('Checking for %r' % filename, app) kupfer-v208/waflib/Context.py000066400000000000000000000376641176220042200163250ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2010 (ita) """ Classes and functions required for waf commands """ import os, imp, sys from waflib import Utils, Errors, Logs import waflib.Node # the following 3 constants are updated on each new release (do not touch) HEXVERSION=0x1060b00 """Constant updated on new releases""" WAFVERSION="1.6.11" """Constant updated on new releases""" WAFREVISION="a7e69d6b81b04729804754c4d5214da063779a65" """Constant updated on new releases""" ABI = 98 """Version of the build data cache file format (used in :py:const:`waflib.Context.DBFILE`)""" DBFILE = '.wafpickle-%d' % ABI """Name of the pickle file for storing the build data""" APPNAME = 'APPNAME' """Default application name (used by ``waf dist``)""" VERSION = 'VERSION' """Default application version (used by ``waf dist``)""" TOP = 'top' """The variable name for the top-level directory in wscript files""" OUT = 'out' """The variable name for the output directory in wscript files""" WSCRIPT_FILE = 'wscript' """Name of the waf script files""" launch_dir = '' """Directory from which waf has been called""" run_dir = '' """Location of the wscript file to use as the entry point""" top_dir = '' """Location of the project directory (top), if the project was configured""" out_dir = '' """Location of the build directory (out), if the project was configured""" waf_dir = '' """Directory containing the waf modules""" local_repo = '' """Local repository containing additional Waf tools (plugins)""" remote_repo = 'http://waf.googlecode.com/git/' """ Remote directory containing downloadable waf tools. The missing tools can be downloaded by using:: $ waf configure --download """ remote_locs = ['waflib/extras', 'waflib/Tools'] """ Remote directories for use with :py:const:`waflib.Context.remote_repo` """ g_module = None """ Module representing the main wscript file (see :py:const:`waflib.Context.run_dir`) """ STDOUT = 1 STDERR = -1 BOTH = 0 classes = [] """ List of :py:class:`waflib.Context.Context` subclasses that can be used as waf commands. The classes are added automatically by a metaclass. """ def create_context(cmd_name, *k, **kw): """ Create a new :py:class:`waflib.Context.Context` instance corresponding to the given command. Used in particular by :py:func:`waflib.Scripting.run_command` :param cmd_name: command :type cmd_name: string :param k: arguments to give to the context class initializer :type k: list :param k: keyword arguments to give to the context class initializer :type k: dict """ global classes for x in classes: if x.cmd == cmd_name: return x(*k, **kw) ctx = Context(*k, **kw) ctx.fun = cmd_name return ctx class store_context(type): """ Metaclass for storing the command classes into the list :py:const:`waflib.Context.classes` Context classes must provide an attribute 'cmd' representing the command to execute """ def __init__(cls, name, bases, dict): super(store_context, cls).__init__(name, bases, dict) name = cls.__name__ if name == 'ctx' or name == 'Context': return try: cls.cmd except AttributeError: raise Errors.WafError('Missing command for the context class %r (cmd)' % name) if not getattr(cls, 'fun', None): cls.fun = cls.cmd global classes classes.insert(0, cls) ctx = store_context('ctx', (object,), {}) """Base class for the :py:class:`waflib.Context.Context` classes""" class Context(ctx): """ Default context for waf commands, and base class for new command contexts. Context objects are passed to top-level functions:: def foo(ctx): print(ctx.__class__.__name__) # waflib.Context.Context Subclasses must define the attribute 'cmd': :param cmd: command to execute as in ``waf cmd`` :type cmd: string :param fun: function name to execute when the command is called :type fun: string .. inheritance-diagram:: waflib.Context.Context waflib.Build.BuildContext waflib.Build.InstallContext waflib.Build.UninstallContext waflib.Build.StepContext waflib.Build.ListContext waflib.Configure.ConfigurationContext waflib.Scripting.Dist waflib.Scripting.DistCheck waflib.Build.CleanContext """ errors = Errors """ Shortcut to :py:mod:`waflib.Errors` provided for convenience """ tools = {} """ A cache for modules (wscript files) read by :py:meth:`Context.Context.load` """ def __init__(self, **kw): try: rd = kw['run_dir'] except KeyError: global run_dir rd = run_dir # binds the context to the nodes in use to avoid a context singleton class node_class(waflib.Node.Node): pass self.node_class = node_class self.node_class.__module__ = "waflib.Node" self.node_class.__name__ = "Nod3" self.node_class.ctx = self self.root = self.node_class('', None) self.cur_script = None self.path = self.root.find_dir(rd) self.stack_path = [] self.exec_dict = {'ctx':self, 'conf':self, 'bld':self, 'opt':self} self.logger = None def __hash__(self): """ Return a hash value for storing context objects in dicts or sets. The value is not persistent. :return: hash value :rtype: int """ return id(self) def load(self, tool_list, *k, **kw): """ Load a Waf tool as a module, and try calling the function named :py:const:`waflib.Context.Context.fun` from it. A ``tooldir`` value may be provided as a list of module paths. :type tool_list: list of string or space-separated string :param tool_list: list of Waf tools to use """ tools = Utils.to_list(tool_list) path = Utils.to_list(kw.get('tooldir', '')) for t in tools: module = load_tool(t, path) fun = getattr(module, kw.get('name', self.fun), None) if fun: fun(self) def execute(self): """ Execute the command. Redefine this method in subclasses. """ global g_module self.recurse([os.path.dirname(g_module.root_path)]) def pre_recurse(self, node): """ Method executed immediately before a folder is read by :py:meth:`waflib.Context.Context.recurse`. The node given is set as an attribute ``self.cur_script``, and as the current path ``self.path`` :param node: script :type node: :py:class:`waflib.Node.Node` """ self.stack_path.append(self.cur_script) self.cur_script = node self.path = node.parent def post_recurse(self, node): """ Restore ``self.cur_script`` and ``self.path`` right after :py:meth:`waflib.Context.Context.recurse` terminates. :param node: script :type node: :py:class:`waflib.Node.Node` """ self.cur_script = self.stack_path.pop() if self.cur_script: self.path = self.cur_script.parent def recurse(self, dirs, name=None, mandatory=True, once=True): """ Run user code from the supplied list of directories. The directories can be either absolute, or relative to the directory of the wscript file. The methods :py:meth:`waflib.Context.Context.pre_recurse` and :py:meth:`waflib.Context.Context.post_recurse` are called immediately before and after a script has been executed. :param dirs: List of directories to visit :type dirs: list of string or space-separated string :param name: Name of function to invoke from the wscript :type name: string :param mandatory: whether sub wscript files are required to exist :type mandatory: bool :param once: read the script file once for a particular context :type once: bool """ try: cache = self.recurse_cache except: cache = self.recurse_cache = {} for d in Utils.to_list(dirs): if not os.path.isabs(d): # absolute paths only d = os.path.join(self.path.abspath(), d) WSCRIPT = os.path.join(d, WSCRIPT_FILE) WSCRIPT_FUN = WSCRIPT + '_' + (name or self.fun) node = self.root.find_node(WSCRIPT_FUN) if node and (not once or node not in cache): cache[node] = True self.pre_recurse(node) try: function_code = node.read('rU') exec(compile(function_code, node.abspath(), 'exec'), self.exec_dict) finally: self.post_recurse(node) elif not node: node = self.root.find_node(WSCRIPT) tup = (node, name or self.fun) if node and (not once or tup not in cache): cache[tup] = True self.pre_recurse(node) try: wscript_module = load_module(node.abspath()) user_function = getattr(wscript_module, (name or self.fun), None) if not user_function: if not mandatory: continue raise Errors.WafError('No function %s defined in %s' % (name or self.fun, node.abspath())) user_function(self) finally: self.post_recurse(node) elif not node: if not mandatory: continue raise Errors.WafError('No wscript file in directory %s' % d) def exec_command(self, cmd, **kw): """ Execute a command and return the exit status. If the context has the attribute 'log', capture and log the process stderr/stdout for logging purposes:: def run(tsk): ret = tsk.generator.bld.exec_command('touch foo.txt') return ret Do not confuse this method with :py:meth:`waflib.Context.Context.cmd_and_log` which is used to return the standard output/error values. :param cmd: command argument for subprocess.Popen :param kw: keyword arguments for subprocess.Popen """ subprocess = Utils.subprocess kw['shell'] = isinstance(cmd, str) Logs.debug('runner: %r' % cmd) Logs.debug('runner_env: kw=%s' % kw) try: if self.logger: # warning: may deadlock with a lot of output (subprocess limitation) self.logger.info(cmd) kw['stdout'] = kw['stderr'] = subprocess.PIPE p = subprocess.Popen(cmd, **kw) (out, err) = p.communicate() if out: self.logger.debug('out: %s' % out.decode(sys.stdout.encoding or 'iso8859-1')) if err: self.logger.error('err: %s' % err.decode(sys.stdout.encoding or 'iso8859-1')) return p.returncode else: p = subprocess.Popen(cmd, **kw) return p.wait() except OSError: return -1 def cmd_and_log(self, cmd, **kw): """ Execute a command and return stdout if the execution is successful. An exception is thrown when the exit status is non-0. In that case, both stderr and stdout will be bound to the WafError object:: def configure(conf): out = conf.cmd_and_log(['echo', 'hello'], output=waflib.Context.STDOUT, quiet=waflib.Context.BOTH) (out, err) = conf.cmd_and_log(['echo', 'hello'], output=waflib.Context.BOTH) try: conf.cmd_and_log(['which', 'someapp'], output=waflib.Context.BOTH) except Exception as e: print(e.stdout, e.stderr) :param cmd: args for subprocess.Popen :param kw: keyword arguments for subprocess.Popen """ subprocess = Utils.subprocess kw['shell'] = isinstance(cmd, str) Logs.debug('runner: %r' % cmd) if 'quiet' in kw: quiet = kw['quiet'] del kw['quiet'] else: quiet = None if 'output' in kw: to_ret = kw['output'] del kw['output'] else: to_ret = STDOUT kw['stdout'] = kw['stderr'] = subprocess.PIPE if quiet is None: self.to_log(cmd) try: p = subprocess.Popen(cmd, **kw) (out, err) = p.communicate() except Exception as e: raise Errors.WafError('Execution failure: %s' % str(e), ex=e) if not isinstance(out, str): out = out.decode(sys.stdout.encoding or 'iso8859-1') if not isinstance(err, str): err = err.decode(sys.stdout.encoding or 'iso8859-1') if out and quiet != STDOUT and quiet != BOTH: self.to_log('out: %s' % out) if err and quiet != STDERR and quiet != BOTH: self.to_log('err: %s' % err) if p.returncode: e = Errors.WafError('Command %r returned %r' % (cmd, p.returncode)) e.returncode = p.returncode e.stderr = err e.stdout = out raise e if to_ret == BOTH: return (out, err) elif to_ret == STDERR: return err return out def fatal(self, msg, ex=None): """ Raise a configuration error to interrupt the execution immediately:: def configure(conf): conf.fatal('a requirement is missing') :param msg: message to display :type msg: string :param ex: optional exception object :type ex: exception """ if self.logger: self.logger.info('from %s: %s' % (self.path.abspath(), msg)) try: msg = '%s\n(complete log in %s)' % (msg, self.logger.handlers[0].baseFilename) except: pass raise self.errors.ConfigurationError(msg, ex=ex) def to_log(self, msg): """ Log some information to the logger (if present), or to stderr. If the message is empty, it is not printed:: def build(bld): bld.to_log('starting the build') When in doubt, override this method, or provide a logger on the context class. :param msg: message :type msg: string """ if not msg: return if self.logger: self.logger.info(msg) else: sys.stderr.write(str(msg)) sys.stderr.flush() def msg(self, msg, result, color=None): """ Print a configuration message of the form ``msg: result``. The second part of the message will be in colors. The output can be disabled easly by setting ``in_msg`` to a positive value:: def configure(conf): self.in_msg = 1 conf.msg('Checking for library foo', 'ok') # no output :param msg: message to display to the user :type msg: string :param result: result to display :type result: string or boolean :param color: color to use, see :py:const:`waflib.Logs.colors_lst` :type color: string """ self.start_msg(msg) if not isinstance(color, str): color = result and 'GREEN' or 'YELLOW' self.end_msg(result, color) def start_msg(self, msg): """ Print the beginning of a 'Checking for xxx' message. See :py:meth:`waflib.Context.Context.msg` """ try: if self.in_msg: self.in_msg += 1 return except: self.in_msg = 0 self.in_msg += 1 try: self.line_just = max(self.line_just, len(msg)) except AttributeError: self.line_just = max(40, len(msg)) for x in (self.line_just * '-', msg): self.to_log(x) Logs.pprint('NORMAL', "%s :" % msg.ljust(self.line_just), sep='') def end_msg(self, result, color=None): """Print the end of a 'Checking for' message. See :py:meth:`waflib.Context.Context.msg`""" self.in_msg -= 1 if self.in_msg: return defcolor = 'GREEN' if result == True: msg = 'ok' elif result == False: msg = 'not found' defcolor = 'YELLOW' else: msg = str(result) self.to_log(msg) Logs.pprint(color or defcolor, msg) def load_special_tools(self, var, ban=[]): global waf_dir lst = self.root.find_node(waf_dir).find_node('waflib/extras').ant_glob(var) for x in lst: if not x.name in ban: load_tool(x.name.replace('.py', '')) cache_modules = {} """ Dictionary holding already loaded modules, keyed by their absolute path. The modules are added automatically by :py:func:`waflib.Context.load_module` """ def load_module(path): """ Load a source file as a python module. :param path: file path :type path: string :return: Loaded Python module :rtype: module """ try: return cache_modules[path] except KeyError: pass module = imp.new_module(WSCRIPT_FILE) try: code = Utils.readf(path, m='rU') except (IOError, OSError): raise Errors.WafError('Could not read the file %r' % path) module_dir = os.path.dirname(path) sys.path.insert(0, module_dir) exec(compile(code, path, 'exec'), module.__dict__) sys.path.remove(module_dir) cache_modules[path] = module return module def load_tool(tool, tooldir=None): """ Import a Waf tool (python module), and store it in the dict :py:const:`waflib.Context.Context.tools` :type tool: string :param tool: Name of the tool :type tooldir: list :param tooldir: List of directories to search for the tool module """ tool = tool.replace('++', 'xx') tool = tool.replace('java', 'javaw') tool = tool.replace('compiler_cc', 'compiler_c') if tooldir: assert isinstance(tooldir, list) sys.path = tooldir + sys.path try: __import__(tool) ret = sys.modules[tool] Context.tools[tool] = ret return ret finally: for d in tooldir: sys.path.remove(d) else: global waf_dir try: os.stat(os.path.join(waf_dir, 'waflib', 'extras', tool + '.py')) d = 'waflib.extras.%s' % tool except: try: os.stat(os.path.join(waf_dir, 'waflib', 'Tools', tool + '.py')) d = 'waflib.Tools.%s' % tool except: d = tool # user has messed with sys.path __import__(d) ret = sys.modules[d] Context.tools[tool] = ret return ret kupfer-v208/waflib/Errors.py000066400000000000000000000032131176220042200161340ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2010 (ita) """ Exceptions used in the Waf code """ import traceback, sys class WafError(Exception): """Base class for all Waf errors""" def __init__(self, msg='', ex=None): """ :param msg: error message :type msg: string :param ex: exception causing this error (optional) :type ex: exception """ self.msg = msg assert not isinstance(msg, Exception) self.stack = [] if ex: if not msg: self.msg = str(ex) if isinstance(ex, WafError): self.stack = ex.stack else: self.stack = traceback.extract_tb(sys.exc_info()[2]) self.stack += traceback.extract_stack()[:-1] self.verbose_msg = ''.join(traceback.format_list(self.stack)) def __str__(self): return str(self.msg) class BuildError(WafError): """ Errors raised during the build and install phases """ def __init__(self, error_tasks=[]): """ :param error_tasks: tasks that could not complete normally :type error_tasks: list of task objects """ self.tasks = error_tasks WafError.__init__(self, self.format_error()) def format_error(self): """format the error messages from the tasks that failed""" lst = ['Build failed'] for tsk in self.tasks: txt = tsk.format_error() if txt: lst.append(txt) return '\n'.join(lst) class ConfigurationError(WafError): """ Configuration exception raised in particular by :py:meth:`waflib.Context.Context.fatal` """ pass class TaskRescan(WafError): """task-specific exception type, trigger a signature recomputation""" pass class TaskNotReady(WafError): """task-specific exception type, raised when the task signature cannot be computed""" pass kupfer-v208/waflib/Logs.py000066400000000000000000000143571176220042200155770ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) """ logging, colors, terminal width and pretty-print """ import os, re, traceback, sys _nocolor = os.environ.get('NOCOLOR', 'no') not in ('no', '0', 'false') try: if not _nocolor: import waflib.ansiterm except: # optional module for colors on win32, just ignore if it cannot be imported pass import logging # do it after LOG_FORMAT = "%(asctime)s %(c1)s%(zone)s%(c2)s %(message)s" HOUR_FORMAT = "%H:%M:%S" zones = '' verbose = 0 colors_lst = { 'USE' : True, 'BOLD' :'\x1b[01;1m', 'RED' :'\x1b[01;31m', 'GREEN' :'\x1b[32m', 'YELLOW':'\x1b[33m', 'PINK' :'\x1b[35m', 'BLUE' :'\x1b[01;34m', 'CYAN' :'\x1b[36m', 'NORMAL':'\x1b[0m', 'cursor_on' :'\x1b[?25h', 'cursor_off' :'\x1b[?25l', } got_tty = not os.environ.get('TERM', 'dumb') in ['dumb', 'emacs'] if got_tty: try: got_tty = sys.stderr.isatty() except AttributeError: got_tty = False if (not got_tty and os.environ.get('TERM', 'dumb') != 'msys') or _nocolor: colors_lst['USE'] = False def get_term_cols(): return 80 # If console packages are available, replace the dummy function with a real # implementation try: import struct, fcntl, termios except ImportError: pass else: if got_tty: def get_term_cols_real(): """ Private use only. """ dummy_lines, cols = struct.unpack("HHHH", \ fcntl.ioctl(sys.stderr.fileno(),termios.TIOCGWINSZ , \ struct.pack("HHHH", 0, 0, 0, 0)))[:2] return cols # try the function once to see if it really works try: get_term_cols_real() except: pass else: get_term_cols = get_term_cols_real get_term_cols.__doc__ = """ Get the console width in characters. :return: the number of characters per line :rtype: int """ def get_color(cl): if not colors_lst['USE']: return '' return colors_lst.get(cl, '') class color_dict(object): """attribute-based color access, eg: colors.PINK""" def __getattr__(self, a): return get_color(a) def __call__(self, a): return get_color(a) colors = color_dict() re_log = re.compile(r'(\w+): (.*)', re.M) class log_filter(logging.Filter): """ The waf logs are of the form 'name: message', and can be filtered by 'waf --zones=name'. For example, the following:: from waflib import Logs Logs.debug('test: here is a message') Will be displayed only when executing:: $ waf --zones=test """ def __init__(self, name=None): pass def filter(self, rec): """ filter a record, adding the colors automatically * error: red * warning: yellow :param rec: message to record """ rec.c1 = colors.PINK rec.c2 = colors.NORMAL rec.zone = rec.module if rec.levelno >= logging.INFO: if rec.levelno >= logging.ERROR: rec.c1 = colors.RED elif rec.levelno >= logging.WARNING: rec.c1 = colors.YELLOW else: rec.c1 = colors.GREEN return True m = re_log.match(rec.msg) if m: rec.zone = m.group(1) rec.msg = m.group(2) if zones: return getattr(rec, 'zone', '') in zones or '*' in zones elif not verbose > 2: return False return True class formatter(logging.Formatter): """Simple log formatter which handles colors""" def __init__(self): logging.Formatter.__init__(self, LOG_FORMAT, HOUR_FORMAT) def format(self, rec): """Messages in warning, error or info mode are displayed in color by default""" if rec.levelno >= logging.WARNING or rec.levelno == logging.INFO: try: msg = rec.msg.decode('utf-8') except: msg = rec.msg return '%s%s%s' % (rec.c1, msg, rec.c2) return logging.Formatter.format(self, rec) log = None """global logger for Logs.debug, Logs.error, etc""" def debug(*k, **kw): """ Wrap logging.debug, the output is filtered for performance reasons """ if verbose: k = list(k) k[0] = k[0].replace('\n', ' ') global log log.debug(*k, **kw) def error(*k, **kw): """ Wrap logging.errors, display the origin of the message when '-vv' is set """ global log log.error(*k, **kw) if verbose > 2: st = traceback.extract_stack() if st: st = st[:-1] buf = [] for filename, lineno, name, line in st: buf.append(' File "%s", line %d, in %s' % (filename, lineno, name)) if line: buf.append(' %s' % line.strip()) if buf: log.error("\n".join(buf)) def warn(*k, **kw): """ Wrap logging.warn """ global log log.warn(*k, **kw) def info(*k, **kw): """ Wrap logging.info """ global log log.info(*k, **kw) def init_log(): """ Initialize the loggers globally """ global log log = logging.getLogger('waflib') log.handlers = [] log.filters = [] hdlr = logging.StreamHandler() hdlr.setFormatter(formatter()) log.addHandler(hdlr) log.addFilter(log_filter()) log.setLevel(logging.DEBUG) def make_logger(path, name): """ Create a simple logger, which is often used to redirect the context command output:: from waflib import Logs bld.logger = Logs.make_logger('test.log', 'build') bld.check(header_name='sadlib.h', features='cxx cprogram', mandatory=False) bld.logger = None :param path: file name to write the log output to :type path: string :param name: logger name (loggers are reused) :type name: string """ logger = logging.getLogger(name) hdlr = logging.FileHandler(path, 'w') formatter = logging.Formatter('%(message)s') hdlr.setFormatter(formatter) logger.addHandler(hdlr) logger.setLevel(logging.DEBUG) return logger def make_mem_logger(name, to_log, size=10000): """ Create a memory logger to avoid writing concurrently to the main logger """ from logging.handlers import MemoryHandler logger = logging.getLogger(name) hdlr = MemoryHandler(size, target=to_log) formatter = logging.Formatter('%(message)s') hdlr.setFormatter(formatter) logger.addHandler(hdlr) logger.memhandler = hdlr logger.setLevel(logging.DEBUG) return logger def pprint(col, str, label='', sep='\n'): """ Print messages in color immediately on stderr:: from waflib import Logs Logs.pprint('RED', 'Something bad just happened') :param col: color name to use in :py:const:`Logs.colors_lst` :type col: string :param str: message to display :type str: string or a value that can be printed by %s :param label: a message to add after the colored output :type label: string :param sep: a string to append at the end (line separator) :type sep: string """ sys.stderr.write("%s%s%s %s%s" % (colors(col), str, colors.NORMAL, label, sep)) kupfer-v208/waflib/Node.py000066400000000000000000000472611176220042200155600ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) """ Node: filesystem structure, contains lists of nodes #. Each file/folder is represented by exactly one node. #. Some potential class properties are stored on :py:class:`waflib.Build.BuildContext` : nodes to depend on, etc. Unused class members can increase the `.wafpickle` file size sensibly. #. Node objects should never be created directly, use the methods :py:func:`Node.make_node` or :py:func:`Node.find_node` #. The methods :py:func:`Node.find_resource`, :py:func:`Node.find_dir` :py:func:`Node.find_or_declare` should be used when a build context is present #. Each instance of :py:class:`waflib.Context.Context` has a unique :py:class:`Node` subclass. (:py:class:`waflib.Node.Nod3`, see the :py:class:`waflib.Context.Context` initializer). A reference to the context owning a node is held as self.ctx """ import os, re, sys, shutil from waflib import Utils, Errors exclude_regs = ''' **/*~ **/#*# **/.#* **/%*% **/._* **/CVS **/CVS/** **/.cvsignore **/SCCS **/SCCS/** **/vssver.scc **/.svn **/.svn/** **/BitKeeper **/.git **/.git/** **/.gitignore **/.bzr **/.bzrignore **/.bzr/** **/.hg **/.hg/** **/_MTN **/_MTN/** **/.arch-ids **/{arch} **/_darcs **/_darcs/** **/.DS_Store''' """ Ant patterns for files and folders to exclude while doing the recursive traversal in :py:meth:`waflib.Node.Node.ant_glob` """ # TODO optimize split_path by performing a replacement when unpacking? def split_path(path): """ Split a path by os.sep (This is not os.path.split) :param path: path to split :type path: string :rtype: list of string :return: the path, split """ return path.split('/') def split_path_cygwin(path): if path.startswith('//'): ret = path.split('/')[2:] ret[0] = '/' + ret[0] return ret return path.split('/') re_sp = re.compile('[/\\\\]') def split_path_win32(path): if path.startswith('\\\\'): ret = re.split(re_sp, path)[2:] ret[0] = '\\' + ret[0] return ret return re.split(re_sp, path) if sys.platform == 'cygwin': split_path = split_path_cygwin elif Utils.is_win32: split_path = split_path_win32 class Node(object): """ This class is organized in two parts * The basic methods meant for filesystem access (compute paths, create folders, etc) * The methods bound to a :py:class:`waflib.Build.BuildContext` (require ``bld.srcnode`` and ``bld.bldnode``) The Node objects are not thread safe in any way. """ __slots__ = ('name', 'sig', 'children', 'parent', 'cache_abspath', 'cache_isdir') def __init__(self, name, parent): self.name = name self.parent = parent if parent: if name in parent.children: raise Errors.WafError('node %s exists in the parent files %r already' % (name, parent)) parent.children[name] = self def __setstate__(self, data): "Deserializes from data" self.name = data[0] self.parent = data[1] if data[2] is not None: self.children = data[2] if data[3] is not None: self.sig = data[3] def __getstate__(self): "Serialize the node info" return (self.name, self.parent, getattr(self, 'children', None), getattr(self, 'sig', None)) def __str__(self): "String representation (name), for debugging purposes" return self.name def __repr__(self): "String representation (abspath), for debugging purposes" return self.abspath() def __hash__(self): "Node hash, used for storage in dicts. This hash is not persistent." return id(self) def __eq__(self, node): "Node comparison, based on the IDs" return id(self) == id(node) def __copy__(self): "Implemented to prevent nodes from being copied (raises an exception)" raise Errors.WafError('nodes are not supposed to be copied') def read(self, flags='r'): """ Return the contents of the file represented by this node:: def build(bld): bld.path.find_node('wscript').read() :type fname: string :param fname: Path to file :type m: string :param m: Open mode :rtype: string :return: File contents """ return Utils.readf(self.abspath(), flags) def write(self, data, flags='w'): """ Write some text to the physical file represented by this node:: def build(bld): bld.path.make_node('foo.txt').write('Hello, world!') :type data: string :param data: data to write :type flags: string :param flags: Write mode """ f = None try: f = open(self.abspath(), flags) f.write(data) finally: if f: f.close() def chmod(self, val): """ Change file/dir permissions:: def build(bld): bld.path.chmod(493) # 0755 """ os.chmod(self.abspath(), val) def delete(self): """Delete the file/folder physically (but not the node)""" try: if getattr(self, 'children', None): shutil.rmtree(self.abspath()) else: os.unlink(self.abspath()) except: pass try: delattr(self, 'children') except: pass def suffix(self): """Return the file extension""" k = max(0, self.name.rfind('.')) return self.name[k:] def height(self): """Depth in the folder hierarchy from the filesystem root or from all the file drives""" d = self val = -1 while d: d = d.parent val += 1 return val def listdir(self): """List the folder contents""" lst = Utils.listdir(self.abspath()) lst.sort() return lst def mkdir(self): """ Create a folder represented by this node, creating intermediate nodes as needed An exception will be raised only when the folder cannot possibly exist there """ if getattr(self, 'cache_isdir', None): return try: self.parent.mkdir() except: pass if self.name: try: os.makedirs(self.abspath()) except OSError: pass if not os.path.isdir(self.abspath()): raise Errors.WafError('Could not create the directory %s' % self.abspath()) try: self.children except: self.children = {} self.cache_isdir = True def find_node(self, lst): """ Find a node on the file system (files or folders), create intermediate nodes as needed :param lst: path :type lst: string or list of string """ if isinstance(lst, str): lst = [x for x in split_path(lst) if x and x != '.'] cur = self for x in lst: if x == '..': cur = cur.parent or cur continue try: if x in cur.children: cur = cur.children[x] continue except: cur.children = {} # optimistic: create the node first then look if it was correct to do so cur = self.__class__(x, cur) try: os.stat(cur.abspath()) except: del cur.parent.children[x] return None ret = cur try: os.stat(ret.abspath()) except: del ret.parent.children[ret.name] return None try: while not getattr(cur.parent, 'cache_isdir', None): cur = cur.parent cur.cache_isdir = True except AttributeError: pass return ret def make_node(self, lst): """ Find or create a node without looking on the filesystem :param lst: path :type lst: string or list of string """ if isinstance(lst, str): lst = [x for x in split_path(lst) if x and x != '.'] cur = self for x in lst: if x == '..': cur = cur.parent or cur continue if getattr(cur, 'children', {}): if x in cur.children: cur = cur.children[x] continue else: cur.children = {} cur = self.__class__(x, cur) return cur def search(self, lst): """ Search for a node without looking on the filesystem :param lst: path :type lst: string or list of string """ if isinstance(lst, str): lst = [x for x in split_path(lst) if x and x != '.'] cur = self try: for x in lst: if x == '..': cur = cur.parent or cur else: cur = cur.children[x] return cur except: pass def path_from(self, node): """ Path of this node seen from the other:: def build(bld): n1 = bld.path.find_node('foo/bar/xyz.txt') n2 = bld.path.find_node('foo/stuff/') n1.path_from(n2) # './bar/xyz.txt' :param node: path to use as a reference :type node: :py:class:`waflib.Node.Node` """ c1 = self c2 = node c1h = c1.height() c2h = c2.height() lst = [] up = 0 while c1h > c2h: lst.append(c1.name) c1 = c1.parent c1h -= 1 while c2h > c1h: up += 1 c2 = c2.parent c2h -= 1 while id(c1) != id(c2): lst.append(c1.name) up += 1 c1 = c1.parent c2 = c2.parent for i in range(up): lst.append('..') lst.reverse() return os.sep.join(lst) or '.' def abspath(self): """ Absolute path. A cache is kept in the context as ``cache_node_abspath`` """ try: return self.cache_abspath except: pass # think twice before touching this (performance + complexity + correctness) if os.sep == '/': if not self.parent: val = os.sep elif not self.parent.name: val = os.sep + self.name else: val = self.parent.abspath() + os.sep + self.name else: if not self.parent: val = '' elif not self.parent.name: val = self.name + os.sep else: val = self.parent.abspath().rstrip(os.sep) + os.sep + self.name self.cache_abspath = val return val def is_child_of(self, node): """ Does this node belong to the subtree node?:: def build(bld): node = bld.path.find_node('wscript') node.is_child_of(bld.path) # True :param node: path to use as a reference :type node: :py:class:`waflib.Node.Node` """ p = self diff = self.height() - node.height() while diff > 0: diff -= 1 p = p.parent return id(p) == id(node) def ant_iter(self, accept=None, maxdepth=25, pats=[], dir=False, src=True, remove=True): """ Semi-private and recursive method used by ant_glob. :param accept: function used for accepting/rejecting a node, returns the patterns that can be still accepted in recursion :type accept: function :param maxdepth: maximum depth in the filesystem (25) :type maxdepth: int :param pats: list of patterns to accept and list of patterns to exclude :type pats: tuple :param dir: return folders too (False by default) :type dir: bool :param src: return files (True by default) :type src: bool :param remove: remove files/folders that do not exist (True by default) :type remove: bool """ dircont = self.listdir() dircont.sort() try: lst = set(self.children.keys()) if remove: for x in lst - set(dircont): del self.children[x] except: self.children = {} for name in dircont: npats = accept(name, pats) if npats and npats[0]: accepted = [] in npats[0] node = self.make_node([name]) isdir = os.path.isdir(node.abspath()) if accepted: if isdir: if dir: yield node else: if src: yield node if getattr(node, 'cache_isdir', None) or isdir: node.cache_isdir = True if maxdepth: for k in node.ant_iter(accept=accept, maxdepth=maxdepth - 1, pats=npats, dir=dir, src=src, remove=remove): yield k raise StopIteration def ant_glob(self, *k, **kw): """ This method is used for finding files across folders. It behaves like ant patterns: * ``**/*`` find all files recursively * ``**/*.class`` find all files ending by .class * ``..`` find files having two dot characters For example:: def configure(cfg): cfg.path.ant_glob('**/*.cpp') # find all .cpp files cfg.root.ant_glob('etc/*.txt') # using the filesystem root can be slow cfg.path.ant_glob('*.cpp', excl=['*.c'], src=True, dir=False) For more information see http://ant.apache.org/manual/dirtasks.html The nodes that correspond to files and folders that do not exist will be removed. To prevent this behaviour, pass 'remove=False' :param incl: ant patterns or list of patterns to include :type incl: string or list of strings :param excl: ant patterns or list of patterns to exclude :type excl: string or list of strings :param dir: return folders too (False by default) :type dir: bool :param src: return files (True by default) :type src: bool :param remove: remove files/folders that do not exist (True by default) :type remove: bool :param maxdepth: maximum depth of recursion :type maxdepth: int """ src = kw.get('src', True) dir = kw.get('dir', False) excl = kw.get('excl', exclude_regs) incl = k and k[0] or kw.get('incl', '**') def to_pat(s): lst = Utils.to_list(s) ret = [] for x in lst: x = x.replace('\\', '/').replace('//', '/') if x.endswith('/'): x += '**' lst2 = x.split('/') accu = [] for k in lst2: if k == '**': accu.append(k) else: k = k.replace('.', '[.]').replace('*','.*').replace('?', '.').replace('+', '\\+') k = '^%s$' % k try: #print "pattern", k accu.append(re.compile(k)) except Exception as e: raise Errors.WafError("Invalid pattern: %s" % k, e) ret.append(accu) return ret def filtre(name, nn): ret = [] for lst in nn: if not lst: pass elif lst[0] == '**': ret.append(lst) if len(lst) > 1: if lst[1].match(name): ret.append(lst[2:]) else: ret.append([]) elif lst[0].match(name): ret.append(lst[1:]) return ret def accept(name, pats): nacc = filtre(name, pats[0]) nrej = filtre(name, pats[1]) if [] in nrej: nacc = [] return [nacc, nrej] ret = [x for x in self.ant_iter(accept=accept, pats=[to_pat(incl), to_pat(excl)], maxdepth=25, dir=dir, src=src, remove=kw.get('remove', True))] if kw.get('flat', False): return ' '.join([x.path_from(self) for x in ret]) return ret def find_nodes(self, find_dirs=True, find_files=True, match_fun=lambda x: True): # FIXME not part of the stable API: find_node vs find_nodes? consistency with argument names on other functions? x = """ Recursively finds nodes:: def configure(cnf): cnf.find_nodes() :param find_dirs: whether to return directories :param find_files: whether to return files :param match_fun: matching function, taking a node as parameter :rtype generator :return: a generator that iterates over all the requested files """ files = self.listdir() for f in files: node = self.make_node([f]) if os.path.isdir(node.abspath()): if find_dirs and match_fun(node): yield node gen = node.find_nodes(find_dirs, find_files, match_fun) for g in gen: yield g else: if find_files and match_fun(node): yield node # -------------------------------------------------------------------------------- # the following methods require the source/build folders (bld.srcnode/bld.bldnode) # using a subclass is a possibility, but is that really necessary? # -------------------------------------------------------------------------------- def is_src(self): """ True if the node is below the source directory note: !is_src does not imply is_bld() :rtype: bool """ cur = self x = id(self.ctx.srcnode) y = id(self.ctx.bldnode) while cur.parent: if id(cur) == y: return False if id(cur) == x: return True cur = cur.parent return False def is_bld(self): """ True if the node is below the build directory note: !is_bld does not imply is_src :rtype: bool """ cur = self y = id(self.ctx.bldnode) while cur.parent: if id(cur) == y: return True cur = cur.parent return False def get_src(self): """ Return the equivalent src node (or self if not possible) :rtype: :py:class:`waflib.Node.Node` """ cur = self x = id(self.ctx.srcnode) y = id(self.ctx.bldnode) lst = [] while cur.parent: if id(cur) == y: lst.reverse() return self.ctx.srcnode.make_node(lst) if id(cur) == x: return self lst.append(cur.name) cur = cur.parent return self def get_bld(self): """ Return the equivalent bld node (or self if not possible) :rtype: :py:class:`waflib.Node.Node` """ cur = self x = id(self.ctx.srcnode) y = id(self.ctx.bldnode) lst = [] while cur.parent: if id(cur) == y: return self if id(cur) == x: lst.reverse() return self.ctx.bldnode.make_node(lst) lst.append(cur.name) cur = cur.parent # the file is external to the current project, make a fake root in the current build directory lst.reverse() if lst and Utils.is_win32 and len(lst[0]) == 2 and lst[0].endswith(':'): lst[0] = lst[0][0] return self.ctx.bldnode.make_node(['__root__'] + lst) def find_resource(self, lst): """ Try to find a declared build node or a source file :param lst: path :type lst: string or list of string """ if isinstance(lst, str): lst = [x for x in split_path(lst) if x and x != '.'] node = self.get_bld().search(lst) if not node: self = self.get_src() node = self.find_node(lst) try: pat = node.abspath() if os.path.isdir(pat): return None except: pass return node def find_or_declare(self, lst): """ if 'self' is in build directory, try to return an existing node if no node is found, go to the source directory try to find an existing node in the source directory if no node is found, create it in the build directory :param lst: path :type lst: string or list of string """ if isinstance(lst, str): lst = [x for x in split_path(lst) if x and x != '.'] node = self.get_bld().search(lst) if node: if not os.path.isfile(node.abspath()): node.sig = None try: node.parent.mkdir() except: pass return node self = self.get_src() node = self.find_node(lst) if node: if not os.path.isfile(node.abspath()): node.sig = None try: node.parent.mkdir() except: pass return node node = self.get_bld().make_node(lst) node.parent.mkdir() return node def find_dir(self, lst): """ Search for a folder in the filesystem :param lst: path :type lst: string or list of string """ if isinstance(lst, str): lst = [x for x in split_path(lst) if x and x != '.'] node = self.find_node(lst) try: if not os.path.isdir(node.abspath()): return None except (OSError, AttributeError): # the node might be None, and raise an AttributeError return None return node # helpers for building things def change_ext(self, ext, ext_in=None): """ :return: A build node of the same path, but with a different extension :rtype: :py:class:`waflib.Node.Node` """ name = self.name if ext_in is None: k = name.rfind('.') if k >= 0: name = name[:k] + ext else: name = name + ext else: name = name[:- len(ext_in)] + ext return self.parent.find_or_declare([name]) def nice_path(self, env=None): """ Return the path seen from the launch directory. It is often used for printing nodes in the console to open files easily. :param env: unused, left for compatibility with waf 1.5 """ return self.path_from(self.ctx.launch_node()) def bldpath(self): "Path seen from the build directory default/src/foo.cpp" return self.path_from(self.ctx.bldnode) def srcpath(self): "Path seen from the source directory ../src/foo.cpp" return self.path_from(self.ctx.srcnode) def relpath(self): "If a file in the build directory, bldpath, else srcpath" cur = self x = id(self.ctx.bldnode) while cur.parent: if id(cur) == x: return self.bldpath() cur = cur.parent return self.srcpath() def bld_dir(self): "Build path without the file name" return self.parent.bldpath() def bld_base(self): "Build path without the extension: src/dir/foo(.cpp)" s = os.path.splitext(self.name)[0] return self.bld_dir() + os.sep + s def get_bld_sig(self): """ Node signature, assuming the file is in the build directory """ try: ret = self.ctx.hash_cache[id(self)] except KeyError: pass except AttributeError: self.ctx.hash_cache = {} else: return ret if not self.is_bld() or self.ctx.bldnode is self.ctx.srcnode: self.sig = Utils.h_file(self.abspath()) self.ctx.hash_cache[id(self)] = ret = self.sig return ret pickle_lock = Utils.threading.Lock() """Lock mandatory for thread-safe node serialization""" class Nod3(Node): """Mandatory subclass for thread-safe node serialization""" pass # do not remove kupfer-v208/waflib/Options.py000066400000000000000000000171101176220042200163140ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Scott Newton, 2005 (scottn) # Thomas Nagy, 2006-2010 (ita) """ Support for waf command-line options Provides default command-line options, as well as custom ones, used by the ``options`` wscript function. """ import os, tempfile, optparse, sys, re from waflib import Logs, Utils, Context cmds = 'distclean configure build install clean uninstall check dist distcheck'.split() """ Constant representing the default waf commands displayed in:: $ waf --help """ options = {} """ A dictionary representing the command-line options:: $ waf --foo=bar """ commands = [] """ List of commands to execute extracted from the command-line. This list is consumed during the execution, see :py:func:`waflib.Scripting.run_commands`. """ lockfile = os.environ.get('WAFLOCK', '.lock-waf_%s_build' % sys.platform) try: cache_global = os.path.abspath(os.environ['WAFCACHE']) except KeyError: cache_global = '' platform = Utils.unversioned_sys_platform() class opt_parser(optparse.OptionParser): """ Command-line options parser. """ def __init__(self, ctx): optparse.OptionParser.__init__(self, conflict_handler="resolve", version='waf %s (%s)' % (Context.WAFVERSION, Context.WAFREVISION)) self.formatter.width = Logs.get_term_cols() p = self.add_option self.ctx = ctx jobs = ctx.jobs() p('-j', '--jobs', dest='jobs', default=jobs, type='int', help='amount of parallel jobs (%r)' % jobs) p('-k', '--keep', dest='keep', default=0, action='count', help='keep running happily even if errors are found') p('-v', '--verbose', dest='verbose', default=0, action='count', help='verbosity level -v -vv or -vvv [default: 0]') p('--nocache', dest='nocache', default=False, action='store_true', help='ignore the WAFCACHE (if set)') p('--zones', dest='zones', default='', action='store', help='debugging zones (task_gen, deps, tasks, etc)') gr = optparse.OptionGroup(self, 'configure options') self.add_option_group(gr) gr.add_option('-o', '--out', action='store', default='', help='build dir for the project', dest='out') gr.add_option('-t', '--top', action='store', default='', help='src dir for the project', dest='top') default_prefix = os.environ.get('PREFIX') if not default_prefix: if platform == 'win32': d = tempfile.gettempdir() default_prefix = d[0].upper() + d[1:] # win32 preserves the case, but gettempdir does not else: default_prefix = '/usr/local/' gr.add_option('--prefix', dest='prefix', default=default_prefix, help='installation prefix [default: %r]' % default_prefix) gr.add_option('--download', dest='download', default=False, action='store_true', help='try to download the tools if missing') gr = optparse.OptionGroup(self, 'build and install options') self.add_option_group(gr) gr.add_option('-p', '--progress', dest='progress_bar', default=0, action='count', help= '-p: progress bar; -pp: ide output') gr.add_option('--targets', dest='targets', default='', action='store', help='task generators, e.g. "target1,target2"') gr = optparse.OptionGroup(self, 'step options') self.add_option_group(gr) gr.add_option('--files', dest='files', default='', action='store', help='files to process, by regexp, e.g. "*/main.c,*/test/main.o"') default_destdir = os.environ.get('DESTDIR', '') gr = optparse.OptionGroup(self, 'install/uninstall options') self.add_option_group(gr) gr.add_option('--destdir', help='installation root [default: %r]' % default_destdir, default=default_destdir, dest='destdir') gr.add_option('-f', '--force', dest='force', default=False, action='store_true', help='force file installation') def get_usage(self): """ Return the message to print on ``waf --help`` """ cmds_str = {} for cls in Context.classes: if not cls.cmd or cls.cmd == 'options': continue s = cls.__doc__ or '' cmds_str[cls.cmd] = s if Context.g_module: for (k, v) in Context.g_module.__dict__.items(): if k in ['options', 'init', 'shutdown']: continue if type(v) is type(Context.create_context): if v.__doc__ and not k.startswith('_'): cmds_str[k] = v.__doc__ just = 0 for k in cmds_str: just = max(just, len(k)) lst = [' %s: %s' % (k.ljust(just), v) for (k, v) in cmds_str.items()] lst.sort() ret = '\n'.join(lst) return '''waf [commands] [options] Main commands (example: ./waf build -j4) %s ''' % ret class OptionsContext(Context.Context): """ Collect custom options from wscript files and parses the command line. Set the global :py:const:`waflib.Options.commands` and :py:const:`waflib.Options.options` values. """ cmd = 'options' fun = 'options' def __init__(self, **kw): super(OptionsContext, self).__init__(**kw) self.parser = opt_parser(self) """Instance of :py:class:`waflib.Options.opt_parser`""" self.option_groups = {} def jobs(self): """ Find the amount of cpu cores to set the default amount of tasks executed in parallel. At runtime the options can be obtained from :py:const:`waflib.Options.options` :: from waflib.Options import options njobs = options.jobs :return: the amount of cpu cores :rtype: int """ count = int(os.environ.get('JOBS', 0)) if count < 1: if 'NUMBER_OF_PROCESSORS' in os.environ: # on Windows, use the NUMBER_OF_PROCESSORS environment variable count = int(os.environ.get('NUMBER_OF_PROCESSORS', 1)) else: # on everything else, first try the POSIX sysconf values if hasattr(os, 'sysconf_names'): if 'SC_NPROCESSORS_ONLN' in os.sysconf_names: count = int(os.sysconf('SC_NPROCESSORS_ONLN')) elif 'SC_NPROCESSORS_CONF' in os.sysconf_names: count = int(os.sysconf('SC_NPROCESSORS_CONF')) if not count and os.name not in ('nt', 'java'): try: tmp = self.cmd_and_log(['sysctl', '-n', 'hw.ncpu'], quiet=0) except Exception: pass else: if re.match('^[0-9]+$', tmp): count = int(tmp) if count < 1: count = 1 elif count > 1024: count = 1024 return count def add_option(self, *k, **kw): """ Wrapper for optparse.add_option:: def options(ctx): ctx.add_option('-u', '--use', dest='use', default=False, action='store_true', help='a boolean option') """ self.parser.add_option(*k, **kw) def add_option_group(self, *k, **kw): """ Wrapper for optparse.add_option_group:: def options(ctx): ctx.add_option_group('some options') gr.add_option('-u', '--use', dest='use', default=False, action='store_true') """ try: gr = self.option_groups[k[0]] except: gr = self.parser.add_option_group(*k, **kw) self.option_groups[k[0]] = gr return gr def get_option_group(self, opt_str): """ Wrapper for optparse.get_option_group:: def options(ctx): gr = ctx.get_option_group('configure options') gr.add_option('-o', '--out', action='store', default='', help='build dir for the project', dest='out') """ try: return self.option_groups[opt_str] except KeyError: for group in self.parser.option_groups: if group.title == opt_str: return group return None def parse_args(self, _args=None): """ Parse arguments from a list (not bound to the command-line). :param _args: arguments :type _args: list of strings """ global options, commands (options, leftover_args) = self.parser.parse_args(args=_args) commands = leftover_args if options.destdir: options.destdir = os.path.abspath(os.path.expanduser(options.destdir)) if options.verbose >= 1: self.load('errcheck') def execute(self): """ See :py:func:`waflib.Context.Context.execute` """ super(OptionsContext, self).execute() self.parse_args() kupfer-v208/waflib/Runner.py000066400000000000000000000206551176220042200161420ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) """ Runner.py: Task scheduling and execution """ import random, atexit try: from queue import Queue except: from Queue import Queue from waflib import Utils, Task, Errors, Logs GAP = 10 """ Wait for free tasks if there are at least ``GAP * njobs`` in queue """ class TaskConsumer(Utils.threading.Thread): """ Task consumers belong to a pool of workers They wait for tasks in the queue and then use ``task.process(...)`` """ def __init__(self): Utils.threading.Thread.__init__(self) self.ready = Queue() """ Obtain :py:class:`waflib.Task.TaskBase` instances from this queue. """ self.setDaemon(1) self.start() def run(self): """ Loop over the tasks to execute """ try: self.loop() except: pass def loop(self): """ Obtain tasks from :py:attr:`waflib.Runner.TaskConsumer.ready` and call :py:meth:`waflib.Task.TaskBase.process`. If the object is a function, execute it. """ while 1: tsk = self.ready.get() if not isinstance(tsk, Task.TaskBase): tsk(self) else: tsk.process() pool = Queue() """ Pool of task consumer objects """ def get_pool(): """ Obtain a task consumer from :py:attr:`waflib.Runner.pool`. Do not forget to put it back by using :py:func:`waflib.Runner.put_pool` and reset properly (original waiting queue). :rtype: :py:class:`waflib.Runner.TaskConsumer` """ try: return pool.get(False) except: return TaskConsumer() def put_pool(x): """ Return a task consumer to the thread pool :py:attr:`waflib.Runner.pool` :param x: task consumer object :type x: :py:class:`waflib.Runner.TaskConsumer` """ pool.put(x) def _free_resources(): global pool lst = [] while pool.qsize(): lst.append(pool.get()) for x in lst: x.ready.put(None) for x in lst: x.join() pool = None atexit.register(_free_resources) class Parallel(object): """ Schedule the tasks obtained from the build context for execution. """ def __init__(self, bld, j=2): """ The initialization requires a build context reference for computing the total number of jobs. """ self.numjobs = j """ Number of consumers in the pool """ self.bld = bld """ Instance of :py:class:`waflib.Build.BuildContext` """ self.outstanding = [] """List of :py:class:`waflib.Task.TaskBase` that may be ready to be executed""" self.frozen = [] """List of :py:class:`waflib.Task.TaskBase` that cannot be executed immediately""" self.out = Queue(0) """List of :py:class:`waflib.Task.TaskBase` returned by the task consumers""" self.count = 0 """Amount of tasks that may be processed by :py:class:`waflib.Runner.TaskConsumer`""" self.processed = 1 """Amount of tasks processed""" self.stop = False """Error flag to stop the build""" self.error = [] """Tasks that could not be executed""" self.biter = None """Task iterator which must give groups of parallelizable tasks when calling ``next()``""" self.dirty = False """Flag to indicate that tasks have been executed, and that the build cache must be saved (call :py:meth:`waflib.Build.BuildContext.store`)""" def get_next_task(self): """ Obtain the next task to execute. :rtype: :py:class:`waflib.Task.TaskBase` """ if not self.outstanding: return None return self.outstanding.pop(0) def postpone(self, tsk): """ A task cannot be executed at this point, put it in the list :py:attr:`waflib.Runner.Parallel.frozen`. :param tsk: task :type tsk: :py:class:`waflib.Task.TaskBase` """ if random.randint(0, 1): self.frozen.insert(0, tsk) else: self.frozen.append(tsk) def refill_task_list(self): """ Put the next group of tasks to execute in :py:attr:`waflib.Runner.Parallel.outstanding`. """ while self.count > self.numjobs * GAP: self.get_out() while not self.outstanding: if self.count: self.get_out() elif self.frozen: try: cond = self.deadlock == self.processed except: pass else: if cond: msg = 'check the build order for the tasks' for tsk in self.frozen: if not tsk.run_after: msg = 'check the methods runnable_status' break lst = [] for tsk in self.frozen: lst.append('%s\t-> %r' % (repr(tsk), [id(x) for x in tsk.run_after])) raise Errors.WafError('Deadlock detected: %s%s' % (msg, ''.join(lst))) self.deadlock = self.processed if self.frozen: self.outstanding += self.frozen self.frozen = [] elif not self.count: self.outstanding.extend(next(self.biter)) self.total = self.bld.total() break def add_more_tasks(self, tsk): """ Tasks may be added dynamically during the build by binding them to the task :py:attr:`waflib.Task.TaskBase.more_tasks` :param tsk: task :type tsk: :py:attr:`waflib.Task.TaskBase` """ if getattr(tsk, 'more_tasks', None): self.outstanding += tsk.more_tasks self.total += len(tsk.more_tasks) def get_out(self): """ Obtain one task returned from the task consumers, and update the task count. Add more tasks if necessary through :py:attr:`waflib.Runner.Parallel.add_more_tasks`. :rtype: :py:attr:`waflib.Task.TaskBase` """ tsk = self.out.get() if not self.stop: self.add_more_tasks(tsk) self.count -= 1 self.dirty = True return tsk def error_handler(self, tsk): """ Called when a task cannot be executed. The flag :py:attr:`waflib.Runner.Parallel.stop` is set, unless the build is executed with:: $ waf build -k :param tsk: task :type tsk: :py:attr:`waflib.Task.TaskBase` """ if not self.bld.keep: self.stop = True self.error.append(tsk) def add_task(self, tsk): """ Pass a task to a consumer. :param tsk: task :type tsk: :py:attr:`waflib.Task.TaskBase` """ try: self.pool except AttributeError: self.init_task_pool() self.ready.put(tsk) def init_task_pool(self): # lazy creation, and set a common pool for all task consumers pool = self.pool = [get_pool() for i in range(self.numjobs)] self.ready = Queue(0) def setq(consumer): consumer.ready = self.ready for x in pool: x.ready.put(setq) return pool def free_task_pool(self): # return the consumers, setting a different queue for each of them def setq(consumer): consumer.ready = Queue(0) self.out.put(self) try: pool = self.pool except: pass else: for x in pool: self.ready.put(setq) for x in pool: self.get_out() for x in pool: put_pool(x) self.pool = [] def start(self): """ Give tasks to :py:class:`waflib.Runner.TaskConsumer` instances until the build finishes or the ``stop`` flag is set. If only one job is used, then execute the tasks one by one, without consumers. """ self.total = self.bld.total() while not self.stop: self.refill_task_list() # consider the next task tsk = self.get_next_task() if not tsk: if self.count: # tasks may add new ones after they are run continue else: # no tasks to run, no tasks running, time to exit break if tsk.hasrun: # if the task is marked as "run", just skip it self.processed += 1 continue if self.stop: # stop immediately after a failure was detected break try: st = tsk.runnable_status() except Exception: self.processed += 1 # TODO waf 1.7 this piece of code should go in the error_handler tsk.err_msg = Utils.ex_stack() if not self.stop and self.bld.keep: tsk.hasrun = Task.SKIPPED if self.bld.keep == 1: # if -k stop at the first exception, if -kk try to go as far as possible if Logs.verbose > 1 or not self.error: self.error.append(tsk) self.stop = True else: if Logs.verbose > 1: self.error.append(tsk) continue tsk.hasrun = Task.EXCEPTION self.error_handler(tsk) continue if st == Task.ASK_LATER: self.postpone(tsk) elif st == Task.SKIP_ME: self.processed += 1 tsk.hasrun = Task.SKIPPED self.add_more_tasks(tsk) else: # run me: put the task in ready queue tsk.position = (self.processed, self.total) self.count += 1 tsk.master = self self.processed += 1 if self.numjobs == 1: tsk.process() else: self.add_task(tsk) # self.count represents the tasks that have been made available to the consumer threads # collect all the tasks after an error else the message may be incomplete while self.error and self.count: self.get_out() #print loop assert (self.count == 0 or self.stop) # free the task pool, if any self.free_task_pool() kupfer-v208/waflib/Scripting.py000066400000000000000000000347521176220042200166360ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) "Module called for configuring, compiling and installing targets" import os, shutil, traceback, errno, sys, stat from waflib import Utils, Configure, Logs, Options, ConfigSet, Context, Errors, Build, Node build_dir_override = None no_climb_commands = ['configure'] default_cmd = "build" def waf_entry_point(current_directory, version, wafdir): """ This is the main entry point, all Waf execution starts here. :param current_directory: absolute path representing the current directory :type current_directory: string :param version: version number :type version: string :param wafdir: absolute path representing the directory of the waf library :type wafdir: string """ Logs.init_log() if Context.WAFVERSION != version: Logs.error('Waf script %r and library %r do not match (directory %r)' % (version, Context.WAFVERSION, wafdir)) sys.exit(1) if '--version' in sys.argv: Context.run_dir = current_directory ctx = Context.create_context('options') ctx.curdir = current_directory ctx.parse_args() sys.exit(0) Context.waf_dir = wafdir Context.launch_dir = current_directory # if 'configure' is in the commands, do not search any further no_climb = os.environ.get('NOCLIMB', None) if not no_climb: for k in no_climb_commands: if k in sys.argv: no_climb = True break # try to find a lock file (if the project was configured) # at the same time, store the first wscript file seen cur = current_directory while cur: lst = os.listdir(cur) if Options.lockfile in lst: env = ConfigSet.ConfigSet() try: env.load(os.path.join(cur, Options.lockfile)) ino = os.stat(cur)[stat.ST_INO] except Exception: pass else: # check if the folder was not moved for x in [env.run_dir, env.top_dir, env.out_dir]: if Utils.is_win32: if cur == x: load = True break else: # if the filesystem features symlinks, compare the inode numbers try: ino2 = os.stat(x)[stat.ST_INO] except: pass else: if ino == ino2: load = True break else: Logs.warn('invalid lock file in %s' % cur) load = False if load: Context.run_dir = env.run_dir Context.top_dir = env.top_dir Context.out_dir = env.out_dir break if not Context.run_dir: if Context.WSCRIPT_FILE in lst: Context.run_dir = cur next = os.path.dirname(cur) if next == cur: break cur = next if no_climb: break if not Context.run_dir: if '-h' in sys.argv or '--help' in sys.argv: Logs.warn('No wscript file found: the help message may be incomplete') Context.run_dir = current_directory ctx = Context.create_context('options') ctx.curdir = current_directory ctx.parse_args() sys.exit(0) Logs.error('Waf: Run from a directory containing a file named %r' % Context.WSCRIPT_FILE) sys.exit(1) try: os.chdir(Context.run_dir) except OSError: Logs.error('Waf: The folder %r is unreadable' % Context.run_dir) sys.exit(1) try: set_main_module(Context.run_dir + os.sep + Context.WSCRIPT_FILE) except Errors.WafError as e: Logs.pprint('RED', e.verbose_msg) Logs.error(str(e)) sys.exit(1) except Exception as e: Logs.error('Waf: The wscript in %r is unreadable' % Context.run_dir, e) traceback.print_exc(file=sys.stdout) sys.exit(2) """ import cProfile, pstats cProfile.runctx("import Scripting; Scripting.run_commands()", {}, {}, 'profi.txt') p = pstats.Stats('profi.txt') p.sort_stats('time').print_stats(25) """ try: run_commands() except Errors.WafError as e: if Logs.verbose > 1: Logs.pprint('RED', e.verbose_msg) Logs.error(e.msg) sys.exit(1) except Exception as e: traceback.print_exc(file=sys.stdout) sys.exit(2) except KeyboardInterrupt: Logs.pprint('RED', 'Interrupted') sys.exit(68) #""" def set_main_module(file_path): """ Read the main wscript file into :py:const:`waflib.Context.Context.g_module` and bind default functions such as ``init``, ``dist``, ``distclean`` if not defined. Called by :py:func:`waflib.Scripting.waf_entry_point` during the initialization. :param file_path: absolute path representing the top-level wscript file :type file_path: string """ Context.g_module = Context.load_module(file_path) Context.g_module.root_path = file_path # note: to register the module globally, use the following: # sys.modules['wscript_main'] = g_module def set_def(obj): name = obj.__name__ if not name in Context.g_module.__dict__: setattr(Context.g_module, name, obj) for k in [update, dist, distclean, distcheck, update]: set_def(k) # add dummy init and shutdown functions if they're not defined if not 'init' in Context.g_module.__dict__: Context.g_module.init = Utils.nada if not 'shutdown' in Context.g_module.__dict__: Context.g_module.shutdown = Utils.nada if not 'options' in Context.g_module.__dict__: Context.g_module.options = Utils.nada def parse_options(): """ Parse the command-line options and initialize the logging system. Called by :py:func:`waflib.Scripting.waf_entry_point` during the initialization. """ Context.create_context('options').execute() if not Options.commands: Options.commands = [default_cmd] Options.commands = [x for x in Options.commands if x != 'options'] # issue 1076 # process some internal Waf options Logs.verbose = Options.options.verbose Logs.init_log() if Options.options.zones: Logs.zones = Options.options.zones.split(',') if not Logs.verbose: Logs.verbose = 1 elif Logs.verbose > 0: Logs.zones = ['runner'] if Logs.verbose > 2: Logs.zones = ['*'] def run_command(cmd_name): """ Execute a single command. Called by :py:func:`waflib.Scripting.run_commands`. :param cmd_name: command to execute, like ``build`` :type cmd_name: string """ ctx = Context.create_context(cmd_name) ctx.options = Options.options # provided for convenience ctx.cmd = cmd_name ctx.execute() return ctx def run_commands(): """ Execute the commands that were given on the command-line, and the other options Called by :py:func:`waflib.Scripting.waf_entry_point` during the initialization, and executed after :py:func:`waflib.Scripting.parse_options`. """ parse_options() run_command('init') while Options.commands: cmd_name = Options.commands.pop(0) timer = Utils.Timer() run_command(cmd_name) if not Options.options.progress_bar: elapsed = ' (%s)' % str(timer) Logs.info('%r finished successfully%s' % (cmd_name, elapsed)) run_command('shutdown') ########################################################################################### def _can_distclean(name): # WARNING: this method may disappear anytime for k in '.o .moc .exe'.split(): if name.endswith(k): return True return False def distclean_dir(dirname): """ Distclean function called in the particular case when:: top == out :param dirname: absolute path of the folder to clean :type dirname: string """ for (root, dirs, files) in os.walk(dirname): for f in files: if _can_distclean(f): fname = root + os.sep + f try: os.unlink(fname) except: Logs.warn('could not remove %r' % fname) for x in [Context.DBFILE, 'config.log']: try: os.unlink(x) except: pass try: shutil.rmtree('c4che') except: pass def distclean(ctx): '''removes the build directory''' lst = os.listdir('.') for f in lst: if f == Options.lockfile: try: proj = ConfigSet.ConfigSet(f) except: Logs.warn('could not read %r' % f) continue if proj['out_dir'] != proj['top_dir']: try: shutil.rmtree(proj['out_dir']) except IOError: pass except OSError as e: if e.errno != errno.ENOENT: Logs.warn('project %r cannot be removed' % proj[Context.OUT]) else: distclean_dir(proj['out_dir']) for k in (proj['out_dir'], proj['top_dir'], proj['run_dir']): try: os.remove(os.path.join(k, Options.lockfile)) except OSError as e: if e.errno != errno.ENOENT: Logs.warn('file %r cannot be removed' % f) # remove the local waf cache if f.startswith('.waf') and not Options.commands: shutil.rmtree(f, ignore_errors=True) class Dist(Context.Context): """ Create an archive containing the project source code:: $ waf dist """ cmd = 'dist' fun = 'dist' algo = 'tar.bz2' ext_algo = {} def execute(self): """ See :py:func:`waflib.Context.Context.execute` """ self.recurse([os.path.dirname(Context.g_module.root_path)]) self.archive() def archive(self): """ Create the archive. """ import tarfile arch_name = self.get_arch_name() try: self.base_path except: self.base_path = self.path node = self.base_path.make_node(arch_name) try: node.delete() except: pass files = self.get_files() if self.algo.startswith('tar.'): tar = tarfile.open(arch_name, 'w:' + self.algo.replace('tar.', '')) for x in files: self.add_tar_file(x, tar) tar.close() elif self.algo == 'zip': import zipfile zip = zipfile.ZipFile(arch_name, 'w', compression=zipfile.ZIP_DEFLATED) for x in files: archive_name = self.get_base_name() + '/' + x.path_from(self.base_path) zip.write(x.abspath(), archive_name, zipfile.ZIP_DEFLATED) zip.close() else: self.fatal('Valid algo types are tar.bz2, tar.gz or zip') try: from hashlib import sha1 as sha except ImportError: from sha import sha try: digest = " (sha=%r)" % sha(node.read()).hexdigest() except: digest = '' Logs.info('New archive created: %s%s' % (self.arch_name, digest)) def get_tar_path(self, node): """ return the path to use for a node in the tar archive, the purpose of this is to let subclases resolve symbolic links or to change file names """ return node.abspath() def add_tar_file(self, x, tar): """ Add a file to the tar archive. Transform symlinks into files if the files lie out of the project tree. """ p = self.get_tar_path(x) tinfo = tar.gettarinfo(name=p, arcname=self.get_tar_prefix() + '/' + x.path_from(self.base_path)) tinfo.uid = 0 tinfo.gid = 0 tinfo.uname = 'root' tinfo.gname = 'root' fu = None try: fu = open(p, 'rb') tar.addfile(tinfo, fileobj=fu) finally: if fu: fu.close() def get_tar_prefix(self): try: return self.tar_prefix except: return self.get_base_name() def get_arch_name(self): """ Return the name of the archive to create. Change the default value by setting *arch_name*:: def dist(ctx): ctx.arch_name = 'ctx.tar.bz2' :rtype: string """ try: self.arch_name except: self.arch_name = self.get_base_name() + '.' + self.ext_algo.get(self.algo, self.algo) return self.arch_name def get_base_name(self): """ Return the default name of the main directory in the archive, which is set to *appname-version*. Set the attribute *base_name* to change the default value:: def dist(ctx): ctx.base_name = 'files' :rtype: string """ try: self.base_name except: appname = getattr(Context.g_module, Context.APPNAME, 'noname') version = getattr(Context.g_module, Context.VERSION, '1.0') self.base_name = appname + '-' + version return self.base_name def get_excl(self): """ Return the patterns to exclude for finding the files in the top-level directory. Set the attribute *excl* to change the default value:: def dist(ctx): ctx.excl = 'build **/*.o **/*.class' :rtype: string """ try: return self.excl except: self.excl = Node.exclude_regs + ' **/waf-1.6.* **/.waf-1.6* **/waf3-1.6.* **/.waf3-1.6* **/*~ **/*.rej **/*.orig **/*.pyc **/*.pyo **/*.bak **/*.swp **/.lock-w*' nd = self.root.find_node(Context.out_dir) if nd: self.excl += ' ' + nd.path_from(self.base_path) return self.excl def get_files(self): """ The files to package are searched automatically by :py:func:`waflib.Node.Node.ant_glob`. Set *files* to prevent this behaviour:: def dist(ctx): ctx.files = ctx.path.find_node('wscript') The files are searched from the directory 'base_path', to change it, set:: def dist(ctx): ctx.base_path = path :rtype: list of :py:class:`waflib.Node.Node` """ try: files = self.files except: files = self.base_path.ant_glob('**/*', excl=self.get_excl()) return files def dist(ctx): '''makes a tarball for redistributing the sources''' pass class DistCheck(Dist): """ Create an archive of the project, and try to build the project in a temporary directory:: $ waf distcheck """ fun = 'distcheck' cmd = 'distcheck' def execute(self): """ See :py:func:`waflib.Context.Context.execute` """ self.recurse([os.path.dirname(Context.g_module.root_path)]) self.archive() self.check() def check(self): """ Create the archive, uncompress it and try to build the project """ import tempfile, tarfile t = None try: t = tarfile.open(self.get_arch_name()) for x in t: t.extract(x) finally: if t: t.close() instdir = tempfile.mkdtemp('.inst', self.get_base_name()) ret = Utils.subprocess.Popen([sys.argv[0], 'configure', 'install', 'uninstall', '--destdir=' + instdir], cwd=self.get_base_name()).wait() if ret: raise Errors.WafError('distcheck failed with code %i' % ret) if os.path.exists(instdir): raise Errors.WafError('distcheck succeeded, but files were left in %s' % instdir) shutil.rmtree(self.get_base_name()) def distcheck(ctx): '''checks if the project compiles (tarball from 'dist')''' pass def update(ctx): '''updates the plugins from the *waflib/extras* directory''' lst = Options.options.files.split(',') if not lst: lst = [x for x in Utils.listdir(Context.waf_dir + '/waflib/extras') if x.endswith('.py')] for x in lst: tool = x.replace('.py', '') try: Configure.download_tool(tool, force=True, ctx=ctx) except Errors.WafError: Logs.error('Could not find the tool %s in the remote repository' % x) def autoconfigure(execute_method): """ Decorator used to set the commands that can be configured automatically """ def execute(self): if not Configure.autoconfig: return execute_method(self) env = ConfigSet.ConfigSet() do_config = False try: env.load(os.path.join(Context.top_dir, Options.lockfile)) except Exception: Logs.warn('Configuring the project') do_config = True else: if env.run_dir != Context.run_dir: do_config = True else: h = 0 for f in env['files']: h = hash((h, Utils.readf(f, 'rb'))) do_config = h != env.hash if do_config: Options.commands.insert(0, self.cmd) Options.commands.insert(0, 'configure') return return execute_method(self) return execute Build.BuildContext.execute = autoconfigure(Build.BuildContext.execute) kupfer-v208/waflib/Task.py000066400000000000000000001024011176220042200155610ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) """ Tasks represent atomic operations such as processes. """ import os, shutil, re, tempfile from waflib import Utils, Logs, Errors # task states NOT_RUN = 0 """The task was not executed yet""" MISSING = 1 """The task has been executed but the files have not been created""" CRASHED = 2 """The task execution returned a non-zero exit status""" EXCEPTION = 3 """An exception occured in the task execution""" SKIPPED = 8 """The task did not have to be executed""" SUCCESS = 9 """The task was successfully executed""" ASK_LATER = -1 """The task is not ready to be executed""" SKIP_ME = -2 """The task does not need to be executed""" RUN_ME = -3 """The task must be executed""" COMPILE_TEMPLATE_SHELL = ''' def f(tsk): env = tsk.env gen = tsk.generator bld = gen.bld wd = getattr(tsk, 'cwd', None) p = env.get_flat tsk.last_cmd = cmd = \'\'\' %s \'\'\' % s return tsk.exec_command(cmd, cwd=wd, env=env.env or None) ''' COMPILE_TEMPLATE_NOSHELL = ''' def f(tsk): env = tsk.env gen = tsk.generator bld = gen.bld wd = getattr(tsk, 'cwd', None) def to_list(xx): if isinstance(xx, str): return [xx] return xx tsk.last_cmd = lst = [] %s lst = [x for x in lst if x] return tsk.exec_command(lst, cwd=wd, env=env.env or None) ''' def cache_outputs(cls): """ Task class decorator applied to all task classes by default unless they define the attribute 'nocache':: from waflib import Task class foo(Task.Task): nocache = True If bld.cache_global is defined and if the task instances produces output nodes, the files will be copied into a folder in the cache directory The files may also be retrieved from that folder, if it exists """ m1 = cls.run def run(self): bld = self.generator.bld if bld.cache_global and not bld.nocache: if self.can_retrieve_cache(): return 0 return m1(self) cls.run = run m2 = cls.post_run def post_run(self): bld = self.generator.bld ret = m2(self) if bld.cache_global and not bld.nocache: self.put_files_cache() return ret cls.post_run = post_run return cls classes = {} "class tasks created by user scripts or Waf tools are kept in this dict name -> class object" class store_task_type(type): """ Metaclass: store the task types into :py:const:`waflib.Task.classes`. The attribute 'run_str' will be processed to compute a method 'run' on the task class The decorator :py:func:`waflib.Task.cache_outputs` is also applied to the class """ def __init__(cls, name, bases, dict): super(store_task_type, cls).__init__(name, bases, dict) name = cls.__name__ if name.endswith('_task'): name = name.replace('_task', '') if name != 'evil' and name != 'TaskBase': global classes if getattr(cls, 'run_str', None): # if a string is provided, convert it to a method (f, dvars) = compile_fun(cls.run_str, cls.shell) cls.hcode = cls.run_str cls.run_str = None cls.run = f cls.vars = list(set(cls.vars + dvars)) cls.vars.sort() elif getattr(cls, 'run', None) and not 'hcode' in cls.__dict__: # getattr(cls, 'hcode') would look in the upper classes cls.hcode = Utils.h_fun(cls.run) if not getattr(cls, 'nocache', None): cls = cache_outputs(cls) classes[name] = cls evil = store_task_type('evil', (object,), {}) "Base class provided to avoid writing a metaclass, so the code can run in python 2.6 and 3.x unmodified" class TaskBase(evil): """ Base class for all Waf tasks, which should be seen as an interface. For illustration purposes, instances of this class will execute the attribute 'fun' in :py:meth:`waflib.Task.TaskBase.run`. When in doubt, create subclasses of :py:class:`waflib.Task.Task` instead. Subclasses should override these methods: #. __str__: string to display to the user #. runnable_status: ask the task if it should be run, skipped, or if we have to ask later #. run: let threads execute the task #. post_run: let threads update the data regarding the task (cache) """ color = 'GREEN' """Color for the console display, see :py:const:`waflib.Logs.colors_lst`""" ext_in = [] """File extensions that objects of this task class might use""" ext_out = [] """File extensions that objects of this task class might create""" before = [] """List of task class names to execute before instances of this class""" after = [] """List of task class names to execute after instances of this class""" hcode = '' """String representing an additional hash for the class representation""" def __init__(self, *k, **kw): """ The base task class requires a task generator, which will be itself if missing """ self.hasrun = NOT_RUN try: self.generator = kw['generator'] except KeyError: self.generator = self def __repr__(self): "for debugging purposes" return '\n\t{task %r: %s %s}' % (self.__class__.__name__, id(self), str(getattr(self, 'fun', ''))) def __str__(self): "string to display to the user" if hasattr(self, 'fun'): return 'executing: %s\n' % self.fun.__name__ return self.__class__.__name__ + '\n' def __hash__(self): "Very fast hashing scheme but not persistent (replace/implement in subclasses and see :py:meth:`waflib.Task.Task.uid`)" return id(self) def exec_command(self, cmd, **kw): """ Wrapper for :py:meth:`waflib.Context.Context.exec_command` which sets a current working directory to ``build.variant_dir`` :return: the return code :rtype: int """ bld = self.generator.bld try: if not kw.get('cwd', None): kw['cwd'] = bld.cwd except AttributeError: bld.cwd = kw['cwd'] = bld.variant_dir return bld.exec_command(cmd, **kw) def runnable_status(self): """ State of the task :return: a task state in :py:const:`waflib.Task.RUN_ME`, :py:const:`waflib.Task.SKIP_ME` or :py:const:`waflib.Task.ASK_LATER`. :rtype: int """ return RUN_ME def process(self): """ Assume that the task has had a new attribute ``master`` which is an instance of :py:class:`waflib.Runner.Parallel`. Execute the task and then put it back in the queue :py:attr:`waflib.Runner.Parallel.out` (may be replaced by subclassing). """ m = self.master if m.stop: m.out.put(self) return # remove the task signature immediately before it is executed # in case of failure the task will be executed again try: del self.generator.bld.task_sigs[self.uid()] except: pass try: self.generator.bld.returned_tasks.append(self) self.log_display(self.generator.bld) ret = self.run() except Exception: self.err_msg = Utils.ex_stack() self.hasrun = EXCEPTION # TODO cleanup m.error_handler(self) m.out.put(self) return if ret: self.err_code = ret self.hasrun = CRASHED else: try: self.post_run() except Errors.WafError: pass except Exception: self.err_msg = Utils.ex_stack() self.hasrun = EXCEPTION else: self.hasrun = SUCCESS if self.hasrun != SUCCESS: m.error_handler(self) m.out.put(self) def run(self): """ Called by threads to execute the tasks. The default is empty and meant to be overridden in subclasses. It is a bad idea to create nodes in this method (so, no node.ant_glob) :rtype: int """ if hasattr(self, 'fun'): return self.fun(self) return 0 def post_run(self): "Update the cache files (executed by threads). Override in subclasses." pass def log_display(self, bld): "Write the execution status on the context logger" bld.to_log(self.display()) def display(self): """ Return an execution status for the console, the progress bar, or the IDE output. :rtype: string """ col1 = Logs.colors(self.color) col2 = Logs.colors.NORMAL master = self.master def cur(): # the current task position, computed as late as possible tmp = -1 if hasattr(master, 'ready'): tmp -= master.ready.qsize() return master.processed + tmp if self.generator.bld.progress_bar == 1: return self.generator.bld.progress_line(cur(), master.total, col1, col2) if self.generator.bld.progress_bar == 2: ela = str(self.generator.bld.timer) try: ins = ','.join([n.name for n in self.inputs]) except AttributeError: ins = '' try: outs = ','.join([n.name for n in self.outputs]) except AttributeError: outs = '' return '|Total %s|Current %s|Inputs %s|Outputs %s|Time %s|\n' % (master.total, cur(), ins, outs, ela) s = str(self) if not s: return None total = master.total n = len(str(total)) fs = '[%%%dd/%%%dd] %%s%%s%%s' % (n, n) return fs % (cur(), total, col1, s, col2) def attr(self, att, default=None): """ Retrieve an attribute from the instance or from the class. :param att: variable name :type att: string :param default: default value """ ret = getattr(self, att, self) if ret is self: return getattr(self.__class__, att, default) return ret def hash_constraints(self): """ Identify a task type for all the constraints relevant for the scheduler: precedence, file production :return: a hash value :rtype: string """ cls = self.__class__ tup = (str(cls.before), str(cls.after), str(cls.ext_in), str(cls.ext_out), cls.__name__, cls.hcode) h = hash(tup) return h def format_error(self): """ Error message to display to the user when a build fails :rtype: string """ msg = getattr(self, 'last_cmd', '') name = getattr(self.generator, 'name', '') if getattr(self, "err_msg", None): return self.err_msg elif not self.hasrun: return 'task in %r was not executed for some reason: %r' % (name, self) elif self.hasrun == CRASHED: try: return ' -> task in %r failed (exit status %r): %r\n%r' % (name, self.err_code, self, msg) except AttributeError: return ' -> task in %r failed: %r\n%r' % (name, self, msg) elif self.hasrun == MISSING: return ' -> missing files in %r: %r\n%r' % (name, self, msg) else: return 'invalid status for task in %r: %r' % (name, self.hasrun) def colon(self, var1, var2): """ private function for the moment used for scriptlet expressions such as ${FOO_ST:FOO}, for example, if env.FOO_ST = ['-a', '-b'] env.FOO = ['1', '2'] then the result will be ['-a', '-b', '1', '-a', '-b', '2'] """ tmp = self.env[var1] if isinstance(var2, str): it = self.env[var2] else: it = var2 if isinstance(tmp, str): return [tmp % x for x in it] else: if Logs.verbose and not tmp and it: Logs.warn('Missing env variable %r for task %r (generator %r)' % (var1, self, self.generator)) lst = [] for y in it: lst.extend(tmp) lst.append(y) return lst class Task(TaskBase): """ This class deals with the filesystem (:py:class:`waflib.Node.Node`). The method :py:class:`waflib.Task.Task.runnable_status` uses a hash value (from :py:class:`waflib.Task.Task.signature`) which is persistent from build to build. When the value changes, the task has to be executed. The method :py:class:`waflib.Task.Task.post_run` will assign the task signature to the output nodes (if present). """ vars = [] """Variables to depend on (class attribute used for :py:meth:`waflib.Task.Task.sig_vars`)""" shell = False """Execute the command with the shell (class attribute)""" def __init__(self, *k, **kw): TaskBase.__init__(self, *k, **kw) self.env = kw['env'] """ConfigSet object (make sure to provide one)""" self.inputs = [] """List of input nodes, which represent the files used by the task instance""" self.outputs = [] """List of output nodes, which represent the files created by the task instance""" self.dep_nodes = [] """List of additional nodes to depend on""" self.run_after = set([]) """Set of tasks that must be executed before this one""" # Additionally, you may define the following #self.dep_vars = 'PREFIX DATADIR' def __str__(self): "string to display to the user" env = self.env src_str = ' '.join([a.nice_path(env) for a in self.inputs]) tgt_str = ' '.join([a.nice_path(env) for a in self.outputs]) if self.outputs: sep = ' -> ' else: sep = '' return '%s: %s%s%s\n' % (self.__class__.__name__.replace('_task', ''), src_str, sep, tgt_str) def __repr__(self): "for debugging purposes" return "".join(['\n\t{task %r: ' % id(self), self.__class__.__name__, " ", ",".join([x.name for x in self.inputs]), " -> ", ",".join([x.name for x in self.outputs]), '}']) def uid(self): """ Return an identifier used to determine if tasks are up-to-date. Since the identifier will be stored between executions, it must be: - unique: no two tasks return the same value (for a given build context) - the same for a given task instance By default, the node paths, the class name, and the function are used as inputs to compute a hash. The pointer to the object (python built-in 'id') will change between build executions, and must be avoided in such hashes. :return: hash value :rtype: string """ try: return self.uid_ except AttributeError: # this is not a real hot zone, but we want to avoid surprizes here m = Utils.md5() up = m.update up(self.__class__.__name__.encode()) for x in self.inputs + self.outputs: up(x.abspath().encode()) self.uid_ = m.digest() return self.uid_ def set_inputs(self, inp): """ Append the nodes to the *inputs* :param inp: input nodes :type inp: node or list of nodes """ if isinstance(inp, list): self.inputs += inp else: self.inputs.append(inp) def set_outputs(self, out): """ Append the nodes to the *outputs* :param out: output nodes :type out: node or list of nodes """ if isinstance(out, list): self.outputs += out else: self.outputs.append(out) def set_run_after(self, task): """ Run this task only after *task*. Affect :py:meth:`waflib.Task.runnable_status` :param task: task :type task: :py:class:`waflib.Task.Task` """ # TODO: handle lists too? assert isinstance(task, TaskBase) self.run_after.add(task) def signature(self): """ Task signatures are stored between build executions, they are use to track the changes made to the input nodes (not to the outputs!). The signature hashes data from various sources: * explicit dependencies: files listed in the inputs (list of node objects) :py:meth:`waflib.Task.Task.sig_explicit_deps` * implicit dependencies: list of nodes returned by scanner methods (when present) :py:meth:`waflib.Task.Task.sig_implicit_deps` * hashed data: variables/values read from task.__class__.vars/task.env :py:meth:`waflib.Task.Task.sig_vars` If the signature is expected to give a different result, clear the cache kept in ``self.cache_sig``:: from waflib import Task class cls(Task.Task): def signature(self): sig = super(Task.Task, self).signature() delattr(self, 'cache_sig') return super(Task.Task, self).signature() """ try: return self.cache_sig except AttributeError: pass self.m = Utils.md5() self.m.update(self.hcode.encode()) # explicit deps self.sig_explicit_deps() # env vars self.sig_vars() # implicit deps / scanner results if self.scan: try: self.sig_implicit_deps() except Errors.TaskRescan: return self.signature() ret = self.cache_sig = self.m.digest() return ret def runnable_status(self): """ Override :py:meth:`waflib.Task.TaskBase.runnable_status` to determine if the task is ready to be run (:py:attr:`waflib.Task.Task.run_after`) """ #return 0 # benchmarking for t in self.run_after: if not t.hasrun: return ASK_LATER bld = self.generator.bld # first compute the signature try: new_sig = self.signature() except Errors.TaskNotReady: return ASK_LATER # compare the signature to a signature computed previously key = self.uid() try: prev_sig = bld.task_sigs[key] except KeyError: Logs.debug("task: task %r must run as it was never run before or the task code changed" % self) return RUN_ME # compare the signatures of the outputs for node in self.outputs: try: if node.sig != new_sig: return RUN_ME except AttributeError: Logs.debug("task: task %r must run as the output nodes do not exist" % self) return RUN_ME if new_sig != prev_sig: return RUN_ME return SKIP_ME def post_run(self): """ Called after successful execution to update the cache data :py:class:`waflib.Node.Node` sigs and :py:attr:`waflib.Build.BuildContext.task_sigs`. The node signature is obtained from the task signature, but the output nodes may also get the signature of their contents. See the class decorator :py:func:`waflib.Task.update_outputs` if you need this behaviour. """ bld = self.generator.bld sig = self.signature() for node in self.outputs: # check if the node exists .. try: os.stat(node.abspath()) except OSError: self.hasrun = MISSING self.err_msg = '-> missing file: %r' % node.abspath() raise Errors.WafError(self.err_msg) # important, store the signature for the next run node.sig = sig bld.task_sigs[self.uid()] = self.cache_sig def sig_explicit_deps(self): """ Used by :py:meth:`waflib.Task.Task.signature`, hash :py:attr:`waflib.Task.Task.inputs` and :py:attr:`waflib.Task.Task.dep_nodes` signatures. :rtype: hash value """ bld = self.generator.bld upd = self.m.update # the inputs for x in self.inputs + self.dep_nodes: try: upd(x.get_bld_sig()) except (AttributeError, TypeError): raise Errors.WafError('Missing node signature for %r (required by %r)' % (x, self)) # manual dependencies, they can slow down the builds if bld.deps_man: additional_deps = bld.deps_man for x in self.inputs + self.outputs: try: d = additional_deps[id(x)] except KeyError: continue for v in d: if isinstance(v, bld.root.__class__): try: v = v.get_bld_sig() except AttributeError: raise Errors.WafError('Missing node signature for %r (required by %r)' % (v, self)) elif hasattr(v, '__call__'): v = v() # dependency is a function, call it upd(v) return self.m.digest() def sig_vars(self): """ Used by :py:meth:`waflib.Task.Task.signature`, hash :py:attr:`waflib.Task.Task.env` variables/values :rtype: hash value """ bld = self.generator.bld env = self.env upd = self.m.update # dependencies on the environment vars act_sig = bld.hash_env_vars(env, self.__class__.vars) upd(act_sig) # additional variable dependencies, if provided dep_vars = getattr(self, 'dep_vars', None) if dep_vars: upd(bld.hash_env_vars(env, dep_vars)) return self.m.digest() scan = None """ This method, when provided, returns a tuple containing: * a list of nodes corresponding to real files * a list of names for files not found in path_lst For example:: from waflib.Task import Task class mytask(Task): def scan(self, node): return ((), ()) The first and second lists are stored in :py:attr:`waflib.Build.BuildContext.node_deps` and :py:attr:`waflib.Build.BuildContext.raw_deps` respectively. """ def sig_implicit_deps(self): """ Used by :py:meth:`waflib.Task.Task.signature` hashes node signatures obtained by scanning for dependencies (:py:meth:`waflib.Task.Task.scan`). The exception :py:class:`waflib.Errors.TaskRescan` is thrown when a file has changed. When this occurs, :py:meth:`waflib.Task.Task.signature` is called once again, and this method will be executed once again, this time calling :py:meth:`waflib.Task.Task.scan` for searching the dependencies. :rtype: hash value """ bld = self.generator.bld # get the task signatures from previous runs key = self.uid() prev = bld.task_sigs.get((key, 'imp'), []) # for issue #379 if prev: try: if prev == self.compute_sig_implicit_deps(): return prev except: # when a file was renamed (IOError usually), remove the stale nodes (headers in folders without source files) # this will break the order calculation for headers created during the build in the source directory (should be uncommon) # the behaviour will differ when top != out for x in bld.node_deps.get(self.uid(), []): if x.is_child_of(bld.srcnode): try: os.stat(x.abspath()) except: try: del x.parent.children[x.name] except: pass del bld.task_sigs[(key, 'imp')] raise Errors.TaskRescan('rescan') # no previous run or the signature of the dependencies has changed, rescan the dependencies (nodes, names) = self.scan() if Logs.verbose: Logs.debug('deps: scanner for %s returned %s %s' % (str(self), str(nodes), str(names))) # store the dependencies in the cache bld.node_deps[key] = nodes bld.raw_deps[key] = names # might happen self.are_implicit_nodes_ready() # recompute the signature and return it try: bld.task_sigs[(key, 'imp')] = sig = self.compute_sig_implicit_deps() except: if Logs.verbose: for k in bld.node_deps.get(self.uid(), []): try: k.get_bld_sig() except: Logs.warn('Missing signature for node %r (may cause rebuilds)' % k) else: return sig def compute_sig_implicit_deps(self): """ Used by :py:meth:`waflib.Task.Task.sig_implicit_deps` for computing the actual hash of the :py:class:`waflib.Node.Node` returned by the scanner. :return: hash value :rtype: string """ upd = self.m.update bld = self.generator.bld self.are_implicit_nodes_ready() # scanner returns a node that does not have a signature # just *ignore* the error and let them figure out from the compiler output # waf -k behaviour for k in bld.node_deps.get(self.uid(), []): upd(k.get_bld_sig()) return self.m.digest() def are_implicit_nodes_ready(self): """ For each node returned by the scanner, see if there is a task behind it, and force the build order The performance impact on null builds is nearly invisible (1.66s->1.86s), but this is due to agressive caching (1.86s->28s) """ bld = self.generator.bld try: cache = bld.dct_implicit_nodes except: bld.dct_implicit_nodes = cache = {} try: dct = cache[bld.cur] except KeyError: dct = cache[bld.cur] = {} for tsk in bld.cur_tasks: for x in tsk.outputs: dct[x] = tsk modified = False for x in bld.node_deps.get(self.uid(), []): if x in dct: self.run_after.add(dct[x]) modified = True if modified: for tsk in self.run_after: if not tsk.hasrun: #print "task is not ready..." raise Errors.TaskNotReady('not ready') def can_retrieve_cache(self): """ Used by :py:meth:`waflib.Task.cache_outputs` Retrieve build nodes from the cache update the file timestamps to help cleaning the least used entries from the cache additionally, set an attribute 'cached' to avoid re-creating the same cache files Suppose there are files in `cache/dir1/file1` and `cache/dir2/file2`: #. read the timestamp of dir1 #. try to copy the files #. look at the timestamp again, if it has changed, the data may have been corrupt (cache update by another process) #. should an exception occur, ignore the data """ if not getattr(self, 'outputs', None): return None sig = self.signature() ssig = Utils.to_hex(self.uid()) + Utils.to_hex(sig) # first try to access the cache folder for the task dname = os.path.join(self.generator.bld.cache_global, ssig) try: t1 = os.stat(dname).st_mtime except OSError: return None for node in self.outputs: orig = os.path.join(dname, node.name) try: shutil.copy2(orig, node.abspath()) # mark the cache file as used recently (modified) os.utime(orig, None) except (OSError, IOError): Logs.debug('task: failed retrieving file') return None # is it the same folder? try: t2 = os.stat(dname).st_mtime except OSError: return None if t1 != t2: return None for node in self.outputs: node.sig = sig if self.generator.bld.progress_bar < 1: self.generator.bld.to_log('restoring from cache %r\n' % node.abspath()) self.cached = True return True def put_files_cache(self): """ Used by :py:func:`waflib.Task.cache_outputs` to store the build files in the cache """ # file caching, if possible # try to avoid data corruption as much as possible if getattr(self, 'cached', None): return None if not getattr(self, 'outputs', None): return None sig = self.signature() ssig = Utils.to_hex(self.uid()) + Utils.to_hex(sig) dname = os.path.join(self.generator.bld.cache_global, ssig) tmpdir = tempfile.mkdtemp(prefix=self.generator.bld.cache_global + os.sep + 'waf') try: shutil.rmtree(dname) except: pass try: for node in self.outputs: dest = os.path.join(tmpdir, node.name) shutil.copy2(node.abspath(), dest) except (OSError, IOError): try: shutil.rmtree(tmpdir) except: pass else: try: os.rename(tmpdir, dname) except OSError: try: shutil.rmtree(tmpdir) except: pass else: try: os.chmod(dname, Utils.O755) except: pass def is_before(t1, t2): """ Return a non-zero value if task t1 is to be executed before task t2:: t1.ext_out = '.h' t2.ext_in = '.h' t2.after = ['t1'] t1.before = ['t2'] waflib.Task.is_before(t1, t2) # True :param t1: task :type t1: :py:class:`waflib.Task.TaskBase` :param t2: task :type t2: :py:class:`waflib.Task.TaskBase` """ to_list = Utils.to_list for k in to_list(t2.ext_in): if k in to_list(t1.ext_out): return 1 if t1.__class__.__name__ in to_list(t2.after): return 1 if t2.__class__.__name__ in to_list(t1.before): return 1 return 0 def set_file_constraints(tasks): """ Adds tasks to the task 'run_after' attribute based on the task inputs and outputs :param tasks: tasks :type tasks: list of :py:class:`waflib.Task.TaskBase` """ ins = Utils.defaultdict(set) outs = Utils.defaultdict(set) for x in tasks: for a in getattr(x, 'inputs', []) + getattr(x, 'dep_nodes', []): ins[id(a)].add(x) for a in getattr(x, 'outputs', []): outs[id(a)].add(x) links = set(ins.keys()).intersection(outs.keys()) for k in links: for a in ins[k]: a.run_after.update(outs[k]) def set_precedence_constraints(tasks): """ Add tasks to the task 'run_after' attribute based on the after/before/ext_out/ext_in attributes :param tasks: tasks :type tasks: list of :py:class:`waflib.Task.TaskBase` """ cstr_groups = Utils.defaultdict(list) for x in tasks: h = x.hash_constraints() cstr_groups[h].append(x) keys = list(cstr_groups.keys()) maxi = len(keys) # this list should be short for i in range(maxi): t1 = cstr_groups[keys[i]][0] for j in range(i + 1, maxi): t2 = cstr_groups[keys[j]][0] # add the constraints based on the comparisons if is_before(t1, t2): a = i b = j elif is_before(t2, t1): a = j b = i else: continue for x in cstr_groups[keys[b]]: x.run_after.update(cstr_groups[keys[a]]) def funex(c): """ Compile a function by 'exec' :param c: function to compile :type c: string :return: the function 'f' declared in the input string :rtype: function """ dc = {} exec(c, dc) return dc['f'] reg_act = re.compile(r"(?P\\)|(?P\$\$)|(?P\$\{(?P\w+)(?P.*?)\})", re.M) def compile_fun_shell(line): """ Create a compiled function to execute a process with the shell WARNING: this method may disappear anytime, so use compile_fun instead """ extr = [] def repl(match): g = match.group if g('dollar'): return "$" elif g('backslash'): return '\\\\' elif g('subst'): extr.append((g('var'), g('code'))); return "%s" return None line = reg_act.sub(repl, line) or line parm = [] dvars = [] app = parm.append for (var, meth) in extr: if var == 'SRC': if meth: app('tsk.inputs%s' % meth) else: app('" ".join([a.path_from(bld.bldnode) for a in tsk.inputs])') elif var == 'TGT': if meth: app('tsk.outputs%s' % meth) else: app('" ".join([a.path_from(bld.bldnode) for a in tsk.outputs])') elif meth: if meth.startswith(':'): m = meth[1:] if m == 'SRC': m = '[a.path_from(bld.bldnode) for a in tsk.inputs]' elif m == 'TGT': m = '[a.path_from(bld.bldnode) for a in tsk.outputs]' elif m[:3] not in ('tsk', 'gen', 'bld'): dvars.extend([var, meth[1:]]) m = '%r' % m app('" ".join(tsk.colon(%r, %s))' % (var, m)) else: app('%s%s' % (var, meth)) else: if not var in dvars: dvars.append(var) app("p('%s')" % var) if parm: parm = "%% (%s) " % (',\n\t\t'.join(parm)) else: parm = '' c = COMPILE_TEMPLATE_SHELL % (line, parm) Logs.debug('action: %s' % c) return (funex(c), dvars) def compile_fun_noshell(line): """ Create a compiled function to execute a process without the shell WARNING: this method may disappear anytime, so use compile_fun instead """ extr = [] def repl(match): g = match.group if g('dollar'): return "$" elif g('subst'): extr.append((g('var'), g('code'))); return "<<|@|>>" return None line2 = reg_act.sub(repl, line) params = line2.split('<<|@|>>') assert(extr) buf = [] dvars = [] app = buf.append for x in range(len(extr)): params[x] = params[x].strip() if params[x]: app("lst.extend(%r)" % params[x].split()) (var, meth) = extr[x] if var == 'SRC': if meth: app('lst.append(tsk.inputs%s)' % meth) else: app("lst.extend([a.path_from(bld.bldnode) for a in tsk.inputs])") elif var == 'TGT': if meth: app('lst.append(tsk.outputs%s)' % meth) else: app("lst.extend([a.path_from(bld.bldnode) for a in tsk.outputs])") elif meth: if meth.startswith(':'): m = meth[1:] if m == 'SRC': m = '[a.path_from(bld.bldnode) for a in tsk.inputs]' elif m == 'TGT': m = '[a.path_from(bld.bldnode) for a in tsk.outputs]' elif m[:3] not in ('tsk', 'gen', 'bld'): dvars.extend([var, m]) m = '%r' % m app('lst.extend(tsk.colon(%r, %s))' % (var, m)) else: app('lst.extend(gen.to_list(%s%s))' % (var, meth)) else: app('lst.extend(to_list(env[%r]))' % var) if not var in dvars: dvars.append(var) if extr: if params[-1]: app("lst.extend(%r)" % params[-1].split()) fun = COMPILE_TEMPLATE_NOSHELL % "\n\t".join(buf) Logs.debug('action: %s' % fun) return (funex(fun), dvars) def compile_fun(line, shell=False): """ Parse a string expression such as "${CC} ${SRC} -o ${TGT}" and return a pair containing: * the function created (compiled) for use as :py:meth:`waflib.Task.TaskBase.run` * the list of variables that imply a dependency from self.env for example:: from waflib.Task import compile_fun compile_fun('cxx', '${CXX} -o ${TGT[0]} ${SRC} -I ${SRC[0].parent.bldpath()}') def build(bld): bld(source='wscript', rule='echo "foo\\${SRC[0].name}\\bar"') The env variables (CXX, ..) on the task must not hold dicts (order) The reserved keywords *TGT* and *SRC* represent the task input and output nodes """ if line.find('<') > 0 or line.find('>') > 0 or line.find('&&') > 0: shell = True if shell: return compile_fun_shell(line) else: return compile_fun_noshell(line) def task_factory(name, func=None, vars=None, color='GREEN', ext_in=[], ext_out=[], before=[], after=[], shell=False, scan=None): """ Return a new task subclass with the function ``run`` compiled from the line given. Provided for compatibility with waf 1.4-1.5, when we did not use metaclasses to register new objects. :param func: method run :type func: string or function :param vars: list of variables to hash :type vars: list of string :param color: color to use :type color: string :param shell: when *func* is a string, enable/disable the use of the shell :type shell: bool :param scan: method scan :type scan: function :rtype: :py:class:`waflib.Task.Task` """ params = { 'vars': vars or [], # function arguments are static, and this one may be modified by the class 'color': color, 'name': name, 'ext_in': Utils.to_list(ext_in), 'ext_out': Utils.to_list(ext_out), 'before': Utils.to_list(before), 'after': Utils.to_list(after), 'shell': shell, 'scan': scan, } if isinstance(func, str): params['run_str'] = func else: params['run'] = func cls = type(Task)(name, (Task,), params) global classes classes[name] = cls return cls def always_run(cls): """ Task class decorator Set all task instances of this class to be executed whenever a build is started The task signature is calculated, but the result of the comparation between task signatures is bypassed """ old = cls.runnable_status def always(self): ret = old(self) if ret == SKIP_ME: ret = RUN_ME return ret cls.runnable_status = always return cls def update_outputs(cls): """ Task class decorator If you want to create files in the source directory. For example, to keep *foo.txt* in the source directory, create it first and declare:: def build(bld): bld(rule='cp ${SRC} ${TGT}', source='wscript', target='foo.txt', update_outputs=True) """ old_post_run = cls.post_run def post_run(self): old_post_run(self) for node in self.outputs: node.sig = Utils.h_file(node.abspath()) self.generator.bld.task_sigs[node.abspath()] = self.uid() # issue #1017 cls.post_run = post_run old_runnable_status = cls.runnable_status def runnable_status(self): status = old_runnable_status(self) if status != RUN_ME: return status try: # by default, we check that the output nodes have the signature of the task # perform a second check, returning 'SKIP_ME' as we are expecting that # the signatures do not match bld = self.generator.bld prev_sig = bld.task_sigs[self.uid()] if prev_sig == self.signature(): for x in self.outputs: if not x.sig or bld.task_sigs[x.abspath()] != self.uid(): return RUN_ME return SKIP_ME except KeyError: pass except IndexError: pass except AttributeError: pass return RUN_ME cls.runnable_status = runnable_status return cls kupfer-v208/waflib/TaskGen.py000066400000000000000000000520151176220042200162200ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) """ Task generators The class :py:class:`waflib.TaskGen.task_gen` encapsulates the creation of task objects (low-level code) The instances can have various parameters, but the creation of task nodes (Task.py) is always postponed. To achieve this, various methods are called from the method "apply" """ import copy, re, os from waflib import Task, Utils, Logs, Errors, ConfigSet feats = Utils.defaultdict(set) """remember the methods declaring features""" class task_gen(object): """ Instances of this class create :py:class:`waflib.Task.TaskBase` when calling the method :py:meth:`waflib.TaskGen.task_gen.post` from the main thread. A few notes: * The methods to call (*self.meths*) can be specified dynamically (removing, adding, ..) * The 'features' are used to add methods to self.meths and then execute them * The attribute 'path' is a node representing the location of the task generator * The tasks created are added to the attribute *tasks* * The attribute 'idx' is a counter of task generators in the same path """ mappings = {} prec = Utils.defaultdict(list) def __init__(self, *k, **kw): """ The task generator objects predefine various attributes (source, target) for possible processing by process_rule (make-like rules) or process_source (extensions, misc methods) The tasks are stored on the attribute 'tasks'. They are created by calling methods listed in self.meths *or* referenced in the attribute features A topological sort is performed to ease the method re-use. The extra key/value elements passed in kw are set as attributes """ # so we will have to play with directed acyclic graphs # detect cycles, etc self.source = '' self.target = '' self.meths = [] """ List of method names to execute (it is usually a good idea to avoid touching this) """ self.prec = Utils.defaultdict(list) """ Precedence table for sorting the methods in self.meths """ self.mappings = {} """ List of mappings {extension -> function} for processing files by extension """ self.features = [] """ List of feature names for bringing new methods in """ self.tasks = [] """ List of tasks created. """ if not 'bld' in kw: # task generators without a build context :-/ self.env = ConfigSet.ConfigSet() self.idx = 0 self.path = None else: self.bld = kw['bld'] self.env = self.bld.env.derive() self.path = self.bld.path # emulate chdir when reading scripts # provide a unique id try: self.idx = self.bld.idx[id(self.path)] = self.bld.idx.get(id(self.path), 0) + 1 except AttributeError: self.bld.idx = {} self.idx = self.bld.idx[id(self.path)] = 1 for key, val in kw.items(): setattr(self, key, val) def __str__(self): """for debugging purposes""" return "" % (self.name, self.path.abspath()) def __repr__(self): """for debugging purposes""" lst = [] for x in self.__dict__.keys(): if x not in ['env', 'bld', 'compiled_tasks', 'tasks']: lst.append("%s=%s" % (x, repr(getattr(self, x)))) return "bld(%s) in %s" % (", ".join(lst), self.path.abspath()) def get_name(self): """ If not set, the name is computed from the target name:: def build(bld): x = bld(name='foo') x.get_name() # foo y = bld(target='bar') y.get_name() # bar :rtype: string :return: name of this task generator """ try: return self._name except AttributeError: if isinstance(self.target, list): lst = [str(x) for x in self.target] name = self._name = ','.join(lst) else: name = self._name = str(self.target) return name def set_name(self, name): self._name = name name = property(get_name, set_name) def to_list(self, val): """ Ensure that a parameter is a list :type val: string or list of string :param val: input to return as a list :rtype: list """ if isinstance(val, str): return val.split() else: return val def post(self): """ Create task objects. The following operations are performed: #. The body of this method is called only once and sets the attribute ``posted`` #. The attribute ``features`` is used to add more methods in ``self.meths`` #. The methods are sorted by the precedence table ``self.prec`` or `:waflib:attr:waflib.TaskGen.task_gen.prec` #. The methods are then executed in order #. The tasks created are added to :py:attr:`waflib.TaskGen.task_gen.tasks` """ # we could add a decorator to let the task run once, but then python 2.3 will be difficult to support if getattr(self, 'posted', None): #error("OBJECT ALREADY POSTED" + str( self)) return False self.posted = True keys = set(self.meths) # add the methods listed in the features self.features = Utils.to_list(self.features) for x in self.features + ['*']: st = feats[x] if not st: if not x in Task.classes: Logs.warn('feature %r does not exist - bind at least one method to it' % x) keys.update(list(st)) # ironpython 2.7 wants the cast to list # copy the precedence table prec = {} prec_tbl = self.prec or task_gen.prec for x in prec_tbl: if x in keys: prec[x] = prec_tbl[x] # elements disconnected tmp = [] for a in keys: for x in prec.values(): if a in x: break else: tmp.append(a) # TODO waf 1.7 #tmp.sort() # topological sort out = [] while tmp: e = tmp.pop() if e in keys: out.append(e) try: nlst = prec[e] except KeyError: pass else: del prec[e] for x in nlst: for y in prec: if x in prec[y]: break else: tmp.append(x) if prec: raise Errors.WafError('Cycle detected in the method execution %r' % prec) out.reverse() self.meths = out # then we run the methods in order Logs.debug('task_gen: posting %s %d' % (self, id(self))) for x in out: try: v = getattr(self, x) except AttributeError: raise Errors.WafError('%r is not a valid task generator method' % x) Logs.debug('task_gen: -> %s (%d)' % (x, id(self))) v() Logs.debug('task_gen: posted %s' % self.name) return True def get_hook(self, node): """ :param node: Input file to process :type node: :py:class:`waflib.Tools.Node.Node` :return: A method able to process the input node by looking at the extension :rtype: function """ name = node.name for k in self.mappings: if name.endswith(k): return self.mappings[k] for k in task_gen.mappings: if name.endswith(k): return task_gen.mappings[k] raise Errors.WafError("File %r has no mapping in %r (did you forget to load a waf tool?)" % (node, task_gen.mappings.keys())) def create_task(self, name, src=None, tgt=None): """ Wrapper for creating task objects easily :param name: task class name :type name: string :param src: input nodes :type src: list of :py:class:`waflib.Tools.Node.Node` :param tgt: output nodes :type tgt: list of :py:class:`waflib.Tools.Node.Node` :return: A task object :rtype: :py:class:`waflib.Task.TaskBase` """ task = Task.classes[name](env=self.env.derive(), generator=self) if src: task.set_inputs(src) if tgt: task.set_outputs(tgt) self.tasks.append(task) return task def clone(self, env): """ Make a copy of a task generator. Once the copy is made, it is necessary to ensure that the task generator does not create the same output files as the original, or the same files may be compiled twice. :param env: A configuration set :type env: :py:class:`waflib.ConfigSet.ConfigSet` :return: A copy :rtype: :py:class:`waflib.TaskGen.task_gen` """ newobj = self.bld() for x in self.__dict__: if x in ['env', 'bld']: continue elif x in ['path', 'features']: setattr(newobj, x, getattr(self, x)) else: setattr(newobj, x, copy.copy(getattr(self, x))) newobj.posted = False if isinstance(env, str): newobj.env = self.bld.all_envs[env].derive() else: newobj.env = env.derive() return newobj def declare_chain(name='', rule=None, reentrant=None, color='BLUE', ext_in=[], ext_out=[], before=[], after=[], decider=None, scan=None, install_path=None, shell=False): """ Create a new mapping and a task class for processing files by extension. See Tools/flex.py for an example. :param name: name for the task class :type name: string :param rule: function to execute or string to be compiled in a function :type rule: string or function :param reentrant: re-inject the output file in the process (done automatically, set to 0 to disable) :type reentrant: int :param color: color for the task output :type color: string :param ext_in: execute the task only after the files of such extensions are created :type ext_in: list of string :param ext_out: execute the task only before files of such extensions are processed :type ext_out: list of string :param before: execute instances of this task before classes of the given names :type before: list of string :param after: execute instances of this task after classes of the given names :type after: list of string :param decider: if present, use it to create the output nodes for the task :type decider: function :param scan: scanner function for the task :type scan: function :param install_path: installation path for the output nodes :type install_path: string """ ext_in = Utils.to_list(ext_in) ext_out = Utils.to_list(ext_out) if not name: name = rule cls = Task.task_factory(name, rule, color=color, ext_in=ext_in, ext_out=ext_out, before=before, after=after, scan=scan, shell=shell) def x_file(self, node): ext = decider and decider(self, node) or cls.ext_out if ext_in: _ext_in = ext_in[0] tsk = self.create_task(name, node) cnt = 0 keys = self.mappings.keys() + self.__class__.mappings.keys() for x in ext: k = node.change_ext(x, ext_in=_ext_in) tsk.outputs.append(k) if reentrant != None: if cnt < int(reentrant): self.source.append(k) else: for y in keys: # ~ nfile * nextensions :-/ if k.name.endswith(y): self.source.append(k) break cnt += 1 if install_path: self.bld.install_files(install_path, tsk.outputs) return tsk for x in cls.ext_in: task_gen.mappings[x] = x_file return x_file def taskgen_method(func): """ Decorator: register a method as a task generator method. The function must accept a task generator as first parameter:: from waflib.TaskGen import taskgen_method @taskgen_method def mymethod(self): pass :param func: task generator method to add :type func: function :rtype: function """ setattr(task_gen, func.__name__, func) return func def feature(*k): """ Decorator: register a task generator method that will be executed when the object attribute 'feature' contains the corresponding key(s):: from waflib.Task import feature @feature('myfeature') def myfunction(self): print('that is my feature!') def build(bld): bld(features='myfeature') :param k: feature names :type k: list of string """ def deco(func): setattr(task_gen, func.__name__, func) for name in k: feats[name].update([func.__name__]) return func return deco def before_method(*k): """ Decorator: register a task generator method which will be executed before the functions of given name(s):: from waflib.TaskGen import feature, before @feature('myfeature') @before_method('fun2') def fun1(self): print('feature 1!') @feature('myfeature') def fun2(self): print('feature 2!') def build(bld): bld(features='myfeature') :param k: method names :type k: list of string """ def deco(func): setattr(task_gen, func.__name__, func) for fun_name in k: if not func.__name__ in task_gen.prec[fun_name]: task_gen.prec[fun_name].append(func.__name__) #task_gen.prec[fun_name].sort() return func return deco before = before_method def after_method(*k): """ Decorator: register a task generator method which will be executed after the functions of given name(s):: from waflib.TaskGen import feature, after @feature('myfeature') @after_method('fun2') def fun1(self): print('feature 1!') @feature('myfeature') def fun2(self): print('feature 2!') def build(bld): bld(features='myfeature') :param k: method names :type k: list of string """ def deco(func): setattr(task_gen, func.__name__, func) for fun_name in k: if not fun_name in task_gen.prec[func.__name__]: task_gen.prec[func.__name__].append(fun_name) #task_gen.prec[func.__name__].sort() return func return deco after = after_method def extension(*k): """ Decorator: register a task generator method which will be invoked during the processing of source files for the extension given:: from waflib import Task class mytask(Task): run_str = 'cp ${SRC} ${TGT}' @extension('.moo') def create_maa_file(self, node): self.create_task('mytask', node, node.change_ext('.maa')) def build(bld): bld(source='foo.moo') """ def deco(func): setattr(task_gen, func.__name__, func) for x in k: task_gen.mappings[x] = func return func return deco # --------------------------------------------------------------- # The following methods are task generator methods commonly used # they are almost examples, the rest of waf core does not depend on them @taskgen_method def to_nodes(self, lst, path=None): """ Convert the input list into a list of nodes. It is used by :py:func:`waflib.TaskGen.process_source` and :py:func:`waflib.TaskGen.process_rule`. It is designed for source files, for folders, see :py:func:`waflib.Tools.ccroot.to_incnodes`: :param lst: input list :type lst: list of string and nodes :param path: path from which to search the nodes (by default, :py:attr:`waflib.TaskGen.task_gen.path`) :type path: :py:class:`waflib.Tools.Node.Node` :rtype: list of :py:class:`waflib.Tools.Node.Node` """ tmp = [] path = path or self.path find = path.find_resource if isinstance(lst, self.path.__class__): lst = [lst] # either a list or a string, convert to a list of nodes for x in Utils.to_list(lst): if isinstance(x, str): node = find(x) else: node = x if not node: raise Errors.WafError("source not found: %r in %r" % (x, self)) tmp.append(node) return tmp @feature('*') def process_source(self): """ Process each element in the attribute ``source`` by extension. #. The *source* list is converted through :py:meth:`waflib.TaskGen.to_nodes` to a list of :py:class:`waflib.Node.Node` first. #. File extensions are mapped to methods having the signature: ``def meth(self, node)`` by :py:meth:`waflib.TaskGen.extension` #. The method is retrieved through :py:meth:`waflib.TaskGen.task_gen.get_hook` #. When called, the methods may modify self.source to append more source to process #. The mappings can map an extension or a filename (see the code below) """ self.source = self.to_nodes(getattr(self, 'source', [])) for node in self.source: self.get_hook(node)(self, node) @feature('*') @before_method('process_source') def process_rule(self): """ Process the attribute ``rule``. When present, :py:meth:`waflib.TaskGen.process_source` is disabled:: def build(bld): bld(rule='cp ${SRC} ${TGT}', source='wscript', target='bar.txt') """ if not getattr(self, 'rule', None): return # create the task class name = str(getattr(self, 'name', None) or self.target or self.rule) cls = Task.task_factory(name, self.rule, getattr(self, 'vars', []), shell=getattr(self, 'shell', True), color=getattr(self, 'color', 'BLUE')) # now create one instance tsk = self.create_task(name) if getattr(self, 'target', None): if isinstance(self.target, str): self.target = self.target.split() if not isinstance(self.target, list): self.target = [self.target] for x in self.target: if isinstance(x, str): tsk.outputs.append(self.path.find_or_declare(x)) else: x.parent.mkdir() # if a node was given, create the required folders tsk.outputs.append(x) if getattr(self, 'install_path', None): # from waf 1.5 # although convenient, it does not 1. allow to name the target file and 2. symlinks # TODO remove in waf 1.7 self.bld.install_files(self.install_path, tsk.outputs) if getattr(self, 'source', None): tsk.inputs = self.to_nodes(self.source) # bypass the execution of process_source by setting the source to an empty list self.source = [] if getattr(self, 'scan', None): cls.scan = self.scan elif getattr(self, 'deps', None): def scan(self): nodes = [] for x in self.generator.to_list(self.generator.deps): node = self.generator.path.find_resource(x) if not node: self.generator.bld.fatal('Could not find %r (was it declared?)' % x) nodes.append(node) return [nodes, []] cls.scan = scan if getattr(self, 'cwd', None): tsk.cwd = self.cwd # TODO remove on_results in waf 1.7 if getattr(self, 'update_outputs', None) or getattr(self, 'on_results', None): Task.update_outputs(cls) if getattr(self, 'always', None): Task.always_run(cls) for x in ['after', 'before', 'ext_in', 'ext_out']: setattr(cls, x, getattr(self, x, [])) @feature('seq') def sequence_order(self): """ Add a strict sequential constraint between the tasks generated by task generators. It works because task generators are posted in order. It will not post objects which belong to other folders. Example:: bld(features='javac seq') bld(features='jar seq') To start a new sequence, set the attribute seq_start, for example:: obj = bld(features='seq') obj.seq_start = True Note that the method is executed in last position. This is more an example than a widely-used solution. """ if self.meths and self.meths[-1] != 'sequence_order': self.meths.append('sequence_order') return if getattr(self, 'seq_start', None): return # all the tasks previously declared must be run before these if getattr(self.bld, 'prev', None): self.bld.prev.post() for x in self.bld.prev.tasks: for y in self.tasks: y.set_run_after(x) self.bld.prev = self re_m4 = re.compile('@(\w+)@', re.M) class subst_pc(Task.Task): """ Create *.pc* files from *.pc.in*. The task is executed whenever an input variable used in the substitution changes. """ def run(self): "Substitutes variables in a .in file" code = self.inputs[0].read() # replace all % by %% to prevent errors by % signs code = code.replace('%', '%%') # extract the vars foo into lst and replace @foo@ by %(foo)s lst = [] def repl(match): g = match.group if g(1): lst.append(g(1)) return "%%(%s)s" % g(1) return '' code = re_m4.sub(repl, code) try: d = self.generator.dct except AttributeError: d = {} for x in lst: tmp = getattr(self.generator, x, '') or self.env.get_flat(x) or self.env.get_flat(x.upper()) d[x] = str(tmp) self.outputs[0].write(code % d) self.generator.bld.raw_deps[self.uid()] = self.dep_vars = lst # make sure the signature is updated try: delattr(self, 'cache_sig') except AttributeError: pass if getattr(self.generator, 'chmod', None): os.chmod(self.outputs[0].abspath(), self.generator.chmod) def sig_vars(self): """ Compute a hash (signature) of the variables used in the substitution """ bld = self.generator.bld env = self.env upd = self.m.update # raw_deps: persistent custom values returned by the scanner vars = self.generator.bld.raw_deps.get(self.uid(), []) # hash both env vars and task generator attributes act_sig = bld.hash_env_vars(env, vars) upd(act_sig) lst = [getattr(self.generator, x, '') for x in vars] upd(Utils.h_list(lst)) return self.m.digest() @extension('.pc.in') def add_pcfile(self, node): """ Process *.pc.in* files to *.pc*. Install the results to ``${PREFIX}/lib/pkgconfig/`` def build(bld): bld(source='foo.pc.in', install_path='${LIBDIR}/pkgconfig/') """ tsk = self.create_task('subst_pc', node, node.change_ext('.pc', '.pc.in')) self.bld.install_files(getattr(self, 'install_path', '${LIBDIR}/pkgconfig/'), tsk.outputs) class subst(subst_pc): pass @feature('subst') @before_method('process_source', 'process_rule') def process_subst(self): """ Define a transformation that substitutes the contents of *source* files to *target* files:: def build(bld): bld( features='subst', source='foo.c.in', target='foo.c', install_path='${LIBDIR}/pkgconfig', VAR = 'val' ) The input files are supposed to contain macros of the form *@VAR@*, where *VAR* is an argument of the task generator object. This method overrides the processing by :py:meth:`waflib.TaskGen.process_source`. """ src = self.to_nodes(getattr(self, 'source', [])) tgt = getattr(self, 'target', []) if isinstance(tgt, self.path.__class__): tgt = [tgt] tgt = [isinstance(x, self.path.__class__) and x or self.path.find_or_declare(x) for x in Utils.to_list(tgt)] if len(src) != len(tgt): raise Errors.WafError('invalid source or target for %r' % self) for x, y in zip(src, tgt): if not (x and y): raise Errors.WafError('invalid source or target for %r' % self) tsk = self.create_task('subst', x, y) for a in ('after', 'before', 'ext_in', 'ext_out'): val = getattr(self, a, None) if val: setattr(tsk, a, val) inst_to = getattr(self, 'install_path', None) if inst_to: self.bld.install_files(inst_to, tgt, chmod=getattr(self, 'chmod', Utils.O644)) self.source = [] kupfer-v208/waflib/Tools/000077500000000000000000000000001176220042200154075ustar00rootroot00000000000000kupfer-v208/waflib/Tools/__init__.py000066400000000000000000000001071176220042200175160ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) kupfer-v208/waflib/Tools/c_aliases.py000066400000000000000000000056461176220042200177170ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) "base for all c/c++ programs and libraries" import os, sys, re from waflib import Utils, Build from waflib.Configure import conf def get_extensions(lst): """ :param lst: files to process :list lst: list of string or :py:class:`waflib.Node.Node` :return: list of file extensions :rtype: list of string """ ret = [] for x in Utils.to_list(lst): try: if not isinstance(x, str): x = x.name ret.append(x[x.rfind('.') + 1:]) except: pass return ret def sniff_features(**kw): """ Look at the source files and return the features for a task generator (mainly cc and cxx):: snif_features(source=['foo.c', 'foo.cxx'], type='shlib') # returns ['cxx', 'c', 'cxxshlib', 'cshlib'] :param source: source files to process :type source: list of string or :py:class:`waflib.Node.Node` :param type: object type in *program*, *shlib* or *stlib* :type type: string :return: the list of features for a task generator processing the source files :rtype: list of string """ exts = get_extensions(kw['source']) type = kw['_type'] feats = [] # watch the order, cxx will have the precedence if 'cxx' in exts or 'cpp' in exts or 'c++' in exts or 'cc' in exts or 'C' in exts: feats.append('cxx') if 'c' in exts or 'vala' in exts: feats.append('c') if 'd' in exts: feats.append('d') if 'java' in exts: feats.append('java') if 'java' in exts: return 'java' if type in ['program', 'shlib', 'stlib']: for x in feats: if x in ['cxx', 'd', 'c']: feats.append(x + type) return feats def set_features(kw, _type): kw['_type'] = _type kw['features'] = Utils.to_list(kw.get('features', [])) + Utils.to_list(sniff_features(**kw)) @conf def program(bld, *k, **kw): """ Alias for creating programs by looking at the file extensions:: def build(bld): bld.program(source='foo.c', target='app') # equivalent to: # bld(features='c cprogram', source='foo.c', target='app') """ set_features(kw, 'program') return bld(*k, **kw) @conf def shlib(bld, *k, **kw): """ Alias for creating shared libraries by looking at the file extensions:: def build(bld): bld.shlib(source='foo.c', target='app') # equivalent to: # bld(features='c cshlib', source='foo.c', target='app') """ set_features(kw, 'shlib') return bld(*k, **kw) @conf def stlib(bld, *k, **kw): """ Alias for creating static libraries by looking at the file extensions:: def build(bld): bld.stlib(source='foo.cpp', target='app') # equivalent to: # bld(features='cxx cxxstlib', source='foo.cpp', target='app') """ set_features(kw, 'stlib') return bld(*k, **kw) @conf def objects(bld, *k, **kw): """ Alias for creating object files by looking at the file extensions:: def build(bld): bld.objects(source='foo.c', target='app') # equivalent to: # bld(features='c', source='foo.c', target='app') """ set_features(kw, 'objects') return bld(*k, **kw) kupfer-v208/waflib/Tools/c_config.py000066400000000000000000001034561176220042200175410ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) """ C/C++/D configuration helpers """ import os, imp, sys, re, shlex, shutil from waflib import Build, Utils, Configure, Task, Options, Logs, TaskGen, Errors, ConfigSet, Runner from waflib.TaskGen import before_method, after_method, feature from waflib.Configure import conf WAF_CONFIG_H = 'config.h' """default name for the config.h file""" DEFKEYS = 'define_key' INCKEYS = 'include_key' cfg_ver = { 'atleast-version': '>=', 'exact-version': '==', 'max-version': '<=', } SNIP_FUNCTION = ''' int main() { void *p; p=(void*)(%s); return 0; } ''' """Code template for checking for functions""" SNIP_TYPE = ''' int main() { if ((%(type_name)s *) 0) return 0; if (sizeof (%(type_name)s)) return 0; } ''' """Code template for checking for types""" SNIP_CLASS = ''' int main() { if ( } ''' SNIP_EMPTY_PROGRAM = ''' int main() { return 0; } ''' SNIP_FIELD = ''' int main() { char *off; off = (char*) &((%(type_name)s*)0)->%(field_name)s; return (size_t) off < sizeof(%(type_name)s); } ''' MACRO_TO_DESTOS = { '__linux__' : 'linux', '__GNU__' : 'gnu', # hurd '__FreeBSD__' : 'freebsd', '__NetBSD__' : 'netbsd', '__OpenBSD__' : 'openbsd', '__sun' : 'sunos', '__hpux' : 'hpux', '__sgi' : 'irix', '_AIX' : 'aix', '__CYGWIN__' : 'cygwin', '__MSYS__' : 'msys', '_UWIN' : 'uwin', '_WIN64' : 'win32', '_WIN32' : 'win32', # Note about darwin: this is also tested with 'defined __APPLE__ && defined __MACH__' somewhere below in this file. '__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__' : 'darwin', '__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__' : 'darwin', # iphone '__QNX__' : 'qnx', '__native_client__' : 'nacl' # google native client platform } MACRO_TO_DEST_CPU = { '__x86_64__' : 'x86_64', '__i386__' : 'x86', '__ia64__' : 'ia', '__mips__' : 'mips', '__sparc__' : 'sparc', '__alpha__' : 'alpha', '__arm__' : 'arm', '__hppa__' : 'hppa', '__powerpc__' : 'powerpc', } @conf def parse_flags(self, line, uselib, env=None, force_static=False): """ Parse the flags from the input lines, and add them to the relevant use variables:: def configure(conf): conf.parse_flags('-O3', uselib_store='FOO') # conf.env.CXXFLAGS_FOO = ['-O3'] # conf.env.CFLAGS_FOO = ['-O3'] :param line: flags :type line: string :param uselib: where to add the flags :type uselib: string :param env: config set or conf.env by default :type env: :py:class:`waflib.ConfigSet.ConfigSet` """ assert(isinstance(line, str)) env = env or self.env # append_unique is not always possible # for example, apple flags may require both -arch i386 and -arch ppc app = env.append_value appu = env.append_unique #lst = shlex.split(line) # issue #811 lex = shlex.shlex(line, posix=False) lex.whitespace_split = True lex.commenters = '' lst = list(lex) while lst: x = lst.pop(0) st = x[:2] ot = x[2:] if st == '-I' or st == '/I': if not ot: ot = lst.pop(0) appu('INCLUDES_' + uselib, [ot]) elif st == '-include': tmp = [x, lst.pop(0)] app('CFLAGS', tmp) app('CXXFLAGS', tmp) elif st == '-D' or (self.env.CXX_NAME == 'msvc' and st == '/D'): # not perfect but.. if not ot: ot = lst.pop(0) app('DEFINES_' + uselib, [ot]) elif st == '-l': if not ot: ot = lst.pop(0) prefix = force_static and 'STLIB_' or 'LIB_' appu(prefix + uselib, [ot]) elif st == '-L': if not ot: ot = lst.pop(0) appu('LIBPATH_' + uselib, [ot]) elif x == '-pthread' or x.startswith('+') or x.startswith('-std'): app('CFLAGS_' + uselib, [x]) app('CXXFLAGS_' + uselib, [x]) app('LINKFLAGS_' + uselib, [x]) elif x == '-framework': appu('FRAMEWORK_' + uselib, [lst.pop(0)]) elif x.startswith('-F'): appu('FRAMEWORKPATH_' + uselib, [x[2:]]) elif x.startswith('-Wl'): app('LINKFLAGS_' + uselib, [x]) elif x.startswith('-m') or x.startswith('-f') or x.startswith('-dynamic'): app('CFLAGS_' + uselib, [x]) app('CXXFLAGS_' + uselib, [x]) elif x.startswith('-bundle'): app('LINKFLAGS_' + uselib, [x]) elif x.startswith('-undefined'): arg = lst.pop(0) app('LINKFLAGS_' + uselib, [x, arg]) elif x.startswith('-arch') or x.startswith('-isysroot'): tmp = [x, lst.pop(0)] app('CFLAGS_' + uselib, tmp) app('CXXFLAGS_' + uselib, tmp) app('LINKFLAGS_' + uselib, tmp) elif x.endswith('.a') or x.endswith('.so') or x.endswith('.dylib'): appu('LINKFLAGS_' + uselib, [x]) # not cool, #762 @conf def ret_msg(self, f, kw): if isinstance(f, str): return f return f(kw) @conf def validate_cfg(self, kw): """ Search for the program *pkg-config* if missing, and validate the parameters to pass to :py:func:`waflib.Tools.c_config.exec_cfg`. :param path: the **-config program to use** (default is *pkg-config*) :type path: list of string :param msg: message to display to describe the test executed :type msg: string :param okmsg: message to display when the test is successful :type okmsg: string :param errmsg: message to display in case of error :type errmsg: string """ if not 'path' in kw: if not self.env.PKGCONFIG: self.find_program('pkg-config', var='PKGCONFIG') kw['path'] = self.env.PKGCONFIG # pkg-config version if 'atleast_pkgconfig_version' in kw: if not 'msg' in kw: kw['msg'] = 'Checking for pkg-config version >= %r' % kw['atleast_pkgconfig_version'] return if not 'okmsg' in kw: kw['okmsg'] = 'yes' if not 'errmsg' in kw: kw['errmsg'] = 'not found' if 'modversion' in kw: if not 'msg' in kw: kw['msg'] = 'Checking for %r version' % kw['modversion'] return # checking for the version of a module, for the moment, one thing at a time for x in cfg_ver.keys(): y = x.replace('-', '_') if y in kw: if not 'package' in kw: raise ValueError('%s requires a package' % x) if not 'msg' in kw: kw['msg'] = 'Checking for %r %s %s' % (kw['package'], cfg_ver[x], kw[y]) return if not 'msg' in kw: kw['msg'] = 'Checking for %r' % (kw['package'] or kw['path']) @conf def exec_cfg(self, kw): """ Execute the program *pkg-config*: * if atleast_pkgconfig_version is given, check that pkg-config has the version n and return * if modversion is given, then return the module version * else, execute the *-config* program with the *args* and *variables* given, and set the flags on the *conf.env.FLAGS_name* variable :param atleast_pkgconfig_version: minimum pkg-config version to use (disable other tests) :type atleast_pkgconfig_version: string :param package: package name, for example *gtk+-2.0* :type package: string :param uselib_store: if the test is successful, define HAVE\_*name*. It is also used to define *conf.env.FLAGS_name* variables. :type uselib_store: string :param modversion: if provided, return the version of the given module and define *name*\_VERSION :type modversion: string :param args: arguments to give to *package* when retrieving flags :type args: list of string :param variables: return the values of particular variables :type variables: list of string :param define_variable: additional variables to define (also in conf.env.PKG_CONFIG_DEFINES) :type define_variable: dict(string: string) """ # pkg-config version if 'atleast_pkgconfig_version' in kw: cmd = [kw['path'], '--atleast-pkgconfig-version=%s' % kw['atleast_pkgconfig_version']] self.cmd_and_log(cmd) if not 'okmsg' in kw: kw['okmsg'] = 'yes' return # checking for the version of a module for x in cfg_ver: y = x.replace('-', '_') if y in kw: self.cmd_and_log([kw['path'], '--%s=%s' % (x, kw[y]), kw['package']]) if not 'okmsg' in kw: kw['okmsg'] = 'yes' self.define(self.have_define(kw.get('uselib_store', kw['package'])), 1, 0) break # retrieving the version of a module if 'modversion' in kw: version = self.cmd_and_log([kw['path'], '--modversion', kw['modversion']]).strip() self.define('%s_VERSION' % Utils.quote_define_name(kw.get('uselib_store', kw['modversion'])), version) return version lst = [kw['path']] defi = kw.get('define_variable', None) if not defi: defi = self.env.PKG_CONFIG_DEFINES or {} for key, val in defi.items(): lst.append('--define-variable=%s=%s' % (key, val)) if kw['package']: lst.extend(Utils.to_list(kw['package'])) # retrieving variables of a module if 'variables' in kw: env = kw.get('env', self.env) uselib = kw.get('uselib_store', kw['package'].upper()) vars = Utils.to_list(kw['variables']) for v in vars: val = self.cmd_and_log(lst + ['--variable=' + v]).strip() var = '%s_%s' % (uselib, v) env[var] = val if not 'okmsg' in kw: kw['okmsg'] = 'yes' return static = False if 'args' in kw: args = Utils.to_list(kw['args']) if '--static' in args or '--static-libs' in args: static = True lst += args # so we assume the command-line will output flags to be parsed afterwards ret = self.cmd_and_log(lst) if not 'okmsg' in kw: kw['okmsg'] = 'yes' self.define(self.have_define(kw.get('uselib_store', kw['package'])), 1, 0) self.parse_flags(ret, kw.get('uselib_store', kw['package'].upper()), kw.get('env', self.env), force_static=static) return ret @conf def check_cfg(self, *k, **kw): """ Check for configuration flags using a **-config**-like program (pkg-config, sdl-config, etc). Encapsulate the calls to :py:func:`waflib.Tools.c_config.validate_cfg` and :py:func:`waflib.Tools.c_config.exec_cfg` A few examples:: def configure(conf): conf.load('compiler_c') conf.check_cfg(package='glib-2.0', args='--libs --cflags') conf.check_cfg(package='glib-2.0', uselib_store='GLIB', atleast_version='2.10.0', args='--cflags --libs') conf.check_cfg(package='pango') conf.check_cfg(package='pango', uselib_store='MYPANGO', args=['--cflags', '--libs']) conf.check_cfg(package='pango', args=['pango >= 0.1.0', 'pango < 9.9.9', '--cflags', '--libs'], msg="Checking for 'pango 0.1.0'") conf.check_cfg(path='sdl-config', args='--cflags --libs', package='', uselib_store='SDL') conf.check_cfg(path='mpicc', args='--showme:compile --showme:link', package='', uselib_store='OPEN_MPI', mandatory=False) """ if k: lst = k[0].split() kw['package'] = lst[0] kw['args'] = ' '.join(lst[1:]) self.validate_cfg(kw) if 'msg' in kw: self.start_msg(kw['msg']) ret = None try: ret = self.exec_cfg(kw) except self.errors.WafError as e: if 'errmsg' in kw: self.end_msg(kw['errmsg'], 'YELLOW') if Logs.verbose > 1: raise else: self.fatal('The configuration failed') else: kw['success'] = ret if 'okmsg' in kw: self.end_msg(self.ret_msg(kw['okmsg'], kw)) return ret @conf def validate_c(self, kw): """ pre-check the parameters that will be given to run_c_code :param env: an optional environment (modified -> provide a copy) :type env: :py:class:`waflib.ConfigSet.ConfigSet` :param compiler: c or cxx (tries to guess what is best) :type compiler: string :param type: cprogram, cshlib, cstlib - not required if *features are given directly* :type type: binary to create :param feature: desired features for the task generator that will execute the test, for example ``cxx cxxstlib`` :type feature: list of string :param fragment: provide a piece of code for the test (default is to let the system create one) :type fragment: string :param uselib_store: define variables after the test is executed (IMPORTANT!) :type uselib_store: string :param use: parameters to use for building (just like the normal *use* keyword) :type use: list of string :param define_name: define to set when the check is over :type define_name: string :param execute: execute the resulting binary :type execute: bool :param define_ret: if execute is set to True, use the execution output in both the define and the return value :type define_ret: bool :param header_name: check for a particular header :type header_name: string :param auto_add_header_name: if header_name was set, add the headers in env.INCKEYS so the next tests will include these headers :type auto_add_header_name: bool """ if not 'env' in kw: kw['env'] = self.env.derive() env = kw['env'] if not 'compiler' in kw and not 'features' in kw: kw['compiler'] = 'c' if env['CXX_NAME'] and Task.classes.get('cxx', None): kw['compiler'] = 'cxx' if not self.env['CXX']: self.fatal('a c++ compiler is required') else: if not self.env['CC']: self.fatal('a c compiler is required') if not 'compile_mode' in kw: kw['compile_mode'] = 'c' if 'cxx' in Utils.to_list(kw.get('features',[])) or kw.get('compiler', '') == 'cxx': kw['compile_mode'] = 'cxx' if not 'type' in kw: kw['type'] = 'cprogram' if not 'features' in kw: kw['features'] = [kw['compile_mode'], kw['type']] # "cprogram c" else: kw['features'] = Utils.to_list(kw['features']) if not 'compile_filename' in kw: kw['compile_filename'] = 'test.c' + ((kw['compile_mode'] == 'cxx') and 'pp' or '') def to_header(dct): if 'header_name' in dct: dct = Utils.to_list(dct['header_name']) return ''.join(['#include <%s>\n' % x for x in dct]) return '' #OSX if 'framework_name' in kw: fwkname = kw['framework_name'] if not 'uselib_store' in kw: kw['uselib_store'] = fwkname.upper() if not kw.get('no_header', False): if not 'header_name' in kw: kw['header_name'] = [] fwk = '%s/%s.h' % (fwkname, fwkname) if kw.get('remove_dot_h', None): fwk = fwk[:-2] kw['header_name'] = Utils.to_list(kw['header_name']) + [fwk] kw['msg'] = 'Checking for framework %s' % fwkname kw['framework'] = fwkname #kw['frameworkpath'] = set it yourself if 'function_name' in kw: fu = kw['function_name'] if not 'msg' in kw: kw['msg'] = 'Checking for function %s' % fu kw['code'] = to_header(kw) + SNIP_FUNCTION % fu if not 'uselib_store' in kw: kw['uselib_store'] = fu.upper() if not 'define_name' in kw: kw['define_name'] = self.have_define(fu) elif 'type_name' in kw: tu = kw['type_name'] if not 'header_name' in kw: kw['header_name'] = 'stdint.h' if 'field_name' in kw: field = kw['field_name'] kw['code'] = to_header(kw) + SNIP_FIELD % {'type_name' : tu, 'field_name' : field} if not 'msg' in kw: kw['msg'] = 'Checking for field %s in %s' % (field, tu) if not 'define_name' in kw: kw['define_name'] = self.have_define((tu + '_' + field).upper()) else: kw['code'] = to_header(kw) + SNIP_TYPE % {'type_name' : tu} if not 'msg' in kw: kw['msg'] = 'Checking for type %s' % tu if not 'define_name' in kw: kw['define_name'] = self.have_define(tu.upper()) elif 'header_name' in kw: if not 'msg' in kw: kw['msg'] = 'Checking for header %s' % kw['header_name'] l = Utils.to_list(kw['header_name']) assert len(l)>0, 'list of headers in header_name is empty' kw['code'] = to_header(kw) + SNIP_EMPTY_PROGRAM if not 'uselib_store' in kw: kw['uselib_store'] = l[0].upper() if not 'define_name' in kw: kw['define_name'] = self.have_define(l[0]) if 'lib' in kw: if not 'msg' in kw: kw['msg'] = 'Checking for library %s' % kw['lib'] if not 'uselib_store' in kw: kw['uselib_store'] = kw['lib'].upper() if 'stlib' in kw: if not 'msg' in kw: kw['msg'] = 'Checking for static library %s' % kw['stlib'] if not 'uselib_store' in kw: kw['uselib_store'] = kw['stlib'].upper() if 'fragment' in kw: # an additional code fragment may be provided to replace the predefined code # in custom headers kw['code'] = kw['fragment'] if not 'msg' in kw: kw['msg'] = 'Checking for code snippet' if not 'errmsg' in kw: kw['errmsg'] = 'no' for (flagsname,flagstype) in [('cxxflags','compiler'), ('cflags','compiler'), ('linkflags','linker')]: if flagsname in kw: if not 'msg' in kw: kw['msg'] = 'Checking for %s flags %s' % (flagstype, kw[flagsname]) if not 'errmsg' in kw: kw['errmsg'] = 'no' if not 'execute' in kw: kw['execute'] = False if kw['execute']: kw['features'].append('test_exec') if not 'errmsg' in kw: kw['errmsg'] = 'not found' if not 'okmsg' in kw: kw['okmsg'] = 'yes' if not 'code' in kw: kw['code'] = SNIP_EMPTY_PROGRAM # if there are headers to append automatically to the next tests if self.env[INCKEYS]: kw['code'] = '\n'.join(['#include <%s>' % x for x in self.env[INCKEYS]]) + '\n' + kw['code'] if not kw.get('success'): kw['success'] = None if 'define_name' in kw: self.undefine(kw['define_name']) assert 'msg' in kw, 'invalid parameters, read http://freehackers.org/~tnagy/wafbook/single.html#config_helpers_c' @conf def post_check(self, *k, **kw): "Set the variables after a test executed in :py:func:`waflib.Tools.c_config.check` was run successfully" is_success = 0 if kw['execute']: if kw['success'] is not None: if kw.get('define_ret', False): is_success = kw['success'] else: is_success = (kw['success'] == 0) else: is_success = (kw['success'] == 0) if 'define_name' in kw: # TODO simplify? if 'header_name' in kw or 'function_name' in kw or 'type_name' in kw or 'fragment' in kw: nm = kw['define_name'] if kw['execute'] and kw.get('define_ret', None) and isinstance(is_success, str): self.define(kw['define_name'], is_success, quote=kw.get('quote', 1)) else: self.define_cond(kw['define_name'], is_success) else: self.define_cond(kw['define_name'], is_success) if 'header_name' in kw: if kw.get('auto_add_header_name', False): self.env.append_value(INCKEYS, Utils.to_list(kw['header_name'])) if is_success and 'uselib_store' in kw: from waflib.Tools import ccroot # TODO see get_uselib_vars from ccroot.py _vars = set([]) for x in kw['features']: if x in ccroot.USELIB_VARS: _vars |= ccroot.USELIB_VARS[x] for k in _vars: lk = k.lower() if k == 'INCLUDES': lk = 'includes' if k == 'DEFINES': lk = 'defines' if lk in kw: val = kw[lk] # remove trailing slash if isinstance(val, str): val = val.rstrip(os.path.sep) self.env.append_unique(k + '_' + kw['uselib_store'], val) return is_success @conf def check(self, *k, **kw): """ Perform a configuration test by calling :py:func:`waflib.Tools.c_config.run_c_code`. For the complete list of parameters, see :py:func:`waflib.Tools.c_config.validate_c`. To force a specific compiler, prefer the methods :py:func:`waflib.Tools.c_config.check_cxx` or :py:func:`waflib.Tools.c_config.check_cc` """ self.validate_c(kw) self.start_msg(kw['msg']) ret = None try: ret = self.run_c_code(*k, **kw) except self.errors.ConfigurationError as e: self.end_msg(kw['errmsg'], 'YELLOW') if Logs.verbose > 1: raise else: self.fatal('The configuration failed') else: kw['success'] = ret self.end_msg(self.ret_msg(kw['okmsg'], kw)) ret = self.post_check(*k, **kw) if not ret: self.fatal('The configuration failed %r' % ret) return ret class test_exec(Task.Task): """ A task for executing a programs after they are built. See :py:func:`waflib.Tools.c_config.test_exec_fun`. """ color = 'PINK' def run(self): if getattr(self.generator, 'rpath', None): if getattr(self.generator, 'define_ret', False): self.generator.bld.retval = self.generator.bld.cmd_and_log([self.inputs[0].abspath()]) else: self.generator.bld.retval = self.generator.bld.exec_command([self.inputs[0].abspath()]) else: env = self.env.env or {} env.update(dict(os.environ)) for var in ('LD_LIBRARY_PATH', 'DYLD_LIBRARY_PATH', 'PATH'): env[var] = self.inputs[0].parent.abspath() + os.path.pathsep + env.get(var, '') if getattr(self.generator, 'define_ret', False): self.generator.bld.retval = self.generator.bld.cmd_and_log([self.inputs[0].abspath()], env=env) else: self.generator.bld.retval = self.generator.bld.exec_command([self.inputs[0].abspath()], env=env) @feature('test_exec') @after_method('apply_link') def test_exec_fun(self): """ The feature **test_exec** is used to create a task that will to execute the binary created (link task output) during the build. The exit status will be set on the build context, so only one program may have the feature *test_exec*. This is used by configuration tests:: def configure(conf): conf.check(execute=True) """ self.create_task('test_exec', self.link_task.outputs[0]) CACHE_RESULTS = 1 COMPILE_ERRORS = 2 @conf def run_c_code(self, *k, **kw): """ Create a temporary build context to execute a build. A reference to that build context is kept on self.test_bld for debugging purposes, and you should not rely on it too much (read the note on the cache below). The parameters given in the arguments to this function are passed as arguments for a single task generator created in the build. Only three parameters are obligatory: :param features: features to pass to a task generator created in the build :type features: list of string :param compile_filename: file to create for the compilation (default: *test.c*) :type compile_filename: string :param code: code to write in the filename to compile :type code: string Though this function returns *0* by default, the build may set an attribute named *retval* on the build context object to return a particular value. See :py:func:`waflib.Tools.c_config.test_exec_fun` for example. This function also provides a limited cache. To use it, provide the following option:: def options(opt): opt.add_option('--confcache', dest='confcache', default=0, action='count', help='Use a configuration cache') And execute the configuration with the following command-line:: $ waf configure --confcache """ lst = [str(v) for (p, v) in kw.items() if p != 'env'] h = Utils.h_list(lst) dir = self.bldnode.abspath() + os.sep + (not Utils.is_win32 and '.' or '') + 'conf_check_' + Utils.to_hex(h) try: os.makedirs(dir) except: pass try: os.stat(dir) except: self.fatal('cannot use the configuration test folder %r' % dir) cachemode = getattr(Options.options, 'confcache', None) if cachemode == CACHE_RESULTS: try: proj = ConfigSet.ConfigSet(os.path.join(dir, 'cache_run_c_code')) ret = proj['cache_run_c_code'] except: pass else: if isinstance(ret, str) and ret.startswith('Test does not build'): self.fatal(ret) return ret bdir = os.path.join(dir, 'testbuild') if not os.path.exists(bdir): os.makedirs(bdir) self.test_bld = bld = Build.BuildContext(top_dir=dir, out_dir=bdir) bld.init_dirs() bld.progress_bar = 0 bld.targets = '*' if kw['compile_filename']: node = bld.srcnode.make_node(kw['compile_filename']) node.write(kw['code']) bld.logger = self.logger bld.all_envs.update(self.all_envs) # not really necessary bld.env = kw['env'] o = bld(features=kw['features'], source=kw['compile_filename'], target='testprog') for k, v in kw.items(): setattr(o, k, v) self.to_log("==>\n%s\n<==" % kw['code']) # compile the program bld.targets = '*' ret = -1 try: try: bld.compile() except Errors.WafError: ret = 'Test does not build: %s' % Utils.ex_stack() self.fatal(ret) else: ret = getattr(bld, 'retval', 0) finally: # cache the results each time proj = ConfigSet.ConfigSet() proj['cache_run_c_code'] = ret proj.store(os.path.join(dir, 'cache_run_c_code')) return ret @conf def check_cxx(self, *k, **kw): """ Same as :py:func:`waflib.Tools.c_config.check` but default to the *c++* programming language """ kw['compiler'] = 'cxx' return self.check(*k, **kw) @conf def check_cc(self, *k, **kw): """ Same as :py:func:`waflib.Tools.c_config.check` but default to the *c* programming language """ kw['compiler'] = 'c' return self.check(*k, **kw) @conf def define(self, key, val, quote=True): """ Store a single define and its state into conf.env.DEFINES :param key: define name :type key: string :param val: value :type val: int or string :param quote: enclose strings in quotes (yes by default) :type quote: bool """ assert key and isinstance(key, str) if isinstance(val, int) or isinstance(val, float): s = '%s=%s' else: s = quote and '%s="%s"' or '%s=%s' app = s % (key, str(val)) ban = key + '=' lst = self.env['DEFINES'] for x in lst: if x.startswith(ban): lst[lst.index(x)] = app break else: self.env.append_value('DEFINES', app) self.env.append_unique(DEFKEYS, key) @conf def undefine(self, key): """ Remove a define from conf.env.DEFINES :param key: define name :type key: string """ assert key and isinstance(key, str) ban = key + '=' lst = [x for x in self.env['DEFINES'] if not x.startswith(ban)] self.env['DEFINES'] = lst self.env.append_unique(DEFKEYS, key) @conf def define_cond(self, key, val): """ Conditionally define a name:: def configure(conf): conf.define_cond('A', True) # equivalent to: # if val: conf.define('A', 1) # else: conf.undefine('A') :param key: define name :type key: string :param val: value :type val: int or string """ assert key and isinstance(key, str) if val: self.define(key, 1) else: self.undefine(key) @conf def is_defined(self, key): """ :param key: define name :type key: string :return: True if the define is set :rtype: bool """ assert key and isinstance(key, str) ban = key + '=' for x in self.env['DEFINES']: if x.startswith(ban): return True return False @conf def get_define(self, key): """ :param key: define name :type key: string :return: the value of a previously stored define or None if it is not set """ assert key and isinstance(key, str) ban = key + '=' for x in self.env['DEFINES']: if x.startswith(ban): return x[len(ban):] return None @conf def have_define(self, key): """ :param key: define name :type key: string :return: the input key prefixed by *HAVE_* and substitute any invalid characters. :rtype: string """ return self.__dict__.get('HAVE_PAT', 'HAVE_%s') % Utils.quote_define_name(key) @conf def write_config_header(self, configfile='', guard='', top=False, env=None, defines=True, headers=False, remove=True): """ Write a configuration header containing defines and includes:: def configure(cnf): cnf.define('A', 1) cnf.write_config_header('config.h') :param configfile: relative path to the file to create :type configfile: string :param env: config set to read the definitions from (default is conf.env) :type env: :py:class:`waflib.ConfigSet.ConfigSet` :param top: write the configuration header from the build directory (default is from the current path) :type top: bool :param defines: add the defines (yes by default) :type defines: bool :param headers: add #include in the file :type headers: bool :param remove: remove the defines after they are added (yes by default) :type remove: bool """ if not configfile: configfile = WAF_CONFIG_H waf_guard = guard or '_%s_WAF' % Utils.quote_define_name(configfile) node = top and self.bldnode or self.path.get_bld() node = node.make_node(configfile) node.parent.mkdir() lst = ['/* WARNING! All changes made to this file will be lost! */\n'] lst.append('#ifndef %s\n#define %s\n' % (waf_guard, waf_guard)) lst.append(self.get_config_header(defines, headers)) lst.append('\n#endif /* %s */\n' % waf_guard) node.write('\n'.join(lst)) env = env or self.env # config files are not removed on "waf clean" env.append_unique(Build.CFG_FILES, [node.abspath()]) if remove: for key in self.env[DEFKEYS]: self.undefine(key) self.env[DEFKEYS] = [] @conf def get_config_header(self, defines=True, headers=False): """ Create the contents of a ``config.h`` file from the defines and includes set in conf.env.define_key / conf.env.include_key. No include guards are added. :param defines: write the defines values :type defines: bool :param headers: write the headers :type headers: bool :return: the contents of a ``config.h`` file :rtype: string """ lst = [] if headers: for x in self.env[INCKEYS]: lst.append('#include <%s>' % x) if defines: for x in self.env[DEFKEYS]: if self.is_defined(x): val = self.get_define(x) lst.append('#define %s %s' % (x, val)) else: lst.append('/* #undef %s */' % x) return "\n".join(lst) @conf def cc_add_flags(conf): """ Read the CFLAGS/CPPFLAGS from os.environ and add to conf.env.CFLAGS """ conf.add_os_flags('CPPFLAGS', 'CFLAGS') conf.add_os_flags('CFLAGS') @conf def cxx_add_flags(conf): """ Read the CXXFLAGS/CPPFLAGS and add to conf.env.CXXFLAGS """ conf.add_os_flags('CPPFLAGS', 'CXXFLAGS') conf.add_os_flags('CXXFLAGS') @conf def link_add_flags(conf): """ Read the LINKFLAGS/LDFLAGS and add to conf.env.LDFLAGS """ conf.add_os_flags('LINKFLAGS') conf.add_os_flags('LDFLAGS', 'LINKFLAGS') @conf def cc_load_tools(conf): """ Load the c tool """ if not conf.env.DEST_OS: conf.env.DEST_OS = Utils.unversioned_sys_platform() conf.load('c') @conf def cxx_load_tools(conf): """ Load the cxx tool """ if not conf.env.DEST_OS: conf.env.DEST_OS = Utils.unversioned_sys_platform() conf.load('cxx') @conf def get_cc_version(conf, cc, gcc=False, icc=False): """ Run the preprocessor to determine the compiler version The variables CC_VERSION, DEST_OS, DEST_BINFMT and DEST_CPU will be set in *conf.env* """ cmd = cc + ['-dM', '-E', '-'] env = conf.env.env or None try: p = Utils.subprocess.Popen(cmd, stdin=Utils.subprocess.PIPE, stdout=Utils.subprocess.PIPE, stderr=Utils.subprocess.PIPE, env=env) p.stdin.write('\n'.encode()) out = p.communicate()[0] except: conf.fatal('Could not determine the compiler version %r' % cmd) if not isinstance(out, str): out = out.decode(sys.stdout.encoding) if gcc: if out.find('__INTEL_COMPILER') >= 0: conf.fatal('The intel compiler pretends to be gcc') if out.find('__GNUC__') < 0: conf.fatal('Could not determine the compiler type') if icc and out.find('__INTEL_COMPILER') < 0: conf.fatal('Not icc/icpc') k = {} if icc or gcc: out = out.split('\n') for line in out: lst = shlex.split(line) if len(lst)>2: key = lst[1] val = lst[2] k[key] = val def isD(var): return var in k def isT(var): return var in k and k[var] != '0' # Some documentation is available at http://predef.sourceforge.net # The names given to DEST_OS must match what Utils.unversioned_sys_platform() returns. if not conf.env.DEST_OS: conf.env.DEST_OS = '' for i in MACRO_TO_DESTOS: if isD(i): conf.env.DEST_OS = MACRO_TO_DESTOS[i] break else: if isD('__APPLE__') and isD('__MACH__'): conf.env.DEST_OS = 'darwin' elif isD('__unix__'): # unix must be tested last as it's a generic fallback conf.env.DEST_OS = 'generic' if isD('__ELF__'): conf.env.DEST_BINFMT = 'elf' elif isD('__WINNT__') or isD('__CYGWIN__'): conf.env.DEST_BINFMT = 'pe' conf.env.LIBDIR = conf.env['PREFIX'] + '/bin' elif isD('__APPLE__'): conf.env.DEST_BINFMT = 'mac-o' if not conf.env.DEST_BINFMT: # Infer the binary format from the os name. conf.env.DEST_BINFMT = Utils.destos_to_binfmt(conf.env.DEST_OS) for i in MACRO_TO_DEST_CPU: if isD(i): conf.env.DEST_CPU = MACRO_TO_DEST_CPU[i] break Logs.debug('ccroot: dest platform: ' + ' '.join([conf.env[x] or '?' for x in ('DEST_OS', 'DEST_BINFMT', 'DEST_CPU')])) if icc: ver = k['__INTEL_COMPILER'] conf.env['CC_VERSION'] = (ver[:-2], ver[-2], ver[-1]) else: conf.env['CC_VERSION'] = (k['__GNUC__'], k['__GNUC_MINOR__'], k['__GNUC_PATCHLEVEL__']) return k @conf def get_xlc_version(conf, cc): """Get the compiler version""" version_re = re.compile(r"IBM XL C/C\+\+.*, V(?P\d*)\.(?P\d*)", re.I).search cmd = cc + ['-qversion'] try: out, err = conf.cmd_and_log(cmd, output=0) except Errors.WafError: conf.fatal('Could not find xlc %r' % cmd) if out: match = version_re(out) else: match = version_re(err) if not match: conf.fatal('Could not determine the XLC version.') k = match.groupdict() conf.env['CC_VERSION'] = (k['major'], k['minor']) # ============ the --as-needed flag should added during the configuration, not at runtime ========= @conf def add_as_needed(self): """ Add ``--as-needed`` to the *LINKFLAGS* """ if self.env.DEST_BINFMT == 'elf' and 'gcc' in (self.env.CXX_NAME, self.env.CC_NAME): self.env.append_unique('LINKFLAGS', '--as-needed') # ============ parallel configuration class cfgtask(Task.TaskBase): """ A task that executes configuration tests make sure that the checks write to conf.env in a thread-safe manner for the moment it only executes conf.check """ def display(self): return '' def runnable_status(self): return Task.RUN_ME def run(self): conf = self.conf bld = Build.BuildContext(top_dir=conf.srcnode.abspath(), out_dir=conf.bldnode.abspath()) bld.env = conf.env bld.init_dirs() bld.in_msg = 1 # suppress top-level start_msg bld.logger = self.logger try: bld.check(**self.args) except: return 1 @conf def multicheck(self, *k, **kw): """ Use tuples to perform parallel configuration tests """ self.start_msg(kw.get('msg', 'Executing %d configuration tests' % len(k))) class par(object): def __init__(self): self.keep = False self.cache_global = Options.cache_global self.nocache = Options.options.nocache self.returned_tasks = [] def total(self): return len(tasks) def to_log(self, *k, **kw): return bld = par() tasks = [] for dct in k: x = cfgtask(bld=bld) tasks.append(x) x.args = dct x.bld = bld x.conf = self x.args = dct # bind a logger that will keep the info in memory x.logger = Logs.make_mem_logger(str(id(x)), self.logger) def it(): yield tasks while 1: yield [] p = Runner.Parallel(bld, Options.options.jobs) p.biter = it() p.start() # flush the logs in order into the config.log for x in tasks: x.logger.memhandler.flush() for x in tasks: if x.hasrun != Task.SUCCESS: self.end_msg(kw.get('errmsg', 'no'), color='YELLOW') self.fatal(kw.get('fatalmsg', None) or 'One of the tests has failed, see the config.log for more information') self.end_msg('ok') kupfer-v208/waflib/Tools/c_osx.py000066400000000000000000000126151176220042200171010ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy 2008-2010 """ MacOSX related tools """ import os, shutil, sys, platform from waflib import TaskGen, Task, Build, Options, Utils, Errors from waflib.TaskGen import taskgen_method, feature, after_method, before_method app_info = ''' CFBundlePackageType APPL CFBundleGetInfoString Created by Waf CFBundleSignature ???? NOTE THIS IS A GENERATED FILE, DO NOT MODIFY CFBundleExecutable %s ''' """ plist template """ @feature('c', 'cxx') def set_macosx_deployment_target(self): """ see WAF issue 285 and also and also http://trac.macports.org/ticket/17059 """ if self.env['MACOSX_DEPLOYMENT_TARGET']: os.environ['MACOSX_DEPLOYMENT_TARGET'] = self.env['MACOSX_DEPLOYMENT_TARGET'] elif 'MACOSX_DEPLOYMENT_TARGET' not in os.environ: if Utils.unversioned_sys_platform() == 'darwin': os.environ['MACOSX_DEPLOYMENT_TARGET'] = '.'.join(platform.mac_ver()[0].split('.')[:2]) @taskgen_method def create_bundle_dirs(self, name, out): """ Create bundle folders, used by :py:func:`create_task_macplist` and :py:func:`create_task_macapp` """ bld = self.bld dir = out.parent.find_or_declare(name) dir.mkdir() macos = dir.find_or_declare(['Contents', 'MacOS']) macos.mkdir() return dir def bundle_name_for_output(out): name = out.name k = name.rfind('.') if k >= 0: name = name[:k] + '.app' else: name = name + '.app' return name @feature('cprogram', 'cxxprogram') @after_method('apply_link') def create_task_macapp(self): """ To compile an executable into a Mac application (a .app), set its *mac_app* attribute:: def build(bld): bld.shlib(source='a.c', target='foo', mac_app = True) To force *all* executables to be transformed into Mac applications:: def build(bld): bld.env.MACAPP = True bld.shlib(source='a.c', target='foo') """ if self.env['MACAPP'] or getattr(self, 'mac_app', False): out = self.link_task.outputs[0] name = bundle_name_for_output(out) dir = self.create_bundle_dirs(name, out) n1 = dir.find_or_declare(['Contents', 'MacOS', out.name]) self.apptask = self.create_task('macapp', self.link_task.outputs, n1) inst_to = getattr(self, 'install_path', '/Applications') + '/%s/Contents/MacOS/' % name self.bld.install_files(inst_to, n1, chmod=Utils.O755) if getattr(self, 'mac_resources', None): res_dir = n1.parent.parent.make_node('Resources') inst_to = getattr(self, 'install_path', '/Applications') + '/%s/Resources' % name for x in self.to_list(self.mac_resources): node = self.path.find_node(x) if not node: raise Errors.WafError('Missing mac_resource %r in %r' % (x, self)) parent = node.parent if os.path.isdir(node.abspath()): nodes = node.ant_glob('**') else: nodes = [node] for node in nodes: rel = node.path_from(parent) tsk = self.create_task('macapp', node, res_dir.make_node(rel)) self.bld.install_as(inst_to + '/%s' % rel, node) if getattr(self.bld, 'is_install', None): # disable the normal binary installation self.install_task.hasrun = Task.SKIP_ME @feature('cprogram', 'cxxprogram') @after_method('apply_link') def create_task_macplist(self): """ Create a :py:class:`waflib.Tools.c_osx.macplist` instance. """ if self.env['MACAPP'] or getattr(self, 'mac_app', False): out = self.link_task.outputs[0] name = bundle_name_for_output(out) dir = self.create_bundle_dirs(name, out) n1 = dir.find_or_declare(['Contents', 'Info.plist']) self.plisttask = plisttask = self.create_task('macplist', [], n1) if getattr(self, 'mac_plist', False): node = self.path.find_resource(self.mac_plist) if node: plisttask.inputs.append(node) else: plisttask.code = self.mac_plist else: plisttask.code = app_info % self.link_task.outputs[0].name inst_to = getattr(self, 'install_path', '/Applications') + '/%s/Contents/' % name self.bld.install_files(inst_to, n1) @feature('cshlib', 'cxxshlib') @before_method('apply_link', 'propagate_uselib_vars') def apply_bundle(self): """ To make a bundled shared library (a ``.bundle``), set the *mac_bundle* attribute:: def build(bld): bld.shlib(source='a.c', target='foo', mac_bundle = True) To force *all* executables to be transformed into bundles:: def build(bld): bld.env.MACBUNDLE = True bld.shlib(source='a.c', target='foo') """ if self.env['MACBUNDLE'] or getattr(self, 'mac_bundle', False): self.env['LINKFLAGS_cshlib'] = self.env['LINKFLAGS_cxxshlib'] = [] # disable the '-dynamiclib' flag self.env['cshlib_PATTERN'] = self.env['cxxshlib_PATTERN'] = self.env['macbundle_PATTERN'] use = self.use = self.to_list(getattr(self, 'use', [])) if not 'MACBUNDLE' in use: use.append('MACBUNDLE') app_dirs = ['Contents', 'Contents/MacOS', 'Contents/Resources'] class macapp(Task.Task): """ Create mac applications """ color = 'PINK' def run(self): self.outputs[0].parent.mkdir() shutil.copy2(self.inputs[0].srcpath(), self.outputs[0].abspath()) class macplist(Task.Task): """ Create plist files """ color = 'PINK' ext_in = ['.bin'] def run(self): if getattr(self, 'code', None): txt = self.code else: txt = self.inputs[0].read() self.outputs[0].write(txt) kupfer-v208/waflib/Tools/c_preproc.py000066400000000000000000000651421176220042200177450ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2006-2010 (ita) """ C/C++ preprocessor for finding dependencies Reasons for using the Waf preprocessor by default #. Some c/c++ extensions (Qt) require a custom preprocessor for obtaining the dependencies (.moc files) #. Not all compilers provide .d files for obtaining the dependencies (portability) #. A naive file scanner will not catch the constructs such as "#include foo()" #. A naive file scanner will catch unnecessary dependencies (change an unused header -> recompile everything) Regarding the speed concerns: * the preprocessing is performed only when files must be compiled * the macros are evaluated only for #if/#elif/#include * system headers are not scanned by default Now if you do not want the Waf preprocessor, the tool +gccdeps* uses the .d files produced during the compilation to track the dependencies (useful when used with the boost libraries). It only works with gcc >= 4.4 though. A dumb preprocessor is also available in the tool *c_dumbpreproc* """ # TODO: more varargs, pragma once import re, sys, os, string, traceback from waflib import Logs, Build, Utils, Errors from waflib.Logs import debug, error class PreprocError(Errors.WafError): pass POPFILE = '-' "Constant representing a special token used in :py:meth:`waflib.Tools.c_preproc.c_parser.start` iteration to switch to a header read previously" recursion_limit = 150 "Limit on the amount of files to read in the dependency scanner" go_absolute = False "Set to True to track headers on files in /usr/include, else absolute paths are ignored (but it becomes very slow)" standard_includes = ['/usr/include'] if Utils.is_win32: standard_includes = [] use_trigraphs = 0 """Apply trigraph rules (False by default)""" strict_quotes = 0 """Reserve the "#include <>" quotes for system includes (do not search for those includes). False by default.""" g_optrans = { 'not':'!', 'and':'&&', 'bitand':'&', 'and_eq':'&=', 'or':'||', 'bitor':'|', 'or_eq':'|=', 'xor':'^', 'xor_eq':'^=', 'compl':'~', } """Operators such as and/or/xor for c++. Set an empty dict to disable.""" # ignore #warning and #error re_lines = re.compile( '^[ \t]*(#|%:)[ \t]*(ifdef|ifndef|if|else|elif|endif|include|import|define|undef|pragma)[ \t]*(.*)\r*$', re.IGNORECASE | re.MULTILINE) """Match #include lines""" re_mac = re.compile("^[a-zA-Z_]\w*") """Match macro definitions""" re_fun = re.compile('^[a-zA-Z_][a-zA-Z0-9_]*[(]') """Match macro functions""" re_pragma_once = re.compile('^\s*once\s*', re.IGNORECASE) """Match #pragma once statements""" re_nl = re.compile('\\\\\r*\n', re.MULTILINE) """Match newlines""" re_cpp = re.compile( r"""(/\*[^*]*\*+([^/*][^*]*\*+)*/)|//[^\n]*|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)""", re.MULTILINE) """Filter C/C++ comments""" trig_def = [('??'+a, b) for a, b in zip("=-/!'()<>", r'#~\|^[]{}')] """Trigraph definitions""" chr_esc = {'0':0, 'a':7, 'b':8, 't':9, 'n':10, 'f':11, 'v':12, 'r':13, '\\':92, "'":39} """Escape characters""" NUM = 'i' """Number token""" OP = 'O' """Operator token""" IDENT = 'T' """Identifier token""" STR = 's' """String token""" CHAR = 'c' """Character token""" tok_types = [NUM, STR, IDENT, OP] """Token types""" exp_types = [ r"""0[xX](?P[a-fA-F0-9]+)(?P[uUlL]*)|L*?'(?P(\\.|[^\\'])+)'|(?P\d+)[Ee](?P[+-]*?\d+)(?P[fFlL]*)|(?P\d*\.\d+)([Ee](?P[+-]*?\d+))?(?P[fFlL]*)|(?P\d+\.\d*)([Ee](?P[+-]*?\d+))?(?P[fFlL]*)|(?P0*)(?P\d+)(?P[uUlL]*)""", r'L?"([^"\\]|\\.)*"', r'[a-zA-Z_]\w*', r'%:%:|<<=|>>=|\.\.\.|<<|<%|<:|<=|>>|>=|\+\+|\+=|--|->|-=|\*=|/=|%:|%=|%>|==|&&|&=|\|\||\|=|\^=|:>|!=|##|[\(\)\{\}\[\]<>\?\|\^\*\+&=:!#;,%/\-\?\~\.]', ] """Expression types""" re_clexer = re.compile('|'.join(["(?P<%s>%s)" % (name, part) for name, part in zip(tok_types, exp_types)]), re.M) """Match expressions into tokens""" accepted = 'a' """Parser state is *accepted*""" ignored = 'i' """Parser state is *ignored*, for example preprocessor lines in an #if 0 block""" undefined = 'u' """Parser state is *undefined* at the moment""" skipped = 's' """Parser state is *skipped*, for example preprocessor lines in a #elif 0 block""" def repl(m): """Replace function used with :py:attr:`waflib.Tools.c_preproc.re_cpp`""" s = m.group(1) if s: return ' ' return m.group(3) or '' def filter_comments(filename): """ Filter the comments from a c/h file, and return the preprocessor lines. The regexps :py:attr:`waflib.Tools.c_preproc.re_cpp`, :py:attr:`waflib.Tools.c_preproc.re_nl` and :py:attr:`waflib.Tools.c_preproc.re_lines` are used internally. :return: the preprocessor directives as a list of (keyword, line) :rtype: a list of string pairs """ # return a list of tuples : keyword, line code = Utils.readf(filename) if use_trigraphs: for (a, b) in trig_def: code = code.split(a).join(b) code = re_nl.sub('', code) code = re_cpp.sub(repl, code) return [(m.group(2), m.group(3)) for m in re.finditer(re_lines, code)] prec = {} """ Operator precendence rules required for parsing expressions of the form:: #if 1 && 2 != 0 """ ops = ['* / %', '+ -', '<< >>', '< <= >= >', '== !=', '& | ^', '&& ||', ','] for x in range(len(ops)): syms = ops[x] for u in syms.split(): prec[u] = x def trimquotes(s): """ Remove the single quotes around an expression:: trimquotes("'test'") == "test" :param s: expression to transform :type s: string :rtype: string """ if not s: return '' s = s.rstrip() if s[0] == "'" and s[-1] == "'": return s[1:-1] return s def reduce_nums(val_1, val_2, val_op): """ Apply arithmetic rules to compute a result :param val1: input parameter :type val1: int or string :param val2: input parameter :type val2: int or string :param val_op: C operator in *+*, */*, *-*, etc :type val_op: string :rtype: int """ #print val_1, val_2, val_op # now perform the operation, make certain a and b are numeric try: a = 0 + val_1 except TypeError: a = int(val_1) try: b = 0 + val_2 except TypeError: b = int(val_2) d = val_op if d == '%': c = a%b elif d=='+': c = a+b elif d=='-': c = a-b elif d=='*': c = a*b elif d=='/': c = a/b elif d=='^': c = a^b elif d=='|': c = a|b elif d=='||': c = int(a or b) elif d=='&': c = a&b elif d=='&&': c = int(a and b) elif d=='==': c = int(a == b) elif d=='!=': c = int(a != b) elif d=='<=': c = int(a <= b) elif d=='<': c = int(a < b) elif d=='>': c = int(a > b) elif d=='>=': c = int(a >= b) elif d=='^': c = int(a^b) elif d=='<<': c = a<>': c = a>>b else: c = 0 return c def get_num(lst): """ Try to obtain a number from a list of tokens. The token types are defined in :py:attr:`waflib.Tools.ccroot.tok_types`. :param lst: list of preprocessor tokens :type lst: list of tuple (tokentype, value) :return: a pair containing the number and the rest of the list :rtype: tuple(value, list) """ if not lst: raise PreprocError("empty list for get_num") (p, v) = lst[0] if p == OP: if v == '(': count_par = 1 i = 1 while i < len(lst): (p, v) = lst[i] if p == OP: if v == ')': count_par -= 1 if count_par == 0: break elif v == '(': count_par += 1 i += 1 else: raise PreprocError("rparen expected %r" % lst) (num, _) = get_term(lst[1:i]) return (num, lst[i+1:]) elif v == '+': return get_num(lst[1:]) elif v == '-': num, lst = get_num(lst[1:]) return (reduce_nums('-1', num, '*'), lst) elif v == '!': num, lst = get_num(lst[1:]) return (int(not int(num)), lst) elif v == '~': return (~ int(num), lst) else: raise PreprocError("Invalid op token %r for get_num" % lst) elif p == NUM: return v, lst[1:] elif p == IDENT: # all macros should have been replaced, remaining identifiers eval to 0 return 0, lst[1:] else: raise PreprocError("Invalid token %r for get_num" % lst) def get_term(lst): """ Evaluate an expression recursively, for example:: 1+1+1 -> 2+1 -> 3 :param lst: list of tokens :type lst: list of tuple(token, value) :return: the value and the remaining tokens :rtype: value, list """ if not lst: raise PreprocError("empty list for get_term") num, lst = get_num(lst) if not lst: return (num, []) (p, v) = lst[0] if p == OP: if v == '&&' and not num: return (num, []) elif v == '||' and num: return (num, []) elif v == ',': # skip return get_term(lst[1:]) elif v == '?': count_par = 0 i = 1 while i < len(lst): (p, v) = lst[i] if p == OP: if v == ')': count_par -= 1 elif v == '(': count_par += 1 elif v == ':': if count_par == 0: break i += 1 else: raise PreprocError("rparen expected %r" % lst) if int(num): return get_term(lst[1:i]) else: return get_term(lst[i+1:]) else: num2, lst = get_num(lst[1:]) if not lst: # no more tokens to process num2 = reduce_nums(num, num2, v) return get_term([(NUM, num2)] + lst) # operator precedence p2, v2 = lst[0] if p2 != OP: raise PreprocError("op expected %r" % lst) if prec[v2] >= prec[v]: num2 = reduce_nums(num, num2, v) return get_term([(NUM, num2)] + lst) else: num3, lst = get_num(lst[1:]) num3 = reduce_nums(num2, num3, v2) return get_term([(NUM, num), (p, v), (NUM, num3)] + lst) raise PreprocError("cannot reduce %r" % lst) def reduce_eval(lst): """ Take a list of tokens and output true or false for #if/#elif conditions. :param lst: a list of tokens :type lst: list of tuple(token, value) :return: a token :rtype: tuple(NUM, int) """ num, lst = get_term(lst) return (NUM, num) def stringize(lst): """ Merge a list of tokens into a string :param lst: a list of tokens :type lst: list of tuple(token, value) :rtype: string """ lst = [str(v2) for (p2, v2) in lst] return "".join(lst) def paste_tokens(t1, t2): """ Token pasting works between identifiers, particular operators, and identifiers and numbers:: a ## b -> ab > ## = -> >= a ## 2 -> a2 :param t1: token :type t1: tuple(type, value) :param t2: token :type t2: tuple(type, value) """ p1 = None if t1[0] == OP and t2[0] == OP: p1 = OP elif t1[0] == IDENT and (t2[0] == IDENT or t2[0] == NUM): p1 = IDENT elif t1[0] == NUM and t2[0] == NUM: p1 = NUM if not p1: raise PreprocError('tokens do not make a valid paste %r and %r' % (t1, t2)) return (p1, t1[1] + t2[1]) def reduce_tokens(lst, defs, ban=[]): """ Replace the tokens in lst, using the macros provided in defs, and a list of macros that cannot be re-applied :param lst: list of tokens :type lst: list of tuple(token, value) :param defs: macro definitions :type defs: dict :param ban: macros that cannot be substituted (recursion is not allowed) :type ban: list of string :return: the new list of tokens :rtype: value, list """ i = 0 while i < len(lst): (p, v) = lst[i] if p == IDENT and v == "defined": del lst[i] if i < len(lst): (p2, v2) = lst[i] if p2 == IDENT: if v2 in defs: lst[i] = (NUM, 1) else: lst[i] = (NUM, 0) elif p2 == OP and v2 == '(': del lst[i] (p2, v2) = lst[i] del lst[i] # remove the ident, and change the ) for the value if v2 in defs: lst[i] = (NUM, 1) else: lst[i] = (NUM, 0) else: raise PreprocError("Invalid define expression %r" % lst) elif p == IDENT and v in defs: if isinstance(defs[v], str): a, b = extract_macro(defs[v]) defs[v] = b macro_def = defs[v] to_add = macro_def[1] if isinstance(macro_def[0], list): # macro without arguments del lst[i] for x in range(len(to_add)): lst.insert(i, to_add[x]) i += 1 else: # collect the arguments for the funcall args = [] del lst[i] if i >= len(lst): raise PreprocError("expected '(' after %r (got nothing)" % v) (p2, v2) = lst[i] if p2 != OP or v2 != '(': raise PreprocError("expected '(' after %r" % v) del lst[i] one_param = [] count_paren = 0 while i < len(lst): p2, v2 = lst[i] del lst[i] if p2 == OP and count_paren == 0: if v2 == '(': one_param.append((p2, v2)) count_paren += 1 elif v2 == ')': if one_param: args.append(one_param) break elif v2 == ',': if not one_param: raise PreprocError("empty param in funcall %s" % p) args.append(one_param) one_param = [] else: one_param.append((p2, v2)) else: one_param.append((p2, v2)) if v2 == '(': count_paren += 1 elif v2 == ')': count_paren -= 1 else: raise PreprocError('malformed macro') # substitute the arguments within the define expression accu = [] arg_table = macro_def[0] j = 0 while j < len(to_add): (p2, v2) = to_add[j] if p2 == OP and v2 == '#': # stringize is for arguments only if j+1 < len(to_add) and to_add[j+1][0] == IDENT and to_add[j+1][1] in arg_table: toks = args[arg_table[to_add[j+1][1]]] accu.append((STR, stringize(toks))) j += 1 else: accu.append((p2, v2)) elif p2 == OP and v2 == '##': # token pasting, how can man invent such a complicated system? if accu and j+1 < len(to_add): # we have at least two tokens t1 = accu[-1] if to_add[j+1][0] == IDENT and to_add[j+1][1] in arg_table: toks = args[arg_table[to_add[j+1][1]]] if toks: accu[-1] = paste_tokens(t1, toks[0]) #(IDENT, accu[-1][1] + toks[0][1]) accu.extend(toks[1:]) else: # error, case "a##" accu.append((p2, v2)) accu.extend(toks) elif to_add[j+1][0] == IDENT and to_add[j+1][1] == '__VA_ARGS__': # TODO not sure # first collect the tokens va_toks = [] st = len(macro_def[0]) pt = len(args) for x in args[pt-st+1:]: va_toks.extend(x) va_toks.append((OP, ',')) if va_toks: va_toks.pop() # extra comma if len(accu)>1: (p3, v3) = accu[-1] (p4, v4) = accu[-2] if v3 == '##': # remove the token paste accu.pop() if v4 == ',' and pt < st: # remove the comma accu.pop() accu += va_toks else: accu[-1] = paste_tokens(t1, to_add[j+1]) j += 1 else: # Invalid paste, case "##a" or "b##" accu.append((p2, v2)) elif p2 == IDENT and v2 in arg_table: toks = args[arg_table[v2]] reduce_tokens(toks, defs, ban+[v]) accu.extend(toks) else: accu.append((p2, v2)) j += 1 reduce_tokens(accu, defs, ban+[v]) for x in range(len(accu)-1, -1, -1): lst.insert(i, accu[x]) i += 1 def eval_macro(lst, defs): """ Reduce the tokens by :py:func:`waflib.Tools.c_preproc.reduce_tokens` and try to return a 0/1 result by :py:func:`waflib.Tools.c_preproc.reduce_eval`. :param lst: list of tokens :type lst: list of tuple(token, value) :param defs: macro definitions :type defs: dict :rtype: int """ reduce_tokens(lst, defs, []) if not lst: raise PreprocError("missing tokens to evaluate") (p, v) = reduce_eval(lst) return int(v) != 0 def extract_macro(txt): """ Process a macro definition of the form:: #define f(x, y) x * y into a function or a simple macro without arguments :param txt: expression to exact a macro definition from :type txt: string :return: a tuple containing the name, the list of arguments and the replacement :rtype: tuple(string, [list, list]) """ t = tokenize(txt) if re_fun.search(txt): p, name = t[0] p, v = t[1] if p != OP: raise PreprocError("expected open parenthesis") i = 1 pindex = 0 params = {} prev = '(' while 1: i += 1 p, v = t[i] if prev == '(': if p == IDENT: params[v] = pindex pindex += 1 prev = p elif p == OP and v == ')': break else: raise PreprocError("unexpected token (3)") elif prev == IDENT: if p == OP and v == ',': prev = v elif p == OP and v == ')': break else: raise PreprocError("comma or ... expected") elif prev == ',': if p == IDENT: params[v] = pindex pindex += 1 prev = p elif p == OP and v == '...': raise PreprocError("not implemented (1)") else: raise PreprocError("comma or ... expected (2)") elif prev == '...': raise PreprocError("not implemented (2)") else: raise PreprocError("unexpected else") #~ print (name, [params, t[i+1:]]) return (name, [params, t[i+1:]]) else: (p, v) = t[0] return (v, [[], t[1:]]) re_include = re.compile('^\s*(<(?P.*)>|"(?P.*)")') def extract_include(txt, defs): """ Process a line in the form:: #include foo :param txt: include line to process :type txt: string :param defs: macro definitions :type defs: dict :return: the file name :rtype: string """ m = re_include.search(txt) if m: if m.group('a'): return '<', m.group('a') if m.group('b'): return '"', m.group('b') # perform preprocessing and look at the result, it must match an include toks = tokenize(txt) reduce_tokens(toks, defs, ['waf_include']) if not toks: raise PreprocError("could not parse include %s" % txt) if len(toks) == 1: if toks[0][0] == STR: return '"', toks[0][1] else: if toks[0][1] == '<' and toks[-1][1] == '>': return stringize(toks).lstrip('<').rstrip('>') raise PreprocError("could not parse include %s." % txt) def parse_char(txt): """ Parse a c character :param txt: character to parse :type txt: string :return: a character literal :rtype: string """ if not txt: raise PreprocError("attempted to parse a null char") if txt[0] != '\\': return ord(txt) c = txt[1] if c == 'x': if len(txt) == 4 and txt[3] in string.hexdigits: return int(txt[2:], 16) return int(txt[2:], 16) elif c.isdigit(): if c == '0' and len(txt)==2: return 0 for i in 3, 2, 1: if len(txt) > i and txt[1:1+i].isdigit(): return (1+i, int(txt[1:1+i], 8)) else: try: return chr_esc[c] except KeyError: raise PreprocError("could not parse char literal '%s'" % txt) @Utils.run_once def tokenize(s): """ Convert a string into a list of tokens (shlex.split does not apply to c/c++/d) :param s: input to tokenize :type s: string :return: a list of tokens :rtype: list of tuple(token, value) """ # the same headers are read again and again - 10% improvement on preprocessing the samba headers ret = [] for match in re_clexer.finditer(s): m = match.group for name in tok_types: v = m(name) if v: if name == IDENT: try: v = g_optrans[v]; name = OP except KeyError: # c++ specific if v.lower() == "true": v = 1 name = NUM elif v.lower() == "false": v = 0 name = NUM elif name == NUM: if m('oct'): v = int(v, 8) elif m('hex'): v = int(m('hex'), 16) elif m('n0'): v = m('n0') else: v = m('char') if v: v = parse_char(v) else: v = m('n2') or m('n4') elif name == OP: if v == '%:': v = '#' elif v == '%:%:': v = '##' elif name == STR: # remove the quotes around the string v = v[1:-1] ret.append((name, v)) break return ret @Utils.run_once def define_name(line): """ :param line: define line :type line: string :rtype: string :return: the define name """ return re_mac.match(line).group(0) class c_parser(object): """ Used by :py:func:`waflib.Tools.c_preproc.scan` to parse c/h files. Note that by default, only project headers are parsed. """ def __init__(self, nodepaths=None, defines=None): self.lines = [] """list of lines read""" if defines is None: self.defs = {} else: self.defs = dict(defines) # make a copy self.state = [] self.count_files = 0 self.currentnode_stack = [] self.nodepaths = nodepaths or [] """Include paths""" self.nodes = [] """List of :py:class:`waflib.Node.Node` found so far""" self.names = [] """List of file names that could not be matched by any file""" self.curfile = '' """Current file""" self.ban_includes = set([]) """Includes that must not be read (#pragma once)""" def cached_find_resource(self, node, filename): """ Find a file from the input directory :param node: directory :type node: :py:class:`waflib.Node.Node` :param filename: header to find :type filename: string :return: the node if found, or None :rtype: :py:class:`waflib.Node.Node` """ try: nd = node.ctx.cache_nd except: nd = node.ctx.cache_nd = {} tup = (node, filename) try: return nd[tup] except KeyError: ret = node.find_resource(filename) if ret: if getattr(ret, 'children', None): ret = None elif ret.is_child_of(node.ctx.bldnode): tmp = node.ctx.srcnode.search(ret.path_from(node.ctx.bldnode)) if tmp and getattr(tmp, 'children', None): ret = None nd[tup] = ret return ret def tryfind(self, filename): """ Try to obtain a node from the filename based from the include paths. Will add the node found to :py:attr:`waflib.Tools.c_preproc.c_parser.nodes` or the file name to :py:attr:`waflib.Tools.c_preproc.c_parser.names` if no corresponding file is found. Called by :py:attr:`waflib.Tools.c_preproc.c_parser.start`. :param filename: header to find :type filename: string :return: the node if found :rtype: :py:class:`waflib.Node.Node` """ self.curfile = filename # for msvc it should be a for loop on the whole stack found = self.cached_find_resource(self.currentnode_stack[-1], filename) for n in self.nodepaths: if found: break found = self.cached_find_resource(n, filename) if found: # TODO the duplicates do not increase the no-op build times too much, but they may be worth removing self.nodes.append(found) if filename[-4:] != '.moc': self.addlines(found) else: if not filename in self.names: self.names.append(filename) return found def addlines(self, node): """ Add the lines from a header in the list of preprocessor lines to parse :param node: header :type node: :py:class:`waflib.Node.Node` """ self.currentnode_stack.append(node.parent) filepath = node.abspath() self.count_files += 1 if self.count_files > recursion_limit: # issue #812 raise PreprocError("recursion limit exceeded") pc = self.parse_cache debug('preproc: reading file %r', filepath) try: lns = pc[filepath] except KeyError: pass else: self.lines.extend(lns) return try: lines = filter_comments(filepath) lines.append((POPFILE, '')) lines.reverse() pc[filepath] = lines # cache the lines filtered self.lines.extend(lines) except IOError: raise PreprocError("could not read the file %s" % filepath) except Exception: if Logs.verbose > 0: error("parsing %s failed" % filepath) traceback.print_exc() def start(self, node, env): """ Preprocess a source file to obtain the dependencies, which are accumulated to :py:attr:`waflib.Tools.c_preproc.c_parser.nodes` and :py:attr:`waflib.Tools.c_preproc.c_parser.names`. :param node: source file :type node: :py:class:`waflib.Node.Node` :param env: config set containing additional defines to take into account :type env: :py:class:`waflib.ConfigSet.ConfigSet` """ debug('preproc: scanning %s (in %s)', node.name, node.parent.name) bld = node.ctx try: self.parse_cache = bld.parse_cache except AttributeError: bld.parse_cache = {} self.parse_cache = bld.parse_cache self.addlines(node) # macros may be defined on the command-line, so they must be parsed as if they were part of the file if env['DEFINES']: try: lst = ['%s %s' % (x[0], trimquotes('='.join(x[1:]))) for x in [y.split('=') for y in env['DEFINES']]] lst.reverse() self.lines.extend([('define', x) for x in lst]) except AttributeError: # if the defines are invalid the compiler will tell the user pass while self.lines: (token, line) = self.lines.pop() if token == POPFILE: self.count_files -= 1 self.currentnode_stack.pop() continue try: ve = Logs.verbose if ve: debug('preproc: line is %s - %s state is %s', token, line, self.state) state = self.state # make certain we define the state if we are about to enter in an if block if token[:2] == 'if': state.append(undefined) elif token == 'endif': state.pop() # skip lines when in a dead 'if' branch, wait for the endif if token[0] != 'e': if skipped in self.state or ignored in self.state: continue if token == 'if': ret = eval_macro(tokenize(line), self.defs) if ret: state[-1] = accepted else: state[-1] = ignored elif token == 'ifdef': m = re_mac.match(line) if m and m.group(0) in self.defs: state[-1] = accepted else: state[-1] = ignored elif token == 'ifndef': m = re_mac.match(line) if m and m.group(0) in self.defs: state[-1] = ignored else: state[-1] = accepted elif token == 'include' or token == 'import': (kind, inc) = extract_include(line, self.defs) if inc in self.ban_includes: continue if token == 'import': self.ban_includes.add(inc) if ve: debug('preproc: include found %s (%s) ', inc, kind) if kind == '"' or not strict_quotes: self.tryfind(inc) elif token == 'elif': if state[-1] == accepted: state[-1] = skipped elif state[-1] == ignored: if eval_macro(tokenize(line), self.defs): state[-1] = accepted elif token == 'else': if state[-1] == accepted: state[-1] = skipped elif state[-1] == ignored: state[-1] = accepted elif token == 'define': try: self.defs[define_name(line)] = line except: raise PreprocError("Invalid define line %s" % line) elif token == 'undef': m = re_mac.match(line) if m and m.group(0) in self.defs: self.defs.__delitem__(m.group(0)) #print "undef %s" % name elif token == 'pragma': if re_pragma_once.match(line.lower()): self.ban_includes.add(self.curfile) except Exception as e: if Logs.verbose: debug('preproc: line parsing failed (%s): %s %s', e, line, Utils.ex_stack()) def scan(task): """ Get the dependencies using a c/c++ preprocessor, this is required for finding dependencies of the kind:: #include some_macro() This function is bound as a task method on :py:class:`waflib.Tools.c.c` and :py:class:`waflib.Tools.cxx.cxx` for example """ global go_absolute try: incn = task.generator.includes_nodes except AttributeError: raise Errors.WafError('%r is missing a feature such as "c", "cxx" or "includes": ' % task.generator) if go_absolute: nodepaths = incn + standard_includes else: nodepaths = [x for x in incn if x.is_child_of(x.ctx.srcnode) or x.is_child_of(x.ctx.bldnode)] tmp = c_parser(nodepaths) tmp.start(task.inputs[0], task.env) if Logs.verbose: debug('deps: deps for %r: %r; unresolved %r' % (task.inputs, tmp.nodes, tmp.names)) return (tmp.nodes, tmp.names) kupfer-v208/waflib/Tools/c_tests.py000066400000000000000000000132251176220042200174300ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2010 (ita) """ Various configuration tests. """ from waflib import Task from waflib.Configure import conf from waflib.TaskGen import feature, before_method, after_method import sys LIB_CODE = ''' #ifdef _MSC_VER #define testEXPORT __declspec(dllexport) #else #define testEXPORT #endif testEXPORT int lib_func(void) { return 9; } ''' MAIN_CODE = ''' #ifdef _MSC_VER #define testEXPORT __declspec(dllimport) #else #define testEXPORT #endif testEXPORT int lib_func(void); int main(void) {return !(lib_func() == 9);} ''' @feature('link_lib_test') @before_method('process_source') def link_lib_test_fun(self): """ The configuration test :py:func:`waflib.Tools.ccroot.run_c_code` declares a unique task generator, so we need to create other task generators from here to check if the linker is able to link libraries. """ def write_test_file(task): task.outputs[0].write(task.generator.code) rpath = [] if getattr(self, 'add_rpath', False): rpath = [self.bld.path.get_bld().abspath()] mode = self.mode m = '%s %s' % (mode, mode) ex = self.test_exec and 'test_exec' or '' bld = self.bld bld(rule=write_test_file, target='test.' + mode, code=LIB_CODE) bld(rule=write_test_file, target='main.' + mode, code=MAIN_CODE) bld(features='%sshlib' % m, source='test.' + mode, target='test') bld(features='%sprogram %s' % (m, ex), source='main.' + mode, target='app', use='test', rpath=rpath) @conf def check_library(self, mode=None, test_exec=True): """ Check if libraries can be linked with the current linker. Uses :py:func:`waflib.Tools.c_tests.link_lib_test_fun`. :param mode: c or cxx or d :type mode: string """ if not mode: mode = 'c' if self.env.CXX: mode = 'cxx' self.check( compile_filename = [], features = 'link_lib_test', msg = 'Checking for libraries', mode = mode, test_exec = test_exec, ) ######################################################################################## INLINE_CODE = ''' typedef int foo_t; static %s foo_t static_foo () {return 0; } %s foo_t foo () { return 0; } ''' INLINE_VALUES = ['inline', '__inline__', '__inline'] @conf def check_inline(self, **kw): """ Check for the right value for inline macro. Define INLINE_MACRO to 1 if the define is found. If the inline macro is not 'inline', add a define to the ``config.h`` (#define inline __inline__) :param define_name: define INLINE_MACRO by default to 1 if the macro is defined :type define_name: string :param features: by default *c* or *cxx* depending on the compiler present :type features: list of string """ self.start_msg('Checking for inline') if not 'define_name' in kw: kw['define_name'] = 'INLINE_MACRO' if not 'features' in kw: if self.env.CXX: kw['features'] = ['cxx'] else: kw['features'] = ['c'] for x in INLINE_VALUES: kw['fragment'] = INLINE_CODE % (x, x) try: self.check(**kw) except self.errors.ConfigurationError: continue else: self.end_msg(x) if x != 'inline': self.define('inline', x, quote=False) return x self.fatal('could not use inline functions') ######################################################################################## LARGE_FRAGMENT = '#include \nint main() { return !(sizeof(off_t) >= 8); }\n' @conf def check_large_file(self, **kw): """ Check for large file support and define the macro HAVE_LARGEFILE The test is skipped on win32 systems (DEST_BINFMT == pe). :param define_name: define to set, by default *HAVE_LARGEFILE* :type define_name: string :param execute: execute the test (yes by default) :type execute: bool """ if not 'define_name' in kw: kw['define_name'] = 'HAVE_LARGEFILE' if not 'execute' in kw: kw['execute'] = True if not 'features' in kw: if self.env.CXX: kw['features'] = ['cxx', 'cxxprogram'] else: kw['features'] = ['c', 'cprogram'] kw['fragment'] = LARGE_FRAGMENT kw['msg'] = 'Checking for large file support' ret = True try: if self.env.DEST_BINFMT != 'pe': ret = self.check(**kw) except self.errors.ConfigurationError: pass else: if ret: return True kw['msg'] = 'Checking for -D_FILE_OFFSET_BITS=64' kw['defines'] = ['_FILE_OFFSET_BITS=64'] try: ret = self.check(**kw) except self.errors.ConfigurationError: pass else: self.define('_FILE_OFFSET_BITS', 64) return ret self.fatal('There is no support for large files') ######################################################################################## ENDIAN_FRAGMENT = ''' short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; ''' class grep_for_endianness(Task.Task): color = 'PINK' def run(self): txt = self.inputs[0].read(flags='rb').decode('iso8859-1') if txt.find('LiTTleEnDian') > -1: self.generator.tmp.append('little') elif txt.find('BIGenDianSyS') > -1: self.generator.tmp.append('big') else: return -1 @feature('grep_for_endianness') @after_method('process_source') def grep_for_endianness_fun(self): self.create_task('grep_for_endianness', self.compiled_tasks[0].outputs[0]) @conf def check_endianness(self): """ Execute a configuration test to determine the endianness """ tmp = [] def check_msg(self): return tmp[0] self.check(fragment=ENDIAN_FRAGMENT, features='c grep_for_endianness', msg="Checking for endianness", define='ENDIANNESS', tmp=tmp, okmsg=check_msg) return tmp[0] kupfer-v208/waflib/Tools/ccroot.py000066400000000000000000000463701176220042200172640ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) """ Classes and methods shared by tools providing support for C-like language such as C/C++/D/Assembly/Go (this support module is almost never used alone). """ import os, sys, re from waflib import TaskGen, Task, Utils, Logs, Build, Options, Node, Errors from waflib.Logs import error, debug, warn from waflib.TaskGen import after_method, before_method, feature, taskgen_method, extension from waflib.Tools import c_aliases, c_preproc, c_config, c_osx, c_tests from waflib.Configure import conf USELIB_VARS = Utils.defaultdict(set) """ Mapping for features to :py:class:`waflib.ConfigSet.ConfigSet` variables. See :py:func:`waflib.Tools.ccroot.propagate_uselib_vars`. """ USELIB_VARS['c'] = set(['INCLUDES', 'FRAMEWORKPATH', 'DEFINES', 'CPPFLAGS', 'CCDEPS', 'CFLAGS', 'ARCH']) USELIB_VARS['cxx'] = set(['INCLUDES', 'FRAMEWORKPATH', 'DEFINES', 'CPPFLAGS', 'CXXDEPS', 'CXXFLAGS', 'ARCH']) USELIB_VARS['d'] = set(['INCLUDES', 'DFLAGS']) USELIB_VARS['cprogram'] = USELIB_VARS['cxxprogram'] = set(['LIB', 'STLIB', 'LIBPATH', 'STLIBPATH', 'LINKFLAGS', 'RPATH', 'LINKDEPS', 'FRAMEWORK', 'FRAMEWORKPATH', 'ARCH']) USELIB_VARS['cshlib'] = USELIB_VARS['cxxshlib'] = set(['LIB', 'STLIB', 'LIBPATH', 'STLIBPATH', 'LINKFLAGS', 'RPATH', 'LINKDEPS', 'FRAMEWORK', 'FRAMEWORKPATH', 'ARCH']) USELIB_VARS['cstlib'] = USELIB_VARS['cxxstlib'] = set(['ARFLAGS', 'LINKDEPS']) USELIB_VARS['dprogram'] = set(['LIB', 'STLIB', 'LIBPATH', 'STLIBPATH', 'LINKFLAGS', 'RPATH', 'LINKDEPS']) USELIB_VARS['dshlib'] = set(['LIB', 'STLIB', 'LIBPATH', 'STLIBPATH', 'LINKFLAGS', 'RPATH', 'LINKDEPS']) USELIB_VARS['dstlib'] = set(['ARFLAGS', 'LINKDEPS']) USELIB_VARS['go'] = set(['GOCFLAGS']) USELIB_VARS['goprogram'] = set(['GOLFLAGS']) USELIB_VARS['asm'] = set(['ASFLAGS']) # ================================================================================================= @taskgen_method def create_compiled_task(self, name, node): """ Create the compilation task: c, cxx, asm, etc. The output node is created automatically (object file with a typical **.o** extension). The task is appended to the list *compiled_tasks* which is then used by :py:func:`waflib.Tools.ccroot.apply_link` :param name: name of the task class :type name: string :param node: the file to compile :type node: :py:class:`waflib.Node.Node` :return: The task created :rtype: :py:class:`waflib.Task.Task` """ out = '%s.%d.o' % (node.name, self.idx) task = self.create_task(name, node, node.parent.find_or_declare(out)) try: self.compiled_tasks.append(task) except AttributeError: self.compiled_tasks = [task] return task @taskgen_method def to_incnodes(self, inlst): """ Task generator method provided to convert a list of string/nodes into a list of includes folders. The paths are assumed to be relative to the task generator path, except if they begin by **#** in which case they are searched from the top-level directory (``bld.srcnode``). The folders are simply assumed to be existing. The node objects in the list are returned in the output list. The strings are converted into node objects if possible. The node is searched from the source directory, and if a match is found, the equivalent build directory is created and added to the returned list too. When a folder cannot be found, it is ignored. :param inlst: list of folders :type inlst: space-delimited string or a list of string/nodes :rtype: list of :py:class:`waflib.Node.Node` :return: list of include folders as nodes """ lst = [] seen = set([]) for x in self.to_list(inlst): if x in seen or not x: continue seen.add(x) if isinstance(x, Node.Node): lst.append(x) else: if os.path.isabs(x): lst.append(self.bld.root.make_node(x) or x) else: if x[0] == '#': p = self.bld.bldnode.make_node(x[1:]) v = self.bld.srcnode.make_node(x[1:]) else: p = self.path.get_bld().make_node(x) v = self.path.make_node(x) if p.is_child_of(self.bld.bldnode): p.mkdir() lst.append(p) lst.append(v) return lst @feature('c', 'cxx', 'd', 'go', 'asm', 'fc', 'includes') @after_method('propagate_uselib_vars', 'process_source') def apply_incpaths(self): """ Task generator method that processes the attribute *includes*:: tg = bld(features='includes', includes='.') The folders only need to be relative to the current directory, the equivalent build directory is added automatically (for headers created in the build directory). This enable using a build directory or not (``top == out``). This method will add a list of nodes read by :py:func:`waflib.Tools.ccroot.to_incnodes` in ``tg.env.INCPATHS``, and the list of include paths in ``tg.env.INCLUDES``. """ lst = self.to_incnodes(self.to_list(getattr(self, 'includes', [])) + self.env['INCLUDES']) self.includes_nodes = lst self.env['INCPATHS'] = [x.abspath() for x in lst] class link_task(Task.Task): """ Base class for all link tasks. A task generator is supposed to have at most one link task bound in the attribute *link_task*. See :py:func:`waflib.Tools.ccroot.apply_link`. .. inheritance-diagram:: waflib.Tools.ccroot.stlink_task waflib.Tools.c.cprogram waflib.Tools.c.cshlib waflib.Tools.cxx.cxxstlib waflib.Tools.cxx.cxxprogram waflib.Tools.cxx.cxxshlib waflib.Tools.d.dprogram waflib.Tools.d.dshlib waflib.Tools.d.dstlib waflib.Tools.ccroot.fake_shlib waflib.Tools.ccroot.fake_stlib waflib.Tools.asm.asmprogram waflib.Tools.asm.asmshlib waflib.Tools.asm.asmstlib """ color = 'YELLOW' inst_to = None """Default installation path for the link task outputs, or None to disable""" chmod = Utils.O644 """Default installation mode for the link task outputs""" def add_target(self, target): """ Process the *target* attribute to add the platform-specific prefix/suffix such as *.so* or *.exe*. The settings are retrieved from ``env.clsname_PATTERN`` """ if isinstance(target, str): pattern = self.env[self.__class__.__name__ + '_PATTERN'] if not pattern: pattern = '%s' folder, name = os.path.split(target) if self.__class__.__name__.find('shlib') > 0: if self.env.DEST_BINFMT == 'pe' and getattr(self.generator, 'vnum', None): # include the version in the dll file name, # the import lib file name stays unversionned. name = name + '-' + self.generator.vnum.split('.')[0] tmp = folder + os.sep + pattern % name target = self.generator.path.find_or_declare(tmp) self.set_outputs(target) class stlink_task(link_task): """ Base for static link tasks, which use *ar* most of the time. The target is always removed before being written. """ run_str = '${AR} ${ARFLAGS} ${AR_TGT_F}${TGT} ${AR_SRC_F}${SRC}' def rm_tgt(cls): old = cls.run def wrap(self): try: os.remove(self.outputs[0].abspath()) except OSError: pass return old(self) setattr(cls, 'run', wrap) rm_tgt(stlink_task) @feature('c', 'cxx', 'd', 'go', 'fc', 'asm') @after_method('process_source') def apply_link(self): """ Collect the tasks stored in ``compiled_tasks`` (created by :py:func:`waflib.Tools.ccroot.create_compiled_task`), and use the outputs for a new instance of :py:class:`waflib.Tools.ccroot.link_task`. The class to use is the first link task matching a name from the attribute *features*, for example:: def build(bld): tg = bld(features='cxx cxxprogram cprogram', source='main.c', target='app') will create the task ``tg.link_task`` as a new instance of :py:class:`waflib.Tools.cxx.cxxprogram` """ for x in self.features: if x == 'cprogram' and 'cxx' in self.features: # limited compat x = 'cxxprogram' elif x == 'cshlib' and 'cxx' in self.features: x = 'cxxshlib' if x in Task.classes: if issubclass(Task.classes[x], link_task): link = x break else: return objs = [t.outputs[0] for t in getattr(self, 'compiled_tasks', [])] self.link_task = self.create_task(link, objs) self.link_task.add_target(self.target) # remember that the install paths are given by the task generators # we need to define install_task even during the build phase because others might need the installation path try: inst_to = self.install_path except AttributeError: inst_to = self.link_task.__class__.inst_to if inst_to: # install a copy of the node list we have at this moment (implib not added) self.install_task = self.bld.install_files(inst_to, self.link_task.outputs[:], env=self.env, chmod=self.link_task.chmod) @taskgen_method def use_rec(self, name, **kw): """ Processes the ``use`` keyword recursively. This method is kind of private and only meant to be used from ``process_use`` """ if name in self.tmp_use_not or name in self.tmp_use_seen: return try: y = self.bld.get_tgen_by_name(name) except Errors.WafError: self.uselib.append(name) self.tmp_use_not.add(name) return self.tmp_use_seen.append(name) y.post() # bind temporary attributes on the task generator y.tmp_use_objects = objects = kw.get('objects', True) y.tmp_use_stlib = stlib = kw.get('stlib', True) try: link_task = y.link_task except AttributeError: y.tmp_use_var = '' else: objects = False if not isinstance(y.link_task, stlink_task): stlib = False y.tmp_use_var = 'LIB' else: y.tmp_use_var = 'STLIB' p = self.tmp_use_prec for x in self.to_list(getattr(y, 'use', [])): try: p[x].append(name) except: p[x] = [name] self.use_rec(x, objects=objects, stlib=stlib) @feature('c', 'cxx', 'd', 'use', 'fc') @before_method('apply_incpaths', 'propagate_uselib_vars') @after_method('apply_link', 'process_source') def process_use(self): """ Process the ``use`` attribute which contains a list of task generator names:: def build(bld): bld.shlib(source='a.c', target='lib1') bld.program(source='main.c', target='app', use='lib1') See :py:func:`waflib.Tools.ccroot.use_rec`. """ use_not = self.tmp_use_not = set([]) use_seen = self.tmp_use_seen = [] # we would like an ordered set use_prec = self.tmp_use_prec = {} self.uselib = self.to_list(getattr(self, 'uselib', [])) self.includes = self.to_list(getattr(self, 'includes', [])) names = self.to_list(getattr(self, 'use', [])) for x in names: self.use_rec(x) for x in use_not: if x in use_prec: del use_prec[x] # topological sort out = [] tmp = [] for x in self.tmp_use_seen: for k in use_prec.values(): if x in k: break else: tmp.append(x) while tmp: e = tmp.pop() out.append(e) try: nlst = use_prec[e] except KeyError: pass else: del use_prec[e] for x in nlst: for y in use_prec: if x in use_prec[y]: break else: tmp.append(x) if use_prec: raise Errors.WafError('Cycle detected in the use processing %r' % use_prec) out.reverse() link_task = getattr(self, 'link_task', None) for x in out: y = self.bld.get_tgen_by_name(x) var = y.tmp_use_var if var and link_task: if var == 'LIB' or y.tmp_use_stlib: self.env.append_value(var, [y.target[y.target.rfind(os.sep) + 1:]]) self.link_task.dep_nodes.extend(y.link_task.outputs) tmp_path = y.link_task.outputs[0].parent.path_from(self.bld.bldnode) self.env.append_value(var + 'PATH', [tmp_path]) else: if y.tmp_use_objects: self.add_objects_from_tgen(y) if getattr(y, 'export_includes', None): self.includes.extend(y.to_incnodes(y.export_includes)) # and finally, add the uselib variables (no recursion needed) for x in names: try: y = self.bld.get_tgen_by_name(x) except: if not self.env['STLIB_' + x] and not x in self.uselib: self.uselib.append(x) else: for k in self.to_list(getattr(y, 'uselib', [])): if not self.env['STLIB_' + k] and not k in self.uselib: self.uselib.append(k) @taskgen_method def add_objects_from_tgen(self, tg): # Not public yet, wait for waf 1.6.7 at least - the purpose of this is to add pdb files to the compiled # tasks but not to the link tasks (to avoid errors) try: link_task = self.link_task except AttributeError: pass else: for tsk in getattr(tg, 'compiled_tasks', []): for x in tsk.outputs: if x.name.endswith('.o') or x.name.endswith('.obj'): link_task.inputs.append(x) @taskgen_method def get_uselib_vars(self): """ :return: the *uselib* variables associated to the *features* attribute (see :py:attr:`waflib.Tools.ccroot.USELIB_VARS`) :rtype: list of string """ _vars = set([]) for x in self.features: if x in USELIB_VARS: _vars |= USELIB_VARS[x] return _vars @feature('c', 'cxx', 'd', 'fc', 'javac', 'cs', 'uselib') @after_method('process_use') def propagate_uselib_vars(self): """ Process uselib variables for adding flags. For example, the following target:: def build(bld): bld.env.AFLAGS_aaa = ['bar'] from waflib.Tools.ccroot import USELIB_VARS USELIB_VARS['aaa'] = set('AFLAGS') tg = bld(features='aaa', aflags='test') The *aflags* attribute will be processed and this method will set:: tg.env.AFLAGS = ['bar', 'test'] """ _vars = self.get_uselib_vars() env = self.env for x in _vars: y = x.lower() env.append_unique(x, self.to_list(getattr(self, y, []))) for x in self.features: for var in _vars: compvar = '%s_%s' % (var, x) env.append_value(var, env[compvar]) for x in self.to_list(getattr(self, 'uselib', [])): for v in _vars: env.append_value(v, env[v + '_' + x]) # ============ the code above must not know anything about import libs ========== @feature('cshlib', 'cxxshlib', 'fcshlib') @after_method('apply_link') def apply_implib(self): """ Handle dlls and their import libs on Windows-like systems. A ``.dll.a`` file called *import library* is generated. It must be installed as it is required for linking the library. """ if not self.env.DEST_BINFMT == 'pe': return dll = self.link_task.outputs[0] if isinstance(self.target, Node.Node): name = self.target.name else: name = os.path.split(self.target)[1] implib = self.env['implib_PATTERN'] % name implib = dll.parent.find_or_declare(implib) self.env.append_value('LINKFLAGS', self.env['IMPLIB_ST'] % implib.bldpath()) self.link_task.outputs.append(implib) if getattr(self, 'defs', None) and self.env.DEST_BINFMT == 'pe': node = self.path.find_resource(self.defs) if not node: raise Errors.WafError('invalid def file %r' % self.defs) if 'msvc' in (self.env.CC_NAME, self.env.CXX_NAME): self.env.append_value('LINKFLAGS', '/def:%s' % node.path_from(self.bld.bldnode)) self.link_task.dep_nodes.append(node) else: #gcc for windows takes *.def file a an input without any special flag self.link_task.inputs.append(node) try: inst_to = self.install_path except AttributeError: inst_to = self.link_task.__class__.inst_to if not inst_to: return self.implib_install_task = self.bld.install_as('${PREFIX}/lib/%s' % implib.name, implib, self.env) # ============ the code above must not know anything about vnum processing on unix platforms ========= @feature('cshlib', 'cxxshlib', 'dshlib', 'fcshlib', 'vnum') @after_method('apply_link') def apply_vnum(self): """ Enforce version numbering on shared libraries. The valid version numbers must have at most two dots:: def build(bld): bld.shlib(source='a.c', target='foo', vnum='14.15.16') In this example, ``libfoo.so`` is installed as ``libfoo.so.1.2.3``, and the following symbolic links are created: * ``libfoo.so → libfoo.so.1.2.3`` * ``libfoo.so.1 → libfoo.so.1.2.3`` """ if not getattr(self, 'vnum', '') or os.name != 'posix' or self.env.DEST_BINFMT not in ('elf', 'mac-o'): return link = self.link_task nums = self.vnum.split('.') node = link.outputs[0] libname = node.name if libname.endswith('.dylib'): name3 = libname.replace('.dylib', '.%s.dylib' % self.vnum) name2 = libname.replace('.dylib', '.%s.dylib' % nums[0]) else: name3 = libname + '.' + self.vnum name2 = libname + '.' + nums[0] # add the so name for the ld linker - to disable, just unset env.SONAME_ST if self.env.SONAME_ST: v = self.env.SONAME_ST % name2 self.env.append_value('LINKFLAGS', v.split()) # the following task is just to enable execution from the build dir :-/ tsk = self.create_task('vnum', node, [node.parent.find_or_declare(name2), node.parent.find_or_declare(name3)]) if getattr(self.bld, 'is_install', None): self.install_task.hasrun = Task.SKIP_ME bld = self.bld path = self.install_task.dest t1 = bld.install_as(path + os.sep + name3, node, env=self.env, chmod=self.link_task.chmod) t2 = bld.symlink_as(path + os.sep + name2, name3) t3 = bld.symlink_as(path + os.sep + libname, name3) self.vnum_install_task = (t1, t2, t3) if '-dynamiclib' in self.env['LINKFLAGS'] and getattr(self, 'install_task', None): path = os.path.join(self.install_task.get_install_path(), self.link_task.outputs[0].name) self.env.append_value('LINKFLAGS', ['-install_name', path]) class vnum(Task.Task): """ Create the symbolic links for a versioned shared library. Instances are created by :py:func:`waflib.Tools.ccroot.apply_vnum` """ color = 'CYAN' quient = True ext_in = ['.bin'] def run(self): for x in self.outputs: path = x.abspath() try: os.remove(path) except OSError: pass try: os.symlink(self.inputs[0].name, path) except OSError: return 1 class fake_shlib(link_task): """ Task used for reading a system library and adding the dependency on it """ def runnable_status(self): for t in self.run_after: if not t.hasrun: return Task.ASK_LATER for x in self.outputs: x.sig = Utils.h_file(x.abspath()) return Task.SKIP_ME class fake_stlib(stlink_task): """ Task used for reading a system library and adding the dependency on it """ def runnable_status(self): for t in self.run_after: if not t.hasrun: return Task.ASK_LATER for x in self.outputs: x.sig = Utils.h_file(x.abspath()) return Task.SKIP_ME @conf def read_shlib(self, name, paths=[]): """ Read a system shared library, enabling its use as a local library. Will trigger a rebuild if the file changes:: def build(bld): bld.read_shlib('m') bld.program(source='main.c', use='m') """ return self(name=name, features='fake_lib', lib_paths=paths, lib_type='shlib') @conf def read_stlib(self, name, paths=[]): """ Read a system static library, enabling a use as a local library. Will trigger a rebuild if the file changes. """ return self(name=name, features='fake_lib', lib_paths=paths, lib_type='stlib') lib_patterns = { 'shlib' : ['lib%s.so', '%s.so', 'lib%s.dll', '%s.dll'], 'stlib' : ['lib%s.a', '%s.a', 'lib%s.dll', '%s.dll', 'lib%s.lib', '%s.lib'], } @feature('fake_lib') def process_lib(self): """ Find the location of a foreign library. Used by :py:class:`waflib.Tools.ccroot.read_shlib` and :py:class:`waflib.Tools.ccroot.read_stlib`. """ node = None names = [x % self.name for x in lib_patterns[self.lib_type]] for x in self.lib_paths + [self.path, '/usr/lib64', '/usr/lib', '/usr/local/lib64', '/usr/local/lib']: if not isinstance(x, Node.Node): x = self.bld.root.find_node(x) or self.path.find_node(x) if not x: continue for y in names: node = x.find_node(y) if node: node.sig = Utils.h_file(node.abspath()) break else: continue break else: raise Errors.WafError('could not find library %r' % self.name) self.link_task = self.create_task('fake_%s' % self.lib_type, [], [node]) self.target = self.name class fake_o(Task.Task): def runnable_status(self): return Task.SKIP_ME @extension('.o', '.obj') def add_those_o_files(self, node): tsk = self.create_task('fake_o', [], node) try: self.compiled_tasks.append(tsk) except AttributeError: self.compiled_tasks = [tsk] kupfer-v208/waflib/Tools/gnu_dirs.py000066400000000000000000000120751176220042200176000ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Ali Sabil, 2007 """ Sets various standard variables such as INCLUDEDIR. SBINDIR and others. To use this module just call:: opt.load('gnu_dirs') and:: conf.load('gnu_dirs') Add options for the standard GNU directories, this tool will add the options found in autotools, and will update the environment with the following installation variables: ============== ========================================= ======================= Variable Description Value ============== ========================================= ======================= PREFIX architecture-independent files /usr/local EXEC_PREFIX architecture-dependent files PREFIX BINDIR user executables EXEC_PREFIX/bin SBINDIR user executables EXEC_PREFIX/sbin LIBEXECDIR program executables EXEC_PREFIX/libexec SYSCONFDIR read-only single-machine data PREFIX/etc SHAREDSTATEDIR modifiable architecture-independent data PREFIX/com LOCALSTATEDIR modifiable single-machine data PREFIX/var LIBDIR object code libraries EXEC_PREFIX/lib INCLUDEDIR C header files PREFIX/include OLDINCLUDEDIR C header files for non-gcc /usr/include DATAROOTDIR read-only arch.-independent data root PREFIX/share DATADIR read-only architecture-independent data DATAROOTDIR INFODIR info documentation DATAROOTDIR/info LOCALEDIR locale-dependent data DATAROOTDIR/locale MANDIR man documentation DATAROOTDIR/man DOCDIR documentation root DATAROOTDIR/doc/APPNAME HTMLDIR html documentation DOCDIR DVIDIR dvi documentation DOCDIR PDFDIR pdf documentation DOCDIR PSDIR ps documentation DOCDIR ============== ========================================= ======================= """ import os from waflib import Utils, Options, Context _options = [x.split(', ') for x in ''' bindir, user executables, ${EXEC_PREFIX}/bin sbindir, system admin executables, ${EXEC_PREFIX}/sbin libexecdir, program executables, ${EXEC_PREFIX}/libexec sysconfdir, read-only single-machine data, ${PREFIX}/etc sharedstatedir, modifiable architecture-independent data, ${PREFIX}/com localstatedir, modifiable single-machine data, ${PREFIX}/var libdir, object code libraries, ${EXEC_PREFIX}/lib includedir, C header files, ${PREFIX}/include oldincludedir, C header files for non-gcc, /usr/include datarootdir, read-only arch.-independent data root, ${PREFIX}/share datadir, read-only architecture-independent data, ${DATAROOTDIR} infodir, info documentation, ${DATAROOTDIR}/info localedir, locale-dependent data, ${DATAROOTDIR}/locale mandir, man documentation, ${DATAROOTDIR}/man docdir, documentation root, ${DATAROOTDIR}/doc/${PACKAGE} htmldir, html documentation, ${DOCDIR} dvidir, dvi documentation, ${DOCDIR} pdfdir, pdf documentation, ${DOCDIR} psdir, ps documentation, ${DOCDIR} '''.split('\n') if x] def configure(conf): """ Read the command-line options to set lots of variables in *conf.env*. The variables BINDIR and LIBDIR will be overwritten. """ def get_param(varname, default): return getattr(Options.options, varname, '') or default env = conf.env conf.env.LIBDIR = conf.env.BINDIR = [] env['EXEC_PREFIX'] = get_param('EXEC_PREFIX', env['PREFIX']) env['PACKAGE'] = getattr(Context.g_module, 'APPNAME', None) or env['PACKAGE'] complete = False iter = 0 while not complete and iter < len(_options) + 1: iter += 1 complete = True for name, help, default in _options: name = name.upper() if not env[name]: try: env[name] = Utils.subst_vars(get_param(name, default).replace('/', os.sep), env) except TypeError: complete = False if not complete: lst = [name for name, _, _ in _options if not env[name.upper()]] raise conf.errors.WafError('Variable substitution failure %r' % lst) def options(opt): """ Add lots of command-line options, for example:: --exec-prefix: EXEC_PREFIX """ inst_dir = opt.add_option_group('Installation directories', 'By default, "waf install" will put the files in\ "/usr/local/bin", "/usr/local/lib" etc. An installation prefix other\ than "/usr/local" can be given using "--prefix", for example "--prefix=$HOME"') for k in ('--prefix', '--destdir'): option = opt.parser.get_option(k) if option: opt.parser.remove_option(k) inst_dir.add_option(option) inst_dir.add_option('--exec-prefix', help = 'installation prefix [Default: ${PREFIX}]', default = '', dest = 'EXEC_PREFIX') dirs_options = opt.add_option_group('Pre-defined installation directories', '') for name, help, default in _options: option_name = '--' + name str_default = default str_help = '%s [Default: %s]' % (help, str_default) dirs_options.add_option(option_name, help=str_help, default='', dest=name.upper()) kupfer-v208/waflib/Tools/intltool.py000066400000000000000000000124051176220042200176270ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2006-2010 (ita) """ Support for translation tools such as msgfmt and intltool Usage:: def configure(conf): conf.load('gnu_dirs intltool') def build(bld): # process the .po files into .gmo files, and install them in LOCALEDIR bld(features='intltool_po', appname='myapp', podir='po', install_path="${LOCALEDIR}") # process an input file, substituting the translations from the po dir bld( features = "intltool_in", podir = "../po", flags = ["-d", "-q", "-u", "-c"], source = 'kupfer.desktop.in', install_path = "${DATADIR}/applications", ) Usage of the :py:mod:`waflib.Tools.gnu_dirs` is recommended, but not obligatory. """ import os, re from waflib import Configure, TaskGen, Task, Utils, Runner, Options, Build, Logs import waflib.Tools.ccroot from waflib.TaskGen import feature, before_method from waflib.Logs import error @before_method('process_source') @feature('intltool_in') def apply_intltool_in_f(self): """ Create tasks to translate files by intltool-merge:: def build(bld): bld( features = "intltool_in", podir = "../po", flags = ["-d", "-q", "-u", "-c"], source = 'kupfer.desktop.in', install_path = "${DATADIR}/applications", ) :param podir: location of the .po files :type podir: string :param source: source files to process :type source: list of string :param flags: compilation flags ("-quc" by default) :type flags: list of string :param install_path: installation path :type install_path: string """ try: self.meths.remove('process_source') except ValueError: pass if not self.env.LOCALEDIR: self.env.LOCALEDIR = self.env.PREFIX + '/share/locale' for i in self.to_list(self.source): node = self.path.find_resource(i) podir = getattr(self, 'podir', 'po') podirnode = self.path.find_dir(podir) if not podirnode: error("could not find the podir %r" % podir) continue cache = getattr(self, 'intlcache', '.intlcache') self.env['INTLCACHE'] = os.path.join(self.path.bldpath(), podir, cache) self.env['INTLPODIR'] = podirnode.bldpath() self.env['INTLFLAGS'] = getattr(self, 'flags', ['-q', '-u', '-c']) task = self.create_task('intltool', node, node.change_ext('')) inst = getattr(self, 'install_path', '${LOCALEDIR}') if inst: self.bld.install_files(inst, task.outputs) @feature('intltool_po') def apply_intltool_po(self): """ Create tasks to process po files:: def build(bld): bld(features='intltool_po', appname='myapp', podir='po', install_path="${LOCALEDIR}") The relevant task generator arguments are: :param podir: directory of the .po files :type podir: string :param appname: name of the application :type appname: string :param install_path: installation directory :type install_path: string The file LINGUAS must be present in the directory pointed by *podir* and list the translation files to process. """ try: self.meths.remove('process_source') except ValueError: pass if not self.env.LOCALEDIR: self.env.LOCALEDIR = self.env.PREFIX + '/share/locale' appname = getattr(self, 'appname', 'set_your_app_name') podir = getattr(self, 'podir', '') inst = getattr(self, 'install_path', '${LOCALEDIR}') linguas = self.path.find_node(os.path.join(podir, 'LINGUAS')) if linguas: # scan LINGUAS file for locales to process file = open(linguas.abspath()) langs = [] for line in file.readlines(): # ignore lines containing comments if not line.startswith('#'): langs += line.split() file.close() re_linguas = re.compile('[-a-zA-Z_@.]+') for lang in langs: # Make sure that we only process lines which contain locales if re_linguas.match(lang): node = self.path.find_resource(os.path.join(podir, re_linguas.match(lang).group() + '.po')) task = self.create_task('po', node, node.change_ext('.mo')) if inst: filename = task.outputs[0].name (langname, ext) = os.path.splitext(filename) inst_file = inst + os.sep + langname + os.sep + 'LC_MESSAGES' + os.sep + appname + '.mo' self.bld.install_as(inst_file, task.outputs[0], chmod=getattr(self, 'chmod', Utils.O644), env=task.env) else: Logs.pprint('RED', "Error no LINGUAS file found in po directory") class po(Task.Task): """ Compile .po files into .gmo files """ run_str = '${MSGFMT} -o ${TGT} ${SRC}' color = 'BLUE' class intltool(Task.Task): """ Let intltool-merge translate an input file """ run_str = '${INTLTOOL} ${INTLFLAGS} ${INTLCACHE} ${INTLPODIR} ${SRC} ${TGT}' color = 'BLUE' def configure(conf): """ Detect the program *msgfmt* and set *conf.env.MSGFMT*. Detect the program *intltool-merge* and set *conf.env.INTLTOOL*. It is possible to set INTLTOOL in the environment, but it must not have spaces in it:: $ INTLTOOL="/path/to/the program/intltool" waf configure If a C/C++ compiler is present, execute a compilation test to find the header *locale.h*. """ conf.find_program('msgfmt', var='MSGFMT') conf.find_perl_program('intltool-merge', var='INTLTOOL') prefix = conf.env.PREFIX datadir = conf.env.DATADIR if not datadir: datadir = os.path.join(prefix,'share') conf.define('LOCALEDIR', os.path.join(datadir, 'locale').replace('\\', '\\\\')) conf.define('DATADIR', datadir.replace('\\', '\\\\')) if conf.env.CC or conf.env.CXX: conf.check(header_name='locale.h') kupfer-v208/waflib/Tools/python.py000066400000000000000000000406501176220042200173070ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2007-2010 (ita) # Gustavo Carneiro (gjc), 2007 """ Support for Python, detect the headers and libraries and provide *use* variables to link C/C++ programs against them:: def options(opt): opt.load('compiler_c python') def configure(conf): conf.load('compiler_c python') conf.check_python_version((2,4,2)) conf.check_python_headers() def build(bld): bld.program(features='pyembed', source='a.c', target='myprog') bld.shlib(features='pyext', source='b.c', target='mylib') """ import os, sys from waflib import Utils, Options, Errors from waflib.Logs import debug, warn, info, error from waflib.TaskGen import extension, before_method, after_method, feature from waflib.Configure import conf FRAG = ''' #include #ifdef __cplusplus extern "C" { #endif void Py_Initialize(void); void Py_Finalize(void); #ifdef __cplusplus } #endif int main() { Py_Initialize(); Py_Finalize(); return 0; } ''' """ Piece of C/C++ code used in :py:func:`waflib.Tools.python.check_python_headers` """ INST = ''' import sys, py_compile py_compile.compile(sys.argv[1], sys.argv[2], sys.argv[3]) ''' """ Piece of Python code used in :py:func:`waflib.Tools.python.install_pyfile` for installing python files """ DISTUTILS_IMP = ['from distutils.sysconfig import get_config_var, get_python_lib'] @extension('.py') def process_py(self, node): """ Add a callback using :py:func:`waflib.Tools.python.install_pyfile` to install a python file """ try: if not self.bld.is_install: return except: return try: if not self.install_path: return except AttributeError: self.install_path = '${PYTHONDIR}' # i wonder now why we wanted to do this after the build is over # issue #901: people want to preserve the structure of installed files def inst_py(ctx): install_from = getattr(self, 'install_from', None) if install_from: install_from = self.path.find_dir(install_from) install_pyfile(self, node, install_from) self.bld.add_post_fun(inst_py) def install_pyfile(self, node, install_from=None): """ Execute the installation of a python file :param node: python file :type node: :py:class:`waflib.Node.Node` """ from_node = install_from or node.parent tsk = self.bld.install_as(self.install_path + '/' + node.path_from(from_node), node, postpone=False) path = tsk.get_install_path() if self.bld.is_install < 0: info("+ removing byte compiled python files") for x in 'co': try: os.remove(path + x) except OSError: pass if self.bld.is_install > 0: try: st1 = os.stat(path) except: error('The python file is missing, this should not happen') for x in ['c', 'o']: do_inst = self.env['PY' + x.upper()] try: st2 = os.stat(path + x) except OSError: pass else: if st1.st_mtime <= st2.st_mtime: do_inst = False if do_inst: lst = (x == 'o') and [self.env['PYFLAGS_OPT']] or [] (a, b, c) = (path, path + x, tsk.get_install_path(destdir=False) + x) argv = self.env['PYTHON'] + lst + ['-c', INST, a, b, c] info('+ byte compiling %r' % (path + x)) env = self.env.env or None ret = Utils.subprocess.Popen(argv, env=env).wait() if ret: raise Errors.WafError('py%s compilation failed %r' % (x, path)) @feature('py') def feature_py(self): """ Dummy feature which does nothing """ pass @feature('pyext') @before_method('propagate_uselib_vars', 'apply_link') @after_method('apply_bundle') def init_pyext(self): """ Change the values of *cshlib_PATTERN* and *cxxshlib_PATTERN* to remove the *lib* prefix from library names. """ try: if not self.install_path: return except AttributeError: self.install_path = '${PYTHONARCHDIR}' self.uselib = self.to_list(getattr(self, 'uselib', [])) if not 'PYEXT' in self.uselib: self.uselib.append('PYEXT') # override shlib_PATTERN set by the osx module self.env['cshlib_PATTERN'] = self.env['cxxshlib_PATTERN'] = self.env['macbundle_PATTERN'] = self.env['pyext_PATTERN'] @feature('pyext') @before_method('apply_link', 'apply_bundle') def set_bundle(self): if Utils.unversioned_sys_platform() == 'darwin': self.mac_bundle = True @before_method('propagate_uselib_vars') @feature('pyembed') def init_pyembed(self): """ Add the PYEMBED variable. """ self.uselib = self.to_list(getattr(self, 'uselib', [])) if not 'PYEMBED' in self.uselib: self.uselib.append('PYEMBED') @conf def get_python_variables(self, variables, imports=None): """ Spawn a new python process to dump configuration variables :param variables: variables to print :type variables: list of string :param imports: one import by element :type imports: list of string :return: the variable values :rtype: list of string """ if not imports: try: imports = self.python_imports except AttributeError: imports = DISTUTILS_IMP program = list(imports) # copy program.append('') for v in variables: program.append("print(repr(%s))" % v) os_env = dict(os.environ) try: del os_env['MACOSX_DEPLOYMENT_TARGET'] # see comments in the OSX tool except KeyError: pass try: out = self.cmd_and_log(self.env.PYTHON + ['-c', '\n'.join(program)], env=os_env) except Errors.WafError: self.fatal('The distutils module is unusable: install "python-devel"?') return_values = [] for s in out.split('\n'): s = s.strip() if not s: continue if s == 'None': return_values.append(None) elif s[0] == "'" and s[-1] == "'": return_values.append(s[1:-1]) elif s[0].isdigit(): return_values.append(int(s)) else: break return return_values @conf def check_python_headers(conf): """ Check for headers and libraries necessary to extend or embed python by using the module *distutils*. On success the environment variables xxx_PYEXT and xxx_PYEMBED are added: * PYEXT: for compiling python extensions * PYEMBED: for embedding a python interpreter """ # FIXME rewrite if not conf.env['CC_NAME'] and not conf.env['CXX_NAME']: conf.fatal('load a compiler first (gcc, g++, ..)') if not conf.env['PYTHON_VERSION']: conf.check_python_version() env = conf.env pybin = conf.env.PYTHON if not pybin: conf.fatal('could not find the python executable') v = 'prefix SO LDFLAGS LIBDIR LIBPL INCLUDEPY Py_ENABLE_SHARED MACOSX_DEPLOYMENT_TARGET LDSHARED CFLAGS'.split() try: lst = conf.get_python_variables(["get_config_var('%s') or ''" % x for x in v]) except RuntimeError: conf.fatal("Python development headers not found (-v for details).") vals = ['%s = %r' % (x, y) for (x, y) in zip(v, lst)] conf.to_log("Configuration returned from %r:\n%r\n" % (pybin, '\n'.join(vals))) dct = dict(zip(v, lst)) x = 'MACOSX_DEPLOYMENT_TARGET' if dct[x]: conf.env[x] = conf.environ[x] = dct[x] env['pyext_PATTERN'] = '%s' + dct['SO'] # not a mistake # Check for python libraries for embedding all_flags = dct['LDFLAGS'] + ' ' + dct['CFLAGS'] conf.parse_flags(all_flags, 'PYEMBED') all_flags = dct['LDFLAGS'] + ' ' + dct['LDSHARED'] + ' ' + dct['CFLAGS'] conf.parse_flags(all_flags, 'PYEXT') result = None #name = 'python' + env['PYTHON_VERSION'] # TODO simplify this for name in ('python' + env['PYTHON_VERSION'], 'python' + env['PYTHON_VERSION'].replace('.', '')): # LIBPATH_PYEMBED is already set; see if it works. if not result and env['LIBPATH_PYEMBED']: path = env['LIBPATH_PYEMBED'] conf.to_log("\n\n# Trying default LIBPATH_PYEMBED: %r\n" % path) result = conf.check(lib=name, uselib='PYEMBED', libpath=path, mandatory=False, msg='Checking for library %s in LIBPATH_PYEMBED' % name) if not result and dct['LIBDIR']: path = [dct['LIBDIR']] conf.to_log("\n\n# try again with -L$python_LIBDIR: %r\n" % path) result = conf.check(lib=name, uselib='PYEMBED', libpath=path, mandatory=False, msg='Checking for library %s in LIBDIR' % name) if not result and dct['LIBPL']: path = [dct['LIBPL']] conf.to_log("\n\n# try again with -L$python_LIBPL (some systems don't install the python library in $prefix/lib)\n") result = conf.check(lib=name, uselib='PYEMBED', libpath=path, mandatory=False, msg='Checking for library %s in python_LIBPL' % name) if not result: path = [os.path.join(dct['prefix'], "libs")] conf.to_log("\n\n# try again with -L$prefix/libs, and pythonXY name rather than pythonX.Y (win32)\n") result = conf.check(lib=name, uselib='PYEMBED', libpath=path, mandatory=False, msg='Checking for library %s in $prefix/libs' % name) if result: break # do not forget to set LIBPATH_PYEMBED if result: env['LIBPATH_PYEMBED'] = path env.append_value('LIB_PYEMBED', [name]) else: conf.to_log("\n\n### LIB NOT FOUND\n") # under certain conditions, python extensions must link to # python libraries, not just python embedding programs. if (Utils.is_win32 or sys.platform.startswith('os2') or dct['Py_ENABLE_SHARED']): env['LIBPATH_PYEXT'] = env['LIBPATH_PYEMBED'] env['LIB_PYEXT'] = env['LIB_PYEMBED'] # We check that pythonX.Y-config exists, and if it exists we # use it to get only the includes, else fall back to distutils. num = '.'.join(env['PYTHON_VERSION'].split('.')[:2]) conf.find_program(['python%s-config' % num, 'python-config-%s' % num, 'python%sm-config' % num], var='PYTHON_CONFIG', mandatory=False) includes = [] if conf.env.PYTHON_CONFIG: for incstr in conf.cmd_and_log([ conf.env.PYTHON_CONFIG, '--includes']).strip().split(): # strip the -I or /I if (incstr.startswith('-I') or incstr.startswith('/I')): incstr = incstr[2:] # append include path, unless already given if incstr not in includes: includes.append(incstr) conf.to_log("Include path for Python extensions (found via python-config --includes): %r\n" % (includes,)) env['INCLUDES_PYEXT'] = includes env['INCLUDES_PYEMBED'] = includes else: conf.to_log("Include path for Python extensions " "(found via distutils module): %r\n" % (dct['INCLUDEPY'],)) env['INCLUDES_PYEXT'] = [dct['INCLUDEPY']] env['INCLUDES_PYEMBED'] = [dct['INCLUDEPY']] # Code using the Python API needs to be compiled with -fno-strict-aliasing if env['CC_NAME'] == 'gcc': env.append_value('CFLAGS_PYEMBED', ['-fno-strict-aliasing']) env.append_value('CFLAGS_PYEXT', ['-fno-strict-aliasing']) if env['CXX_NAME'] == 'gcc': env.append_value('CXXFLAGS_PYEMBED', ['-fno-strict-aliasing']) env.append_value('CXXFLAGS_PYEXT', ['-fno-strict-aliasing']) if env.CC_NAME == "msvc": from distutils.msvccompiler import MSVCCompiler dist_compiler = MSVCCompiler() dist_compiler.initialize() env.append_value('CFLAGS_PYEXT', dist_compiler.compile_options) env.append_value('CXXFLAGS_PYEXT', dist_compiler.compile_options) env.append_value('LINKFLAGS_PYEXT', dist_compiler.ldflags_shared) # See if it compiles try: conf.check(header_name='Python.h', define_name='HAVE_PYTHON_H', uselib='PYEMBED', fragment=FRAG, errmsg='Could not find the python development headers') except conf.errors.ConfigurationError: # python3.2, oh yeah conf.check_cfg(path=conf.env.PYTHON_CONFIG, package='', uselib_store='PYEMBED', args=['--cflags', '--libs']) conf.check(header_name='Python.h', define_name='HAVE_PYTHON_H', msg='Getting the python flags from python-config', uselib='PYEMBED', fragment=FRAG, errmsg='Could not find the python development headers elsewhere') @conf def check_python_version(conf, minver=None): """ Check if the python interpreter is found matching a given minimum version. minver should be a tuple, eg. to check for python >= 2.4.2 pass (2,4,2) as minver. If successful, PYTHON_VERSION is defined as 'MAJOR.MINOR' (eg. '2.4') of the actual python version found, and PYTHONDIR is defined, pointing to the site-packages directory appropriate for this python version, where modules/packages/extensions should be installed. :param minver: minimum version :type minver: tuple of int """ assert minver is None or isinstance(minver, tuple) pybin = conf.env['PYTHON'] if not pybin: conf.fatal('could not find the python executable') # Get python version string cmd = pybin + ['-c', 'import sys\nfor x in sys.version_info: print(str(x))'] debug('python: Running python command %r' % cmd) lines = conf.cmd_and_log(cmd).split() assert len(lines) == 5, "found %i lines, expected 5: %r" % (len(lines), lines) pyver_tuple = (int(lines[0]), int(lines[1]), int(lines[2]), lines[3], int(lines[4])) # compare python version with the minimum required result = (minver is None) or (pyver_tuple >= minver) if result: # define useful environment variables pyver = '.'.join([str(x) for x in pyver_tuple[:2]]) conf.env['PYTHON_VERSION'] = pyver if 'PYTHONDIR' in conf.environ: pydir = conf.environ['PYTHONDIR'] else: if Utils.is_win32: (python_LIBDEST, pydir) = conf.get_python_variables( ["get_config_var('LIBDEST') or ''", "get_python_lib(standard_lib=0, prefix=%r) or ''" % conf.env['PREFIX']]) else: python_LIBDEST = None (pydir,) = conf.get_python_variables( ["get_python_lib(standard_lib=0, prefix=%r) or ''" % conf.env['PREFIX']]) if python_LIBDEST is None: if conf.env['LIBDIR']: python_LIBDEST = os.path.join(conf.env['LIBDIR'], "python" + pyver) else: python_LIBDEST = os.path.join(conf.env['PREFIX'], "lib", "python" + pyver) if 'PYTHONARCHDIR' in conf.environ: pyarchdir = conf.environ['PYTHONARCHDIR'] else: (pyarchdir, ) = conf.get_python_variables( ["get_python_lib(plat_specific=1, standard_lib=0, prefix=%r) or ''" % conf.env['PREFIX']]) if not pyarchdir: pyarchdir = pydir if hasattr(conf, 'define'): # conf.define is added by the C tool, so may not exist conf.define('PYTHONDIR', pydir) conf.define('PYTHONARCHDIR', pyarchdir) conf.env['PYTHONDIR'] = pydir conf.env['PYTHONARCHDIR'] = pyarchdir # Feedback pyver_full = '.'.join(map(str, pyver_tuple[:3])) if minver is None: conf.msg('Checking for python version', pyver_full) else: minver_str = '.'.join(map(str, minver)) conf.msg('Checking for python version', pyver_tuple, ">= %s" % (minver_str,) and 'GREEN' or 'YELLOW') if not result: conf.fatal('The python version is too old, expecting %r' % (minver,)) PYTHON_MODULE_TEMPLATE = ''' import %s as current_module version = getattr(current_module, '__version__', None) if version is not None: print(str(version)) else: print('unknown version') ''' @conf def check_python_module(conf, module_name, condition=''): """ Check if the selected python interpreter can import the given python module:: def configure(conf): conf.check_python_module('pygccxml') conf.check_python_module('re', condition="ver > num(2, 0, 4) and ver <= num(3, 0, 0)") :param module_name: module :type module_name: string """ msg = 'Python module %s' % module_name if condition: msg = '%s (%s)' % (msg, condition) conf.start_msg(msg) try: ret = conf.cmd_and_log(conf.env['PYTHON'] + ['-c', PYTHON_MODULE_TEMPLATE % module_name]) except Exception: conf.end_msg(False) conf.fatal('Could not find the python module %r' % module_name) ret = ret.strip() if condition: conf.end_msg(ret) if ret == 'unknown version': conf.fatal('Could not check the %s version' % module_name) from distutils.version import LooseVersion def num(*k): if isinstance(k[0], int): return LooseVersion('.'.join([str(x) for x in k])) else: return LooseVersion(k[0]) d = {'num': num, 'ver': LooseVersion(ret)} ev = eval(condition, {}, d) if not ev: conf.fatal('The %s version does not satisfy the requirements' % module_name) else: if ret == 'unknown version': conf.end_msg(True) else: conf.end_msg(ret) def configure(conf): """ Detect the python interpreter """ try: conf.find_program('python', var='PYTHON') except conf.errors.ConfigurationError: warn("could not find a python executable, setting to sys.executable '%s'" % sys.executable) conf.env.PYTHON = sys.executable if conf.env.PYTHON != sys.executable: warn("python executable '%s' different from sys.executable '%s'" % (conf.env.PYTHON, sys.executable)) conf.env.PYTHON = conf.cmd_to_list(conf.env.PYTHON) v = conf.env v['PYCMD'] = '"import sys, py_compile;py_compile.compile(sys.argv[1], sys.argv[2])"' v['PYFLAGS'] = '' v['PYFLAGS_OPT'] = '-O' v['PYC'] = getattr(Options.options, 'pyc', 1) v['PYO'] = getattr(Options.options, 'pyo', 1) def options(opt): """ Add the options ``--nopyc`` and ``--nopyo`` """ opt.add_option('--nopyc', action='store_false', default=1, help = 'Do not install bytecode compiled .pyc files (configuration) [Default:install]', dest = 'pyc') opt.add_option('--nopyo', action='store_false', default=1, help='Do not install optimised compiled .pyo files (configuration) [Default:install]', dest='pyo') kupfer-v208/waflib/Utils.py000066400000000000000000000330161176220042200157640ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) """ Utilities and platform-specific fixes The portability fixes try to provide a consistent behavior of the Waf API through Python versions 2.3 to 3.X and across different platforms (win32, linux, etc) """ import os, sys, errno, traceback, inspect, re, shutil, datetime, gc try: import subprocess except: try: import waflib.extras.subprocess as subprocess except: print("The subprocess module is missing (python2.3?):\n try calling 'waf update --files=subprocess'\n or add a copy of subprocess.py to the python libraries") try: from collections import deque except ImportError: class deque(list): """A deque for Python 2.3 which does not have one""" def popleft(self): return self.pop(0) try: import _winreg as winreg except: try: import winreg except: winreg = None from waflib import Errors try: from collections import UserDict except: from UserDict import UserDict try: from hashlib import md5 except: try: from md5 import md5 except: # never fail to enable fixes from another module pass try: import threading except: class threading(object): """ A fake threading class for platforms lacking the threading module. Use ``waf -j1`` on those platforms """ pass class Lock(object): """Fake Lock class""" def acquire(self): pass def release(self): pass threading.Lock = threading.Thread = Lock else: run_old = threading.Thread.run def run(*args, **kwargs): try: run_old(*args, **kwargs) except (KeyboardInterrupt, SystemExit): raise except: sys.excepthook(*sys.exc_info()) threading.Thread.run = run SIG_NIL = 'iluvcuteoverload'.encode() """Arbitrary null value for a md5 hash. This value must be changed when the hash value is replaced (size)""" O644 = 420 """Constant representing the permissions for regular files (0644 raises a syntax error on python 3)""" O755 = 493 """Constant representing the permissions for executable files (0755 raises a syntax error on python 3)""" rot_chr = ['\\', '|', '/', '-'] "List of characters to use when displaying the throbber (progress bar)" rot_idx = 0 "Index of the current throbber character (progress bar)" try: from collections import defaultdict except ImportError: class defaultdict(dict): """ defaultdict was introduced in python 2.5, so we leave it for python 2.4 and 2.3 """ def __init__(self, default_factory): super(defaultdict, self).__init__() self.default_factory = default_factory def __getitem__(self, key): try: return super(defaultdict, self).__getitem__(key) except KeyError: value = self.default_factory() self[key] = value return value is_win32 = sys.platform in ('win32', 'cli') # we should have put this in the Logs.py file instead :-/ indicator = '\x1b[K%s%s%s\r' if is_win32 and 'NOCOLOR' in os.environ: indicator = '%s%s%s\r' def readf(fname, m='r'): """ Read an entire file into a string, in practice the wrapper node.read(..) should be used instead of this method:: def build(ctx): from waflib import Utils txt = Utils.readf(self.path.find_node('wscript').abspath()) txt = ctx.path.find_node('wscript').read() :type fname: string :param fname: Path to file :type m: string :param m: Open mode :rtype: string :return: Content of the file """ f = open(fname, m) try: txt = f.read() finally: f.close() return txt def h_file(filename): """ Compute a hash value for a file by using md5. This method may be replaced by a faster version if necessary. The following uses the file size and the timestamp value:: import stat from waflib import Utils def h_file(filename): st = os.stat(filename) if stat.S_ISDIR(st[stat.ST_MODE]): raise IOError('not a file') m = Utils.md5() m.update(str(st.st_mtime)) m.update(str(st.st_size)) m.update(filename) return m.digest() Utils.h_file = h_file :type filename: string :param filename: path to the file to hash :return: hash of the file contents """ f = open(filename, 'rb') m = md5() try: while filename: filename = f.read(100000) m.update(filename) finally: f.close() return m.digest() try: x = ''.encode('hex') except: import binascii def to_hex(s): ret = binascii.hexlify(s) if not isinstance(ret, str): ret = ret.decode('utf-8') return ret else: def to_hex(s): return s.encode('hex') to_hex.__doc__ = """ Return the hexadecimal representation of a string :param s: string to convert :type s: string """ listdir = os.listdir if is_win32: def listdir_win32(s): """ List the contents of a folder in a portable manner. :type s: string :param s: a string, which can be empty on Windows for listing the drive letters """ if not s: try: import ctypes except: # there is nothing much we can do return [x + ':\\' for x in list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')] else: dlen = 4 # length of "?:\\x00" maxdrives = 26 buf = ctypes.create_string_buffer(maxdrives * dlen) ndrives = ctypes.windll.kernel32.GetLogicalDriveStringsA(maxdrives, ctypes.byref(buf)) return [ buf.raw[4*i:4*i+3].decode('ascii') for i in range(int(ndrives/dlen)) ] if len(s) == 2 and s[1] == ":": s += os.sep if not os.path.isdir(s): e = OSError() e.errno = errno.ENOENT raise e return os.listdir(s) listdir = listdir_win32 def num2ver(ver): """ Convert a string, tuple or version number into an integer. The number is supposed to have at most 4 digits:: from waflib.Utils import num2ver num2ver('1.3.2') == num2ver((1,3,2)) == num2ver((1,3,2,0)) :type ver: string or tuple of numbers :param ver: a version number """ if isinstance(ver, str): ver = tuple(ver.split('.')) if isinstance(ver, tuple): ret = 0 for i in range(4): if i < len(ver): ret += 256**(3 - i) * int(ver[i]) return ret return ver def ex_stack(): """ Extract the stack to display exceptions :return: a string represening the last exception """ exc_type, exc_value, tb = sys.exc_info() exc_lines = traceback.format_exception(exc_type, exc_value, tb) return ''.join(exc_lines) def to_list(sth): """ Convert a string argument to a list by splitting on spaces, and pass through a list argument unchanged:: from waflib.Utils import to_list lst = to_list("a b c d") :param sth: List or a string of items separated by spaces :rtype: list :return: Argument converted to list """ if isinstance(sth, str): return sth.split() else: return sth re_nl = re.compile('\r*\n', re.M) def str_to_dict(txt): """ Parse a string with key = value pairs into a dictionary:: from waflib import Utils x = Utils.str_to_dict(''' a = 1 b = test ''') :type s: string :param s: String to parse :rtype: dict :return: Dictionary containing parsed key-value pairs """ tbl = {} lines = re_nl.split(txt) for x in lines: x = x.strip() if not x or x.startswith('#') or x.find('=') < 0: continue tmp = x.split('=') tbl[tmp[0].strip()] = '='.join(tmp[1:]).strip() return tbl def split_path(path): return path.split('/') def split_path_cygwin(path): if path.startswith('//'): ret = path.split('/')[2:] ret[0] = '/' + ret[0] return ret return path.split('/') re_sp = re.compile('[/\\\\]') def split_path_win32(path): if path.startswith('\\\\'): ret = re.split(re_sp, path)[2:] ret[0] = '\\' + ret[0] return ret return re.split(re_sp, path) if sys.platform == 'cygwin': split_path = split_path_cygwin elif is_win32: split_path = split_path_win32 split_path.__doc__ = """ Split a path by / or \\. This function is not like os.path.split :type path: string :param path: path to split :return: list of strings """ def check_dir(path): """ Ensure that a directory exists (similar to ``mkdir -p``). :type dir: string :param dir: Path to directory """ if not os.path.isdir(path): try: os.makedirs(path) except OSError as e: if not os.path.isdir(path): raise Errors.WafError('Cannot create the folder %r' % path, ex=e) def def_attrs(cls, **kw): """ Set default attributes on a class instance :type cls: class :param cls: the class to update the given attributes in. :type kw: dict :param kw: dictionary of attributes names and values. """ for k, v in kw.items(): if not hasattr(cls, k): setattr(cls, k, v) def quote_define_name(s): """ Convert a string to an identifier suitable for C defines. :type s: string :param s: String to convert :rtype: string :return: Identifier suitable for C defines """ fu = re.compile("[^a-zA-Z0-9]").sub("_", s) fu = fu.upper() return fu def h_list(lst): """ Hash lists. For tuples, using hash(tup) is much more efficient :param lst: list to hash :type lst: list of strings :return: hash of the list """ m = md5() m.update(str(lst).encode()) return m.digest() def h_fun(fun): """ Hash functions :param fun: function to hash :type fun: function :return: hash of the function """ try: return fun.code except AttributeError: try: h = inspect.getsource(fun) except IOError: h = "nocode" try: fun.code = h except AttributeError: pass return h reg_subst = re.compile(r"(\\\\)|(\$\$)|\$\{([^}]+)\}") def subst_vars(expr, params): """ Replace ${VAR} with the value of VAR taken from a dict or a config set:: from waflib import Utils s = Utils.subst_vars('${PREFIX}/bin', env) :type expr: string :param expr: String to perform substitution on :param params: Dictionary or config set to look up variable values. """ def repl_var(m): if m.group(1): return '\\' if m.group(2): return '$' try: # ConfigSet instances may contain lists return params.get_flat(m.group(3)) except AttributeError: return params[m.group(3)] return reg_subst.sub(repl_var, expr) def destos_to_binfmt(key): """ Return the binary format based on the unversioned platform name. :param key: platform name :type key: string :return: string representing the binary format """ if key == 'darwin': return 'mac-o' elif key in ('win32', 'cygwin', 'uwin', 'msys'): return 'pe' return 'elf' def unversioned_sys_platform(): """ Return the unversioned platform name. Some Python platform names contain versions, that depend on the build environment, e.g. linux2, freebsd6, etc. This returns the name without the version number. Exceptions are os2 and win32, which are returned verbatim. :rtype: string :return: Unversioned platform name """ s = sys.platform if s == 'java': # The real OS is hidden under the JVM. from java.lang import System s = System.getProperty('os.name') # see http://lopica.sourceforge.net/os.html for a list of possible values if s == 'Mac OS X': return 'darwin' elif s.startswith('Windows '): return 'win32' elif s == 'OS/2': return 'os2' elif s == 'HP-UX': return 'hpux' elif s in ('SunOS', 'Solaris'): return 'sunos' else: s = s.lower() # powerpc == darwin for our purposes if s == 'powerpc': return 'darwin' if s == 'win32' or s.endswith('os2') and s != 'sunos2': return s return re.split('\d+$', s)[0] def nada(*k, **kw): """ A function that does nothing :return: None """ pass class Timer(object): """ Simple object for timing the execution of commands. Its string representation is the current time:: from waflib.Utils import Timer timer = Timer() a_few_operations() s = str(timer) """ def __init__(self): self.start_time = datetime.datetime.utcnow() def __str__(self): delta = datetime.datetime.utcnow() - self.start_time days = int(delta.days) hours = delta.seconds // 3600 minutes = (delta.seconds - hours * 3600) // 60 seconds = delta.seconds - hours * 3600 - minutes * 60 + float(delta.microseconds) / 1000 / 1000 result = '' if days: result += '%dd' % days if days or hours: result += '%dh' % hours if days or hours or minutes: result += '%dm' % minutes return '%s%.3fs' % (result, seconds) if is_win32: old = shutil.copy2 def copy2(src, dst): """ shutil.copy2 does not copy the file attributes on windows, so we hack into the shutil module to fix the problem """ old(src, dst) shutil.copystat(src, dst) setattr(shutil, 'copy2', copy2) if os.name == 'java': # Jython cannot disable the gc but they can enable it ... wtf? try: gc.disable() gc.enable() except NotImplementedError: gc.disable = gc.enable def read_la_file(path): """ Read property files, used by msvc.py :param path: file to read :type path: string """ sp = re.compile(r'^([^=]+)=\'(.*)\'$') dc = {} for line in readf(path).splitlines(): try: _, left, right, _ = sp.split(line.strip()) dc[left] = right except ValueError: pass return dc def nogc(fun): """ Decorator: let a function disable the garbage collector during its execution. It is used in the build context when storing/loading the build cache file (pickle) :param fun: function to execute :type fun: function :return: the return value of the function executed """ def f(*k, **kw): try: gc.disable() ret = fun(*k, **kw) finally: gc.enable() return ret f.__doc__ = fun.__doc__ return f def run_once(fun): """ Decorator: let a function cache its results, use like this:: @run_once def foo(k): return 345*2343 :param fun: function to execute :type fun: function :return: the return value of the function executed """ cache = {} def wrap(k): try: return cache[k] except KeyError: ret = fun(k) cache[k] = ret return ret wrap.__cache__ = cache return wrap def get_registry_app_path(key, filename): if not winreg: return None try: result = winreg.QueryValue(key, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\%s.exe" % filename[0]) except WindowsError: pass else: if os.path.isfile(result): return result kupfer-v208/waflib/__init__.py000066400000000000000000000001071176220042200164160ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) kupfer-v208/waflib/ansiterm.py000066400000000000000000000176231176220042200165140ustar00rootroot00000000000000import sys, os try: if not (sys.stderr.isatty() and sys.stdout.isatty()): raise ValueError('not a tty') from ctypes import * class COORD(Structure): _fields_ = [("X", c_short), ("Y", c_short)] class SMALL_RECT(Structure): _fields_ = [("Left", c_short), ("Top", c_short), ("Right", c_short), ("Bottom", c_short)] class CONSOLE_SCREEN_BUFFER_INFO(Structure): _fields_ = [("Size", COORD), ("CursorPosition", COORD), ("Attributes", c_short), ("Window", SMALL_RECT), ("MaximumWindowSize", COORD)] class CONSOLE_CURSOR_INFO(Structure): _fields_ = [('dwSize',c_ulong), ('bVisible', c_int)] sbinfo = CONSOLE_SCREEN_BUFFER_INFO() csinfo = CONSOLE_CURSOR_INFO() hconsole = windll.kernel32.GetStdHandle(-11) windll.kernel32.GetConsoleScreenBufferInfo(hconsole, byref(sbinfo)) if sbinfo.Size.X < 9 or sbinfo.Size.Y < 9: raise ValueError('small console') windll.kernel32.GetConsoleCursorInfo(hconsole, byref(csinfo)) except Exception: pass else: import re, threading is_vista = getattr(sys, "getwindowsversion", None) and sys.getwindowsversion()[0] >= 6 try: _type = unicode except: _type = str to_int = lambda number, default: number and int(number) or default wlock = threading.Lock() STD_OUTPUT_HANDLE = -11 STD_ERROR_HANDLE = -12 class AnsiTerm(object): """ emulate a vt100 terminal in cmd.exe """ def __init__(self): self.encoding = sys.stdout.encoding self.hconsole = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) self.cursor_history = [] self.orig_sbinfo = CONSOLE_SCREEN_BUFFER_INFO() self.orig_csinfo = CONSOLE_CURSOR_INFO() windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole, byref(self.orig_sbinfo)) windll.kernel32.GetConsoleCursorInfo(hconsole, byref(self.orig_csinfo)) def screen_buffer_info(self): sbinfo = CONSOLE_SCREEN_BUFFER_INFO() windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole, byref(sbinfo)) return sbinfo def clear_line(self, param): mode = param and int(param) or 0 sbinfo = self.screen_buffer_info() if mode == 1: # Clear from begining of line to cursor position line_start = COORD(0, sbinfo.CursorPosition.Y) line_length = sbinfo.Size.X elif mode == 2: # Clear entire line line_start = COORD(sbinfo.CursorPosition.X, sbinfo.CursorPosition.Y) line_length = sbinfo.Size.X - sbinfo.CursorPosition.X else: # Clear from cursor position to end of line line_start = sbinfo.CursorPosition line_length = sbinfo.Size.X - sbinfo.CursorPosition.X chars_written = c_int() windll.kernel32.FillConsoleOutputCharacterA(self.hconsole, c_wchar(' '), line_length, line_start, byref(chars_written)) windll.kernel32.FillConsoleOutputAttribute(self.hconsole, sbinfo.Attributes, line_length, line_start, byref(chars_written)) def clear_screen(self, param): mode = to_int(param, 0) sbinfo = self.screen_buffer_info() if mode == 1: # Clear from begining of screen to cursor position clear_start = COORD(0, 0) clear_length = sbinfo.CursorPosition.X * sbinfo.CursorPosition.Y elif mode == 2: # Clear entire screen and return cursor to home clear_start = COORD(0, 0) clear_length = sbinfo.Size.X * sbinfo.Size.Y windll.kernel32.SetConsoleCursorPosition(self.hconsole, clear_start) else: # Clear from cursor position to end of screen clear_start = sbinfo.CursorPosition clear_length = ((sbinfo.Size.X - sbinfo.CursorPosition.X) + sbinfo.Size.X * (sbinfo.Size.Y - sbinfo.CursorPosition.Y)) chars_written = c_int() windll.kernel32.FillConsoleOutputCharacterA(self.hconsole, c_wchar(' '), clear_length, clear_start, byref(chars_written)) windll.kernel32.FillConsoleOutputAttribute(self.hconsole, sbinfo.Attributes, clear_length, clear_start, byref(chars_written)) def push_cursor(self, param): sbinfo = self.screen_buffer_info() self.cursor_history.append(sbinfo.CursorPosition) def pop_cursor(self, param): if self.cursor_history: old_pos = self.cursor_history.pop() windll.kernel32.SetConsoleCursorPosition(self.hconsole, old_pos) def set_cursor(self, param): y, sep, x = param.partition(';') x = to_int(x, 1) - 1 y = to_int(y, 1) - 1 sbinfo = self.screen_buffer_info() new_pos = COORD( min(max(0, x), sbinfo.Size.X), min(max(0, y), sbinfo.Size.Y) ) windll.kernel32.SetConsoleCursorPosition(self.hconsole, new_pos) def set_column(self, param): x = to_int(param, 1) - 1 sbinfo = self.screen_buffer_info() new_pos = COORD( min(max(0, x), sbinfo.Size.X), sbinfo.CursorPosition.Y ) windll.kernel32.SetConsoleCursorPosition(self.hconsole, new_pos) def move_cursor(self, x_offset=0, y_offset=0): sbinfo = self.screen_buffer_info() new_pos = COORD( min(max(0, sbinfo.CursorPosition.X + x_offset), sbinfo.Size.X), min(max(0, sbinfo.CursorPosition.Y + y_offset), sbinfo.Size.Y) ) windll.kernel32.SetConsoleCursorPosition(self.hconsole, new_pos) def move_up(self, param): self.move_cursor(y_offset = -to_int(param, 1)) def move_down(self, param): self.move_cursor(y_offset = to_int(param, 1)) def move_left(self, param): self.move_cursor(x_offset = -to_int(param, 1)) def move_right(self, param): self.move_cursor(x_offset = to_int(param, 1)) def next_line(self, param): sbinfo = self.screen_buffer_info() self.move_cursor( x_offset = -sbinfo.CursorPosition.X, y_offset = to_int(param, 1) ) def prev_line(self, param): sbinfo = self.screen_buffer_info() self.move_cursor( x_offset = -sbinfo.CursorPosition.X, y_offset = -to_int(param, 1) ) def rgb2bgr(self, c): return ((c&1) << 2) | (c&2) | ((c&4)>>2) def set_color(self, param): cols = param.split(';') sbinfo = CONSOLE_SCREEN_BUFFER_INFO() windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole, byref(sbinfo)) attr = sbinfo.Attributes for c in cols: if is_vista: c = int(c) else: c = to_int(c, 0) if c in range(30,38): # fgcolor attr = (attr & 0xfff0) | self.rgb2bgr(c-30) elif c in range(40,48): # bgcolor attr = (attr & 0xff0f) | (self.rgb2bgr(c-40) << 4) elif c == 0: # reset attr = self.orig_sbinfo.Attributes elif c == 1: # strong attr |= 0x08 elif c == 4: # blink not available -> bg intensity attr |= 0x80 elif c == 7: # negative attr = (attr & 0xff88) | ((attr & 0x70) >> 4) | ((attr & 0x07) << 4) windll.kernel32.SetConsoleTextAttribute(self.hconsole, attr) def show_cursor(self,param): csinfo.bVisible = 1 windll.kernel32.SetConsoleCursorInfo(self.hconsole, byref(csinfo)) def hide_cursor(self,param): csinfo.bVisible = 0 windll.kernel32.SetConsoleCursorInfo(self.hconsole, byref(csinfo)) ansi_command_table = { 'A': move_up, 'B': move_down, 'C': move_right, 'D': move_left, 'E': next_line, 'F': prev_line, 'G': set_column, 'H': set_cursor, 'f': set_cursor, 'J': clear_screen, 'K': clear_line, 'h': show_cursor, 'l': hide_cursor, 'm': set_color, 's': push_cursor, 'u': pop_cursor, } # Match either the escape sequence or text not containing escape sequence ansi_tokens = re.compile('(?:\x1b\[([0-9?;]*)([a-zA-Z])|([^\x1b]+))') def write(self, text): try: wlock.acquire() for param, cmd, txt in self.ansi_tokens.findall(text): if cmd: cmd_func = self.ansi_command_table.get(cmd) if cmd_func: cmd_func(self, param) else: self.writeconsole(txt) finally: wlock.release() def writeconsole(self, txt): chars_written = c_int() writeconsole = windll.kernel32.WriteConsoleA if isinstance(txt, _type): writeconsole = windll.kernel32.WriteConsoleW TINY_STEP = 3000 for x in range(0, len(txt), TINY_STEP): # According MSDN, size should NOT exceed 64 kb (issue #746) tiny = txt[x : x + TINY_STEP] writeconsole(self.hconsole, tiny, len(tiny), byref(chars_written), None) def flush(self): pass def isatty(self): return True sys.stderr = sys.stdout = AnsiTerm() os.environ['TERM'] = 'vt100' kupfer-v208/waflib/extras/000077500000000000000000000000001176220042200156155ustar00rootroot00000000000000kupfer-v208/waflib/extras/__init__.py000066400000000000000000000001071176220042200177240ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2005-2010 (ita) kupfer-v208/waflib/extras/compat15.py000066400000000000000000000220401176220042200176160ustar00rootroot00000000000000#! /usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2010 (ita) """ This file is provided to enable compatibility with waf 1.5, it will be removed in waf 1.7 """ import sys from waflib import ConfigSet, Logs, Options, Scripting, Task, Build, Configure, Node, Runner, TaskGen, Utils, Errors, Context # the following is to bring some compatibility with waf 1.5 "import waflib.Configure → import Configure" sys.modules['Environment'] = ConfigSet ConfigSet.Environment = ConfigSet.ConfigSet sys.modules['Logs'] = Logs sys.modules['Options'] = Options sys.modules['Scripting'] = Scripting sys.modules['Task'] = Task sys.modules['Build'] = Build sys.modules['Configure'] = Configure sys.modules['Node'] = Node sys.modules['Runner'] = Runner sys.modules['TaskGen'] = TaskGen sys.modules['Utils'] = Utils from waflib.Tools import c_preproc sys.modules['preproc'] = c_preproc from waflib.Tools import c_config sys.modules['config_c'] = c_config ConfigSet.ConfigSet.copy = ConfigSet.ConfigSet.derive ConfigSet.ConfigSet.set_variant = Utils.nada Build.BuildContext.add_subdirs = Build.BuildContext.recurse Build.BuildContext.new_task_gen = Build.BuildContext.__call__ Build.BuildContext.is_install = 0 Node.Node.relpath_gen = Node.Node.path_from def name_to_obj(self, s, env=None): Logs.warn('compat: change "name_to_obj(name, env)" by "get_tgen_by_name(name)"') return self.get_tgen_by_name(s) Build.BuildContext.name_to_obj = name_to_obj def env_of_name(self, name): try: return self.all_envs[name] except KeyError: Logs.error('no such environment: '+name) return None Build.BuildContext.env_of_name = env_of_name def set_env_name(self, name, env): self.all_envs[name] = env return env Configure.ConfigurationContext.set_env_name = set_env_name def retrieve(self, name, fromenv=None): try: env = self.all_envs[name] except KeyError: env = ConfigSet.ConfigSet() self.prepare_env(env) self.all_envs[name] = env else: if fromenv: Logs.warn("The environment %s may have been configured already" % name) return env Configure.ConfigurationContext.retrieve = retrieve Configure.ConfigurationContext.sub_config = Configure.ConfigurationContext.recurse Configure.ConfigurationContext.check_tool = Configure.ConfigurationContext.load Configure.conftest = Configure.conf Configure.ConfigurationError = Errors.ConfigurationError Options.OptionsContext.sub_options = Options.OptionsContext.recurse Options.OptionsContext.tool_options = Context.Context.load Options.Handler = Options.OptionsContext Task.simple_task_type = Task.task_type_from_func = Task.task_factory Task.TaskBase.classes = Task.classes def setitem(self, key, value): if key.startswith('CCFLAGS'): key = key[1:] self.table[key] = value ConfigSet.ConfigSet.__setitem__ = setitem @TaskGen.feature('d') @TaskGen.before('apply_incpaths') def old_importpaths(self): if getattr(self, 'importpaths', []): self.includes = self.importpaths from waflib import Context eld = Context.load_tool def load_tool(*k, **kw): ret = eld(*k, **kw) if 'set_options' in ret.__dict__: Logs.warn('compat: rename "set_options" to options') ret.options = ret.set_options if 'detect' in ret.__dict__: Logs.warn('compat: rename "detect" to "configure"') ret.configure = ret.detect return ret Context.load_tool = load_tool rev = Context.load_module def load_module(path): ret = rev(path) if 'set_options' in ret.__dict__: Logs.warn('compat: rename "set_options" to "options" (%r)' % path) ret.options = ret.set_options if 'srcdir' in ret.__dict__: Logs.warn('compat: rename "srcdir" to "top" (%r)' % path) ret.top = ret.srcdir if 'blddir' in ret.__dict__: Logs.warn('compat: rename "blddir" to "out" (%r)' % path) ret.out = ret.blddir return ret Context.load_module = load_module old_post = TaskGen.task_gen.post def post(self): self.features = self.to_list(self.features) if 'cc' in self.features: Logs.warn('compat: the feature cc does not exist anymore (use "c")') self.features.remove('cc') self.features.append('c') if 'cstaticlib' in self.features: Logs.warn('compat: the feature cstaticlib does not exist anymore (use "cstlib" or "cxxstlib")') self.features.remove('cstaticlib') self.features.append(('cxx' in self.features) and 'cxxstlib' or 'cstlib') if getattr(self, 'ccflags', None): Logs.warn('compat: "ccflags" was renamed to "cflags"') self.cflags = self.ccflags return old_post(self) TaskGen.task_gen.post = post def waf_version(*k, **kw): Logs.warn('wrong version (waf_version was removed in waf 1.6)') Utils.waf_version = waf_version import os @TaskGen.feature('c', 'cxx', 'd') @TaskGen.before('apply_incpaths', 'propagate_uselib_vars') @TaskGen.after('apply_link', 'process_source') def apply_uselib_local(self): """ process the uselib_local attribute execute after apply_link because of the execution order set on 'link_task' """ env = self.env from waflib.Tools.ccroot import stlink_task # 1. the case of the libs defined in the project (visit ancestors first) # the ancestors external libraries (uselib) will be prepended self.uselib = self.to_list(getattr(self, 'uselib', [])) self.includes = self.to_list(getattr(self, 'includes', [])) names = self.to_list(getattr(self, 'uselib_local', [])) get = self.bld.get_tgen_by_name seen = set([]) tmp = Utils.deque(names) # consume a copy of the list of names if tmp: Logs.warn('compat: "uselib_local" is deprecated, replace by "use"') while tmp: lib_name = tmp.popleft() # visit dependencies only once if lib_name in seen: continue y = get(lib_name) y.post() seen.add(lib_name) # object has ancestors to process (shared libraries): add them to the end of the list if getattr(y, 'uselib_local', None): for x in self.to_list(getattr(y, 'uselib_local', [])): obj = get(x) obj.post() if getattr(obj, 'link_task', None): if not isinstance(obj.link_task, stlink_task): tmp.append(x) # link task and flags if getattr(y, 'link_task', None): link_name = y.target[y.target.rfind(os.sep) + 1:] if isinstance(y.link_task, stlink_task): env.append_value('STLIB', [link_name]) else: # some linkers can link against programs env.append_value('LIB', [link_name]) # the order self.link_task.set_run_after(y.link_task) # for the recompilation self.link_task.dep_nodes += y.link_task.outputs # add the link path too tmp_path = y.link_task.outputs[0].parent.bldpath() if not tmp_path in env['LIBPATH']: env.prepend_value('LIBPATH', [tmp_path]) # add ancestors uselib too - but only propagate those that have no staticlib defined for v in self.to_list(getattr(y, 'uselib', [])): if not env['STLIB_' + v]: if not v in self.uselib: self.uselib.insert(0, v) # if the library task generator provides 'export_includes', add to the include path # the export_includes must be a list of paths relative to the other library if getattr(y, 'export_includes', None): self.includes.extend(y.to_incnodes(y.export_includes)) @TaskGen.feature('cprogram', 'cxxprogram', 'cstlib', 'cxxstlib', 'cshlib', 'cxxshlib', 'dprogram', 'dstlib', 'dshlib') @TaskGen.after('apply_link') def apply_objdeps(self): "add the .o files produced by some other object files in the same manner as uselib_local" names = getattr(self, 'add_objects', []) if not names: return names = self.to_list(names) get = self.bld.get_tgen_by_name seen = [] while names: x = names[0] # visit dependencies only once if x in seen: names = names[1:] continue # object does not exist ? y = get(x) # object has ancestors to process first ? update the list of names if getattr(y, 'add_objects', None): added = 0 lst = y.to_list(y.add_objects) lst.reverse() for u in lst: if u in seen: continue added = 1 names = [u]+names if added: continue # list of names modified, loop # safe to process the current object y.post() seen.append(x) for t in getattr(y, 'compiled_tasks', []): self.link_task.inputs.extend(t.outputs) @TaskGen.after('apply_link') def process_obj_files(self): if not hasattr(self, 'obj_files'): return for x in self.obj_files: node = self.path.find_resource(x) self.link_task.inputs.append(node) @TaskGen.taskgen_method def add_obj_file(self, file): """Small example on how to link object files as if they were source obj = bld.create_obj('cc') obj.add_obj_file('foo.o')""" if not hasattr(self, 'obj_files'): self.obj_files = [] if not 'process_obj_files' in self.meths: self.meths.append('process_obj_files') self.obj_files.append(file) old_define = Configure.ConfigurationContext.__dict__['define'] @Configure.conf def define(self, key, val, quote=True): old_define(self, key, val, quote) if key.startswith('HAVE_'): self.env[key] = 1 old_undefine = Configure.ConfigurationContext.__dict__['undefine'] @Configure.conf def undefine(self, key): old_undefine(self, key) if key.startswith('HAVE_'): self.env[key] = 0 # some people might want to use export_incdirs, but it was renamed def set_incdirs(self, val): Logs.warn('compat: change "export_incdirs" by "export_includes"') self.export_includes = val TaskGen.task_gen.export_incdirs = property(None, set_incdirs) kupfer-v208/waflib/extras/local_rpath.py000066400000000000000000000010321176220042200204530ustar00rootroot00000000000000#! /usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2011 (ita) from waflib.TaskGen import after_method, feature @after_method('propagate_uselib_vars') @feature('cprogram', 'cshlib', 'cxxprogram', 'cxxshlib', 'fcprogram', 'fcshlib') def add_rpath_stuff(self): all = self.to_list(getattr(self, 'use', [])) while all: name = all.pop() try: tg = self.bld.get_tgen_by_name(name) except: continue self.env.append_value('RPATH', tg.link_task.outputs[0].parent.abspath()) all.extend(self.to_list(getattr(tg, 'use', []))) kupfer-v208/waflib/extras/lru_cache.py000066400000000000000000000045761176220042200201300ustar00rootroot00000000000000#! /usr/bin/env python # encoding: utf-8 # Thomas Nagy 2011 import os, shutil, re from waflib import Options, Build, Logs """ Apply a least recently used policy to the Waf cache. For performance reasons, it is called after the build is complete. We assume that the the folders are written atomically Do export WAFCACHE=/tmp/foo_xyz where xyz represents the cache size in bytes If missing, the default cache size will be set to 10GB """ re_num = re.compile('[a-zA-Z_-]+(\d+)') CACHESIZE = 10*1024*1024*1024 # in bytes CLEANRATIO = 0.8 DIRSIZE = 4096 def compile(self): if Options.cache_global and not Options.options.nocache: try: os.makedirs(Options.cache_global) except: pass try: self.raw_compile() finally: if Options.cache_global and not Options.options.nocache: self.sweep() def sweep(self): global CACHESIZE CACHEDIR = Options.cache_global # get the cache max size from the WAFCACHE filename re_num = re.compile('[a-zA-Z_]+(\d+)') val = re_num.sub('\\1', os.path.basename(Options.cache_global)) try: CACHESIZE = int(val) except: pass # map folder names to timestamps flist = {} for x in os.listdir(CACHEDIR): j = os.path.join(CACHEDIR, x) if os.path.isdir(j) and len(x) == 64: # dir names are md5 hexdigests flist[x] = [os.stat(j).st_mtime, 0] for (x, v) in flist.items(): cnt = DIRSIZE # each entry takes 4kB d = os.path.join(CACHEDIR, x) for k in os.listdir(d): cnt += os.stat(os.path.join(d, k)).st_size flist[x][1] = cnt total = sum([x[1] for x in flist.values()]) Logs.debug('lru: Cache size is %r' % total) if total >= CACHESIZE: Logs.debug('lru: Trimming the cache since %r > %r' % (total, CACHESIZE)) # make a list to sort the folders by timestamp lst = [(p, v[0], v[1]) for (p, v) in flist.items()] lst.sort(key=lambda x: x[1]) # sort by timestamp lst.reverse() while total >= CACHESIZE * CLEANRATIO: (k, t, s) = lst.pop() p = os.path.join(CACHEDIR, k) v = p + '.del' try: os.rename(p, v) except: # someone already did it pass else: try: shutil.rmtree(v) except: # this should not happen, but who knows? Logs.warn('If you ever see this message, report it (%r)' % v) total -= s del flist[k] Logs.debug('lru: Total at the end %r' % total) Build.BuildContext.raw_compile = Build.BuildContext.compile Build.BuildContext.compile = compile Build.BuildContext.sweep = sweep kupfer-v208/waflib/extras/make.py000066400000000000000000000063171176220042200171130ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2011 (ita) """ A make-like way of executing the build, following the relationships between inputs/outputs This algorithm will lead to slower builds, will not be as flexible as "waf build", but it might be useful for building data files (?) It is likely to break in the following cases: - files are created dynamically (no inputs or outputs) - headers - building two files from different groups """ import re from waflib import Options, Task, Logs from waflib.Build import BuildContext class MakeContext(BuildContext): '''executes tasks in a step-by-step manner, following dependencies between inputs/outputs''' cmd = 'make' fun = 'build' def __init__(self, **kw): super(MakeContext, self).__init__(**kw) self.files = Options.options.files def get_build_iterator(self): if not self.files: while 1: yield super(MakeContext, self).get_build_iterator() for g in self.groups: for tg in g: try: f = tg.post except AttributeError: pass else: f() provides = {} uses = {} all_tasks = [] tasks = [] for pat in self.files.split(','): matcher = self.get_matcher(pat) for tg in g: if isinstance(tg, Task.TaskBase): lst = [tg] else: lst = tg.tasks for tsk in lst: all_tasks.append(tsk) do_exec = False for node in getattr(tsk, 'inputs', []): try: uses[node].append(tsk) except: uses[node] = [tsk] if matcher(node, output=False): do_exec = True break for node in getattr(tsk, 'outputs', []): try: provides[node].append(tsk) except: provides[node] = [tsk] if matcher(node, output=True): do_exec = True break if do_exec: tasks.append(tsk) # so we have the tasks that we need to process, the list of all tasks, # the map of the tasks providing nodes, and the map of tasks using nodes if not tasks: # if there are no tasks matching, return everything in the current group result = all_tasks else: # this is like a big filter... result = set([]) seen = set([]) cur = set(tasks) while cur: result |= cur tosee = set([]) for tsk in cur: for node in getattr(tsk, 'inputs', []): if node in seen: continue seen.add(node) tosee |= set(provides.get(node, [])) cur = tosee result = list(result) Task.set_file_constraints(result) Task.set_precedence_constraints(result) yield result while 1: yield [] def get_matcher(self, pat): # this returns a function inn = True out = True if pat.startswith('in:'): out = False pat = pat.replace('in:', '') elif pat.startswith('out:'): inn = False pat = pat.replace('out:', '') anode = self.root.find_node(pat) pattern = None if not anode: if not pat.startswith('^'): pat = '^.+?%s' % pat if not pat.endswith('$'): pat = '%s$' % pat pattern = re.compile(pat) def match(node, output): if output == True and not out: return False if output == False and not inn: return False if anode: return anode == node else: return pattern.match(node.abspath()) return match kupfer-v208/waflib/extras/md5_tstamp.py000066400000000000000000000036031176220042200202460ustar00rootroot00000000000000#! /usr/bin/env python # encoding: utf-8 """ Store some values on the buildcontext mapping file paths to stat values and md5 values (timestamp + md5) this way the md5 hashes are computed only when timestamp change (can be faster) There is usually little or no gain from enabling this, but it can be used to enable the second level cache with timestamps (WAFCACHE) You may have to run distclean or to remove the build directory before enabling/disabling this hashing scheme """ import os, stat try: import cPickle except: import pickle as cPickle from waflib import Utils, Build, Context STRONGEST = True Context.DBFILE += '_md5tstamp' Build.hashes_md5_tstamp = {} Build.SAVED_ATTRS.append('hashes_md5_tstamp') def store(self): # save the hash cache as part of the default pickle file self.hashes_md5_tstamp = Build.hashes_md5_tstamp self.store_real() Build.BuildContext.store_real = Build.BuildContext.store Build.BuildContext.store = store def restore(self): # we need a module variable for h_file below self.restore_real() try: Build.hashes_md5_tstamp = self.hashes_md5_tstamp or {} except Exception as e: Build.hashes_md5_tstamp = {} Build.BuildContext.restore_real = Build.BuildContext.restore Build.BuildContext.restore = restore def h_file(filename): st = os.stat(filename) if stat.S_ISDIR(st[stat.ST_MODE]): raise IOError('not a file') if filename in Build.hashes_md5_tstamp: if Build.hashes_md5_tstamp[filename][0] == str(st.st_mtime): return Build.hashes_md5_tstamp[filename][1] m = Utils.md5() if STRONGEST: f = open(filename, 'rb') read = 1 try: while read: read = f.read(100000) m.update(read) finally: f.close() else: m.update(str(st.st_mtime)) m.update(str(st.st_size)) m.update(filename) # ensure that the cache is overwritten Build.hashes_md5_tstamp[filename] = (str(st.st_mtime), m.digest()) return m.digest() Utils.h_file = h_file kupfer-v208/waflib/extras/misc.py000066400000000000000000000267351176220042200171370ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2006-2010 (ita) """ This tool is totally deprecated Try using: .pc.in files for .pc files the feature intltool_in - see demos/intltool make-like rules """ import shutil, re, os from waflib import TaskGen, Node, Task, Utils, Build, Errors from waflib.TaskGen import feature, after_method, before_method from waflib.Logs import debug def copy_attrs(orig, dest, names, only_if_set=False): """ copy class attributes from an object to another """ for a in Utils.to_list(names): u = getattr(orig, a, ()) if u or not only_if_set: setattr(dest, a, u) def copy_func(tsk): "Make a file copy. This might be used to make other kinds of file processing (even calling a compiler is possible)" env = tsk.env infile = tsk.inputs[0].abspath() outfile = tsk.outputs[0].abspath() try: shutil.copy2(infile, outfile) except (OSError, IOError): return 1 else: if tsk.chmod: os.chmod(outfile, tsk.chmod) return 0 def action_process_file_func(tsk): "Ask the function attached to the task to process it" if not tsk.fun: raise Errors.WafError('task must have a function attached to it for copy_func to work!') return tsk.fun(tsk) @feature('cmd') def apply_cmd(self): "call a command everytime" if not self.fun: raise Errors.WafError('cmdobj needs a function!') tsk = Task.TaskBase() tsk.fun = self.fun tsk.env = self.env self.tasks.append(tsk) tsk.install_path = self.install_path @feature('copy') @before_method('process_source') def apply_copy(self): Utils.def_attrs(self, fun=copy_func) self.default_install_path = 0 lst = self.to_list(self.source) self.meths.remove('process_source') for filename in lst: node = self.path.find_resource(filename) if not node: raise Errors.WafError('cannot find input file %s for processing' % filename) target = self.target if not target or len(lst)>1: target = node.name # TODO the file path may be incorrect newnode = self.path.find_or_declare(target) tsk = self.create_task('copy', node, newnode) tsk.fun = self.fun tsk.chmod = getattr(self, 'chmod', Utils.O644) if not tsk.env: tsk.debug() raise Errors.WafError('task without an environment') def subst_func(tsk): "Substitutes variables in a .in file" m4_re = re.compile('@(\w+)@', re.M) code = tsk.inputs[0].read() #Utils.readf(infile) # replace all % by %% to prevent errors by % signs in the input file while string formatting code = code.replace('%', '%%') s = m4_re.sub(r'%(\1)s', code) env = tsk.env di = getattr(tsk, 'dict', {}) or getattr(tsk.generator, 'dict', {}) if not di: names = m4_re.findall(code) for i in names: di[i] = env.get_flat(i) or env.get_flat(i.upper()) tsk.outputs[0].write(s % di) @feature('subst') @before_method('process_source') def apply_subst(self): Utils.def_attrs(self, fun=subst_func) lst = self.to_list(self.source) self.meths.remove('process_source') self.dict = getattr(self, 'dict', {}) for filename in lst: node = self.path.find_resource(filename) if not node: raise Errors.WafError('cannot find input file %s for processing' % filename) if self.target: newnode = self.path.find_or_declare(self.target) else: newnode = node.change_ext('') try: self.dict = self.dict.get_merged_dict() except AttributeError: pass if self.dict and not self.env['DICT_HASH']: self.env = self.env.derive() keys = list(self.dict.keys()) keys.sort() lst = [self.dict[x] for x in keys] self.env['DICT_HASH'] = str(Utils.h_list(lst)) tsk = self.create_task('copy', node, newnode) tsk.fun = self.fun tsk.dict = self.dict tsk.dep_vars = ['DICT_HASH'] tsk.chmod = getattr(self, 'chmod', Utils.O644) if not tsk.env: tsk.debug() raise Errors.WafError('task without an environment') #################### ## command-output #### #################### class cmd_arg(object): """command-output arguments for representing files or folders""" def __init__(self, name, template='%s'): self.name = name self.template = template self.node = None class input_file(cmd_arg): def find_node(self, base_path): assert isinstance(base_path, Node.Node) self.node = base_path.find_resource(self.name) if self.node is None: raise Errors.WafError("Input file %s not found in " % (self.name, base_path)) def get_path(self, env, absolute): if absolute: return self.template % self.node.abspath() else: return self.template % self.node.srcpath() class output_file(cmd_arg): def find_node(self, base_path): assert isinstance(base_path, Node.Node) self.node = base_path.find_or_declare(self.name) if self.node is None: raise Errors.WafError("Output file %s not found in " % (self.name, base_path)) def get_path(self, env, absolute): if absolute: return self.template % self.node.abspath() else: return self.template % self.node.bldpath() class cmd_dir_arg(cmd_arg): def find_node(self, base_path): assert isinstance(base_path, Node.Node) self.node = base_path.find_dir(self.name) if self.node is None: raise Errors.WafError("Directory %s not found in " % (self.name, base_path)) class input_dir(cmd_dir_arg): def get_path(self, dummy_env, dummy_absolute): return self.template % self.node.abspath() class output_dir(cmd_dir_arg): def get_path(self, env, dummy_absolute): return self.template % self.node.abspath() class command_output(Task.Task): color = "BLUE" def __init__(self, env, command, command_node, command_args, stdin, stdout, cwd, os_env, stderr): Task.Task.__init__(self, env=env) assert isinstance(command, (str, Node.Node)) self.command = command self.command_args = command_args self.stdin = stdin self.stdout = stdout self.cwd = cwd self.os_env = os_env self.stderr = stderr if command_node is not None: self.dep_nodes = [command_node] self.dep_vars = [] # additional environment variables to look def run(self): task = self #assert len(task.inputs) > 0 def input_path(node, template): if task.cwd is None: return template % node.bldpath() else: return template % node.abspath() def output_path(node, template): fun = node.abspath if task.cwd is None: fun = node.bldpath return template % fun() if isinstance(task.command, Node.Node): argv = [input_path(task.command, '%s')] else: argv = [task.command] for arg in task.command_args: if isinstance(arg, str): argv.append(arg) else: assert isinstance(arg, cmd_arg) argv.append(arg.get_path(task.env, (task.cwd is not None))) if task.stdin: stdin = open(input_path(task.stdin, '%s')) else: stdin = None if task.stdout: stdout = open(output_path(task.stdout, '%s'), "w") else: stdout = None if task.stderr: stderr = open(output_path(task.stderr, '%s'), "w") else: stderr = None if task.cwd is None: cwd = ('None (actually %r)' % os.getcwd()) else: cwd = repr(task.cwd) debug("command-output: cwd=%s, stdin=%r, stdout=%r, argv=%r" % (cwd, stdin, stdout, argv)) if task.os_env is None: os_env = os.environ else: os_env = task.os_env command = Utils.subprocess.Popen(argv, stdin=stdin, stdout=stdout, stderr=stderr, cwd=task.cwd, env=os_env) return command.wait() @feature('command-output') def init_cmd_output(self): Utils.def_attrs(self, stdin = None, stdout = None, stderr = None, # the command to execute command = None, # whether it is an external command; otherwise it is assumed # to be an executable binary or script that lives in the # source or build tree. command_is_external = False, # extra parameters (argv) to pass to the command (excluding # the command itself) argv = [], # dependencies to other objects -> this is probably not what you want (ita) # values must be 'task_gen' instances (not names!) dependencies = [], # dependencies on env variable contents dep_vars = [], # input files that are implicit, i.e. they are not # stdin, nor are they mentioned explicitly in argv hidden_inputs = [], # output files that are implicit, i.e. they are not # stdout, nor are they mentioned explicitly in argv hidden_outputs = [], # change the subprocess to this cwd (must use obj.input_dir() or output_dir() here) cwd = None, # OS environment variables to pass to the subprocess # if None, use the default environment variables unchanged os_env = None) @feature('command-output') @after_method('init_cmd_output') def apply_cmd_output(self): if self.command is None: raise Errors.WafError("command-output missing command") if self.command_is_external: cmd = self.command cmd_node = None else: cmd_node = self.path.find_resource(self.command) assert cmd_node is not None, ('''Could not find command '%s' in source tree. Hint: if this is an external command, use command_is_external=True''') % (self.command,) cmd = cmd_node if self.cwd is None: cwd = None else: assert isinstance(cwd, CmdDirArg) self.cwd.find_node(self.path) args = [] inputs = [] outputs = [] for arg in self.argv: if isinstance(arg, cmd_arg): arg.find_node(self.path) if isinstance(arg, input_file): inputs.append(arg.node) if isinstance(arg, output_file): outputs.append(arg.node) if self.stdout is None: stdout = None else: assert isinstance(self.stdout, str) stdout = self.path.find_or_declare(self.stdout) if stdout is None: raise Errors.WafError("File %s not found" % (self.stdout,)) outputs.append(stdout) if self.stderr is None: stderr = None else: assert isinstance(self.stderr, str) stderr = self.path.find_or_declare(self.stderr) if stderr is None: raise Errors.WafError("File %s not found" % (self.stderr,)) outputs.append(stderr) if self.stdin is None: stdin = None else: assert isinstance(self.stdin, str) stdin = self.path.find_resource(self.stdin) if stdin is None: raise Errors.WafError("File %s not found" % (self.stdin,)) inputs.append(stdin) for hidden_input in self.to_list(self.hidden_inputs): node = self.path.find_resource(hidden_input) if node is None: raise Errors.WafError("File %s not found in dir %s" % (hidden_input, self.path)) inputs.append(node) for hidden_output in self.to_list(self.hidden_outputs): node = self.path.find_or_declare(hidden_output) if node is None: raise Errors.WafError("File %s not found in dir %s" % (hidden_output, self.path)) outputs.append(node) if not (inputs or getattr(self, 'no_inputs', None)): raise Errors.WafError('command-output objects must have at least one input file or give self.no_inputs') if not (outputs or getattr(self, 'no_outputs', None)): raise Errors.WafError('command-output objects must have at least one output file or give self.no_outputs') cwd = self.bld.variant_dir task = command_output(self.env, cmd, cmd_node, self.argv, stdin, stdout, cwd, self.os_env, stderr) task.generator = self copy_attrs(self, task, 'before after ext_in ext_out', only_if_set=True) self.tasks.append(task) task.inputs = inputs task.outputs = outputs task.dep_vars = self.to_list(self.dep_vars) for dep in self.dependencies: assert dep is not self dep.post() for dep_task in dep.tasks: task.set_run_after(dep_task) if not task.inputs: # the case for svnversion, always run, and update the output nodes task.runnable_status = type(Task.TaskBase.run)(runnable_status, task, task.__class__) # always run task.post_run = type(Task.TaskBase.run)(post_run, task, task.__class__) # TODO the case with no outputs? def post_run(self): for x in self.outputs: x.sig = Utils.h_file(x.abspath()) def runnable_status(self): return self.RUN_ME Task.task_factory('copy', vars=[], func=action_process_file_func) kupfer-v208/waflib/extras/objcopy.py000066400000000000000000000033261176220042200176400ustar00rootroot00000000000000#!/usr/bin/python # Grygoriy Fuchedzhy 2010 """ Support for converting linked targets to ihex, srec or binary files using objcopy. Use the 'objcopy' feature in conjuction with the 'cc' or 'cxx' feature. The 'objcopy' feature uses the following attributes: objcopy_bfdname Target object format name (eg. ihex, srec, binary). Defaults to ihex. objcopy_target File name used for objcopy output. This defaults to the target name with objcopy_bfdname as extension. objcopy_install_path Install path for objcopy_target file. Defaults to ${PREFIX}/fw. objcopy_flags Additional flags passed to objcopy. """ from waflib.Utils import def_attrs from waflib import Task from waflib.TaskGen import feature, after_method class objcopy(Task.Task): run_str = '${OBJCOPY} -O ${TARGET_BFDNAME} ${OBJCOPYFLAGS} ${SRC} ${TGT}' color = 'CYAN' @feature('objcopy') @after_method('apply_link') def objcopy(self): def_attrs(self, objcopy_bfdname = 'ihex', objcopy_target = None, objcopy_install_path = "${PREFIX}/firmware", objcopy_flags = '') link_output = self.link_task.outputs[0] if not self.objcopy_target: self.objcopy_target = link_output.change_ext('.' + self.objcopy_bfdname).name task = self.create_task('objcopy', src=link_output, tgt=self.path.find_or_declare(self.objcopy_target)) task.env.append_unique('TARGET_BFDNAME', self.objcopy_bfdname) try: task.env.append_unique('OBJCOPYFLAGS', getattr(self, 'objcopy_flags')) except AttributeError: pass if self.objcopy_install_path: self.bld.install_files(self.objcopy_install_path, task.outputs[0], env=task.env.derive()) def configure(ctx): objcopy = ctx.find_program('objcopy', var='OBJCOPY', mandatory=True) kupfer-v208/waflib/extras/ocaml.py000066400000000000000000000224251176220042200172670ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2006-2010 (ita) "ocaml support" import os, re from waflib import TaskGen, Utils, Task, Build from waflib.Logs import error from waflib.TaskGen import feature, before_method, after_method, extension EXT_MLL = ['.mll'] EXT_MLY = ['.mly'] EXT_MLI = ['.mli'] EXT_MLC = ['.c'] EXT_ML = ['.ml'] open_re = re.compile('^\s*open\s+([a-zA-Z]+)(;;){0,1}$', re.M) foo = re.compile(r"""(\(\*)|(\*\))|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^()*"'\\]*)""", re.M) def filter_comments(txt): meh = [0] def repl(m): if m.group(1): meh[0] += 1 elif m.group(2): meh[0] -= 1 elif not meh[0]: return m.group(0) return '' return foo.sub(repl, txt) def scan(self): node = self.inputs[0] code = filter_comments(node.read()) global open_re names = [] import_iterator = open_re.finditer(code) if import_iterator: for import_match in import_iterator: names.append(import_match.group(1)) found_lst = [] raw_lst = [] for name in names: nd = None for x in self.incpaths: nd = x.find_resource(name.lower()+'.ml') if not nd: nd = x.find_resource(name+'.ml') if nd: found_lst.append(nd) break else: raw_lst.append(name) return (found_lst, raw_lst) native_lst=['native', 'all', 'c_object'] bytecode_lst=['bytecode', 'all'] @feature('ocaml') def init_ml(self): Utils.def_attrs(self, type = 'all', incpaths_lst = [], bld_incpaths_lst = [], mlltasks = [], mlytasks = [], mlitasks = [], native_tasks = [], bytecode_tasks = [], linktasks = [], bytecode_env = None, native_env = None, compiled_tasks = [], includes = '', uselib = '', are_deps_set = 0) @feature('ocaml') @after_method('init_ml') def init_envs_ml(self): self.islibrary = getattr(self, 'islibrary', False) global native_lst, bytecode_lst self.native_env = None if self.type in native_lst: self.native_env = self.env.derive() if self.islibrary: self.native_env['OCALINKFLAGS'] = '-a' self.bytecode_env = None if self.type in bytecode_lst: self.bytecode_env = self.env.derive() if self.islibrary: self.bytecode_env['OCALINKFLAGS'] = '-a' if self.type == 'c_object': self.native_env.append_unique('OCALINKFLAGS_OPT', '-output-obj') @feature('ocaml') @before_method('apply_vars_ml') @after_method('init_envs_ml') def apply_incpaths_ml(self): inc_lst = self.includes.split() lst = self.incpaths_lst for dir in inc_lst: node = self.path.find_dir(dir) if not node: error("node not found: " + str(dir)) continue if not node in lst: lst.append(node) self.bld_incpaths_lst.append(node) # now the nodes are added to self.incpaths_lst @feature('ocaml') @before_method('process_source') def apply_vars_ml(self): for i in self.incpaths_lst: if self.bytecode_env: app = self.bytecode_env.append_value app('OCAMLPATH', ['-I', i.bldpath(), '-I', i.srcpath()]) if self.native_env: app = self.native_env.append_value app('OCAMLPATH', ['-I', i.bldpath(), '-I', i.srcpath()]) varnames = ['INCLUDES', 'OCAMLFLAGS', 'OCALINKFLAGS', 'OCALINKFLAGS_OPT'] for name in self.uselib.split(): for vname in varnames: cnt = self.env[vname+'_'+name] if cnt: if self.bytecode_env: self.bytecode_env.append_value(vname, cnt) if self.native_env: self.native_env.append_value(vname, cnt) @feature('ocaml') @after_method('process_source') def apply_link_ml(self): if self.bytecode_env: ext = self.islibrary and '.cma' or '.run' linktask = self.create_task('ocalink') linktask.bytecode = 1 linktask.set_outputs(self.path.find_or_declare(self.target + ext)) linktask.env = self.bytecode_env self.linktasks.append(linktask) if self.native_env: if self.type == 'c_object': ext = '.o' elif self.islibrary: ext = '.cmxa' else: ext = '' linktask = self.create_task('ocalinkx') linktask.set_outputs(self.path.find_or_declare(self.target + ext)) linktask.env = self.native_env self.linktasks.append(linktask) # we produce a .o file to be used by gcc self.compiled_tasks.append(linktask) @extension(*EXT_MLL) def mll_hook(self, node): mll_task = self.create_task('ocamllex', node, node.change_ext('.ml')) mll_task.env = self.native_env.derive() self.mlltasks.append(mll_task) self.source.append(mll_task.outputs[0]) @extension(*EXT_MLY) def mly_hook(self, node): mly_task = self.create_task('ocamlyacc', node, [node.change_ext('.ml'), node.change_ext('.mli')]) mly_task.env = self.native_env.derive() self.mlytasks.append(mly_task) self.source.append(mly_task.outputs[0]) task = self.create_task('ocamlcmi', mly_task.outputs[1], mly_task.outputs[1].change_ext('.cmi')) task.env = self.native_env.derive() @extension(*EXT_MLI) def mli_hook(self, node): task = self.create_task('ocamlcmi', node, node.change_ext('.cmi')) task.env = self.native_env.derive() self.mlitasks.append(task) @extension(*EXT_MLC) def mlc_hook(self, node): task = self.create_task('ocamlcc', node, node.change_ext('.o')) task.env = self.native_env.derive() self.compiled_tasks.append(task) @extension(*EXT_ML) def ml_hook(self, node): if self.native_env: task = self.create_task('ocamlx', node, node.change_ext('.cmx')) task.env = self.native_env.derive() task.incpaths = self.bld_incpaths_lst self.native_tasks.append(task) if self.bytecode_env: task = self.create_task('ocaml', node, node.change_ext('.cmo')) task.env = self.bytecode_env.derive() task.bytecode = 1 task.incpaths = self.bld_incpaths_lst self.bytecode_tasks.append(task) def compile_may_start(self): if not getattr(self, 'flag_deps', ''): self.flag_deps = 1 # the evil part is that we can only compute the dependencies after the # source files can be read (this means actually producing the source files) if getattr(self, 'bytecode', ''): alltasks = self.generator.bytecode_tasks else: alltasks = self.generator.native_tasks self.signature() # ensure that files are scanned - unfortunately tree = self.generator.bld env = self.env for node in self.inputs: lst = tree.node_deps[self.uid()] for depnode in lst: for t in alltasks: if t == self: continue if depnode in t.inputs: self.set_run_after(t) # TODO necessary to get the signature right - for now delattr(self, 'cache_sig') self.signature() return Task.Task.runnable_status(self) class ocamlx(Task.Task): """native caml compilation""" color = 'GREEN' run_str = '${OCAMLOPT} ${OCAMLPATH} ${OCAMLFLAGS} ${OCAMLINCLUDES} -c -o ${TGT} ${SRC}' scan = scan runnable_status = compile_may_start class ocaml(Task.Task): """bytecode caml compilation""" color = 'GREEN' run_str = '${OCAMLC} ${OCAMLPATH} ${OCAMLFLAGS} ${OCAMLINCLUDES} -c -o ${TGT} ${SRC}' scan = scan runnable_status = compile_may_start class ocamlcmi(Task.Task): """interface generator (the .i files?)""" color = 'BLUE' run_str = '${OCAMLC} ${OCAMLPATH} ${OCAMLINCLUDES} -o ${TGT} -c ${SRC}' before = ['ocamlcc', 'ocaml', 'ocamlcc'] class ocamlcc(Task.Task): """ocaml to c interfaces""" color = 'GREEN' run_str = 'cd ${TGT[0].bld_dir()} && ${OCAMLOPT} ${OCAMLFLAGS} ${OCAMLPATH} ${OCAMLINCLUDES} -c ${SRC[0].abspath()}' class ocamllex(Task.Task): """lexical generator""" color = 'BLUE' run_str = '${OCAMLLEX} ${SRC} -o ${TGT}' before = ['ocamlcmi', 'ocaml', 'ocamlcc'] class ocamlyacc(Task.Task): """parser generator""" color = 'BLUE' run_str = '${OCAMLYACC} -b ${TGT[0].bld_base(env)} ${SRC}' before = ['ocamlcmi', 'ocaml', 'ocamlcc'] def link_may_start(self): if getattr(self, 'bytecode', 0): alltasks = self.generator.bytecode_tasks else: alltasks = self.generator.native_tasks for x in alltasks: if not x.hasrun: return Task.ASK_LATER if not getattr(self, 'order', ''): # now reorder the inputs given the task dependencies # this part is difficult, we do not have a total order on the tasks # if the dependencies are wrong, this may not stop seen = [] pendant = []+alltasks while pendant: task = pendant.pop(0) if task in seen: continue for x in task.run_after: if not x in seen: pendant.append(task) break else: seen.append(task) self.inputs = [x.outputs[0] for x in seen] self.order = 1 return Task.Task.runnable_status(self) class ocalink(Task.Task): """bytecode caml link""" color = 'YELLOW' run_str = '${OCAMLC} -o ${TGT} ${OCAMLINCLUDES} ${OCALINKFLAGS} ${SRC}' runnable_status = link_may_start after = ['ocaml', 'ocamlcc'] class ocalinkx(Task.Task): """native caml link""" color = 'YELLOW' run_str = '${OCAMLOPT} -o ${TGT} ${OCAMLINCLUDES} ${OCALINKFLAGS_OPT} ${SRC}' runnable_status = link_may_start after = ['ocamlx', 'ocamlcc'] def configure(conf): opt = conf.find_program('ocamlopt', var='OCAMLOPT', mandatory=False) occ = conf.find_program('ocamlc', var='OCAMLC', mandatory=False) if (not opt) or (not occ): conf.fatal('The objective caml compiler was not found:\ninstall it or make it available in your PATH') v = conf.env v['OCAMLC'] = occ v['OCAMLOPT'] = opt v['OCAMLLEX'] = conf.find_program('ocamllex', var='OCAMLLEX', mandatory=False) v['OCAMLYACC'] = conf.find_program('ocamlyacc', var='OCAMLYACC', mandatory=False) v['OCAMLFLAGS'] = '' v['OCAMLLIB'] = conf.cmd_and_log(conf.env['OCAMLC']+' -where').strip()+os.sep v['LIBPATH_OCAML'] = conf.cmd_and_log(conf.env['OCAMLC']+' -where').strip()+os.sep v['INCLUDES_OCAML'] = conf.cmd_and_log(conf.env['OCAMLC']+' -where').strip()+os.sep v['LIB_OCAML'] = 'camlrun' kupfer-v208/waflib/extras/package.py000066400000000000000000000030701176220042200175620ustar00rootroot00000000000000#! /usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2011 """ Obtain packages, unpack them in a location, and add associated uselib variables (CFLAGS_pkgname, LIBPATH_pkgname, etc). The default is use a Dependencies.txt file in the source directory. This is a work in progress. Usage: def options(opt): opt.load('package') def configure(conf): conf.load_packages() """ from waflib import Logs from waflib.Configure import conf try: from urllib import request except: from urllib import urlopen else: urlopen = request.urlopen CACHEVAR = 'WAFCACHE_PACKAGE' @conf def get_package_cache_dir(self): cache = None if CACHEVAR in conf.environ: cache = conf.environ[CACHEVAR] cache = self.root.make_node(cache) elif self.env[CACHEVAR]: cache = self.env[CACHEVAR] cache = self.root.make_node(cache) else: cache = self.srcnode.make_node('.wafcache_package') cache.mkdir() return cache @conf def download_archive(self, src, dst): for x in self.env.PACKAGE_REPO: url = '/'.join((x, src)) try: web = urlopen(url) try: if web.getcode() != 200: continue except AttributeError: pass except Exception: # on python3 urlopen throws an exception # python 2.3 does not have getcode and throws an exception to fail continue else: tmp = self.root.make_node(dst) tmp.write(web.read()) Logs.warn('Downloaded %s from %s' % (tmp.abspath(), url)) break else: self.fatal('Could not get the package %s' % src) @conf def load_packages(self): cache = self.get_package_cache_dir() # read the dependencies, get the archives, .. kupfer-v208/waflib/extras/parallel_debug.py000066400000000000000000000223341176220042200211350ustar00rootroot00000000000000#! /usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2007-2010 (ita) """ Debugging helper for parallel compilation, outputs a file named pdebug.svg in the source directory:: def options(opt): opt.load('parallel_debug') def configure(conf): conf.load('parallel_debug') def build(bld): ... """ import os, time, sys try: from Queue import Queue except: from queue import Queue from waflib import Runner, Options, Utils, Task, Logs, Errors #import random #random.seed(100) def options(opt): opt.add_option('--dtitle', action='store', default='Parallel build representation for %r' % ' '.join(sys.argv), help='title for the svg diagram', dest='dtitle') opt.add_option('--dwidth', action='store', type='int', help='diagram width', default=800, dest='dwidth') opt.add_option('--dtime', action='store', type='float', help='recording interval in seconds', default=0.009, dest='dtime') opt.add_option('--dband', action='store', type='int', help='band width', default=22, dest='dband') opt.add_option('--dmaxtime', action='store', type='float', help='maximum time, for drawing fair comparisons', default=0, dest='dmaxtime') # red #ff4d4d # green #4da74d # lila #a751ff color2code = { 'GREEN' : '#4da74d', 'YELLOW' : '#fefe44', 'PINK' : '#a751ff', 'RED' : '#cc1d1d', 'BLUE' : '#6687bb', 'CYAN' : '#34e2e2', } mp = {} info = [] # list of (text,color) def map_to_color(name): if name in mp: return mp[name] try: cls = Task.classes[name] except KeyError: return color2code['RED'] if cls.color in mp: return mp[cls.color] if cls.color in color2code: return color2code[cls.color] return color2code['RED'] def process(self): m = self.master if m.stop: m.out.put(self) return self.master.set_running(1, id(Utils.threading.currentThread()), self) # remove the task signature immediately before it is executed # in case of failure the task will be executed again try: del self.generator.bld.task_sigs[self.uid()] except: pass try: self.generator.bld.returned_tasks.append(self) self.log_display(self.generator.bld) ret = self.run() except Exception: self.err_msg = Utils.ex_stack() self.hasrun = Task.EXCEPTION # TODO cleanup m.error_handler(self) m.out.put(self) return if ret: self.err_code = ret self.hasrun = Task.CRASHED else: try: self.post_run() except Errors.WafError: pass except Exception: self.err_msg = Utils.ex_stack() self.hasrun = Task.EXCEPTION else: self.hasrun = Task.SUCCESS if self.hasrun != Task.SUCCESS: m.error_handler(self) self.master.set_running(-1, id(Utils.threading.currentThread()), self) m.out.put(self) Task.TaskBase.process_back = Task.TaskBase.process Task.TaskBase.process = process old_start = Runner.Parallel.start def do_start(self): try: Options.options.dband except AttributeError: self.bld.fatal('use def options(opt): opt.load("parallel_debug")!') self.taskinfo = Queue() old_start(self) if self.dirty: process_colors(self) Runner.Parallel.start = do_start def set_running(self, by, i, tsk): self.taskinfo.put( (i, id(tsk), time.time(), tsk.__class__.__name__, self.processed, self.count, by) ) Runner.Parallel.set_running = set_running def name2class(name): return name.replace(' ', '_').replace('.', '_') def process_colors(producer): # first, cast the parameters tmp = [] try: while True: tup = producer.taskinfo.get(False) tmp.append(list(tup)) except: pass try: ini = float(tmp[0][2]) except: return if not info: seen = [] for x in tmp: name = x[3] if not name in seen: seen.append(name) else: continue info.append((name, map_to_color(name))) info.sort(key=lambda x: x[0]) thread_count = 0 acc = [] for x in tmp: thread_count += x[6] acc.append("%d %d %f %r %d %d %d" % (x[0], x[1], x[2] - ini, x[3], x[4], x[5], thread_count)) data_node = producer.bld.path.make_node('pdebug.dat') data_node.write('\n'.join(acc)) tmp = [lst[:2] + [float(lst[2]) - ini] + lst[3:] for lst in tmp] st = {} for l in tmp: if not l[0] in st: st[l[0]] = len(st.keys()) tmp = [ [st[lst[0]]] + lst[1:] for lst in tmp ] THREAD_AMOUNT = len(st.keys()) st = {} for l in tmp: if not l[1] in st: st[l[1]] = len(st.keys()) tmp = [ [lst[0]] + [st[lst[1]]] + lst[2:] for lst in tmp ] BAND = Options.options.dband seen = {} acc = [] for x in range(len(tmp)): line = tmp[x] id = line[1] if id in seen: continue seen[id] = True begin = line[2] thread_id = line[0] for y in range(x + 1, len(tmp)): line = tmp[y] if line[1] == id: end = line[2] #print id, thread_id, begin, end #acc.append( ( 10*thread_id, 10*(thread_id+1), 10*begin, 10*end ) ) acc.append( (BAND * begin, BAND*thread_id, BAND*end - BAND*begin, BAND, line[3]) ) break if Options.options.dmaxtime < 0.1: gwidth = 1 for x in tmp: m = BAND * x[2] if m > gwidth: gwidth = m else: gwidth = BAND * Options.options.dmaxtime ratio = float(Options.options.dwidth) / gwidth gwidth = Options.options.dwidth gheight = BAND * (THREAD_AMOUNT + len(info) + 1.5) out = [] out.append(""" \n """ % (0, 0, gwidth + 4, gheight + 4, 0, 0, gwidth + 4, gheight + 4)) # main title if Options.options.dtitle: out.append("""%s """ % (gwidth/2, gheight - 5, Options.options.dtitle)) # the rectangles groups = {} for (x, y, w, h, clsname) in acc: try: groups[clsname].append((x, y, w, h)) except: groups[clsname] = [(x, y, w, h)] for cls in groups: out.append("\n" % name2class(cls)) for (x, y, w, h) in groups[cls]: out.append("""\n""" % (2 + x*ratio, 2 + y, w*ratio, h, map_to_color(cls))) out.append("\n") # output the caption cnt = THREAD_AMOUNT for (text, color) in info: # caption box b = BAND/2 out.append("""\n""" % (name2class(text), 2 + BAND, 5 + (cnt + 0.5) * BAND, b, b, color)) # caption text out.append("""%s\n""" % (2 + 2 * BAND, 5 + (cnt + 0.5) * BAND + 10, text)) cnt += 1 out.append(""" """) out.append("\n") node = producer.bld.path.make_node('pdebug.svg') node.write("".join(out)) Logs.warn('Created the diagram %r' % node.abspath()) p = node.parent.abspath() producer.bld.exec_command(['convert', p + os.sep + 'pdebug.svg', p + os.sep + 'pdebug.png']) kupfer-v208/waflib/extras/pep8.py000066400000000000000000000066361176220042200170560ustar00rootroot00000000000000#! /usr/bin/env python # encoding: utf-8 # # written by Sylvain Rouquette, 2011 ''' Install pep8 module: $ easy_install pep8 or $ pip install pep8 To add the boost tool to the waf file: $ ./waf-light --tools=compat15,pep8 or, if you have waf >= 1.6.2 $ ./waf update --files=pep8 Then add this to your wscript: [at]extension('.py', 'wscript') def run_pep8(self, node): self.create_task('Pep8', node) ''' import threading from waflib import TaskGen, Task, Options pep8 = __import__('pep8') class Pep8(Task.Task): color = 'PINK' lock = threading.Lock() def check_options(self): if pep8.options: return pep8.options = Options.options pep8.options.prog = 'pep8' excl = pep8.options.exclude.split(',') pep8.options.exclude = [s.rstrip('/') for s in excl] if pep8.options.filename: pep8.options.filename = pep8.options.filename.split(',') if pep8.options.select: pep8.options.select = pep8.options.select.split(',') else: pep8.options.select = [] if pep8.options.ignore: pep8.options.ignore = pep8.options.ignore.split(',') elif pep8.options.select: # Ignore all checks which are not explicitly selected pep8.options.ignore = [''] elif pep8.options.testsuite or pep8.options.doctest: # For doctest and testsuite, all checks are required pep8.options.ignore = [] else: # The default choice: ignore controversial checks pep8.options.ignore = pep8.DEFAULT_IGNORE.split(',') pep8.options.physical_checks = pep8.find_checks('physical_line') pep8.options.logical_checks = pep8.find_checks('logical_line') pep8.options.counters = dict.fromkeys(pep8.BENCHMARK_KEYS, 0) pep8.options.messages = {} def run(self): with Pep8.lock: self.check_options() pep8.input_file(self.inputs[0].abspath()) return 0 if not pep8.get_count() else -1 def options(opt): opt.add_option('-q', '--quiet', default=0, action='count', help="report only file names, or nothing with -qq") opt.add_option('-r', '--repeat', action='store_true', help="show all occurrences of the same error") opt.add_option('--exclude', metavar='patterns', default=pep8.DEFAULT_EXCLUDE, help="exclude files or directories which match these " "comma separated patterns (default: %s)" % pep8.DEFAULT_EXCLUDE, dest='exclude') opt.add_option('--filename', metavar='patterns', default='*.py', help="when parsing directories, only check filenames " "matching these comma separated patterns (default: " "*.py)") opt.add_option('--select', metavar='errors', default='', help="select errors and warnings (e.g. E,W6)") opt.add_option('--ignore', metavar='errors', default='', help="skip errors and warnings (e.g. E4,W)") opt.add_option('--show-source', action='store_true', help="show source code for each error") opt.add_option('--show-pep8', action='store_true', help="show text of PEP 8 for each error") opt.add_option('--statistics', action='store_true', help="count errors and warnings") opt.add_option('--count', action='store_true', help="print total number of errors and warnings " "to standard error and set exit code to 1 if " "total is not null") opt.add_option('--benchmark', action='store_true', help="measure processing speed") opt.add_option('--testsuite', metavar='dir', help="run regression tests from dir") opt.add_option('--doctest', action='store_true', help="run doctest on myself") kupfer-v208/waflib/extras/print_commands.py000066400000000000000000000020501176220042200212010ustar00rootroot00000000000000#! /usr/bin/env python """ Illustrate how to override a class method to do something In this case, print the commands being executed as strings (the commands are usually lists, so this can be misleading) """ import sys from waflib import Context, Utils, Logs def exec_command(self, cmd, **kw): subprocess = Utils.subprocess kw['shell'] = isinstance(cmd, str) txt = cmd if isinstance(cmd, list): txt = ' '.join(cmd) print(txt) Logs.debug('runner_env: kw=%s' % kw) try: if self.logger: # warning: may deadlock with a lot of output (subprocess limitation) self.logger.info(cmd) kw['stdout'] = kw['stderr'] = subprocess.PIPE p = subprocess.Popen(cmd, **kw) (out, err) = p.communicate() if out: self.logger.debug('out: %s' % out.decode(sys.stdout.encoding or 'iso8859-1')) if err: self.logger.error('err: %s' % err.decode(sys.stdout.encoding or 'iso8859-1')) return p.returncode else: p = subprocess.Popen(cmd, **kw) return p.wait() except OSError: return -1 Context.Context.exec_command = exec_command kupfer-v208/waflib/extras/proc.py000066400000000000000000000034051176220042200171340ustar00rootroot00000000000000#! /usr/bin/env python # per rosengren 2011 from os import environ, path from waflib import TaskGen, Utils def options(opt): grp = opt.add_option_group('Oracle ProC Options') grp.add_option('--oracle_home', action='store', default=environ.get('PROC_ORACLE'), help='Path to Oracle installation home (has bin/lib)') grp.add_option('--tns_admin', action='store', default=environ.get('TNS_ADMIN'), help='Directory containing server list (TNS_NAMES.ORA)') grp.add_option('--connection', action='store', default='dummy-user/dummy-password@dummy-server', help='Format: user/password@server') def configure(cnf): env = cnf.env if not env.PROC_ORACLE: env.PROC_ORACLE = cnf.options.oracle_home if not env.PROC_TNS_ADMIN: env.PROC_TNS_ADMIN = cnf.options.tns_admin if not env.PROC_CONNECTION: env.PROC_CONNECTION = cnf.options.connection cnf.find_program('proc', var='PROC', path_list=env.PROC_ORACLE + path.sep + 'bin') def proc(tsk): env = tsk.env gen = tsk.generator bld = gen.bld inc_nodes = gen.to_incnodes(Utils.to_list(getattr(gen,'includes',[])) + env['INCLUDES']) # FIXME the if-else construct will not work in python 2 cmd = ( [env.PROC] + ['SQLCHECK=SEMANTICS'] + (['SYS_INCLUDE=(' + ','.join(env.PROC_INCLUDES) + ')'] if env.PROC_INCLUDES else []) + ['INCLUDE=(' + ','.join( [i.bldpath() for i in inc_nodes] ) + ')'] + ['userid=' + env.PROC_CONNECTION] + ['INAME=' + tsk.inputs[0].bldpath()] + ['ONAME=' + tsk.outputs[0].bldpath()] ) exec_env = { 'ORACLE_HOME': env.PROC_ORACLE, 'LD_LIBRARY_PATH': env.PROC_ORACLE + path.sep + 'lib', } if env.PROC_TNS_ADMIN: exec_env['TNS_ADMIN'] = env.PROC_TNS_ADMIN return tsk.exec_command(cmd, env=exec_env) TaskGen.declare_chain( name = 'proc', rule = proc, ext_in = '.pc', ext_out = '.c', ) kupfer-v208/waflib/extras/relocation.py000066400000000000000000000043521176220042200203320ustar00rootroot00000000000000#! /usr/bin/env python # encoding: utf-8 """ Waf 1.6 Try to detect if the project directory was relocated, and if it was, change the node representing the project directory. Just call: waf configure build Note that if the project directory name changes, the signatures for the tasks using files in that directory will change, causing a partial build. """ import os from waflib import Build, ConfigSet, Task, Utils, Errors from waflib.TaskGen import feature, before_method, after_method EXTRA_LOCK = '.old_srcdir' old1 = Build.BuildContext.store def store(self): old1(self) db = os.path.join(self.variant_dir, EXTRA_LOCK) env = ConfigSet.ConfigSet() env.SRCDIR = self.srcnode.abspath() env.store(db) Build.BuildContext.store = store old2 = Build.BuildContext.init_dirs def init_dirs(self): if not (os.path.isabs(self.top_dir) and os.path.isabs(self.out_dir)): raise Errors.WafError('The project was not configured: run "waf configure" first!') srcdir = None db = os.path.join(self.variant_dir, EXTRA_LOCK) env = ConfigSet.ConfigSet() try: env.load(db) srcdir = env.SRCDIR except: pass if srcdir: d = self.root.find_node(srcdir) if d and srcdir != self.top_dir and getattr(d, 'children', ''): srcnode = self.root.make_node(self.top_dir) print("relocating the source directory %r -> %r" % (srcdir, self.top_dir)) srcnode.children = {} for (k, v) in d.children.items(): srcnode.children[k] = v v.parent = srcnode d.children = {} old2(self) Build.BuildContext.init_dirs = init_dirs def uid(self): try: return self.uid_ except AttributeError: # this is not a real hot zone, but we want to avoid surprizes here m = Utils.md5() up = m.update up(self.__class__.__name__.encode()) for x in self.inputs + self.outputs: up(x.path_from(x.ctx.srcnode).encode()) self.uid_ = m.digest() return self.uid_ Task.Task.uid = uid @feature('c', 'cxx', 'd', 'go', 'asm', 'fc', 'includes') @after_method('propagate_uselib_vars', 'process_source') def apply_incpaths(self): lst = self.to_incnodes(self.to_list(getattr(self, 'includes', [])) + self.env['INCLUDES']) self.includes_nodes = lst bld = self.bld self.env['INCPATHS'] = [x.is_child_of(bld.srcnode) and x.path_from(bld.bldnode) or x.abspath() for x in lst] kupfer-v208/waflib/extras/review.py000066400000000000000000000220331176220042200174700ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Laurent Birtz, 2011 # moved the code into a separate tool (ita) """ There are several things here: - a different command-line option management making options persistent - the review command to display the options set Assumptions: - configuration options are not always added to the right group (and do not count on the users to do it...) - the options are persistent between the executions (waf options are NOT persistent by design), even for the configuration - when the options change, the build is invalidated (forcing a reconfiguration) """ import os, textwrap, shutil from waflib import Logs, Context, ConfigSet, Options, Build, Configure class Odict(dict): """Ordered dictionary""" def __init__(self, data=None): self._keys = [] dict.__init__(self) if data: # we were provided a regular dict if isinstance(data, dict): self.append_from_dict(data) # we were provided a tuple list elif type(data) == list: self.append_from_plist(data) # we were provided invalid input else: raise Exception("expected a dict or a tuple list") def append_from_dict(self, dict): map(self.__setitem__, dict.keys(), dict.values()) def append_from_plist(self, plist): for pair in plist: if len(pair) != 2: raise Exception("invalid pairs list") for (k, v) in plist: self.__setitem__(k, v) def __delitem__(self, key): if not key in self._keys: raise KeyError(key) dict.__delitem__(self, key) self._keys.remove(key) def __setitem__(self, key, item): dict.__setitem__(self, key, item) if key not in self._keys: self._keys.append(key) def clear(self): dict.clear(self) self._keys = [] def copy(self): return Odict(self.plist()) def items(self): return zip(self._keys, self.values()) def keys(self): return list(self._keys) # return a copy of the list def values(self): return map(self.get, self._keys) def plist(self): p = [] for k, v in self.items(): p.append( (k, v) ) return p def __str__(self): s = "{" l = len(self._keys) for k, v in self.items(): l -= 1 strkey = str(k) if isinstance(k, basestring): strkey = "'"+strkey+"'" strval = str(v) if isinstance(v, basestring): strval = "'"+strval+"'" s += strkey + ":" + strval if l > 0: s += ", " s += "}" return s review_options = Odict() """ Ordered dictionary mapping configuration option names to their optparse option. """ review_defaults = {} """ Dictionary mapping configuration option names to their default value. """ old_review_set = None """ Review set containing the configuration values before parsing the command line. """ new_review_set = None """ Review set containing the configuration values after parsing the command line. """ class OptionsReview(Options.OptionsContext): def __init__(self, **kw): super(self.__class__, self).__init__(**kw) def prepare_config_review(self): """ Find the configuration options that are reviewable, detach their default value from their optparse object and store them into the review dictionaries. """ gr = self.get_option_group('configure options') for opt in gr.option_list: if opt.action != 'store' or opt.dest in ("out", "top"): continue review_options[opt.dest] = opt review_defaults[opt.dest] = opt.default if gr.defaults.has_key(opt.dest): del gr.defaults[opt.dest] opt.default = None def parse_args(self): self.prepare_config_review() self.parser.get_option('--prefix').help = 'installation prefix' super(OptionsReview, self).parse_args() Context.create_context('review').refresh_review_set() class ReviewContext(Context.Context): '''reviews the configuration values''' cmd = 'review' def __init__(self, **kw): super(self.__class__, self).__init__(**kw) out = Options.options.out if not out: out = getattr(Context.g_module, Context.OUT, None) if not out: out = Options.lockfile.replace('.lock-waf', '') self.build_path = (os.path.isabs(out) and self.root or self.path).make_node(out).abspath() """Path to the build directory""" self.cache_path = os.path.join(self.build_path, Build.CACHE_DIR) """Path to the cache directory""" self.review_path = os.path.join(self.cache_path, 'review.cache') """Path to the review cache file""" def execute(self): """ Display and store the review set. Invalidate the cache as required. """ if not self.compare_review_set(old_review_set, new_review_set): self.invalidate_cache() self.store_review_set(new_review_set) print(self.display_review_set(new_review_set)) def invalidate_cache(self): """Invalidate the cache to prevent bad builds.""" try: Logs.warn("Removing the cached configuration since the options have changed") shutil.rmtree(self.cache_path) except: pass def refresh_review_set(self): """ Obtain the old review set and the new review set, and import the new set. """ global old_review_set, new_review_set old_review_set = self.load_review_set() new_review_set = self.update_review_set(old_review_set) self.import_review_set(new_review_set) def load_review_set(self): """ Load and return the review set from the cache if it exists. Otherwise, return an empty set. """ if os.path.isfile(self.review_path): return ConfigSet.ConfigSet(self.review_path) return ConfigSet.ConfigSet() def store_review_set(self, review_set): """ Store the review set specified in the cache. """ if not os.path.isdir(self.cache_path): os.makedirs(self.cache_path) review_set.store(self.review_path) def update_review_set(self, old_set): """ Merge the options passed on the command line with those imported from the previous review set and return the corresponding preview set. """ # Convert value to string. It's important that 'None' maps to # the empty string. def val_to_str(val): if val == None or val == '': return '' return str(val) new_set = ConfigSet.ConfigSet() opt_dict = Options.options.__dict__ for name in review_options.keys(): # the option is specified explicitly on the command line if name in opt_dict: # if the option is the default, pretend it was never specified if val_to_str(opt_dict[name]) != val_to_str(review_defaults[name]): new_set[name] = opt_dict[name] # the option was explicitly specified in a previous command elif name in old_set: new_set[name] = old_set[name] return new_set def import_review_set(self, review_set): """ Import the actual value of the reviewable options in the option dictionary, given the current review set. """ for name in review_options.keys(): if name in review_set: value = review_set[name] else: value = review_defaults[name] setattr(Options.options, name, value) def compare_review_set(self, set1, set2): """ Return true if the review sets specified are equal. """ if len(set1.keys()) != len(set2.keys()): return False for key in set1.keys(): if not key in set2 or set1[key] != set2[key]: return False return True def display_review_set(self, review_set): """ Return the string representing the review set specified. """ term_width = Logs.get_term_cols() lines = [] for dest in review_options.keys(): opt = review_options[dest] name = ", ".join(opt._short_opts + opt._long_opts) help = opt.help actual = None if dest in review_set: actual = review_set[dest] default = review_defaults[dest] lines.append(self.format_option(name, help, actual, default, term_width)) return "Configuration:\n\n" + "\n\n".join(lines) + "\n" def format_option(self, name, help, actual, default, term_width): """ Return the string representing the option specified. """ def val_to_str(val): if val == None or val == '': return "(void)" return str(val) max_name_len = 20 sep_len = 2 w = textwrap.TextWrapper() w.width = term_width - 1 if w.width < 60: w.width = 60 out = "" # format the help out += w.fill(help) + "\n" # format the name name_len = len(name) out += Logs.colors.CYAN + name + Logs.colors.NORMAL # set the indentation used when the value wraps to the next line w.subsequent_indent = " ".rjust(max_name_len + sep_len) w.width -= (max_name_len + sep_len) # the name string is too long, switch to the next line if name_len > max_name_len: out += "\n" + w.subsequent_indent # fill the remaining of the line with spaces else: out += " ".rjust(max_name_len + sep_len - name_len) # format the actual value, if there is one if actual != None: out += Logs.colors.BOLD + w.fill(val_to_str(actual)) + Logs.colors.NORMAL + "\n" + w.subsequent_indent # format the default value default_fmt = val_to_str(default) if actual != None: default_fmt = "default: " + default_fmt out += Logs.colors.NORMAL + w.fill(default_fmt) + Logs.colors.NORMAL return out # Monkey-patch ConfigurationContext.execute() to have it store the review set. old_configure_execute = Configure.ConfigurationContext.execute def new_configure_execute(self): old_configure_execute(self) Context.create_context('review').store_review_set(new_review_set) Configure.ConfigurationContext.execute = new_configure_execute kupfer-v208/waflib/extras/smart_continue.py000066400000000000000000000037051176220042200212260ustar00rootroot00000000000000#! /usr/bin/env python # Thomas Nagy, 2011 # Try to cancel the tasks that cannot run with the option -k when an error occurs: # 1 direct file dependencies # 2 tasks listed in the before/after/ext_in/ext_out attributes from waflib import Task, Runner Task.CANCELED = 4 def cancel_next(self, tsk): if not isinstance(tsk, Task.TaskBase): return if tsk.hasrun >= Task.SKIPPED: # normal execution, no need to do anything here return try: canceled_tasks, canceled_nodes = self.canceled_tasks, self.canceled_nodes except AttributeError: canceled_tasks = self.canceled_tasks = set([]) canceled_nodes = self.canceled_nodes = set([]) try: canceled_nodes.update(tsk.outputs) except AttributeError: pass try: canceled_tasks.add(tsk) except AttributeError: pass def get_out(self): tsk = self.out.get() if not self.stop: self.add_more_tasks(tsk) self.count -= 1 self.dirty = True self.cancel_next(tsk) # new code def error_handler(self, tsk): if not self.bld.keep: self.stop = True self.error.append(tsk) self.cancel_next(tsk) # new code Runner.Parallel.cancel_next = cancel_next Runner.Parallel.get_out = get_out Runner.Parallel.error_handler = error_handler def get_next_task(self): tsk = self.get_next_task_smart_continue() if not tsk: return tsk try: canceled_tasks, canceled_nodes = self.canceled_tasks, self.canceled_nodes except AttributeError: pass else: # look in the tasks that this one is waiting on # if one of them was canceled, cancel this one too for x in tsk.run_after: if x in canceled_tasks: tsk.hasrun = Task.CANCELED self.cancel_next(tsk) break else: # so far so good, now consider the nodes for x in getattr(tsk, 'inputs', []) + getattr(tsk, 'deps', []): if x in canceled_nodes: tsk.hasrun = Task.CANCELED self.cancel_next(tsk) break return tsk Runner.Parallel.get_next_task_smart_continue = Runner.Parallel.get_next_task Runner.Parallel.get_next_task = get_next_task kupfer-v208/waflib/extras/subprocess.py000066400000000000000000000510371176220042200203650ustar00rootroot00000000000000# borrowed from python 2.5.2c1 # Copyright (c) 2003-2005 by Peter Astrand # Licensed to PSF under a Contributor Agreement. import sys mswindows = (sys.platform == "win32") import os import types import traceback import gc class CalledProcessError(Exception): def __init__(self, returncode, cmd): self.returncode = returncode self.cmd = cmd def __str__(self): return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode) if mswindows: import threading import msvcrt if 0: import pywintypes from win32api import GetStdHandle, STD_INPUT_HANDLE, \ STD_OUTPUT_HANDLE, STD_ERROR_HANDLE from win32api import GetCurrentProcess, DuplicateHandle, \ GetModuleFileName, GetVersion from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE from win32pipe import CreatePipe from win32process import CreateProcess, STARTUPINFO, \ GetExitCodeProcess, STARTF_USESTDHANDLES, \ STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0 else: from _subprocess import * class STARTUPINFO: dwFlags = 0 hStdInput = None hStdOutput = None hStdError = None wShowWindow = 0 class pywintypes: error = IOError else: import select import errno import fcntl import pickle __all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "CalledProcessError"] try: MAXFD = os.sysconf("SC_OPEN_MAX") except: MAXFD = 256 try: False except NameError: False = 0 True = 1 _active = [] def _cleanup(): for inst in _active[:]: if inst.poll(_deadstate=sys.maxint) >= 0: try: _active.remove(inst) except ValueError: pass PIPE = -1 STDOUT = -2 def call(*popenargs, **kwargs): return Popen(*popenargs, **kwargs).wait() def check_call(*popenargs, **kwargs): retcode = call(*popenargs, **kwargs) cmd = kwargs.get("args") if cmd is None: cmd = popenargs[0] if retcode: raise CalledProcessError(retcode, cmd) return retcode def list2cmdline(seq): result = [] needquote = False for arg in seq: bs_buf = [] if result: result.append(' ') needquote = (" " in arg) or ("\t" in arg) or arg == "" if needquote: result.append('"') for c in arg: if c == '\\': bs_buf.append(c) elif c == '"': result.append('\\' * len(bs_buf)*2) bs_buf = [] result.append('\\"') else: if bs_buf: result.extend(bs_buf) bs_buf = [] result.append(c) if bs_buf: result.extend(bs_buf) if needquote: result.extend(bs_buf) result.append('"') return ''.join(result) class Popen(object): def __init__(self, args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0): _cleanup() self._child_created = False if not isinstance(bufsize, (int, long)): raise TypeError("bufsize must be an integer") if mswindows: if preexec_fn is not None: raise ValueError("preexec_fn is not supported on Windows platforms") if close_fds: raise ValueError("close_fds is not supported on Windows platforms") else: if startupinfo is not None: raise ValueError("startupinfo is only supported on Windows platforms") if creationflags != 0: raise ValueError("creationflags is only supported on Windows platforms") self.stdin = None self.stdout = None self.stderr = None self.pid = None self.returncode = None self.universal_newlines = universal_newlines (p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) = self._get_handles(stdin, stdout, stderr) self._execute_child(args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) if mswindows: if stdin is None and p2cwrite is not None: os.close(p2cwrite) p2cwrite = None if stdout is None and c2pread is not None: os.close(c2pread) c2pread = None if stderr is None and errread is not None: os.close(errread) errread = None if p2cwrite: self.stdin = os.fdopen(p2cwrite, 'wb', bufsize) if c2pread: if universal_newlines: self.stdout = os.fdopen(c2pread, 'rU', bufsize) else: self.stdout = os.fdopen(c2pread, 'rb', bufsize) if errread: if universal_newlines: self.stderr = os.fdopen(errread, 'rU', bufsize) else: self.stderr = os.fdopen(errread, 'rb', bufsize) def _translate_newlines(self, data): data = data.replace("\r\n", "\n") data = data.replace("\r", "\n") return data def __del__(self, sys=sys): if not self._child_created: return self.poll(_deadstate=sys.maxint) if self.returncode is None and _active is not None: _active.append(self) def communicate(self, input=None): if [self.stdin, self.stdout, self.stderr].count(None) >= 2: stdout = None stderr = None if self.stdin: if input: self.stdin.write(input) self.stdin.close() elif self.stdout: stdout = self.stdout.read() elif self.stderr: stderr = self.stderr.read() self.wait() return (stdout, stderr) return self._communicate(input) if mswindows: def _get_handles(self, stdin, stdout, stderr): if stdin is None and stdout is None and stderr is None: return (None, None, None, None, None, None) p2cread, p2cwrite = None, None c2pread, c2pwrite = None, None errread, errwrite = None, None if stdin is None: p2cread = GetStdHandle(STD_INPUT_HANDLE) if p2cread is not None: pass elif stdin is None or stdin == PIPE: p2cread, p2cwrite = CreatePipe(None, 0) p2cwrite = p2cwrite.Detach() p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0) elif isinstance(stdin, int): p2cread = msvcrt.get_osfhandle(stdin) else: p2cread = msvcrt.get_osfhandle(stdin.fileno()) p2cread = self._make_inheritable(p2cread) if stdout is None: c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE) if c2pwrite is not None: pass elif stdout is None or stdout == PIPE: c2pread, c2pwrite = CreatePipe(None, 0) c2pread = c2pread.Detach() c2pread = msvcrt.open_osfhandle(c2pread, 0) elif isinstance(stdout, int): c2pwrite = msvcrt.get_osfhandle(stdout) else: c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) c2pwrite = self._make_inheritable(c2pwrite) if stderr is None: errwrite = GetStdHandle(STD_ERROR_HANDLE) if errwrite is not None: pass elif stderr is None or stderr == PIPE: errread, errwrite = CreatePipe(None, 0) errread = errread.Detach() errread = msvcrt.open_osfhandle(errread, 0) elif stderr == STDOUT: errwrite = c2pwrite elif isinstance(stderr, int): errwrite = msvcrt.get_osfhandle(stderr) else: errwrite = msvcrt.get_osfhandle(stderr.fileno()) errwrite = self._make_inheritable(errwrite) return (p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) def _make_inheritable(self, handle): return DuplicateHandle(GetCurrentProcess(), handle, GetCurrentProcess(), 0, 1, DUPLICATE_SAME_ACCESS) def _find_w9xpopen(self): w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)), "w9xpopen.exe") if not os.path.exists(w9xpopen): w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix), "w9xpopen.exe") if not os.path.exists(w9xpopen): raise RuntimeError("Cannot locate w9xpopen.exe, which is needed for Popen to work with your shell or platform.") return w9xpopen def _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite): if not isinstance(args, types.StringTypes): args = list2cmdline(args) if startupinfo is None: startupinfo = STARTUPINFO() if None not in (p2cread, c2pwrite, errwrite): startupinfo.dwFlags |= STARTF_USESTDHANDLES startupinfo.hStdInput = p2cread startupinfo.hStdOutput = c2pwrite startupinfo.hStdError = errwrite if shell: startupinfo.dwFlags |= STARTF_USESHOWWINDOW startupinfo.wShowWindow = SW_HIDE comspec = os.environ.get("COMSPEC", "cmd.exe") args = comspec + " /c " + args if (GetVersion() >= 0x80000000L or os.path.basename(comspec).lower() == "command.com"): w9xpopen = self._find_w9xpopen() args = '"%s" %s' % (w9xpopen, args) creationflags |= CREATE_NEW_CONSOLE try: hp, ht, pid, tid = CreateProcess(executable, args, None, None, 1, creationflags, env, cwd, startupinfo) except pywintypes.error, e: raise WindowsError(*e.args) self._child_created = True self._handle = hp self.pid = pid ht.Close() if p2cread is not None: p2cread.Close() if c2pwrite is not None: c2pwrite.Close() if errwrite is not None: errwrite.Close() def poll(self, _deadstate=None): if self.returncode is None: if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0: self.returncode = GetExitCodeProcess(self._handle) return self.returncode def wait(self): if self.returncode is None: obj = WaitForSingleObject(self._handle, INFINITE) self.returncode = GetExitCodeProcess(self._handle) return self.returncode def _readerthread(self, fh, buffer): buffer.append(fh.read()) def _communicate(self, input): stdout = None stderr = None if self.stdout: stdout = [] stdout_thread = threading.Thread(target=self._readerthread, args=(self.stdout, stdout)) stdout_thread.setDaemon(True) stdout_thread.start() if self.stderr: stderr = [] stderr_thread = threading.Thread(target=self._readerthread, args=(self.stderr, stderr)) stderr_thread.setDaemon(True) stderr_thread.start() if self.stdin: if input is not None: self.stdin.write(input) self.stdin.close() if self.stdout: stdout_thread.join() if self.stderr: stderr_thread.join() if stdout is not None: stdout = stdout[0] if stderr is not None: stderr = stderr[0] if self.universal_newlines and hasattr(file, 'newlines'): if stdout: stdout = self._translate_newlines(stdout) if stderr: stderr = self._translate_newlines(stderr) self.wait() return (stdout, stderr) else: def _get_handles(self, stdin, stdout, stderr): p2cread, p2cwrite = None, None c2pread, c2pwrite = None, None errread, errwrite = None, None if stdin is None: pass elif stdin == PIPE: p2cread, p2cwrite = os.pipe() elif isinstance(stdin, int): p2cread = stdin else: p2cread = stdin.fileno() if stdout is None: pass elif stdout == PIPE: c2pread, c2pwrite = os.pipe() elif isinstance(stdout, int): c2pwrite = stdout else: c2pwrite = stdout.fileno() if stderr is None: pass elif stderr == PIPE: errread, errwrite = os.pipe() elif stderr == STDOUT: errwrite = c2pwrite elif isinstance(stderr, int): errwrite = stderr else: errwrite = stderr.fileno() return (p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) def _set_cloexec_flag(self, fd): try: cloexec_flag = fcntl.FD_CLOEXEC except AttributeError: cloexec_flag = 1 old = fcntl.fcntl(fd, fcntl.F_GETFD) fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag) def _close_fds(self, but): for i in xrange(3, MAXFD): if i == but: continue try: os.close(i) except: pass def _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite): if isinstance(args, types.StringTypes): args = [args] else: args = list(args) if shell: args = ["/bin/sh", "-c"] + args if executable is None: executable = args[0] errpipe_read, errpipe_write = os.pipe() self._set_cloexec_flag(errpipe_write) gc_was_enabled = gc.isenabled() gc.disable() try: self.pid = os.fork() except: if gc_was_enabled: gc.enable() raise self._child_created = True if self.pid == 0: try: if p2cwrite: os.close(p2cwrite) if c2pread: os.close(c2pread) if errread: os.close(errread) os.close(errpipe_read) if p2cread: os.dup2(p2cread, 0) if c2pwrite: os.dup2(c2pwrite, 1) if errwrite: os.dup2(errwrite, 2) if p2cread and p2cread not in (0,): os.close(p2cread) if c2pwrite and c2pwrite not in (p2cread, 1): os.close(c2pwrite) if errwrite and errwrite not in (p2cread, c2pwrite, 2): os.close(errwrite) if close_fds: self._close_fds(but=errpipe_write) if cwd is not None: os.chdir(cwd) if preexec_fn: apply(preexec_fn) if env is None: os.execvp(executable, args) else: os.execvpe(executable, args, env) except: exc_type, exc_value, tb = sys.exc_info() exc_lines = traceback.format_exception(exc_type, exc_value, tb) exc_value.child_traceback = ''.join(exc_lines) os.write(errpipe_write, pickle.dumps(exc_value)) os._exit(255) if gc_was_enabled: gc.enable() os.close(errpipe_write) if p2cread and p2cwrite: os.close(p2cread) if c2pwrite and c2pread: os.close(c2pwrite) if errwrite and errread: os.close(errwrite) data = os.read(errpipe_read, 1048576) os.close(errpipe_read) if data != "": os.waitpid(self.pid, 0) child_exception = pickle.loads(data) raise child_exception def _handle_exitstatus(self, sts): if os.WIFSIGNALED(sts): self.returncode = -os.WTERMSIG(sts) elif os.WIFEXITED(sts): self.returncode = os.WEXITSTATUS(sts) else: raise RuntimeError("Unknown child exit status!") def poll(self, _deadstate=None): if self.returncode is None: try: pid, sts = os.waitpid(self.pid, os.WNOHANG) if pid == self.pid: self._handle_exitstatus(sts) except os.error: if _deadstate is not None: self.returncode = _deadstate return self.returncode def wait(self): if self.returncode is None: pid, sts = os.waitpid(self.pid, 0) self._handle_exitstatus(sts) return self.returncode def _communicate(self, input): read_set = [] write_set = [] stdout = None stderr = None if self.stdin: self.stdin.flush() if input: write_set.append(self.stdin) else: self.stdin.close() if self.stdout: read_set.append(self.stdout) stdout = [] if self.stderr: read_set.append(self.stderr) stderr = [] input_offset = 0 while read_set or write_set: rlist, wlist, xlist = select.select(read_set, write_set, []) if self.stdin in wlist: bytes_written = os.write(self.stdin.fileno(), buffer(input, input_offset, 512)) input_offset += bytes_written if input_offset >= len(input): self.stdin.close() write_set.remove(self.stdin) if self.stdout in rlist: data = os.read(self.stdout.fileno(), 1024) if data == "": self.stdout.close() read_set.remove(self.stdout) stdout.append(data) if self.stderr in rlist: data = os.read(self.stderr.fileno(), 1024) if data == "": self.stderr.close() read_set.remove(self.stderr) stderr.append(data) if stdout is not None: stdout = ''.join(stdout) if stderr is not None: stderr = ''.join(stderr) if self.universal_newlines and hasattr(file, 'newlines'): if stdout: stdout = self._translate_newlines(stdout) if stderr: stderr = self._translate_newlines(stderr) self.wait() return (stdout, stderr) kupfer-v208/waflib/extras/syms.py000066400000000000000000000051711176220042200171660ustar00rootroot00000000000000#! /usr/bin/env python # encoding: utf-8 """ this tool supports the export_symbols_regex to export the symbols in a shared library. by default, all symbols are exported by gcc, and nothing by msvc. to use the tool, do something like: def build(ctx): ctx(features='c cshlib syms', source='a.c b.c', export_symbols_regex='mylib_.*', target='testlib') only the symbols starting with 'mylib_' will be exported. """ import re from waflib.Context import STDOUT from waflib.Task import Task from waflib.Errors import WafError from waflib.TaskGen import feature, after_method class gen_sym(Task): def run(self): obj = self.inputs[0] if 'msvc' in (self.env.CC_NAME, self.env.CXX_NAME): re_nm = re.compile(r'External\s+\|\s+_(' + self.generator.export_symbols_regex + r')\b') cmd = ['dumpbin', '/symbols', obj.abspath()] else: if self.env.DEST_BINFMT == 'pe': #gcc uses nm, and has a preceding _ on windows re_nm = re.compile(r'T\s+_(' + self.generator.export_symbols_regex + r')\b') else: re_nm = re.compile(r'T\s+(' + self.generator.export_symbols_regex + r')\b') cmd = ['nm', '-g', obj.abspath()] syms = re_nm.findall(self.generator.bld.cmd_and_log(cmd, quiet=STDOUT)) self.outputs[0].write('%r' % syms) class compile_sym(Task): def run(self): syms = {} for x in self.inputs: slist = eval(x.read()) for s in slist: syms[s] = 1 lsyms = syms.keys() lsyms.sort() if self.env.DEST_BINFMT == 'pe': self.outputs[0].write('EXPORTS\n' + '\n'.join(lsyms)) elif self.env.DEST_BINFMT == 'elf': self.outputs[0].write('{ global:\n' + ';\n'.join(lsyms) + ";\nlocal: *; };\n") else: raise WafError('NotImplemented') @feature('syms') @after_method('process_source', 'process_use', 'apply_link', 'process_uselib_local') def do_the_symbol_stuff(self): ins = [x.outputs[0] for x in self.compiled_tasks] self.gen_sym_tasks = [self.create_task('gen_sym', x, x.change_ext('.%d.sym' % self.idx)) for x in ins] tsk = self.create_task('compile_sym', [x.outputs[0] for x in self.gen_sym_tasks], self.path.find_or_declare(getattr(self, 'sym_filename', self.target + '.def'))) self.link_task.set_run_after(tsk) self.link_task.dep_nodes = [tsk.outputs[0]] if 'msvc' in (self.env.CC_NAME, self.env.CXX_NAME): self.link_task.env.append_value('LINKFLAGS', ['/def:' + tsk.outputs[0].bldpath()]) elif self.env.DEST_BINFMT == 'pe': #gcc on windows takes *.def as an additional input self.link_task.inputs.append(tsk.outputs[0]) elif self.env.DEST_BINFMT == 'elf': self.link_task.env.append_value('LINKFLAGS', ['-Wl,-version-script', '-Wl,' + tsk.outputs[0].bldpath()]) else: raise WafError('NotImplemented') kupfer-v208/waflib/fixpy2.py000066400000000000000000000024641176220042200161100ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2010 (ita) """ burn a book, save a tree """ import os all_modifs = {} def fixdir(dir): """call all the substitution functions on the waf folders""" global all_modifs for k in all_modifs: for v in all_modifs[k]: modif(os.path.join(dir, 'waflib'), k, v) def modif(dir, name, fun): """execute a substitution function""" if name == '*': lst = [] for y in '. Tools extras'.split(): for x in os.listdir(os.path.join(dir, y)): if x.endswith('.py'): lst.append(y + os.sep + x) for x in lst: modif(dir, x, fun) return filename = os.path.join(dir, name) f = open(filename, 'r') txt = f.read() f.close() txt = fun(txt) f = open(filename, 'w') f.write(txt) f.close() def subst(*k): """register a substitution function""" def do_subst(fun): global all_modifs for x in k: try: all_modifs[x].append(fun) except KeyError: all_modifs[x] = [fun] return fun return do_subst @subst('*') def r1(code): "utf-8 fixes for python < 2.6" code = code.replace('as e:', ',e:') code = code.replace(".decode(sys.stdout.encoding or 'iso8859-1')", '') code = code.replace('.encode()', '') return code @subst('Runner.py') def r4(code): "generator syntax" code = code.replace('next(self.biter)', 'self.biter.next()') return code kupfer-v208/wscript000066400000000000000000000211701176220042200144620ustar00rootroot00000000000000#! /usr/bin/env python # encoding: utf-8 # Kupfer's main wscript description file for Waf, written by Ulrik Sverdrup # may be distributed, changed, used, etc freely for any purpose import os import sys try: from waflib import Configure, Options, Utils, Logs except ImportError: print("You need to upgrade to Waf 1.6! See README.") sys.exit(1) # the following two variables are used by the target "waf dist" APPNAME="kupfer" VERSION = "undefined" def _get_git_version(): """ try grab the current version number from git""" version = None if os.path.exists(".git"): try: version = os.popen("git describe").read().strip() except Exception as e: print(e) return version def _read_git_version(): """Read version from git repo, or from GIT_VERSION""" version = _get_git_version() if not version and os.path.exists("GIT_VERSION"): f = open("GIT_VERSION", "r") version = f.read().strip() f.close() if version: global VERSION VERSION = version def _write_git_version(): """ Write the revision to a file called GIT_VERSION, to grab the current version number from git when generating the dist tarball.""" version = _get_git_version() if not version: return False version_file = open("GIT_VERSION", "w") version_file.write(version + "\n") version_file.close() return True _read_git_version() # these variables are mandatory ('/' are converted automatically) top = '.' out = 'build' config_subdirs = "auxdata extras help" build_subdirs = "auxdata data po extras help" EXTRA_DIST = [ #"waf", "GIT_VERSION", ] def _tarfile_append_as(tarname, filename, destname): import tarfile tf = tarfile.TarFile.open(tarname, "a") try: tarinfo = tf.gettarinfo(name=filename, arcname=destname) tarinfo.uid = 0 tarinfo.gid = 0 tarinfo.uname = "root" tarinfo.gname = "root" with open(filename, "rb") as f: tf.addfile(tarinfo, f) finally: tf.close() def gitdist(ctx): """Make the release tarball using git-archive""" import subprocess if not _write_git_version(): raise Exception("No version") basename = "%s-%s" % (APPNAME, VERSION) outname = basename + ".tar" proc = subprocess.Popen( ["git", "archive", "--format=tar", "--prefix=%s/" % basename, "HEAD"], stdout=subprocess.PIPE) fd = os.open(outname, os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o666) os.write(fd, proc.communicate()[0]) os.close(fd) for distfile in EXTRA_DIST: _tarfile_append_as(outname, distfile, os.path.join(basename, distfile)) subprocess.call(["xz", "-6e", outname]) subprocess.call(["sha1sum", outname + ".xz"]) def dist(ctx): "The standard waf dist process" import Scripting _write_git_version() Scripting.g_gz = "gz" Scripting.dist(ctx) def options(opt): # options for disabling pyc or pyo compilation opt.tool_options("python") opt.tool_options("gnu_dirs") opt.add_option('--nopyo',action='store_false',default=False,help='Do not install optimised compiled .pyo files [This is the default for Kupfer]',dest='pyo') opt.add_option('--pyo',action='store_true',default=False,help='Install optimised compiled .pyo files [Default:not install]',dest='pyo') opt.add_option('--no-runtime-deps',action='store_false',default=True, help='Do not check for any runtime dependencies',dest='check_deps') opt.sub_options(config_subdirs) def configure(conf): conf.check_tool("python") try: conf.check_python_version((2,6,0)) except Configure.ConfigurationError: # with explicitly set python that is not found, we # must show an error if os.getenv("PYTHON"): raise conf.env["PYTHON"] = "python2.6" conf.check_python_version((2,6,0)) conf.check_tool("gnu_dirs") conf.check_tool("intltool") conf.env["KUPFER"] = Utils.subst_vars("${BINDIR}/kupfer", conf.env) conf.env["VERSION"] = VERSION conf.sub_config(config_subdirs) # Setup PYTHONDIR so we install into $DATADIR conf.env["PYTHONDIR"] = Utils.subst_vars("${DATADIR}/kupfer", conf.env) Logs.pprint("NORMAL", "Installing python modules into: %(PYTHONDIR)s" % conf.env) opt_build_programs = { "rst2man": "Generate and install man page", } for prog in opt_build_programs: try: conf.find_program(prog, var=prog.replace("-", "_").upper()) except conf.errors.ConfigurationError: Logs.pprint("YELLOW", "Optional, allows: %s" % opt_build_programs[prog]) if not Options.options.check_deps: return python_modules = """ gio gtk xdg dbus """ for module in python_modules.split(): conf.check_python_module(module) Logs.pprint("NORMAL", "Checking optional dependencies:") opt_programs = { "dbus-send": "Focus kupfer from the command line", } opt_pymodules = { "wnck": "Identify and focus running applications", "gnome": ("Log out cleanly with session managers *OTHER* than " "gnome-session >= 2.24"), "keyring": "Required by plugins that save passwords", } for prog in opt_programs: try: conf.find_program(prog, var=prog.replace("-", "_").upper()) except conf.errors.ConfigurationError: Logs.pprint("YELLOW", "Optional, allows: %s" % opt_programs[prog]) try: conf.check_python_module("keybinder") except Configure.ConfigurationError: Logs.pprint("RED", "Python module keybinder is recommended") Logs.pprint("RED", "Please see README") for mod in opt_pymodules: try: conf.check_python_module(mod) except Configure.ConfigurationError: Logs.pprint("YELLOW", "module %s is recommended, allows %s" % ( mod, opt_pymodules[mod])) def _new_package(bld, name): """Add module @name to sources to be installed, where the name is the full (relative) path to the package """ obj = bld.new_task_gen("py") node = bld.path.find_dir(name) obj.source = node.ant_glob("*.py") obj.install_path = "${PYTHONDIR}/%s" % name # Find embedded package datafiles pkgnode = bld.path.find_dir(name) bld.install_files(obj.install_path, pkgnode.ant_glob("icon-list")) bld.install_files(obj.install_path, pkgnode.ant_glob("*.png")) bld.install_files(obj.install_path, pkgnode.ant_glob("*.svg")) def _find_packages_in_directory(bld, name): """Go through directory @name and recursively add all Python packages with contents to the sources to be installed """ for dirname, dirs, filenames in os.walk(name): if "__init__.py" in filenames: _new_package(bld, dirname) def _dict_slice(D, keys): return dict((k,D[k]) for k in keys) def build(bld): # always read new version bld.env["VERSION"] = VERSION # kupfer/ # kupfer module version info file version_subst_file = "kupfer/version_subst.py" bld(features="subst", source=version_subst_file + ".in", target=version_subst_file, dict = _dict_slice(bld.env,"VERSION DATADIR PACKAGE LOCALEDIR".split()) ) bld.install_files("${PYTHONDIR}/kupfer", "kupfer/version_subst.py") bld.new_task_gen( source="kupfer.py", install_path="${PYTHONDIR}" ) # Add all Python packages recursively _find_packages_in_directory(bld, "kupfer") # bin/ # Write in some variables in the shell script binaries bld(features="subst", source = "bin/kupfer.in", target = "bin/kupfer", dict = _dict_slice(bld.env, "PYTHON PYTHONDIR".split()) ) bld.install_files("${BINDIR}", "bin/kupfer", chmod=0o755) bld(features="subst", source = "bin/kupfer-exec.in", target = "bin/kupfer-exec", dict = _dict_slice(bld.env, "PYTHON PACKAGE LOCALEDIR".split()) ) bld.install_files("${BINDIR}", "bin/kupfer-exec", chmod=0o755) # Documentation/ if bld.env["RST2MAN"]: # generate man page from Manpage.rst bld.new_task_gen( source = "Documentation/Manpage.rst", target = "kupfer.1", rule = '%s ${SRC} > ${TGT}' % bld.env["RST2MAN"], ) bld.add_group() # compress and install man page manpage = bld.new_task_gen( source = "kupfer.1", target = "kupfer.1.gz", rule = 'gzip -9 -c ${SRC} > ${TGT}', install_path = "${MANDIR}/man1", ) man_path = Utils.subst_vars( os.path.join(manpage.install_path, manpage.target), bld.env) bld.symlink_as("${MANDIR}/man1/kupfer-exec.1.gz", man_path) # Separate subdirectories bld.add_subdirs(build_subdirs) def distclean(bld): bld.exec_command("find ./ -name '*.pyc' -delete") def intlupdate(util): print("You should use intltool-update directly.") print("You can read about this in Documentation/Manual.rst") print("in the localization chapter!") def test(bld): # find all files with doctests python = os.getenv("PYTHON", "python") paths = os.popen("grep -lR 'doctest.testmod()' kupfer/").read().split() os.putenv("PYTHONPATH", ".") all_success = True verbose = ("-v" in sys.argv) for p in paths: print(p) cmd = [python, p] if verbose: cmd.append("-v") sin, souterr = os.popen4(cmd) sin.close() res = souterr.read() souterr.close() print (res or "OK") all_success = all_success and bool(res) return all_success def shutdown(bld): pass ././@PaxHeader0000000000000000000000000000006400000000000011434 gustar000000000000000052 comment=8145fba6002ed44be6edee747134f2b209b03acb kupfer-v208/GIT_VERSION0000644000000000000000000000000511762200476014560 0ustar rootroot00000000000000v208