Pippy-71/000077500000000000000000000000001311421132100123715ustar00rootroot00000000000000Pippy-71/.gitignore000066400000000000000000000010161311421132100143570ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] # Distribution / packaging .Python env/ bin/ build/ develop-eggs/ dist/ eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .cache nosetests.xml coverage.xml # Translations *.mo # Mr Developer .mr.developer.cfg .project .pydevproject # Rope .ropeproject # Django stuff: *.log *.pot # Sphinx documentation docs/_build/ *~ Pippy-71/COPYING000066400000000000000000000431031311421132100134250ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. Pippy-71/LICENSE000066400000000000000000001044601311421132100134030ustar00rootroot00000000000000GNU 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. {one line to give the program's name and a brief idea of what it does.} Copyright (C) {year} {name of author} 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: {project} Copyright (C) {year} {fullname} 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 .Pippy-71/MAINTAINERS000066400000000000000000000002241311421132100140640ustar00rootroot000000000000002013-11-29: Walter Bender 2010-05-07: Anish Mangal Formerly: Brian Jordan Pippy-71/NEWS000066400000000000000000000217551311421132100131020ustar00rootroot0000000000000071 * Demote unnecessary errors (James Cameron) * Add missing msgstr in po/bg.po (James Cameron) * Update repository URL (James Cameron) * Fix version warnings from Python GI API (James Cameron) * Trim headers, synch to Pootle (Chris Leonard) * fix_erase (Icarito) * New examples (Cristian Garcia) * Clear only the canvas not the code. Fixes #44. (Icarito) * Fix AttributeError on missing 'leader' attribute (György Balló) * Add Gtk and Sugar examples (Cristian Garcia) * merge Albanian strings (Chris Leonard) * merge Yoruba strings (Chris Leonard) * honor max-participants (AbrahmAB) * Copy from Vte or text buffer (James Cameron) * Rename example load to open (James Cameron) * Load examples in new tab (James Cameron) * Typo, disutils to distutils (James Cameron) * Save as library; only if writable (James Cameron) * Load example; omit En and Es directories (James Cameron) * Pong example playability (James Cameron) * Repair Gtk tutorial examples (James Cameron) * Fix missing run, stop, clear icons (James Cameron) * Use either Vte version (James Cameron) * use latest collabwrapper.py (James Cameron) 70 * More collabwrapper fixes (James Cameron) 69 * Add missing file 68 * New translations * Fixes to notebook tabs (erilyth) 67 * Updated VTE and Box2D support; cleaned up support for ARM (Ezequiel Pereira) 66 * Cleaner implementation of workaround for old Vte version detection. 65 ENHANCEMENTS: * Add tab selection shortcuts (Vikram Ahuja) * Add category (Walter Bender) BUG FIXES: * Really old versions of VTE don't have versions (Walter Bender) * Catch deprecated method: vte.fork_command_full (Martin Abente) * Fix broken Vte.Terminal.set_colors on Fedora 21 (Martin Abente) * Code style fixes, pep8 (Vikram Ahuja) * Fix tab naming problems (Vikram Ahuja) * Ignore Ctrl-w if only one tab open (Vikram Ahuja) * Fix tab name changing problems (Sakala Venkata Krishna Rohit) * Hide close button if only one tab open, fixes #4818 (Vikram Ahuja) 64 ENHANCEMENTS: * Control for font size (svineet) * Improved tab control (goutamnair7) 63 BUG FIXES: * Update some tutorials with fixes from Jean THIERY. 62 BUG FIX: * Use local import for physics/elements module (fixed import issue on SoaS). 61 ENHANCEMENT: * More hot keys (native) BUG FIXES: * Fix indentation problem in GroupThink (icarito) * Fix scrollbar in activity template (icarito) 60 ENHANCEMENT: * Added hot keys to open and close tabs (native) 59 BUG FIX: * Fixed "output of the program is not fully displayed" (SL #4661) patch by "native " * Fixed problem with importing sample code into empty notebook 58 BUG FIX: * Fixed typo in alert callback name 57 ENHANCEMENTS: * Set tab label with file name when loading examples * Set focus on text view BUG FIX: * Sort out numerous cases regarding saving/restoring tabs/tabs content * Fixed problem with sound check in sugar-build env. 56 ENHANCEMENTS: * Don't offer up sound examples if TamTam is not installed * Improvement to search for sound resources (Gonzalo Odiard) BUG FIX: * Work around problem importing sugar3.actitity to generate bundle_path 55 ENHANCEMENTS: * Export as distutils, as library, as example (Sai Vineet) * Edit on multiple tabs (Sai Vineet) * Add custom icon selection when saving as Sugar activity (Ignacio Rodriguez) * New icons BUG FIX: * keep dialog window on top after cycling between activities 54 ENHANCEMENTS: * Add confirmation alert before loading new projects (Emil Dudev) * Use open palette instead of treeview (Ignacio Rodriguez) * Show/Hide terminal widget (Sai Vineet) * Added new examples (math/pi, math/stern-brocot) * Added i18n support for examples (Jorge Alberto Gómez López) * Added tutorials (Jorge Alberto Gómez López) BUG FIXES: * Reenable copy/paste (Ignacio Rodriguez) * Fix problems with sound library * Using elements package from Physics 53 BUG FIXES: * Replaced the comma-space with a semicolon (no space) to fix a problem with parsing mime_types that prevented Pippy from opening .py files * Fixed many issues with export Sugar activity code 50 BUG FIXES: * Replaced the comma-space with a semicolon (no space) to fix a problem with parsing mime_types that prevented Pippy from opening .py files * Fixed many issues with export Sugar activity code 43 * Fix for export button + icons (Manu Quiñones) * Fix the load of already saved examples (Gonzalo Odiard) * New translations. 42 *New translations. 41 *New Translations by aman0115, samybt, aputsiaq, khaled, cjl, Myckel, mschlager *Division by zero fix for when elapsed time is zero on fast systems, OLPC#11176 James Cameron *Regen pot, pep8 fixes, Adding save as example option, based on geirea patch on SL#1496, Better way to go to TamTamEdit, updating url_update info, removing service_name, Rafael Ortiz *Update MAINTAINERS file, Anish Mangal 40 *Fix Pippy sound library on non-OLPC OS systems (SL#638) *Run graphics (pygame) examples in full screen mode (OLPC#10688) 39 * Factorial example fix * pep8 and pylint cleanup for examples 38 * Fix svg icons for Pippy * Add EditToolbar & modify toolbars for <=0.84 compatibility (Gonzalo and Anish) * Remove the 'dobject'/groupthink submodule * Switch activity.info from class to exec 37 * Remove broken slideshow until it is fixed #2054 (James Cameron) * Adapt pippy examples to screen dimensions (except xolyimpics), dev.laptop.org #9260 (James Cameron) 36 * Add COPYING based on activity.info license field, verify source file licenses, include LICENSE from Elements upstream SVN, fixes Sugarlabs.org #1571 and laptop.org #9181. (James Cameron) * Fixed pippy layout so that it doesn't break at any resolution other than 1200x900. (Anish Mangal) * Moved the start, stop and run buttons to the activity toolbar. (Anish Mangal) 35 * Add collaborative editing with Groupthink * Fix self-generated bundles by including port/ (and now groupthink/) 34 * Editor: enable autotabbing, space tabs, and tab size = 2 (to ensure compatability with examples) 33 * Include XOlympics physics game example * Use default Sugar-specified font sizes 32 * Trac #607 (SugarLabs), Font size needs to be 10 for Soas (font size of 8 for XO-1 users) 31 * Trac #350 (SugarLabs), Python path set improperly 30 * Allow playing sounds identified by full filesystem path in pippy.sound (cscott) * Resync Pippy's "Pippy metadata" with its activity.info, etc. (cscott) * New default activity icon (Madeleine Ball) * Trac #6323: Pippy's terminal and code editor font sizes are too big (brian) * Add pippy.physics package and graphics/physics example (brian) * Allow UTF-8 in Pippy source files. (cscott) 29 * Trac #8665, cont: further fixes for bundle-building. 28 * Trac #8665: Bundle-building was broken by a Sugar API change (trac #8136) 27 * Use a protected update_url. * Updated license information in files; added 'license' field. * Reverted bundlebuilder change: using .start("Pippy") makes modern bundlebuilder complain: WARNING:root:bundle_name deprecated, now comes from activity.info 26 * Bundlebuilder API change -- use .start("Pippy") instead of .start(). 25 24 23 22 * Add check to not fail on new gtksourceview2 API (erikos) 21 * Add "tree" and "snow" from Dafydd Harries. * Give a friendly error message if the audio library isn't found. 20 * Collaboration works; you get a copy of the host's source buffer. * We look for the audio library in /home/olpc as well as /usr/share. 19 * #6475: Fix crash on launch when no telepathy connection (morgs) 18 * Updated translations for release. 17 * Attempt to fix Spanish, from Sayamindu. 16 * New "slideshow" example, by cjb. 15 * "View source" now works on both Pippy and Pippy-generated activities! (From C. Scott Ananian.) 14 * Add pippy.console.size() to get rows/cols, make "thanks" use it. 13 * Pippy can now create activity bundles of user code, using the "Keep As Bundle" icon on the toolbar! (From C. Scott Ananian.) 12 * Factor out a pippy library, which programs can use with 'import pippy'. * The pygame portion of the library uses 'best practices' to avoid eating up CPU, and pauses & suspends after 20 seconds of inactivity. (From C. Scott Ananian.) 11 * New pygame examples by Henry Holtzman! "bounce", "camera", "lines", "pong". 10 * Add "guess" example (Pilar Saenz). 9 * Changed sound library location again. Add "thanks". 8 * Changed location of sound library on filesystem, for build573+. 7 * Remove the "interpreter" banner; we don't provide the help files it mentions * Add "Stop!" button to terminate the currently running code. 6 * Add "interpreter" example, by Ivan Krstić. * 55px->45px icon, resized by Eben Eliason. 5 * Update to new Tubes API * Small example changes * Added getSoundList() which returns the list of available sounds for playWave() (Flipo) 4 * Journal integration * Sound support! Thanks to Nat/TamTam team. * New examples: Sierpinski (Madeleine Ball) Recursion (Mel Chua) Fibonacci (Rafael Ortiz) 3 * Added scrollbars, replaced hippo with gtk. 2 * First public release. Pippy-71/README.md000066400000000000000000000003521311421132100136500ustar00rootroot00000000000000Pippy ===== Pippy allows the student to examine, execute, and modify simple Python programs. In addition it is possible to write Python statements to play sounds, calculate expressions, or make simple text based interactive games. Pippy-71/activity.py000077500000000000000000000240161311421132100146050ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright (C) 2007,2008,2010 One Laptop per Child Association, Inc. # Written by C. Scott Ananian # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """Pippy activity helper classes.""" import logging from gettext import gettext as _ from gi import require_version from gi.repository import Gtk from gi.repository import Gdk from gi.repository import Pango try: require_version('Vte', '2.91') except: require_version('Vte', '2.90') from gi.repository import Vte from gi.repository import GLib from sugar3.activity import activity from sugar3.activity.widgets import ActivityToolbarButton from sugar3.activity.widgets import StopButton from sugar3.graphics.toolbarbox import ToolbarBox class ViewSourceActivity(activity.Activity): """Activity subclass which handles the 'view source' key.""" def __init__(self, handle, **kwargs): super(ViewSourceActivity, self).__init__(handle, **kwargs) self.__source_object_id = None # XXX: persist this across invocations? self.connect('key-press-event', self._key_press_cb) self._pid = None def _key_press_cb(self, widget, event): if Gdk.keyval_name(event.keyval) == 'XF86Start': self.view_source() return True return False def view_source(self): """Implement the 'view source' key by saving pippy_app.py to the datastore, and then telling the Journal to view it.""" if self.__source_object_id is None: from sugar3 import profile from sugar3.datastore import datastore from sugar3.activity.activity import (get_bundle_name, get_bundle_path) import os.path jobject = datastore.create() metadata = { 'title': _('%s Source') % get_bundle_name(), 'title_set_by_user': '1', 'suggested_filename': 'pippy_app.py', 'icon-color': profile.get_color().to_string(), 'mime_type': 'text/x-python', } for k, v in metadata.items(): jobject.metadata[k] = v # dict.update method is missing =( jobject.file_path = os.path.join(get_bundle_path(), 'pippy_app.py') datastore.write(jobject) self.__source_object_id = jobject.object_id jobject.destroy() self.journal_show_object(self.__source_object_id) def journal_show_object(self, object_id): """Invoke journal_show_object from sugar.activity.activity if it exists.""" try: from sugar3.activity.activity import show_object_in_journal show_object_in_journal(object_id) except ImportError: pass # no love from sugar. TARGET_TYPE_TEXT = 80 class VteActivity(ViewSourceActivity): """Activity subclass built around the Vte terminal widget.""" def __init__(self, handle): super(VteActivity, self).__init__(handle) self.max_participants = 1 # no sharing toolbox = ToolbarBox() activity_button_toolbar = ActivityToolbarButton(self) toolbox.toolbar.insert(activity_button_toolbar, 0) activity_button_toolbar.show() self.set_toolbar_box(toolbox) toolbox.show() self.toolbar = toolbox.toolbar ''' # add 'copy' icon from standard toolbar. edittoolbar = activity.EditToolbar() edittoolbar.copy.set_tooltip(_('Copy selected text to clipboard')) edittoolbar.copy.connect('clicked', self._on_copy_clicked_cb) edittoolbar.paste.connect('clicked', self._on_paste_clicked_cb) # as long as nothing is selected, copy needs to be insensitive. edittoolbar.copy.set_sensitive(False) toolbox.add_toolbar(_('Edit'), edittoolbar) edittoolbar.show() self._copy_button = edittoolbar.copy ''' separator = Gtk.SeparatorToolItem() separator.props.draw = False separator.set_expand(True) toolbox.toolbar.insert(separator, -1) separator.show() stop_button = StopButton(self) stop_button.props.accelerator = 'q' toolbox.toolbar.insert(stop_button, -1) stop_button.show() toolbox.toolbar.show_all() # creates vte widget self._vte = Vte.Terminal() self._vte.set_size(30, 5) self._vte.set_size_request(200, 300) font = 'Monospace 10' self._vte.set_font(Pango.FontDescription(font)) self._vte.set_colors(Gdk.color_parse('#000000'), Gdk.color_parse('#E7E7E7'), []) ''' self._vte.connect('selection-changed', self._on_selection_changed_cb) # FIXME It does not work because it expects and receives # StructMeta Gtk.TargetEntry # #self._vte.drag_dest_set(Gtk.DestDefaults.ALL, # [("text/plain", 0, TARGET_TYPE_TEXT)], # Gdk.DragAction.COPY) self._vte.connect('drag_data_received', self._on_drop_cb) ''' # ...and its scrollbar vtebox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) vtebox.pack_start(self._vte, True, True, 0) vtesb = Gtk.Scrollbar(orientation=Gtk.Orientation.VERTICAL) # vtesb.set_adjustment(self._vte.get_adjustment()) vtesb.show() vtebox.pack_start(vtesb, False, False, 0) self.set_canvas(vtebox) self.show_all() ''' # hide the buttons we don't use. toolbar.share.hide() # this should share bundle. edittoolbar.undo.hide() edittoolbar.redo.hide() edittoolbar.separator.hide() ''' # now start subprocess. self._vte.connect('child-exited', self.on_child_exit) self._vte.grab_focus() bundle_path = activity.get_bundle_path() # the 'sleep 1' works around a bug with the command dying before # the vte widget manages to snarf the last bits of its output logging.error(bundle_path) self._pid = self._vte.fork_command_full( Vte.PtyFlags.DEFAULT, bundle_path, ['/bin/sh', '-c', 'python %s/pippy_app.py; sleep 1' % bundle_path], ["PYTHONPATH=%s/library" % bundle_path], GLib.SpawnFlags.DO_NOT_REAP_CHILD, None, None,) def _on_copy_clicked_cb(self, widget): if self._vte.get_has_selection(): self._vte.copy_clipboard() def _on_paste_clicked_cb(self, widget): self._vte.paste_clipboard() def _on_selection_changed_cb(self, widget): self._copy_button.set_sensitive(self._vte.get_has_selection()) def _on_drop_cb(self, widget, context, x, y, selection, targetType, time): if targetType == TARGET_TYPE_TEXT: self._vte.feed_child(selection.data) def on_child_exit(self, widget): """This method is invoked when the user's script exits.""" pass # override in subclass class PyGameActivity(ViewSourceActivity): """Activity wrapper for a pygame.""" def __init__(self, handle): # fork pygame before we initialize the activity. import os import pygame import sys pygame.init() windowid = pygame.display.get_wm_info()['wmwindow'] self.child_pid = os.fork() if self.child_pid == 0: bp = activity.get_bundle_path() library_path = os.path.join(bp, 'library') pippy_app_path = os.path.join(bp, 'pippy_app.py') sys.path[0:0] = [library_path] g = globals() g['__name__'] = '__main__' execfile(pippy_app_path, g, g) # start pygame sys.exit(0) super(PyGameActivity, self).__init__(handle) from gi.repository import GObject from gi.repository import Gtk toolbox = activity.ActivityToolbox(self) toolbar = toolbox.get_activity_toolbar() self.set_toolbox(toolbox) toolbox.show() socket = Gtk.Socket() socket.set_flags(socket.flags() | Gtk.CAN_FOCUS) socket.show() self.set_canvas(socket) socket.add_id(windowid) self.show_all() socket.grab_focus() GObject.child_watch_add(self.child_pid, lambda pid, cond: self.close()) # hide the buttons we don't use. toolbar.share.hide() # this should share bundle. toolbar.keep.hide() def _main(): """Launch this activity from the command line.""" pass ''' from sugar3.activity import activityfactory # from sugar3.activity.registry import ActivityInfo from sugar3.bundle.activitybundle import ActivityBundle import os ab = ActivityBundle(os.path.dirname(__file__) or '.') ai = ActivityInfo(name=ab.get_name(), icon=None, bundle_id=ab.get_bundle_id(), version=ab.get_activity_version(), path=ab.get_path(), show_launcher=ab.get_show_launcher(), command=ab.get_command(), favorite=True, installation_time=ab.get_installation_time(), position_x=0, position_y=0) env = activityfactory.get_environment(ai) cmd_args = activityfactory.get_command(ai) os.execvpe(cmd_args[0], cmd_args, env) ''' if __name__ == '__main__': _main() Pippy-71/activity/000077500000000000000000000000001311421132100142255ustar00rootroot00000000000000Pippy-71/activity/activity-default.svg000066400000000000000000000045741311421132100202360ustar00rootroot00000000000000 ]> Pippy-71/activity/activity-icon.svg000066400000000000000000000025671311421132100175420ustar00rootroot00000000000000 ]> Pippy-71/activity/activity.info000066400000000000000000000007171311421132100167430ustar00rootroot00000000000000[Activity] name = Pippy bundle_id = org.laptop.Pippy exec = sugar-activity pippy_app.PippyActivity icon = activity-icon activity_version = 71 max_participants = 4 mime_types = text/x-python;pickle/groupthink-pippy show_launcher = yes license = GPLv2+ summary = Searching for programmers! Here you can use examples to begin learning the language your computer understands called "Python." category = programming repository = https://github.com/sugarlabs/Pippy.git Pippy-71/collabwrapper.py000066400000000000000000000726411311421132100156120ustar00rootroot00000000000000# Copyright (C) 2015 Walter Bender # Copyright (C) 2015 Sam Parkinson # # 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 library; if not, write to the Free Software # Foundation, 51 Franklin Street, Suite 500 Boston, MA 02110-1335 USA ''' The wrapper module provides an abstraction over the sugar collaboration system. Using CollabWrapper ------------------- 1. Implement the `get_data` and `set_data` methods in your activity class:: def get_data(self): # return plain python objects - things that can be encoded # using the json module return dict( text=self._entry.get_text() ) def set_data(self, data): # data will be the same object returned by get_data self._entry.set_text(data.get('text')) 2. Make your CollabWrapper instance:: def __init__(self, handle): sugar3.activity.activity.Activity.__init__(self, handle) self._collab = CollabWrapper(self) self._collab.connect('message', self.__message_cb) # setup your activity self._collab.setup() 3. Post any changes to the CollabWrapper. The changes will be sent to other users if any are connected:: def __entry_changed_cb(self, *args): self._collab.post(dict( action='entry_changed', new_text=self._entry.get_text() )) 4. Handle incoming messages:: def __message_cb(self, collab, buddy, message): action = msg.get('action') if action == 'entry_changed': self._entry.set_text(msg.get('new_text')) ''' import os import json import socket from gettext import gettext as _ from gi.repository import GObject from gi.repository import Gio from gi.repository import GLib import dbus from telepathy.interfaces import \ CHANNEL_INTERFACE, \ CHANNEL_INTERFACE_GROUP, \ CHANNEL_TYPE_TEXT, \ CHANNEL_TYPE_FILE_TRANSFER, \ CONN_INTERFACE_ALIASING, \ CHANNEL, \ CLIENT from telepathy.constants import \ CHANNEL_GROUP_FLAG_CHANNEL_SPECIFIC_HANDLES, \ CONNECTION_HANDLE_TYPE_CONTACT, \ CHANNEL_TEXT_MESSAGE_TYPE_NORMAL, \ SOCKET_ADDRESS_TYPE_UNIX, \ SOCKET_ACCESS_CONTROL_LOCALHOST from telepathy.client import Connection, Channel from sugar3.presence import presenceservice from sugar3.activity.activity import SCOPE_PRIVATE from sugar3.graphics.alert import NotifyAlert import logging _logger = logging.getLogger('text-channel-wrapper') ACTION_INIT_REQUEST = '!!ACTION_INIT_REQUEST' ACTION_INIT_RESPONSE = '!!ACTION_INIT_RESPONSE' ACTIVITY_FT_MIME = 'x-sugar/from-activity' class CollabWrapper(GObject.GObject): ''' The collaboration wrapper provides a high level abstraction over the collaboration system. The wrapper deals with setting up the channels, encoding and decoding messages, initialization and alerting the user to the status. When a user joins the activity, it will query the leader for the contents. The leader will return the result of the activity's `get_data` function which will be passed to the `set_data` function on the new user's computer. The `message` signal is called when a message is received from a buddy. It has 2 arguments. The first is the buddy, as a :class:`sugar3.presence.buddy.Buddy`. The second is the decoded content of the message, same as that posted by the other instance. The `joined` signal is emitted when the buddy joins a running activity. If the user shares and activity, the joined signal is not emitted. By the time this signal is emitted, the channels will be setup so all messages will flow through. The `buddy_joined` and `buddy_left` signals are emitted when another user joins or leaves the activity. They both a :class:`sugar3.presence.buddy.Buddy` as their only argument. The `incoming_file` signal is emitted when a file transfer is received from a buddy. The first argument is the object representing the transfer, as a :class:`sugar3.presence.filetransfer.IncomingFileTransfer`. The seccond argument is the description, as passed to the `send_file_*` function on the sender's client ''' message = GObject.Signal('message', arg_types=[object, object]) joined = GObject.Signal('joined') buddy_joined = GObject.Signal('buddy_joined', arg_types=[object]) buddy_left = GObject.Signal('buddy_left', arg_types=[object]) incoming_file = GObject.Signal('incoming_file', arg_types=[object, object]) def __init__(self, activity): GObject.GObject.__init__(self) self.activity = activity self.shared_activity = activity.shared_activity self._leader = False self._init_waiting = False self._text_channel = None def setup(self): ''' Setup must be called to so that the activity can join or share if appropriate. .. note:: As soon as setup is called, any signal, `get_data` or `set_data` call must be made. This means that your activity must have set up enough so these functions can work. For example, place this at the end of the activity's `__init__` function. ''' # Some glue to know if we are launching, joining, or resuming # a shared activity. if self.shared_activity: # We're joining the activity. self.activity.connect("joined", self.__joined_cb) if self.activity.get_shared(): _logger.debug('calling _joined_cb') self.__joined_cb(self) else: _logger.debug('Joining activity...') self._alert(_('Joining activity...'), _('Please wait for the connection...')) else: self._leader = True if not self.activity.metadata or self.activity.metadata.get( 'share-scope', SCOPE_PRIVATE) == \ SCOPE_PRIVATE: # We are creating a new activity instance. _logger.debug('Off-line') else: # We are sharing an old activity instance. _logger.debug('On-line') self._alert(_('Resuming shared activity...'), _('Please wait for the connection...')) self.activity.connect('shared', self.__shared_cb) def _alert(self, title, msg=None): a = NotifyAlert() a.props.title = title a.props.msg = msg self.activity.add_alert(a) a.connect('response', lambda a, r: self.activity.remove_alert(a)) a.show() def __shared_cb(self, sender): ''' Callback for when activity is shared. ''' self.shared_activity = self.activity.shared_activity self._setup_text_channel() self._listen_for_channels() _logger.debug('I am sharing...') def __joined_cb(self, sender): '''Callback for when an activity is joined.''' self.shared_activity = self.activity.shared_activity if not self.shared_activity: return self._setup_text_channel() self._listen_for_channels() self._init_waiting = True self.post({'action': ACTION_INIT_REQUEST}) _logger.debug('I joined a shared activity.') self.joined.emit() def _setup_text_channel(self): ''' Set up a text channel to use for collaboration. ''' self._text_channel = _TextChannelWrapper( self.shared_activity.telepathy_text_chan, self.shared_activity.telepathy_conn) # Tell the text channel what callback to use for incoming # text messages. self._text_channel.set_received_callback(self.__received_cb) # Tell the text channel what callbacks to use when buddies # come and go. self.shared_activity.connect('buddy-joined', self.__buddy_joined_cb) self.shared_activity.connect('buddy-left', self.__buddy_left_cb) def _listen_for_channels(self): conn = self.shared_activity.telepathy_conn conn.connect_to_signal('NewChannels', self.__new_channels_cb) def __new_channels_cb(self, channels): conn = self.shared_activity.telepathy_conn for path, props in channels: if props[CHANNEL + '.Requested']: continue # This channel was requested by me channel_type = props[CHANNEL + '.ChannelType'] if channel_type == CHANNEL_TYPE_FILE_TRANSFER: self._handle_ft_channel(conn, path, props) def _handle_ft_channel(self, conn, path, props): ft = IncomingFileTransfer(conn, path, props) if ft.description == ACTION_INIT_RESPONSE: ft.connect('notify::state', self.__notify_ft_state_cb) ft.accept_to_memory() else: desc = json.loads(ft.description) self.incoming_file.emit(ft, desc) def __notify_ft_state_cb(self, ft, pspec): if ft.props.state == FT_STATE_COMPLETED and self._init_waiting: stream = ft.props.output stream.close(None) # FIXME: The data prop seems to just be the raw pointer gbytes = stream.steal_as_bytes() data = gbytes.get_data() logging.debug('Got init data from buddy: %s', data) data = json.loads(data) self.activity.set_data(data) self._init_waiting = False def __received_cb(self, buddy, msg): '''Process a message when it is received.''' action = msg.get('action') if action == ACTION_INIT_REQUEST and self._leader: data = self.activity.get_data() data = json.dumps(data) OutgoingBlobTransfer( buddy, self.shared_activity.telepathy_conn, data, self.get_client_name(), ACTION_INIT_RESPONSE, ACTIVITY_FT_MIME) return if buddy: nick = buddy.props.nick else: nick = '???' _logger.debug('Received message from %s: %r', nick, msg) self.message.emit(buddy, msg) def send_file_memory(self, buddy, data, description): ''' Send a 1-to-1 transfer from memory to a given buddy. They will get the file transfer and description through the `incoming_transfer` signal. Args: buddy (sugar3.presence.buddy.Buddy), buddy to offer the transfer to data (str), the data to offer to the buddy via the transfer description (object), a json encodable description for the transfer. This will be given to the `incoming_transfer` signal of the transfer ''' OutgoingBlobTransfer( buddy, self.shared_activity.telepathy_conn, data, self.get_client_name(), json.dumps(description), ACTIVITY_FT_MIME) def send_file_file(self, buddy, path, description): ''' Send a 1-to-1 transfer from a file to a given buddy. They will get the file transfer and description through the `incoming_transfer` signal. Args: buddy (sugar3.presence.buddy.Buddy), buddy to offer the transfer to path (str), path of the file to send to the buddy description (object), a json encodable description for the transfer. This will be given to the `incoming_transfer` signal of the transfer ''' OutgoingFileTransfer( buddy, self.shared_activity.telepathy_conn, path, self.get_client_name(), json.dumps(description), ACTIVITY_FT_MIME) def post(self, msg): ''' Broadcast a message to the other buddies if the activity is shared. If it is not shared, the message will not be send at all. Args: msg (object): json encodable object to send to the other buddies, eg. :class:`dict` or :class:`str`. ''' if self._text_channel is not None: self._text_channel.post(msg) def __buddy_joined_cb(self, sender, buddy): '''A buddy joined.''' self.buddy_joined.emit(buddy) def __buddy_left_cb(self, sender, buddy): '''A buddy left.''' self.buddy_left.emit(buddy) def get_client_name(self): ''' Get the name of the activity's telepathy client. Returns: str, telepathy client name ''' return CLIENT + '.' + self.activity.get_bundle_id() @GObject.property def leader(self): ''' Boolean of if this client is the leader in this activity. The way the leader is decided may change, however there should only ever be 1 leader for an activity. ''' return self._leader FT_STATE_NONE = 0 FT_STATE_PENDING = 1 FT_STATE_ACCEPTED = 2 FT_STATE_OPEN = 3 FT_STATE_COMPLETED = 4 FT_STATE_CANCELLED = 5 FT_REASON_NONE = 0 FT_REASON_REQUESTED = 1 FT_REASON_LOCAL_STOPPED = 2 FT_REASON_REMOTE_STOPPED = 3 FT_REASON_LOCAL_ERROR = 4 FT_REASON_LOCAL_ERROR = 5 FT_REASON_REMOTE_ERROR = 6 class _BaseFileTransfer(GObject.GObject): ''' The base file transfer should not be used directly. It is used as a base class for the incoming and outgoing file transfers. Props: filename (str), metadata provided by the buddy file_size (str), size of the file being sent/received, in bytes description (str), metadata provided by the buddy mime_type (str), metadata provided by the buddy buddy (:class:`sugar3.presence.buddy.Buddy`), other party in the transfer reason_last_change (FT_REASON_*), reason for the last state change GObject Props: state (FT_STATE_*), current state of the transfer transferred_bytes (int), number of bytes transfered so far ''' def __init__(self): GObject.GObject.__init__(self) self._state = FT_STATE_NONE self._transferred_bytes = 0 self.channel = None self.buddy = None self.filename = None self.file_size = None self.description = None self.mime_type = None self.reason_last_change = FT_REASON_NONE def set_channel(self, channel): ''' Setup the file transfer to use a given telepathy channel. This should only be used by direct subclasses of the base file transfer. ''' self.channel = channel self.channel[CHANNEL_TYPE_FILE_TRANSFER].connect_to_signal( 'FileTransferStateChanged', self.__state_changed_cb) self.channel[CHANNEL_TYPE_FILE_TRANSFER].connect_to_signal( 'TransferredBytesChanged', self.__transferred_bytes_changed_cb) self.channel[CHANNEL_TYPE_FILE_TRANSFER].connect_to_signal( 'InitialOffsetDefined', self.__initial_offset_defined_cb) channel_properties = self.channel[dbus.PROPERTIES_IFACE] props = channel_properties.GetAll(CHANNEL_TYPE_FILE_TRANSFER) self._state = props['State'] self.filename = props['Filename'] self.file_size = props['Size'] self.description = props['Description'] self.mime_type = props['ContentType'] def __transferred_bytes_changed_cb(self, transferred_bytes): logging.debug('__transferred_bytes_changed_cb %r', transferred_bytes) self.props.transferred_bytes = transferred_bytes def _set_transferred_bytes(self, transferred_bytes): self._transferred_bytes = transferred_bytes def _get_transferred_bytes(self): return self._transferred_bytes transferred_bytes = GObject.property(type=int, default=0, getter=_get_transferred_bytes, setter=_set_transferred_bytes) def __initial_offset_defined_cb(self, offset): logging.debug('__initial_offset_defined_cb %r', offset) self.initial_offset = offset def __state_changed_cb(self, state, reason): logging.debug('__state_changed_cb %r %r', state, reason) self.reason_last_change = reason self.props.state = state def _set_state(self, state): self._state = state def _get_state(self): return self._state state = GObject.property(type=int, getter=_get_state, setter=_set_state) def cancel(self): ''' Request that telepathy close the file transfer channel Spec: http://telepathy.freedesktop.org/spec/Channel.html#Method:Close ''' self.channel[CHANNEL].Close() class IncomingFileTransfer(_BaseFileTransfer): ''' An incoming file transfer from another buddy. You need to first accept the transfer (either to memory or to a file). Then you need to listen to the state and wait until the transfer is completed. Then you can read the file that it was saved to, or access the :class:`Gio.MemoryOutputStream` from the `output` property. The `output` property is different depending on how the file was accepted. If the file was accepted to a file on the file system, it is a string representing the path to the file. If the file was accepted to memory, it is a :class:`Gio.MemoryOutputStream`. ''' def __init__(self, connection, object_path, props): _BaseFileTransfer.__init__(self) channel = Channel(connection.bus_name, object_path) self.set_channel(channel) self.connect('notify::state', self.__notify_state_cb) self._destination_path = None self._output_stream = None self._socket_address = None self._socket = None self._splicer = None def accept_to_file(self, destination_path): ''' Accept the file transfer and write it to a new file. The file must already exist. Args: destination_path (str): the path where a new file will be created and saved to ''' if os.path.exists(destination_path): raise ValueError('Destination path already exists: %r' % destination_path) self._destination_path = destination_path self._accept() def accept_to_memory(self): ''' Accept the file transfer. Once the state is FT_STATE_OPEN, a :class:`Gio.MemoryOutputStream` accessible via the output prop. ''' self._accept() def _accept(self): channel_ft = self.channel[CHANNEL_TYPE_FILE_TRANSFER] self._socket_address = channel_ft.AcceptFile( SOCKET_ADDRESS_TYPE_UNIX, SOCKET_ACCESS_CONTROL_LOCALHOST, '', 0, byte_arrays=True) def __notify_state_cb(self, file_transfer, pspec): logging.debug('__notify_state_cb %r', self.props.state) if self.props.state == FT_STATE_OPEN: # Need to hold a reference to the socket so that python doesn't # close the fd when it goes out of scope self._socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self._socket.connect(self._socket_address) input_stream = Gio.UnixInputStream.new(self._socket.fileno(), True) if self._destination_path is not None: destination_file = Gio.File.new_for_path( self._destination_path) if self.initial_offset == 0: self._output_stream = destination_file.create( Gio.FileCreateFlags.PRIVATE, None) else: self._output_stream = destination_file.append_to() else: self._output_stream = Gio.MemoryOutputStream.new_resizable() self._output_stream.splice_async( input_stream, Gio.OutputStreamSpliceFlags.CLOSE_SOURCE | Gio.OutputStreamSpliceFlags.CLOSE_TARGET, GLib.PRIORITY_LOW, None, None, None) @GObject.Property def output(self): return self._destination_path or self._output_stream class _BaseOutgoingTransfer(_BaseFileTransfer): ''' This class provides the base of an outgoing file transfer. You can override the `_get_input_stream` method to return any type of Gio input stream. This will then be used to provide the file if requested by the application. You also need to call `_create_channel` with the length of the file in bytes during your `__init__`. Args: buddy (sugar3.presence.buddy.Buddy), who to send the transfer to conn (telepathy.client.conn.Connection), telepathy connection to use to send the transfer. Eg. `shared_activity.telepathy_conn` filename (str), metadata sent to the receiver description (str), metadata sent to the receiver mime (str), metadata sent to the receiver ''' def __init__(self, buddy, conn, filename, description, mime): _BaseFileTransfer.__init__(self) self.connect('notify::state', self.__notify_state_cb) self._socket_address = None self._socket = None self._splicer = None self._conn = conn self._filename = filename self._description = description self._mime = mime self.buddy = buddy def _create_channel(self, file_size): object_path, properties_ = self._conn.CreateChannel(dbus.Dictionary({ CHANNEL + '.ChannelType': CHANNEL_TYPE_FILE_TRANSFER, CHANNEL + '.TargetHandleType': CONNECTION_HANDLE_TYPE_CONTACT, CHANNEL + '.TargetHandle': self.buddy.contact_handle, CHANNEL_TYPE_FILE_TRANSFER + '.Filename': self._filename, CHANNEL_TYPE_FILE_TRANSFER + '.Description': self._description, CHANNEL_TYPE_FILE_TRANSFER + '.Size': file_size, CHANNEL_TYPE_FILE_TRANSFER + '.ContentType': self._mime, CHANNEL_TYPE_FILE_TRANSFER + '.InitialOffset': 0}, signature='sv')) self.set_channel(Channel(self._conn.bus_name, object_path)) channel_file_transfer = self.channel[CHANNEL_TYPE_FILE_TRANSFER] self._socket_address = channel_file_transfer.ProvideFile( SOCKET_ADDRESS_TYPE_UNIX, SOCKET_ACCESS_CONTROL_LOCALHOST, '', byte_arrays=True) def _get_input_stream(self): raise NotImplementedError() def __notify_state_cb(self, file_transfer, pspec): if self.props.state == FT_STATE_OPEN: # Need to hold a reference to the socket so that python doesn't # closes the fd when it goes out of scope self._socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self._socket.connect(self._socket_address) output_stream = Gio.UnixOutputStream.new( self._socket.fileno(), True) input_stream = self._get_input_stream() output_stream.splice_async( input_stream, Gio.OutputStreamSpliceFlags.CLOSE_SOURCE | Gio.OutputStreamSpliceFlags.CLOSE_TARGET, GLib.PRIORITY_LOW, None, None, None) class OutgoingFileTransfer(_BaseOutgoingTransfer): ''' An outgoing file transfer to send from a file (on the computer's file system). Note that the `path` argument is the path for the file that will be sent, whereas the `filename` argument is only for metadata. Args: path (str), path of the file to send ''' def __init__(self, buddy, conn, path, filename, description, mime): _BaseOutgoingTransfer.__init__( self, buddy, conn, filename, description, mime) self._path = path file_size = os.stat(path).st_size self._create_channel(file_size) def _get_input_stream(self): return Gio.File.new_for_path(self._path).read(None) class OutgoingBlobTransfer(_BaseOutgoingTransfer): ''' An outgoing file transfer to send from a string in memory. Args: blob (str), data to send ''' def __init__(self, buddy, conn, blob, filename, description, mime): _BaseOutgoingTransfer.__init__( self, buddy, conn, filename, description, mime) self._blob = blob self._create_channel(len(self._blob)) def _get_input_stream(self): return Gio.MemoryInputStream.new_from_data(self._blob, None) class _TextChannelWrapper(object): '''Wrapper for a telepathy Text Channel''' def __init__(self, text_chan, conn): '''Connect to the text channel''' self._activity_cb = None self._activity_close_cb = None self._text_chan = text_chan self._conn = conn self._signal_matches = [] m = self._text_chan[CHANNEL_INTERFACE].connect_to_signal( 'Closed', self._closed_cb) self._signal_matches.append(m) def post(self, msg): if msg is not None: _logger.debug('post') self._send(json.dumps(msg)) def _send(self, text): '''Send text over the Telepathy text channel.''' _logger.debug('sending %s' % text) if self._text_chan is not None: self._text_chan[CHANNEL_TYPE_TEXT].Send( CHANNEL_TEXT_MESSAGE_TYPE_NORMAL, text) def close(self): '''Close the text channel.''' _logger.debug('Closing text channel') try: self._text_chan[CHANNEL_INTERFACE].Close() except Exception: _logger.debug('Channel disappeared!') self._closed_cb() def _closed_cb(self): '''Clean up text channel.''' for match in self._signal_matches: match.remove() self._signal_matches = [] self._text_chan = None if self._activity_close_cb is not None: self._activity_close_cb() def set_received_callback(self, callback): '''Connect the function callback to the signal. callback -- callback function taking buddy and text args ''' if self._text_chan is None: return self._activity_cb = callback m = self._text_chan[CHANNEL_TYPE_TEXT].connect_to_signal( 'Received', self._received_cb) self._signal_matches.append(m) def handle_pending_messages(self): '''Get pending messages and show them as received.''' for identity, timestamp, sender, type_, flags, text in \ self._text_chan[ CHANNEL_TYPE_TEXT].ListPendingMessages(False): self._received_cb(identity, timestamp, sender, type_, flags, text) def _received_cb(self, identity, timestamp, sender, type_, flags, text): '''Handle received text from the text channel. Converts sender to a Buddy. Calls self._activity_cb which is a callback to the activity. ''' _logger.debug('received_cb %r %s' % (type_, text)) if type_ != 0: # Exclude any auxiliary messages return msg = json.loads(text) if self._activity_cb: try: self._text_chan[CHANNEL_INTERFACE_GROUP] except Exception: # One to one XMPP chat nick = self._conn[ CONN_INTERFACE_ALIASING].RequestAliases([sender])[0] buddy = {'nick': nick, 'color': '#000000,#808080'} _logger.debug('exception: recieved from sender %r buddy %r' % (sender, buddy)) else: # XXX: cache these buddy = self._get_buddy(sender) _logger.debug('Else: recieved from sender %r buddy %r' % (sender, buddy)) self._activity_cb(buddy, msg) self._text_chan[ CHANNEL_TYPE_TEXT].AcknowledgePendingMessages([identity]) else: _logger.debug('Throwing received message on the floor' ' since there is no callback connected. See' ' set_received_callback') def set_closed_callback(self, callback): '''Connect a callback for when the text channel is closed. callback -- callback function taking no args ''' _logger.debug('set closed callback') self._activity_close_cb = callback def _get_buddy(self, cs_handle): '''Get a Buddy from a (possibly channel-specific) handle.''' # XXX This will be made redundant once Presence Service # provides buddy resolution # Get the Presence Service pservice = presenceservice.get_instance() # Get the Telepathy Connection tp_name, tp_path = pservice.get_preferred_connection() conn = Connection(tp_name, tp_path) group = self._text_chan[CHANNEL_INTERFACE_GROUP] my_csh = group.GetSelfHandle() if my_csh == cs_handle: handle = conn.GetSelfHandle() elif (group.GetGroupFlags() & CHANNEL_GROUP_FLAG_CHANNEL_SPECIFIC_HANDLES): handle = group.GetHandleOwners([cs_handle])[0] else: handle = cs_handle # XXX: deal with failure to get the handle owner assert handle != 0 return pservice.get_buddy_by_telepathy_handle( tp_name, tp_path, handle) Pippy-71/data/000077500000000000000000000000001311421132100133025ustar00rootroot00000000000000Pippy-71/data/en/000077500000000000000000000000001311421132100137045ustar00rootroot00000000000000Pippy-71/data/en/graphics/000077500000000000000000000000001311421132100155045ustar00rootroot00000000000000Pippy-71/data/en/graphics/bounce000066400000000000000000000040401311421132100167000ustar00rootroot00000000000000# bounce: move some text around the screen import pippy import pygame import sys from pygame.locals import * # the text to bounce around the screen msg = 'Hello!' # the size of the text, in pixels fsize = 36 # vector for motion, will control speed and angle mvect = [3, 2] # always need to init first thing pygame.init() # turn off cursor pygame.mouse.set_visible(False) # create the window and keep track of the surface # for drawing into screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) # ask for screen's width and height size = width, height = screen.get_size() # create a Font object from a file, or use the default # font if the file name is None. size param is height # in pixels # usage: pygame.font.Font(filename|object, size) font = pygame.font.Font(None, fsize) # Font.render draws text onto a new surface. # # usage: Font.render(text, antialias, color, bg=None) text = font.render(msg, True, (10, 10, 10)) # the Rect object is used for positioning textRect = text.get_rect() # start at the top left textRect.left = 0 textRect.top = 0 while pippy.pygame.next_frame(): # every time we move the text, check for quit or keydown events and exit for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == KEYDOWN: sys.exit() # fill the screen with almost white screen.fill((250, 250, 250)) # draw the text screen.blit(text, textRect) # update the display pygame.display.flip() # move the text # # Rect.move returns a new Rect while # Rect.move_ip moves in place, so we'll use # the latter textRect.move_ip(mvect) # bounce off edges if textRect.left < 0: textRect.left = 0 mvect[0] = -1 * mvect[0] elif textRect.right >= size[0]: textRect.right = size[0] - 1 mvect[0] = -1 * mvect[0] if textRect.top < 0: textRect.top = 0 mvect[1] = -1 * mvect[1] elif textRect.bottom >= size[1]: textRect.bottom = size[1] - 1 mvect[1] = -1 * mvect[1] Pippy-71/data/en/graphics/camera000066400000000000000000000032631311421132100166630ustar00rootroot00000000000000# camera: take a picture, animate it on screen import gst import pippy import pygame import sys import time # grey background bgcolor = (128, 128, 128) # start using pygame pygame.init() # turn off cursor pygame.mouse.set_visible(False) # create the pygame window and return a Surface object for # drawing in that window. screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) # grab a frame from camera to file pipeline = gst.parse_launch('v4l2src ! ffmpegcolorspace ! jpegenc ! filesink location=/tmp/pippypic.jpg') pipeline.set_state(gst.STATE_PLAYING) # keep trying to load in the grabbed camera frame until it works while True: try: image = pygame.image.load('/tmp/pippypic.jpg') break except pygame.error: time.sleep(1) # stop the camera frame grabbing pipeline.set_state(gst.STATE_NULL) # set initial rotation angle and scale angle = 0.0 scale = 2.0 while pippy.pygame.next_frame(): # every time we animate, check for quit or keydown events and exit for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: sys.exit() # rotate and scale the image newImage = pygame.transform.rotozoom(image, angle, scale) newImageRect = newImage.get_rect() newImageRect.centerx = screen.get_rect().centerx newImageRect.centery = screen.get_rect().centery # display the rotated and scaled image screen.fill(bgcolor) screen.blit(newImage, newImageRect) pygame.display.flip() # choose a new rotation angle and scale angle = angle + 5.0 scale = scale * 0.95 # finish once the scale becomes very very small if scale < 0.001: break Pippy-71/data/en/graphics/jump000066400000000000000000000010321311421132100163760ustar00rootroot00000000000000import pippy for i in xrange(0, 50): pippy.console.clear() if i < 25: pippy.console.red() else: pippy.console.blue() # Note that we have to escape backslashes print '\\o/' print '_|_' print ' ' pippy.wait() pippy.console.clear() print '_o_' print ' | ' print '/ \\' pippy.wait() pippy.console.clear() print ' o ' print '/|\\' print '| |' pippy.wait() pippy.console.clear() print '_o_' print ' | ' print '/ \\' pippy.wait() Pippy-71/data/en/graphics/life000066400000000000000000000077361311421132100163630ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This is the game life http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life import os import time import random def LoadCells(rows, cols): """ We need a function to load cells in the neighborhood """ grid = [] col = [0] * cols # first we load an empty grid for i in range(rows): col = [0] * cols grid.append(col) # then we load some cells for x in range(rows): for y in range(cols): cell = random.randint(0, random.randint(0, 1)) grid[x][y] = cell return grid def DrawGrid(grid): """ Here we draw the grid """ """ Test: Print the number of neighbors of living cells """ rows = len(grid) cols = len(grid[1]) # print rows, cols for x in range(rows): for y in range(cols): if grid[x][y] != 1: print '.', else: neighbors = CountNeighbors(grid, x, y) print chr(neighbors+48), # print 'o', print '\n', def CountNeighbors(grid, x, y): """ Count neighbors arround a single cell""" neighbors = 0 rows = len(grid) cols = len(grid[1]) # if x < (rows - 1) and grid[x + 1][y] == 1: # neighbors += 1 # if x > 0 and grid[x - 1][y] == 1: # neighbors += 1 # if y < (cols - 1) and grid[x][y + 1] == 1: # neighbors += 1 # if y > 0 and grid[x][y - 1] == 1: # neighbors += 1 # if x < (rows - 1) and y < (cols - 1) and grid[x + 1][y + 1] == 1: # neighbors += 1 # if x > 0 and y > 0 and grid[x - 1][y - 1] == 1: # neighbors += 1 # if x > 0 and y < (cols - 1) and grid[x - 1][y + 1] == 1: # neighbors += 1 # if x < (rows - 1) and y > 0 and grid[x + 1][y - 1] == 1: # neighbors += 1 neighbors += grid[(x+rows-1) % rows][(y+cols-1) % cols] neighbors += grid[(x+rows-1) % rows][ y ] neighbors += grid[(x+rows-1) % rows][(y +1) % cols] neighbors += grid[ x ][(y+cols-1) % cols] # neighbors += grid[ x ][ y ] neighbors += grid[ x ][(y +1) % cols] neighbors += grid[(x +1) % rows][(y+cols-1) % cols] neighbors += grid[(x +1) % rows][ y ] neighbors += grid[(x +1) % rows][(y +1) % cols] return neighbors def Iteration(grid): """ here we define a single iteration : # if we have between 3 and 6 neighbors the single cell lives # in other case the cell dies If a living cell has 2 or 3 neighbors, it survives in other cases it dies. A dead cell with 3 neighbors will become alive. """ rows = len(grid) cols = len(grid[1]) # grid0 = grid # Save the original grid for proper counts grid0 = [] col = [0] * cols # First we load an empty grid for x in range(rows): col = [0] * cols grid0.append(col) for x in range(rows): for y in range(cols): cell = grid[x][y] grid0[x][y] = cell # neighbors = 0 for x in range(rows): for y in range(cols): neighbors = CountNeighbors(grid0, x, y) if grid0[x][y] == 1: if neighbors < 2 or neighbors > 3: grid[x][y] = 0 else: if neighbors == 3: grid[x][y] = 1 return grid def Iterator(rows, cols, pulses): """ Iterate n pulses and draws the result of each one """ pulse = 1 grid = LoadCells(rows, cols) while pulse <= pulses: # os.system('clear') print 'Pulse: ', pulse # Iteration(grid) grid = Iteration(grid) DrawGrid(grid) pulse += 1 time.sleep(0.2) number = input('Please input the number of rows and cols (unique number):') pulses = input('Please input the number of pulses:') Iterator(number, 4*number, pulses) Pippy-71/data/en/graphics/lines000066400000000000000000000055701311421132100165500ustar00rootroot00000000000000# lines: make lots of lines on the screen # pep8-ignore: E501 import pippy import pygame import sys from pygame.locals import * from random import * # always need to init first thing pygame.init() # turn off the cursor pygame.mouse.set_visible(False) # create the window and keep track of the surface # for drawing into screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) # ask for screen's width and height size = width, height = screen.get_size() # start the screen all black screen.fill((0, 0, 0)) # we need starting endpoints for the line and seed motion vectors start = [randint(0, size[0]), randint(0, size[1])] end = [randint(0, size[0]), randint(0, size[1])] # randomize the motion, 1..3 in each direction, positive or negative, but # never 0 mvect_start = [choice((-1, 1)) * randint(1, 3), choice((-1, 1)) * randint(1, 3)] mvect_end = [choice((-1, 1)) * randint(1, 3), choice((-1, 1)) * randint(1, 3)] # start with a random color and color direction color = [randint(0, 255), randint(0, 255), randint(0, 255)] direction = [choice((-1, 1)), choice((-1, 1)), choice((-1, 1))] while pippy.pygame.next_frame(): for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == KEYDOWN: sys.exit() # draw the line using the current values and width=3 pygame.draw.line(screen, color, start, end, 3) # update the display pygame.display.flip() # update the end points and the color for i in range(2): start[i] = start[i] + mvect_start[i] end[i] = end[i] + mvect_end[i] for i in range(3): color[i] = color[i] + direction[i] # check if anything has gone out of range and # if so, bring back to edge and reverse the # corresponding motion vector if start[0] < 0: start[0] = 0 mvect_start[0] = (-1) * mvect_start[0] elif start[0] >= size[0]: start[0] = size[0] - 1 mvect_start[0] = (-1) * mvect_start[0] if start[1] < 0: start[1] = 0 mvect_start[1] = (-1) * mvect_start[1] elif start[1] >= size[1]: start[1] = size[1] - 1 mvect_start[1] = (-1) * mvect_start[1] if end[0] < 0: end[0] = 0 mvect_end[0] = (-1) * mvect_end[0] elif end[0] >= size[0]: end[0] = size[0] - 1 mvect_end[0] = (-1) * mvect_end[0] if end[1] < 0: end[1] = 0 mvect_end[1] = (-1) * mvect_end[1] elif end[1] >= size[1]: end[1] = size[1] - 1 mvect_end[1] = (-1) * mvect_end[1] for i in range(3): if color[i] < 0: color[i] = 0 direction[i] = direction[i] * (-1) elif color[i] >= 255: color[i] = 255 direction[i] = direction[i] * (-1) # randomly change the color directon on occasion if randint(0, 511) == 128: for i in range(3): direction[i] = choice((-1, 1)) Pippy-71/data/en/graphics/physics000066400000000000000000000030301311421132100171050ustar00rootroot00000000000000# physics import pippy import pygame import sys import math from pygame.locals import * from pippy import physics # initialize pygame first thing pygame.init() screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) # set up the physics world (instance of Elements) world = physics.Elements(screen.get_size()) world.renderer.set_surface(screen) # set up initial physics objects world.add.ground() world.add.ball((600, 0), 50) world.add.rect((500, 0), 25, 300, dynamic=True, density=1.0, restitution=0.16, friction=0.5) # add 20 more balls balls = 0 while(balls < 20): world.add.ball(((balls * 5) + 200, balls * 5), 50) balls += 1 # begin physics simulation world.run_physics = True while pippy.pygame.next_frame() and world.run_physics: for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == KEYDOWN: sys.exit() elif event.type == MOUSEBUTTONDOWN and event.button == 1: bodylist = world.get_bodies_at_pos(event.pos, include_static=False) if bodylist and len(bodylist) > 0: world.add.mouseJoint(bodylist[0], event.pos) elif event.type == MOUSEBUTTONUP and event.button == 1: world.add.remove_mouseJoint() elif event.type == MOUSEMOTION and event.buttons[0]: world.mouse_move(event.pos) # clear display with a color screen.fill((80, 160, 240)) # update & draw physics world world.update() world.draw() # update the display pygame.display.flip() Pippy-71/data/en/graphics/pong000066400000000000000000000120671311421132100164000ustar00rootroot00000000000000# pong: hit the ball with the paddle # # use the escape key to exit # # on the XO, the escape key is the top lefthand key, # circle with an x in it. import pippy import pygame import sys from pygame.locals import * from random import * # always need to init first thing pygame.init() # create the window and keep track of the surface # for drawing into screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) # ask for screen's width and height size = width, height = screen.get_size() # turn off the cursor pygame.mouse.set_visible(False) # start the screen all black bgcolor = (0, 0, 0) screen.fill(bgcolor) # paddle constants paddle_width = 20 paddle_length = 100 paddle_radius = paddle_length / 2 paddle_color = (250, 250, 250) # ball constants ball_color = (250, 250, 250) ball_radius = 25 # game constants fsize = 48 msg = "Press 'g' to start game" font = pygame.font.Font(None, fsize) text = font.render(msg, True, (250, 250, 250)) textRect = text.get_rect() textRect.centerx = screen.get_rect().centerx textRect.centery = screen.get_rect().centery while pippy.pygame.next_frame(): # display msg screen.fill(bgcolor) screen.blit(text, textRect) pygame.display.flip() # chill until a key is pressed for idle_event in pygame.event.get(): if idle_event.type == QUIT: sys.exit() if idle_event.type == KEYDOWN: if idle_event.key == K_ESCAPE: sys.exit() if idle_event.key == 103: # g key # play a game! # start the paddle in the center paddle_location = height / 2 # number of balls to a game balls = 4 while balls > 0: ball_position = [ball_radius, ball_radius] ball_mvect = [randint(9, 12), randint(5, 12)] ball_limit = size balls = balls - 1 while ball_position[0] + ball_radius < ball_limit[0]: # in play for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == KEYDOWN: if event.key == K_ESCAPE: sys.exit() (_, paddle_location) = pygame.mouse.get_pos() # make sure the paddle is in-bounds if paddle_location - paddle_radius < 0: paddle_location = paddle_radius elif paddle_location + paddle_radius >= height: paddle_location = height - 1 - paddle_radius # clear the screen screen.fill(bgcolor) # draw the paddle on the right side of the screen pygame.draw.line(screen, paddle_color, (width - paddle_width, paddle_location - paddle_radius), (width - paddle_width, paddle_location + paddle_radius), paddle_width) # draw the ball pygame.draw.circle(screen, ball_color, ball_position, ball_radius) # draw the unused balls for i in range(balls): pygame.draw.circle(screen, ball_color, (int(round(30 + i * ball_radius * 2.4)), 30), ball_radius) # update the display pygame.display.flip() pippy.pygame.next_frame(max_fps=25) # update the ball for i in range(2): ball_position[i] = ball_position[i] + ball_mvect[i] # bounce on top and left if ball_position[i] < ball_radius: ball_position[i] = ball_radius ball_mvect[i] = -1 * ball_mvect[i] # bounce on bottom elif i == 1 \ and ball_position[i] >= ball_limit[i] - ball_radius: ball_position[i] = ball_limit[i] - ball_radius - 1 ball_mvect[i] = -1 * ball_mvect[i] elif i == 0 \ and ball_position[i] >= ball_limit[i] - ball_radius - paddle_width \ and ball_position[1] > paddle_location - paddle_radius \ and ball_position[1] < paddle_location + paddle_radius: ball_position[i] = ball_limit[i] - ball_radius - paddle_width - 1 ball_mvect[i] = (-1) * ball_mvect[i] pippy.pygame.next_frame(max_fps=5) Pippy-71/data/en/graphics/snow000066400000000000000000000031371311421132100164210ustar00rootroot00000000000000# snow import pippy import pygame import sys from pygame.locals import * from random import * # always need to init first thing pygame.init() # create the window and keep track of the surface # for drawing into screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) # ask for screen's width and height width, height = screen.get_size() # turn off the cursor pygame.mouse.set_visible(False) bg_color = (0, 0, 0) xs = [] ys = [] dxs = [] dys = [] sizes = [] nflakes = 1000 while pippy.pygame.next_frame(): # if we don't have enough flakes, add one if len(xs) < nflakes: xs.append(randint(0, width)) ys.append(0) dxs.append(randint(-2, 2)) size = expovariate(1) * 5 sizes.append(int(size)) dys.append(size * 2) # clear the screen screen.fill(bg_color) for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == KEYDOWN: if event.key == K_ESCAPE: sys.exit() for x, y, size in zip(xs, ys, sizes): c = 40 + int(float(y) / height * 215) pygame.draw.circle( screen, (c, c, c), (x, y), size) xs_ = [] ys_ = [] dxs_ = [] dys_ = [] sizes_ = [] for x, y, dx, dy, size in zip(xs, ys, dxs, dys, sizes): if 0 <= x + dx <= width and 0 <= y + dy <= height: xs_.append(x + dx) ys_.append(y + int(dy)) dxs_.append(dx) dys_.append(dy) sizes_.append(size) xs = xs_ ys = ys_ dxs = dxs_ dys = dys_ sizes = sizes_ pygame.display.flip() Pippy-71/data/en/graphics/tree000066400000000000000000000035771311421132100164020ustar00rootroot00000000000000# tree import pippy import pygame import sys from pygame.locals import * from random import * import math # always need to init first thing pygame.init() # create the window and keep track of the surface # for drawing into screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) # ask for screen's width and height width, height = screen.get_size() # turn off the cursor pygame.mouse.set_visible(False) color = (250, 250, 250) min_factor = 0.8 max_factor = 0.9 start_length = 130 min_length = 40 min_angle_delta = 0.4 max_angle_delta = 0.5 # start the screen all black bgcolor = (0, 0, 0) screen.fill(bgcolor) def draw_tree(x, y, length, angle): x2 = x + length * math.sin(angle) y2 = y - length * math.cos(angle) pygame.draw.line(screen, color, (x, y), (x2, y2)) if length > min_length: # draw left branch left_angle = angle - \ uniform(min_angle_delta, max_angle_delta) left_length = length * \ uniform(min_factor, max_factor) draw_tree(x2, y2, left_length, left_angle) # draw middle branch middle_length = length * \ uniform(min_factor, max_factor) draw_tree(x2, y2, middle_length, angle) # draw right branch right_angle = angle + \ uniform(min_angle_delta, max_angle_delta) right_length = length * \ uniform(min_factor, max_factor) draw_tree(x2, y2, right_length, right_angle) # clear the screen screen.fill(bgcolor) # draw a tree, starting at the bottom centre of the # screen draw_tree((width / 2), height - 20, start_length, 0) pygame.display.flip() # do nothing visible until the escape key is pressed while pippy.pygame.next_frame(): for event in pygame.event.get(): if event.type == QUIT: sys.exit() if event.type == KEYDOWN: if event.key == K_ESCAPE: sys.exit() Pippy-71/data/en/math/000077500000000000000000000000001311421132100146355ustar00rootroot00000000000000Pippy-71/data/en/math/factorial000066400000000000000000000021141311421132100165220ustar00rootroot00000000000000import time def factorial_recursive(number): """ Define a factorial function in recursive flavor """ result = 1 if number > 0: result = number * factorial_recursive(number - 1) print 'factorizing: ', number, ' result: ', result return result def factorial_iterative(number): """ Define a factorial function in iterative flavor """ result = 1 for i in range(1, number + 1): result = result * i print 'factorizing: ', i, ' result: ', result return result def calculate(number, type): """ Calculate factorial using recursive and iterative methods """ start = time.time() if type == 0: type_s = 'recursive' factorial_recursive(number) else: type_s = 'iterative' factorial_iterative(number) delta = time.time() - start if delta > 0: print 'Type: ', type_s, ' in: ', 1 / delta else: print 'Type: ', type_s # ask for a number to compute the factorial of number = input('Please input a number:') print 'Calculating...' calculate(number, 0) calculate(number, 1) Pippy-71/data/en/math/fibonacci000066400000000000000000000000751311421132100164770ustar00rootroot00000000000000a, b = 0, 1 while b < 1001: print b, a, b = b, a + b Pippy-71/data/en/math/guess000066400000000000000000000006401311421132100157060ustar00rootroot00000000000000import random import pippy R = random.randrange(1, 100) print 'Guess a number between 1 and 100!' N = input('Enter a number: ') i = 1 while (N != R): if N > R: pippy.console.red() print 'Too big... try again' else: pippy.console.blue() print 'Too small.. try again' pippy.console.black() N = input('Enter a number: ') i = i + 1 print 'You got it in', i, 'tries' Pippy-71/data/en/math/pascal000066400000000000000000000006331311421132100160250ustar00rootroot00000000000000# Pascal's triangle lines = 9 vector = [1] for i in range(1, lines + 1): vector.insert(0, 0) vector.append(0) for i in range(0, lines): newvector = vector[:] for j in range(0, len(vector) - 1): if (newvector[j] == 0): print ' ', else: print '%2d' % newvector[j], newvector[j] = vector[j - 1] + vector[j + 1] print vector = newvector[:] Pippy-71/data/en/math/pi000066400000000000000000000016311311421132100151710ustar00rootroot00000000000000a,b = 1.0,3.0 breakpoint = 1000 pi = 0.0 for loop in range(1, breakpoint): pi += (4.0/a) - (4.0/b) a += 4 b += 4 print pi # Now that the result has been computed we can explore printing the result. print "There are multiple ways to print numbers here is a quick sample." print "Just print it :", pi print "Using repr() :", repr(pi) print "Our approximation: %3.20f" % pi print "\nPi is a very famous number...." # Use python's math module it is faster and close enough for most computations. import math print "Python's Math library computes" print "a better value pi: %3.39f" % math.pi; # it uses...(math.atan(1.0) * 4.0) # when running computations based on "pi" it is good to begin with the best value you can get. # from the gnu 'C' comiler /usr/include/math.h" print "For reference a more exact 32 bit floating point value for pi is." print "Known value of pi: 3.14159265358979323846" Pippy-71/data/en/math/sierpinski000066400000000000000000000010611311421132100167360ustar00rootroot00000000000000# Sierpinski triangles size = 3 modulus = 2 lines = modulus ** size vector = [1] for i in range(1, lines + 1): vector.insert(0, 0) vector.append(0) for i in range(0, lines): newvector = vector[:] for j in range(0, len(vector) - 1): if (newvector[j] == 0): print ' ', else: remainder = newvector[j] % modulus if (remainder == 0): print 'O', else: print '.', newvector[j] = vector[j - 1] + vector[j + 1] print vector = newvector[:] Pippy-71/data/en/math/stern-brocot000066400000000000000000000021231311421132100171770ustar00rootroot00000000000000# The Stern-Brocot tree contains every non-negative rational number # expressed in its lowest terms # Reference: Brian Hayes, Computing Science On the Teeth of Wheels, # American Scientist, July-August, Volume 88, No. 4, # define a class for rational numbers: # numerator / denominator class Rational: def __init__(self, num, den): self.num, self.den = num, den def __repr__(self): return str(self.num) + '/' + str(self.den) # define the mediant function # mediant (a/b, c/d) = (a+c)/(b+d) def mediant(a, b): return Rational(a.num + b.num, a.den + b.den) # expand a row by calculating mediants between each pair of elements # e.g., [0/1, 1/0] -> [0/1, 1/1, 1/0] def expand(row): x = [row[0]] for i in range(1, len(row)): x += [mediant(row[i-1], row[i])] + [row[i]] return x # initialize the first row with 0/1, 1/0 # each pass will yield an expanded row def rationals(): row = [Rational(0, 1), Rational(1, 0)] while True: yield row row = expand(row) # iterate through successive rows r = rationals() i = 1 while i<5: print r.next() i+=1 Pippy-71/data/en/math/times000066400000000000000000000001471311421132100157030ustar00rootroot00000000000000number = input('Which times table? ') for i in range(1, 13): print i, 'x', number, '=', i * number Pippy-71/data/en/python/000077500000000000000000000000001311421132100152255ustar00rootroot00000000000000Pippy-71/data/en/python/function000066400000000000000000000000641311421132100167750ustar00rootroot00000000000000def square(x): print x * x square(3) square(4) Pippy-71/data/en/python/if000066400000000000000000000002261311421132100155460ustar00rootroot00000000000000number = input('Enter a number: ') if number > 5: print 'Greater than 5' elif number < 5: print 'Less than 5' else: print 'Number is 5!' Pippy-71/data/en/python/interpreter000066400000000000000000000000721311421132100175120ustar00rootroot00000000000000import code code.InteractiveConsole().interact(banner='') Pippy-71/data/en/python/recursion000066400000000000000000000004221311421132100171570ustar00rootroot00000000000000def count_backwards(number): print 'I have the number', number if number > 0: print 'Calling count_backwards again!' count_backwards(number - 1) else: print 'I am done counting' number = input('Enter a number: ') count_backwards(number) Pippy-71/data/en/sound/000077500000000000000000000000001311421132100150345ustar00rootroot00000000000000Pippy-71/data/en/sound/getSoundList000066400000000000000000000000711311421132100174010ustar00rootroot00000000000000import pippy print " ".join(pippy.sound.getSoundList()) Pippy-71/data/en/sound/playSine000066400000000000000000000001261311421132100165420ustar00rootroot00000000000000import pippy pippy.sound.playSine(pitch=1000, amplitude=5000) pippy.sound.audioOut() Pippy-71/data/en/sound/playWave000066400000000000000000000001441311421132100165460ustar00rootroot00000000000000import pippy pippy.sound.playWave(sound='didjeridu', loop=True, duration=5) pippy.sound.audioOut() Pippy-71/data/en/sound/sequence000066400000000000000000000003601311421132100165660ustar00rootroot00000000000000import pippy import random for i in range(25): pitch = random.randint(500, 2000) amplitude = 5000 duration = 0.1 start_time = i * 0.1 pippy.sound.playSine(pitch, amplitude, duration, start_time) pippy.sound.audioOut() Pippy-71/data/en/string/000077500000000000000000000000001311421132100152125ustar00rootroot00000000000000Pippy-71/data/en/string/hello000066400000000000000000000001061311421132100162350ustar00rootroot00000000000000name = raw_input("Type your name here: ") print "Hello " + name + "!" Pippy-71/data/en/string/jeringoso000066400000000000000000000012561311421132100171400ustar00rootroot00000000000000# jeringoso is an innocent spanish way to talk used by kids, # you need to add an "p" before earch spanish vowel (a,e,i,o,u) and # the same vowel after the "p" # then you got a funny way to talk that parents will not understand. # ref: http://en.wikipedia.org/wiki/Jeringonza # first we define the spanish vowels vowels = ['a', 'e', 'i', 'o', 'u'] # then we ask for a string to make the replacements text = raw_input("Please input your text to translate to jeringoso:") length = len(text) jeringoso = "" for i in range(length): char = text[i] if char in vowels: jeringoso = jeringoso + char + "p" + char else: jeringoso = jeringoso + char print jeringoso Pippy-71/data/en/string/thanks000066400000000000000000000124761311421132100164370ustar00rootroot00000000000000table = { 'Hardware & Mechanicals': 'John Watlington, Mark Foster, Mary Lou Jepsen, Yves Behar, Bret Recor, Mitch Pergola, Martin Schnitzer, Kenneth Jewell, Kevin Young, Jacques Gagne, Nicholas Negroponte, Frank Lee, Victor Chau, Albert Hsu, HT Chen, Vance Ke, Ben Chuang, Johnson Huang, Sam Chang, Alex Chu, Roger Huang, and the rest of the Quanta team, the Marvell team, the AMD team, the ChiMei team...', 'Firmware': 'Ron Minnich, Richard Smith, Mitch Bradley, Tom Sylla, Lilian Walter, Bruce Wang, James Cameron', 'Kernel & Drivers': 'Jaya Kumar, Jon Corbet, Reynaldo Verdejo, Pierre Ossman, Dave Woodhouse, Matthew Garrett, Chris Ball, Andy Tanenbaum, Linus Torvalds, Dave Jones, Andres Salomon, Marcelo Tosatti..', 'Graphics systems': 'Jordan Crouse, Daniel Stone, Zephaniah Hull, Bernardo Innocenti, Behdad Esfahbod, Jim Gettys, Adam Jackson, RobertTheKing, William Orr, Simon Schampijer, Gary Martin', 'Programming': 'Guido Van Rossum, Johan Dahlin, Brian Silverman, Alan Kay, Kim Rose, Bert Freudenberg, Yoshiki Ohshima, Takashi Yamamiya, Scott Wallace, Ted Kaehler, Stephane Ducasse, Hilaire Fernandes, David Narveaz, Tim Moody, Martin Langhoff, Paul Fox, Tim Shepard, Martin Abente Lahaye, Sam Parkinson, James Cameron, Ignacio Rodriguez, Jerry Vonau, Sebastian Silva, Ana Balica, rcunning01 Frederick Grose, Prason Shukla, Emil Dudev, Christofer Yael, cheekujodhpur, Agustin Zubiaga, Daniel Francis', 'Sugar': 'Marco Pesenti Gritti, Dan Williams, Chris Blizzard, John Palmieri, Lisa Strausfeld, Christian Marc Schmidt, Takaaki Okada, Eben Eliason, Walter Bender, Tomeu Vizoso, Simon Schampijer, Reinier Heeres, Ben Saller, Martin Dengler, Benjamin Berg, Daniel Drake, Jameson Quinn, Miguel Alvarez...', 'Activities': 'Erik Blankinship, Bakhtiar Mikhak, Manusheel Gupta, J.M. Maurer (uwog) and the Abiword team, the Mozilla team, Jean Piche, Barry Vercoe, Richard Boulanger, Greg Thompson, Arjun Sarwal, Cody Lodrige, Shannon Sullivan, Idit Harel, and the MaMaMedia team, John Huang, Bruno Coudoin, Eduardo Silva, Hakon Wium Lie, Don Hopkins, Muriel de Souza Godoi, Benjamin M. Schwartz..', 'Network': 'Michael Bletsas, James Cameron, Javier Cardona, Ronak Chokshi, Polychronis Ypodimatopoulos, Simon McVittie, Dafydd Harries, Sjoerd Simons, Morgan Collett, Guillaume Desmottes, Robert McQueen..', 'Security': 'Ivan Krstic, Michael Stone, C. Scott Ananian, Noah Kantrowitz, Herbert Poetzl, Marcus Leech..', 'Content': 'SJ Klein, Mako Hill, Xavier Alvarez, Alfonso de la Guarda, Sayamindu Dasgupta, Mallory Chua, Lauren Klein, Zdenek Broz, Felicity Tepper, Andy Sisson, Christine Madsen, Matthew Steven Carlos, Justin Thorp, Ian Bicking, Christopher Fabian, Wayne Mackintosh, the OurStories team, Will Wright, Chuck Normann..', 'Testing': 'Kim Quirk, Alex Latham, Giannis Galanis, Ricardo Carrano, Zach Cerza, John Fuhrer, Tom Gilliard, Niraj Nakrani', 'Country Support': 'Carla Gomez Monroy, David Cavallo, Matt Keller, Khaled Hassounah, Antonio Battro, Audrey Choi, Habib Kahn, Arnan (Roger) Sipitakiat, Reuben Caron', 'Administrative Support': 'Nia Lewis, Felice Gardner, Lindsay Petrillose, Jill Clarke, Julia Reynolds, Tracy Price, David Robertson, Danny Clark', 'Finance & Legal': 'Eben Moglen, Bruce Parker, William Kolb, John Sare, Sandra Lee, Richard Bernstein, Jaclyn Tsai, Jaime Cheng, Robert Fadel, Charles Kane (Grasshopper), Kathy Paur, Andriani Ferti', 'PR and Media': 'Larry Weber, Jackie Lustig, Jodi Petrie, George Snell, Kyle Austin, Hilary Meserole, Erick A. Betancourt, Michael Borosky, Sylvain Lefebvre, Martin Le Sauteur', 'Directors & Advisors': 'Howard Anderson, Rebecca Allen, Ayo Kusamotu, Jose Maria Aznar, V. Michael Bove, Jr., Rodrigo Mesquita, Seymour Papert, Ted Selker, Ethan Beard (Google); John Roese (Nortel); Dandy Hsu (Quanta); Marcelo Claure (Brightstar); Gary Dillabough (eBay); Gustavo Arenas (AMD); Mike Evans (Red Hat); Ed Horowitz (SES Astra); Jeremy Philips (NewsCorp); Scott Soong (Chi Lin); Sehat Sutardja (Marvell); Joe Jacobson (MIT Media Lab); Steve Kaufman (Riverside); and Tom Meredith (MFI)', 'Pippy': 'Chris Ball, C. Scott Ananian, James Cameron, Anish Mangal' } import random import time from pippy.console import * from textwrap import fill # Determine the number of columns in our window in # order to wrap text to that width -- this changes # when we run as a standalone activity instead of # inside the output pane. cols, lines = size() while True: reset() print fill("OLPC would like to take this opportunity to acknowledge the community of people and projects that have made the XO laptop possible.", int(cols)) subsystem = random.choice(table.keys()) random.choice([red, green, yellow, blue, magenta, cyan])() #random.choice([normal, bold, underlined, inverse])() print '\n', fill("%s: %s" % (subsystem, table[subsystem]), int(cols)) table.pop(subsystem) if len(table) == 0: break time.sleep(3) reset() Pippy-71/data/en/tutorials/000077500000000000000000000000001311421132100157325ustar00rootroot00000000000000Pippy-71/data/en/tutorials/Tutorial_01_simple_input.py000066400000000000000000000001011311421132100231670ustar00rootroot00000000000000 name = raw_input('What is your name?\n') print 'Hi, %s.' % name Pippy-71/data/en/tutorials/Tutorial_02_while.py000066400000000000000000000004771311421132100216100ustar00rootroot00000000000000import time def while_backward_count(number): while(number > -1): print str(number) + " for the explosion!!!" time.sleep(1) number = number -1 number = input('Enter a number: ') print "Let's count backward using a while sentence!!" while_backward_count(number) print "Kaboooommm!!!, X_X" Pippy-71/data/en/tutorials/Tutorial_03_range.py000066400000000000000000000006231311421132100215660ustar00rootroot00000000000000def sum_in_range(num1, num2): total = num1 num1 = num1 + 1 num2 = num2 + 1 for i in range(num1, num2): print str(total) + " + " + str(i) + " = " + str(total+i) total = total + 1 number1 = int(input('Enter first number: ')) number2 = int(input('Enter second number: ')) if number1 < number2: sum_in_range(number1, number2) else: sum_in_range(number2, number1) Pippy-71/data/en/tutorials/Tutorial_04_list.py000066400000000000000000000003131311421132100214420ustar00rootroot00000000000000my_list = [] num = 1 while(num < 5): data = input("Please enter number " + str(num) + ":") my_list.append(int(data)) num = num + 1 print "You entered the following numbers:" print my_list Pippy-71/data/en/tutorials/Tutorial_05_dictionaries.py000066400000000000000000000004601311421132100231500ustar00rootroot00000000000000basket = { 'oranges': 12, 'pears': 5, 'apples': 4 } basket['bananas'] = 5 print basket print "There are %d various items in the basket" % len(basket) print basket['apples'] basket['apples'] = 8 print basket['apples'] print basket.get('oranges', 'undefined') print basket.get('cherries', 'undefined') Pippy-71/data/en/tutorials/Tutorial_06_try_except.py000066400000000000000000000004021311421132100226560ustar00rootroot00000000000000def is_valid_number(num): try: int(num) print "You wrote a number" except: print "Sorry but, you didn't write a number" number1 = raw_input("Give me any input and I will tell you if it's a number: ") is_valid_number(number1) Pippy-71/data/en/tutorials/Tutorial_07_gtk_basic_form.py000066400000000000000000000006061311421132100234500ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Hello World!!') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.connect('destroy', Gtk.main_quit) self.set_size_request(250, 150) self.show() PyApp() Gtk.main() Pippy-71/data/en/tutorials/Tutorial_08_gtk_button_form.py000066400000000000000000000011521311421132100237000ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Button') self.set_size_request(250, 200) self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) def button_cb(widget): print 'click' button = Gtk.Button('Button') fixed = Gtk.Fixed() fixed.put(button, 20, 30) button.connect('clicked', button_cb) self.connect('destroy', Gtk.main_quit) self.add(fixed) self.show_all() PyApp() Gtk.main() Pippy-71/data/en/tutorials/Tutorial_09_gtk_entry.py000066400000000000000000000013731311421132100225110ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import Gdk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Text Entry') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_size_request(250, 150) def entry_cb(widget, event): if Gdk.keyval_name(event.keyval) == 'Return': print widget.get_text() entry = Gtk.Entry() entry.connect('key_press_event', entry_cb) entry.show() fixed = Gtk.Fixed() fixed.show() fixed.put(entry, 20, 30) self.add(fixed) self.show() self.connect('destroy', Gtk.main_quit) PyApp() Gtk.main() Pippy-71/data/en/tutorials/Tutorial_10_gtk_grid.py000066400000000000000000000015651311421132100222700ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Grid') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) grid = Gtk.Grid() grid.set_column_homogeneous(True) grid.set_row_homogeneous(True) button = Gtk.Button('Button 1') grid.attach(button, 0, 0, 1, 1) button = Gtk.Button('Button 2') grid.attach(button, 0, 2, 1, 2) button = Gtk.Button('Button 3') grid.attach(button, 1, 1, 2, 2) button = Gtk.Button('Button 4') grid.attach(button, 2, 0, 2, 1) button = Gtk.Button('Button 5') grid.attach(button, 3, 3, 3, 3) self.add(grid) self.show_all() self.connect('destroy', Gtk.main_quit) PyApp() Gtk.main() Pippy-71/data/en/tutorials/Tutorial_11_gtk_scrolled_window.py000066400000000000000000000012151311421132100245320ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Scrolled Window') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_size_request(250, 150) scrolled = Gtk.ScrolledWindow() vbox = Gtk.VBox() scrolled.add(vbox) for x in range(1, 16): boton = Gtk.Button('Button %d' % x) vbox.pack_start(boton, False, False, 1) self.add(scrolled) self.show_all() self.connect('destroy', Gtk.main_quit) PyApp() Gtk.main() Pippy-71/data/en/tutorials/Tutorial_12_text_view.py000066400000000000000000000021261311421132100225100ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Text view') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_size_request(250, 150) scrolled = Gtk.ScrolledWindow() textview = Gtk.TextView() scrolled.add(textview) textbuffer = textview.get_buffer() textbuffer.set_text('Multiple lines\nin the same editor\n') end = textbuffer.get_end_iter() anchor = textbuffer.create_child_anchor(end) box = Gtk.HBox() textview.add_child_at_anchor(box, anchor) button = Gtk.Button('Click me') button.connect('clicked', self._clicked_cb, textbuffer) box.pack_start(button, False, False, 0) self.add(scrolled) self.show_all() self.connect('destroy', Gtk.main_quit) def _clicked_cb(self, button, textbuffer): end = textbuffer.get_end_iter() textbuffer.insert(end, 'You clicked the button!!\n') PyApp() Gtk.main() Pippy-71/data/en/tutorials/Tutorial_13_gtk_radio_buttons.py000066400000000000000000000021201311421132100242060ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Radio buttons') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_size_request(250, 150) vbox = Gtk.VBox() button1 = Gtk.RadioButton(group=None, label='Button 1') button1.connect('toggled', self._activate_cb, 1) vbox.pack_start(button1, True, True, 2) button2 = Gtk.RadioButton(group=button1, label='Button 2') button2.connect('toggled', self._activate_cb, 2) vbox.pack_start(button2, True, True, 2) button3 = Gtk.RadioButton(group=button1, label='Button 3') button3.connect('toggled', self._activate_cb, 3) vbox.pack_start(button3, True, True, 2) self.add(vbox) self.show_all() self.connect('destroy', Gtk.main_quit) def _activate_cb(self, button, button_index): if button.get_active(): print 'You selected %d button' % button_index PyApp() Gtk.main() Pippy-71/data/en/tutorials/Tutorial_14_menu.py000066400000000000000000000136571311421132100214530ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Menu') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_size_request(250, 150) accel_group = Gtk.AccelGroup() self.add_accel_group(accel_group) vbox = Gtk.VBox() menubar = Gtk.MenuBar() vbox.pack_start(menubar, False, False, 0) self.label = Gtk.Label('Activate a menu item') vbox.pack_start(self.label, True, True, 0) menu_file = Gtk.Menu() item_file = Gtk.MenuItem.new_with_mnemonic('_File') item_file.set_submenu(menu_file) menubar.append(item_file) item_new = Gtk.MenuItem.new_with_mnemonic('_New') key, mod = Gtk.accelerator_parse('N') item_new.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_new.connect('activate', self._activate_cb, 'New') menu_file.append(item_new) item_open = Gtk.MenuItem.new_with_mnemonic('_Open') key, mod = Gtk.accelerator_parse('O') item_open.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_open.connect('activate', self._activate_cb, 'Open') menu_file.append(item_open) menu_recents = Gtk.Menu() item_recents = Gtk.MenuItem.new_with_mnemonic('Open _recents') item_recents.set_submenu(menu_recents) menu_file.append(item_recents) for recent_file in range(1, 6): item_recent = Gtk.MenuItem.new_with_mnemonic('_%d: Recent file %d' % (recent_file, recent_file)) item_recent.connect('activate', self._activate_cb, 'Recent file %d' % recent_file) menu_recents.append(item_recent) separator = Gtk.SeparatorMenuItem() menu_file.append(separator) item_exit = Gtk.MenuItem.new_with_mnemonic('_Quit') key, mod = Gtk.accelerator_parse('Q') item_exit.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_exit.connect('activate', self._activate_cb, 'Quit') menu_file.append(item_exit) menu_edit = Gtk.Menu() item_edit = Gtk.MenuItem.new_with_mnemonic('_Edit') item_edit.set_submenu(menu_edit) menubar.append(item_edit) item_undo = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_UNDO, None) key, mod = Gtk.accelerator_parse('Z') item_undo.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_undo.connect('activate', self._activate_cb, 'Undo') menu_edit.append(item_undo) item_redo = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_REDO, None) key, mod = Gtk.accelerator_parse('Z') item_redo.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_redo.connect('activate', self._activate_cb, 'Redo') menu_edit.append(item_redo) separator = Gtk.SeparatorMenuItem() menu_edit.append(separator) item_copy = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_COPY, None) key, mod = Gtk.accelerator_parse('C') item_copy.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_copy.connect('activate', self._activate_cb, 'Copy') menu_edit.append(item_copy) item_cut = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_CUT, None) key, mod = Gtk.accelerator_parse('X') item_cut.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_cut.connect('activate', self._activate_cb, 'Cut') menu_edit.append(item_cut) item_paste = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_PASTE, None) key, mod = Gtk.accelerator_parse('V') item_paste.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_paste.connect('activate', self._activate_cb, 'Paste') menu_edit.append(item_paste) separator = Gtk.SeparatorMenuItem() menu_edit.append(separator) label = 'Vertical page' item_vertical = Gtk.RadioMenuItem(label) item_vertical.set_active(True) item_vertical.connect('toggled', self._toggled_cb, label) menu_edit.append(item_vertical) label = 'Horizontal page' item_horizontal = Gtk.RadioMenuItem.new_with_label((item_vertical,), label) item_horizontal.connect('toggled', self._toggled_cb, label) menu_edit.append(item_horizontal) menu_view = Gtk.Menu() item_view = Gtk.MenuItem.new_with_mnemonic('_View') item_view.set_submenu(menu_view) menubar.append(item_view) item_hides = Gtk.CheckMenuItem.new_with_mnemonic('_Hidden files') key, mod = Gtk.accelerator_parse('H') item_hides.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_hides.connect('toggled', self._toggled_cb, 'Hidden files', True) menu_view.append(item_hides) menu_help = Gtk.Menu() item_help = Gtk.MenuItem('Ayuda') item_help.set_submenu(menu_help) menubar.append(item_help) item_about = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_ABOUT, None) item_about.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_about.connect('activate', self._activate_cb, 'About') menu_help.append(item_about) self.add(vbox) self.show_all() self.connect('destroy', Gtk.main_quit) def _activate_cb(self, item, label): self.label.set_text('You activated %s item' % label) def _toggled_cb(self, item, label, no_active=False): if item.get_active(): self.label.set_text('You activated %s item' % label) elif not item.get_active() and no_active: self.label.set_text('You deactivate %s item' % label) PyApp() Gtk.main() Pippy-71/data/en/tutorials/Tutorial_15_gtk_progress_bar.py000066400000000000000000000024721311421132100240360ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import GObject class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Barras de progreso') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_border_width(20) self.fraction = 0 grid = Gtk.Grid() grid.set_row_spacing(10) self.bar1 = Gtk.ProgressBar() self.bar1.set_hexpand(True) self.bar1.set_vexpand(True) grid.attach(self.bar1, 1, 0, 3, 1) label = Gtk.Label("Una barra de progreso simple") label.set_hexpand(True) grid.attach(label, 1, 1, 1, 1) self.bar2 = Gtk.ProgressBar() self.bar2.set_hexpand(True) self.bar2.set_vexpand(True) grid.attach(self.bar2, 1, 2, 3, 1) label = Gtk.Label("Una barra de progreso con pulsos") grid.attach(label, 1, 3, 1, 1) GObject.timeout_add(200, self._update) self.add(grid) self.show_all() self.connect('destroy', Gtk.main_quit) def _update(self): self.fraction += 0.01 if self.fraction >= 1: self.fraction = 0 self.bar1.set_fraction(self.fraction) self.bar2.pulse() return True PyApp() Gtk.main() Pippy-71/data/en/tutorials/Tutorial_16_sugar_palettes.py000066400000000000000000000053651311421132100235300ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from sugar3.graphics.toolbarbox import ToolbarBox from sugar3.graphics.toolbutton import ToolButton from sugar3.graphics.palettemenu import PaletteMenuBox from sugar3.graphics.palettemenu import PaletteMenuItem from sugar3.graphics.colorbutton import ColorToolButton class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Palettes') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) vbox = Gtk.VBox() toolbarbox = ToolbarBox() vbox.add(toolbarbox) toolbar = toolbarbox.toolbar color_button = ColorToolButton() toolbar.insert(color_button, -1) button = ToolButton('list-add') button.set_tooltip('Palette with widgets') toolbar.insert(button, -1) palette = button.get_palette() palette_box = Gtk.VBox() palette.set_content(palette_box) checkbutton1 = Gtk.CheckButton('Option 1') palette_box.pack_start(checkbutton1, False, False, 0) checkbutton2 = Gtk.CheckButton('Option 2') palette_box.pack_start(checkbutton2, False, False, 0) checkbutton3 = Gtk.CheckButton('Option 3') palette_box.pack_start(checkbutton3, False, False, 0) separator = Gtk.VSeparator() palette_box.pack_start(separator, False, False, 0) radio_button1 = Gtk.RadioButton('Option 1') palette_box.pack_start(radio_button1, False, False, 0) radio_button2 = Gtk.RadioButton('Option 2', group=radio_button1) palette_box.pack_start(radio_button2, False, False, 0) radio_button3 = Gtk.RadioButton('Option 3', group=radio_button1) palette_box.pack_start(radio_button3, False, False, 0) palette_box.show_all() button = ToolButton(icon_name='format-justify-fill') button.props.tooltip = 'Select list' button.props.hide_tooltip_on_click = False button.palette_invoker.props.toggle_palette = True toolbar.insert(button, -1) menu_box = PaletteMenuBox() button.props.palette.set_content(menu_box) menu_box.show() menu_item = PaletteMenuItem('Item 1', icon_name='format-justify-fill') menu_box.append_item(menu_item) menu_item = PaletteMenuItem('Item 1', icon_name='format-justify-center') menu_box.append_item(menu_item) menu_item = PaletteMenuItem('Item 1', icon_name='format-justify-left') menu_box.append_item(menu_item) menu_item = PaletteMenuItem('Item 1', icon_name='format-justify-right') menu_box.append_item(menu_item) self.add(vbox) self.show_all() self.connect('destroy', Gtk.main_quit) PyApp() Gtk.main() Pippy-71/data/es/000077500000000000000000000000001311421132100137115ustar00rootroot00000000000000Pippy-71/data/es/tutorials/000077500000000000000000000000001311421132100157375ustar00rootroot00000000000000Pippy-71/data/es/tutorials/Tutorial_01_entrada_simple.py000066400000000000000000000001321311421132100234570ustar00rootroot00000000000000# -*- coding: utf-8 -*- name = raw_input('¿Cual es tu nombre?\n') print 'Hi, %s.' % name Pippy-71/data/es/tutorials/Tutorial_02_while.py000066400000000000000000000005271311421132100216110ustar00rootroot00000000000000# -*- coding: utf-8 import time def while_cuenta_regresiva(numero): while(numero > -1): print str(numero) + ' para la explosion!!!' time.sleep(1) numero = numero -1 numero = input('Escribe un numero: ') print 'Cuenta regresiva usando sentencia while!!' while_cuenta_regresiva(numero) print 'Kaboooommm!!!, X_X' Pippy-71/data/es/tutorials/Tutorial_03_rango.py000066400000000000000000000006341311421132100216070ustar00rootroot00000000000000def suma_en_rango(num1, num2): total = num1 num1 = num1 + 1 num2 = num2 + 1 for i in range(num1, num2): print str(total) + " + " + str(i) + " = " + str(total+i) total = total + 1 numero1 = int(input('Escribe primer numero: ')) numero2 = int(input('Escribe segundo numero: ')) if numero1 > numero2: suma_en_rango(numero1, numero2) else: suma_en_rango(numero2, numero1) Pippy-71/data/es/tutorials/Tutorial_04_lista.py000066400000000000000000000003301311421132100216070ustar00rootroot00000000000000mi_lista = [] num = 1 while(num < 5): data = input("Porfavor escriba el numero " + str(num) + ":") mi_lista.append(int(data)) num = num + 1 print "Tu escribiste los siguientes numeros:" print mi_lista Pippy-71/data/es/tutorials/Tutorial_05_diccionarios.py000066400000000000000000000004751311421132100231540ustar00rootroot00000000000000canasta = { 'naranjas': 12, 'peras': 5, 'manzanas': 4 } canasta['bananas'] = 5 print canasta print "Hay %d tipos de fruta en la canasta" % len(canasta) print canasta['manzanas'] canasta['manzanas'] = 8 print canasta['manzanas'] print canasta.get('naranjas', 'undefined') print canasta.get('cerezas', 'undefined') Pippy-71/data/es/tutorials/Tutorial_06_try_except.py000066400000000000000000000003511311421132100226660ustar00rootroot00000000000000def es_numero_valido(num): try: int(num) print "Escribio un numero" except: print "Lo siento, no escribiste un numero" number1 = input("Escriba y le dire si es un numero: ") es_numero_valido(number1) Pippy-71/data/es/tutorials/Tutorial_07_gtk_ventana_basica.py000066400000000000000000000006071311421132100243100ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title("Hola mundo!!") self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_size_request(250, 150) self.connect("destroy", Gtk.main_quit) self.show() PyApp() Gtk.main() Pippy-71/data/es/tutorials/Tutorial_08_gtk_ventana_boton.py000066400000000000000000000011471311421132100242100ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title("Boton") self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_size_request(250, 200) def button_cb(widget): print 'click' button = Gtk.Button("Boton") fixed = Gtk.Fixed() fixed.put(button, 20, 30) button.connect('clicked', button_cb) self.connect("destroy", Gtk.main_quit) self.add(fixed) self.show_all() PyApp() Gtk.main() Pippy-71/data/es/tutorials/Tutorial_09_gtk_caja_de_texto.py000066400000000000000000000014011311421132100241360ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import Gdk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Entrada de Texto') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_size_request(250, 150) def entry_cb(widget, event): if Gdk.keyval_name(event.keyval) == 'Return': print widget.get_text() entry = Gtk.Entry() entry.connect('key_press_event', entry_cb) entry.show() fixed = Gtk.Fixed() fixed.put(entry, 20, 30) fixed.show() self.add(fixed) self.show() self.connect('destroy', Gtk.main_quit) PyApp() Gtk.main() Pippy-71/data/es/tutorials/Tutorial_10_gtk_cuadricula.py000066400000000000000000000015661311421132100234650ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Cuadricula') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) grid = Gtk.Grid() grid.set_column_homogeneous(True) grid.set_row_homogeneous(True) button = Gtk.Button('Boton 1') grid.attach(button, 0, 0, 1, 1) button = Gtk.Button('Boton 2') grid.attach(button, 0, 2, 1, 2) button = Gtk.Button('Boton 3') grid.attach(button, 1, 1, 2, 2) button = Gtk.Button('Boton 4') grid.attach(button, 2, 0, 2, 1) button = Gtk.Button('Boton 5') grid.attach(button, 3, 3, 3, 3) self.add(grid) self.show_all() self.connect('destroy', Gtk.main_quit) PyApp() Gtk.main() Pippy-71/data/es/tutorials/Tutorial_11_gtk_ventana_de_desplazamiento.py000066400000000000000000000012261311421132100265460ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Ventana de desplazamiento') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_size_request(250, 150) scrolled = Gtk.ScrolledWindow() vbox = Gtk.VBox() scrolled.add(vbox) for x in range(1, 16): boton = Gtk.Button('Boton %d' % x) vbox.pack_start(boton, False, False, 1) self.add(scrolled) self.show_all() self.connect('destroy', Gtk.main_quit) PyApp() Gtk.main() Pippy-71/data/es/tutorials/Tutorial_12_gtk_visor_de_texto.py000066400000000000000000000021501311421132100243760ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Visor de texto') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_size_request(250, 150) scrolled = Gtk.ScrolledWindow() textview = Gtk.TextView() scrolled.add(textview) textbuffer = textview.get_buffer() textbuffer.set_text('Multiples lineas\nen un mismo editor\n') end = textbuffer.get_end_iter() anchor = textbuffer.create_child_anchor(end) box = Gtk.HBox() textview.add_child_at_anchor(box, anchor) button = Gtk.Button('Haz click en mi') button.connect('clicked', self._clicked_cb, textbuffer) box.pack_start(button, False, False, 0) self.add(scrolled) self.show_all() self.connect('destroy', Gtk.main_quit) def _clicked_cb(self, button, textbuffer): end = textbuffer.get_end_iter() textbuffer.insert(end, 'Haz hecho click en el boton!\n') PyApp() Gtk.main() Pippy-71/data/es/tutorials/Tutorial_13_gtk_botones_de_radio.py000066400000000000000000000021261311421132100246440ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Botones de radio') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_size_request(250, 150) vbox = Gtk.VBox() button1 = Gtk.RadioButton(group=None, label='Boton 1') button1.connect('toggled', self._activate_cb, 1) vbox.pack_start(button1, True, True, 2) button2 = Gtk.RadioButton(group=button1, label='Boton 2') button2.connect('toggled', self._activate_cb, 2) vbox.pack_start(button2, True, True, 2) button3 = Gtk.RadioButton(group=button1, label='Boton 3') button3.connect('toggled', self._activate_cb, 3) vbox.pack_start(button3, True, True, 2) self.add(vbox) self.show_all() self.connect('destroy', Gtk.main_quit) def _activate_cb(self, button, button_index): if button.get_active(): print 'Has seleccionado el boton %d' % button_index PyApp() Gtk.main() Pippy-71/data/es/tutorials/Tutorial_14_menu.py000066400000000000000000000137461311421132100214570ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Menu') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_size_request(250, 150) accel_group = Gtk.AccelGroup() self.add_accel_group(accel_group) vbox = Gtk.VBox() menubar = Gtk.MenuBar() vbox.pack_start(menubar, False, False, 0) self.label = Gtk.Label('Activa un item del menu') vbox.pack_start(self.label, True, True, 0) menu_file = Gtk.Menu() item_file = Gtk.MenuItem.new_with_mnemonic('_Archivo') item_file.set_submenu(menu_file) menubar.append(item_file) item_new = Gtk.MenuItem.new_with_mnemonic('_Nuevo') key, mod = Gtk.accelerator_parse('N') item_new.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_new.connect('activate', self._activate_cb, 'Nuevo') menu_file.append(item_new) item_open = Gtk.MenuItem.new_with_mnemonic('_Abrir') key, mod = Gtk.accelerator_parse('O') item_open.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_open.connect('activate', self._activate_cb, 'Abrir') menu_file.append(item_open) menu_recents = Gtk.Menu() item_recents = Gtk.MenuItem.new_with_mnemonic('Abrir _reciente') item_recents.set_submenu(menu_recents) menu_file.append(item_recents) for recent_file in range(1, 6): item_recent = Gtk.MenuItem.new_with_mnemonic('_%d: Archivo reciente %d' % (recent_file, recent_file)) item_recent.connect('activate', self._activate_cb, 'Archivo reciente %d' % recent_file) menu_recents.append(item_recent) separator = Gtk.SeparatorMenuItem() menu_file.append(separator) item_exit = Gtk.MenuItem.new_with_mnemonic('_Salir') key, mod = Gtk.accelerator_parse('Q') item_exit.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_exit.connect('activate', self._activate_cb, 'Salir') menu_file.append(item_exit) menu_edit = Gtk.Menu() item_edit = Gtk.MenuItem.new_with_mnemonic('_Editar') item_edit.set_submenu(menu_edit) menubar.append(item_edit) item_undo = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_UNDO, None) key, mod = Gtk.accelerator_parse('Z') item_undo.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_undo.connect('activate', self._activate_cb, 'Deshacer') menu_edit.append(item_undo) item_redo = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_REDO, None) key, mod = Gtk.accelerator_parse('Z') item_redo.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_redo.connect('activate', self._activate_cb, 'Reahacer') menu_edit.append(item_redo) separator = Gtk.SeparatorMenuItem() menu_edit.append(separator) item_copy = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_COPY, None) key, mod = Gtk.accelerator_parse('C') item_copy.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_copy.connect('activate', self._activate_cb, 'Copiar') menu_edit.append(item_copy) item_cut = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_CUT, None) key, mod = Gtk.accelerator_parse('X') item_cut.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_cut.connect('activate', self._activate_cb, 'Cortar') menu_edit.append(item_cut) item_paste = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_PASTE, None) key, mod = Gtk.accelerator_parse('V') item_paste.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_paste.connect('activate', self._activate_cb, 'Pegar') menu_edit.append(item_paste) separator = Gtk.SeparatorMenuItem() menu_edit.append(separator) label = 'Pagina vertical' item_vertical = Gtk.RadioMenuItem(label) item_vertical.set_active(True) item_vertical.connect('toggled', self._toggled_cb, label) menu_edit.append(item_vertical) label = 'Pagina horizontal' item_horizontal = Gtk.RadioMenuItem.new_with_label((item_vertical,), label) item_horizontal.connect('toggled', self._toggled_cb, label) menu_edit.append(item_horizontal) menu_view = Gtk.Menu() item_view = Gtk.MenuItem.new_with_mnemonic('_Ver') item_view.set_submenu(menu_view) menubar.append(item_view) item_hides = Gtk.CheckMenuItem.new_with_mnemonic('_Archivos ocultos') key, mod = Gtk.accelerator_parse('H') item_hides.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_hides.connect('toggled', self._toggled_cb, 'Archivos ocultos', True) menu_view.append(item_hides) menu_help = Gtk.Menu() item_help = Gtk.MenuItem('Ayuda') item_help.set_submenu(menu_help) menubar.append(item_help) item_about = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_ABOUT, None) item_about.add_accelerator('activate', accel_group, key, mod, Gtk.AccelFlags.VISIBLE) item_about.connect('activate', self._activate_cb, 'Acerca de') menu_help.append(item_about) self.add(vbox) self.show_all() self.connect('destroy', Gtk.main_quit) def _activate_cb(self, item, label): self.label.set_text('Activaste el item %s' % label) def _toggled_cb(self, item, label, no_active=False): if item.get_active(): self.label.set_text('Activaste el item %s' % label) elif not item.get_active() and no_active: self.label.set_text('Desactivaste el item %s' % label) PyApp() Gtk.main() Pippy-71/data/es/tutorials/Tutorial_15_gtk_barra_de_progreso.py000066400000000000000000000024721311421132100250320ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import GObject class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Barras de progreso') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_border_width(20) self.fraction = 0 grid = Gtk.Grid() grid.set_row_spacing(10) self.bar1 = Gtk.ProgressBar() self.bar1.set_hexpand(True) self.bar1.set_vexpand(True) grid.attach(self.bar1, 1, 0, 3, 1) label = Gtk.Label('Una barra de progreso simple') label.set_hexpand(True) grid.attach(label, 1, 1, 1, 1) self.bar2 = Gtk.ProgressBar() self.bar2.set_hexpand(True) self.bar2.set_vexpand(True) grid.attach(self.bar2, 1, 2, 3, 1) label = Gtk.Label('Una barra de progreso con pulsos') grid.attach(label, 1, 3, 1, 1) GObject.timeout_add(200, self._update) self.add(grid) self.show_all() self.connect('destroy', Gtk.main_quit) def _update(self): self.fraction += 0.01 if self.fraction >= 1: self.fraction = 0 self.bar1.set_fraction(self.fraction) self.bar2.pulse() return True PyApp() Gtk.main() Pippy-71/data/es/tutorials/Tutorial_16_sugar_paletas.py000066400000000000000000000053621311421132100233420ustar00rootroot00000000000000import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from sugar3.graphics.toolbarbox import ToolbarBox from sugar3.graphics.toolbutton import ToolButton from sugar3.graphics.palettemenu import PaletteMenuBox from sugar3.graphics.palettemenu import PaletteMenuItem from sugar3.graphics.colorbutton import ColorToolButton class PyApp(Gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title('Paletas') self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) vbox = Gtk.VBox() toolbarbox = ToolbarBox() vbox.add(toolbarbox) toolbar = toolbarbox.toolbar color_button = ColorToolButton() toolbar.insert(color_button, -1) button = ToolButton('list-add') button.set_tooltip('Paleta con widgets') toolbar.insert(button, -1) palette = button.get_palette() palette_box = Gtk.VBox() palette.set_content(palette_box) checkbutton1 = Gtk.CheckButton('Opcion 1') palette_box.pack_start(checkbutton1, False, False, 0) checkbutton2 = Gtk.CheckButton('Opcion 2') palette_box.pack_start(checkbutton2, False, False, 0) checkbutton3 = Gtk.CheckButton('Opcion 3') palette_box.pack_start(checkbutton3, False, False, 0) separator = Gtk.VSeparator() palette_box.pack_start(separator, False, False, 0) radio_button1 = Gtk.RadioButton("Opcion 1") palette_box.pack_start(radio_button1, False, False, 0) radio_button2 = Gtk.RadioButton("Opcion 2", group=radio_button1) palette_box.pack_start(radio_button2, False, False, 0) radio_button3 = Gtk.RadioButton("Opcion 3", group=radio_button1) palette_box.pack_start(radio_button3, False, False, 0) palette_box.show_all() button = ToolButton(icon_name='format-justify-fill') button.props.tooltip = 'Select list' button.props.hide_tooltip_on_click = False button.palette_invoker.props.toggle_palette = True toolbar.insert(button, -1) menu_box = PaletteMenuBox() button.props.palette.set_content(menu_box) menu_box.show() menu_item = PaletteMenuItem("Item 1", icon_name="format-justify-fill") menu_box.append_item(menu_item) menu_item = PaletteMenuItem("Item 1", icon_name="format-justify-center") menu_box.append_item(menu_item) menu_item = PaletteMenuItem("Item 1", icon_name="format-justify-left") menu_box.append_item(menu_item) menu_item = PaletteMenuItem("Item 1", icon_name="format-justify-right") menu_box.append_item(menu_item) self.add(vbox) self.show_all() self.connect('destroy', Gtk.main_quit) PyApp() Gtk.main() Pippy-71/filedialog.py000066400000000000000000000107251311421132100150470ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2014 Walter Bender # Copyright (C) 2014 Ignacio Rodríguez # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from gi.repository import Gtk, Gdk from sugar3.graphics.toolbarbox import ToolbarBox from sugar3.graphics.toolbutton import ToolButton from gettext import gettext as _ import os class FileDialog(Gtk.Dialog): """ Simple file dialog: from filedialog import FileDialog dialog = FileDialog(['Graphics', '/path/of/graphics']) dialog.run() path = dialog.get_path() """ def __init__(self, dirs, window=None, button=None): Gtk.Dialog.__init__(self, flags=Gtk.DialogFlags.DESTROY_WITH_PARENT) self.example_path = None self.expanders = [] self.dirs = dirs self.button = button x, y = (Gdk.Screen.width() / 1.5, Gdk.Screen.height() / 1.5) self.set_size_request(x, y) toolbox = self.build_toolbar() expands = self.build_scroll() self.vbox.pack_start(toolbox, False, False, 0) self.vbox.pack_start(expands, True, True, 5) self.set_decorated(False) self.set_skip_pager_hint(True) self.set_skip_taskbar_hint(True) self.set_resizable(False) self.set_modal(True) self.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse('#F3EEEE')) self.show_all() def get_path(self): return self.example_path def _destroy(self, widget, sample=False): if sample: self.example_path = widget.get_tooltip_text() if self.button: self.button.set_icon_name("pippy-openoff") self.destroy() def build_toolbar(self): toolbox = ToolbarBox() toolbar = toolbox.toolbar label = Gtk.Label(_('Choose an example to open')) label.modify_fg(Gtk.StateType.NORMAL, Gdk.color_parse('white')) item = Gtk.ToolItem() item.add(label) close = ToolButton('entry-cancel') close.connect('clicked', self._destroy) separator = Gtk.SeparatorToolItem() separator.props.draw = False separator.set_expand(True) toolbar.insert(item, -1) toolbar.insert(separator, -1) toolbar.insert(close, -1) toolbox.set_size_request(-1, 35) return toolbox def build_scroll(self): scroll = Gtk.ScrolledWindow() scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) vbox = Gtk.VBox() scroll.add_with_viewport(vbox) dirs = self.dirs for dir_ in dirs: dir_path = dir_[1] dir_name = dir_[0] expand = self.build_expand(dir_path, dir_name) if not expand: continue vbox.pack_start(expand, False, False, 2) expand.show() self.expanders.append(expand) return scroll def build_expand(self, path, name): if not os.path.exists(path): return None expander = Gtk.Expander() expander.set_label(name) expander.modify_fg(Gtk.StateType.NORMAL, Gdk.color_parse('black')) vbox = Gtk.VBox() for root, dirs, files in os.walk(path): if not files: return None for _file in files: if _file.endswith('~'): continue entry = {"name": _(_file.capitalize()), "path": os.path.join(path, _file)} button = Gtk.Button(entry['name']) button.set_tooltip_text(entry['path']) button.set_has_tooltip(False) button.connect('clicked', self._destroy, True) vbox.pack_start(button, False, False, 1) expander.add(vbox) return expander Pippy-71/groupthink/000077500000000000000000000000001311421132100145635ustar00rootroot00000000000000Pippy-71/groupthink/__init__.py000066400000000000000000000000361311421132100166730ustar00rootroot00000000000000from groupthink_base import * Pippy-71/groupthink/aatree.py000066400000000000000000000536041311421132100164060ustar00rootroot00000000000000class Node: """Conventions: a nonexistent child or parent is None.""" parent = None leftchild = None rightchild = None annotation = None value = None class AANode(Node): level = 1 class Walker: """descend must return 0 if the node in question is the one desired, -1 if the left child would be better, or 1 if the right child would be better""" def descend(self, node): raise def prepare_descend(self, *args): #optional method to prepare for descent raise """ascend should return True iff it should run again on the parent. It should set the state such that a subsequent descent would retrace these steps.""" def ascend(self, node): raise def prepare_ascend(self, *args): #optional method to prepare for ascent raise class SearchWalker(Walker): """Convention: leftchild.annotation < annotation < rightchild.annotation""" val = 0 compare = cmp def prepare_descend(self, val, comparator=cmp): self.val = val self.compare = comparator def descend(self, node): x = self.compare(node.annotation, self.val) return x def ascend(self, node): self.val = node.annotation return False class RandomWalker(Walker): def prepare_descend(self): from random import choice as choice self.choice = choice def descend(self, node): return self.choice((-1,1)) #ascend not implemented; it doesn't make sense because there is no #state and no reproducibility def descend(node, walker): #move down from a root node x = walker.descend(node) while x != 0: if x == 1: if node.rightchild is None: return (node, 1) else: node = node.rightchild else: #x == -1 if node.leftchild is None: return (node, -1) else: node = node.leftchild x = walker.descend(node) return (node, 0) def ascend(node, walker): #Move up from a leaf node while node is not None and walker.ascend(node): node = node.parent def search(root, val): """Searches a correctly sorted binary tree, starting with the root Node, for val. Returns a node that contains val if val is present, otherwise a node for which val would be an acceptable child value.""" w = SearchWalker w.prepared_descend(val) return descend(root, w) def findmin(root): while root.leftchild is not None: root = root.leftchild return root def findmax(root): while root.rightchild is not None: root = root.rightchild return root class MonoidTree: makenode = Node """A Monoid Annotation Tree is a binary tree whose nodes are each annotated by values from some monoid. The annotation of an internal node is computed by applying the operation to the annotations of its children. The annotation of a leaf node is specified by the user. Every node must either have two children or be a leaf node. Each leaf node may also be associated with an arbitrary opaque value of the user's choosing. This node and value will remain associated.""" def __init__(self, operation, rootnode): """The rootnode must have a valid annotation, and its parent must be None""" self.op = operation self.root = rootnode def _update(self, node, sentinel=None): """node must be an internal node""" while node is not sentinel: #oldval = node.annotation node.annotation = self.op(node.leftchild.annotation, node.rightchild.annotation) #if oldval == node.annotation: # #this node has not changed, so nodes above it will also not have changed # break #else: node = node.parent _update_add = _update _update_del = _update def _split_link(self, node): """Introduce and return a new node (newparent) between node and its parent""" newparent = self.makenode() newparent.parent = node.parent if node.parent is not None: if node.parent.leftchild is node: node.parent.leftchild = newparent else: assert node.parent.rightchild is node node.parent.rightchild = newparent else: self.root = newparent node.parent = newparent return newparent def addleft(self, new, old): """Add a new leaf node to the left of an old leaf node""" newparent = self._split_link(old) newparent.rightchild = old newparent.leftchild = new new.parent = newparent self._update_add(newparent) def addright(self, new, old): """Add a new leaf node to the right of an old leaf node""" newparent = self._split_link(old) newparent.rightchild = new newparent.leftchild = old new.parent = newparent self._update_add(newparent) def add(self, new, walker): leaf, position = descend(self.root, walker) assert leaf.leftchild is None assert leaf.rightchild is None if position == 1: self.addright(new, leaf) else: #Makes left the default for duplicate values self.addleft(new, leaf) def remove(self, leaf): p = leaf.parent if p.leftchild is leaf: sibling = p.rightchild else: assert p.rightchild is leaf sibling = p.leftchild gp = p.parent if gp.leftchild is p: gp.leftchild = sibling elif gp.rightchild is p: gp.rightchild = sibling sibling.parent = gp # The only remaining reference to p is now in leaf itself, and the only # remaining reference to leaf is in the user's hands self._update_del(gp) def change_annotation(self, leaf, newann): assert leaf.leftchild is None assert leaf.rightchild is None leaf.annotation = newann self._update(leaf.parent) def getnext(self, leaf, skip=None): assert leaf.leftchild is None assert leaf.rightchild is None node = leaf while ((node.parent is not None) and ((node.parent.rightchild is node) or ((skip is not None) and skip(node.parent.rightchild)))): # Move up until you can move right node = node.parent if (node.parent is not None) and (node.parent.leftchild is node): node = node.parent.rightchild while node.leftchild is not None: # Move down, staying as far left as possible. assert node.rightchild is not None if (skip is not None) and skip(node.leftchild): node = node.rightchild else: node = node.leftchild return node else: raise StopIteration("No next node") def _build_subtree(self, nodes): #FIXME: This cannot be helpful because insertion of a subtree requires #rebalancing the main tree by more than one level, which is not possible #with a single invocation of skew and split L = len(nodes) if L == 1: return nodes[0] else: next = [] sentinel = 'g' #must not be None, since None is the root sentinel if L % 2: n2 = nodes.pop() n1 = nodes.pop() newnode = self.makenode() newnode.parent=sentinel #totally arbitrary constant newnode.leftchild = n1 n1.parent = newnode newnode.rightchild = n2 n2.parent = newnode self._update_add(newnode, sentinel) nodes.append(newnode) for i in xrange(0,L,2): n1,n2 = nodes[i:(i+2)] newnode = self.makenode() newnode.parent=sentinel #totally arbitrary constant newnode.leftchild = n1 n1.parent = newnode newnode.rightchild = n2 n2.parent = newnode self._update_add(newnode, sentinel) class SumWalker(Walker): """SumWalker is designed to walk over full trees where each leaf has annotation 1 and the monoid is +. Target is the zero-indexed position of the target node. There is one exception: the last node in every tree has annotation 0.""" target = None offset = None def prepare_descend(self, target): self.target = target self.offset = 0 def descend(self, node): if node.annotation == 0: #empty leaf at the last position assert self.target == self.offset return -1 elif node.leftchild is None: #leaf node case assert node.rightchild is None assert self.target == self.offset return 0 else: #internal node case p = self.offset + node.leftchild.annotation if p <= self.target: self.offset = p return 1 else: return -1 def prepare_ascend(self): self.target = 0 def ascend(self, node): if node.parent is not None: if node.parent.rightchild is node: self.target += node.parent.leftchild.annotation else: assert node.parent.leftchild is node return True else: return False class TreeList: """Implements a list-like interface, backed by a MonoidTree""" _treetype = MonoidTree def __init__(self): self._makenode = self._treetype.makenode r = self._makenode() r.annotation = 0 from operator import add self._tree = self._treetype(add, r) self._walker = SumWalker() # We regard the fields of this walker as public API, and manipulate # them directly self._index = {} def __len__(self): return self._tree.root.annotation def _getnode(self, i): self._walker.prepare_descend(i) node, pos = descend(self._tree.root, self._walker) assert pos == 0 return node def __getitem__(self, s): if isinstance(s, int): node = self._getnode(s) return node.value else: raise UnimplementedError def __setitem__(self, s, v): if isinstance(s, int): if s < len(self): node = self._getnode(s) oldv = node.value self._index[oldv].remove(node) if not self._index[oldv]: del self._index[oldv] node.value = v if v not in self._index: self._index[v] = set() self._index[v].add(node) else: self.insert(s, v) else: raise UnimplementedError def __delitem__(self, s): if isinstance(s, int): if s < len(self): node = self._getnode(s) oldv = node.value self._index[oldv].remove(node) if not self._index[oldv]: del self._index[oldv] self._tree.remove(node) else: raise UnimplementedError def insert(self, p, v): if p > len(self): raise IndexError("Index out of range") self._walker.prepare_descend(p) newnode = self._makenode() newnode.annotation = 1 newnode.value = v self._tree.add(newnode, self._walker) if v not in self._index: self._index[v] = set() self._index[v].add(newnode) def index(self, v): """index returns some index such that self[i] == v. No promises about ordering.""" self._walker.prepare_ascend() for node in self._index[v]: #Pull one arbitrary node out of the set assert node.value == v ascend(node, self._walker) break return self._walker.target class TreeHideList: """Implements the EagerHideList interface, backed by a MonoidTree""" _treetype = MonoidTree class MultiSumWalker(Walker): index = 0 target = 0 offset = 0 def prepare_descend(self, target, index): self.index = index self.target = target self.offset = 0 def descend(self, node): if node.annotation == (0,0): #empty leaf at the last position assert self.target == self.offset return -1 elif node.leftchild is None: #leaf node case assert node.rightchild is None assert self.target == self.offset return 0 else: #internal node case p = self.offset + node.leftchild.annotation[self.index] if p <= self.target: self.offset = p return 1 else: return -1 def prepare_ascend(self, index): self.target = 0 self.index = index def ascend(self, node): if node.parent is not None: if node.parent.rightchild is node: self.target += node.parent.leftchild.annotation[self.index] else: assert node.parent.leftchild is node return True else: return False @staticmethod def op(a,b): # Convention: a[0] is visible elements. a[1] is all elements. return (a[0] + b[0], a[1] + b[1]) @staticmethod def skip(node): return node.annotation[0] == 0 def __init__(self): self._makenode = self._treetype.makenode r = self._makenode() r.annotation = (0, 0) self._tree = self._treetype(self.op, r) self._walker = self.MultiSumWalker() # We regard the fields of this walker as public API, and manipulate # them directly self._index = {} unique = True if unique: self._index_lookup = self._index.__getitem__ self._index_assign = self._index.__setitem__ else: self._index_lookup = self._index_lookup_set self._index_assign = self._index_assign_set def _index_lookup_set(self, item): for v in self._index[item]: return v def _index_assign_set(self, key, value): if key not in self._index: self._index[key] = set() self._index[key].add(value) def __len__(self): return self._tree.root.annotation[0] def _getnode(self, i, a): self._walker.prepare_descend(i, a) node, pos = descend(self._tree.root, self._walker) assert (pos == 0) or ((pos == -1) and (i == len(self))) return node def __getitem__(self, s): if isinstance(s, int): if s < len(self): #FIXME: negative indices node = self._getnode(s, 0) return node.value else: raise IndexError("Index out of range") else: start, stop, stride = s.indices(len(self)) if start == stop: return [] elif stride == 1: # runs in k + log(N) (amortized) nodes = [self._getnode(start,0)] k = stop - start while len(nodes) < k: nodes.append(self._tree.getnext(nodes[-1],self.skip)) return [n.value for n in nodes] else: #FIXME: runs in k*log(N), could be reduced to k*log(step) + log(N) return [self[i] for i in xrange(start,stop,stride)] def index(self, v, visible=True): """index returns some index such that self[i] == v. No promises about ordering.""" self._walker.prepare_ascend(0 if visible else 1) node = self._index_lookup(v) #Pull one arbitrary node out of the set assert node.value == v ascend(node, self._walker) return self._walker.target def hide(self, position, length): #self.__getitem__ is eager, so we acquire the list of nodes before #acting on them node = self._getnode(position,0) for i in xrange(position+1,position+length): self._tree.change_annotation(node,(0,1)) node = self._tree.getnext(node, self.skip) self._tree.change_annotation(node,(0,1)) #FIXME: runs in length*log(N). Could be reduced using a priority queue, #possibly to length + log(N) def getitem_all(self, s): if isinstance(s, int): node = self._getnode(s, 1) return node.value else: #FIXME: runs in k*log(N), could be reduced to k + log(N) by linked list return [self.getitem_all(i) for i in xrange(*s.indices())] def index_all(self, item): return self.index(item, False) def is_visible(self, i): node = self._getnode(i, 1) return node.annotation[0] == 1 def is_visible_item(self, item): node = self._index_lookup(item) return node.annotation[0] == 1 def insert_sequence_all(self, position, sequence, visibility): node = self._getnode(position,1) self._insert_sequence_leftofnode(node, sequence, visibility) def insert_sequence_leftof(self, target, sequence, visibility): node = self._index_lookup(target) self._insert_sequence_leftofnode(node, sequence, visibility) def _insert_sequence_leftofnode(self, node, sequence, visibility): for i in xrange(len(sequence)): v = sequence[i] viz = visibility[i] newnode = self._makenode() newnode.annotation = (1 if viz else 0, 1) newnode.value = v self._tree.addleft(newnode, node) self._index_assign(v, newnode) # Skew, split, and decrease_level are the AA balancing functions, as described # at http://en.wikipedia.org/wiki/AA_tree . They have been modified # substantially here to (1) maintain bidirectional linking and (2) maintain # monoid annotations. def skew(node, op=None): L = node.leftchild if (L is not None) and node.level == L.level: node.leftchild = L.rightchild if node.leftchild is not None: node.leftchild.parent = node L.rightchild = node L.parent = node.parent node.parent = L if L.parent is not None: if L.parent.leftchild is node: L.parent.leftchild = L else: assert L.parent.rightchild is node L.parent.rightchild = L if op is not None: L.annotation = node.annotation node.annotation = op(node.leftchild.annotation, node.rightchild.annotation) assert L.annotation == op(L.leftchild.annotation, L.rightchild.annotation) # This assertion is the condition of associativity, guaranteed for any # valid monoid operation. return L else: return node def split(node, op=None): R = node.rightchild if ((R is not None) and (R.rightchild is not None) and (node.level == R.rightchild.level)): node.rightchild = R.leftchild node.rightchild.parent = node R.leftchild = node R.parent = node.parent node.parent = R R.level += 1 if R.parent is not None: if R.parent.leftchild is node: R.parent.leftchild = R else: assert R.parent.rightchild is node R.parent.rightchild = R if op is not None: R.annotation = node.annotation node.annotation = op(node.leftchild.annotation, node.rightchild.annotation) assert R.annotation == op(R.leftchild.annotation, R.rightchild.annotation) # This assertion is the condition of associativity, guaranteed for any # valid monoid operation. return R else: return node def decrease_level(node): # Decrease the level of node if necessary. Returns true if a modification # was made. target = min(node.leftchild.level, node.rightchild.level) + 1 if target < node.level: node.level = target if target < node.rightchild.level: node.rightchild.level = target return True return False class AAMonoidTree(MonoidTree): makenode = AANode def _update_add(self, node, sentinel=None): """node must be an internal node one level above the leaves, with two leaves itself.""" node.level = 2 while node is not sentinel: #oldval = node.annotation node.annotation = self.op(node.leftchild.annotation, node.rightchild.annotation) node = skew(node, self.op) node = split(node, self.op) if node.parent is None: self.root = node node = node.parent def _update_del(self, node, sentinel=None): while node is not sentinel: #oldval = node.annotation #oldlevel = node.level node.annotation = self.op(node.leftchild.annotation, node.rightchild.annotation) decrease_level(node) node = skew(node, self.op) node.rightchild = skew(node.rightchild, self.op) if node.rightchild.rightchild is not None: node.rightchild.rightchild = skew(node.rightchild.rightchild, self.op) node = split(node, self.op) node.rightchild = split(node.rightchild, self.op) #if (oldval == node.annotation) and (oldlevel == node.level): # #Nodes above this point will not have changed # break if node.parent is None: self.root = node node = node.parent class AATreeList(TreeList): _treetype = AAMonoidTree class AATreeHideList(TreeHideList): _treetype = AAMonoidTree Pippy-71/groupthink/aatree_test.py000066400000000000000000000003401311421132100174320ustar00rootroot00000000000000from aatree import * x = TreeList() y = AATreeList() def test(a): a[0] = 1 a[1] = 2 a[2] = 3 a[3] = 4 a[1] = 'b' del a[2] assert a.index('b') == 1 assert a.index(4) == 2 test(x) test(y) Pippy-71/groupthink/dbus_tools.py000066400000000000000000000015271311421132100173170ustar00rootroot00000000000000import dbus inttypes = (dbus.Int16, dbus.Int32, dbus.Int64, dbus.Byte, dbus.UInt16, dbus.UInt32, dbus.UInt64) booltypes = (dbus.Boolean) floattypes = (dbus.Double) strtypes = (dbus.ByteArray, dbus.String, dbus.UTF8String, dbus.Signature, dbus.ObjectPath) def undbox(x): if isinstance(x, inttypes): return int(x) elif isinstance(x, booltypes): return bool(x) elif isinstance(x, strtypes): return str(x) elif isinstance(x, floattypes): return float(x) elif isinstance(x, (dbus.Struct, tuple)): return tuple(undbox(y) for y in x) elif isinstance(x, (dbus.Array, list)): return [undbox(y) for y in x] elif isinstance(x, (dbus.Dictionary, dict)): return dict((undbox(a),undbox(b)) for (a,b) in x.iteritems()) else: return x Pippy-71/groupthink/groupthink_base.py000066400000000000000000002054261311421132100203320ustar00rootroot00000000000000""" Copyright 2008 Benjamin M. Schwartz DOBject is LGPLv2+ DObject is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. DObject 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 Lesser General Public License along with DObject. If not, see . """ import dbus import dbus.service import dbus.gobject_service import time import logging import threading import thread import random from listset import ListSet import stringtree import cPickle import dbus_tools """ DObject is a library of components useful for constructing distributed applications that need to maintain coherent state while communicating over Telepathy. The DObject tools are design to handle unexpected joins, leaves, splits, and merges automatically, and always to leave each connected component of users in a coherent state at quiescence. """ def PassFunction(*args,**kargs): logging.debug("args=%s, kargs=%s" % (str(args),str(kargs))) pass def ReturnFunction(x): return x class Group: """A Group is a simple tool for organizing DObjects. Once it is set up with a tubebox, the user may simply add objects to it, e.g. self.group = Group(tb) ... self.group['mydict1'] = HighScore('No one', 0) and the group will take care of assigning a handler to the object with the specified name. For a Group g, g['a'] is equivalent in almost all ways to g.a, for programmer convenience. """ tubebox = None _locked = False _d = None def __init__(self, tubebox): self._logger = logging.getLogger('groupthink.Group') self._logger.debug('new Group') self.tubebox = tubebox self._d = dict() self._history = dict() self._handlers = dict() self._locked = True def __setitem__(self, name, dobj): self._logger.debug("setitem(%s,%s)" % (name, str(dobj))) if name in self.__dict__ or name in self._d: raise #Cannot replace an existing attribute or object h = dobj.HANDLER_TYPE(name, self.tubebox) dobj.set_handler(h) self.add_handler(h, dobj) def add_handler(self, h, o=None): """This function is used to add a handler to the Group _after_ that handler has already been registered to completion with its object.""" name = h.get_name() self._handlers[name] = h if name in self._history: h.object.add_history(self._history[name]) del self._history[name] if o is not None: self._d[name] = o else: self._d[name] = h.object for hc in h.get_copies(): #Recurse through a potential tree of handlers self.add_handler(hc) def __setattr__(self, name, val): if self._locked: self.__setitem__(name, val) else: self.__dict__[name] = val def __getitem__(self, name): if name in self._d: return self._d[name] else: return self.__dict__[name] __getattr__ = __getitem__ def __delattr__(self, name): raise #Deletion is not supported def dumps(self): d = {} for (name, handler) in self._handlers.iteritems(): d[name] = dbus_tools.undbox(handler.object.get_history()) d.update(self._history) #Include any "unclaimed history" thus far. return cPickle.dumps(d) def loads(self, s): if s: d = cPickle.loads(s) for (name,hist) in d.iteritems(): if name in self._d: handler = self._handlers[name] handler.object.add_history(hist) else: self._history[name] = hist class TubeBox: """ A TubeBox is a box that either contains a Tube or does not. The purpose of a TubeBox is to solve this problem: Activities are not provided with the sharing Tube until they are shared, but DObjects should not have to care whether or not they have been shared. That means that the DObject handler must know whether or not a Tube has been provided. This could be implemented within the handlers, but then the Activity's sharing code would have to know a list of all DObject handlers. Instead, the sharing code just needs to create a TubeBox and pass it to the code that creates handlers. Once the tube arrives, it can be added to the TubeBox with insert_tube. The handlers will then be notified automatically. """ def __init__(self): self.tube = None self.is_initiator = None self._logger = logging.getLogger() self._listeners = [] def register_listener(self, L): """This method is used by the DObject handlers to add a callback function that will be called after insert_tube""" self._listeners.append(L) if self.tube is not None: L(self.tube, self.is_initiator) def insert_tube(self, tube, is_initiator=False): """This method is used by the sharing code to provide the tube, once it is ready, along with a boolean indicating whether or not this computer is the initiator (who may have special duties, as the first participant).""" self._logger.debug("insert_tube, notifying %s" % str(self._listeners)) self.tube = tube self.is_initiator = is_initiator for L in self._listeners: L(tube, is_initiator) class TimeHandler(dbus.gobject_service.ExportedGObject): """A TimeHandler provides a universal clock for a sharing instance. It is a sort of cheap, decentralized synchronization system. The TimeHandler determines the offset between local time and group time by sending a broadcast and accepting the first response, and assuming that both transfer displays were equal. The initiator's offset is 0.0, but once another group member has synchronized, the initiator can leave and new members will still be synchronized correctly. Errors at each synchronization are typically between 0.1s and 2s. TimeHandler is not perfectly resilient to disappearances. If the group splits, and one of the daughter groups does not contain any members that have had a chance to synchronize, then they will not sync to each other. I am not yet aware of any sensible synchronization system that avoids this problem. """ IFACE = "org.dobject.TimeHandler" BASEPATH = "/org/dobject/TimeHandler/" def __init__(self, name, tube_box, offset=0.0): self.PATH = TimeHandler.BASEPATH + name dbus.gobject_service.ExportedGObject.__init__(self) self._logger = logging.getLogger(self.PATH) self._tube_box = tube_box self.tube = None self.is_initiator = None self.offset = offset self._know_offset = False self._offset_lock = threading.Lock() self._tube_box.register_listener(self.get_tube) def get_tube(self, tube, is_initiator): """Callback for the TubeBox""" self._logger.debug("get_tube") self._logger.debug(str(is_initiator)) self.tube = tube self.add_to_connection(self.tube, self.PATH) self.is_initiator = is_initiator self._know_offset = is_initiator self.tube.add_signal_receiver(self.tell_time, signal_name='What_time_is_it', dbus_interface=TimeHandler.IFACE, sender_keyword='sender', path=self.PATH) if not self._know_offset: self.ask_time() def time(self): """Get the group time""" return time.time() + self.offset def get_offset(self): """Get the difference between local time and group time""" self._logger.debug("get_offset " + str(self.offset)) return self.offset def set_offset(self, offset): """Set the difference between local time and group time, and assert that this is correct""" self._logger.debug("set_offset " + str(offset)) self._offset_lock.acquire() self.offset = offset self._know_offset = True self._offset_lock.release() @dbus.service.signal(dbus_interface=IFACE, signature='d') def What_time_is_it(self, asktime): return def ask_time(self): self._logger.debug("ask_time") self.What_time_is_it(time.time()) def tell_time(self, asktime, sender=None): self._logger.debug("tell_time") start_time = time.time() try: my_name = self.tube.get_unique_name() if sender == my_name: return if self._know_offset: self._logger.debug("telling offset") remote = self.tube.get_object(sender, self.PATH) start_time += self.offset remote.receive_time(asktime, start_time, time.time() + self.offset, reply_handler=PassFunction, error_handler=PassFunction) finally: return @dbus.service.method(dbus_interface=IFACE, in_signature='ddd', out_signature='') def receive_time(self, asktime, start_time, finish_time): self._logger.debug("receive_time") rtime = time.time() thread.start_new_thread(self._handle_incoming_time, (asktime, start_time, finish_time, rtime)) def _handle_incoming_time(self, ask, start, finish, receive): self._offset_lock.acquire() if not self._know_offset: self.offset = ((start + finish)/2) - ((ask + receive)/2) self._know_offset = True self._offset_lock.release() class UnorderedHandler(dbus.gobject_service.ExportedGObject): """The UnorderedHandler serves as the interface between a local UnorderedObject (a pure python entity) and the d-bus/network system. Each UnorderedObject is associated with a single Handler, and vice-versa. It is the Handler that is actually exposed over D-Bus. The purpose of this system is to minimize the amount of networking code required for each additional UnorderedObject. """ IFACE = "org.dobject.Unordered" BASEPATH = "/org/dobject/Unordered/" def __init__(self, name, tube_box): """To construct a UO, the program must provide a name and a TubeBox. The name is used to identify the UO; all UO with the same name on the same Tube should be considered views into the same abstract distributed object.""" self._myname = name self.PATH = UnorderedHandler.BASEPATH + name dbus.gobject_service.ExportedGObject.__init__(self) self._logger = logging.getLogger(self.PATH) self._tube_box = tube_box self.tube = None self._copies = [] self.object = None self._tube_box.register_listener(self.set_tube) def set_tube(self, tube, is_initiator): self._logger.debug("set_tube(), is_initiator=%s" % str(is_initiator)) """Callback for the TubeBox""" self.tube = tube self.add_to_connection(self.tube, self.PATH) self.tube.add_signal_receiver(self.receive_message, signal_name='send', dbus_interface=UnorderedHandler.IFACE, sender_keyword='sender', path=self.PATH) self.tube.add_signal_receiver(self.tell_history, signal_name='ask_history', dbus_interface=UnorderedHandler.IFACE, sender_keyword='sender', path=self.PATH) # We need watch_participants because of the case in which several groups # all having made changes, come together and need to update each other. # There is no easy way to make this process more efficient without # changing the Unordered interface dramatically to include per-message # labels of some kind. self.tube.watch_participants(self.members_changed) #Alternative implementation of members_changed (not yet working) #self.tube.add_signal_receiver(self.members_changed, signal_name="MembersChanged", dbus_interface="org.freedesktop.Telepathy.Channel.Interface.Group") if self.object is not None: self.ask_history() def register(self, obj): self._logger.debug("register(%s)" % str(obj)) """This method registers obj as the UnorderedObject being managed by this Handler. It is called by obj after obj has initialized itself.""" self.object = obj if self.tube is not None: self.ask_history() def get_path(self): """Returns the DBus path of this handler. The path is the closest thing to a unique identifier for each abstract DObject.""" return self.PATH def get_tube(self): """Returns the TubeBox used to create this handler. This method is necessary if one DObject wishes to create another.""" return self._tube_box @dbus.service.signal(dbus_interface=IFACE, signature='v') def send(self, message): self._logger.debug("send(%s)" % str(message)) """This method broadcasts message to all other handlers for this UO""" return def receive_message(self, message, sender=None): self._logger.debug("receive_message(%s)" % str(message)) if self.object is None: self._logger.error("got message before registration") elif sender == self.tube.get_unique_name(): self._logger.debug("Ignoring message, because I am the sender.") else: self.object.receive_message(message) @dbus.service.signal(dbus_interface=IFACE, signature='') def ask_history(self): self._logger.debug("ask_history()") return def tell_history(self, sender=None): self._logger.debug("tell_history to " + str(sender)) try: if sender == self.tube.get_unique_name(): self._logger.debug("tell_history aborted because I am" + str(sender)) return if self.object is None: self._logger.error("object not registered before tell_history") return self._logger.debug("getting proxy object") remote = self.tube.get_object(sender, self.PATH) self._logger.debug("got proxy object, getting history") h = self.object.get_history() self._logger.debug("got history, initiating transfer") remote.receive_history(h, reply_handler=PassFunction, error_handler=PassFunction) self._logger.debug("history transfer initiated") except Exception, E: self._logger.debug("tell_history failed: " % repr(E)) finally: return @dbus.service.method(dbus_interface=IFACE, in_signature = 'v', out_signature='') def receive_history(self, hist): self._logger.debug("receive_history(%s)" % str(hist)) if self.object is None: self._logger.error("object not registered before receive_history") return self.object.add_history(hist) #Alternative implementation of a members_changed (not yet working) """ def members_changed(self, message, added, removed, local_pending, remote_pending, actor, reason): added_names = self.tube.InspectHandles(telepathy.CONNECTION_HANDLE_TYPE_LIST, added) for name in added_names: self.tell_history(name) """ def members_changed(self, added, removed): self._logger.debug("members_changed") for (handle, name) in added: self.tell_history(sender=name) def __repr__(self): return 'UnorderedHandler(' + self._myname + ', ' + repr(self._tube_box) + ')' def copy(self, name): """A convenience function for returning a new UnorderedHandler derived from this one, with a new name. This is safe as long as copy() is called with a different name every time.""" h = UnorderedHandler(self._myname + "/" + name, self._tube_box) self._copies.append(h) return h def get_copies(self): return self._copies def get_name(self): return self._myname class HandlerAcceptor: HANDLER_TYPE = NotImplementedError def set_handler(self, handler): raise NotImplementedError class UnorderedHandlerAcceptor(HandlerAcceptor): HANDLER_TYPE = UnorderedHandler class UnorderedObject(UnorderedHandlerAcceptor): """ The most basic DObject is the Unordered Object (UO). A UO has the property that any changes to its state can be encapsulated as messages, and these messages have no intrinsic ordering. Different instances of the same UO, after receiving the same messages in different orders, should reach the same state. Any UO could be implemented as a set of all messages received so far, and coherency could be maintained by sending all messages ever transmitted to each new joining member. However, many UOs will have the property that most messages are obsolete, and need not be transmitted. Therefore, as an optimization, UOs manage their own state structures for synchronizing state with joining/merging users. The following code is an abstract class for UnorderedObject, serving primarily as documentation for the concept. """ handler = None def set_handler(self, handler): """Each UO must accept an UnorderedHandler via set_handler Whenever an action is taken on the local UO (e.g. a method call that changes the object's state), the UO must call handler.send() with an appropriately encoded message. Subclasses may override this method if they wish to perform more actions when a handler is set.""" if self.handler: raise else: self.handler = handler self.handler.register(self) def receive_message(self,msg): """This method accepts and processes a message sent via handler.send(). Because objects are sent over DBus, it is advisable to DBus-ify the message before calling send, and de-DBus-ify it inside receive_message.""" raise NotImplementedError def get_history(self): """This method returns an encoded copy of all non-obsolete state, ready to be sent over DBus.""" raise NotImplementedError def add_history(self, state): """This method accepts and processes the state object returned by get_history()""" raise NotImplementedError def empty_translator(x, pack): return x class HighScore(UnorderedObject): """ A HighScore is the simplest nontrivial DObject. A HighScore's state consists of a value and a score. The user may suggest a new value and score. If the new score is higher than the current score, then the value and score are updated. Otherwise, they are not. The value can be any object, and the score can be any comparable object. To ensure that serialization works correctly, the user may specify a translator function that converts values or scores to and from a format that can be serialized reliably by dbus-python. In the event of a tie, coherence cannot be guaranteed. If ties are likely with the score of choice, the user may set break_ties=True, which appends a random number to each message, and thereby reduces the probability of a tie by a factor of 2**52. """ def __init__(self, initval, initscore, value_translator=empty_translator, score_translator=empty_translator, break_ties=False): self._logger = logging.getLogger('stopwatch.HighScore') self._lock = threading.Lock() self._value = initval self._score = initscore self._break_ties = break_ties if self._break_ties: self._tiebreaker = random.random() else: self._tiebreaker = None self._val_trans = value_translator self._score_trans = score_translator self._listeners = [] def _set_value_from_net(self, val, score, tiebreaker): self._logger.debug("set_value_from_net " + str(val) + " " + str(score)) if self._actually_set_value(val, score, tiebreaker): self._trigger() def receive_message(self, message): self._logger.debug("receive_message " + str(message)) if len(message) == 2: #Remote has break_ties=False self._set_value_from_net(self._val_trans(message[0], False), self._score_trans(message[1], False), None) elif len(message) == 3: self._set_value_from_net(self._val_trans(message[0], False), self._score_trans(message[1], False), float_translator(message[2], False)) add_history = receive_message def set_value(self, val, score): """This method suggests a value and score for this HighScore. If the suggested score is higher than the current score, then both value and score will be broadcast to all other participants. """ self._logger.debug("set_value " + str(val) + " " + str(score)) if self._actually_set_value(val, score, None) and self.handler: self.handler.send(self.get_history()) def _actually_set_value(self, value, score, tiebreaker): self._logger.debug("_actually_set_value " + str(value)+ " " + str(score)) if self._break_ties and (tiebreaker is None): tiebreaker = random.random() self._lock.acquire() if self._break_ties: if (self._score < score) or ((self._score == score) and (self._tiebreaker < tiebreaker)): self._value = value self._score = score self._tiebreaker = tiebreaker self._lock.release() return True else: self._lock.release() return False elif self._score < score: self._value = value self._score = score self._lock.release() return True else: self._logger.debug("not changing value") self._lock.release() return False def get_value(self): """ Get the current winning value.""" return self._value def get_score(self): """ Get the current winning score.""" return self._score def get_pair(self): """ Get the current value and score, returned as a tuple (value, score)""" self._lock.acquire() pair = (self._value, self._score) self._lock.release() return pair def _get_all(self): if self._break_ties: self._lock.acquire() q = (self._value, self._score, self._tiebreaker) self._lock.release() return q else: return self.get_pair() def get_history(self): p = self._get_all() if self._break_ties: return (self._val_trans(p[0], True), self._score_trans(p[1], True), float_translator(p[2], True)) else: return (self._val_trans(p[0], True), self._score_trans(p[1], True)) def register_listener(self, L): """Register a function L that will be called whenever another user sets a new record. L must have the form L(value, score).""" self._lock.acquire() self._listeners.append(L) self._lock.release() (v,s) = self.get_pair() L(v,s) def _trigger(self): (v,s) = self.get_pair() for L in self._listeners: L(v,s) def float_translator(f, pack): """This translator packs and unpacks floats for dbus serialization""" if pack: return dbus.Double(f) else: return float(f) def uint_translator(f, pack): """This translator packs and unpacks 64-bit uints for dbus serialization""" if pack: return dbus.UInt64(f) else: return int(f) def int_translator(f, pack): """This translator packs and unpacks 32-bit ints for dbus serialization""" if pack: return dbus.Int32(f) else: return int(f) def string_translator(s, pack): """This translator packs and unpacks unicode strings for dbus serialization""" if pack: return dbus.String(s) else: return str(s) class Latest(HandlerAcceptor): """ Latest is a variation on HighScore, in which the score is the current timestamp. Latest uses TimeHandler to provide a groupwide coherent clock. Because TimeHandler's guarantees about synchronization and resilience are weak, Latest is not as resilient to failures as a true DObject. The creator must provide the initial value. One may optionally indicate the initial time (as a float in epoch-time), a TimeHandler (otherwise a new one will be created), and a translator for serialization of the values. Note that if time_handler is not provided, the object will not be functional until set_handler is called. """ def __init__(self, initval, inittime=float('-inf'), time_handler=None, translator=empty_translator): self._time_handler = time_handler self._listeners = [] self._lock = threading.Lock() self._highscore = HighScore(initval, inittime, translator, float_translator) self._highscore.register_listener(self._highscore_cb) def set_handler(self, handler): if self.handler: raise else: if self._time_handler is None: self._time_handler = TimeHandler(handler.get_path(), handler.get_tube()) self._highscore.set_handler(handler) def get_value(self): """ Returns the latest value """ return self._highscore.get_value() def set_value(self, val): """ Suggest a new value """ if self._time_handler: self._highscore.set_value(val, self._time_handler.time()) else: raise #missing _time_handler def register_listener(self, L): """ Register a listener L(value), to be called whenever another user adds a new latest value.""" self._lock.acquire() self._listeners.append(L) self._lock.release() L(self.get_value()) def _highscore_cb(self, val, score): for L in self._listeners: L(val) class Recentest(HandlerAcceptor): """ Recentest is like Latest, but without using a clock or TimeHandler. As a result, it can only guarantee causality, not synchrony. """ def __init__(self, initval, translator=empty_translator): self._listeners = [] self._lock = threading.Lock() self._highscore = HighScore(initval, 0, translator, uint_translator, break_ties=True) self._highscore.register_listener(self._highscore_cb) def set_handler(self, handler): self._highscore.set_handler(handler) def get_value(self): """ Returns the current value """ return self._highscore.get_value() def set_value(self, val): """ Set a new value """ self._highscore.set_value(val, self._highscore.get_score() + 1) def register_listener(self, L): """ Register a listener L(value), to be called whenever another user adds a new latest value.""" self._lock.acquire() self._listeners.append(L) self._lock.release() L(self.get_value()) def _highscore_cb(self, val, score): for L in self._listeners: L(val) class AddOnlySet(UnorderedObject): """The AddOnlySet is the archetypal UnorderedObject. It consists of a set, supporting all the normal Python set operations except those that cause an item to be removed from the set. Thanks to this restriction, a AddOnlySet is perfectly coherent, since the order in which elements are added is not important. """ def __init__(self, initset = (), translator=empty_translator): self._logger = logging.getLogger('dobject.AddOnlySet') self._set = set(initset) self._lock = threading.Lock() self._trans = translator self._listeners = [] self.__and__ = self._set.__and__ self.__cmp__ = self._set.__cmp__ self.__contains__ = self._set.__contains__ self.__eq__ = self._set.__eq__ self.__ge__ = self._set.__ge__ # Not implementing getattribute self.__gt__ = self._set.__gt__ self.__hash__ = self._set.__hash__ # Not implementing iand (it can remove items) # Special wrapper for ior to trigger events # Not implementing isub (it can remove items) self.__iter__ = self._set.__iter__ # Not implementing ixor (it can remove items) self.__le__ = self._set.__le__ self.__len__ = self._set.__len__ self.__lt__ = self._set.__lt__ self.__ne__ = self._set.__ne__ self.__or__ = self._set.__or__ self.__rand__ = self._set.__rand__ # Special implementation of repr self.__ror__ = self._set.__ror__ self.__rsub__ = self._set.__rsub__ self.__rxor__ = self._set.__rxor__ self.__sub__ = self._set.__sub__ self.__xor__ = self._set.__xor__ # Special implementation of add to trigger events # Not implementing clear self.copy = self._set.copy self.difference = self._set.difference # Not implementing difference_update (it removes items) # Not implementing discard (it removes items) self.intersection = self._set.intersection # Not implementing intersection_update (it removes items) self.issubset = self._set.issubset self.issuperset = self._set.issuperset # Not implementing pop # Not implementing remove self.symmetric_difference = self._set.symmetric_difference # Not implementing symmetric_difference_update self.union = self._set.union # Special implementation of update to trigger events def update(self, y): """Add all the elements of an iterable y to the current set. If any of these elements were not already present, they will be broadcast to all other users.""" s = set(y) d = s - self._set if len(d) > 0: self._set.update(d) self._send(d) __ior__ = update def add(self, y): """ Add the single element y to the current set. If y is not already present, it will be broadcast to all other users.""" if y not in self._set: self._set.add(y) self._send((y,)) def _send(self, els): if len(els) > 0 and self.handler is not None: self.handler.send(dbus.Array([self._trans(el, True) for el in els])) def _net_update(self, y): s = set(y) d = s - self._set if len(d) > 0: self._set.update(d) self._trigger(d) def receive_message(self, msg): self._net_update((self._trans(el, False) for el in msg)) def get_history(self): if len(self._set) > 0: return dbus.Array([self._trans(el, True) for el in self._set]) else: return dbus.Array([], type=dbus.Boolean) #Prevent introspection of empty list, which fails add_history = receive_message def register_listener(self, L): """Register a listener L(diffset). Every time another user adds items to the set, L will be called with the set of new items.""" self._listeners.append(L) L(self._set.copy()) def _trigger(self, s): for L in self._listeners: L(s) def __repr__(self): return 'AddOnlySet(' + repr(self.handler) + ', ' + repr(self._set) + ', ' + repr(self._trans) + ')' class AddOnlySortedSet(UnorderedObject): """ AddOnlySortedSet is much like AddOnlySet, only backed by a ListSet, which provides a set for objects that are ordered under cmp(). Items are maintained in order. This approach is most useful in cases where each item is a message, and the messages are subject to a time-like ordering. Messages may still arrive out of order, but they will be stored in the same order on each computer. """ def __init__(self, initset = (), translatohr=empty_translator): self._logger = logging.getLogger('dobject.AddOnlySortedSet') self._set = ListSet(initset) self._lock = threading.Lock() self._trans = translator self._listeners = [] self.__and__ = self._set.__and__ self.__contains__ = self._set.__contains__ # No self.__delitem__ self.__eq__ = self._set.__eq__ self.__ge__ = self._set.__ge__ # Not implementing getattribute self.__getitem__ = self._set.__getitem__ self.__gt__ = self._set.__gt__ # Not implementing iand (it can remove items) # Special wrapper for ior to trigger events # Not implementing isub (it can remove items) self.__iter__ = self._set.__iter__ # Not implementing ixor (it can remove items) self.__le__ = self._set.__le__ self.__len__ = self._set.__len__ self.__lt__ = self._set.__lt__ self.__ne__ = self._set.__ne__ self.__or__ = self._set.__or__ self.__rand__ = self._set.__rand__ # Special implementation of repr self.__ror__ = self._set.__ror__ self.__rsub__ = self._set.__rsub__ self.__rxor__ = self._set.__rxor__ self.__sub__ = self._set.__sub__ self.__xor__ = self._set.__xor__ # Special implementation of add to trigger events # Not implementing clear self.copy = self._set.copy self.difference = self._set.difference # Not implementing difference_update (it removes items) # Not implementing discard (it removes items) self.first = self._set.first self.headset = self._set.headset self.index = self._set.index self.intersection = self._set.intersection # Not implementing intersection_update (it removes items) self.issubset = self._set.issubset self.issuperset = self._set.issuperset self.last = self._set.last # Not implementing pop self.position = self._set.position # Not implementing remove self.subset = self._set.subset self.symmetric_difference = self._set.symmetric_difference # Not implementing symmetric_difference_update self.tailset = self._set.tailset self.union = self._set.union # Special implementation of update to trigger events def update(self, y): """Add all the elements of an iterable y to the current set. If any of these elements were not already present, they will be broadcast to all other users.""" d = ListSet(y) d -= self._set if len(d) > 0: self._set.update(d) self._send(d) __ior__ = update def add(self, y): """ Add the single element y to the current set. If y is not already present, it will be broadcast to all other users.""" if y not in self._set: self._set.add(y) self._send((y,)) def _send(self, els): if len(els) > 0 and self.handler is not None: self.handler.send(dbus.Array([self._trans(el, True) for el in els])) def _net_update(self, y): d = ListSet() d._list = y d -= self._set if len(d) > 0: self._set |= d self._trigger(d) def receive_message(self, msg): self._net_update([self._trans(el, False) for el in msg]) def get_history(self): if len(self._set._list) > 0: return dbus.Array([self._trans(el, True) for el in self._set._list]) else: return dbus.Array([], type=dbus.Boolean) #prevent introspection of empty list, which fails add_history = receive_message def register_listener(self, L): """Register a listener L(diffset). Every time another user adds items to the set, L will be called with the set of new items as a SortedSet.""" self._listeners.append(L) L(self._set.copy()) def _trigger(self, s): for L in self._listeners: L(s) def __repr__(self): return 'AddOnlySortedSet(' + repr(self.handler) + ', ' + repr(self._set) + ', ' + repr(self._trans) + ')' class CausalHandler: """The CausalHandler is analogous to the UnorderedHandler, in that it presents an interface with which to build a wide variety of objects with distributed state. The CausalHandler is different from the Unordered in two ways: 1. The send() method of an CausalHandler returns an index, which must be stored by the CausalObject in connection with the information that was sent. This index is a universal, fully-ordered, strictly causal identifier for each message. 2. A CausalObject's receive_message method takes two arguments: the message and its index. As a convenience, there is also 3. A get_index() method, which provides a new index on each call, always higher than all previous indexes. CausalObjects are responsible for including index information in the return value of get_history, and processing index information in add_history. It is noteworthy that CausalHandler is in fact implemented on _top_ of UnorderedHandler. The imposition of ordering does not require lower-level access to the network. This fact of implementation may change in the future, but CausalObjects will not be able to tell the difference. """ ZERO_INDEX = (0,0) def __init__(self, name, tube_box): self._myname = name self._tube_box = tube_box self._unordered = UnorderedHandler(name, tube_box) self._counter = 0 self._copies = [] self.object = None def register(self, obj): self.object = obj self._unordered.register(self) def get_index(self): """get_index returns a new index, higher than all previous indexes. The primary reason to use get_index is if you wish two know the index of an item _before_ calling send()""" self._counter += 1 return (self._counter, random.getrandbits(64)) def index_trans(self, index, pack): """index_trans is a standard serialization translator for the index format. Thanks to this translator, a CausalObject can and should treat each index as an opaque, comparable object.""" if pack: return dbus.Struct((dbus.UInt64(index[0]), dbus.UInt64(index[1])), signature='tt') else: return (int(index[0]), int(index[1])) def send(self, msg, index=None): """send() broadcasts a message to all other participants. If called with one argument, send() broadcasts that message, along with a new index, and returns the index. If called with two arguments, the second may be an index, which will be used for this message. The index must have been acquired using get_index(). In this case, the index must be acquired immediately prior to calling send(). Otherwise, another message may arrive in the interim, causing a violation of causality.""" if index is None: index = self.get_index() self._unordered.send(dbus.Struct((msg, self.index_trans(index, True)))) return index def receive_message(self, msg): m = msg[0] index = self.index_trans(msg[1], False) self._counter = max(self._counter, index[0]) self.object.receive_message(m, index) def add_history(self, hist): h = hist[0] index = self.index_trans(hist[1], False) self._counter = max(self._counter, index[0]) self.object.add_history(h) def get_history(self): h = self.object.get_history() hist = dbus.Struct((h, self.index_trans(self.get_index(), True))) return def copy(self, name): """A convenience function for returning a new CausalHandler derived from this one, with a new name. This is safe as long as copy() is called with a different name every time.""" h = CausalHandler(self._myname + "/" + name, self._tube_box) self._copies.append(h) return h def get_copies(self): return self._copies def get_name(self): return self._myname class CausalHandlerAcceptor(HandlerAcceptor): HANDLER_TYPE = CausalHandler def set_handler(self, handler): raise NotImplementedError class CausalObject(CausalHandlerAcceptor): """A CausalObject is almost precisely like an UnorderedObject, except that whereas an UnorderedObject is completely specified by a set of messages, a CausalObject is completely specified by an ordered list of messages, sorted according to an opaque index associated with each message. This index must be monotonically increasing in time for new messages as they are created, but old messages may arrive long after they were created, and are then inserted into the middle of the timestream. The following code is an abstract class for CausalObject, serving primarily as documentation for the concept. """ handler = None def set_handler(self, handler): """Each CO must accept a CausalHandler via set_handler. Subclasses may override this method if they wish to perform more actions when a handler is set.""" if self.handler: raise else: self.handler = handler self.handler.register(self) def receive_message(self, msg, index): """This method accepts and processes a message sent via handler.send(). Because objects are sent over DBus, it is advisable to DBus-ify the message before calling send, and de-DBus-ify it inside receive_message. The index argument is an opaque index used for determining the ordering.""" raise NotImplementedError def get_history(self): """This method returns an encoded copy of all non-obsolete state, ready to be sent over DBus.""" raise NotImplementedError def add_history(self, state): """This method accepts and processes the state object returned by get_history()""" raise NotImplementedError class CausalDict(CausalObject): """NOTE: CausalDict is UNTESTED. Other things may be buggy, but CausalDict PROBABLY DOES NOT WORK. A CausalDict WILL NOT WORK UNTIL set_handler IS CALLED. CausalDict is a distributed version of a Dict (hash table). All users keep a copy of the entire table, so this is not a "Distributed Hash Table" according to the terminology of the field. CausalDict permits all Dict operations, including removing keys and modifying the value of existing keys. This would not be possible using an Unordered approach, because two value assignments to the same key could arrive in different orders for different users, leaving them in different states at quiescence. To solve this problem, every assignment and removal is given a monotonically increasing unique index, and whenever there is a conflict, the higher-index operation wins. One side effect of this design is that deleted keys cannot be forgotten. If an assignment operation is received whose index is lower than the deletion's, then that assignment is considered obsolete and must not be executed. To provide a mechanism for reducing memory usage, the clear() method has been interpreted to remove not only all entries received so far, but also all entries that will ever be received with index less than the current index. """ ADD = 0 DELETE = 1 CLEAR = 2 def __init__(self, initdict=(), key_translator=empty_translator, value_translator=empty_translator): self._dict = dict(initdict) self._listeners = [] self._key_trans = key_translator self._val_trans = value_translator self.__contains__ = self._dict.__contains__ #Special __delitem__ self.__eq__ = self._dict.__eq__ self.__ge__ = self._dict.__ge__ self.__getitem__ = self._dict.__getitem__ self.__gt__ = self._dict.__gt__ self.__le__ = self._dict.__le__ self.__len__ = self._dict.__len__ self.__lt__ = self._dict.__lt__ self.__ne__ = self._dict.__ne__ # special __setitem__ #Special clear self.copy = self._dict.copy self.get = self._dict.get self.has_key = self._dict.has_key self.items = self._dict.items self.iteritems = self._dict.iteritems self.iterkeys = self._dict.iterkeys self.itervalues = self._dict.itervalues self.keys = self._dict.keys #Special pop #Special popitem #special setdefault #special update self.values = self._dict.values def set_handler(self, handler): if self.handler is not None: raise else: self.handler = handler self._clear = self.handler.get_index() #this must happen before index_dict initialization, so that self._clear is less than any index in index_dict self._index_dict = dict(((k, self.handler.get_index()) for k in self._dict)) self.handler.register(self) def __delitem__(self, key): """Same as for dict""" del self._dict[key] n = self.handler.send(((dbus.Int32(CausalDict.DELETE), self._key_trans(key, True)))) self._index_dict[key] = n def __setitem__(self, key, value): """Same as for dict""" self._dict[key] = value n = self.handler.send(dbus.Array([(dbus.Int32(CausalDict.ADD), self._key_trans(key, True), self._val_trans(value, True))])) self._index_dict[key] = n def clear(self): """Same as for dict""" self._dict.clear() self._index_dict.clear() n = self.handler.send(dbus.Array([(dbus.Int32(CausalDict.CLEAR))])) self._clear = n def pop(self, key, x=None): """Same as for dict""" t = (key in self._dict) if x is None: r = self._dict.pop(key) else: r = self._dict.pop(key, x) if t: n = self.handler.send(dbus.Array([(dbus.Int32(CausalDict.DELETE), self._key_trans(key, True))])) self._index_dict[key] = n return r def popitem(self): """Same as for dict""" p = self._dict.popitem() key = p[0] n = self.handler.send(dbus.Array([(dbus.Int32(CausalDict.DELETE), self._key_trans(key, True))])) self._index_dict[key] = n return p def setdefault(self, key, x): """Same as for dict""" if key not in self._dict: self._dict[key] = x n = self.handler.send(dbus.Array([(dbus.Int32(CausalDict.ADD), self._key_trans(key, True), self._val_trans(value, True))])) self._index_dict[key] = n def update(*args,**kargs): """Same as for dict""" d = dict() d.update(*args,**kargs) newpairs = [] for p in d.items(): if (p[0] not in self._dict) or (self._dict[p[0]] != p[1]): newpairs.append(p) self._dict[p[0]] = p[1] n = self.handler.send(dbus.Array([(dbus.Int32(CausalDict.ADD), self._key_trans(p[0], True), self._val_trans(p[1], True)) for p in newpairs])) for p in newpairs: self._index_dict[p[0]] = n def receive_message(self, msg, n): if n > self._clear: a = dict() r = dict() for m in msg: flag = int(m[0]) #don't know length of m without checking flag if flag == CausalDict.ADD: key = self._key_trans(m[1], False) if (key not in self._index_dict) or (self._index_dict[key] < n): val = self._val_trans(m[2], False) if key in self._dict: r[key] = self._dict[key] self._dict[key] = val a[key] = val self._index_dict[key] = n elif flag == CausalDict.DELETE: key = self._key_trans(m[1], False) if key not in self._index_dict: self._index_dict[key] = n elif (self._index_dict[key] < n): self._index_dict[key] = n if key in self._dict: r[key] = self._dict[key] del self._dict[key] elif flag == CausalDict.CLEAR: self._clear = n for (k, ind) in self._index_dict.items(): if ind < self._clear: del self._index_dict[k] if k in self._dict: r[k] = self._dict[k] del self._dict[k] if (len(a) > 0) or (len(r) > 0): self._trigger(a,r) def get_history(self): c = self.handler.index_trans(self._clear, True) d = dbus.Array([(self._key_trans(p[0], True), self._val_trans(p[1], True)) for p in self._dict.items()]) i = dbus.Array([(self._key_trans(p[0], True), self.handler.index_trans(p[1], True)) for p in self._index_dict.items()]) return dbus.Struct((c,d,i),signature='itt') def add_history(self, hist): c = self.handler.index_trans(hist[0], False) d = dict(((self._key_trans(p[0], False), self._val_trans(p[1], False)) for p in hist[1])) i = [(self._key_trans(p[0], False), self.handler.index_trans(p[1], False)) for p in hist[2]] a = dict() r = dict() if c > self._clear: self._clear = c for (k, n) in self._index_dict.items(): if n < self._clear: del self._index_dict[k] if k in self._dict: r[k] = self._dict[k] del self._dict[k] k_changed = [] for (k, n) in i: if (((k not in self._index_dict) and (n > self._clear)) or ((k in self._index_dict) and (n > self._index_dict[k]))): k_changed.append(k) self._index_dict[k] = n for k in k_changed: if k in d: if (k in self._dict) and (self._dict[k] != d[k]): r[k] = self._dict[k] a[k] = d[k] elif k not in self._dict: a[k] = d[k] self._dict[k] = d[k] else: if k in self._dict: r[k] = self._dict[k] del self._dict[k] if (len(a) > 0) or (len(r) > 0): self._trigger(a,r) def register_listener(self, L): """Register a change-listener L. Whenever another user makes a change to this dict, L will be called with L(dict_added, dict_removed). The two arguments are the dict of new entries, and the dict of entries that have been deleted or overwritten.""" self._listeners.append(L) L(self._dict.copy(), dict()) def _trigger(self, added, removed): for L in self._listeners: L(added, removed) class UserDict(dbus.gobject_service.ExportedGObject): IFACE = "org.dobject.UserDict" BASEPATH = "/org/dobject/UserDict/" def __init__(self, name, tubebox, myval, translator = empty_translator): self._myname = name self.PATH = UserDict.BASEPATH + name dbus.gobject_service.ExportedGObject.__init__(self) self._logger = logging.getLogger(self.PATH) self._tube_box = tube_box self.tube = None self._dict = dict() self._myval = myval self._trans = translator self._tube_box.register_listener(self.set_tube) self.__contains__ = self._dict.__contains__ #No __delitem__ self.__eq__ = self._dict.__eq__ self.__ge__ = self._dict.__ge__ self.__getitem__ = self._dict.__getitem__ self.__gt__ = self._dict.__gt__ self.__le__ = self._dict.__le__ self.__len__ = self._dict.__len__ self.__lt__ = self._dict.__lt__ self.__ne__ = self._dict.__ne__ #No __setitem__ #No clear self.copy = self._dict.copy self.get = self._dict.get self.has_key = self._dict.has_key self.items = self._dict.items self.iteritems = self._dict.iteritems self.iterkeys = self._dict.iterkeys self.itervalues = self._dict.itervalues self.keys = self._dict.keys #No pop #No popitem #No setdefault #No update self.values = self._dict.values def set_tube(self, tube, is_initiator): """Callback for the TubeBox""" self.tube = tube self.add_to_connection(self.tube, self.PATH) self.tube.add_signal_receiver(self.receive_value, signal_name='send_value', dbus_interface=UserDict.IFACE, sender_keyword='sender', path=self.PATH) self.tube.add_signal_receiver(self.tell_value, signal_name='ask_values', dbus_interface=UserDict.IFACE, sender_keyword='sender', path=self.PATH) self.tube.watch_participants(self.members_changed) #Alternative implementation of members_changed (not yet working) #self.tube.add_signal_receiver(self.members_changed, signal_name="MembersChanged", dbus_interface="org.freedesktop.Telepathy.Channel.Interface.Group") self.ask_values() def get_path(self): """Returns the DBus path of this handler. The path is the closest thing to a unique identifier for each abstract DObject.""" return self.PATH def get_tube(self): """Returns the TubeBox used to create this handler. This method is necessary if one DObject wishes to create another.""" return self._tube_box @dbus.service.signal(dbus_interface=IFACE, signature='v') def send_value(self, value): """This method broadcasts message to all other handlers for this UO""" return @dbus.service.signal(dbus_interface=IFACE, signature='') def ask_values(self): return def tell_value(self, sender=None): self._logger.debug("tell_history to " + str(sender)) try: if sender == self.tube.get_unique_name(): return remote = self.tube.get_object(sender, self.PATH) remote.receive_value(self._myval, sender_keyword='sender', reply_handler=PassFunction, error_handler=PassFunction) finally: return @dbus.service.method(dbus_interface=IFACE, in_signature = 'v', out_signature='', sender_keyword = 'sender') def receive_value(self, value, sender=None): self._dict[sender] = self._trans(value, False) #Alternative implementation of a members_changed (not yet working) """ def members_changed(self, message, added, removed, local_pending, remote_pending, actor, reason): added_names = self.tube.InspectHandles(telepathy.CONNECTION_HANDLE_TYPE_LIST, added) for name in added_names: self.tell_history(name) """ def members_changed(self, added, removed): self._logger.debug("members_changed") for (handle, name) in removed: if name in self._dict: del self._dict[name] for (handle, name) in added: self.tell_value(sender=name) class UnorderedString(UnorderedObject): def __init__(self,initstring=''): self._tree = stringtree.SimpleStringTree() self._listeners = [] self._newbuffer = [] if initstring: self.insert(initstring, 0) def insert(self, text, pos): x = self._tree.insert(text,pos) if self.handler is not None: self.handler.send(dbus.Array(stringtree.translator(i,True) for i in x)) def delete(self, k, n): x = self._tree.delete(k,n) if self.handler is not None: self.handler.send(dbus.Array(stringtree.translator(i,True) for i in x)) def _net_update(self, L): transformed_list = [] self._newbuffer.append(L) for li in self._newbuffer[::-1]: if self._tree.is_ready(li[0]): #each update from the net is required to #obey the rule that if the tree is ready for the first Change, #then it is ready for all the changes. This may be a sort of #violation of the Unordered abstraction... for c in li: transformed_list.extend(self._tree.add_change(c)) self._newbuffer.pop() #Having handled the contents of li, we #should make sure it doesn't come up for consideration again self._trigger(transformed_list) def get_history(self): return dbus.Array((stringtree.translator(c, True) for c in self._tree.get_changes()), signature = 'v') def add_history(self, msg): L = [] for el in msg: change = stringtree.translator(el, False) if change.unique_id not in self._tree._id2rec: L.append(change) if L: self._net_update(L) receive_message = add_history def register_listener(self, L): """Register a listener L(editlist). Every time another user modifies the string, L will be called with a set of edits that represent those changes on the local version of the string. Note that the edits must be performed in order.""" self._listeners.append(L) def _trigger(self, editlist): for L in self._listeners: L(editlist) class CausalTree(CausalObject): #SET_PARENT and DELETE_NODE are opcodes to be sent over the wire, and also #to the trigger. MAJOR_CHANGE is sent only to the trigger, and it is not #an opcode. It represents a significant but undefined changed in the tree. SET_PARENT = 0 DELETE_NODE = 1 CLEAR = 2 MAJOR_CHANGE = -1 ROOT = 0 def __init__(self): self._timeline = ListSet() self._reverse = {} self._listeners = [] self._reset() def _reset(self): self._parent = {} self._children = {self.ROOT:set()} def __contains__(self, node): return node in self._children def get_parent(self,node): if node == self.ROOT: return self.ROOT else: return self._parent[node] def get_children(self, node): return frozenset(self._children[node]) def _process_local_cmd(self,cmd): i = self.handler.get_index() self._timeline.add((i,cmd)) rev = self._step(cmd) self._reverse[(i,cmd)] = rev self.handler.send(self._cmd_trans(cmd,True),i) def change_parent(self,node,newparent): if (node in self._parent) and (newparent in self._children): if self._parent[node] != newparent: cmd = (self.SET_PARENT, node, newparent) self._process_local_cmd(cmd) else: raise KeyError("One or both nodes is not present") def new_child(self,parent): node = random.getrandbits(64) cmd = (self.SET_PARENT, node, parent) self._process_local_cmd(cmd) return node def delete(self,node): if node == self.ROOT: raise KeyError("You cannot delete the root node.") if node not in self._children: raise KeyError("No such node.") cmd = (self.DELETE_NODE, node) self._process_local_cmd(cmd) def clear(self): cmd = (self.CLEAR,) self._process_local_cmd(cmd) def _step(self, cmd): # Returns () if the command failed or had no effect # If the command succeeded, returns an iterable of the commands necessary # to undo this command if cmd[0] == self.SET_PARENT: if cmd[2] in self._children: #if newparent is known if cmd[1] in self._parent: #if node is known if self._parent[cmd[1]] == cmd[2]: return () #No change necessary. This SET_PARENT is redundant if cmd[1] in self._allparents(cmd[2]): #if node is above newparent #This command would create a loop. It is therefore illegal #and should be ignored return () else: #remove node from under its current parent oldp = self._parent[cmd[1]] self._children[oldp].remove(cmd[1]) self._children[cmd[2]].add(cmd[1]) self._parent[cmd[1]] = cmd[2] return ((self.SET_PARENT, cmd[1], oldp),) else: #Node is unknown, so it must be added self._children[cmd[1]] = set() self._children[cmd[2]].add(cmd[1]) self._parent[cmd[1]] = cmd[2] return ((self.DELETE_NODE, cmd[1]),) #the command executed successfully else: #The new parent is unknown, so the command is illegal and should #be ignored. return () elif cmd[0] == self.DELETE_NODE: if cmd[1] == self.ROOT: #Deleting the root node is not allowed, so this command is illegal and should be ignored return () if cmd[1] in self._children: p = self._parent[cmd[1]] self._children[p].remove(cmd[1]) cmds = [(self.SET_PARENT, cmd[1], p)] for c in self._children[cmd[1]]: self._children[p].add(c) self._parent[c] = p cmds.append((self.SET_PARENT,c,cmd[1])) del self._children[cmd[1]] del self._parent[cmd[1]] return cmds #The command completed successfully else: #cmd[1] is an unknown node, so this command should be ignored return () elif cmd[0] == self.CLEAR: deleted = self._parent.keys() #relies on self.ROOT not being in _parent cmds = [] stack = [self.ROOT] while len(stack) > 0: n = stack.pop() for c in self._children[n]: cmds.append((self.SET_PARENT, c, n)) stack.append(c) self._reset() return cmds def _allparents(self, node): s = set() while node != self.ROOT: s.add(node) node = self._parent[node] s.add(self.ROOT) return s def _cmd_trans(self,cmd,pack): #This code does not completely specify the dbus typing because it avoids #calling dbus.Struct. The tuple will be introspected. if len(cmd) == 1: #CLEAR return (self._instruction_trans(cmd[0],pack),) if len(cmd) == 2: #DELETE_NODE return (self._instruction_trans(cmd[0],pack), self.node_trans(cmd[1],pack)) elif len(cmd) == 3: #SET_PARENT return (self._instruction_trans(cmd[0],pack), self.node_trans(cmd[1],pack), self.node_trans(cmd[2],pack)) def _instruction_trans(self,ins,pack): return int_translator(ins,pack) def node_trans(self,node,pack): return uint_translator(node,pack) def register_listener(self, L): self._listeners.append(L) def receive_message(self, cmd, i): cmd = self._cmd_trans(cmd,False) elt = (i, cmd) if elt > self._timeline.last(): self._timeline.add(elt) s = self._step(cmd) self._reverse[elt] = s if s: self._trigger((cmd,),s) else: (forward, reverse) = self._antestep((elt,)) if forward: self._trigger(forward, reverse) def _antestep(self, elts): #_antestep accepts an iterable of (i, cmd)s that may have # occurred at previous times. It incorporates these changes into the # timeline and state. It also returns a two-element tuple: # a list of cmds that would have the same effect as the inclusion of elts, and a # list of cmds that would reverse this effect. newelts = [e for e in elts if e not in self._timeline] if len(newelts) == 0: return (False, False) affected = [e for e in self._timeline.tailset(newelts[0]) if self._reverse[e]] rollback = [] for l in affected[::-1]: rollback.extend(self._reverse[l]) for cmd in rollback: self._step(cmd) # We have now rolled back to the point where newelts[0] is inserted self._timeline.update(newelts) new_effective = [] reversers = [] for (i,cmd) in self._timeline.tailset(newelts[0]): rev = self._step(cmd) self._reverse[(i,cmd)] = rev if rev: #If the command had any effect reversers.append(rev) new_effective.append(cmd) reversers.reverse() reversenew = [] for l in reversers: reversenew.extend(l) forward = rollback forward.extend(new_effective) reverse = reversenew reverse.extend(affected) return (forward, reverse) #This implementation is extremely suboptimal. An ideal implementation #would use some knowledge about the commutativity of different commands #to shorten forward and reverse substantially. As is, they will likely #contain mostly redundant undo-and-then-redo. def get_history(self): return dbus.Array( (self.handler.index_trans(i,True), self._cmd_trans(cmd,True)) for (i,cmd) in self._timeline) def add_history(self,h): elts = ((self.handler.index_trans(i,False), self._cmd_trans(cmd,False)) for (i,cmd) in h) (forward, reverse) = self._antestep(elts) if forward: self._trigger(forward, reverse) def _trigger(self, info): # info is either (added, removed, affected) if that info is available, # or False if there has been a change but no info is available for L in self._listeners: L(info) Pippy-71/groupthink/gtk_tools.py000066400000000000000000000313141311421132100171440ustar00rootroot00000000000000from gi.repository import Gtk import groupthink_base as groupthink import logging import stringtree class RecentEntry(groupthink.UnorderedHandlerAcceptor, Gtk.Entry): """RecentEntry is an extension of Gtk.Entry that, when attached to a group, creates a unified Entry field for all participants""" def __init__(self, *args, **kargs): GObject.GObject.__init__(self, *args, **kargs) self.logger = logging.getLogger('RecentEntry') self.add_events(Gdk.EventMask.PROPERTY_CHANGE_MASK) self._text_changed_handler = self.connect('changed', self._local_change_cb) self._recent = groupthink.Recentest(self.get_text(), groupthink.string_translator) self._recent.register_listener(self._remote_change_cb) def _local_change_cb(self, widget): self.logger.debug("_local_change_cb()") self._recent.set_value(self.get_text()) def set_handler(self, handler): self.logger.debug("set_handler") self._recent.set_handler(handler) def _remote_change_cb(self, text): self.logger.debug("_remote_change_cb(%s)" % text) if self.get_text() != text: #The following code will break if running in any thread other than #the main thread. I do not know how to make code that works with #both multithreaded gtk _and_ single-threaded Gtk. self.handler_block(self._text_changed_handler) self.set_text(text) self.handler_unblock(self._text_changed_handler) class SharedTreeStore(groupthink.CausalHandlerAcceptor, Gtk.TreeStore): def __init__(self, columntypes=(), translators=()): self._columntypes = columntypes self._causaltree = groupthink.CausalTree() if len(translators) != 0 and len(translators) != len(columntypes): raise #Error: translators must be empty or match columntypes in length if len(translators) == len(self._columntypes): self._columndicts = [groupthink.CausalDict( key_translator = self._causaltree.node_trans, value_translator = translators[i]) for i in xrange(len(translators))] else: self._columndicts = [groupthink.CausalDict( key_translator = self._causaltree.node_trans) for i in xrange(len(translators))] self._causaltree.register_listener(self._tree_listener) for i in xrange(len(self._columndicts)): self._columndicts[i].register_listener(self._generate_dictlistener(i)) def set_handler(self, handler): self._causaltree.set_handler(handler) for i in xrange(len(self._columndicts)): #Make a new handler for each columndict #Not very future-proof: how do we serialize out and reconstitute #objects that GroupActivity.cloud is not even aware of? h = handler.copy(str(i)) self._columndicts[i].set_handler(h) ### Methods necessary to implement Gtk.GenericTreeModel ### def on_get_flags(self): return Gtk.TREE_MODEL_ITERS_PERSIST def on_get_n_columns(self): return len(self._columntypes) def on_get_column_type(self, index): return self._columntypes[index] def on_get_iter(self, path): node = self._causaltree.ROOT for k in path: c = list(self._causaltree.get_children(node)) if len(c) <= k: return None #Invalid path else: c.sort() node = c[k] return node def on_get_path(self, rowref): revpath = [] node = rowref if rowref in self._causaltree: while node != self._causaltree.ROOT: p = self._causaltree.get_parent(node) c = list(self._causaltree.get_children(p)) c.sort() revpath.append(c.index(node)) # could be done "faster" using bisect node = p return tuple(revpath[::-1]) else: return None def on_get_value(self, rowref, column): return self._columndicts[column][rowref] def on_iter_next(self, rowref): p = self._causaltree.get_parent(rowref) c = list(self._causaltree.get_children(p)) c.sort() i = c.index(rowref) + 1 if i < len(c): return c[i] else: return None def on_iter_children(self, parent): if parent is None: parent = self._causaltree.ROOT c = self._causaltree.get_children(parent) if len(c) > 0: return min(c) else: return None def on_iter_has_child(self, rowref): return len(self._causaltree.get_children(rowref)) > 0 def on_iter_n_children(self, rowref): return len(self._causaltree.get_children(rowref)) def on_iter_nth_child(self, parent, n): if parent is None: parent = self._causaltree.ROOT c = self._causaltree.get_children(parent) if len(c) > n: c = list(c) c.sort() return c[n] else: return None def on_iter_parent(self, child): p = self._causaltree.get_parent(child) if p == self._causaltree.ROOT: return None else: return p ### Methods for passing changes from remote users ### def _dict_listener(self, i, added, removed): s = set() s.update(added.keys()) s.update(removed.keys()) for node in s: path = self.on_get_path(node) if path is not None: it = self.create_tree_iter(node) self.row_changed(path, it) self.emit('changed') def _generate_dict_listener(self, i): def temp(added,removed): self._dict_listener(i,added,removed) return temp def _tree_listener(self, forward, reverse): #forward is the list of commands representing the change, and #reverse is the list representing their inverse. Together, these #lists represent a total description of the change. However, deriving #sufficient information to fill in the signals would require replicating #the entire CausalTree state machine. Therefore, for the moment, we make only a modest #attempt, and if it fails, throw up an "unknown-change" flag deleted = set() #unused, since we can only safely handle a single deletion with this method haschild = set() #All signals may be sent spuriously, but this one especially so inserted = set() unknown_change = False # no reordered, since there is no ordering choice for cmd in forward: if cmd[0] == self._causaltree.SET_PARENT: if cmd[2] in self._causaltree: haschild.add(cmd[2]) else: unknown_change = True if cmd[1] in self._causaltree: inserted.add(cmd[1]) else: unknown_change = True for cmd in reverse: clean = True if cmd[0] == self._causaltree.SET_PARENT: if (clean and cmd[2] in self._causaltree and (cmd[1] not in self._causaltree or cmd[2] != self._causaltree.get_parent(cmd[1]))): clean = False haschild.add((cmd[2], cmd[1])) c = self._causaltree.get_children(cmd[2]) c = list(c) c.append(cmd[1]) c.sort() i = c.index(cmd[1]) p = self.on_get_path(cmd[2]) p = list(p) p.append(i) p = tuple(p) self.row_deleted(p) else: unknown_change = True if unknown_change: self.emit('unknown-change') for node in inserted: path = self.on_get_path(node) if path is not None: it = self.create_tree_iter(node) self.row_inserted(path, it) for node in haschild: path = self.on_get_path(node) if path is not None: it = self.create_tree_iter(node) self.row_has_child_toggled(path, it) self.emit('changed') ### Methods for resembling Gtk.TreeStore ### def set_value(self, it, column, value): node = self.get_user_data(it) self._columndicts[i][node] = value def set(self, it, *args): for i in xrange(0,len(args),2): self.set_value(it,args[i],args[i+1]) def remove(self, it): node = self.get_user_data(it) self._causaltree.delete(node) for d in self._columndicts: if node in d: del d[node] def append(self, parent, row=None): if parent is not None: node = self.get_user_data(it) else: node = self._causaltree.ROOT node = self._causaltree.new_child(node) if row is not None: if len(row) != len(columndicts): raise IndexError("row had the wrong length") else: for i in xrange(len(row)): self._columndicts[i][node] = row[i] return self.create_tree_iter(node) def is_ancestor(self, it, descendant): node = self.get_user_data(it) d = self.get_user_data(descendant) d = self._causaltree.get_parent(d) while d != self._causaltree.ROOT: if d == node: return True else: d = self._causaltree.get_parent(d) return False def iter_depth(self, it): node = self.get_user_data(it) i = 0 node = self._causaltree.get_parent(node) while node != self._causaltree.ROOT: i = i + 1 node = self._causaltree.get_parent(node) return i def clear(self): self._causaltree.clear() for d in self._columndicts: d.clear() def iter_is_valid(self, it): node = self.get_user_data(it) return node in self._causaltree ### Additional Methods ### def move(self, it, newparent): node = self.get_user_data(row) p = self.get_user_data(newparent) self._causaltree.change_parent(node,p) class TextBufferUnorderedStringLinker: def __init__(self,tb,us): self._tb = tb self._us = us self._us.register_listener(self._netupdate_cb) self._insert_handler = tb.connect('insert-text', self._insert_cb) self._delete_handler = tb.connect('delete-range', self._delete_cb) self._logger = logging.getLogger('the Linker') def _insert_cb(self, tb, itr, text, length): self._logger.debug('user insert: %s' % text) pos = itr.get_offset() self._us.insert(text,pos) def _delete_cb(self, tb, start_itr, end_itr): self._logger.debug('user delete') k = start_itr.get_offset() n = end_itr.get_offset()-k self._us.delete(k,n) def _netupdate_cb(self, edits): self._logger.debug('update from network: %s' % str(edits)) self._tb.handler_block(self._insert_handler) self._tb.handler_block(self._delete_handler) for e in edits: if isinstance(e, stringtree.Insertion): itr = self._tb.get_iter_at_offset(e.position) self._tb.insert(itr, e.text) elif isinstance(e, stringtree.Deletion): itr1 = self._tb.get_iter_at_offset(e.position) itr2 = self._tb.get_iter_at_offset(e.position + e.length) self._tb.delete(itr1,itr2) self._tb.handler_unblock(self._insert_handler) self._tb.handler_unblock(self._delete_handler) class TextBufferSharePoint(groupthink.UnorderedHandlerAcceptor): def __init__(self, buff): self._us = groupthink.UnorderedString(buff.get_text(buff.get_start_iter(), buff.get_end_iter(), True)) self._linker = TextBufferUnorderedStringLinker(buff, self._us) def set_handler(self, handler): self._us.set_handler(handler) class SharedTextView(groupthink.UnorderedHandlerAcceptor, Gtk.TextView): def __init__(self, *args, **kargs): GObject.GObject.__init__(self, *args, **kargs) self._link = TextBufferSharePoint(self.get_buffer()) def set_handler(self, handler): self._link.set_handler(handler) Pippy-71/groupthink/listset.py000066400000000000000000000565771311421132100166500ustar00rootroot00000000000000""" Copyright 2008 Benjamin M. Schwartz This file is LGPLv2+. listset.py is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. DObject 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 Lesser General Public License along with DObject. If not, see . """ import bisect from collections import defaultdict """ dobject_helpers is a collection of functions and data structures that are useful to DObject, but are not specific to DBus or networked applications. """ def merge(a, b, l=True, g=True, e=True): """Internal helper function for combining sets represented as sorted lists""" x = 0 X = len(a) if X == 0: if g: return list(b) else: return [] y = 0 Y = len(b) if Y == 0: if l: return list(a) else: return [] out = [] p = a[x] q = b[y] while x < X and y < Y: if p < q: if l: out.append(p) x += 1 if x < X: p = a[x] elif p > q: if g: out.append(q) y += 1 if y < Y: q = b[y] else: if e: out.append(p) x += 1 if x < X: p = a[x] y += 1 if y < Y: q = b[y] if x < X: if l: out.extend(a[x:]) else: if g: out.extend(b[y:]) return out def merge_or(a,b): return merge(a,b, True, True, True) def merge_xor(a,b): return merge(a, b, True, True, False) def merge_and(a,b): return merge(a, b, False, False, True) def merge_sub(a,b): return merge(a, b, True, False, False) def kill_dupes(a): #assumes a is sorted """Internal helper function for removing duplicates in a sorted list""" prev = a[0] out = [prev] for item in a: if item != prev: #always throws out item 0, but that's ok out.append(item) prev = item return out class Comparable: """Currently, ListSet does not provide a mechanism for specifying a comparator. Users who would like to specify a comparator other than the one native to the item may do so by wrapping the item in a Comparable. """ def __init__(self, item, comparator): self.item = item self._cmp = comparator def __cmp__(self, other): return self._cmp(self.item, other) class ListSet: """ListSet is a sorted set for comparable items. It is inspired by the Java Standard Library's TreeSet. However, it is implemented by a sorted list. This implementation is much slower than a balanced binary tree, but has the distinct advantage that I can actually implement it. The methods of ListSet are all drawn directly from Python's set API, Python's list API, and Java's SortedSet API. """ def __init__(self, seq=[]): L = list(seq) if len(L) > 1: L.sort() L = kill_dupes(L) self._list = L def __and__(self, someset): if isinstance(someset, ListSet): L = merge_and(self._list, someset._list) else: L = [] for x in self._list: if x in someset: L.append(x) a = ListSet() a._list = L return a def __contains__(self, item): if not self._list: return False if self._list[0] <= item <= self._list[-1]: a = bisect.bisect_left(self._list, item) return item == self._list[a] else: return False def __eq__(self, someset): if isinstance(someset, ListSet): return self._list == someset._list else: return len(self.symmetric_difference(someset)) == 0 def __ge__(self, someset): if isinstance(someset, ListSet): return len(merge_or(self._list, someset._list)) == len(self._list) else: a = len(someset) k = 0 for i in self._list: if i in someset: k += 1 return k == a def __gt__(self, someset): return (len(self) > len(someset)) and (self >= someset) def __iand__(self, someset): if isinstance(someset, ListSet): self._list = merge_and(self._list, someset._list) else: L = [] for i in self._list: if i in someset: L.append(i) self._list = L return self def __ior__(self, someset): if isinstance(someset, ListSet): self._list = merge_or(self._list, someset._list) else: self.update(someset) return self def __isub__(self, someset): if isinstance(someset, ListSet): self._list = merge_sub(self._list, someset._list) else: L = [] for i in self._list: if i not in someset: L.append(i) self._list = L return self def __iter__(self): return iter(self._list) def __ixor__(self, someset): if isinstance(someset, ListSet): self._list = merge_xor(self._list, someset._list) else: self.symmetric_difference_update(someset) return self def __le__(self, someset): if isinstance(someset, ListSet): return len(merge_or(self._list, someset._list)) == len(someset._list) else: for i in self._list: if i not in someset: return False return True def __lt__(self, someset): return (len(self) < len(someset)) and (self <= someset) def __ne__(self, someset): return not (self == someset) def __len__(self): return len(self._list) def __nonzero__(self): #ugly, but faster than bool(self_list) return not not self._list def __or__(self, someset): a = ListSet() if isinstance(someset, ListSet): a._list = merge_or(self._list, someset._list) else: a._list = self._list a.update(someset) return a __rand__ = __and__ def __repr__(self): return "ListSet(" + repr(self._list) +")" __ror__ = __or__ def __rsub__(self, someset): if isinstance(someset, ListSet): a = ListSet() a._list = merge_sub(someset._list, self._list) else: a = ListSet(someset) a._list = merge_sub(a._list, self._list) return a def __sub__(self, someset): a = ListSet() if isinstance(someset, ListSet): a._list = merge_sub(self._list, someset._list) else: L = [] for i in self._list: if i not in someset: L.append(i) a._list = L return a def __xor__(self, someset): if isinstance(someset, ListSet): a = ListSet() a._list = merge_xor(self._list, someset._list) else: a = self.symmetric_difference(someset) return a __rxor__ = __xor__ def add(self, item): a = bisect.bisect_left(self._list, item) if (a == len(self._list)) or (self._list[a] != item): self._list.insert(a, item) def clear(self): self._list = [] def copy(self): a = ListSet() a._list = list(self._list) #shallow copy return a def difference(self, iterable): L = list(iterable) L.sort() a = ListSet() a._list = merge_sub(self._list, kill_dupes(L)) return a def difference_update(self, iterable): L = list(iterable) L.sort() self._list = merge_sub(self._list, kill_dupes(L)) def discard(self, item): if self._list and (item <= self._list[-1]): a = bisect.bisect_left(self._list, item) if self._list[a] == item: self._list.remove(a) def intersection(self, iterable): L = list(iterable) L.sort() a = ListSet() a._list = merge_and(self._list, kill_dupes(L)) def intersection_update(self, iterable): L = list(iterable) L.sort() self._list = merge_and(self._list, kill_dupes(L)) def issuperset(self, iterable): L = list(iterable) L.sort() m = merge_or(self._list, kill_dupes(L)) return len(m) == len(self._list) def issubset(self, iterable): L = list(iterable) L.sort() L = kill_dupes(L) m = merge_or(self._list, L) return len(m) == len(L) def pop(self, i = None): if i == None: return self._list.pop() else: return self._list.pop(i) def remove(self, item): if self._list and (item <= self._list[-1]): a = bisect.bisect_left(self._list, item) if self._list[a] == item: self._list.remove(a) return raise KeyError("Item is not in the set") def symmetric_difference(self, iterable): L = list(iterable) L.sort() a = ListSet() a._list = merge_xor(self._list, kill_dupes(L)) return a def symmetric_difference_update(self, iterable): L = list(iterable) L.sort() self._list = merge_xor(self._list, kill_dupes(L)) def union(self, iterable): L = list(iterable) L.sort() a = ListSet() a._list = merge_or(self._list, kill_dupes(L)) def update(self, iterable): L = list(iterable) L.sort() self._list = merge_or(self._list, kill_dupes(L)) def __getitem__(self, key): if type(key) is int: return self._list[key] elif type(key) is slice: a = ListSet() L = self._list[key] if key.step is not None and key.step < 0: L.reverse() a._list = L return a def __delitem__(self, key): del self._list[key] def index(self, x, i=0, j=-1): if self._list and (x <= self._list[-1]): a = bisect.bisect_left(self._list, x, i, j) if self._list[a] == x: return a raise ValueError("Item not found") def position(self, x, i=0, j=-1): return bisect.bisect_left(self._list, x, i, j) def _subrange(self, x, y, includehead=True, includetail=False, i=0, j=-1): if includehead: a = bisect.bisect_left(self._list, x, i, j) else: a = bisect.bisect_right(self._list, x, i, j) if includetail: b = bisect.bisect_right(self._list, y, a, j) else: b = bisect.bisect_left(self._list, y, a, j) return (a, b) # From Java SortedSet def subset(self, x, y, includehead=True, includetail=False, i=0, j=-1): (a,b) = self._subrange(x, y, includehead, includetail, i, j) s = ListSet() s._list = self._list[a:b] return s def iterslice(self, slic): L = len(self._list) return (self._list[i] for i in xrange(*slic.indices(L))) def subiter(self, x, y, includehead=True, includetail=False, i=0, j=-1): (a,b) = self._subrange(x, y, includehead, includetail, i, j) return (self._list[i] for i in xrange(a,b)) def first(self): return self._list[0] def last(self): return self._list[-1] def headset(self, x, include=False, i=0, j=-1): if include: a = bisect.bisect_right(self._list, x, i, j) else: a = bisect.bisect_left(self._list, x, i, j) return self[:a] def tailset(self, x, include=True, i=0, j=-1): if include: a = bisect.bisect_left(self._list, x, i, j) else: a = bisect.bisect_right(self._list, x, i, j) return self[a:] #From Java's NavigableSet def ceiling(self, x, i=0, j=-1): a = bisect.bisect_left(self._list, x, i, j) return self[a] def floor(self, x, i=0, j=-1): a = bisect.bisect_right(self._list, x, i, j) return self[a-1] def higher(self, x, i=0, j=-1): a = bisect.bisect_right(self._list, x, i, j) return self[a] def lower(self, x, i=0, j=-1): a = bisect.bisect_left(self._list, x, i, j) return self[a-1] class ListDict: """ListDict is a map whose keys are comparable. It is based on ListSet. Its API is drawn from python's defaultdict and Java's SortedMap.""" def __init__(self, *args, **kwargs): self._dict = defaultdict(*args, **kwargs) self._set = ListSet(self._dict) # Dict methods def __copy__(self): return self.copy() def __repr__(self): return 'ListDict({'+', '.join( (': '.join((repr(k), repr(self._dict[k]))) for k in self._set))+'})' def copy(self): D = ListDict() D._dict = self._dict.copy() D._set = self._set.copy() return D def __contains__(self, k): return k in self._dict def __delitem__(self, k): del self._dict[k] self._set.remove(k) def __eq__(self, d): if isinstance(d, ListDict): return self._dict == d._dict else: return self._dict == d def __ge__(self, d): if isinstance(d, ListDict): return self._dict >= d._dict else: return self._dict >= d def __getitem__(self, k): x = self._dict[k] if self._dict.default_factory is not None: self._set.add(k) return x def __gt__(self, d): if isinstance(d, ListDict): return self._dict > d._dict else: return self._dict > d def __hash__(self): return self._dict.__hash__() def __iter__(): return self.iterkeys() def __le__(self, d): if isinstance(d, ListDict): return self._dict <= d._dict else: return self._dict <= d def __len__(self): return len(self._dict) def __lt__(self, d): if isinstance(d, ListDict): return self._dict < d._dict else: return self._dict < d def __ne__(self, d): if isinstance(d, ListDict): return self._dict != d._dict else: return self._dict != d def __nonzero__(self): return not not self._dict def __setitem__(self, k, v): self._dict[k] = v self._set.add(k) def clear(self): self._dict.clear() self._set.clear() def get(self, k, d=None): return self._dict.get(k, d) def has_key(self, k): return self._dict.has_key(k) def items(self, *args, **kwargs): if not (args or kwargs): return [(k, self._dict[k]) for k in self._set] else: return [(k, self._dict[k]) for k in self._set.subiter(*args, **kwargs)] def iteritems(self, *args, **kwargs): if not (args or kwargs): return ((k, self._dict[k]) for k in self._set) else: return ((k, self._dict[k]) for k in self._set.subiter(*args, **kwargs)) def iterkeys(self, *args, **kwargs): if not (args or kwargs): return iter(self._set) else: return self._set.subiter(*args, **kwargs) def itervalues(self, *args, **kwargs): if not (args or kwargs): return (self._dict[k] for k in self._set) else: return (self._dict[k] for k in self._set.subiter(*args, **kwargs)) def keys(self, *args, **kwargs): if not (args or kwargs): return self._set.copy() else: return self._set.subset(*args, **kwargs) def pop(self, *args): present = args[0] in self._dict v_or_d = self._dict.pop(*args) if present: self._set.remove(args[0]) return v_or_d def popitem(self, i = None): if self._dict: k = self._set.pop(i) return (k, self._dict.pop(k)) else: return self._dict.popitem() # Just to raise the appropriate KeyError def setdefault(self, k, x=None): self._set.add(k) return self._dict.setdefault(k, x) def update(self, E, **F): #I'm not sure how to distinguish between dict-like and non-dict-like E if isinstance(E, ListDict): self._set |= E._set self._dict.update(E._dict) else: try: keys = E.keys() self._set.update(keys) self._dict.update(E) except: self._dict.update(E,**F) self._set.update(self._dict) def values(self, *args, **kwargs): if not (args or kwargs): return [self._dict[k] for k in self._set] else: return [self._dict[k] for k in self._set.subiter(*args, **kwargs)] def fromkeys(*args): return ListDict(dict.fromkeys(*args)) #SortedMap methods def firstkey(self): return self._set.first() def lastkey(self): return self._set.last() def headdict(self, k, include=False, i=0, j=-1): return self._copysubdict(self._set.headset(k, include, i, j)) def taildict(self, k, include=True, i=0, j=-1): return self._copysubdict(self._set.tailset(k, include, i, j)) def subdict(self, fromkey, tokey, includehead=True, includetail=False, i=0, j=-1): return self._copysubdict(self._set.subset(fromkey, tokey, includehead, includetail, i, j)) def _copysubdict(self, s): L = ListDict() L._set = s L._dict.default_factory = self._dict.default_factory for k in s: L._dict[k] = self._dict[k] return L #NavigableMap methods def ceilingkey(self, k): return self._set.ceiling(k) def floorkey(self, k): return self._set.floor(k) def higherkey(self, k): return self._set.higher(k) def lowerkey(self, k): return self._set.lower(k) #ListSet methods def index(self, k, i=0, j=-1): return self._set.index(k, i, j) def position(self, k, i=0, j=-1): return self._set.position(k, i, j) def nthkey(self, ind): #ind can be an int or a slice return self._set[ind] def nthvalue(self, ind): if type(ind) is int: return self._dict[self._set[ind]] else: return [self._dict[k] for k in self._set[ind]] def nthdict(self, ind): s = self._set[ind] if type(s) is not ListSet: try: s = ListSet(s) except: s = ListSet((s,)) return self._copysubdict(s) class Overlap1D: """Overlap1D is a structure for determining quickly whether two intervals overlap.""" def __init__(self): # _present is a dict of (position,set(objects)) pairs. Each key is # the leftmost point of an object, and each value is the # set of all objects present at that point self._present = ListDict() # _rightend is a dict of (position,set(objects)). Each key is the # rightmost point of one or more objects, and each value is a set of # only those objects that end at this point. self._rightend = ListDict(set) # _objects is a dict of (object, (left, right)). It remembers where # objects start and stop. self._objects = dict() def add(self, obj, left, right): if (not self._present) or left < self._present.firstkey(): self._present[left] = set((obj,)) elif left not in self._present: # We are adding a new marker to _present. Start with the nearest # marker to the left of the new one. prev = self._present[self._present.lowerkey(left)] # and keep only the objects that are still present at the new # location, i.e. whose rightmost point is further right than # the leftmost point of this new object. We take a closed-left, # open-right convention. newsetgen = (o for o in prev if self._objects[o][1] > left) self._present[left] = set(newsetgen) intermediates = self._present.itervalues(left, right) for s in intermediates: # add the object to each set that is inside its interval s.add(obj) self._objects[obj] = (left,right) self._rightend[right].add(obj) def remove(self, obj): (left, right) = self._objects.pop(obj) intermediates = self._present.itervalues(left, right) for s in intermediates: s.remove(obj) #boolean tests whether self._present[left] is an empty set() if ((not self._present[left]) or (self._present[left] <= self._present[self._present.lowerkey(left)])): del self._present[left] self._rightend[right].remove(obj) if not self._rightend[right]: del self._rightend[right] def overlaps(self, left, right, closed = False): intermediates = self._present.itervalues(left, right) outset = set() for s in intermediates: outset |= s if ((left not in self._present) and self._present and (left > self._present.firstkey())): preleft = self._present.floorkey(left) prev = self._present[preleft] newsetgen = (o for o in prev if self._objects[o][1] > left) outset.update(newsetgen) if closed: if left in self._rightend: outset |= self._rightend[left] if right in self._present: outset |= self.present[right] return outset def collides(self, obj, closed=False): (left, right) = self._objects[obj] return self.overlaps(left, right, closed) def get_interval(self, obj): return self._objects[obj] class Overlap2D: def __init__(self): self._x = Overlap1D() self._y = Overlap1D() def add(self, obj, x1, x2, y1, y2): self._x.add(obj, x1, x2) self._y.add(obj, y1, y2) def remove(self, obj): self._x.remove(obj) self._y.remove(obj) def overlaps(self, x1, x2, y1, y2, closed = False): xset = self._x.overlaps(x1,x2,closed) yset = self._y.overlaps(y1,y2,closed) return xset & yset def collides(self, obj, closed = False): xset = self._x.collides(obj, closed) yset = self._y.collides(obj, closed) return xset & yset def get_rectangle(self, obj): (x1, x2) = self._x.get_interval(obj) (y1, y2) = self._y.get_interval(obj) return (x1, x2, y1, y2) Pippy-71/groupthink/stringtree.py000066400000000000000000000532711311421132100173330ustar00rootroot00000000000000import random random.seed() #Works around some mysterious bug in the Journal or Rainbow that #causes the random number generator to be seeded with the same #constant value if a Journal entry is re-launched from the #Journal. from collections import defaultdict import dbus # We do dbus (de)serialization in this file to minimize abstraction breakage import logging import aatree inf = float('inf') class Change: """Each Change represents a chanage to the StringTree. """ def __init__(self, unique_id, parent, edit): """unique_id is a unique identifier for this Change parent is the unique_id that is affected by this Change. Parent unique_id are always associated with an Insertion edit. edit is an Insertion, Deletion, or Removal. It's what is to be done to the parent""" self.unique_id = unique_id self.parent = parent self.edit = edit def __repr__(self): return "Change(%d, %d, %s)" % (self.unique_id, self.parent, str(self.edit)) class Insertion: """Represents the action of inserting a particular bit of text """ def __init__(self, position, text): """position is the point at which to insert text, in the unmodified coordinates of the parent node (other insertions and deletions to that node do not affect these coordinates) text is the string to insert""" self.position = position self.text = text def __repr__(self): return "Insertion(%d, %s)" % (self.position, self.text) class Deletion: """Represents the deletion of only those characters present in the parent in this range. Characters that have been inserted into the parent by an Insertion are not affected. """ def __init__(self, position, length): """position is the point, in the unmodified coordinates of the parent node, at which to start deletion length is an integer greater than 0 representing the number of characters to delete""" self.position = position self.length = length def __repr__(self): return "Deletion(%d, %d)" % (self.position, self.length) class Removal: """Represents the deletion of all characters ever inserted in this range. Insertions at the endpoints are _not_ included in the Removal, and must be Removed separately. """ def __init__(self, position, length): """position is the point at which to start Removal length is the number of points in the unmodified parent coordinate to the end of the Removal. Note that many more than length characters can be removed if there are Insertions in this range.""" self.position = position self.length = length def __repr__(self): return "Removal(%d, %d)" % (self.position, self.length) class Record: """Each Record is used to store one Change inside the StringTree. The purpose of a Record is contain both the Change itself, and any cached information about the current effect of that Change. """ def __init__(self, change, depth): self.change = change self.depth = depth def __str__(self): return "Record(%s, %d)" % (str(self.change), self.depth) __repr__ = __str__ def flatten(L): o = [] for x in L: if isinstance(x,list): o.extend(flatten(x)) #recursive else: o.append(x) return o def my_rand(): return random.getrandbits(63) def translator(c, pack): if pack: if isinstance(c.edit, Insertion): return dbus.Struct((dbus.Int64(c.unique_id), dbus.Int64(c.parent), dbus.Int16(0), dbus.Int64(c.edit.position), dbus.UTF8String(c.edit.text)), signature='xxnxs') elif isinstance(c.edit, Deletion): return dbus.Struct((dbus.Int64(c.unique_id), dbus.Int64(c.parent), dbus.Int16(1), dbus.Int64(c.edit.position), dbus.Int64(c.edit.length)), signature='xxnxx') elif isinstance(c.edit, Removal): return dbus.Struct((dbus.Int64(c.unique_id), dbus.Int64(c.parent), dbus.Int16(2), dbus.Int64(c.edit.position), dbus.Int64(c.edit.length)), signature='xxnxx') else: raise Unimplemented else: if c[2] == 0: ed = Insertion(int(c[3]),str(c[4])) elif c[2] == 1: ed = Deletion(int(c[3]),int(c[4])) elif c[2] == 2: ed = Removal(int(c[3]),int(c[4])) else: raise "unknown type" return Change(int(c[0]), int(c[1]), ed) class EagerHideList: """EagerHideList provides a list with hidden elements. The standard index considers only the visible elements, but the 'all' index considers all elements. The standard index of an invisible element is considered to be the index of the next visible element.""" def __init__(self): self._sourcelist = [] self._poslist = [] self._posmap = {} def __len__(self): return len(self._sourcelist) def __iter__(self): return self._sourcelist.__iter__() def __getitem__(self, s): return self._sourcelist[s] def index(self, item): x = self._poslist[self._posmap[item]] return x[2] def hide(self, position, length): """Given the position in _sourcelist, and the length of the deletion, perform the deletion in the lists""" pfirst = self._sourcelist[position] plast = self._sourcelist[position+length-1] ifirst = self._posmap[pfirst] ilast = self._posmap[plast] for i in xrange(ifirst, ilast+1): L = self._poslist[i] L[1] = False #No longer visible, if it was visible before L[2] = position #collapse positions for L in self._poslist[ilast+1:]: L[2] -= length #move all subsequent character up by length del self._sourcelist[position:(position+length)] #self._check_invariants() def getitem_all(self, s): if isinstance(s, int): return self._poslist[s][0] else: return [x[0] for x in self._poslist[s]] def index_all(self, item): return self._posmap[item] def is_visible(self, i): return self._poslist[i][1] def is_visible_item(self, item): return self._poslist[self._posmap[item]][1] def insert_sequence_all(self, position, sequence, visibility): """Insert sequence with visibility into the all-coordinates at position""" if position > 0: psource = self._poslist[position][2] else: psource = 0 length = len(sequence) newlist = [] newlistsource = [] i = psource for elt, viz in zip(sequence, visibility): newlist.append([elt, viz, i]) if viz: newlistsource.append(elt) i += 1 self._poslist[position:position] = newlist for i in xrange(position,position+length): L = self._poslist[i] self._posmap[L[0]] = i num_viz = len(newlistsource) for i in xrange(position+length,len(self._poslist)): L = self._poslist[i] L[2] += num_viz self._posmap[L[0]] = i self._sourcelist[psource:psource] = newlistsource #self._check_invariants() def insert_sequence_leftof(self, target, sequence, visibility): self.insert_sequence_all(self._posmap[target], sequence, visibility) def _check_invariants(self): assert len(self._posmap) == len(self._poslist) for i in xrange(len(self._poslist)): assert self._posmap[self._poslist[i][0]] == i if self._poslist[i][1]: assert self._sourcelist[self._poslist[i][2]] == self._poslist[i][0] if i > 0: if self._poslist[i-1][1]: assert self._poslist[i-1][2] + 1 == self._poslist[i][2] else: assert self._poslist[i-1][2] == self._poslist[i][2] class SimpleStringTree: """SimpleStringTree is a StringTree that supports only Insertions and Deletions. Handling References, while valuable, has proven quite difficult, and so will not be addressed by this data structure. Code for handling Removals will be left in for the moment, since it is easy enough, even though it is not presently used.""" def __init__(self, initstring=""): self.ROOT = Record(Change(-1, -1, Insertion(0, "")), 0) self._id2rec = dict() #unique_id: Record(change) | change.unique_id = unique_id self._id2rec[-1] = self.ROOT self._parent2children = defaultdict(set) # unique_id: {Record(change) | change.parent == unique_id} self._cursor = 0 self._listing = aatree.AATreeHideList() self._listing.insert_sequence_all(0,[(-1,0)],[False]) if initstring: self.insert(initstring, 0) def __repr__(self): return "\n".join((str(v) for v in self._id2rec.values())) def getvalue(self, r = None): if r is None: r = self.ROOT s = "".join(self._id2rec[x[0]].change.edit.text[x[1]] for x in self._listing) return s def next(self): raise def flush(self): # This could be used to implement lazy evaluation of input by not # re-evaluating the string until flush (or read?) pass def close(self): raise def read(self, size=float('inf')): #Efficiency: This method should use size to avoid calling getvalue and rendering the entire string s = self.getvalue() outpoint = min(len(s), self._cursor + size) inpoint = self._cursor self._cursor = outpoint return s[inpoint:outpoint] def readline(self, size=float('inf')): #Efficiency: This method should use size to avoid rendering the whole string s = self.getvalue() outpoint = min(len(s), self._cursor + size) inpoint = self._cursor i = s.find("\n", inpoint, outpoint) if i == -1 or i >= outpoint: self._cursor = outpoint return s[inpoint:outpoint] else: self._cursor = i + 1 return s[inpoint:(i+1)] def readlines(self, sizehint=None): #Efficiency: use sizehint s = self.getvalue() t = s[self._cursor:] self._cursor = len(s) return t.splitlines(True) def seek(self, offset, whence=0): if whence == 0: self._cursor = offset elif whence == 1: self._cursor += offset elif whence == 2: self._cursor = len(self._listing) + offset def tell(self): return self._cursor def truncate(self, size=None): if size is None: size = self._cursor return self.delete(size, len(self._listing) - size) def write(self, text): L = min(len(self._listing) - self._cursor, len(text)) changelist = [] if L > 0: changelist.extend(self.delete(self._cursor, L)) changelist.extend(self.insert(text)) return changelist def writelines(self, sequence): s = "".join(sequence) return self.write(s) # Non-filelike text editing methods def insert(self, text, k=None): if k is None: k = self._cursor if len(self._listing) == 0: r = self.ROOT uid = -1 inspoint = 0 elif k == 0: (uid, inspoint) = self._listing[k] r = self._id2rec[uid] elif k < len(self._listing): # When not inserting at the endpoints, we have to be sure to # check if we are at the boundary between a parent and one of its # descendants. If so, we must make our insertion in the descendant, # not the parent, because the insertions would "conflict" (occur at # the same location) in the parent, which would produce an ordering # ambiguity, which will resolve in our favor only 50% of the time. pL, pR = self._listing[(k-1):(k+1)] (uidL, inspointL) = pL (uidR, inspointR) = pR rR = self._id2rec[uidR] if uidL == uidR: #There's no boundary here at all (at least not one # of any importance to us. Therefore, we have to insert to the # left of the character at k, as usual. r = rR uid = uidR inspoint = inspointR else: #There's a boundary of some sort here. We always choose to # insert at the deeper node (breaking left in case of a tie). # (In the case that neither node is the ancestor of the other, # either choice would be acceptable, regardless of depth. This # logic is therefore acceptable, and has the advantage of being # simple and fast.) rL = self._id2rec[uidL] if rR.depth > rL.depth: r = rR uid = uidR inspoint = inspointR else: r = rL uid = uidL inspoint = inspointL + 1 elif k == len(self._listing): (uid,i) = self._listing[k-1] r = self._id2rec[uid] inspoint = i + 1 else: raise e = Insertion(inspoint, text) c = Change(my_rand(), r.change.unique_id, e) self._add_change_treeonly(c) target = (uid, inspoint) self._insert_listonly(c.unique_id, target, len(text)) self._cursor = k + len(text) return [c] def delete(self, k, n): """Starting at a point k (0-indexed), delete n characters""" if k + n > len(self._listing): raise p = self._listing[k] contigs = [[p[0],p[1],p[1]]] for (uid, index) in self._listing[(k+1):(k+n)]: #This logic produces deletions that span any missing chunks. This #produces a smaller number of deletions than making sure that they #are actually "contiguous", but it might interact badly with a #hypothetical undo system. if contigs[-1][0] == uid: contigs[-1][2] = index else: contigs.append([uid,index,index]) changelist = [Change(my_rand(), c[0], Deletion(c[1],1 + c[2]-c[1])) for c in contigs] for c in changelist: self._add_change_treeonly(c) self._delete_listonly(k,n) return changelist def get_range(self, rec, point, m): todo = [(rec, point, m, None)] # None is a dummy value since p is unused ranges = [] while len(todo) > 0: (rec, point, m, p) = todo[0] h = self._range_helper(point, m) self._step(h, rec) if h.outpoint is not None: ranges.append((rec, h.point_parent, h.outpoint - h.point_parent)) #print rec, h.point_parent, h.outpoint - h.point_parent todo.extend(h.todo) #print todo del todo[0] return ranges def move(self, rempoint, n, inspoint): """In StringTree, move() should coherently copy a section of text, such that any conflicting edits appear in the new location, not the old. In SimpleStringTree, this is not possible, so move() just falls back to Deletion and Insertion.""" self.seek(rempoint) t = self.read(n) if rempoint > inspoint: L = self.delete(rempoint,n) L.extend(self.insert(t, inspoint)) else: L = self.insert(t, inspoint) L.extend(self.delete(rempoint,n)) return L # Patch management methods def add_change(self, c): if c.unique_id in self._id2rec: return [] if isinstance(c.edit, Insertion): p = self._effective_parent(c.unique_id, c.parent, c.edit.position) i = self._listing.index(p) d = len(c.edit.text) self._insert_listonly(c.unique_id, p, d) flist = [Insertion(i, c.edit.text)] elif isinstance(c.edit, Deletion): flist = [] start = None end = None for i in xrange(c.edit.position,c.edit.position + c.edit.length): p = (c.parent, i) if self._listing.is_visible_item(p): q = self._listing.index(p) if end == q: end += 1 else: if end is not None: n = end - start flist.append(Deletion(start,n)) self._delete_listonly(start,n) start = q end = start + 1 if end is not None: # the last contig won't be handled by the loop n = end - start flist.append(Deletion(start,n)) self._delete_listonly(start,n) else: raise self._add_change_treeonly(c) return flist def _effective_parent(self, uid, parentid, position): """The effective parent of an insertion is defined as the (uid, loc) pair that causes it to be inserted in the right location in the string. This is only relevant in the event of a conflict, in which case the conflict edits are required to be ordered from least uid to greatest uid. The effective parent of a conflicted edit, then, is either the original pair, or (u_next, 0), where u_next is the uid of the sibling directly to the right of the input uid. That is to say, it is the least u greater than uid that has the same position.""" if parentid in self._parent2children: u_next = None for r in self._parent2children[parentid]: u = r.change.unique_id p = r.change.edit.position if (p == position) and isinstance(r.change.edit, Insertion) and (u > uid): if (u_next is None) or (u < u_next): u_next = u if u_next is not None: return (u_next, 0) return (parentid, position) def _delete_listonly(self, position, length): """Given the position in _sourcelist, and the length of the deletion, perform the deletion in the lists""" self._listing.hide(position,length) def _insert_listonly(self, uid, target, length): """Make a new insertion into the lists with uid and length at position in _poslist""" elts = [(uid,i) for i in xrange(length+1)] visibility = [True] * length visibility.append(False) self._listing.insert_sequence_leftof(target, elts, visibility) def _add_change_treeonly(self, c): if c.unique_id in self._id2rec: return d = self._id2rec[c.parent].depth + 1 r = Record(c,d) self._id2rec[c.unique_id] = r if c.parent not in self._parent2children: self._parent2children[c.parent] = set() self._parent2children[c.parent].add(r) def get_insert(self, k, n = 0, parent=None): #FIXME: This method could be useful, but it no longer works """get_insert finds and returns the youngest insertion containing positions k to k + n in the total coordinates of parent. If parent is unspecified, then it is taken to be the root, meaning the coordinates in question are the current document coordinates. The return value is a tuple (rec, k_unmodified, k_modified), meaning the record containing k and k + n, the position of k in rec's unmodified coordinates, and the position of k in rec's modified coordinates. "containing" is defined so that a record with n characters (labeled 0...n-1) can still be returned as containing k...k+n. In other words, each Insertion contains both endpoints. However, an Insertion that has been totally deleted is ignored entirely.""" if parent is None: parent = self.ROOT h = self._get_insert_helper(k, n) self._step(h, parent) while h.child is not None: parent = h.child h = self._get_insert_helper(h.child_k, n) self._step(h, parent) return (parent, h.k_in_parent, h.k) def get_changes(self): #TODO: add arguments to get only changes in a certain range """get_changes provides a depth-first topologically sorted list of all Changes in this Tree""" L = [] stack = [-1] while stack: x = self._id2rec[stack.pop()].change L.append(x) if x.unique_id in self._parent2children: stack.extend(r.change.unique_id for r in self._parent2children[x.unique_id]) return L def is_ready(self, c): """Returns a boolean indicating whether a Change c may safely be added to the Tree. Specifically, it checks whether c.parent is already known.""" return c.parent in self._id2rec Pippy-71/groupthink/sugar_tools.py000066400000000000000000000271321311421132100175030ustar00rootroot00000000000000# Copyright 2007 Collabora Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import logging import telepathy from sugar3.activity.activity import Activity from sugar3.presence import presenceservice from sugar3.presence.tubeconn import TubeConnection from sugar3.graphics.window import Window from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GObject import groupthink_base as groupthink from sugar3.graphics.toolbarbox import ToolbarBox from sugar3.activity.widgets import ActivityToolbarButton def exhaust_event_loop(): while Gtk.events_pending(): Gtk.main_iteration() class GroupActivity(Activity): message_preparing = "Preparing user interface" message_loading = "Loading object from Journal" message_joining = "Joining shared activity" """Abstract Class for Activities using Groupthink""" def __init__(self, handle): # self.initiating indicates whether this instance has initiated sharing # it always starts false, but will be set to true if this activity # initiates sharing. In particular, if Activity.__init__ calls # self.share(), self.initiating will be set to True. self.initiating = False # self._processed_share indicates whether when_shared() has been called self._processed_share = False # self.initialized tracks whether the Activity's display is up and running self.initialized = False self.early_setup() super(GroupActivity, self).__init__(handle) self.dbus_name = self.get_bundle_id() self.logger = logging.getLogger(self.dbus_name) self._handle = handle ##GObject.threads_init() self._sharing_completed = not self.shared_activity self._readfile_completed = not handle.object_id if self.shared_activity: self.message = self.message_joining elif handle.object_id: self.message = self.message_loading else: self.message = self.message_preparing toolbar_box = ToolbarBox() self.activity_button = ActivityToolbarButton(self) toolbar_box.toolbar.insert(self.activity_button, 0) self.set_toolbar_box(toolbar_box) v = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.startup_label = Gtk.Label(label=self.message) v.pack_start(self.startup_label, True, True, 0) Window.set_canvas(self,v) self.show_all() # The show_all method queues up draw events, but they aren't executed # until the mainloop has a chance to process them. We want to process # them immediately, because we need to show the waiting screen # before the waiting starts, not after. exhaust_event_loop() # exhaust_event_loop() provides the possibility that write_file could # be called at this time, so write_file is designed to trigger read_file # itself if that path occurs. self.tubebox = groupthink.TubeBox() self.timer = groupthink.TimeHandler("main", self.tubebox) self.cloud = groupthink.Group(self.tubebox) # self.cloud is extremely important. It is the unified reference point # that contains all state in the system. Everything else is stateless. # self.cloud has to be defined before the call to self.set_canvas, because # set_canvas can trigger almost anything, including pending calls to read_file, # which relies on self.cloud. # get the Presence Service self.pservice = presenceservice.get_instance() # Buddy object for you owner = self.pservice.get_owner() self.owner = owner self.connect('shared', self._shared_cb) self.connect('joined', self._joined_cb) if self.get_shared(): if self.initiating: self._shared_cb(self) else: self._joined_cb(self) self.add_events(Gdk.EventMask.VISIBILITY_NOTIFY_MASK) self.connect("visibility-notify-event", self._visible_cb) self.connect("notify::active", self._active_cb) if not self._readfile_completed: self.read_file(self._jobject.file_path) elif not self.shared_activity: GObject.idle_add(self._initialize_cleanstart) def _initialize_cleanstart(self): self.initialize_cleanstart() self._initialize_display() return False def initialize_cleanstart(self): """Any subclass that needs to take any extra action in the case where the activity is launched locally without a sharing context or input file should override this method""" pass def early_setup(self): """Any subclass that needs to take an action before any external interaction (e.g. read_file, write_file) occurs should place that code in early_setup""" pass def _initialize_display(self): main_widget = self.initialize_display() Window.set_canvas(self, main_widget) self.initialized = True if self.shared_activity and not self._processed_share: # We are joining a shared activity, but when_shared has not yet # been called self.when_shared() self._processed_share = True self.show_all() self.after_init() def after_init(self): """Callback after init. Override to use""" pass def initialize_display(self): """All subclasses must override this method, in order to display their GUI using self.set_canvas()""" raise NotImplementedError def share(self, private=False): """The purpose of this function is solely to permit us to determine whether share() has been called. This is necessary because share() may be called during Activity.__init__, and thus emit the 'shared' signal before we have a chance to connect any signal handlers.""" self.initiating = True super(GroupActivity, self).share(private) if self.initialized and not self._processed_share: self.when_shared() self._processed_share = True def when_shared(self): """Inheritors should override this method to perform any special operations when the user shares the session""" pass def _shared_cb(self, activity): self.logger.debug('My activity was shared') self.initiating = True self._sharing_setup() self.logger.debug('This is my activity: making a tube...') id = self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].OfferDBusTube( self.dbus_name, {}) def _sharing_setup(self): if self.shared_activity is None: self.logger.error('Failed to share or join activity') return self.conn = self.shared_activity.telepathy_conn self.tubes_chan = self.shared_activity.telepathy_tubes_chan self.text_chan = self.shared_activity.telepathy_text_chan self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].connect_to_signal('NewTube', self._new_tube_cb) def _list_tubes_reply_cb(self, tubes): self.logger.debug('Got %d tubes from ListTubes' % len(tubes)) for tube_info in tubes: self._new_tube_cb(*tube_info) def _list_tubes_error_cb(self, e): self.logger.error('ListTubes() failed: %s', e) def _joined_cb(self, activity): if not self.shared_activity: return self.logger.debug('Joined an existing shared activity') self.initiating = False self._sharing_setup() self.logger.debug('This is not my activity: waiting for a tube...') self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].ListTubes( reply_handler=self._list_tubes_reply_cb, error_handler=self._list_tubes_error_cb) def _new_tube_cb(self, id, initiator, type, service, params, state): self.logger.debug('New tube: ID=%d initator=%d type=%d service=%s ' 'params=%r state=%d', id, initiator, type, service, params, state) if (type == telepathy.TUBE_TYPE_DBUS and service == self.dbus_name): if state == telepathy.TUBE_STATE_LOCAL_PENDING: self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].AcceptDBusTube(id) tube_conn = TubeConnection(self.conn, self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES], id, group_iface=self.text_chan[telepathy.CHANNEL_INTERFACE_GROUP]) self.tubebox.insert_tube(tube_conn, self.initiating) self._sharing_completed = True if self._readfile_completed and not self.initialized: self._initialize_display() def read_file(self, file_path): self.cloud.loads(self.load_from_journal(file_path)) self._readfile_completed = True if self._sharing_completed and not self.initialized: self._initialize_display() def load_from_journal(self, file_path): """This implementation of load_from_journal simply returns the contents of the file. Any inheritor overriding this method must return the string provided to save_to_journal as cloudstring.""" if file_path: f = file(file_path,'rb') s = f.read() f.close() return s def write_file(self, file_path): # There is a possibility that the user could trigger a write_file # action before read_file has occurred. This could be dangerous, # potentially overwriting the journal entry with blank state. To avoid # this, we ensure that read_file has been called (if there is a file to # read) before writing. if not self._readfile_completed: self.read_file(self._jobject.file_path) self.save_to_journal(file_path, self.cloud.dumps()) def save_to_journal(self, file_path, cloudstring): """This implementation of save_to_journal simply dumps the output of self.cloud.dumps() to disk. Any inheritor who wishes to control file output should override this method, and must be sure to include cloudstring in its write_file.""" f = file(file_path, 'wb') f.write(cloudstring) f.close() def _active_cb(self, widget, event): self.logger.debug("_active_cb") if self.props.active: self.resume() else: self.pause() def _visible_cb(self, widget, event): self.logger.debug("_visible_cb") if event.get_state() == Gdk.VisibilityState.FULLY_OBSCURED: self.pause() else: self.resume() def pause(self): """Subclasses should override this function to stop updating the display since it is not visible.""" pass def resume(self): """Subclasses should override this function to resume updating the display, since it is now visible""" pass Pippy-71/icondialog.py000066400000000000000000000125461311421132100150630ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (C) 2013 Ignacio Rodríguez # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import shutil from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from jarabe.journal.model import get_documents_path from sugar3.activity.activity import get_bundle_path from sugar3.graphics.toolbutton import ToolButton from sugar3.graphics.toolbarbox import ToolbarBox from gettext import gettext as _ import os DEFAULT_NAME = "default-pippy.svg" DEFAULT_ICON = os.path.join(get_bundle_path(), 'activity', 'activity-default.svg') def get_document_icons(): icons = os.listdir(get_documents_path()) icons_ = [] for icon in icons: if icon.endswith('.svg'): icons_.append(icon[:-4]) return icons_ def get_user_path(): user = os.path.expanduser("~") path = os.path.join(user, ".icons") if not os.path.exists(path): os.mkdir(path) if os.path.exists(DEFAULT_NAME): os.remove(DEFAULT_NAME) shutil.copy(DEFAULT_ICON, os.path.join(path, DEFAULT_NAME)) return path def get_usericons_icons(): path = get_user_path() icons = os.listdir(path) icons_ = [] for icon in icons: if icon.endswith('.svg'): icons_.append(icon[:-4]) return icons_ def get_user_icons(): home = get_usericons_icons() documents = get_document_icons() final = [] for x in home: final.append(x) for x in documents: final.append(x) return final class IconDialog(Gtk.Window): def __init__(self): Gtk.Window.__init__(self) self.set_destroy_with_parent(True) self.theme = Gtk.IconTheme.get_default() self.theme.append_search_path(get_documents_path()) self._icon = None grid = Gtk.Grid() self.x, self.y = (Gdk.Screen.width() / 1.5, Gdk.Screen.height() / 1.5) self.set_size_request(self.x, self.y) self.icons = None toolbox = self.build_toolbar() self.icons = self.build_scroll() grid.attach(toolbox, 0, 1, 1, 1) grid.attach(self.icons, 0, 2, 1, 1) self.set_decorated(False) self.set_skip_pager_hint(True) self.set_skip_taskbar_hint(True) self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_resizable(False) self.set_modal(True) self.add(grid) self.show_all() def build_toolbar(self): toolbox = ToolbarBox() label = Gtk.Label("\t" + _('Select an icon')) label.modify_fg(Gtk.StateType.NORMAL, Gdk.color_parse('white')) item = Gtk.ToolItem() item.add(label) close = ToolButton('entry-cancel') close.connect('clicked', lambda x: self.destroy()) separator = Gtk.SeparatorToolItem() separator.props.draw = False separator.set_expand(True) toolbox.toolbar.insert(item, -1) toolbox.toolbar.insert(separator, -1) toolbox.toolbar.insert(close, -1) return toolbox def get_icon(self): return self._icon def build_scroll(self): scroll = Gtk.ScrolledWindow() scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) icons = self.build_icons() scroll.set_size_request(self.x, self.y) scroll.add_with_viewport(icons) return scroll def build_icons(self): store = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str) icon_view = Gtk.IconView.new_with_model(store) icon_view.set_selection_mode(Gtk.SelectionMode.SINGLE) icon_view.connect('selection-changed', self.set_icon, store) icon_view.set_pixbuf_column(0) icon_view.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse('#D5D5D5')) for icon in get_user_icons(): info = self.theme.lookup_icon(icon, 55, Gtk.IconLookupFlags.FORCE_SVG) if not info: continue icon_path = os.path.join(get_user_path(), icon + ".svg") if not os.path.exists(icon_path): icon_path = os.path.join(get_documents_path(), icon + ".svg") if not os.path.exists(icon_path): icon_path = info.get_filename() pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( icon_path, 55, 55) store.insert(-1, [pixbuf, icon, icon_path]) return icon_view def set_icon(self, widget, model): try: iter_ = model.get_iter(widget.get_selected_items()[0]) except: return icon_path = model.get(iter_, 2)[0] self._icon = icon_path self.destroy() Pippy-71/icons/000077500000000000000000000000001311421132100135045ustar00rootroot00000000000000Pippy-71/icons/close-tab.svg000066400000000000000000000020671311421132100161030ustar00rootroot00000000000000 ]> Pippy-71/icons/eraser_bw.svg000066400000000000000000000034451311421132100162040ustar00rootroot00000000000000 Pippy-71/icons/eraser_color.svg000066400000000000000000000031641311421132100167100ustar00rootroot00000000000000 Pippy-71/icons/pippy-create-bundle.svg000066400000000000000000000073341311421132100201050ustar00rootroot00000000000000 image/svg+xmlPippy-71/icons/pippy-create-distutils.svg000066400000000000000000000072741311421132100206630ustar00rootroot00000000000000 image/svg+xmlPippy-71/icons/pippy-export-doc.svg000066400000000000000000000116131311421132100174520ustar00rootroot00000000000000 ]> Pippy-71/icons/pippy-export-example.svg000066400000000000000000000066121311421132100203430ustar00rootroot00000000000000 ]> Pippy-71/icons/pippy-export-library.svg000066400000000000000000000134671311421132100203620ustar00rootroot00000000000000 image/svg+xmlPippy-71/icons/pippy-import-doc.svg000066400000000000000000000144111311421132100174420ustar00rootroot00000000000000 image/svg+xmlPippy-71/icons/pippy-import_py.svg000066400000000000000000000123751311421132100174160ustar00rootroot00000000000000 image/svg+xml Pippy-71/icons/pippy-openoff.svg000066400000000000000000000112561311421132100170250ustar00rootroot00000000000000 image/svg+xml Pippy-71/icons/pippy-openon.svg000066400000000000000000000113701311421132100166640ustar00rootroot00000000000000 image/svg+xml Pippy-71/icons/pippy-save_library.svg000066400000000000000000000107641311421132100200560ustar00rootroot00000000000000 image/svg+xmlPippy-71/icons/run_bw.svg000066400000000000000000000025011311421132100155170ustar00rootroot00000000000000 Pippy-71/icons/run_color.svg000066400000000000000000000025011311421132100162250ustar00rootroot00000000000000 Pippy-71/icons/stopit_bw.svg000066400000000000000000000047641311421132100162520ustar00rootroot00000000000000 Pippy-71/icons/stopit_color.svg000066400000000000000000000047641311421132100167600ustar00rootroot00000000000000 Pippy-71/library/000077500000000000000000000000001311421132100140355ustar00rootroot00000000000000Pippy-71/library/LICENSE000066400000000000000000000020701311421132100150410ustar00rootroot00000000000000This software is covered under the zlib license. C++ version Copyright (c) 2006-2011 Erin Catto http://www.box2d.org Python version Copyright (c) 2008-2011 Ken Lauer / sirkne at gmail dot com Implemented using the pybox2d SWIG interface for Box2D (pybox2d.googlecode.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Pippy-71/library/pippy/000077500000000000000000000000001311421132100151765ustar00rootroot00000000000000Pippy-71/library/pippy/__init__.py000066400000000000000000000020641311421132100173110ustar00rootroot00000000000000# Copyright (C) 2007,2008,2010 One Laptop per Child Association, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """Pippy standard library.""" import pippy.console as console import pippy.game as pygame try: import pippy.sound as sound except ImportError: pass # this module fails to import on non-XOs. def wait(delay=0.1): """Pause briefly, for animations.""" import time time.sleep(delay) Pippy-71/library/pippy/console.py000066400000000000000000000123041311421132100172120ustar00rootroot00000000000000"""Console helpers for pippy.""" # Copyright (C) 2007,2008,2010 One Laptop per Child Association, Inc. # Written by C. Scott Ananian # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import sys import os import tty import termios def clear(): """Clear screen on console.""" # magic escape sequence sys.stdout.write('\x1B[H\x1B[J') def size(): """Return the number of rows/columns in the current terminal widget.""" # xterm magic! see http://rtfm.etla.org/xterm/ctlseq.html fd = os.open('/dev/tty', os.O_RDWR | os.O_APPEND) def read_to_delimit(delimit): buf = [] while True: c = os.read(fd, 1) if c == delimit: break buf.append(c) return ''.join(buf) oldattr = termios.tcgetattr(fd) # make sure we can restore tty state tty.setraw(fd, termios.TCSANOW) # set to raw mode. os.write(fd, '\x1B[18t') # write the 'query screen size' command read_to_delimit('\x1b') # parse response. read_to_delimit('[') size = read_to_delimit('t') # Output can be '8;rows;cols' or 'rows;cols' depending on vte version. # (SL #843) values = size.split(';') if len(values) == 3: rows = int(values[1]) cols = int(values[2]) else: rows = int(values[0]) cols = int(values[1]) termios.tcsetattr(fd, termios.TCSANOW, oldattr) # reset tty return cols, rows def getpos(): """Return the current x, y position of the cursor on the screen. The top-left corner is 1,1.""" # xterm magic! see http://rtfm.etla.org/xterm/ctlseq.html sys.stdout.flush() # ensure that writes to the terminal have finished fd = os.open('/dev/tty', os.O_RDWR | os.O_APPEND) def read_to_delimit(delimit): buf = [] while True: c = os.read(fd, 1) if c == delimit: break buf.append(c) return ''.join(buf) oldattr = termios.tcgetattr(fd) # make sure we can restore tty state tty.setraw(fd, termios.TCSANOW) # set to raw mode. os.write(fd, '\x1B[6n') # Report Cursor Position read_to_delimit('\x1b') # parse response. read_to_delimit('[') row = int(read_to_delimit(';')) col = int(read_to_delimit('R')) termios.tcsetattr(fd, termios.TCSANOW, oldattr) # reset tty return col, row def setpos(column, row): """Move to the given position on the screen. The top-left corner is 1,1""" # xterm magic! see http://rtfm.etla.org/xterm/ctlseq.html sys.stdout.write('\x1B[%d;%dH' % (row, column)) def up(count=1): """Move the cursor up the given number of rows.""" sys.stdout.write('\x1B[%dA' % count) def down(count=1): """Move the cursor down the given number of rows.""" sys.stdout.write('\x1B[%dB' % count) def forward(count=1): """Move the cursor forward the given number of columns.""" sys.stdout.write('\x1B[%dC' % count) def backward(count=1): """Move the cursor backward the given number of columns.""" sys.stdout.write('\x1B[%dD' % count) def normal(): """Switch to normal text.""" sys.stdout.write('\x1B[0m') def bold(): """Switch to bold text.""" sys.stdout.write('\x1B[1m') def underlined(): """Switch to underlined text.""" sys.stdout.write('\x1B[4m') def inverse(): """Switch to inverse text.""" sys.stdout.write('\x1B[7m') def black(): """Change text color to black.""" # magic escape sequence. sys.stdout.write('\x1B[30m') def red(): """Change text color to red.""" # magic escape sequence. sys.stdout.write('\x1B[31m') def green(): """Change text color to green.""" # magic escape sequence. sys.stdout.write('\x1B[32m') def yellow(): """Change text color to yellow.""" # magic escape sequence. sys.stdout.write('\x1B[33m') def blue(): """Change text color to blue.""" # magic escape sequence. sys.stdout.write('\x1B[34m') def magenta(): """Change text color to magenta.""" # magic escape sequence. sys.stdout.write('\x1B[35m') def cyan(): """Change text color to cyan.""" # magic escape sequence. sys.stdout.write('\x1B[36m') def white(): """Change text color to white.""" # magic escape sequence. sys.stdout.write('\x1B[37m') def hide_cursor(): """Hide the cursor.""" sys.stdout.write('\x1B[?25l') def show_cursor(): """Show the cursor.""" sys.stdout.write('\x1B[?25h') def reset(): """Clear screen and reset text color.""" clear() show_cursor() sys.stdout.write('\x1B[0;39m') Pippy-71/library/pippy/game.py000066400000000000000000000061531311421132100164660ustar00rootroot00000000000000"""pygame support for pippy.""" # Copyright (C) 2007,2008 One Laptop per Child Association, Inc. # Written by C. Scott Ananian # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA def pause(): """Display a "Paused" screen and suspend.""" from gettext import gettext as _ import pygame caption, icon_caption = pygame.display.get_caption() screen = pygame.display.get_surface() old_screen = screen.copy() # save this for later. # dim the screen and display the 'paused' message in the center. BLACK = (0, 0, 0) WHITE = (255, 255, 255) dimmed = screen.copy() dimmed.set_alpha(128) screen.fill(BLACK) screen.blit(dimmed, (0, 0)) font = pygame.font.Font(None, 36) # 36px high msg = _("PAUSED") msg_surf = font.render(msg, True, BLACK, WHITE) def center(rect, screen): rect.center = (screen.get_width() / 2, screen.get_height() / 2) rect = pygame.Rect((0, 0), msg_surf.get_size()) rect.inflate_ip(rect.width, rect.height) center(rect, screen) screen.fill(WHITE, rect) rect = msg_surf.get_rect() center(rect, screen) screen.blit(msg_surf, rect) pygame.display.flip() # SUSPEND try: raise RuntimeError() # XXX don't try this yet. we should use ohm. open('/sys/power/state', 'w').write('mem') except: # couldn't suspend (no permissions?) pygame.event.post(pygame.event.wait()) pygame.display.set_caption(caption, icon_caption) screen.blit(old_screen, (0, 0)) pygame.display.flip() _last_event_time = 0 _default_clock = None def next_frame(max_fps=20, idle_timeout=20, clock=None, pause=pause): """Limit maximum frame rate of pygame. Returns True. If idle longer than the idle_timeout (in seconds), then we'll put up a "paused" message and the XO will suspend. This ensures that we don't burn up all of our battery running an animation!""" import pygame global _last_event_time, _default_clock if _default_clock is None: _default_clock = pygame.time.Clock() if clock is None: clock = _default_clock clock.tick(max_fps) if pygame.event.peek(xrange(pygame.NOEVENT, pygame.USEREVENT)): # we're not idle anymore. _last_event_time = pygame.time.get_ticks() elif (pygame.time.get_ticks() - _last_event_time) >= idle_timeout * 1000: # we've been idle for a long time. Pause & suspend. pause() _last_event_time = pygame.time.get_ticks() return True Pippy-71/library/pippy/physics/000077500000000000000000000000001311421132100166605ustar00rootroot00000000000000Pippy-71/library/pippy/physics/__init__.py000066400000000000000000000003321311421132100207670ustar00rootroot00000000000000import sys __all__ = ['locals', 'menu'] # Use own 'elements' modified module # http://bugs.sugarlabs.org/ticket/3361 # sys.path.append('library/pippy/physics/Elements-0.13-py2.5.egg') from myelements import Elements Pippy-71/library/pippy/physics/myelements/000077500000000000000000000000001311421132100210425ustar00rootroot00000000000000Pippy-71/library/pippy/physics/myelements/__init__.py000066400000000000000000000000741311421132100231540ustar00rootroot00000000000000__all__ = ['locals', 'menu'] from .elements import Elements Pippy-71/library/pippy/physics/myelements/add_objects.py000066400000000000000000000463141311421132100236650ustar00rootroot00000000000000""" This file is part of the 'Elements' Project Elements is a 2D Physics API for Python (supporting Box2D2) Copyright (C) 2008, The Elements Team, Home: http://elements.linuxuser.at IRC: #elements on irc.freenode.org Code: http://www.assembla.com/wiki/show/elements svn co http://svn2.assembla.com/svn/elements License: GPLv3 | See LICENSE for the full text 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 . """ from .locals import * from .elements import box2d # Imports from math import pi from math import sqrt from math import asin from . import tools_poly class Add: element_count = 0 def __init__(self, parent): self.parent = parent def ground(self): """ Add a static ground to the scene Return: box2d.b2Body """ return self._rect((-10.0, 0.0), 50.0, 0.1, dynamic=False) def triangle(self, pos, sidelength, dynamic=True, density=1.0, restitution=0.16, friction=0.5, screenCoord=True): """ Add a triangle | pos & a in the current input unit system (meters or pixels) Parameters: pos .... position (x,y) sidelength ...... sidelength other .. see [physics parameters] Return: box2d.b2Body """ vertices = [(-sidelength, 0.0), (sidelength, 0.0), (0.0, 2 * sidelength)] return self.poly(pos, vertices, dynamic, density, restitution, friction, screenCoord) def ball(self, pos, radius, dynamic=True, density=1.0, restitution=0.16, friction=0.5, screenCoord=True): """ Add a dynamic ball at pos after correcting the positions and lengths to the internal meter system if neccessary (if INPUT_PIXELS), then call self._add_ball(...) Parameters: pos ..... position (x,y) radius .. circle radius other ... see [physics parameters] Return: box2d.b2Body """ # Bring coordinates into the world coordinate system (flip, # camera offset, ...) if screenCoord: x, y = self.parent.to_world(pos) else: x, y = pos if self.parent.input_unit == INPUT_PIXELS: x /= self.parent.ppm y /= self.parent.ppm radius /= self.parent.ppm return self._ball((x, y), radius, dynamic, density, restitution, friction) def _ball(self, pos, radius, dynamic=True, density=1.0, restitution=0.16, friction=0.5): # Add a ball without correcting any settings # meaning, pos and vertices are in meters # Define the body x, y = pos bodyDef = box2d.b2BodyDef() bodyDef.position = (x, y) userData = {'color': self.parent.get_color()} bodyDef.userData = userData # Create the Body if not dynamic: density = 0 else: bodyDef.type = box2d.b2_dynamicBody body = self.parent.world.CreateBody(bodyDef) self.parent.element_count += 1 # Add a shape to the Body circleShape = box2d.b2CircleShape() circleShape.radius = radius circleDef = box2d.b2FixtureDef() circleDef.shape = circleShape circleDef.density = density circleDef.restitution = restitution circleDef.friction = friction body.CreateFixture(circleDef) return body def rect(self, pos, width, height, angle=0, dynamic=True, density=1.0, restitution=0.16, friction=0.5, screenCoord=True): """ Add a dynamic rectangle with input unit according to self.input (INPUT_PIXELS or INPUT_METERS) Correcting the positions to meters and calling self._add_rect() Parameters: pos ..... position (x,y) width ....... horizontal line height ....... vertical line angle ........ in degrees (0 .. 360) other ... see [physics parameters] Return: box2d.b2Body """ # Bring coordinates into the world coordinate system (flip, # camera offset, ...) if screenCoord: x, y = self.parent.to_world(pos) else: x, y = pos # If required, translate pixel -> meters if self.parent.input_unit == INPUT_PIXELS: x /= self.parent.ppm y /= self.parent.ppm width /= self.parent.ppm height /= self.parent.ppm # grad -> radians angle = (angle * pi) / 180 return self._rect((x, y), width, height, angle, dynamic, density, restitution, friction) def wall(self, pos1, pos2, width=5, density=1.0, restitution=0.16, friction=0.5, screenCoord=True): """ Add a static rectangle between two arbitrary points with input unit according to self.input_unit (INPUT_PIXELS or INPUT_METERS) Correcting the positions to meters and calling self._add_rect() Return: box2d.b2Body """ if width < 5: width = 5 if (pos1[0] < pos2[0]): x1, y1 = pos1 x2, y2 = pos2 else: x1, y1 = pos2 x2, y2 = pos1 # Bring coordinates into the world coordinate system (flip, # camera offset, ...) if screenCoord: x1, y1 = self.parent.to_world((x1, y1)) x2, y2 = self.parent.to_world((x2, y2)) # If required, translate pixel -> meters if self.parent.input_unit == INPUT_PIXELS: x1 /= self.parent.ppm y1 /= self.parent.ppm x2 /= self.parent.ppm y2 /= self.parent.ppm width /= self.parent.ppm length = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) * 0.5 if width > 0: halfX = x1 + (x2 - x1) * 0.5 halfY = y1 + (y2 - y1) * 0.5 angle = asin((y2 - halfY) / length) return self._rect((halfX, halfY), length, width, angle, False, density, restitution, friction) def _rect(self, pos, width, height, angle=0, dynamic=True, density=1.0, restitution=0.16, friction=0.5): # Add a rect without correcting any settings # meaning, pos and vertices are in meters # angle is now in radians ((degrees * pi) / 180)) x, y = pos bodyDef = box2d.b2BodyDef() bodyDef.position = (x, y) userData = {'color': self.parent.get_color()} bodyDef.userData = userData # Create the Body if not dynamic: density = 0 else: bodyDef.type = box2d.b2_dynamicBody body = self.parent.world.CreateBody(bodyDef) self.parent.element_count += 1 # Add a shape to the Body boxDef = box2d.b2FixtureDef() polygonShape = box2d.b2PolygonShape() polygonShape.SetAsBox(width, height, (0, 0), angle) boxDef.shape = polygonShape boxDef.density = density boxDef.restitution = restitution boxDef.friction = friction body.CreateFixture(boxDef) return body def poly(self, pos, vertices, dynamic=True, density=1.0, restitution=0.16, friction=0.5, screenCoord=True): """ Add a dynamic polygon, which has the vertices arranged around the poly's center at pos Correcting the positions to meters if INPUT_PIXELS, and calling self._add_poly() Parameters: pos ....... position (x,y) vertices .. vertices arranged around the center other ... see [physics parameters] Return: box2d.b2Body """ # Bring coordinates into the world coordinate system (flip, # camera offset, ...) if screenCoord: x, y = self.parent.to_world(pos) else: x, y = pos # If required, translate pixel -> meters if self.parent.input_unit == INPUT_PIXELS: # translate pixel -> meters x /= self.parent.ppm y /= self.parent.ppm # Translate vertices from pixels to meters v_new = [] for v in vertices: vx, vy = v v_new.append((vx / self.parent.ppm, vy / self.parent.ppm)) vertices = v_new return self._poly((x, y), vertices, dynamic, density, restitution, friction) def _poly(self, pos, vertices, dynamic=True, density=1.0, restitution=0.16, friction=0.5): # add a centered poly at pos without correcting any settings # meaning, pos and vertices are in meters x, y = pos bodyDef = box2d.b2BodyDef() bodyDef.position = (x, y) userData = {'color': self.parent.get_color()} bodyDef.userData = userData # Create the Body if not dynamic: density = 0 else: bodyDef.type = box2d.b2_dynamicBody body = self.parent.world.CreateBody(bodyDef) self.parent.element_count += 1 # Add a shape to the Body polyDef = box2d.b2FixtureDef() polygonShape = box2d.b2PolygonShape() polygonShape.vertices = vertices polyDef.shape = polygonShape polyDef.density = density polyDef.restitution = restitution polyDef.friction = friction body.CreateFixture(polyDef) return body def concavePoly(self, vertices, dynamic=True, density=1.0, restitution=0.16, friction=0.5, screenCoord=True): # 1. Step: Reduce # Detect if the polygon is closed or open if vertices[0] != vertices[-1]: is_closed = False else: is_closed = True # Continue reducing the vertecs x, y = c = tools_poly.calc_center(vertices) vertices = tools_poly.poly_center_vertices(vertices) # Bring coordinates into the world coordinate system (flip, # camera offset, ...) if screenCoord: x, y = self.parent.to_world(c) else: x, y = c # If required, translate pixel -> meters if self.parent.input_unit == INPUT_PIXELS: # translate pixel -> meters x /= self.parent.ppm y /= self.parent.ppm # Let's add the body bodyDef = box2d.b2BodyDef() bodyDef.position = (x, y) userData = {'color': self.parent.get_color()} bodyDef.userData = userData # Create the Body if not dynamic: density = 0 else: bodyDef.type = box2d.b2_dynamicBody body = self.parent.world.CreateBody(bodyDef) self.parent.element_count += 1 # Create the reusable Box2D polygon and circle definitions polyDef = box2d.b2FixtureDef() polygonShape = box2d.b2PolygonShape() polygonShape.vertexCount = 4 # rectangle polyDef.shape = polygonShape polyDef.density = density polyDef.restitution = restitution polyDef.friction = friction circleShape = box2d.b2CircleShape() circleShape.radius = 0.086 circleDef = box2d.b2FixtureDef() circleDef.shape = circleShape circleDef.density = density circleDef.restitution = restitution circleDef.friction = friction # Set the scale factor factor = 8.0 v2 = box2d.b2Vec2(*vertices[0]) for v in vertices[1:]: v1 = v2.copy() v2 = box2d.b2Vec2(*v) vdir = v2 - v1 # (v2x-v1x, v2y-v1y) vdir.Normalize() # we need a little size for the end part vn = box2d.b2Vec2(-vdir.y * factor, vdir.x * factor) v = [v1 + vn, v1 - vn, v2 - vn, v2 + vn] # Create a line (rect) for each part of the polygon, # and attach it to the body polyDef.shape.vertices = [vi / self.parent.ppm for vi in v] try: polyDef.shape.valid except ValueError: print "concavePoly: Created an invalid polygon!" return None body.CreateFixture(polyDef) # Now add a circle to the points between the rects # to avoid sharp edges and gaps if not is_closed and v2 == vertices[-1]: # Don't add a circle at the end break circleDef.localPosition = v2 / self.parent.ppm body.CreateFixture(circleDef) # Return hard and soft reduced vertices return body def complexPoly(self, vertices, dynamic=True, density=1.0, restitution=0.16, friction=0.5): # 1. Step: Reduce # 2. Step: See if start and end are close, if so then close the polygon # 3. Step: Detect if convex or concave # 4. Step: Start self.convexPoly or self.concavePoly vertices, is_convex = tools_poly.reduce_poly_by_angle(vertices) # print "->", is_convex # If start and endpoints are close to each other, close polygon x1, y1 = vertices[0] x2, y2 = vertices[-1] dx = x2 - x1 dy = y2 - y1 l = sqrt((dx * dx) + (dy * dy)) if l < 50: vertices[-1] = vertices[0] else: # Never convex if open (we decide so :) is_convex = False if tools_poly.is_line(vertices): # Lines shall be drawn by self.concavePoly(...) # print "is line" is_convex = False if is_convex: # print "convex" return self.convexPoly(vertices, dynamic, density, restitution, friction), vertices else: # print "concave" return self.concavePoly(vertices, dynamic, density, restitution, friction), vertices def convexPoly(self, vertices, dynamic=True, density=1.0, restitution=0.16, friction=0.5): """ Add a complex polygon with vertices in absolute positions (meters or pixels, according to INPUT_PIXELS or INPUT_METERS). This function does the reduction and convec hulling of the poly, and calls add_poly(...) Parameters: vertices .. absolute vertices positions other ..... see [physics parameters] Return: box2d.b2Body """ # NOTE: Box2D has a maximum poly vertex count, defined in # Common/box2d.b2Settings.h (box2d.b2_maxPolygonVertices) We # need to make sure, that we reach that by reducing the poly # with increased tolerance Reduce Polygon tolerance = 10 # 5 v_new = vertices while len(v_new) > box2d.b2_maxPolygonVertices: tolerance += 1 v_new = tools_poly.reduce_poly(vertices, tolerance) # print "convexPoly: Polygon reduced from %i to %i vertices | # tolerance: %i" % (len(vertices), len(v_new), tolerance) vertices = v_new # So poly should be alright now # Continue reducing the vertecs vertices_orig_reduced = vertices vertices = tools_poly.poly_center_vertices(vertices) vertices = tools_poly.convex_hull(vertices) if len(vertices) < 3: return # Define the body x, y = tools_poly.calc_center(vertices_orig_reduced) return self.poly((x, y), vertices, dynamic, density, restitution, friction) def to_b2vec(self, pt): # Convert vector to a b2vect pt = self.parent.to_world(pt) ptx, pty = pt ptx /= self.parent.ppm pty /= self.parent.ppm pt = box2d.b2Vec2(ptx, pty) return pt def joint(self, *args): if len(args) == 5: # Tracking Joint b1, b2, p1, p2, flag = args p1 = self.to_b2vec(p1) p2 = self.to_b2vec(p2) jointDef = box2d.b2DistanceJointDef() jointDef.Initialize(b1, b2, p1, p2) jointDef.collideConnected = flag self.parent.world.CreateJoint(jointDef) elif len(args) == 4: # Distance Joint b1, b2, p1, p2 = args p1 = self.to_b2vec(p1) p2 = self.to_b2vec(p2) jointDef = box2d.b2DistanceJointDef() jointDef.Initialize(b1, b2, p1, p2) jointDef.collideConnected = True try: self.parent.world.CreateJoint(jointDef) except AssertionError: pass elif len(args) == 3: # Revolute Joint between two bodies (unimplemented) pass elif len(args) == 2: # Revolute Joint to the Background, at point b1 = self.parent.world.groundBody b2 = args[0] p1 = self.to_b2vec(args[1]) jointDef = box2d.b2RevoluteJointDef() jointDef.Initialize(b1, b2, p1) try: self.parent.world.CreateJoint(jointDef) except AssertionError: pass elif len(args) == 1: # Revolute Joint to the Background, body center b1 = self.parent.world.groundBody b2 = args[0] p1 = b2.GetWorldCenter() jointDef = box2d.b2RevoluteJointDef() jointDef.Initialize(b1, b2, p1) try: self.parent.world.CreateJoint(jointDef) except AssertionError: pass def motor(self, body, pt, torque=900, speed=-10): # Revolute joint to the background with motor torque applied b1 = self.parent.world.groundBody pt = self.to_b2vec(pt) jointDef = box2d.b2RevoluteJointDef() jointDef.Initialize(b1, body, pt) jointDef.maxMotorTorque = torque jointDef.motorSpeed = speed jointDef.enableMotor = True self.parent.world.CreateJoint(jointDef) def mouseJoint(self, body, pos, jointForce=100.0): pos = self.parent.to_world(pos) x, y = pos x /= self.parent.ppm y /= self.parent.ppm mj = box2d.b2MouseJointDef() mj.bodyA = self.parent.world.groundBody mj.bodyB = body mj.target = (x, y) mj.maxForce = jointForce * body.mass if 'getAsType' in dir(box2d.b2Joint): self.parent.mouseJoint = \ self.parent.world.CreateJoint(mj).getAsType() else: self.parent.mouseJoint = self.parent.world.CreateJoint(mj) body.awake = True def remove_mouseJoint(self): if self.parent.mouseJoint: self.parent.world.DestroyJoint(self.parent.mouseJoint) self.parent.mouseJoint = None Pippy-71/library/pippy/physics/myelements/callbacks.py000066400000000000000000000112231311421132100233320ustar00rootroot00000000000000""" This file is part of the 'Elements' Project Elements is a 2D Physics API for Python (supporting Box2D2) Copyright (C) 2008, The Elements Team, Home: http://elements.linuxuser.at IRC: #elements on irc.freenode.org Code: http://www.assembla.com/wiki/show/elements svn co http://svn2.assembla.com/svn/elements License: GPLv3 | See LICENSE for the full text 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 . """ from .locals import * from .elements import box2d class CallbackHandler: # List of contact callbacks and shapes to start them - sorted by # type for quicker access Callbacks are saved as # callbacks[callback_type][[function, parameters], ...] callbacks = {} def __init__(self, parent): self.parent = parent # init callback dict to avoid those slow try # (especially for self.get, as it is called *often*) for i in xrange(10): self.callbacks[i] = [] def add(self, callback_type, callback_handler, *args): """ Users can add callbacks for certain (or all) collisions Parameters: callback_type ......... CALLBACK_CONTACT (nothing else for now) callback_handler ...... a callback function args (optional) ....... a list of parameters which can be used with callbacks.get Return: callback_id ... used to remove a callback later (int) """ # Create contact listener if required if callback_type in [CALLBACK_CONTACT_ADD, CALLBACK_CONTACT_PERSIST, CALLBACK_CONTACT_REMOVE]: if self.parent.listener is None: self.parent.listener = kContactListener(self.get) self.parent.world.SetContactListener(self.parent.listener) print "* ContactListener added" # Get callback dict for this callback_type c = self.callbacks[callback_type] # Append to the Callback Dictionary c.append([callback_handler, args]) self.callbacks[callback_type] = c # Return Callback ID # ID = callback_type.callback_index (1...n) return "%i.%i" % (callback_type, len(c)) def get(self, callback_type): return self.callbacks[callback_type] def start(self, callback_type, *args): callbacks = self.get(callback_type) for c in callbacks: callback, params = c callback() class kContactListener(box2d.b2ContactListener): def __init__(self, get_callbacks): # Init the Box2D b2ContactListener box2d.b2ContactListener.__init__(self) # Function to get the current callbacks self.get_callbacks = get_callbacks def check_contact(self, contact_type, point): # Checks if a callback should be started with this contact point contacts = self.get_callbacks(contact_type) # Step through all callbacks for this type (eg ADD, PERSIST, REMOVE) for c in contacts: callback, bodylist = c if len(bodylist) == 0: # Without bodylist it's a universal callback (for all bodies) callback(point) else: # This is a callback with specified bodies # See if this contact involves one of the specified b1 = str(point.shape1.GetBody()) b2 = str(point.shape2.GetBody()) for s in bodylist: s = str(s) if b1 == s or b2 == s: # Yes, that's the one :) callback(point) def Add(self, point): """Called when a contact point is created""" self.check_contact(CALLBACK_CONTACT_ADD, point) def Persist(self, point): """Called when a contact point persists for more than a time step""" self.check_contact(CALLBACK_CONTACT_PERSIST, point) def Remove(self, point): """Called when a contact point is removed""" self.check_contact(CALLBACK_CONTACT_REMOVE, point) Pippy-71/library/pippy/physics/myelements/camera.py000066400000000000000000000105331311421132100226460ustar00rootroot00000000000000""" This file is part of the 'Elements' Project Elements is a 2D Physics API for Python (supporting Box2D2) Copyright (C) 2008, The Elements Team, Home: http://elements.linuxuser.at IRC: #elements on irc.freenode.org Code: http://www.assembla.com/wiki/show/elements svn co http://svn2.assembla.com/svn/elements License: GPLv3 | See LICENSE for the full text 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 . """ from .locals import * class Camera: """ The Camera class. We will see :) Please also see: http://www.assembla.com/spaces/elements/tickets/31 This class currently handles: - Scaling factor - Screen Offset from the World Coordinate System Inputs from the user have to be checked for them. - Places to check for it: elements.py, drawing.py, add_objects.py """ # All coords to the renderer are multiplied with the scale factor # in elements.draw() scale_factor = 1.0 # Body which means to be tracked. Offset is set at each elements.draw() track_body = None def __init__(self, parent): self.parent = parent def track(self, body): """ Start tracking a specific body """ self.track_body = body def track_stop(self): """ Stop tracking a body """ self.track_body = None def center(self, pos, screenCoord=True, stopTrack=True): """ Centers the camera at given screen coordinates -- in pixel Typical call: world.camera.center(event.pos) Problem: Works ONLY WITH screenCoord now! """ x, y = pos x -= self.parent.display_width / 2 y -= self.parent.display_height / 2 if screenCoord: x /= self.scale_factor y /= self.scale_factor # Set the offset self.inc_offset((x, y), screenCoord, stopTrack) def set_offset(self, offset, screenCoord=True, stopTrack=True): """ Set an offset from the screen to the world cs -- in screen (or world) coordinates and in pixel """ # Stop tracking of an object if stopTrack: self.track_stop() # If screenCoords, we have to bring them to the world cs if screenCoord: x, y = self.parent.to_world(offset) else: x, y = offset self._set_offset((x / self.parent.ppm, y / self.parent.ppm)) def inc_offset(self, offset, screenCoord=True, stopTrack=True): """ Increment an offset from the screen to the world cs -- in world coordinates and in pixel """ # Stop tracking of an object if stopTrack: self.track_stop() # Get Current Offset x, y = self.parent.screen_offset_pixel dx, dy = offset # Bring the directions into the world coordinate system if screenCoord: if self.parent.inputAxis_x_left: dx *= -1 if self.parent.inputAxis_y_down: dy *= -1 # Set New Offset self._set_offset(((x + dx) / self.parent.ppm, (y + dy) / self.parent.ppm)) def _set_offset(self, offset): """ Set the screen offset to the world coordinate system (using meters and the world coordinate system's orientation) """ x, y = offset self.parent.screen_offset = (x, y) self.parent.screen_offset_pixel = (x * self.parent.ppm, y * self.parent.ppm) def set_scale_factor(self, factor=1.0): """ Zoom factor for the renderer 1.0 = 1:1 (original) """ self.scale_factor = factor def inc_scale_factor(self, factor=0.0): """ Increases the zooms for the renderer a given factor """ self.scale_factor += factor Pippy-71/library/pippy/physics/myelements/drawing.py000066400000000000000000000256111311421132100230540ustar00rootroot00000000000000""" This file is part of the 'Elements' Project Elements is a 2D Physics API for Python (supporting Box2D2) Copyright (C) 2008, The Elements Team, Home: http://elements.linuxuser.at IRC: #elements on irc.freenode.org Code: http://www.assembla.com/wiki/show/elements svn co http://svn2.assembla.com/svn/elements License: GPLv3 | See LICENSE for the full text 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 . """ from math import pi from math import cos from math import sin from . import tools # Functions of a rendering class # mandatory: # __init__ # start_drawing # after_drawing # draw_circle # draw_polygon # draw_lines # set_lineWidth # # renderer-specific mandatory functions: # for pygame: # set_surface # for cairo: # draw_text # for opengl: # # IMPORTANT # The drawing functions get the coordinates in their screen coordinate system # no need for translations anymore :) class draw_pygame(object): """ This class handles the drawing with pygame, which is really simple since we only need draw_ellipse and draw_polygon. """ lineWidth = 0 def __init__(self): """ Load pygame.draw and pygame.Rect, and reference it for the drawing methods Parameters: surface .... pygame surface (default: None) lineWidth .. Return: Class draw_pygame() """ print "* Pygame selected as renderer" from pygame import draw from pygame import Rect self.draw = draw self.Rect = Rect def set_lineWidth(self, lw): """ """ self.lineWidth = lw def set_surface(self, surface): """ """ self.surface = surface def get_surface(self): """ """ return self.surface def start_drawing(self): pass def after_drawing(self): pass def draw_circle(self, clr, pt, radius, angle): """ Draw a circle Parameters: pt ........ (x, y) clr ....... color in rgb ((r), (g), (b)) radius .... circle radius angle ..... rotation in radians Return: - """ x, y = pt x1 = x - radius y1 = y - radius rect = self.Rect([x1, y1, 2 * radius, 2 * radius]) self.draw.ellipse(self.surface, clr, rect, self.lineWidth) # draw the orientation vector if radius > 10: rx = cos(angle) * radius ry = -sin(angle) * radius self.draw.line(self.surface, (255, 255, 255), pt, (x + rx, y + ry)) def draw_polygon(self, clr, points): """ Draw a polygon Parameters: clr ....... color in rgb ((r), (g), (b)) points .... polygon points in normal (x,y) positions Return: - """ self.draw.polygon(self.surface, clr, points, self.lineWidth) # self.draw.lines(self.surface, clr, True, points) def draw_lines(self, clr, closed, points, width=None): """ Draw a polygon Parameters: clr ....... color in rgb ((r), (g), (b)) points .... polygon points in normal (x,y) positions Return: - """ if width is None: lw = self.lineWidth else: lw = width self.draw.lines(self.surface, clr, closed, points, lw) class draw_cairo(object): """ This class handles the drawing with cairo, which is really simple since we only need draw_ellipse and draw_polygon. """ window = None da = None circle_surface = None box_surface = None def __init__(self, drawMethod="filled"): """ Load cairo.draw and cairo.Rect, and reference it for the drawing methods Return: Class draw_cairo() """ print "* Cairo selected as renderer" import cairo self.cairo = cairo self.set_drawing_method(drawMethod) # self.draw_box = self.draw_box_image def set_lineWidth(self, lw): # unused self.lineWidth = lw def set_drawing_area(self, da): """ Set the area for Cairo to draw to da ...... drawing area (gtk.DrawingArea) Return: - """ self.da = da self.window = da.window print "* Cairo renderer drawing area set" def set_drawing_method(self, type): """ type = filled, image """ self.draw_circle = getattr(self, "draw_circle_%s" % type) # self.draw_box = getattr(self, "draw_box_%s" % type) def start_drawing(self): self.width, self.height = self.window.get_size() self.imagesurface = self.cairo.ImageSurface( self.cairo.FORMAT_ARGB32, self.width, self.height) self.ctx = ctx = self.cairo.Context(self.imagesurface) ctx.set_source_rgb(1, 1, 1) # background color ctx.paint() ctx.move_to(0, 0) ctx.set_source_rgb(0, 0, 0) # defaults for the rest of the drawing ctx.set_line_width(1) ctx.set_tolerance(0.1) ctx.set_line_join(self.cairo.LINE_CAP_BUTT) # LINE_CAP_BUTT, LINE_CAP_ROUND, LINE_CAP_SQUARE, # LINE_JOIN_BEVEL, LINE_JOIN_MITER, LINE_JOIN_ROUND # ctx.set_dash([20/4.0, 20/4.0], 0) def after_drawing(self): dest_ctx = self.window.cairo_create() dest_ctx.set_source_surface(self.imagesurface) dest_ctx.paint() def set_circle_image(self, filename): self.circle_surface = self.cairo.ImageSurface.create_from_png(filename) self.draw_circle = self.draw_circle_image # def set_box_image(self, filename): # self.box_surface = self.cairo.ImageSurface.create_from_png(filename) # self.draw_box = self.draw_box_image def draw_circle_filled(self, clr, pt, radius, angle=0): x, y = pt clr = tools.rgb2floats(clr) self.ctx.set_source_rgb(*clr) self.ctx.move_to(x, y) self.ctx.arc(x, y, radius, 0, 2 * pi) self.ctx.fill() def draw_circle(): pass def draw_circle_image(self, clr, pt, radius, angle=0, sf=None): if sf is None: sf = self.circle_surface x, y = pt self.ctx.save() self.ctx.translate(x, y) self.ctx.rotate(-angle) image_r = sf.get_width() / 2 scale = float(radius) / image_r self.ctx.scale(scale, scale) self.ctx.translate(-0.5 * sf.get_width(), -0.5 * sf.get_height()) self.ctx.set_source_surface(sf) self.ctx.paint() self.ctx.restore() def draw_image(self, source, pt, scale=1.0, rot=0, sourcepos=(0, 0)): self.ctx.save() self.ctx.rotate(rot) self.ctx.scale(scale, scale) destx, desty = self.ctx.device_to_user_distance(pt[0], pt[1]) self.ctx.set_source_surface(source, destx - sourcepos[0], desty - sourcepos[1]) self.ctx.rectangle(destx, desty, source.get_width(), source.get_height()) self.ctx.fill() self.ctx.restore() def draw_polygon(self, clr, points): """ Draw a polygon Parameters: clr ....... color in rgb ((r), (g), (b)) points .... polygon points in normal (x,y) positions Return: - """ clr = tools.rgb2floats(clr) self.ctx.set_source_rgb(clr[0], clr[1], clr[2]) pt = points[0] self.ctx.move_to(pt[0], pt[1]) for pt in points[1:]: self.ctx.line_to(pt[0], pt[1]) self.ctx.fill() def draw_text(self, text, center, clr=(0, 0, 0), size=12, fontname="Georgia"): clr = tools.rgb2floats(clr) self.ctx.set_source_rgb(clr[0], clr[1], clr[2]) self.ctx.select_font_face(fontname, self.cairo.FONT_SLANT_NORMAL, self.cairo.FONT_WEIGHT_NORMAL) self.ctx.set_font_size(size) x_bearing, y_bearing, width, height = self.ctx.text_extents(text)[:4] self.ctx.move_to(center[0] + 0.5 - width / 2 - x_bearing, center[1] + 0.5 - height / 2 - y_bearing) self.ctx.show_text(text) def draw_lines(self, clr, closed, points): """ Draw a polygon Parameters: clr ....... color in rgb ((r), (g), (b)) closed .... whether or not to close the lines (as a polygon) points .... polygon points in normal (x,y) positions Return: - """ clr = tools.rgb2floats(clr) self.ctx.set_source_rgb(clr[0], clr[1], clr[2]) pt = points[0] self.ctx.move_to(pt[0], pt[1]) for pt in points[1:]: self.ctx.line_to(pt[0], pt[1]) if closed: pt = points[0] self.ctx.line_to(pt[0], pt[1]) self.ctx.stroke() class draw_opengl_pyglet(object): """ This class handles the drawing with pyglet """ lineWidth = 0 def __init__(self): """ Load pyglet.gl, and reference it for the drawing methods Parameters: surface .... not used with pyglet lineWidth .. """ print "* OpenGL_Pyglet selected as renderer" from pyglet import gl self.gl = gl def set_lineWidth(self, lw): self.lineWidth = lw def draw_circle(self, clr, pt, radius, a=0): clr = tools.rgb2floats(clr) self.gl.glColor3f(clr[0], clr[1], clr[2]) x, y = pt segs = 15 coef = 2.0 * pi / segs self.gl.glBegin(self.gl.GL_LINE_LOOP) for n in range(segs): rads = n * coef self.gl.glVertex2f(radius * cos(rads + a) + x, radius * sin(rads + a) + y) self.gl.glVertex2f(x, y) self.gl.glEnd() def draw_polygon(self, clr, points): clr = tools.rgb2floats(clr) self.gl.glColor3f(clr[0], clr[1], clr[2]) self.gl.glBegin(self.gl.GL_LINES) p1 = points[0] for p in points[1:]: x1, y1 = p1 x2, y2 = p1 = p self.gl.glVertex2f(x1, y1) self.gl.glVertex2f(x2, y2) x1, y1 = points[0] self.gl.glVertex2f(x2, y2) self.gl.glVertex2f(x1, y1) self.gl.glEnd() def draw_lines(self, clr, closed, points): pass def start_drawing(self): pass def after_drawing(self): pass Pippy-71/library/pippy/physics/myelements/elements.py000066400000000000000000000551511311421132100232370ustar00rootroot00000000000000#!/usr/bin/python """ This file is part of the 'Elements' Project Elements is a 2D Physics API for Python (supporting pybox2d) Copyright (C) 2008, The Elements Team, Home: http://elements.linuxuser.at IRC: #elements on irc.freenode.org Code: http://www.assembla.com/wiki/show/elements svn co http://svn2.assembla.com/svn/elements License: GPLv3 | See LICENSE for the full text 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 . """ __version__ = '0.11' __contact__ = '' # Load Box2D try: import Box2D as box2d except: print 'Could not load the pybox2d library (Box2D).' print 'Please run "setup.py install" to install the dependencies.' print print 'Or recompile pybox2d for your system and python version.' print "See http://code.google.com/p/pybox2d" exit() # Standard Imports from random import shuffle # Load Elements Definitions from .locals import * # Load Elements Modules from . import tools from . import drawing from . import add_objects from . import callbacks from . import camera # Main Class class Elements: """The class which handles all interaction with the box2d engine """ # Settings run_physics = True # Can pause the simulation element_count = 0 # Element Count renderer = None # Drawing class (from drawing.py) # Default Input in Pixels! (can change to INPUT_METERS) input_unit = INPUT_PIXELS line_width = 0 # Line Width in Pixels (0 for fill) listener = None # Offset screen from world coordinate system (x, y) [meter5] screen_offset = (0, 0) # Offset screen from world coordinate system (x, y) [pixel] screen_offset_pixel = (0, 0) # The internal coordination system is y+=up, x+=right # But it's possible to change the input coords to something else, # they will then be translated on input inputAxis_x_left = False # positive to the right by default inputAxis_y_down = True # positive to up by default mouseJoint = None def __init__(self, screen_size, gravity=(0.0, -9.0), ppm=100.0, renderer='pygame'): """ Init the world with boundaries and gravity, and init colors. Parameters: screen_size .. (w, h) -- screen size in pixels [int] gravity ...... (x, y) in m/s^2 [float] default: (0.0, -9.0) ppm .......... pixels per meter [float] default: 100.0 renderer ..... which drawing method to use (str) default: 'pygame' Return: class Elements() """ self.set_screenSize(screen_size) self.set_drawingMethod(renderer) # Create Subclasses self.add = add_objects.Add(self) self.callbacks = callbacks.CallbackHandler(self) self.camera = camera.Camera(self) # Gravity + Bodies will sleep on outside self.gravity = gravity self.doSleep = True self.PIN_MOTOR_RADIUS = 2 # Create the World self.world = box2d.b2World(self.gravity, self.doSleep) bodyDef = box2d.b2BodyDef() self.world.groundBody = self.world.CreateBody(bodyDef) # Init Colors self.init_colors() # Set Pixels per Meter self.ppm = ppm def set_inputUnit(self, input_unit): """ Change the input unit to either meter or pixels Parameters: input ... INPUT_METERS or INPUT_PIXELS Return: - """ self.input_unit = input_unit def set_inputAxisOrigin(self, left=True, top=False): """ Change the origin of the input coordinate system axis Parameters: left ... True or False -- x = 0 is at the left? top .... True or False -- y = 0 is at the top? Return: - """ self.inputAxis_x_left = not left self.inputAxis_y_down = top def set_drawingMethod(self, m, *kw): """ Set a drawing method (from drawing.py) Parameters: m .... 'pygame' or 'cairo' *kw .. keywords to pass to the initializer of the drawing method Return: True if ok, False if no method identifier m found """ try: self.renderer = getattr(drawing, "draw_%s" % m)(*kw) return True except AttributeError: return False def set_screenSize(self, size): """ Set the current screen size Parameters: size ... (int(width), int(height)) in pixels Return: - """ self.display_width, self.display_height = size def init_colors(self): """ Init self.colors with a fix set of hex colors Return: - """ self.fixed_color = None self.cur_color = 0 self.colors = [ "#737934", "#729a55", "#040404", "#1d4e29", "#ae5004", "#615c57", "#6795ce", "#203d61", "#8f932b" ] shuffle(self.colors) def set_color(self, clr): """ Set a fixed color for all future Elements (until reset_color() is called) Parameters: clr ... Hex '#123123' or RGB ((r), (g), (b)) Return: - """ self.fixed_color = clr def reset_color(self): """ All Elements from now on will be drawn in random colors Return: - """ self.fixed_color = None def get_color(self): """ Get a color - either the fixed one or the next from self.colors Return: clr = ((R), (G), (B)) """ if self.fixed_color is not None: return self.fixed_color if self.cur_color == len(self.colors): self.cur_color = 0 shuffle(self.colors) clr = self.colors[self.cur_color] if clr[0] == "#": clr = tools.hex2rgb(clr) self.cur_color += 1 return clr def update(self, fps=50.0, vel_iterations=10, pos_iterations=8): """ Update the physics, if not paused (self.run_physics) Parameters: fps ............. fps with which the physics engine shall work vel_iterations .. velocity substeps per step for smoother simulation pos_iterations .. position substeps per step for smoother simulation Return: - """ if self.run_physics: self.world.Step(1.0 / fps, vel_iterations, pos_iterations) def translate_coord(self, point): """ Flips the coordinates in another coordinate system orientation, if necessary (screen <> world coordinate system) """ x, y = point if self.inputAxis_x_left: x = self.display_width - x if self.inputAxis_y_down: y = self.display_height - y return (x, y) def translate_coords(self, pointlist): """Flips the coordinates in another coordinate system orientation, if necessary (screen <> world coordinate system) """ p_out = [] for p in pointlist: p_out.append(self.translate_coord(p)) return p_out def to_world(self, pos): """ Transfers a coordinate from the screen to the world coordinate system (pixels) - Change to the right axis orientation - Include the offset: screen -- world coordinate system - Include the scale factor (Screen coordinate system might have a scale factor) """ dx, dy = self.screen_offset_pixel x = pos[0] / self.camera.scale_factor y = pos[1] / self.camera.scale_factor x, y = self.translate_coord((round(x), round(y))) return(x + dx, y + dy) def to_screen(self, pos): """Transfers a coordinate from the world to the screen coordinate system (pixels) and by the screen offset """ dx, dy = self.screen_offset_pixel x = pos[0] - dx y = pos[1] - dy sx, sy = self.translate_coord((x, y)) return (sx * self.camera.scale_factor, sy * self.camera.scale_factor) def meter_to_screen(self, i): return i * self.ppm * self.camera.scale_factor def get_bodies_at_pos(self, search_point, include_static=False, area=0.01): """ Check if given point (screen coordinates) is inside any body. If yes, return all found bodies, if not found return False """ sx, sy = self.to_world(search_point) sx /= self.ppm sy /= self.ppm f = area / self.camera.scale_factor AABB = box2d.b2AABB() AABB.lowerBound = (sx - f, sy - f) AABB.upperBound = (sx + f, sy + f) query_cb = Query_CB() self.world.QueryAABB(query_cb, AABB) bodylist = [] for s in query_cb.fixtures: body = s.body if body is None: continue if not include_static: if body.type == box2d.b2_staticBody or body.mass == 0.0: continue if s.TestPoint((sx, sy)): bodylist.append(body) return bodylist def draw(self): """ If a drawing method is specified, this function passes the objects to the module in pixels. Return: True if the objects were successfully drawn False if the renderer was not set or another error occurred """ self.callbacks.start(CALLBACK_DRAWING_START) # No need to run through the loop if there's no way to draw if not self.renderer: return False if self.camera.track_body: # Get Body Center p1 = self.camera.track_body.GetWorldCenter() # Center the Camera There, False = Don't stop the tracking self.camera.center(self.to_screen((p1.x * self.ppm, p1.y * self.ppm)), stopTrack=False) # Walk through all known elements self.renderer.start_drawing() for body in self.world.bodies: xform = body.transform shape = body.fixtures angle = body.angle if shape: userdata = body.userData if 'color' in userdata: clr = userdata['color'] else: clr = self.colors[0] for shape in body.fixtures: type_ = shape.type if type_ == box2d.b2Shape.e_circle: position = box2d.b2Mul(xform, shape.shape.pos) pos = self.to_screen((position.x * self.ppm, position.y * self.ppm)) self.renderer.draw_circle( clr, pos, self.meter_to_screen(shape.shape.radius), angle) elif type_ == box2d.b2Shape.e_polygon: points = [] for v in shape.shape.vertices: pt = box2d.b2Mul(xform, v) x, y = self.to_screen((pt.x * self.ppm, pt.y * self.ppm)) points.append([x, y]) self.renderer.draw_polygon(clr, points) else: print "unknown shape type:%d" % shape.type for joint in self.world.joints: p2 = joint.anchorA p2 = self.to_screen((p2.x * self.ppm, p2.y * self.ppm)) p1 = joint.anchorB p1 = self.to_screen((p1.x * self.ppm, p1.y * self.ppm)) if isinstance(joint, box2d.b2RevoluteJoint): self.renderer.draw_circle((255, 255, 255), p1, self.PIN_MOTOR_RADIUS, 0) else: self.renderer.draw_lines((0, 0, 0), False, [p1, p2], 3) self.callbacks.start(CALLBACK_DRAWING_END) self.renderer.after_drawing() return True def set_pin_motor_radius(self, radius): self.PIN_MOTOR_RADIUS = radius def mouse_move(self, pos): pos = self.to_world(pos) x, y = pos x /= self.ppm y /= self.ppm if self.mouseJoint: self.mouseJoint.target = (x, y) def pickle_save(self, fn, additional_vars={}): import cPickle as pickle self.add.remove_mouseJoint() if not additional_vars and hasattr(self, '_pickle_vars'): additional_vars = dict((var, getattr(self, var)) for var in self._pickle_vars) save_values = [self.world, box2d.pickle_fix(self.world, additional_vars, 'save')] try: pickle.dump(save_values, open(fn, 'wb')) except Exception as s: print 'Pickling failed: ', s return print 'Saved to %s' % fn def pickle_load(self, fn, set_vars=True, additional_vars=[]): """ Load the pickled world in file fn. additional_vars is a dictionary to be populated with the loaded variables. """ import cPickle as pickle try: world, variables = pickle.load(open(fn, 'rb')) world = world._pickle_finalize() variables = box2d.pickle_fix(world, variables, 'load') except Exception as s: print 'Error while loading world: ', s return self.world = world if set_vars: # reset the additional saved variables: for var, value in variables.items(): if hasattr(self, var): setattr(self, var, value) else: print 'Unknown property %s=%s' % (var, value) print 'Loaded from %s' % fn return variables def json_save(self, path, additional_vars={}, serialize=False): import json worldmodel = {} save_id_index = 1 self.world.groundBody.userData = {"saveid": 0} bodylist = [] for body in self.world.bodies: if not body == self.world.groundBody: body.userData["saveid"] = save_id_index # set temporary data save_id_index += 1 shapelist = body.fixtures modelbody = {} modelbody['position'] = body.position.tuple modelbody['dynamic'] = body.type == box2d.b2_dynamicBody modelbody['userData'] = body.userData modelbody['angle'] = body.angle modelbody['angularVelocity'] = body.angularVelocity modelbody['linearVelocity'] = body.linearVelocity.tuple if shapelist and len(shapelist) > 0: shapes = [] for shape in shapelist: modelshape = {} modelshape['density'] = shape.density modelshape['restitution'] = shape.restitution modelshape['friction'] = shape.friction shapename = shape.shape.__class__.__name__ if shapename == "b2CircleShape": modelshape['type'] = 'circle' modelshape['radius'] = shape.shape.radius modelshape['localPosition'] = shape.shape.pos.tuple if shapename == "b2PolygonShape": modelshape['type'] = 'polygon' modelshape['vertices'] = shape.shape.vertices shapes.append(modelshape) modelbody['shapes'] = shapes bodylist.append(modelbody) worldmodel['bodylist'] = bodylist jointlist = [] for joint in self.world.joints: modeljoint = {} if joint.__class__.__name__ == "b2RevoluteJoint": modeljoint['type'] = 'revolute' modeljoint['anchor'] = joint.anchorA.tuple modeljoint['enableMotor'] = joint.motorEnabled modeljoint['motorSpeed'] = joint.motorSpeed modeljoint['maxMotorTorque'] = joint.GetMaxMotorTorque() elif joint.__class__.__name__ == "b2DistanceJoint": modeljoint['type'] = 'distance' modeljoint['anchor1'] = joint.anchorA.tuple modeljoint['anchor2'] = joint.anchorB.tuple modeljoint['body1'] = joint.bodyA.userData['saveid'] modeljoint['body2'] = joint.bodyB.userData['saveid'] modeljoint['collideConnected'] = joint.collideConnected modeljoint['userData'] = joint.userData jointlist.append(modeljoint) worldmodel['jointlist'] = jointlist controllerlist = [] worldmodel['controllerlist'] = controllerlist if serialize: addvars = additional_vars trackinfo = addvars['trackinfo'] backup = trackinfo for key, info in backup.iteritems(): if not info[3]: try: trackinfo[key][0] = info[0].userData['saveid'] trackinfo[key][1] = info[1].userData['saveid'] except AttributeError: pass else: addvars['trackinfo'][key][0] = None addvars['trackinfo'][key][1] = None additional_vars['trackinfo'] = trackinfo worldmodel['additional_vars'] = additional_vars f = open(path, 'w') f.write(json.dumps(worldmodel)) f.close() for body in self.world.bodies: del body.userData['saveid'] # remove temporary data def json_load(self, path, serialized=False): import json self.world.groundBody.userData = {"saveid": 0} f = open(path, 'r') worldmodel = json.loads(f.read()) f.close() # clean world for joint in self.world.joints: self.world.DestroyJoint(joint) for body in self.world.bodies: if body != self.world.groundBody: self.world.DestroyBody(body) # load bodies for body in worldmodel['bodylist']: bodyDef = box2d.b2BodyDef() if body['dynamic']: bodyDef.type = box2d.b2_dynamicBody bodyDef.position = body['position'] bodyDef.userData = body['userData'] bodyDef.angle = body['angle'] newBody = self.world.CreateBody(bodyDef) # _logger.debug(newBody) newBody.angularVelocity = body['angularVelocity'] newBody.linearVelocity = body['linearVelocity'] if 'shapes' in body: for shape in body['shapes']: if shape['type'] == 'polygon': polyDef = box2d.b2FixtureDef() polyShape = box2d.b2PolygonShape() polyShape.vertices = shape['vertices'] polyDef.shape = polyShape polyDef.density = shape['density'] polyDef.restitution = shape['restitution'] polyDef.friction = shape['friction'] newBody.CreateFixture(polyDef) if shape['type'] == 'circle': circleDef = box2d.b2FixtureDef() circleShape = box2d.b2CircleShape() circleShape.radius = shape['radius'] circleShape.pos = shape['localPosition'] circleDef.shape = circleShape circleDef.density = shape['density'] circleDef.restitution = shape['restitution'] circleDef.friction = shape['friction'] newBody.CreateFixture(circleDef) for joint in worldmodel['jointlist']: if joint['type'] == 'distance': jointDef = box2d.b2DistanceJointDef() body1 = self.getBodyWithSaveId(joint['body1']) anch1 = joint['anchor1'] body2 = self.getBodyWithSaveId(joint['body2']) anch2 = joint['anchor2'] jointDef.collideConnected = joint['collideConnected'] jointDef.Initialize(body1, body2, anch1, anch2) jointDef.userData = joint['userData'] self.world.CreateJoint(jointDef) if joint['type'] == 'revolute': jointDef = box2d.b2RevoluteJointDef() body1 = self.getBodyWithSaveId(joint['body1']) body2 = self.getBodyWithSaveId(joint['body2']) anchor = joint['anchor'] jointDef.Initialize(body1, body2, anchor) jointDef.userData = joint['userData'] jointDef.motorEnabled = joint['enableMotor'] jointDef.motorSpeed = joint['motorSpeed'] jointDef.maxMotorTorque = joint['maxMotorTorque'] self.world.CreateJoint(jointDef) self.additional_vars = {} addvars = {} for (k, v) in worldmodel['additional_vars'].items(): addvars[k] = v if serialized and 'trackinfo' in addvars: trackinfo = addvars['trackinfo'] for key, info in trackinfo.iteritems(): if not info[3]: addvars['trackinfo'][key][0] = \ self.getBodyWithSaveId(info[0]) addvars['trackinfo'][key][1] = \ self.getBodyWithSaveId(info[1]) else: addvars['trackinfo'][key][0] = None addvars['trackinfo'][key][1] = None self.additional_vars = addvars for body in self.world.bodies: del body.userData['saveid'] # remove temporary data def getBodyWithSaveId(self, saveid): for body in self.world.bodies: if body.userData['saveid'] == saveid: return body class Query_CB(box2d.b2QueryCallback): def __init__(self): box2d.b2QueryCallback.__init__(self) self.fixtures = [] def ReportFixture(self, fixture): self.fixtures.append(fixture) return True Pippy-71/library/pippy/physics/myelements/locals.py000066400000000000000000000022771311421132100227010ustar00rootroot00000000000000""" This file is part of the 'Elements' Project Elements is a 2D Physics API for Python (supporting Box2D2) Copyright (C) 2008, The Elements Team, Home: http://elements.linuxuser.at IRC: #elements on irc.freenode.org Code: http://www.assembla.com/wiki/show/elements svn co http://svn2.assembla.com/svn/elements License: GPLv3 | See LICENSE for the full text 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 . """ INPUT_METERS = 0 INPUT_PIXELS = 1 CALLBACK_CONTACT_ADD = 0 CALLBACK_CONTACT_PERSIST = 1 CALLBACK_CONTACT_REMOVE = 2 CALLBACK_DRAWING_START = 3 CALLBACK_DRAWING_END = 4 FLT_EPSILON = 1.192092896e-07 Pippy-71/library/pippy/physics/myelements/menu.py000066400000000000000000000156341311421132100223710ustar00rootroot00000000000000""" This file is part of the 'Elements' Project Elements is a 2D Physics API for Python (supporting Box2D2) Copyright (C) 2008, The Elements Team, Home: http://elements.linuxuser.at IRC: #elements on irc.freenode.org Code: http://www.assembla.com/wiki/show/elements svn co http://svn2.assembla.com/svn/elements License: GPLv3 | See LICENSE for the full text 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 . """ import pygame from pygame.locals import * from . import tools COLOR_HEX_BLUE1 = "6491a4" COLOR_HEX_BLUE2 = "9ec9ff" class MenuItem: # padding [px]: left, top, right, bottom padding = (5, 2, 5, 2) def empty(self, *args): pass def __init__(self, title, pos, userData, parent=None, callback=None): self.title = title self.userData = userData self.parent = parent self.childs = [] if self.parent: self.visible = False else: self.visible = True if callback: self.callback = callback else: self.callback = self.empty # Create Surface and Stuff :) self.font = pygame.font.Font(None, 32) text = self.font.render(title, 1, (255, 255, 255)) rx, ry, rw, rh = text.get_rect() pl, pt, pr, pb = self.padding s1 = pygame.Surface((rw + pl + pr, rh + pt + pb)) s1.fill(tools.hex2rgb(COLOR_HEX_BLUE1)) s1.blit(text, (pl, pt)) s2 = pygame.Surface((rw + pl + pr, rh + pt + pb)) s2.fill(tools.hex2rgb(COLOR_HEX_BLUE2)) s2.blit(text, (pl, pt)) self.rect = s1.get_rect().move(pos) self.surface_inactive = s1 self.surface_active = s2 def pos_inside(self, pos): if not self.visible: return False x, y, w, h = self.rect px, py = pos if px > x and px < x + w and py > y and py < y + h: return True else: return False class MenuClass: """ Important: Never delete an Item, just overwrite it if deleting, else the menuitem id's get messed up """ # current active menu point it focus = False # each item is stored as MenuItem items = [] # where to start drawing start_at = (0, 0) # menubar properties height = 0 # px width = 0 # px (set in set_width) # if width was set by hand (if not, increase width by adding stuff) setWidth = False def __init__(self): self.draw_at = self.start_at def set_width(self, width): self.setWidth = True self.width = width def addItem(self, title, callback=None, userData='', parent=None): # Get position for the Item if parent: draw_at = (0, 0) else: draw_at = self.draw_at # Create Items M = MenuItem(title=title, pos=draw_at, userData=userData, parent=parent, callback=callback) self.items.append(M) # Set a new position x, y, w, h = M.rect x, y = self.draw_at if parent: # Set the info that the item has a child to the parent item self.items[parent - 1].childs.append(len(self.items) - 1) else: # New next drawing position self.draw_at = (x + w, y) # Adjust the width of the menu bar if not self.setWidth: self.width = x + w # Adjust the height of the menu bar if h > self.height: self.height = h + 2 # Return array id of this item return len(self.items) def click(self, pos): """ Checks a click for menuitems and starts the callback if found Return: True if a menu item was found or hit the MenuBar, and False if not """ focus_in = self.focus found = False for i in xrange(len(self.items)): item = self.items[i] if item.pos_inside(pos): found = True item.callback(item.title, item.userData) # Expand the menu if necessary if len(item.childs) > 0: self.focus = i + 1 # Close any opened menu windows if clicked somewhere else if self.focus == focus_in: self.focus = False self.subwin_rect = (0, 0, 0, 0) for item in self.items: if item.parent: item.visible = False # Check if click is inside menubar x, y = pos mx, my = self.start_at if found: return True else: return False def draw(self, surface): """ Draw the menu with pygame on a given surface """ s = pygame.Surface((self.width, self.height)) s.fill(tools.hex2rgb(COLOR_HEX_BLUE1)) surface.blit(s, (0, 0)) for i in xrange(len(self.items)): item = self.items[i] if not item.parent: x, y, w, h = item.rect if self.focus == i + 1: surface.blit(item.surface_active, (x, y)) else: surface.blit(item.surface_inactive, (x, y)) # If a menu item is open, draw that if self.focus: width = 0 height = 0 i = [] for j in self.items: if j.parent == self.focus: i.append(j) x, y, w, h = j.rect if w > width: width = w height += h if len(i) > 0: s = pygame.Surface((width, height)) s.fill(tools.hex2rgb(COLOR_HEX_BLUE1)) # Parent Coordinates px, py, pw, ph = self.items[self.focus - 1].rect # y Counter y = 0 for item in i: item.visible = True s.blit(item.surface_inactive, (0, y)) ix, iy, iw, ih = item.rect if (ix, iy) == (0, 0): item.rect = item.rect.move((px, y + ph)) ix, iy, iw, ih = item.rect if iw < width: item.rect = (ix, iy, width, ih) y += ih surface.blit(s, (px, py + ph)) self.subwin_rect = s.get_rect().move(px, py + ph) Pippy-71/library/pippy/physics/myelements/tools.py000066400000000000000000000041051311421132100225540ustar00rootroot00000000000000""" This file is part of the 'Elements' Project Elements is a 2D Physics API for Python (supporting Box2D2) Copyright (C) 2008, The Elements Team, Home: http://elements.linuxuser.at IRC: #elements on irc.freenode.org Code: http://www.assembla.com/wiki/show/elements svn co http://svn2.assembla.com/svn/elements License: GPLv3 | See LICENSE for the full text 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 . """ # Some Hex Tools def hex2dec(hex): """ Convert and hex value in a decimal number """ return int(hex, 16) def hex2rgb(hex): """ Convert a hex color (#123abc) in RGB ((r), (g), (b)) """ if hex[0: 1] == '#': hex = hex[1:] return (hex2dec(hex[:2]), hex2dec(hex[2: 4]), hex2dec(hex[4: 6])) def rgb2floats(rgb): """Convert a color in the RGB (0..255,0..255,0..255) format to the (0..1, 0..1, 0..1) float format """ ret = [] for c in rgb: ret.append(float(c) / 255) return ret def point_in_poly(point, poly): # print ">", point, poly x, y = point n = len(poly) inside = False p1x, p1y = poly[0] for i in range(n + 1): p2x, p2y = poly[i % n] if y > min(p1y, p2y): if y <= max(p1y, p2y): if x <= max(p1x, p2x): if p1y != p2y: xinters = (y - p1y) * (p2x - p1x) / (p2y - p1y) + p1x if p1x == p2x or x <= xinters: inside = not inside p1x, p1y = p2x, p2y return inside Pippy-71/library/pippy/physics/myelements/tools_poly.py000066400000000000000000000224351311421132100236250ustar00rootroot00000000000000""" This file is part of the 'Elements' Project Elements is a 2D Physics API for Python (supporting Box2D2) Copyright (C) 2008, The Elements Team, Home: http://elements.linuxuser.at IRC: #elements on irc.freenode.org Code: http://www.assembla.com/wiki/show/elements svn co http://svn2.assembla.com/svn/elements License: GPLv3 | See LICENSE for the full text 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 . """ from functools import partial from math import fabs from math import sqrt from math import atan2 from math import degrees from math import acos from .locals import * def calc_center(points): """ Calculate the center of a polygon Return: The center (x,y) """ tot_x, tot_y = 0, 0 for p in points: tot_x += p[0] tot_y += p[1] n = len(points) return (tot_x / n, tot_y / n) def poly_center_vertices(pointlist): """ Rearranges vectors around the center Return: pointlist ([(x, y), ...]) """ poly_points_center = [] cx, cy = calc_center(pointlist) for p in pointlist: x = p[0] - cx y = cy - p[1] poly_points_center.append((x, y)) return poly_points_center def is_line(vertices, tolerance=25.0): """ Check if passed vertices are a line. Done by comparing the angles of all vectors and check tolerance. Parameters: vertices ... a list of vertices (x, y) tolerance .. how many degrees should be allowed max to be a line Returns: True if line, False if no line """ if len(vertices) <= 2: return True # Step 1: Points -> Vectors p_old = vertices[0] alphas = [] for p in vertices[1:]: x1, y1 = p_old x2, y2 = p p_old = p # Create Vector vx, vy = (x2 - x1, y2 - y1) # Check Length l = sqrt((vx * vx) + (vy * vy)) if l == 0.0: continue # Normalize vector vx /= l vy /= l # Append angle if fabs(vx) < 0.2: alpha = 90.0 else: alpha = degrees(atan2(vy, vx)) alphas.append(fabs(alpha)) # Sort angles alphas.sort() # Get maximum difference alpha_diff = fabs(alphas[-1] - alphas[0]) print "alpha difference:", alpha_diff if alpha_diff < tolerance: return True else: return False def reduce_poly_by_angle(vertices, tolerance=10.0, minlen=20): """ This function reduces a poly by the angles of the vectors (detect lines). If the angle difference from one vector to the last > tolerance: use last point. If the angle is quite the same, it's on the line. Parameters: vertices ... a list of vertices (x, y) tolerance .. how many degrees should be allowed max Returns: (1) New Pointlist, (2) Soft reduced pointlist (reduce_poly()) """ v_last = vertices[-1] vertices = vxx = reduce_poly(vertices, minlen) p_new = [] p_new.append(vertices[0]) dir = None is_convex = True for i in xrange(len(vertices) - 1): if i == 0: p_old = vertices[i] continue x1, y1 = p_old x2, y2 = vertices[i] x3, y3 = vertices[i + 1] p_old = vertices[i] # Create Vectors v1x = (x2 - x1) * 1.0 v1y = (y2 - y1) * 1.0 v2x = (x3 - x2) * 1.0 v2y = (y3 - y2) * 1.0 # Calculate angle a = ((v1x * v2x) + (v1y * v2y)) b = sqrt((v1x * v1x) + (v1y * v1y)) c = sqrt((v2x * v2x) + (v2y * v2y)) # No Division by 0 :) if (b * c) == 0.0: continue # Get the current degrees # We have a bug here sometimes... try: angle = degrees(acos(a / (b * c))) except: # cos=1.0 print "cos=", a / (b * c) continue # Check if inside tolerance if fabs(angle) > tolerance: p_new.append(vertices[i]) # print "x", 180-angle, is_left(vertices[i-1], # vertices[i], vertices[i+1]) # Check if convex: if dir is None: dir = is_left(vertices[i - 1], vertices[i], vertices[i + 1]) else: if dir != is_left(vertices[i - 1], vertices[i], vertices[i + 1]): is_convex = False # We also want to append the last point :) p_new.append(v_last) # Returns: (1) New Pointlist, (2) Soft reduced pointlist (reduce_poly()) return p_new, is_convex """ OLD FUNCTION: """ # Wipe all points too close to each other vxx = vertices = reduce_poly(vertices, minlen) # Create Output List p_new = [] p_new.append(vertices[0]) # Set the starting vertice p_old = vertices[0] alpha_old = None # For each vector, compare the angle difference to the last one for i in range(1, len(vertices)): x1, y1 = p_old x2, y2 = vertices[i] p_old = (x2, y2) # Make Vector vx, vy = (x2 - x1, y2 - y1) # Vector length l = sqrt((vx * vx) + (vy * vy)) # normalize vx /= l vy /= l # Get Angle if fabs(vx) < 0.2: alpha = 90 else: alpha = degrees(atan2(vy, vx)) if alpha_old is None: alpha_old = alpha continue # Get difference to previous angle alpha_diff = fabs(alpha - alpha_old) alpha_old = alpha # If the new vector differs from the old one, we add the old point # to the output list, as the line changed it's way :) if alpha_diff > tolerance: # print ">",alpha_diff, "\t", vx, vy, l p_new.append(vertices[i - 1]) # We also want to append the last point :) p_new.append(vertices[-1]) # Returns: (1) New Pointlist, (2) Soft reduced pointlist (reduce_poly()) return p_new, vxx # The following functions is_left, reduce_poly and convex_hull are # from the pymunk project (http://code.google.com/p/pymunk/) def is_left(p0, p1, p2): """Test if p2 is left, on or right of the (infinite) line (p0,p1). :return: > 0 for p2 left of the line through p0 and p1 = 0 for p2 on the line < 0 for p2 right of the line """ sorting = (p1[0] - p0[0]) * (p2[1] - p0[1]) - (p2[0] - p0[0]) * \ (p1[1] - p0[1]) if sorting > 0: return 1 elif sorting < 0: return -1 else: return 0 def is_convex(points): """Test if a polygon (list of (x,y)) is strictly convex or not. :return: True if the polygon is convex, False otherwise """ # assert len(points) > 2, "not enough points to form a polygon" p0 = points[0] p1 = points[1] p2 = points[2] xc, yc = 0, 0 is_same_winding = is_left(p0, p1, p2) for p2 in points[2:] + [p0] + [p1]: if is_same_winding != is_left(p0, p1, p2): return False a = p1[0] - p0[0], p1[1] - p0[1] # p1-p0 b = p2[0] - p1[0], p2[1] - p1[1] # p2-p1 if sign(a[0]) != sign(b[0]): xc += 1 if sign(a[1]) != sign(b[1]): yc += 1 p0, p1 = p1, p2 return xc <= 2 and yc <= 2 def sign(x): if x < 0: return -1 else: return 1 def reduce_poly(points, tolerance=50): """Remove close points to simplify a polyline tolerance is the min distance between two points squared. :return: The reduced polygon as a list of (x,y) """ curr_p = points[0] reduced_ps = [points[0]] for p in points[1:]: x1, y1 = curr_p x2, y2 = p dx = fabs(x2 - x1) dy = fabs(y2 - y1) l = sqrt((dx * dx) + (dy * dy)) if l > tolerance: curr_p = p reduced_ps.append(p) return reduced_ps def convex_hull(points): """Create a convex hull from a list of points. This function uses the Graham Scan Algorithm. :return: Convex hull as a list of (x,y) """ # Find lowest rightmost point p0 = points[0] for p in points[1:]: if p[1] < p0[1]: p0 = p elif p[1] == p0[1] and p[0] > p0[0]: p0 = p points.remove(p0) # Sort the points angularly about p0 as center f = partial(is_left, p0) points.sort(cmp=f) points.reverse() points.insert(0, p0) # Find the hull points hull = [p0, points[1]] for p in points[2:]: pt1 = hull[-1] pt2 = hull[-2] l = is_left(pt2, pt1, p) if l > 0: hull.append(p) else: while l <= 0 and len(hull) > 2: hull.pop() pt1 = hull[-1] pt2 = hull[-2] l = is_left(pt2, pt1, p) hull.append(p) return hull Pippy-71/library/pippy/query.py000066400000000000000000000260051311421132100167200ustar00rootroot00000000000000# Copyright (C) 2007 One Laptop per Child # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import logging import dbus import gobject from sugar.datastore import datastore DS_DBUS_SERVICE = 'org.laptop.sugar.DataStore' DS_DBUS_INTERFACE = 'org.laptop.sugar.DataStore' DS_DBUS_PATH = '/org/laptop/sugar/DataStore' # Properties the journal cares about. PROPERTIES = ['uid', 'title', 'mtime', 'timestamp', 'keep', 'buddies', 'icon-color', 'mime_type', 'progress', 'activity', 'mountpoint', 'activity_id'] class _Cache(gobject.GObject): __gtype_name__ = 'query_Cache' __gsignals__ = { 'modified': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])) } def __init__(self, jobjects=None): gobject.GObject.__init__(self) self._array = [] self._dict = {} if jobjects is not None: self.append_all(jobjects) logging.debug('_Cache.__init__: connecting signals.') bus = dbus.SessionBus() datastore = dbus.Interface( bus.get_object(DS_DBUS_SERVICE, DS_DBUS_PATH), DS_DBUS_INTERFACE) self._datastore_created_handler = \ datastore.connect_to_signal('Created', self._datastore_created_cb) self._datastore_updated_handler = \ datastore.connect_to_signal('Updated', self._datastore_updated_cb) self._datastore_deleted_handler = \ datastore.connect_to_signal('Deleted', self._datastore_deleted_cb) def prepend_all(self, jobjects): for jobject in jobjects[::-1]: self._array.insert(0, jobject) self._dict[jobject.object_id] = jobject def append_all(self, jobjects): for jobject in jobjects: self._array.append(jobject) self._dict[jobject.object_id] = jobject def remove_all(self, jobjects): jobjects = jobjects[:] for jobject in jobjects: obj = self._dict[jobject.object_id] self._array.remove(obj) del self._dict[obj.object_id] obj.destroy() def __len__(self): return len(self._array) def __getitem__(self, key): if isinstance(key, basestring): return self._dict[key] else: return self._array[key] def destroy(self): logging.debug('_Cache.destroy: will disconnect signals.') self._datastore_created_handler.remove() self._datastore_updated_handler.remove() self._datastore_deleted_handler.remove() self._destroy_jobjects(self._array) self._array = [] self._dict = {} def _invalidate(self): self._destroy_jobjects(self._array) self._array = [] self._dict = {} self.emit('modified') def _destroy_jobjects(self, jobjects): for jobject in jobjects: jobject.destroy() def _datastore_created_cb(self, uid): logging.debug('_datastore_created_cb: %r' % uid) self._invalidate() def _datastore_updated_cb(self, uid): logging.debug('_datastore_updated_cb: %r' % uid) if uid in self._dict: jobject = datastore.get(uid) index = self._array.index(self._dict[uid]) self._array[index].destroy() self._array[index] = jobject self._dict[uid] = jobject self.emit('modified') def _datastore_deleted_cb(self, uid): logging.debug('_datastore_deleted_cb: %r' % uid) self._invalidate() class ResultSet(gobject.GObject): __gtype_name__ = 'ResultSet' __gsignals__ = { 'modified': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])) } _CACHE_LIMIT = 80 def __init__(self, query, sorting): gobject.GObject.__init__(self) self._total_count = -1 self._position = -1 self._query = query self._sorting = sorting self._offset = 0 self._cache = _Cache() self._cache_modified_handler = \ self._cache.connect('modified', self._cache_modified_cb) def destroy(self): self._cache.disconnect(self._cache_modified_handler) self._cache.destroy() del self._cache def get_length(self): if self._total_count == -1: jobjects, self._total_count = datastore.find( self._query, sorting=self._sorting, limit=ResultSet._CACHE_LIMIT, properties=PROPERTIES) self._cache.append_all(jobjects) self._offset = 0 return self._total_count length = property(get_length) def seek(self, position): self._position = position def read(self, max_count): logging.debug('ResultSet.read position: %r' % self._position) if max_count * 5 > ResultSet._CACHE_LIMIT: raise RuntimeError( 'max_count (%i) too big for ResultSet._CACHE_LIMIT' ' (%i).' % (max_count, ResultSet._CACHE_LIMIT)) if self._position == -1: self.seek(0) if self._position < self._offset: remaining_forward_entries = 0 else: remaining_forward_entries = \ self._offset + len(self._cache) - self._position if self._position > self._offset + len(self._cache): remaining_backwards_entries = 0 else: remaining_backwards_entries = self._position - self._offset last_cached_entry = self._offset + len(self._cache) if (remaining_forward_entries <= 0 and remaining_backwards_entries <= 0) or \ max_count > ResultSet._CACHE_LIMIT: # Total cache miss: remake it offset = max(0, self._position - max_count) logging.debug('remaking cache, offset: %r limit: %r' % (offset, max_count * 2)) jobjects, self._total_count = datastore.find( self._query, sorting=self._sorting, offset=offset, limit=ResultSet._CACHE_LIMIT, properties=PROPERTIES) self._cache.remove_all(self._cache) self._cache.append_all(jobjects) self._offset = offset elif remaining_forward_entries < 2 * max_count and \ last_cached_entry < self._total_count: # Add one page to the end of cache logging.debug('appending one more page, offset: %r' % last_cached_entry) jobjects, self._total_count = datastore.find( self._query, sorting=self._sorting, offset=last_cached_entry, limit=max_count, properties=PROPERTIES) # update cache self._cache.append_all(jobjects) # apply the cache limit objects_excess = len(self._cache) - ResultSet._CACHE_LIMIT if objects_excess > 0: self._offset += objects_excess self._cache.remove_all(self._cache[:objects_excess]) elif remaining_backwards_entries < 2 * max_count and self._offset > 0: # Add one page to the beginning of cache limit = min(self._offset, max_count) self._offset = max(0, self._offset - max_count) logging.debug('prepending one more page, offset: %r limit: %r' % (self._offset, limit)) jobjects, self._total_count = datastore.find( self._query, sorting=self._sorting, offset=self._offset, limit=limit, properties=PROPERTIES) # update cache self._cache.prepend_all(jobjects) # apply the cache limit objects_excess = len(self._cache) - ResultSet._CACHE_LIMIT if objects_excess > 0: self._cache.remove_all(self._cache[-objects_excess:]) else: logging.debug('cache hit and no need to grow the cache') first_pos = self._position - self._offset last_pos = self._position - self._offset + max_count return self._cache[first_pos:last_pos] def _cache_modified_cb(self, cache): logging.debug('_cache_modified_cb') if not len(self._cache): self._total_count = -1 self.emit('modified') def find(query, sorting=['-mtime']): result_set = ResultSet(query, sorting) return result_set if __name__ == "__main__": TOTAL_ITEMS = 1000 SCREEN_SIZE = 10 def mock_debug(string): print "\tDEBUG: %s" % string logging.debug = mock_debug def mock_find(query, sorting=None, limit=None, offset=None, properties=[]): print "mock_find %r %r" % (offset, (offset + limit)) if limit is None or offset is None: raise RuntimeError("Unimplemented test.") result = [] for index in range(offset, offset + limit): obj = datastore.DSObject(index, datastore.DSMetadata({}), '') result.append(obj) return result, TOTAL_ITEMS datastore.find = mock_find result_set = find({}) print "Get first page" objects = result_set.read(SCREEN_SIZE) print [obj.object_id for obj in objects] assert range(0, SCREEN_SIZE) == [obj.object_id for obj in objects] print "" print "Scroll to 5th item" result_set.seek(5) objects = result_set.read(SCREEN_SIZE) print [obj.object_id for obj in objects] assert range(5, SCREEN_SIZE + 5) == [obj.object_id for obj in objects] print "" print "Scroll back to beginning" result_set.seek(0) objects = result_set.read(SCREEN_SIZE) print [obj.object_id for obj in objects] assert range(0, SCREEN_SIZE) == [obj.object_id for obj in objects] print "" print "Hit PgDn five times" for i in range(0, 5): result_set.seek((i + 1) * SCREEN_SIZE) objects = result_set.read(SCREEN_SIZE) print [obj.object_id for obj in objects] assert range((i + 1) * SCREEN_SIZE, (i + 2) * SCREEN_SIZE) == \ [obj.object_id for obj in objects] print "" print "Hit PgUp five times" for i in range(0, 5)[::-1]: result_set.seek(i * SCREEN_SIZE) objects = result_set.read(SCREEN_SIZE) print [obj.object_id for obj in objects] assert range(i * SCREEN_SIZE, (i + 1) * SCREEN_SIZE) == \ [obj.object_id for obj in objects] print "" Pippy-71/library/pippy/sound.py000066400000000000000000000313541311421132100167060ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright (C) 2007,2008 One Laptop per Child Association, Inc. # Copyright (C) 2013,14 Walter Bender (walter@sugarlabs.org) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import os from gettext import gettext as _ from sugar3 import env '''XXX: This function seems to be broken. (CSA) def quit(self): perf.Stop() perf.Join() cs.Reset() cs = None ''' orchlines = [] scorelines = [] instrlist = [] fnum = [100] class SoundLibraryNotFoundError(Exception): def __init__(self): Exception.__init__(self, _('Cannot find TamTamEdit sound library.' ' Did you install TamTamEdit?')) def finddir(): paths = ['/usr/share/sugar/activities', env.get_user_activities_path()] sound_candidate_dirs = None for path in paths: if not os.path.exists(path): continue for f in os.listdir(path): if f in ['TamTamMini.activity', 'TamTamJam.activity', 'TamTamEdit.activity', 'TamTamSynthLab.activity', 'MusicKeyboard.activity']: bundle_dir = os.path.join(path, f) tamtam_subdir = str( os.path.join(bundle_dir, 'common', 'Resources', 'Sounds')) sound_candidate_dirs = [ os.path.expandvars('$SUGAR_PATH/activities') + \ tamtam_subdir, tamtam_subdir ] if sound_candidate_dirs is not None: for directory in sound_candidate_dirs: if os.path.isdir(directory): return directory raise SoundLibraryNotFoundError() def defAdsr(attack=0.01, decay=0.1, sustain=0.8, release=0.1): ''' Define an ADSR envelope. fnum = defADSR(attack = [0.01], decay = [0.1], sustain = [0.8], release = [0.1]) ''' att = int(2048 * attack) dec = int(2048 * decay) rel = int(2048 * release) bal = 2048 - (att + dec + rel) sus = min(1., sustain) fnum[0] += 1 scorelines.append('f%ld 0 2048 7 0 %ld 1. %ld %f %ld %f %ld 0\n' % (fnum[0], att, dec, sus, bal, sus, rel)) return fnum[0] def defLineSegments(list=[0, 10, 1, 10, 0, 10, 1, 10, 0]): ''' Define a breakpoints envelope. list begin with the start value of the function and is follow by any pair values (duration, value). The number of elements in the list should be odd. ''' totalLength = 0 newlist = [] for i in range(len(list)): if (i % 2) == 1: totalLength += list[i] for i in range(len(list)): if (i % 2) == 0: newlist.append(list[i]) else: newlist.append(int(2048 * (list[i] / float(totalLength)))) fnum[0] += 1 scorelines.append('f' + str(fnum[0]) + ' 0 2048 -7 ' + ' '.join([str(n) for n in newlist]) + '\n') return fnum[0] def defComplexWave(list=[1, 0, 0, .3, 0, .2, 0, 0, .1]): ''' Define a complex waveform to be read with 'playComplex' function. list=[1, 0, 0, .3, 0, .2, 0, 0, .1] is a list of amplitude for succesive harmonics of a waveform ''' fnum[0] += 1 scorelines.append('f' + str(fnum[0]) + ' 0 2048 10 ' + ' '.join([str(n) for n in list]) + '\n') return fnum[0] def playSine(pitch=1000, amplitude=5000, duration=1, starttime=0, pitch_envelope='default', amplitude_envelope='default'): ''' Play a sine wave (pitch = [1000], amplitude = [5000], duration = [1], starttime = [0], pitch_envelope=['default'], amplitude_envelope=['default']) ''' _play(pitch, amplitude, duration, starttime, pitch_envelope, amplitude_envelope, 1) def playSquare(pitch=1000, amplitude=5000, duration=1, starttime=0, pitch_envelope='default', amplitude_envelope='default'): ''' Play a square wave (pitch = [1000], amplitude = [5000], duration = [1], starttime = [0], pitch_envelope=['default'], amplitude_envelope=['default']) ''' _play(pitch, amplitude, duration, starttime, pitch_envelope, amplitude_envelope, 2) def playSawtooth(pitch=1000, amplitude=5000, duration=1, starttime=0, pitch_envelope='default', amplitude_envelope='default'): ''' Play a sawtooth wave (pitch = [1000], amplitude = [5000], duration = [1], starttime = [0], pitch_envelope=['default'], amplitude_envelope=['default']) ''' _play(pitch, amplitude, duration, starttime, pitch_envelope, amplitude_envelope, 3) def playComplex(pitch=1000, amplitude=5000, duration=1, starttime=0, pitch_envelope='default', amplitude_envelope='default', wave='default'): ''' Play a complex wave (pitch = [1000], amplitude = [5000], duration = [1], starttime = [0], pitch_envelope = ['default'], amplitude_envelope, wave = ['default'] ) ''' if wave == 'default': wavetable = 10 else: wavetable = wave _play(pitch, amplitude, duration, starttime, pitch_envelope, amplitude_envelope, wavetable) def _play(pitch, amplitude, duration, starttime, pitch_envelope, amplitude_envelope, instrument): if pitch_envelope == 'default': pitenv = 99 else: pitenv = pitch_envelope if amplitude_envelope == 'default': ampenv = 100 else: ampenv = amplitude_envelope if not 1 in instrlist: orchlines.append('instr 1\n') orchlines.append('kpitenv oscil 1, 1/p3, p6\n') orchlines.append('aenv oscil 1, 1/p3, p7\n') orchlines.append('asig oscil p5*aenv, p4*kpitenv, p8\n') orchlines.append('out asig\n') orchlines.append('endin\n\n') instrlist.append(1) scorelines.append('i1 %s %s %s %s %s %s %s\n' % (str(starttime), str(duration), str(pitch), str(amplitude), str(pitenv), str(ampenv), str(instrument))) def playFrequencyModulation(pitch=500, amplitude=5000, duration=2, starttime=0, carrier=1, modulator=.5, index=5, pitch_envelope='default', amplitude_envelope='default', carrier_envelope='default', modulator_envelope='default', index_envelope='default', wave='default'): ''' Play a frequency modulation synthesis sound (pitch = [100], amplitude = [5000], duration = [2], starttime = [0], carrier = [1], modulator = [.5], index = [5], pitch_envelope = ['default'], amplitude_envelope = ['default'], carrier_envelope = ['default'], modulator_envelope = ['default'], index_envelope = ['default'], wave = ['default'] ) ''' if pitch_envelope == 'default': pitenv = 99 else: pitenv = pitch_envelope if amplitude_envelope == 'default': ampenv = 100 else: ampenv = amplitude_envelope if carrier_envelope == 'default': carenv = 99 else: carenv = carrier_envelope if modulator_envelope == 'default': modenv = 99 else: modenv = modulator_envelope if index_envelope == 'default': indenv = 99 else: indenv = index_envelope if wave == 'default': wavetable = 1 else: wavetable = wave if not 7 in instrlist: orchlines.append('instr 7\n') orchlines.append('kpitenv oscil 1, 1/p3, p10\n') orchlines.append('kenv oscil 1, 1/p3, p11\n') orchlines.append('kcarenv oscil 1, 1/p3, p12\n') orchlines.append('kmodenv oscil 1, 1/p3, p13\n') orchlines.append('kindenv oscil 1, 1/p3, p14\n') orchlines.append('asig foscil p5*kenv, p4*kpitenv, p6*kcarenv, ' 'p7*kmodenv, p8*kindenv, p9\n') orchlines.append('out asig\n') orchlines.append('endin\n\n') instrlist.append(7) scorelines.append('i7 %s %s %s %s %s %s %s %s %s %s %s %s %s\n' % (str(starttime), str(duration), str(pitch), str(amplitude), str(carrier), str(modulator), str(index), str(wavetable), str(pitenv), str(ampenv), str(carenv), str(modenv), str(indenv))) def playPluck(pitch=100, amplitude=5000, duration=2, starttime=0, pitch_envelope='default', amplitude_envelope='default'): ''' Play a string physical modeling sound (pitch = [100], amplitude = [5000], duration = [2], starttime = [0], pitch_envelope = ['default'], amplitude_envelope ) ''' if pitch_envelope == 'default': pitenv = 99 else: pitenv = pitch_envelope if amplitude_envelope == 'default': ampenv = 100 else: ampenv = amplitude_envelope if not 8 in instrlist: orchlines.append('instr 8\n') orchlines.append('kpitenv oscil 1, 1/p3, p6\n') orchlines.append('kenv oscil 1, 1/p3, p7\n') orchlines.append('asig pluck p5*kenv, p4*kpitenv, 40, 0, 6\n') orchlines.append('asig butterlp asig, 4000\n') orchlines.append('out asig\n') orchlines.append('endin\n\n') instrlist.append(8) scorelines.append('i8 %s %s %s %s %s %s\n' % (str(starttime), str(duration), str(pitch), str(amplitude), str(pitenv), str(ampenv))) def playWave(sound='horse', pitch=1, amplitude=1, loop=False, duration=1, starttime=0, pitch_envelope='default', amplitude_envelope='default'): ''' Play a wave file (sound = ['horse'], pitch = [1], amplitude = [1], loop = [False], duration = [1], starttime = [0], pitch_envelope=['default'], amplitude_envelope=['default']) ''' if '/' in sound: fullname = sound else: fullname = os.path.join(finddir(), sound) if loop: lp = 1 else: lp = 0 if pitch_envelope == 'default': pitenv = 99 else: pitenv = pitch_envelope if amplitude_envelope == 'default': ampenv = 100 else: ampenv = amplitude_envelope if not 9 in instrlist: orchlines.append('instr 9\n') orchlines.append('kpitenv oscil 1, 1/p3, p8\n') orchlines.append('aenv oscil 1, 1/p3, p9\n') orchlines.append('asig diskin p4, p5*kpitenv, 0, p7\n') orchlines.append('out asig*p6*aenv\n') orchlines.append('endin\n\n') instrlist.append(9) scorelines.append("i9 %f %f '%s' %s %s %s %s %s\n" % (float(starttime), float(duration), fullname, str(pitch), str(amplitude), str(lp), str(pitenv), str(ampenv))) def getSoundList(): return sorted(os.listdir(finddir())) temp_path = None def audioOut(file=None): ''' Compile a .csd file and start csound to run it. If a string is given as argument, it write a wave file on disk instead of sending sound to hp. (file = [None]) ''' global temp_path if temp_path is None: temp_path = os.path.join(env.get_profile_path(), 'pippy') if not os.path.isdir(temp_path): os.mkdir(temp_path) path = temp_path csd = open(os.path.join(path, 'temp.csd'), 'w') csd.write('\n\n') csd.write('\n') if file is None: csd.write('-+rtaudio=alsa -odevaudio -m0 -d -b256 -B512\n') else: file = os.path.join(path, '%s.wav' % file) csd.write('-+rtaudio=alsa -o%s -m0 -W -d -b256 -B512\n' % file) csd.write('\n\n') csd.write('\n\n') csd.write('sr=16000\n') csd.write('ksmps=50\n') csd.write('nchnls=1\n\n') for line in orchlines: csd.write(line) csd.write('\n\n\n') csd.write('\n\n') csd.write('f1 0 2048 10 1\n') csd.write('f2 0 2048 10 1 0 .33 0 .2 0 .143 0 .111\n') csd.write('f3 0 2048 10 1 .5 .33 .25 .2 .175 .143 .125 .111 .1\n') csd.write('f10 0 2048 10 1 0 0 .3 0 .2 0 0 .1\n') csd.write('f99 0 2048 7 1 2048 1\n') csd.write('f100 0 2048 7 0. 10 1. 1900 1. 132 0.\n') for line in scorelines: csd.write(line) csd.write('e\n') csd.write('\n\n') csd.write('\n') csd.close() os.system('csound ' + path + '/temp.csd >/dev/null 2>/dev/null') Pippy-71/notebook.py000066400000000000000000000320541311421132100145670ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2014 Walter Bender # Copyright (C) 2014 Sai Vineet # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import logging import unicodedata import re import uuid from gi import require_version from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GObject from gi.repository import Pango require_version('GtkSource', '3.0') from gi.repository import GtkSource from gettext import gettext as _ from sugar3.graphics.toolbutton import ToolButton from texteditor import TextBufferCollaberizer tab_object = list() FONT_CHANGE_STEP = 2 DEFAULT_FONT_SIZE = 12 class TabLabel(Gtk.HBox): __gsignals__ = { 'tab-close': (GObject.SignalFlags.RUN_FIRST, None, ([GObject.TYPE_PYOBJECT])), } def __init__(self, child, label, path, tabs, editor_id): GObject.GObject.__init__(self) self.child = child self.label_text = label self._path = path # Hide the path in the label self.editor_id = editor_id self.tabs = tabs self.label_box = Gtk.EventBox() self._label = Gtk.Label(label=self.label_text) self._label.set_alignment(0, 0.5) self._label.show() self.label_box.add(self._label) self.label_box.connect('button-press-event', self._label_clicked) self.label_box.show_all() self.pack_start(self.label_box, True, True, 5) self.label_entry = Gtk.Entry() self.label_entry.connect('activate', self._label_entry_cb) self.label_entry.connect('focus-out-event', self._label_entry_cb) self.pack_start(self.label_entry, True, True, 0) button = ToolButton('close-tab') button.connect('clicked', self.__button_clicked_cb) self.pack_start(button, False, True, 0) button.show() self._close_button = button tab_object.append(self) def set_text(self, title): self._label.set_text(title) def get_text(self): return self._label.get_text() def get_path(self): return self._path def set_path(self, path): self._path = path def update_size(self, size): self.set_size_request(size, -1) def hide_close_button(self): self._close_button.hide() def show_close_button(self): self._close_button.show() def __button_clicked_cb(self, button): self.emit('tab-close', self.child) def _label_clicked(self, eventbox, data): if self.tabs.page_num(self.child) is not self.tabs.get_current_page(): self.child.grab_focus() else: self.label_entry.set_text(self.label_text) eventbox.hide() self.label_entry.grab_focus() self.label_entry.show() def _label_entry_cb(self, entry, focus=None): if self.label_entry.get_text() != "": self.label_text = self.label_entry.get_text() self.label_box.show_all() self.label_entry.hide() self._label.set_text(self.label_text) class AddNotebook(Gtk.Notebook): ''' AddNotebook ----------- This subclass has a add button which emits tab-added on clicking the button. ''' __gsignals__ = { 'tab-added': (GObject.SignalFlags.RUN_FIRST, None, ([])), } def __init__(self): Gtk.Notebook.__init__(self) self._add_tab = ToolButton('gtk-add') self._add_tab.connect('clicked', self._add_tab_cb) self._add_tab.show() self.set_action_widget(self._add_tab, Gtk.PackType.END) def _add_tab_cb(self, button): self.emit('tab-added') class PippySourceView(GtkSource.View): def __init__(self, buffer_text, editor_id, collab): GtkSource.View.__init__(self) text_buffer = GtkSource.Buffer() TextBufferCollaberizer(text_buffer, editor_id, collab) lang_manager = GtkSource.LanguageManager.get_default() if hasattr(lang_manager, 'list_languages'): langs = lang_manager.list_languages() else: lang_ids = lang_manager.get_language_ids() langs = [lang_manager.get_language(lang_id) for lang_id in lang_ids] for lang in langs: for m in lang.get_mime_types(): if m == 'text/x-python': text_buffer.set_language(lang) if hasattr(text_buffer, 'set_highlight'): text_buffer.set_highlight(True) else: text_buffer.set_highlight_syntax(True) if buffer_text: text_buffer.set_text(buffer_text) text_buffer.set_modified(False) self.set_buffer(text_buffer) self.set_size_request(0, int(Gdk.Screen.height() * 0.5)) self.set_editable(True) self.set_cursor_visible(True) self.set_show_line_numbers(True) self.set_wrap_mode(Gtk.WrapMode.CHAR) self.set_insert_spaces_instead_of_tabs(True) self.set_tab_width(2) self.set_auto_indent(True) self.set_can_focus(True) # Notebook will call this with appropriate font size def set_font_size(self, font_size): self.modify_font( Pango.FontDescription( 'Monospace {}'.format(font_size))) class SourceNotebook(AddNotebook): def __init__(self, activity, collab): AddNotebook.__init__(self) self.activity = activity self._collab = collab self.set_scrollable(True) self.last_tab = 0 self._font_size = DEFAULT_FONT_SIZE def add_tab(self, label=None, buffer_text=None, path=None, editor_id=None): self.last_tab += 1 codesw = Gtk.ScrolledWindow() codesw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) if editor_id is None: editor_id = str(uuid.uuid1()) text_view = PippySourceView( buffer_text, editor_id, self._collab) text_view.set_font_size(self._font_size) codesw.add(text_view) text_view.show() text_view.grab_focus() if label: self.tablabel = TabLabel(codesw, label, path, self, editor_id) else: self.tablabel = TabLabel(codesw, _('New Source File %d' % self.last_tab), path, self, editor_id) self.tablabel.connect('tab-close', self._tab_closed_cb) self.connect('key-press-event', self._key_press_cb) codesw.show_all() index = self.append_page(codesw, self.tablabel) self.props.page = index # Set new page as active tab # Show close only when tabs > 1 only_widget = self.get_nth_page(0) if self.get_n_pages() == 1: self.get_tab_label(only_widget).hide_close_button() else: self.get_tab_label(only_widget).show_close_button() def _key_press_cb(self, widget, event): key_name = Gdk.keyval_name(event.keyval) if event.get_state() & Gdk.ModifierType.CONTROL_MASK: if key_name == 'w': if self.get_n_pages() > 1: index = self.get_current_page() self.remove_page(index) tab_object.pop(index) try: logging.debug('deleting session_data %s' % str(self.activity.session_data[index])) del self.activity.session_data[index] except IndexError: pass # Show close only when tabs > 1 only_widget = self.get_nth_page(0) if self.get_n_pages() == 1: self.get_tab_label(only_widget).hide_close_button() else: self.get_tab_label(only_widget).show_close_button() elif key_name in ['1', '2', '3', '4', '5', '6', '7', '8', '9']: if int(key_name) <= self.get_n_pages(): self.set_current_page(int(key_name) - 1) elif key_name == 't': self.emit('tab-added') elif key_name == 'Tab': if self.get_current_page() == self.get_n_pages() - 1: self.set_current_page(0) else: self.next_page() elif event.get_state() & Gdk.ModifierType.SHIFT_MASK: if key_name == 'ISO_Left_Tab': if self.get_current_page() == 0: self.set_current_page(self.get_n_pages() - 1) else: self.prev_page() else: return False else: return False return True return False def set_current_label(self, label): child = self.get_nth_page(self.get_current_page()) widget = self.get_tab_label(child) widget.set_text(self._purify_file(label)) def set_current_path(self, path): child = self.get_nth_page(self.get_current_page()) widget = self.get_tab_label(child) widget.set_path(path) def get_text_buffer(self): tab = self.get_nth_page(self.get_current_page()).get_children() text_buffer = tab[0].get_buffer() return text_buffer def get_text_view(self): tab = self.get_nth_page(self.get_current_page()).get_children() text_view = tab[0] return text_view def _purify_file(self, label): if not label.endswith('.py'): label = label + '.py' label = label.replace(' ', '_') if isinstance(label, unicode): label = \ unicodedata.normalize('NFKD', label).encode('ascii', 'ignore') return label def get_all_data(self): # Returns all the names of files and the buffer contents too. names = [] python_codes = [] paths = [] modifieds = [] editor_ids = [] for i in range(0, self.get_n_pages()): child = self.get_nth_page(i) label = self._purify_file(self.get_tab_label(child).get_text()) names.append(label) path = self.get_tab_label(child).get_path() paths.append(path) text_buffer = child.get_children()[0].get_buffer() text = text_buffer.get_text(*text_buffer.get_bounds(), include_hidden_chars=True) python_codes.append(text) modifieds.append(text_buffer.get_modified()) editor_ids.append(self.get_tab_label(child).editor_id) return (names, python_codes, paths, modifieds, editor_ids) def get_current_file_name(self): child = self.get_nth_page(self.get_current_page()) label = self.get_tab_label(child).get_text() label = self._purify_file(label) return label def set_font_size(self, font_size): self._font_size = font_size for i in xrange(self.get_n_pages()): page = self.get_nth_page(i) children = page.get_children() children[0].set_font_size(self._font_size) def get_font_size(self): return self._font_size def child_exited_cb(self, *args): '''Called whenever a child exits. If there's a handler, runadd it.''' h, self.activity._child_exited_handler = \ self.activity._child_exited_handler, None if h is not None: h() def _tab_closed_cb(self, notebook, child): index = self.page_num(child) self.remove_page(index) tab_object.pop(index) # Hide close button if only one tab present if self.get_n_pages() == 1: only_widget = self.get_nth_page(0) self.get_tab_label(only_widget).hide_close_button() try: logging.debug('deleting session_data %s' % str(self.activity.session_data[index])) del self.activity.session_data[index] except IndexError: pass def rename_tab(self, iterator1): for i in range(iterator1, self.get_n_pages()): mo = re.match('New Source File ', tab_object[i].get_text()) if mo is not None: tab_object[i].label_text = 'New Source File ' + \ str(self.last_tab + 1) else: tab_object[i].label_text = tab_object[i].get_text() tab_object[i]._label.set_text(tab_object[i].label_text) Pippy-71/pippy_app.py000066400000000000000000001554211311421132100147540ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # # Copyright (C) 2007,2008,2009 Chris Ball, based on Collabora's # "hellomesh" demo. # # Copyright (C) 2013,14 Walter Bender # Copyright (C) 2013,14 Ignacio Rodriguez # Copyright (C) 2013 Jorge Gomez # Copyright (C) 2013,14 Sai Vineet # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """Pippy Activity: A simple Python programming activity .""" from __future__ import with_statement import re import os import subprocess from random import uniform import locale import json import sys from shutil import copy2 from signal import SIGTERM from gettext import gettext as _ import uuid import dbus from dbus.mainloop.glib import DBusGMainLoop from gi import require_version require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GLib from gi.repository import Pango try: require_version('Vte', '2.91') except: require_version('Vte', '2.90') from gi.repository import Vte from gi.repository import GObject DBusGMainLoop(set_as_default=True) bus = dbus.SessionBus() from sugar3.datastore import datastore from sugar3.activity import activity as activity from sugar3.activity.widgets import EditToolbar from sugar3.activity.widgets import StopButton from sugar3.activity.activity import get_bundle_name from sugar3.activity.activity import get_bundle_path from sugar3.graphics.alert import Alert from sugar3.graphics.alert import ConfirmationAlert from sugar3.graphics.alert import NotifyAlert from sugar3.graphics.icon import Icon from sugar3.graphics.objectchooser import ObjectChooser from sugar3.graphics.toggletoolbutton import ToggleToolButton from sugar3.graphics.toolbarbox import ToolbarButton from sugar3.graphics.toolbutton import ToolButton from sugar3.graphics.toolbarbox import ToolbarBox from sugar3.activity.widgets import ActivityToolbarButton from jarabe.view.customizebundle import generate_unique_id from activity import ViewSourceActivity from activity import TARGET_TYPE_TEXT from collabwrapper import CollabWrapper from filedialog import FileDialog from icondialog import IconDialog from notebook import SourceNotebook, tab_object from toolbars import DevelopViewToolbar import sound_check import logging text_buffer = None # magic prefix to use utf-8 source encoding PYTHON_PREFIX = '''#!/usr/bin/python # -*- coding: utf-8 -*- ''' # Force category names into Pootle DEFAULT_CATEGORIES = [_('graphics'), _('math'), _('python'), _('sound'), _('string'), _('tutorials')] _logger = logging.getLogger('pippy-activity') groupthink_mimetype = 'pickle/groupthink-pippy' DISTUTILS_SETUP_SCRIPT = """#!/usr/bin/python # -*- coding: utf-8 -*- from distutils.core import setup setup(name='{modulename}', version='1.0', py_modules=[ {filenames} ], ) """ # This is .format()'ed with the list of the file names. DISTUTILS_SETUP_SCRIPT = """#!/usr/bin/python # -*- coding: utf-8 -*- from distutils.core import setup setup(name='{modulename}', version='1.0', py_modules=[ {filenames} ], ) """ # This is .format()'ed with the list of the file names. def _has_new_vte_api(): try: return (Vte.MAJOR_VERSION >= 0 and Vte.MINOR_VERSION >= 38) except: # Really old versions of Vte don't have VERSION return False def _find_object_id(activity_id, mimetype='text/x-python'): ''' Round-about way of accessing self._jobject.object_id ''' dsobjects, nobjects = datastore.find({'mime_type': [mimetype]}) for dsobject in dsobjects: if 'activity_id' in dsobject.metadata and \ dsobject.metadata['activity_id'] == activity_id: return dsobject.object_id return None # XXX: Why do we use ViewSourceActivity? Sugar already has view source # Note: the structure is very weird, because this was migrated from groupthink class PippyActivity(ViewSourceActivity): '''Pippy Activity as specified in activity.info''' def __init__(self, handle): self._pippy_instance = self self.session_data = [] # Used to manage saving self._loaded_session = [] # Used to manage tabs self._py_file_loaded_from_journal = False self._py_object_id = None self._dialog = None sys.path.append(os.path.join(self.get_activity_root(), 'Library')) ViewSourceActivity.__init__(self, handle) self._collab = CollabWrapper(self) self._collab.message.connect(self.__message_cb) self.set_canvas(self.initialize_display()) self.after_init() self.connect("notify::active", self.__active_cb) self._collab.setup() def initialize_display(self): '''Build activity toolbar with title input, share button and export buttons ''' toolbar_box = ToolbarBox() activity_button = ActivityToolbarButton(self) toolbar_box.toolbar.insert(activity_button, 0) self.set_toolbar_box(toolbar_box) activity_button.show() toolbar_box.show() activity_toolbar = activity_button.page separator = Gtk.SeparatorToolItem() activity_toolbar.insert(separator, -1) separator.show() button = ToolButton('pippy-import-doc') button.set_tooltip(_('Import Python file to new tab')) button.connect('clicked', self._import_py_cb) activity_toolbar.insert(button, -1) button.show() button = ToolButton('pippy-export-doc') button.set_tooltip(_('Export as Pippy document')) button.connect('clicked', self._export_document_cb) activity_toolbar.insert(button, -1) button.show() button = ToolButton('pippy-export-library') button.set_tooltip(_('Save this file to the Pippy library')) button.connect('clicked', self._save_as_library) activity_toolbar.insert(button, -1) if not self._library_writable(): button.set_sensitive(False) button.show() button = ToolButton('pippy-export-example') button.set_tooltip(_('Export as new Pippy example')) button.connect('clicked', self._export_example_cb) activity_toolbar.insert(button, -1) button.show() button = ToolButton('pippy-create-bundle') button.set_tooltip(_('Create a Sugar activity bundle')) button.connect('clicked', self._create_bundle_cb) activity_toolbar.insert(button, -1) button.show() button = ToolButton('pippy-create-distutils') # TRANS: A distutils package is used to distribute Python modules button.set_tooltip(_('Export as a distutils package')) button.connect('clicked', self._export_distutils_cb) activity_toolbar.insert(button, -1) button.show() self._edit_toolbar = EditToolbar() button = ToolbarButton() button.set_page(self._edit_toolbar) button.props.icon_name = 'toolbar-edit' button.props.label = _('Edit') self.get_toolbar_box().toolbar.insert(button, -1) button.show() self._edit_toolbar.show() self._edit_toolbar.undo.connect('clicked', self.__undobutton_cb) self._edit_toolbar.redo.connect('clicked', self.__redobutton_cb) self._edit_toolbar.copy.connect('clicked', self.__copybutton_cb) self._edit_toolbar.paste.connect('clicked', self.__pastebutton_cb) view_btn = ToolbarButton() view_toolbar = DevelopViewToolbar(self) view_btn.props.page = view_toolbar view_btn.props.icon_name = 'toolbar-view' view_btn.props.label = _('View') view_toolbar.connect('font-size-changed', self._font_size_changed_cb) self.get_toolbar_box().toolbar.insert(view_btn, -1) self.view_toolbar = view_toolbar view_toolbar.show() actions_toolbar = self.get_toolbar_box().toolbar self._toggle_output = ToggleToolButton('tray-show') self._toggle_output.set_tooltip(_('Show output panel')) self._toggle_output.connect('toggled', self._toggle_output_cb) actions_toolbar.insert(self._toggle_output, -1) self._toggle_output.show() icons_path = os.path.join(get_bundle_path(), 'icons') icon_bw = Gtk.Image() icon_bw.set_from_file(os.path.join(icons_path, 'run_bw.svg')) icon_bw.show() icon_color = Gtk.Image() icon_color.set_from_file(os.path.join(icons_path, 'run_color.svg')) icon_color.show() button = ToolButton(label=_('Run!')) button.props.accelerator = _('r') button.set_icon_widget(icon_bw) button.set_tooltip(_('Run!')) button.connect('clicked', self._flash_cb, dict({'bw': icon_bw, 'color': icon_color})) button.connect('clicked', self._go_button_cb) actions_toolbar.insert(button, -1) button.show() icon_bw = Gtk.Image() icon_bw.set_from_file(os.path.join(icons_path, 'stopit_bw.svg')) icon_bw.show() icon_color = Gtk.Image() icon_color.set_from_file(os.path.join(icons_path, 'stopit_color.svg')) icon_color.show() button = ToolButton(label=_('Stop')) button.props.accelerator = _('s') button.set_icon_widget(icon_bw) button.connect('clicked', self._flash_cb, dict({'bw': icon_bw, 'color': icon_color})) button.connect('clicked', self._stop_button_cb) button.set_tooltip(_('Stop')) actions_toolbar.insert(button, -1) button.show() icon_bw = Gtk.Image() icon_bw.set_from_file(os.path.join(icons_path, 'eraser_bw.svg')) icon_bw.show() icon_color = Gtk.Image() icon_color.set_from_file(os.path.join(icons_path, 'eraser_color.svg')) icon_color.show() button = ToolButton(label=_('Clear')) button.props.accelerator = _('c') button.set_icon_widget(icon_bw) button.connect('clicked', self._clear_button_cb) button.connect('clicked', self._flash_cb, dict({'bw': icon_bw, 'color': icon_color})) button.set_tooltip(_('Clear')) actions_toolbar.insert(button, -1) button.show() activity_toolbar.show() separator = Gtk.SeparatorToolItem() self.get_toolbar_box().toolbar.insert(separator, -1) separator.show() button = ToolButton('pippy-openoff') button.set_tooltip(_('Open an example')) button.connect('clicked', self._load_example_cb) self.get_toolbar_box().toolbar.insert(button, -1) button.show() separator = Gtk.SeparatorToolItem() separator.props.draw = False separator.set_expand(True) self.get_toolbar_box().toolbar.insert(separator, -1) separator.show() stop = StopButton(self) self.get_toolbar_box().toolbar.insert(stop, -1) stop.show() vpane = Gtk.Paned.new(orientation=Gtk.Orientation.VERTICAL) vpane.set_position(400) # setting initial position self.paths = [] try: if sound_check.finddir(): TAMTAM_AVAILABLE = True else: TAMTAM_AVAILABLE = False except sound_check.SoundLibraryNotFoundError: TAMTAM_AVAILABLE = False data_path = os.path.join(get_bundle_path(), 'data') # get default language from locale locale_lang = locale.getdefaultlocale()[0] if locale_lang is None: lang = 'en' else: lang = locale_lang.split('_')[0] _logger.debug(locale.getdefaultlocale()) _logger.debug(lang) # construct the path for both lang_path = os.path.join(data_path, lang) en_lang_path = os.path.join(data_path, 'en') # get all folders in lang examples all_folders = [] if os.path.exists(lang_path): for d in sorted(os.listdir(lang_path)): all_folders.append(d) # get all folders in English examples for d in sorted(os.listdir(en_lang_path)): # check if folder isn't already in list if d not in all_folders: all_folders.append(d) for folder in all_folders: # Skip sound folders if TAMTAM is not installed if folder == 'sound' and not TAMTAM_AVAILABLE: continue direntry = {} # check if dir exists in pref language, if exists, add it if os.path.exists(os.path.join(lang_path, folder)): direntry = { 'name': _(folder.capitalize()), 'path': os.path.join(lang_path, folder) + '/'} # if not try to see if it's in default English path elif os.path.exists(os.path.join(en_lang_path, folder)): direntry = { 'name': _(folder.capitalize()), 'path': os.path.join(en_lang_path, folder) + '/'} self.paths.append([direntry['name'], direntry['path']]) # Adding local examples data_path = os.path.join(get_bundle_path(), 'data') self.paths.append([_('My examples'), data_path]) self._source_tabs = SourceNotebook(self, self._collab) self._source_tabs.connect('tab-added', self._add_source_cb) if self._loaded_session: for name, content, path in self._loaded_session: self._source_tabs.add_tab(name, content, path) else: self.session_data.append(None) self._source_tabs.add_tab() # New instance, ergo empty tab vpane.add1(self._source_tabs) self._source_tabs.show() self._outbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) self._vte = Vte.Terminal() self._vte.set_encoding('utf-8') self._vte.set_size(30, 5) self._vte.set_scrollback_lines(-1) # XXX support both Vte APIs if _has_new_vte_api(): foreground = Gdk.RGBA() foreground.parse('#000000') background = Gdk.RGBA() background.parse('#E7E7E7') else: foreground = Gdk.color_parse('#000000') background = Gdk.color_parse('#E7E7E7') self._vte.set_colors(foreground, background, []) self._child_exited_handler = None self._vte.connect('child_exited', self._child_exited_cb) self._vte.connect('drag_data_received', self._vte_drop_cb) self._outbox.pack_start(self._vte, True, True, 0) outsb = Gtk.Scrollbar(orientation=Gtk.Orientation.VERTICAL) outsb.set_adjustment(self._vte.get_vadjustment()) outsb.show() self._outbox.pack_start(outsb, False, False, 0) self._load_config() vpane.add2(self._outbox) self._outbox.show() vpane.show() return vpane def after_init(self): self._outbox.hide() def _font_size_changed_cb(self, widget, size): self._source_tabs.set_font_size(size) self._vte.set_font( Pango.FontDescription('Monospace {}'.format(size))) def _store_config(self): font_size = self._source_tabs.get_font_size() _config_file_path = os.path.join( activity.get_activity_root(), 'data', 'config.json') with open(_config_file_path, "w") as f: f.write(json.dumps(font_size)) def _load_config(self): _config_file_path = os.path.join( activity.get_activity_root(), 'data', 'config.json') if not os.path.isfile(_config_file_path): return with open(_config_file_path, "r") as f: font_size = json.loads(f.read()) self.view_toolbar.set_font_size(font_size) self._vte.set_font( Pango.FontDescription('Monospace {}'.format(font_size))) def __active_cb(self, widget, event): logging.debug('__active_cb %r', self.props.active) if self.props.active: self.resume() else: self.pause() def do_visibility_notify_event(self, event): logging.debug('do_visibility_notify_event %r', event.get_state()) if event.get_state() == Gdk.VisibilityState.FULLY_OBSCURED: self.pause() else: self.resume() def pause(self): # FIXME: We had resume, but no pause? pass def resume(self): if self._dialog is not None: self._dialog.set_keep_above(True) def _toggle_output_cb(self, button): shown = button.get_active() if shown: self._outbox.show_all() self._toggle_output.set_tooltip(_('Hide output panel')) self._toggle_output.set_icon_name('tray-hide') else: self._outbox.hide() self._toggle_output.set_tooltip(_('Show output panel')) self._toggle_output.set_icon_name('tray-show') def _load_example_cb(self, widget): widget.set_icon_name('pippy-openon') self._dialog = FileDialog(self.paths, self, widget) self._dialog.show() self._dialog.run() path = self._dialog.get_path() if path: self._select_func_cb(path) def _add_source_cb(self, button, force=False, editor_id=None): if self._collab._leader or force: if editor_id is None: editor_id = str(uuid.uuid1()) self._source_tabs.add_tab(editor_id=editor_id) self.session_data.append(None) self._source_tabs.get_nth_page(-1).show_all() self._source_tabs.get_text_view().grab_focus() if self._collab._leader: self._collab.post(dict( action='add-source', editor_id=editor_id)) else: # The leader must do it first so that they can set # up the text buffer self._collab.post(dict(action='add-source-request')) def __message_cb(self, collab, buddy, msg): action = msg.get('action') if action == 'add-source-request' and self._collab._leader: self._add_source_cb(None, force=True) elif action == 'add-source': self._add_source_cb( None, force=True, editor_id=msg.get('editor_id')) def _vte_drop_cb(self, widget, context, x, y, selection, targetType, time): if targetType == TARGET_TYPE_TEXT: self._vte.feed_child(selection.data) def get_data(self): return self._source_tabs.get_all_data() def set_data(self, data): # Remove initial new/blank thing self.session_data = [] self._loaded_session = [] try: self._source_tabs.remove_page(0) tab_object.pop(0) except IndexError: pass list_ = zip(*data) for name, code, path, modified, editor_id in list_: self._source_tabs.add_tab( label=name, editor_id=editor_id) self.session_data.append(None) # maybe? def _selection_cb(self, value): self.save() _logger.debug('clicked! %s' % value['path']) _file = open(value['path'], 'r') lines = _file.readlines() self._add_source_cb(None) text_buffer = self._source_tabs.get_text_buffer() text_buffer.set_text(''.join(lines)) text_buffer.set_modified(False) self._pippy_instance.metadata['title'] = value['name'] self._stop_button_cb(None) self._reset_vte() self._source_tabs.set_current_label(value['name']) self._source_tabs.set_current_path(value['path']) self._source_tabs.get_text_view().grab_focus() def _select_func_cb(self, path): values = {} values['name'] = os.path.basename(path) values['path'] = path self._selection_cb(values) def _timer_cb(self, button, icons): button.set_icon_widget(icons['bw']) button.show_all() return False def _flash_cb(self, button, icons): button.set_icon_widget(icons['color']) button.show_all() GObject.timeout_add(400, self._timer_cb, button, icons) def _clear_button_cb(self, button): self.save() self._stop_button_cb(None) self._reset_vte() self._source_tabs.get_text_view().grab_focus() def _write_all_buffers(self, tmp_dir): data = self._source_tabs.get_all_data() zipdata = zip(data[0], data[1]) for name, content in zipdata: with open(os.path.join(tmp_dir, name), 'w') as f: # Write utf-8 coding prefix if there's not one already if re.match(r'coding[:=]\s*([-\w.]+)', '\n'.join(content.splitlines()[:2])) is None: f.write(PYTHON_PREFIX) f.write(content) def _reset_vte(self): self._vte.grab_focus() self._vte.feed('\x1B[H\x1B[J\x1B[0;39m') def __undobutton_cb(self, butston): text_buffer = self._source_tabs.get_text_buffer() if text_buffer.can_undo(): text_buffer.undo() def __redobutton_cb(self, button): text_buffer = self._source_tabs.get_text_buffer() if text_buffer.can_redo(): text_buffer.redo() def __copybutton_cb(self, button): text_buffer = self._source_tabs.get_text_buffer() if self._vte.get_has_selection(): self._vte.copy_clipboard() elif text_buffer.get_has_selection(): clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) text_buffer.copy_clipboard(clipboard) def __pastebutton_cb(self, button): text_buffer = self._source_tabs.get_text_buffer() clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) text_buffer.paste_clipboard(clipboard, None, True) def _go_button_cb(self, button): self._stop_button_cb(button) # Try stopping old code first. self._reset_vte() # FIXME: We're losing an odd race here # Gtk.main_iteration(block=False) if self._toggle_output.get_active() is False: self._outbox.show_all() self._toggle_output.set_active(True) pippy_tmp_dir = '%s/tmp/' % self.get_activity_root() self._write_all_buffers(pippy_tmp_dir) current_file = os.path.join( pippy_tmp_dir, self._source_tabs.get_current_file_name()) # Write activity.py here too, to support pippy-based activities. copy2('%s/activity.py' % get_bundle_path(), '%s/tmp/activity.py' % self.get_activity_root()) # XXX Support both Vte APIs if _has_new_vte_api(): vte_run = self._vte.spawn_sync else: vte_run = self._vte.fork_command_full self._pid = vte_run( Vte.PtyFlags.DEFAULT, get_bundle_path(), ['/bin/sh', '-c', 'python %s; sleep 1' % current_file, 'PYTHONPATH=%s/library:%s' % (get_bundle_path(), os.getenv('PYTHONPATH', ''))], ['PYTHONPATH=%s/library:%s' % (get_bundle_path(), os.getenv('PYTHONPATH', ''))], GLib.SpawnFlags.DO_NOT_REAP_CHILD, None, None,) def _stop_button_cb(self, button): try: if self._pid is not None: os.kill(self._pid[1], SIGTERM) except: pass # Process must already be dead. def _library_writable(self): return os.access(os.path.join(get_bundle_path(), 'library'), os.W_OK) def _save_as_library(self, button): library_dir = os.path.join(get_bundle_path(), 'library') file_name = self._source_tabs.get_current_file_name() text_buffer = self._source_tabs.get_text_buffer() content = text_buffer.get_text( *text_buffer.get_bounds(), include_hidden_chars=True) if not os.path.isdir(library_dir): os.mkdir(library_dir) with open(os.path.join(library_dir, file_name), 'w') as f: f.write(content) success = True if success: alert = NotifyAlert(5) alert.props.title = _('Python File added to Library') IMPORT_MESSAGE = _('The file you selected has been added' ' to the library. Use "import {importname}"' ' to import the library for using.') alert.props.msg = IMPORT_MESSAGE.format(importname=file_name[:-3]) alert.connect('response', self._remove_alert_cb) self.add_alert(alert) def _export_document_cb(self, __): self.copy() alert = NotifyAlert() alert.props.title = _('Saved') alert.props.msg = _('The document has been saved to journal.') alert.connect('response', lambda x, i: self.remove_alert(x)) self.add_alert(alert) def _remove_alert_cb(self, alert, response_id): self.remove_alert(alert) def _import_py_cb(self, button): chooser = ObjectChooser() result = chooser.run() if result is Gtk.ResponseType.ACCEPT: dsitem = chooser.get_selected_object() if dsitem.metadata['mime_type'] != 'text/x-python': alert = NotifyAlert(5) alert.props.title = _('Error importing Python file') alert.props.msg = _('The file you selected is not a ' 'Python file.') alert.connect('response', self._remove_alert_cb) self.add_alert(alert) elif dsitem.object_id in self.session_data: alert = NotifyAlert(5) alert.props.title = _('Error importing Python file') alert.props.msg = _('The file you selected is already ' 'open') alert.connect('response', self._remove_alert_cb) self.add_alert(alert) else: name = dsitem.metadata['title'] file_path = dsitem.get_file_path() content = open(file_path, 'r').read() self._source_tabs.add_tab(name, content, None) self._source_tabs.set_current_label(name) self.session_data.append(dsitem.object_id) _logger.debug('after import py: %r' % self.session_data) chooser.destroy() def _create_bundle_cb(self, button): from shutil import rmtree from tempfile import mkdtemp # Get the name of this pippy program. title = self._pippy_instance.metadata['title'].replace('.py', '') title = title.replace('-', '') if title == 'Pippy Activity': alert = Alert() alert.props.title = _('Save as Activity Error') alert.props.msg = _('Please give your activity a meaningful name ' 'before attempting to save it as an activity.') ok_icon = Icon(icon_name='dialog-ok') alert.add_button(Gtk.ResponseType.OK, _('Ok'), ok_icon) alert.connect('response', self._dismiss_alert_cb) self.add_alert(alert) return alert_icon = Alert() ok_icon = Icon(icon_name='dialog-ok') alert_icon.add_button(Gtk.ResponseType.OK, _('Ok'), ok_icon) alert_icon.props.title = _('Activity icon') alert_icon.props.msg = _('Please select an activity icon.') self._stop_button_cb(None) # try stopping old code first. self._reset_vte() self._outbox.show_all() self._vte.feed(_("Creating activity bundle...")) self._vte.feed("\r\n") TMPDIR = 'instance' app_temp = mkdtemp('.activity', 'Pippy', os.path.join(self.get_activity_root(), TMPDIR)) sourcefile = os.path.join(app_temp, 'xyzzy.py') # invoke ourself to build the activity bundle. _logger.debug('writing out source file: %s' % sourcefile) def internal_callback(window=None, event=None): icon = '%s/activity/activity-default.svg' % (get_bundle_path()) if window: icon = window.get_icon() self._stop_button_cb(None) # Try stopping old code first. self._reset_vte() self._vte.feed(_('Creating activity bundle...')) self._vte.feed('\r\n') TMPDIR = 'instance' app_temp = mkdtemp('.activity', 'Pippy', os.path.join(self.get_activity_root(), TMPDIR)) sourcefile = os.path.join(app_temp, 'xyzzy.py') # Invoke ourself to build the activity bundle. _logger.debug('writing out source file: %s' % sourcefile) # Write out application code self._write_text_buffer(sourcefile) try: # FIXME: vte invocation was raising errors. # Switched to subprocss output = subprocess.check_output( ['/usr/bin/python2', '%s/pippy_app.py' % get_bundle_path(), '-p', '%s/library' % get_bundle_path(), '-d', app_temp, title, sourcefile, icon]) self._vte.feed(output) self._vte.feed('\r\n') self._bundle_cb(title, app_temp) except subprocess.CalledProcessError: rmtree(app_temp, ignore_errors=True) # clean up! self._vte.feed(_('Save as Activity Error')) self._vte.feed('\r\n') raise def _alert_response(alert, response_id): self.remove_alert(alert) def _dialog(): dialog = IconDialog() dialog.connect('destroy', internal_callback) GObject.idle_add(_dialog) alert_icon.connect('response', _alert_response) self.add_alert(alert_icon) def _write_text_buffer(self, filename): text_buffer = self._source_tabs.get_text_buffer() start, end = text_buffer.get_bounds() text = text_buffer.get_text(start, end, True) with open(filename, 'w') as f: # Write utf-8 coding prefix if there's not one already if re.match(r'coding[:=]\s*([-\w.]+)', '\n'.join(text.splitlines()[:2])) is None: f.write(PYTHON_PREFIX) for line in text: f.write(line) def _export_distutils_cb(self, button): app_temp = os.path.join(self.get_activity_root(), 'instance') data = self._source_tabs.get_all_data() for filename, content in zip(data[0], data[1]): fileobj = open(os.path.join(app_temp, filename), 'w') fileobj.write(content) fileobj.close() filenames = ','.join([("'"+name[:-3]+"'") for name in data[0]]) title = self._pippy_instance.metadata['title'] if title is _('Pippy Activity'): alert = Alert() alert.props.title = _('Save as distutils package error') alert.props.msg = _('Please give your activity a meaningful ' 'name before attempting to save it ' 'as an distutils package.') ok_icon = Icon(icon_name='dialog-ok') alert.add_button(Gtk.ResponseType.OK, _('Ok'), ok_icon) alert.connect('response', self._dismiss_alert_cb) self.add_alert(alert) return setup_script = DISTUTILS_SETUP_SCRIPT.format(modulename=title, filenames=filenames) setupfile = open(os.path.join(app_temp, 'setup.py'), 'w') setupfile.write(setup_script) setupfile.close() os.chdir(app_temp) subprocess.check_output( ['/usr/bin/python', os.path.join(app_temp, 'setup.py'), 'sdist', '-v']) # Hand off to journal os.chmod(app_temp, 0777) jobject = datastore.create() metadata = { 'title': '%s distutils bundle' % title, 'title_set_by_user': '1', 'mime_type': 'application/x-gzip', } for k, v in metadata.items(): # The dict.update method is missing =( jobject.metadata[k] = v tarname = 'dist/{modulename}-1.0.tar.gz'.format(modulename=title) jobject.file_path = os.path.join(app_temp, tarname) datastore.write(jobject) def _export_example_cb(self, button): # Get the name of this pippy program. title = self._pippy_instance.metadata['title'] if title == _('Pippy Activity'): alert = Alert() alert.props.title = _('Save as Example Error') alert.props.msg = \ _('Please give your activity a meaningful ' 'name before attempting to save it as an example.') ok_icon = Icon(icon_name='dialog-ok') alert.add_button(Gtk.ResponseType.OK, _('Ok'), ok_icon) alert.connect('response', self._dismiss_alert_cb) self.add_alert(alert) return self._stop_button_cb(None) # Try stopping old code first. self._reset_vte() self._vte.feed(_('Creating example...')) self._vte.feed('\r\n') local_data = os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'], 'data') local_file = os.path.join(local_data, title) if os.path.exists(local_file): alert = ConfirmationAlert() alert.props.title = _('Save as Example Warning') alert.props.msg = _('This example already exists. ' 'Do you want to overwrite it?') alert.connect('response', self._confirmation_alert_cb, local_file) self.add_alert(alert) else: self.write_file(local_file) self._reset_vte() self._vte.feed(_('Saved as example.')) self._vte.feed('\r\n') self._add_to_example_list(local_file) def _child_exited_cb(self, *args): '''Called whenever a child exits. If there's a handler, run it.''' h, self._child_exited_handler = self._child_exited_handler, None if h is not None: h() def _bundle_cb(self, title, app_temp): '''Called when we're done building a bundle for a source file.''' from sugar3 import profile from shutil import rmtree try: # Find the .xo file: were we successful? bundle_file = [f for f in os.listdir(app_temp) if f.endswith('.xo')] if len(bundle_file) != 1: _logger.debug("Couldn't find bundle: %s" % str(bundle_file)) self._vte.feed('\r\n') self._vte.feed(_('Error saving activity to journal.')) self._vte.feed('\r\n') return # Something went wrong. # Hand off to journal os.chmod(app_temp, 0755) jobject = datastore.create() metadata = { 'title': '%s Bundle' % title, 'title_set_by_user': '1', 'buddies': '', 'preview': '', 'icon-color': profile.get_color().to_string(), 'mime_type': 'application/vnd.olpc-sugar', } for k, v in metadata.items(): # The dict.update method is missing =( jobject.metadata[k] = v jobject.file_path = os.path.join(app_temp, bundle_file[0]) datastore.write(jobject) self._vte.feed('\r\n') self._vte.feed(_('Activity saved to journal.')) self._vte.feed('\r\n') self.journal_show_object(jobject.object_id) jobject.destroy() finally: rmtree(app_temp, ignore_errors=True) # clean up! def _dismiss_alert_cb(self, alert, response_id): self.remove_alert(alert) def _confirmation_alert_cb(self, alert, response_id, local_file): # Callback for conf alert self.remove_alert(alert) if response_id is Gtk.ResponseType.OK: self.write_file(local_file) self._reset_vte() self._vte.feed(_('Saved as example.')) self._vte.feed('\r\n') else: self._reset_vte() def _add_to_example_list(self, local_file): entry = {'name': _(os.path.basename(local_file)), 'path': local_file} _iter = self.model.insert_before(self.example_iter, None) self.model.set_value(_iter, 0, entry) self.model.set_value(_iter, 1, entry['name']) def _get_pippy_object_id(self): ''' We need the object_id of this pippy instance to save in the .py file metadata''' if self._pippy_instance == self: return _find_object_id(self.metadata['activity_id'], mimetype='application/json') else: return self._pippy_instance.get_object_id() def write_file(self, file_path): pippy_id = self._get_pippy_object_id() data = self._source_tabs.get_all_data() zipped_data = zip(*data) session_list = [] app_temp = os.path.join(self.get_activity_root(), 'instance') tmpfile = os.path.join(app_temp, 'pippy-tempfile-storing.py') for zipdata, content in zip(zipped_data, self.session_data): logging.debug('Session data %r', content) name, python_code, path, modified, editor_id = zipdata if content is not None and content == self._py_object_id: _logger.debug('saving to self') self.metadata['title'] = name self.metadata['mime_type'] = 'text/x-python' if pippy_id is not None: self.metadata['pippy_instance'] = pippy_id __file = open(file_path, 'w') __file.write(python_code) __file.close() session_list.append([name, content]) elif content is not None and content[0] != '/': _logger.debug('Saving an existing dsobject') dsobject = datastore.get(content) dsobject.metadata['title'] = name dsobject.metadata['mime_type'] = 'text/x-python' if pippy_id is not None: dsobject.metadata['pippy_instance'] = pippy_id __file = open(tmpfile, 'w') __file.write(python_code) __file.close() dsobject.set_file_path(tmpfile) datastore.write(dsobject) session_list.append([name, dsobject.object_id]) elif modified: _logger.debug('Creating new dsobj for modified code') if len(python_code) > 0: dsobject = datastore.create() dsobject.metadata['title'] = name dsobject.metadata['mime_type'] = 'text/x-python' if pippy_id is not None: dsobject.metadata['pippy_instance'] = pippy_id __file = open(tmpfile, 'w') __file.write(python_code) __file.close() dsobject.set_file_path(tmpfile) datastore.write(dsobject) session_list.append([name, dsobject.object_id]) # If there are multiple Nones, we need to find # the correct one. if content is None and \ self.session_data.count(None) > 1: i = zipped_data.index(zipdata) else: i = self.session_data.index(content) self.session_data[i] = dsobject.object_id elif content is not None or path is not None: _logger.debug('Saving reference to sample file') if path is None: # Should not happen, but just in case... _logger.error('path is None.') session_list.append([name, content]) else: session_list.append([name, path]) else: # Should not happen, but just in case... _logger.debug('Nothing to save in tab? %s %s %s %s' % (str(name), str(python_code), str(path), str(content))) self._pippy_instance.metadata['mime_type'] = 'application/json' pippy_data = json.dumps(session_list) # Override file path if we created a new Pippy instance if self._py_file_loaded_from_journal: file_path = os.path.join(app_temp, 'pippy-temp-instance-data') _file = open(file_path, 'w') _file.write(pippy_data) _file.close() if self._py_file_loaded_from_journal: _logger.debug('setting pippy instance file_path to %s' % file_path) self._pippy_instance.set_file_path(file_path) datastore.write(self._pippy_instance) self._store_config() def read_file(self, file_path): # Either we are opening Python code or a list of objects # stored (json-encoded) in a Pippy instance, or a shared # session. # Remove initial new/blank thing self.session_data = [] self._loaded_session = [] try: self._source_tabs.remove_page(0) tab_object.pop(0) except IndexError: pass if self.metadata['mime_type'] == 'text/x-python': _logger.debug('Loading Python code') # Opening some Python code directly try: text = open(file_path).read() except: alert = NotifyAlert(10) alert.props.title = _('Error') alert.props.msg = _('Error reading data.') def _remove_alert(alert, response_id): self.remove_alert(alert) alert.connect("response", _remove_alert) self.add_alert(alert) return self._py_file_loaded_from_journal = True # Discard the '#!/usr/bin/python' and 'coding: utf-8' lines, # if present python_code = re.sub(r'^' + re.escape(PYTHON_PREFIX), '', text) name = self.metadata['title'] self._loaded_session.append([name, python_code, None]) # Since we loaded Python code, we need to create (or # restore) a Pippy instance if 'pippy_instance' in self.metadata: _logger.debug('found a pippy instance: %s' % self.metadata['pippy_instance']) try: self._pippy_instance = datastore.get( self.metadata['pippy_instance']) except: _logger.debug('Cannot find old Pippy instance: %s') self._pippy_instance = None if self._pippy_instance in [self, None]: self._pippy_instance = datastore.create() self._pippy_instance.metadata['title'] = self.metadata['title'] self._pippy_instance.metadata['mime_type'] = 'application/json' self._pippy_instance.metadata['activity'] = 'org.laptop.Pippy' datastore.write(self._pippy_instance) self.metadata['pippy_instance'] = \ self._pippy_instance.get_object_id() _logger.debug('get_object_id %s' % self.metadata['pippy_instance']) # We need the Pippy file path so we can read the session data file_path = self._pippy_instance.get_file_path() # Finally, add this Python object to the session data self._py_object_id = _find_object_id(self.metadata['activity_id']) self.session_data.append(self._py_object_id) _logger.debug('session_data: %s' % self.session_data) if self.metadata['mime_type'] == 'application/json' or \ self._pippy_instance != self: # Reading file list from Pippy instance _logger.debug('Loading Pippy instance') if len(file_path) == 0: return data = json.loads(open(file_path).read()) for name, content in data: # content is either a datastore id or the path to some # sample code if content is not None and content[0] == '/': # a path try: python_code = open(content).read() except: _logger.error('Could not open %s; skipping' % content) path = content elif content != self._py_object_id: try: dsobject = datastore.get(content) if 'mime_type' not in dsobject.metadata: _logger.error( 'Warning: %s missing mime_type' % content) elif dsobject.metadata['mime_type'] != 'text/python': _logger.error( 'Warning: %s has unexpected mime_type %s' % (content, dsobject.metadata['mime_type'])) except: # Could be that the item has subsequently been # deleted from the datastore, so we skip it. _logger.error('Could not open %s; skipping' % content) continue try: python_code = open(dsobject.get_file_path()).read() except: # Malformed bundle? _logger.error('Could not open %s; skipping' % dsobject.get_file_path()) continue path = None # Queue up the creation of the tabs... # And add this content to the session data if content not in self.session_data: self.session_data.append(content) self._loaded_session.append([name, python_code, path]) elif self.metadata['mime_type'] == groupthink_mimetype: # AAAAAAAAAAAAARRRRRRRRRRRRRGGGGGGGGGHHHHHHHHHH # TODO: Find what groupthink data actually is under the layers # an layers of abstraction pass for name, content, path in self._loaded_session: self._source_tabs.add_tab(name, content, path) # TEMPLATES AND INLINE FILES ACTIVITY_INFO_TEMPLATE = ''' [Activity] name = %(title)s bundle_id = %(bundle_id)s exec = sugar-activity %(class)s icon = activity-icon activity_version = %(version)d mime_types = %(mime_types)s show_launcher = yes %(extra_info)s ''' PIPPY_ICON = """ ]> """ # ACTIVITY META-INFORMATION # this is used by Pippy to generate a bundle for itself. def pippy_activity_version(): '''Returns the version number of the generated activity bundle.''' return 39 def pippy_activity_extra_files(): '''Returns a map of 'extra' files which should be included in the generated activity bundle.''' # Cheat here and generate the map from the fs contents. extra = {} bp = get_bundle_path() for d in ['po', 'data', 'groupthink', 'post']: # everybody gets library for root, dirs, files in os.walk(os.path.join(bp, d)): for name in files: fn = os.path.join(root, name).replace(bp + '/', '') extra[fn] = open(os.path.join(root, name), 'r').read() return extra def pippy_activity_news(): '''Return the NEWS file for this activity.''' # Cheat again. return open(os.path.join(get_bundle_path(), 'NEWS')).read() def pippy_activity_icon(): '''Return an SVG document specifying the icon for this activity.''' return PIPPY_ICON def pippy_activity_class(): '''Return the class which should be started to run this activity.''' return 'pippy_app.PippyActivity' def pippy_activity_bundle_id(): '''Return the bundle_id for the generated activity.''' return 'org.laptop.Pippy' def pippy_activity_mime_types(): '''Return the mime types handled by the generated activity, as a list.''' return ['text/x-python', groupthink_mimetype] def pippy_activity_extra_info(): return ''' license = GPLv2+ update_url = http://activities.sugarlabs.org ''' # ACTIVITY BUNDLER def main(): '''Create a bundle from a pippy-style source file''' from optparse import OptionParser from pyclbr import readmodule_ex from tempfile import mkdtemp from shutil import copytree, copy2, rmtree from sugar3.activity import bundlebuilder parser = OptionParser(usage='%prog [options] [title] [sourcefile] [icon]') parser.add_option('-d', '--dir', dest='dir', default='.', metavar='DIR', help='Put generated bundle in the specified directory.') parser.add_option('-p', '--pythonpath', dest='path', action='append', default=[], metavar='DIR', help='Append directory to python search path.') (options, args) = parser.parse_args() if len(args) < 3: parser.error('The title, sourcefile and icon arguments are required.') title = args[0] sourcefile = args[1] icon_path = args[2] pytitle = re.sub(r'[^A-Za-z0-9_]', '', title) if re.match(r'[0-9]', pytitle) is not None: pytitle = '_' + pytitle # first character cannot be numeric # First take a gander at the source file and see if it's got extra info # for us. sourcedir, basename = os.path.split(sourcefile) if not sourcedir: sourcedir = '.' module, ext = os.path.splitext(basename) f = open(icon_path, 'r') icon = f.read() f.close() # Things we look for: bundle_info = { 'version': 1, 'extra_files': {}, 'news': 'No news.', 'icon': icon, 'class': 'activity.VteActivity', 'bundle_id': ('org.sugarlabs.pippy.%s%d' % (generate_unique_id(), int(round(uniform(1000, 9999), 0)))), 'mime_types': '', 'extra_info': '', } # Are any of these things in the module? try_import = False info = readmodule_ex(module, [sourcedir] + options.path) for func in bundle_info.keys(): p_a_func = 'pippy_activity_%s' % func if p_a_func in info: try_import = True if try_import: # Yes, let's try to execute them to get better info about our bundle oldpath = list(sys.path) sys.path[0:0] = [sourcedir] + options.path modobj = __import__(module) for func in bundle_info.keys(): p_a_func = 'pippy_activity_%s' % func if p_a_func in modobj.__dict__: bundle_info[func] = modobj.__dict__[p_a_func]() sys.path = oldpath # Okay! We've done the hard part. Now let's build a bundle. # Create a new temp dir in which to create the bundle. app_temp = mkdtemp('.activity', 'Pippy') # Hope TMPDIR is set correctly! bundle = get_bundle_path() try: copytree('%s/library' % bundle, '%s/library' % app_temp) copy2('%s/activity.py' % bundle, '%s/activity.py' % app_temp) # create activity.info file. bundle_info['title'] = title bundle_info['pytitle'] = pytitle # put 'extra' files in place. extra_files = { 'activity/activity.info': ACTIVITY_INFO_TEMPLATE % bundle_info, 'activity/activity-icon.svg': bundle_info['icon'], 'NEWS': bundle_info['news'], } extra_files.update(bundle_info['extra_files']) for path, contents in extra_files.items(): # safety first! assert '..' not in path dirname, filename = os.path.split(path) dirname = os.path.join(app_temp, dirname) if not os.path.exists(dirname): os.makedirs(dirname) with open(os.path.join(dirname, filename), 'w') as f: f.write(contents) # Put script into $app_temp/pippy_app.py copy2(sourcefile, '%s/pippy_app.py' % app_temp) # Invoke bundle builder olddir = os.getcwd() oldargv = sys.argv os.chdir(app_temp) sys.argv = ['setup.py', 'dist_xo'] print('\r\nStarting bundlebuilder\r\n') bundlebuilder.start() sys.argv = oldargv os.chdir(olddir) # Move to destination directory. src = '%s/dist/%s-%d.xo' % (app_temp, pytitle, bundle_info['version']) dst = '%s/%s-%d.xo' % (options.dir, pytitle, bundle_info['version']) if not os.path.exists(src): print('Cannot find %s\r\n' % (src)) else: copy2(src, dst) finally: rmtree(app_temp, ignore_errors=True) print('Finally\r\n') if __name__ == '__main__': from gettext import gettext as _ if False: # Change this to True to test within Pippy sys.argv = sys.argv + ['-d', '/tmp', 'Pippy', '/home/olpc/pippy_app.py'] print(_('Working...')) sys.stdout.flush() main() print(_('done!')) sys.exit(0) Pippy-71/po/000077500000000000000000000000001311421132100130075ustar00rootroot00000000000000Pippy-71/po/Pippy.pot000066400000000000000000000121561311421132100146410ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-02 17:02+1000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:41 sound_check.py:27 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: notebook.py:221 #, python-format msgid "New Source File %d" msgstr "" #: pippy_app.py:98 msgid "graphics" msgstr "" #: pippy_app.py:98 msgid "math" msgstr "" #: pippy_app.py:98 msgid "python" msgstr "" #: pippy_app.py:98 msgid "sound" msgstr "" #: pippy_app.py:99 msgid "string" msgstr "" #: pippy_app.py:99 msgid "tutorials" msgstr "" #: pippy_app.py:186 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:192 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:198 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:206 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:212 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:219 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:229 msgid "Edit" msgstr "" #: pippy_app.py:243 msgid "View" msgstr "" #: pippy_app.py:253 pippy_app.py:501 msgid "Show output panel" msgstr "" #: pippy_app.py:266 pippy_app.py:269 msgid "Run!" msgstr "" #: pippy_app.py:267 msgid "r" msgstr "" #: pippy_app.py:282 pippy_app.py:288 msgid "Stop" msgstr "" #: pippy_app.py:283 msgid "s" msgstr "" #: pippy_app.py:298 pippy_app.py:304 msgid "Clear" msgstr "" #: pippy_app.py:299 msgid "c" msgstr "" #: pippy_app.py:315 msgid "Open an example" msgstr "" #: pippy_app.py:390 msgid "My examples" msgstr "" #: pippy_app.py:497 msgid "Hide output panel" msgstr "" #: pippy_app.py:704 msgid "Python File added to Library" msgstr "" #: pippy_app.py:705 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:715 msgid "Saved" msgstr "" #: pippy_app.py:716 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:730 pippy_app.py:737 msgid "Error importing Python file" msgstr "" #: pippy_app.py:731 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:738 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:763 pippy_app.py:822 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:764 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:767 pippy_app.py:774 pippy_app.py:869 pippy_app.py:911 msgid "Ok" msgstr "" #: pippy_app.py:775 msgid "Activity icon" msgstr "" #: pippy_app.py:776 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:781 pippy_app.py:796 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:862 pippy_app.py:904 msgid "Pippy Activity" msgstr "" #: pippy_app.py:864 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:865 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:906 msgid "Save as Example Error" msgstr "" #: pippy_app.py:908 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:917 msgid "Creating example..." msgstr "" #: pippy_app.py:923 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:924 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:931 pippy_app.py:989 msgid "Saved as example." msgstr "" #: pippy_app.py:953 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:973 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1115 msgid "Error" msgstr "" #: pippy_app.py:1116 msgid "Error reading data." msgstr "" #: pippy_app.py:1444 msgid "Working..." msgstr "" #: pippy_app.py:1447 msgid "done!" msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" Pippy-71/po/ach.po000066400000000000000000000123221311421132100141020ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: ach\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.11.0\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/af.po000066400000000000000000000123641311421132100137430ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2011-03-31 15:44+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: af\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: Pootle 2.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Reg" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/am.po000066400000000000000000000124411311421132100137460ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 20:51+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: am\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s ምንጭ" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "አቁም" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "ሰርዝ" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s ድርጊት" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "እሺ" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/ar.po000066400000000000000000000140541311421132100137550ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Khaled Hosny , 2011. msgid "" msgstr "" "Project-Id-Version: pippy-activity\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 20:47+0200\n" "Last-Translator: Chris \n" "Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "بِبِي" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "مصْدر %s" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "تعثر العثور على مكتبة TamTamEdit، هل ثبّتها؟" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "حرّر" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "شغّل" #: pippy_app.py:266 msgid "r" msgstr "ش" #: pippy_app.py:281 pippy_app.py:287 #, fuzzy msgid "Stop" msgstr "أوقِف" #: pippy_app.py:282 msgid "s" msgstr "ف" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "امسح" #: pippy_app.py:298 msgid "c" msgstr "م" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "أمثلتي" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "نشاط %s" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "عطل في الحفظ كنشاط" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "من فضلك أعطِ لنشاطك اسما ذا معنى قبل أن تحاول حِفظه كنشاط." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "موافق" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "ينشئ حزمة النشاط..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "نشاط ببي" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "عطل في الحفظ كمثال" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "من فضلك أعطِ لنشاطك اسما ذا معنى قبل أن تحاول حِفظه كمثال." #: pippy_app.py:921 msgid "Creating example..." msgstr "ينشئ المثال..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "تحذير في الحفظ كمثال" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "المثال موجود مسبقًا. هل تريد الكتابة عليه؟" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "حُفظ كمثال." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "حُفِظ النشاط في اليوميّات" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "متوقف" Pippy-71/po/ayc.po000066400000000000000000000150771311421132100141350ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-10-14 03:44+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: ayc\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: Pootle 2.0.5\n" # "Peppy" #: activity/activity.info:2 msgid "Pippy" msgstr "Peppy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" # "%s Fuente" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Tunu" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" # "No se pudo encontrar la librería de audio de la Actividad TamTamEdit. ¿Ha " # "instalado la Actividad TamTamEdit?" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "Tam TamEdit istañanaka jani utkiti. ¿Tam TamEdit uchastati?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" # "Editar" #: pippy_app.py:228 msgid "Edit" msgstr "Chiqachaña" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" # "¡_Empieza!" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "¡Jasma!" # "r" #: pippy_app.py:266 msgid "r" msgstr "r" # "_Parar" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Sayt'ayaña" # "s" #: pippy_app.py:282 msgid "s" msgstr "s" # "_Limpiar" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Q'umachaña" # "c" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" # "Mis ejemplos" #: pippy_app.py:389 msgid "My examples" msgstr "Uñanchaja" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" # "%s Actividad" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Luräwi" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" # "Guardar como error de la Actividad" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Luräwi pantjatkipana imtata" # "Por favor de a su actividad un nombre con significado antes de intentar " # "guardarlo como una actividad." #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "Mira suma, luräwima suma sutichata ukhat imtata luräwijama." # "Bien" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Waliki" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" # "Creando una actividad empaquetada..." #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Luräwinaka lurapji..." # "Actividad Pippy" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Peppy luräwi" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" # "Guardar como Ejemplo Erróneo" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Pantjatjama imtjata" # "Por favor de a su actividad un nombre con significado antes de intentar " # "guardarlo como un ejemplo." #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "Mira suma, luräwima suma sutichata ukhat imtata luräwijama." # "Generando ejemplo..." #: pippy_app.py:921 msgid "Creating example..." msgstr "Uñanchayapjiwa..." # "Guardar como Ejemplo de Advertencia" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Imañtata ma sañjama" # "Este ejemplo ya existe. Deseas sobreescribirlo?" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Uñanchaña utjiwa. ¿Cchaqayañacha?" # "Guardado como ejemplo." #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Ma uñanchajama imtataskiwa." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" # "Actividad guardada en el diario." #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Luräwi sapüru luräwiru imtataskiwa." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" # "PAUSADO" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Suyt'ayaña" Pippy-71/po/aym.po000066400000000000000000000110021311421132100141270ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-06-19 00:34-0400\n" "PO-Revision-Date: 2012-08-22 23:26+0200\n" "Last-Translator: EdgarQuispeChambi \n" "Language-Team: LANGUAGE \n" "Language: aym\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: Pootle 2.0.5\n" # "Peppy" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" # "%s Fuente" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Tunu" # "Copiar el texto seleccionado al portapapeles" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Talliqaña ajllita qillqanaka laphi k'ipiru" # "Editar" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "Chiqachaña" # "PAUSADO" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Suyt'ayaña" # "No se pudo encontrar la librería de audio de la Actividad TamTamEdit. ¿Ha " # "instalado la Actividad TamTamEdit?" #: library/pippy/sound.py:54 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "Tam TamEdit istañanaka jani utkiti. ¿Tam TamEdit uchastati?" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "Peppy sutini wakichata qillqata apayaña" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "Peppy sutini wakichata qillqatjama apayaña" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "Maya luräwi wakichaña" # "Acciones" #: pippy_app.py:111 msgid "Actions" msgstr "Lurañanaka" # "¡_Empieza!" #: pippy_app.py:138 pippy_app.py:141 msgid "Run!" msgstr "¡Jasma!" # "r" #: pippy_app.py:139 msgid "r" msgstr "r" # "_Parar" #: pippy_app.py:152 pippy_app.py:158 msgid "Stop" msgstr "Sayt'ayaña" # "s" #: pippy_app.py:153 msgid "s" msgstr "s" # "_Limpiar" #: pippy_app.py:167 pippy_app.py:173 msgid "Clear" msgstr "Q'umachaña" # "c" #: pippy_app.py:168 msgid "c" msgstr "c" # "Ejemplos" #: pippy_app.py:197 msgid "Examples" msgstr "Uñancha" # "Mis ejemplos" #: pippy_app.py:229 msgid "My examples" msgstr "Uñanchaja" # "%s Actividad" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "%s Lurawi" # "Guardar como error de la Actividad" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "Lurawi pantjatkipana imtata" # "Por favor de a su actividad un nombre con significado antes de intentar " # "guardarlo como una actividad." #: pippy_app.py:439 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "Mira suma, lurawima suma sutichata ukhat imtata lurawijama." # "Bien" #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "Waliki" # "Creando una actividad empaquetada..." #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "Lurawinaka lurapji..." # "Actividad Pippy" #: pippy_app.py:479 msgid "Pippy Activity" msgstr "Pippy lurawi" # "Guardar como Ejemplo Erróneo" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "Pantjatjama imtjata" # "Por favor de a su actividad un nombre con significado antes de intentar " # "guardarlo como un ejemplo." #: pippy_app.py:484 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "Mira suma, lurawima suma sutichata ukhat imtata lurawijama." # "Generando ejemplo..." #: pippy_app.py:492 msgid "Creating example..." msgstr "Uñanchayapjiwa..." # "Guardar como Ejemplo de Advertencia" #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "Imañtata ma sañjama" # "Este ejemplo ya existe. Deseas sobreescribirlo?" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "Uñanchaña utjiwa. ¿Cchaqayañacha?" # "Guardado como ejemplo." #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "Ma uñanchajama imtataskiwa." # "Actividad guardada en el diario." #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "Lurawi sapüru luräwiru imtataskiwa." # "Como documento Pippy" #~ msgid "As Pippy Document" #~ msgstr "Pippy qillqatajama" # "Como Actividad empaquetada" #~ msgid "As Activity Bundle" #~ msgstr "Wakichäwinakajama" # "Como el ejemplo de Pippy" #~ msgid "As Pippy Example" #~ msgstr "Pippy uñanchajama" Pippy-71/po/bg.po000066400000000000000000000134061311421132100137430ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 20:55+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: bg\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: Pootle 2.0.5\n" #: activity/activity.info:2 #, fuzzy msgid "Pippy" msgstr "Пипи" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format #, fuzzy, python-format msgid "%s Source" msgstr "%s изходен код" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Старт!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Изтриване" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "Занятие %s" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 #, fuzzy msgid "Save as Activity Error" msgstr "Запазване като грешка на занятието" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "Моля, задайте разумно име преди да запазите като дейност." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "ОК" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Създаване на съвкупност от дейности..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "Моля, задайте разумно име преди да запазите като дейност." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Дейността е запазена в дневника." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/bi.po000066400000000000000000000060141311421132100137420ustar00rootroot00000000000000# 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. # 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. # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-06-19 00:34-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.1.1rc4\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity.py:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:54 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "" #: pippy_app.py:111 msgid "Actions" msgstr "" #: pippy_app.py:138 pippy_app.py:141 msgid "Run!" msgstr "" #: pippy_app.py:139 msgid "r" msgstr "" #: pippy_app.py:152 pippy_app.py:158 msgid "Stop" msgstr "" #: pippy_app.py:153 msgid "s" msgstr "" #: pippy_app.py:167 pippy_app.py:173 msgid "Clear" msgstr "" #: pippy_app.py:168 msgid "c" msgstr "" #: pippy_app.py:197 msgid "Examples" msgstr "" #: pippy_app.py:229 msgid "My examples" msgstr "" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:439 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:479 msgid "Pippy Activity" msgstr "" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "" #: pippy_app.py:484 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:492 msgid "Creating example..." msgstr "" #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "" #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "" Pippy-71/po/bn.po000066400000000000000000000140311311421132100137450ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: xo-bundled\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 20:52+0200\n" "Last-Translator: Chris \n" "Language-Team: Bengali \n" "Language: bn\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "পিপ্পি" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s উৎস" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "সম্পাদনা" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "চালাও!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "থামাও!" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "মুছো" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s সক্রিয়তা" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "সক্রিয়তার সমস্যা হিসাবে সংরক্ষন" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "অনুগ্রহ করে সংরক্ষন করার পুর্বে আপনার সক্রিয়তার একটি অর্থবহ নাম দিন।" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "ঠিক আছে" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "সক্রিয়তার গুচ্ছ তৈরি করছি..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "অনুগ্রহ করে সংরক্ষন করার পুর্বে আপনার সক্রিয়তার একটি অর্থবহ নাম দিন।" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "জার্নালে সক্রিয়তাটি সংরক্ষন করা হয়েছে।" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "স্থগিত" Pippy-71/po/bn_IN.po000066400000000000000000000140031311421132100143320ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: xo-bundled\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 20:53+0200\n" "Last-Translator: Chris \n" "Language-Team: Bengali \n" "Language: bn_IN\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "পিপ্পি" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s সোর্স" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "চালাও!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "থামাও!" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format #, fuzzy msgid "%s Activity" msgstr "%s অ্যাক্টিভিটি" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "অ্যাক্টিভিটির ত্রুটি হিসাবে সংরক্ষণ করুন" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "আপনার অ্যাক্টিভিটিকে একটি বোধগম্য নাম দিয়ে সংরক্ষণ করুন" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "ঠিক আছে" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "অ্যাক্টিভিটি গুচ্ছ তৈরী করা হচ্ছে..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "আপনার অ্যাক্টিভিটিকে একটি বোধগম্য নাম দিয়ে সংরক্ষণ করুন" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "জার্নালে অ্যাক্টিভিটি সংরক্ষণ করা হয়েছে" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "স্থগিত" Pippy-71/po/br.po000066400000000000000000000124361311421132100137600ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 20:54+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: 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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Arsaviñ" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Skarzhañ" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Oberiantiz" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/ca.po000066400000000000000000000141321311421132100137330ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2015-09-23 13:31+0000\n" "Last-Translator: Robert \n" "Language-Team: LANGUAGE \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1443015084.000000\n" # well-spelled: Pippy #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s codi font" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" # well-spelled: TamTamEdit #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "No es pot trobar la biblioteca de sons del TamTamEdit. Vàreu instal·lar el " "TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Edita" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Executa!" # well-spelled: r #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Atura" # well-spelled: s #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Neteja" # well-spelled: c #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Els meus exemples" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s l'activitat" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Desa-ho com un error de l'activitat" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Si us plau, doneu a l'activitat un nom significatiu abans d'intentar de " "desar-la com una activitat." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "D'acord" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "S'està creant el paquet de l'activitat..." # well-spelled: Pippy #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Activitat Pippy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Desa-ho com un exemple d'error" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Si us plau, doneu a l'activitat un nom significatiu abans d'intentar de " "desar-la com un exemple." #: pippy_app.py:921 msgid "Creating example..." msgstr "S'està creant l'exemple..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Desa-ho com un exemple d'advertència" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Aquest exemple ja existeix, voleu sobreescriure'l?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Es va desar com un exemple." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "L'activitat s'ha desat al diari." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ATURAT" Pippy-71/po/cpp.po000066400000000000000000000060141311421132100141320ustar00rootroot00000000000000# 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. # 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. # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-06-19 00:34-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.1.1rc4\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity.py:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:54 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "" #: pippy_app.py:111 msgid "Actions" msgstr "" #: pippy_app.py:138 pippy_app.py:141 msgid "Run!" msgstr "" #: pippy_app.py:139 msgid "r" msgstr "" #: pippy_app.py:152 pippy_app.py:158 msgid "Stop" msgstr "" #: pippy_app.py:153 msgid "s" msgstr "" #: pippy_app.py:167 pippy_app.py:173 msgid "Clear" msgstr "" #: pippy_app.py:168 msgid "c" msgstr "" #: pippy_app.py:197 msgid "Examples" msgstr "" #: pippy_app.py:229 msgid "My examples" msgstr "" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:439 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:479 msgid "Pippy Activity" msgstr "" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "" #: pippy_app.py:484 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:492 msgid "Creating example..." msgstr "" #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "" #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "" Pippy-71/po/cs.po000066400000000000000000000125021311421132100137540ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-07-02 13:03+0200\n" "Last-Translator: jui \n" "Language-Team: LANGUAGE \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Zdroj" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Upravit" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Zastavit" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Smazat" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Činnost" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "POZASTAVIT" Pippy-71/po/da.po000066400000000000000000000135261311421132100137420ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-25 02:28+0200\n" "Last-Translator: Aputsiaq Niels \n" "Language-Team: LANGUAGE \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" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Kilde" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Kan ikke finde lydbiblioteket for TamTamEdit. Har du installeret TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Redigér" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Kør!" #: pippy_app.py:266 msgid "r" msgstr "k" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Stop" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Ryd" #: pippy_app.py:298 msgid "c" msgstr "r" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Mine eksempler" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Aktivitet" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Gem som aktivitetsfejl" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Giv venligst din aktivitet et meningsfuldt navn før du forsøger at gemme det " "som en aktivitet." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Opretter aktivitetsbundt..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Pippy-aktivitet" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Gem som Eksempel-fejl" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Giv venligst din aktivitet et meningsfuldt navn før du forsøger at gemme det " "som et eksempel." #: pippy_app.py:921 msgid "Creating example..." msgstr "Opretter eksempel..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Gem som Eksempel-advarsel" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Dette eksempel eksisterer allerede. Ønsker du at overskrive det?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Gemt som eksempel." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Aktivitet gemt i journal." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PÅ PAUSE" Pippy-71/po/de.po000066400000000000000000000140031311421132100137350ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: Fructose-de\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2013-06-03 21:03+0200\n" "Last-Translator: Markus \n" "Language-Team: Deutsch \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Quelltext" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Kann die TamTamEdit-Klangbibliothek nicht finden. Hast du TamTamEdit " "installiert?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Bearbeiten" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Los!" #: pippy_app.py:266 msgid "r" msgstr "l" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Stopp" #: pippy_app.py:282 msgid "s" msgstr "s" # (Markus S.) war '_Säubern', später 'Leeren' #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Löschen" # (Markus S.) sollte zu 'Leeren' passen, aber 'l' ist schon zuvor belegt. #: pippy_app.py:298 msgid "c" msgstr "e" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Meine Beispiele" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Aktivität" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Als Aktivitätsfehler speichern" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Gib deiner Aktivität einen aussagekräftigen Namen, bevor du sie als solche " "abspeicherst." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Erstelle Aktivitätspaket..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Pippy-Aktivität" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Als Beispielfehler speichern" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Gib deiner Aktivität einen aussagekräftigen Namen, bevor du sie als Beispiel " "abzuspeichern versuchst." #: pippy_app.py:921 msgid "Creating example..." msgstr "Erstelle Beispiel..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Als Beispielwarnung speichern" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Dieses Beispiel existiert bereits. Willst du es überschreiben?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Als Beispiel gespeichert." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Aktivität ins Tagebuch gespeichert." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ANGEHALTEN" Pippy-71/po/dz.po000066400000000000000000000124161311421132100137700ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2011-03-25 14:42+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: dz\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s འབྱུང་ཁུངས།" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/el.po000066400000000000000000000153071311421132100137550ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 21:54+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.5\n" # Τι να μεταφράσεις από αυτό;;;;το αφήνω ίδιο #: activity/activity.info:2 msgid "Pippy" msgstr "Πίπης" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "Κώδικας του %s" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Αδυναμία εύρεσης της βιβλιοθήκης ήχων του TamTamEdit. Έχετε εγκαταστήσει το " "TamTamEdit;" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Επεξεργασία" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Τρέξε!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Διακοπή" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Καθαρισμός" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Τα δικά μου παραδείγματα" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "Δραστηριότητα %s" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Αποθήκευση ως σφάλμα δραστηριότητας" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Παρακαλώ δώσε στη δραστηριότητα σου ένα όνομα με κάποιο νόημα πριν " "προσπαθήσεις να την αποθηκεύσεις σαν δραστηριότητα." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Εντάξει" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Δημιουργώ πακέτο δραστηριότητας..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Δραστηριότητα του Πίπη" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Αποθήκευση ως σφάλμα παραδείγματος" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Παρακαλώ δώσε στη δραστηριότητα σου ένα όνομα με κάποιο νόημα πριν " "προσπαθήσεις να την αποθηκεύσεις ως παράδειγμα." #: pippy_app.py:921 msgid "Creating example..." msgstr "Δημιουργία παραδείγματος..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Αποθήκευση ως προειδοποίηση παραδείγματος" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Το παράδειγμα υπάρχει ήδη. Θέλετε να το αντικαταστήσετε;" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Αποθηκεύτηκε ως παράδειγμα." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Η Δραστηριότητα αποθηκεύτηκε στο Ημερολόγιο." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ΣΕ ΠΑΥΣΗ" Pippy-71/po/en.po000066400000000000000000000156231311421132100137600ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2017-03-26 00:08+0000\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: en\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: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1490486933.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" #: filedialog.py:79 msgid "Choose an example to open" msgstr "Choose an example to open" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "Joining activity..." #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "Please wait for the connection..." #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "Resuming shared activity..." #: toolbars.py:42 msgid "Zoom in" msgstr "Zoom in" #: toolbars.py:48 msgid "Zoom out" msgstr "Zoom out" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Source" #: icondialog.py:116 msgid "Select an icon" msgstr "Select an icon" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "New Source File %d" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "graphics" #: pippy_app.py:97 msgid "math" msgstr "math" #: pippy_app.py:97 msgid "python" msgstr "python" #: pippy_app.py:97 msgid "sound" msgstr "sound" #: pippy_app.py:98 msgid "string" msgstr "string" #: pippy_app.py:98 msgid "tutorials" msgstr "tutorials" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "Import Python file to new tab" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "Export as Pippy document" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "Save this file to the Pippy library" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "Export as new Pippy example" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "Create a Sugar activity bundle" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "Export as a distutils package" #: pippy_app.py:228 msgid "Edit" msgstr "Edit" #: pippy_app.py:242 msgid "View" msgstr "View" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "Show output panel" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Run!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Stop" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Clear" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "Open an example" #: pippy_app.py:389 msgid "My examples" msgstr "My examples" #: pippy_app.py:496 msgid "Hide output panel" msgstr "Hide output panel" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Activity" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "Python File added to Library" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." #: pippy_app.py:719 msgid "Saved" msgstr "Saved" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "The document has been saved to journal." #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "Error importing Python file" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "The file you selected is not a Python file." #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "The file you selected is already open" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Save as Activity Error" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Please give your activity a meaningful name before attempting to save it as " "an activity." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "Activity icon" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "Please select an activity icon." #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Creating activity bundle..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Pippy Activity" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "Save as distutils package error" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Save as Example Error" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Please give your activity a meaningful name before attempting to save it as " "an example." #: pippy_app.py:921 msgid "Creating example..." msgstr "Creating example..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Save as Example Warning" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "This example already exists. Do you want to overwrite it?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Saved as example." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "Error saving activity to journal." #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Activity saved to journal." #: pippy_app.py:1119 msgid "Error" msgstr "Error" #: pippy_app.py:1120 msgid "Error reading data." msgstr "Error reading data." #: pippy_app.py:1448 msgid "Working..." msgstr "Working..." #: pippy_app.py:1451 msgid "done!" msgstr "done!" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUSED" Pippy-71/po/en_GB.po000066400000000000000000000156261311421132100143330ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2017-03-26 01:42+0000\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: en_GB\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: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1490492572.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" #: filedialog.py:79 msgid "Choose an example to open" msgstr "Choose an example to open" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "Joining activity..." #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "Please wait for the connection..." #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "Resuming shared activity..." #: toolbars.py:42 msgid "Zoom in" msgstr "Zoom in" #: toolbars.py:48 msgid "Zoom out" msgstr "Zoom out" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Source" #: icondialog.py:116 msgid "Select an icon" msgstr "Select an icon" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "New Source File %d" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "graphics" #: pippy_app.py:97 msgid "math" msgstr "math" #: pippy_app.py:97 msgid "python" msgstr "python" #: pippy_app.py:97 msgid "sound" msgstr "sound" #: pippy_app.py:98 msgid "string" msgstr "string" #: pippy_app.py:98 msgid "tutorials" msgstr "tutorials" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "Import Python file to new tab" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "Export as Pippy document" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "Save this file to the Pippy library" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "Export as new Pippy example" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "Create a Sugar activity bundle" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "Export as a distutils package" #: pippy_app.py:228 msgid "Edit" msgstr "Edit" #: pippy_app.py:242 msgid "View" msgstr "View" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "Show output panel" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Run!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Stop" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Clear" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "Open an example" #: pippy_app.py:389 msgid "My examples" msgstr "My examples" #: pippy_app.py:496 msgid "Hide output panel" msgstr "Hide output panel" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Activity" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "Python File added to Library" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." #: pippy_app.py:719 msgid "Saved" msgstr "Saved" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "The document has been saved to journal." #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "Error importing Python file" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "The file you selected is not a Python file." #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "The file you selected is already open" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Save as Activity Error" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Please give your activity a meaningful name before attempting to save it as " "an activity." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "Activity icon" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "Please select an activity icon." #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Creating activity bundle..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Pippy Activity" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "Save as distutils package error" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Save as Example Error" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Please give your activity a meaningful name before attempting to save it as " "an example." #: pippy_app.py:921 msgid "Creating example..." msgstr "Creating example..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Save as Example Warning" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "This example already exists. Do you want to overwrite it?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Saved as example." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "Error saving activity to journal." #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Activity saved to journal." #: pippy_app.py:1119 msgid "Error" msgstr "Error" #: pippy_app.py:1120 msgid "Error reading data." msgstr "Error reading data." #: pippy_app.py:1448 msgid "Working..." msgstr "Working..." #: pippy_app.py:1451 msgid "done!" msgstr "done!" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUSED" Pippy-71/po/en_US.po000066400000000000000000000101731311421132100143620ustar00rootroot00000000000000# 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. # 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. # English translations for PACKAGE package. # Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # root , 2007. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-06-19 00:34-0400\n" "PO-Revision-Date: 2012-06-23 20:39+0200\n" "Last-Translator: Chris \n" "Language-Team: English\n" "Language: en_US\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Source" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Copy selected text to clipboard" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "Edit" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUSED" #: library/pippy/sound.py:54 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "Export as Pippy Document" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "Export as Pippy Example" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "Create Activity Bundle" #: pippy_app.py:111 msgid "Actions" msgstr "Actions" #: pippy_app.py:138 pippy_app.py:141 msgid "Run!" msgstr "Run!" #: pippy_app.py:139 msgid "r" msgstr "r" #: pippy_app.py:152 pippy_app.py:158 msgid "Stop" msgstr "Stop" #: pippy_app.py:153 msgid "s" msgstr "s" #: pippy_app.py:167 pippy_app.py:173 msgid "Clear" msgstr "Clear" #: pippy_app.py:168 msgid "c" msgstr "c" #: pippy_app.py:197 msgid "Examples" msgstr "Examples" #: pippy_app.py:229 msgid "My examples" msgstr "My examples" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "%s Activity" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "Save as Activity Error" #: pippy_app.py:439 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Please give your activity a meaningful name before attempting to save it as " "an activity." #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "Ok" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "Creating activity bundle..." #: pippy_app.py:479 msgid "Pippy Activity" msgstr "Pippy Activity" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "Save as Example Error" #: pippy_app.py:484 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Please give your activity a meaningful name before attempting to save it as " "an example." #: pippy_app.py:492 msgid "Creating example..." msgstr "Creating example..." #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "Save as Example Warning" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "This example already exists. Do you want to overwrite it?" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "Saved as example." #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "Activity saved to journal." #~ msgid "_Run!" #~ msgstr "_Run!" #~ msgid "_Stop" #~ msgstr "_Stop" #~ msgid "_Clear" #~ msgstr "_Clear" #~ msgid "As Pippy Document" #~ msgstr "As Pippy Document" #~ msgid "As Activity Bundle" #~ msgstr "As Activity Bundle" #~ msgid "As Pippy Example" #~ msgstr "As Pippy Example" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Please install TamTamEdit's sound library." #~ msgid "Stop!" #~ msgstr "Stop!" Pippy-71/po/es.po000066400000000000000000000163701311421132100137650ustar00rootroot00000000000000# Spanish translations for PACKAGE package. # Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # root , 2007. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2017-03-28 01:39+0000\n" "Last-Translator: Alan \n" "Language-Team: Spanish\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1490665173.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Peppy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" "¡Buscando programadores! Aquí puedes usar ejemplos para empezar aprendiendo " "el lenguaje que tu computadora entiende llamado \"Python\"." #: filedialog.py:79 msgid "Choose an example to open" msgstr "Elige un ejemplo para abrir" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "Uniéndose a actividad..." #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "Por favor espera por la conexión..." #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "Resumiendo actividad compartida..." #: toolbars.py:42 msgid "Zoom in" msgstr "Acercar" #: toolbars.py:48 msgid "Zoom out" msgstr "Alejar" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Fuente" #: icondialog.py:116 msgid "Select an icon" msgstr "Selecciona un icono" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "Nuevo Archivo Fuente %d" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "No se pudo encontrar la librería de audio de la Actividad TamTamEdit. ¿Ha " "instalado la Actividad TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "gráficos" #: pippy_app.py:97 msgid "math" msgstr "matemáticas" #: pippy_app.py:97 msgid "python" msgstr "python" #: pippy_app.py:97 msgid "sound" msgstr "sonido" #: pippy_app.py:98 msgid "string" msgstr "texto" #: pippy_app.py:98 msgid "tutorials" msgstr "tutoriales" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "Importar archivo Python en una nueva pestaña" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "Exportar como documento Peppy" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "Guardar este archivo a la librería Peppy" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "Exportar como ejemplo de Peppy" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "Crea un paquete de actividad Sugar" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "Exportar como un paquete de distutils" #: pippy_app.py:228 msgid "Edit" msgstr "Editar" #: pippy_app.py:242 msgid "View" msgstr "Vista" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "Mostrar panel de salida" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "¡Empieza!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Parar" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Limpiar" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "Abrir un ejemplo" #: pippy_app.py:389 msgid "My examples" msgstr "Mis ejemplos" #: pippy_app.py:496 msgid "Hide output panel" msgstr "Ocultar panel de salida" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Actividad" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "Archivo Python agregado a la Librería" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" "El archivo que has seleccionado ha sido agregado a la librería. Usa \"import " "{nombreimportado}\" para importar la librería para usarla." #: pippy_app.py:719 msgid "Saved" msgstr "Guardado" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "El documento ha sido guardado al diario." #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "Error importando archivo Python" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "El archivo que seleccionaste no es un archivo Python." #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "El archivo que seleccionaste ya está abierto" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Guardar como error de la Actividad" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Por favor de a su actividad un nombre con significado antes de intentar " "guardarlo como una actividad." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Bien" #: pippy_app.py:779 msgid "Activity icon" msgstr "Icono de la actividad" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "Por favor selecciona un icono para la actividad" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Creando una actividad empaquetada..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Actividad Peppy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "Guardar como paquete de error de distutils" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" "Por favor dale a tu actividad un nombre significativo antes de intentar " "guardarla como un paquete de distutils." #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Guardar como Ejemplo Erróneo" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Por favor de a su actividad un nombre con significado antes de intentar " "guardarlo como un ejemplo." #: pippy_app.py:921 msgid "Creating example..." msgstr "Generando ejemplo..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Guardar como Ejemplo de Advertencia" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Este ejemplo ya existe. Deseas sobreescribirlo?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Guardado como ejemplo." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "Error guardando actividad al diario." #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Actividad guardada en el diario." #: pippy_app.py:1119 msgid "Error" msgstr "Error" #: pippy_app.py:1120 msgid "Error reading data." msgstr "Error leyendo datos." #: pippy_app.py:1448 msgid "Working..." msgstr "Trabajando..." #: pippy_app.py:1451 msgid "done!" msgstr "¡hecho!" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUSADO" Pippy-71/po/fa.po000066400000000000000000000133651311421132100137450ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2017-03-18 22:05+0000\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1489874735.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "بران" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s فعالیت" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "بحیث یک اشتباه فعالیتی ثبت شود" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "لطفاً فغالیت خود را قبل از ثبت آن بحیث یک فعالیت یک نام پرمعنی بدهید." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "درست است" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "در حال ساختن مجموعه فعالیتی..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "لطفاً فغالیت خود را قبل از ثبت آن بحیث یک فعالیت یک نام پرمعنی بدهید." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "فعالیت بحیث یک یادداشت ثبت گردید." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "مکث شده" Pippy-71/po/fa_AF.po000066400000000000000000000076611311421132100143150ustar00rootroot00000000000000# 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. # 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. # 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-06-19 00:34-0400\n" "PO-Revision-Date: 2012-06-26 21:51+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: fa_AF\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "پیپی" #: activity.py:49 #, python-format msgid "%s Source" msgstr "منبع %s" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "متن انتخاب شده را به تخته رسم انتقال بده" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "تنظیم کردن" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "مکث شده" #: library/pippy/sound.py:54 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "" #: pippy_app.py:111 msgid "Actions" msgstr "" #: pippy_app.py:138 pippy_app.py:141 msgid "Run!" msgstr "اجراکن!" #: pippy_app.py:139 msgid "r" msgstr "" #: pippy_app.py:152 pippy_app.py:158 msgid "Stop" msgstr "توقف" #: pippy_app.py:153 msgid "s" msgstr "" #: pippy_app.py:167 pippy_app.py:173 msgid "Clear" msgstr "پاک کردن" #: pippy_app.py:168 msgid "c" msgstr "" #: pippy_app.py:197 msgid "Examples" msgstr "مثال ها" #: pippy_app.py:229 msgid "My examples" msgstr "" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "فعالیت: %s" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "بحیث یک خطای فعالیتی ثبت شود" #: pippy_app.py:439 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "لطفاً فعالیت خود را قبل از ثبت آن بحیث یک فعالیت یک نام پرمعنی بدهید." #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "درست است" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "در حال ساختن مجموعه فعالیتی..." #: pippy_app.py:479 msgid "Pippy Activity" msgstr "" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "" #: pippy_app.py:484 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "لطفاً فعالیت خود را قبل از ثبت آن بحیث یک فعالیت یک نام پرمعنی بدهید." #: pippy_app.py:492 msgid "Creating example..." msgstr "" #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "" #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "فعالیت در ژورنال ثبت گردید." #~ msgid "As Pippy Document" #~ msgstr "بحیث سند پیپی" #~ msgid "As Activity Bundle" #~ msgstr "بحیث مجموعه فعالیتی" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "لطفا مجموعه صداهای تمتم ویرایش را بارگذاری کنید." Pippy-71/po/ff.po000066400000000000000000000123201311421132100137400ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: ff\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/fi.po000066400000000000000000000124031311421132100137450ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 21:50+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 #, fuzzy msgid "Clear" msgstr "Tyhjennä" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/fil.po000066400000000000000000000124141311421132100141230ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2011-03-25 14:01+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: fil\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: Pootle 2.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Pinagmulan" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Baguhin" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/fr.po000066400000000000000000000136001311421132100137560ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 21:52+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "Source %s" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Bibliothèque audio TamTamEdit introuvable. Avez-vous installé TamTamEdit ?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Editer" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Démarrer !" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Arrêt" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Effacer" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Mes exemples" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "Activité %s" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Erreur de sauvegarde comme activité" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "Pour enregistrer votre activité, choisissez un nom d'activité parlant." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Création de paquet activité en cours..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Activité Pippy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Enregistrer comme exemple d'erreur" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Pour enregistrer votre activité comme exemple, choisissez un nom d'activité " "parlant." #: pippy_app.py:921 msgid "Creating example..." msgstr "Création d'un exemple..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Enregistrer comme exemple d'avertissement" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Cet exemple existe déjà. Voulez-vous le remplacer ?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Enregistré comme exemple." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "L'activité a été enregistrée dans le journal." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUSE" Pippy-71/po/gn.po000066400000000000000000000067311311421132100137620ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-06-19 00:34-0400\n" "PO-Revision-Date: 2016-05-21 23:15+0000\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: gn\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: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1463872522.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Peppy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Ypy" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Kopia moñe'erã portapeles-pe" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "Moambue" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Mbegue" #: library/pippy/sound.py:54 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Ndoikatúi ojetopa librería de audio mba'apo TamTamEdit rehegua. Remoĩma " "Mba'apo TamTamEdit?" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "Emondo kuatia'arandu Peppyicha" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "Ñemondo Peppy techapyrãicha" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "Jejapo peteĩ mba'apo" #: pippy_app.py:111 msgid "Actions" msgstr "Tembiapo" #: pippy_app.py:138 pippy_app.py:141 msgid "Run!" msgstr "Eñepyrũ!" #: pippy_app.py:139 msgid "r" msgstr "r" #: pippy_app.py:152 pippy_app.py:158 msgid "Stop" msgstr "Epyta" #: pippy_app.py:153 msgid "s" msgstr "s" #: pippy_app.py:167 pippy_app.py:173 msgid "Clear" msgstr "Mopotĩ" #: pippy_app.py:168 msgid "c" msgstr "c" #: pippy_app.py:197 msgid "Examples" msgstr "Techapyrãkuéra" #: pippy_app.py:229 msgid "My examples" msgstr "Che techapyrãkuéra" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "%s Tembiapo" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "Ñongatu Tembiapo jejavývaicha" #: pippy_app.py:439 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "Ikaturámo embohéra nde mba'apo japekandive eñongatumboye mba'apóicha." #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "Ok" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "Ojejapohina peteĩ mba'apo mbohyrupapyre" #: pippy_app.py:479 msgid "Pippy Activity" msgstr "Mba'apo Peppy" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "Ñongatu techapyrã oĩvaívaicha" #: pippy_app.py:484 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Ikatumíramo embohéra nde mba'apo japekándive eñongatumboyve techapyrãicha." #: pippy_app.py:492 msgid "Creating example..." msgstr "Ojejapohína techapỹra..." #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "Ñongatu techapyrã ñemomarandúicha" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "Ko techapyrã oĩma. Rehaisejey?" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "Oñeñongatu techapyrãicha." #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "Mba'apo oñeñongatu tembiapokuérañeñongatuha." Pippy-71/po/gu.po000066400000000000000000000060111311421132100137600ustar00rootroot00000000000000# 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. # 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. # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-06-19 00:34-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity.py:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:54 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "" #: pippy_app.py:111 msgid "Actions" msgstr "" #: pippy_app.py:138 pippy_app.py:141 msgid "Run!" msgstr "" #: pippy_app.py:139 msgid "r" msgstr "" #: pippy_app.py:152 pippy_app.py:158 msgid "Stop" msgstr "" #: pippy_app.py:153 msgid "s" msgstr "" #: pippy_app.py:167 pippy_app.py:173 msgid "Clear" msgstr "" #: pippy_app.py:168 msgid "c" msgstr "" #: pippy_app.py:197 msgid "Examples" msgstr "" #: pippy_app.py:229 msgid "My examples" msgstr "" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:439 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:479 msgid "Pippy Activity" msgstr "" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "" #: pippy_app.py:484 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:492 msgid "Creating example..." msgstr "" #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "" #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "" Pippy-71/po/gug.po000066400000000000000000000136371311421132100141430ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2016-05-26 02:20+0000\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: gug\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: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1464229231.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Peppy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Ypy" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Ndoikatúi ojetopa librería de audio mba'apo TamTamEdit rehegua. Remoĩma " "Mba'apo TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Moambue" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Eñepyrũ!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Epyta" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Mopotĩ" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Che techapyrãkuéra" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Tembiapo" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Ñongatu Tembiapo jejavývaicha" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "Ikaturámo embohéra nde mba'apo japekandive eñongatumboye mba'apóicha." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Ojejapohina peteĩ mba'apo mbohyrupapyre..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Mba'apo Peppy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Ñongatu techapyrã oĩvaívaicha" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Ikatumíramo embohéra nde mba'apo japekándive eñongatumboyve techapyrãicha." #: pippy_app.py:921 msgid "Creating example..." msgstr "Ojejapohína techapỹra..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Ñongatu techapyrã ñemomarandúicha" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Ko techapyrã oĩma. Rehaisejey?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Oñeñongatu techapyrãicha." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Mba'apo oñeñongatu tembiapokuérañeñongatuha." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Mbegue" Pippy-71/po/ha.po000066400000000000000000000123201311421132100137350ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: ha\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/he.po000066400000000000000000000133161311421132100137470ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 21:56+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 #, fuzzy msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 #, fuzzy msgid "Edit" msgstr "עריכה" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "ריצה!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "עצור" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "נקה" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 #, fuzzy msgid "Save as Activity Error" msgstr "שמור כשגיאת פעילות" #: pippy_app.py:768 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "יש לתת שם בעל משמעות לפעילות לפני שמנסים לשמור אותה בתור פעילות." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 #, fuzzy msgid "Ok" msgstr "אישור" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 #, fuzzy msgid "Creating activity bundle..." msgstr "מייצר חבילת פעילות..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "יש לתת שם בעל משמעות לפעילות לפני שמנסים לשמור אותה בתור פעילות." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 #, fuzzy msgid "Activity saved to journal." msgstr "פעילות נשמרה ביומן." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 #, fuzzy msgid "PAUSED" msgstr "מושהה" Pippy-71/po/hi.po000066400000000000000000000153061311421132100137540ustar00rootroot00000000000000# translation of pippy-activity.po to Hindi # G Karunakar , 2007. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. msgid "" msgstr "" "Project-Id-Version: pippy-activity\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 21:58+0200\n" "Last-Translator: Chris \n" "Language-Team: Hindi \n" "Language: hi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "पिप्पी" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s स्रोत" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "टमटम आवाज़ कोष नहीं मिला, क्या आपने यह कम्पूटर में अवस्थापन किया है ?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "संपादन" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "दोडो!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "रुकें" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "साफ" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "मेरे उदहारण" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s क्रिया" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "क्रिया त्रुटि जैसे सहेजें" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "अपनी क्रिया को सहेजने की कोशिश करने से पहले कृपया इसे कोई अर्थयुक्त नाम दें." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "ठीक है" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "क्रिया संग्रह बनाया जा रहा है..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Pippy गतिविधि" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "उदाहरण त्रुटि के रूप में सहेजें" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "अपनी क्रिया को सहेजने की कोशिश करने से पहले कृपया इसे कोई अर्थयुक्त नाम दें." #: pippy_app.py:921 msgid "Creating example..." msgstr "उदहारण बना रहा (रही) हूँ..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "उदहारण गलती की तरह सहेजें" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "यहाँ उदहारण पहेले से मौजूद है, क्या आप इसे बदलना चाहेंगे ?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "उदहारण की तरह सहेजा गया." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "क्रिया दैनिकी में सहेजा गया." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "विराम" Pippy-71/po/ht.po000066400000000000000000000130561311421132100137670ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 21:55+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: ht\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Sous" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Korije" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Fè mache!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Pwòp" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Aktivite" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Sove kòm Aktivite Erè" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Souple bay aktivite ou-a yon non siyifikatif avan ou tante sove-l kòm yon " "aktivite." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "pakè aktivite an kreyasyon..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Souple bay aktivite ou-a yon non siyifikatif avan ou tante sove-l kòm yon " "aktivite." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Aktivite sove nan jounal." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Poze" Pippy-71/po/hu.po000066400000000000000000000127371311421132100137750ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2016-02-06 21:58+0000\n" "Last-Translator: ursus \n" "Language-Team: LANGUAGE \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1454795921.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Forrás" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "Nem található a TamTamEdit hangkönyvtár. Telepítetted a TamTamEditet?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Szerkesztés" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Futtat!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Állj" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Töröl" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Aktivitás" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Mentés Aktivitás hibaként" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Szünet" Pippy-71/po/hus.po000066400000000000000000000144421311421132100141530ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 21:58+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: hus\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: Pootle 2.0.5\n" # Si se acepta mi sugerencia de "Tsán", deberán cambiar todas las cadenas que contengan "Pippy" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Elel" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Yab i ejtow ki ela' an dhaykol ats'at dhuchlab xin k'al an t'ojlab " "TamTamEdit. ¿A punk'uyámal an t'ojlab TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Jalk'uy" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "¡Tujuw!" # Aquí la traducción no es literal, porque se debe tomar en cuenta la letra que lleva antepuesta el guion bajo _ # Esto es difícil de explicar, son cuestiones de programación. Zurik #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Kuba'" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "T'oka'" #: pippy_app.py:298 msgid "c" msgstr "o" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "U t'iplabilchik" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s T'ojlab" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Ka dhaya' etil jun i k'ibts'ontaláb ti t'ojláb" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Ka t'aja' an alwa'talab abal ok'xidh ti ka dhaya' etil jun i t'ojlab ka " "punchij jun in éxbadh bij." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Alwa'" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Dhayk'al jun i t'ojlab axi dhayk'adh ti yan..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "T'ojlab Pippy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Ka dhaya' etil jun i uk'pidh t'ojlab" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Ka t'aja' an alwa'talab abal ok'xidh ti ka dhaya' jun i t'ojlab etil jun i " "t'iplab ka punchij jun in éxbadh bij." #: pippy_app.py:921 msgid "Creating example..." msgstr "Dhayk'andhal jun i t'iplab..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Ka dhaya' etil jun i T'ipodh Ok'xidh olchixtaláb" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Axi t'iplab wa'tsits. a le' ka. A le' ka wichk'ow ka dhucha'?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Dhayach etil i t'iplab." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "T'ojláb dhayach ti chudhel dhuchadh úw." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "TONK'IDH" Pippy-71/po/hy.po000066400000000000000000000145711311421132100137770ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 20:48+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: hy\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Պիտոն Պիպպի" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Աղբյուր" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "TamTamEdit -ի ձայնդարանը չեմ գտնում: Դուք տեղադրե՞լ եք TamTamEdit - ը:" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Խմբագրել" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "մեկնարկիր!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Կանգ" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Մաքրել" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Իմ օրինակները" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Գործունեություն" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Հիշել որպես գործունեության խափանում" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Տվեք Ձեր գործունեությանն իմաստալից անվանում` մինչև այն որպես գործունեություն " "պահպանելը:" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "OK" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Գործունեություների փաթեթի ստեղծում..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Պիպպիի գործունեություն" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Պահպանել որպես Օրինակի Սխալ" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Տվեք Ձեր գործունեությանը իմաստալից անվանում` մինչև այն որպես օրինակ " "պահպանելը:" #: pippy_app.py:921 msgid "Creating example..." msgstr "Օրինակի ստեղծում..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Պահպանել որպես նախազգուշացման օրինակ:" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Այս օրինակն արդեն կա: Ուզո՞ւմ եք այն փոխարինել նորով:" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Պահպանված է որպես օրինակ:" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Գործունեությունը պահված է մատյանում:" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ԴԱԴԱՐԵՑՎԱԾ" Pippy-71/po/ibo.po000066400000000000000000000123221311421132100141200ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: ibo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.11.0\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/id.po000066400000000000000000000135651311421132100137550ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-24 22:24+0200\n" "Last-Translator: andika \n" "Language-Team: LANGUAGE \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "Sumber %s" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Tak bisa temukan pustaka suara TamTamEdit. Apakah Anda telah memasang " "TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Sunting" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Jalankan!" #: pippy_app.py:266 msgid "r" msgstr "j" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Hentikan" #: pippy_app.py:282 msgid "s" msgstr "h" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Bersihkan" #: pippy_app.py:298 msgid "c" msgstr "b" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Contohku" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "Aktivitas %s" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Simpan sebagai Galat Aktivitas" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Harap beri nama aktivitas Anda suatu nama yang berarti sebelum mencoba " "menyimpannya sebagai aktivitas." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Membuat bendel aktivitas..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Aktivitas Pippy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Simpan sebagai Galat Contoh" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Harap beri nama aktivitas Anda suatu nama yang berarti sebelum mencoba " "menyimpannya sebagai contoh." #: pippy_app.py:921 msgid "Creating example..." msgstr "Membuat contoh..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Simpan sebagai Peringatan Contoh" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Contoh ini telah ada. Apakah Anda hendak menimpanya?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Tersimpan sebagai contoh." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Aktivitas disimpan ke jurnal." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "DITAHAN" Pippy-71/po/ig.po000066400000000000000000000060111311421132100137440ustar00rootroot00000000000000# 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. # 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. # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-06-19 00:34-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity.py:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:54 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "" #: pippy_app.py:111 msgid "Actions" msgstr "" #: pippy_app.py:138 pippy_app.py:141 msgid "Run!" msgstr "" #: pippy_app.py:139 msgid "r" msgstr "" #: pippy_app.py:152 pippy_app.py:158 msgid "Stop" msgstr "" #: pippy_app.py:153 msgid "s" msgstr "" #: pippy_app.py:167 pippy_app.py:173 msgid "Clear" msgstr "" #: pippy_app.py:168 msgid "c" msgstr "" #: pippy_app.py:197 msgid "Examples" msgstr "" #: pippy_app.py:229 msgid "My examples" msgstr "" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:439 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:479 msgid "Pippy Activity" msgstr "" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "" #: pippy_app.py:484 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:492 msgid "Creating example..." msgstr "" #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "" #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "" Pippy-71/po/is.po000066400000000000000000000124701311421132100137660ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2017-04-15 19:56+0000\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: is\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: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1492286173.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippi" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Keyra!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 #, fuzzy msgid "Stop" msgstr "Stöðva" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/it.po000066400000000000000000000135751311421132100137760ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2013-11-11 16:57+0200\n" "Last-Translator: arosella \n" "Language-Team: LANGUAGE \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Sorgente" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "Libreria sonora TamTamEdit non trovata. Hai installato TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Modifica" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Vai!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Stop" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Cancella" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "I miei esempi" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Attività" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Salva come Errore dell'Attività" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Per favore assegna un nome significativo alla Attività prima di salvarla." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Creazione di una attività integrata..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Attività Pippy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Salva come Esempio Sbagliato" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Per favore assegna un nome significativo alla Attività prima di salvarla " "come un esempio." #: pippy_app.py:921 msgid "Creating example..." msgstr "Esempio in creazione..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Salva come Esempio di Avvertimento" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" "Esiste già un esempio con questo nome. Vuoi cancellare il vecchio e scrivere " "il nuovo?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Salvato come Esempio." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Attività salvata nel diario." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "INPAUSA" Pippy-71/po/ja.po000066400000000000000000000132751311421132100137510ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:21+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s ソース" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "編集" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "実行!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "止まれ!" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s アクティビティ" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "「アクティビティとして保存」のエラー" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "わかりやすい名前を付けてから、アクティビティとして保存してください。" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "了解" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "アクティビティバンドルを生成中..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "わかりやすい名前を付けてから、アクティビティとして保存してください。" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "ジャーナルにアクティビティを保存しました。" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "一時停止中" Pippy-71/po/km.po000066400000000000000000000134551311421132100137660ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:35+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: km\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s ប្រភព" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "កែ" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "រត់!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "បញ្ឈប់" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "ជម្រះ" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s សកម្មភាព" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "សកម្មភាពមានកំហុសរក្សាទុកជា" #: pippy_app.py:768 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "មេត្តាផ្តល់សកម្មភាពរបស់អ្នក" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "យល់ព្រម" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "បង្កើតសកម្មភាពទាំមូល..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "មេត្តាផ្តល់សកម្មភាពរបស់អ្នក" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "រក្សាទុកសកម្មភាពក្នុងសៀវភៅទានានុប្បវត្តិ" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "បញ្ឈប់" Pippy-71/po/ko.po000066400000000000000000000132041311421132100137600ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2016-05-28 01:41+0000\n" "Last-Translator: mimibg \n" "Language-Team: LANGUAGE \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1464399679.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "피삐" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s 소스" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "편집" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "실행!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "중지" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "지우기" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s 활동" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "활동 에러 저장하기" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "활동을 저장하기 전에 당신의 활동을 의미 있는 이름으로 지어 주세요." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "완료" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "활동 묶음 만들기" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "활동을 저장하기 전에 당신의 활동을 의미 있는 이름으로 지어 주세요." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "일지에 활동 저장" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "잠시 멈춤" Pippy-71/po/kos.po000066400000000000000000000060111311421132100141410ustar00rootroot00000000000000# 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. # 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. # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-06-19 00:34-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.3.0\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity.py:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:54 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "" #: pippy_app.py:111 msgid "Actions" msgstr "" #: pippy_app.py:138 pippy_app.py:141 msgid "Run!" msgstr "" #: pippy_app.py:139 msgid "r" msgstr "" #: pippy_app.py:152 pippy_app.py:158 msgid "Stop" msgstr "" #: pippy_app.py:153 msgid "s" msgstr "" #: pippy_app.py:167 pippy_app.py:173 msgid "Clear" msgstr "" #: pippy_app.py:168 msgid "c" msgstr "" #: pippy_app.py:197 msgid "Examples" msgstr "" #: pippy_app.py:229 msgid "My examples" msgstr "" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:439 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:479 msgid "Pippy Activity" msgstr "" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "" #: pippy_app.py:484 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:492 msgid "Creating example..." msgstr "" #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "" #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "" Pippy-71/po/lt.po000066400000000000000000000137361311421132100140000ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2017-02-17 11:38+0000\n" "Last-Translator: Moo \n" "Language-Team: LANGUAGE \n" "Language: lt\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%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1487331500.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippi" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s šaltinis" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "Nepavyksta rasti TamTamEdit garso bibliotekos. Ar įdiegėte TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Redaguoti" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Vykdyti!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Stabdyti" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Išvalyti" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Mano pavyzdžiai" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s veikla" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Klaida, įrašant kaip veiklą" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Prašome, prieš bandant įrašyti kaip veiklą, suteikti savo veiklai prasmingą " "pavadinimą." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Gerai" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Kuriamas veiklos rinkinys..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Pippi veikla" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Klaida, įrašant kaip pavyzdį" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Prašome, prieš bandant įrašyti kaip pavyzdį, suteikti savo veiklai prasmingą " "pavadinimą." #: pippy_app.py:921 msgid "Creating example..." msgstr "Kuriamas pavyzdys..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Įspėjimas, įrašant kaip pavyzdį" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Šis pavyzdys jau yra. Ar norite jį perrašyti?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Įrašyta kaip pavyzdys." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Veikla įrašyta į žurnalą." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PRISTABDYTA" Pippy-71/po/messages.mo000066400000000000000000000026171311421132100151610ustar00rootroot00000000000000,   ),3X9*Y 4@Gau# T,>k    %s Activity%s SourceActivity saved to journal.As Activity BundleAs Pippy DocumentCopy selected text to clipboardCreating activity bundle...EditExamplesOkPAUSEDPippyPlease give your activity a meaningful name before attempting to save it as an activity.Please install TamTamEdit's sound library.Save as Activity Error_Run!Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2008-05-27 00:30-0400 PO-Revision-Date: 2008-09-15 13:25-0400 Last-Translator: lacrete Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Pootle 1.1.0rc2 %s Aktivite% SousAktivite sove nan jounal.Kòm pakè aktiviteKòm dokiman PippyKopye tèks ou chwazi a sou ekritwapakè aktivite an kreyasyon...KorijeEgzanp yoOkPozPippySouple bay aktivite ou-a yon non siyifikatif avan ou tante sove-l kòm yon aktivite.Souple enstale korektè TamTam librèri son.Sove kòm Aktivite Erè_Fè mache!Pippy-71/po/mg.po000066400000000000000000000131501311421132100137520ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:38+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: mg\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pipay" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s loharano" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Ovao" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Alefa!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Ajanony" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Fafao" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Sahanasa" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Tehirizo ho Sahanasa Diso" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Azafady omeo anarana misy dikany ny sahanasanao alohan'ny hitehirizana azy " "ho sahanasa." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Eo am-pamoronana tamba-tsahanasa..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Azafady omeo anarana misy dikany ny sahanasanao alohan'ny hitehirizana azy " "ho sahanasa." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Voatahiry ao amin'ny firaketana ny sahanasa." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Mijanona" Pippy-71/po/mi.po000066400000000000000000000134521311421132100137610ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: mi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.1.1rc4\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pipi" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Pūtake" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Kāore e taea te kite i te puna oro TamTamEdit. I tāuta koe i te TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Whakatika" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Whakahaere!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Tū" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Ūkui" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Aku tauira" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Hohe" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Tiaki hei Hapa Hohe" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Hoatu koa i tētahi ingoa whai mana ki tō hohe i mua i te ngana ki te tiaki " "hei hohe." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Āe" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Waihanga ana i te pūkai hohe..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Hohe Pipi" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Tiaki hei Hapa Tauira" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Hoatu koa i tētahi ingoa whai mana ki tō hohe i mua i te ngana ki te tiaki " "hei tauira." #: pippy_app.py:921 msgid "Creating example..." msgstr "Waihanga ana i tētahi tauira..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Tiaki hei Tauira Whakatūpato" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Kei te tīari kē tēnei tauira. Tuhirua anō?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Kua tiakina hei tauira." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Hohe kua tiakina ki te tuhitaka." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "KUA TĀRIA" Pippy-71/po/mk.po000066400000000000000000000135101311421132100137560ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:37+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: mk\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%10==1 ? 0 : 1);\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Пипи" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Изврши!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 #, fuzzy msgid "Stop" msgstr "Стоп" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Исчисти" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Активност" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Сними како грешка во активност" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Доделете осмислено име на активноста пред да пробате да ја снимите како " "таква." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Во ред" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Создавам сноп на активности..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Доделете осмислено име на активноста пред да пробате да ја снимите како " "таква." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Активноста е снимена во дневникот." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ПАУЗИРАНО" Pippy-71/po/ml.po000066400000000000000000000123201311421132100137550ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: ml\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/mn.po000066400000000000000000000136421311421132100137670ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:40+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: mn\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Пиппи" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Эх үүсвэр" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Засварлах" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Гүйцэтгэх!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Зогсоох" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Арилгах" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Үйл ажиллагаа" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Үйл ажиллагаагаар хадгалхад алдаа гарлаа" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Үйл ажиллагаагаар хадгалахын өмнө өөрийн үйл ажиллагаанд утгатай нэр өгөөрэй." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "За" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Үйл ажиллагааны бүрдэл бүтээгдэж байна..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Үйл ажиллагаагаар хадгалахын өмнө өөрийн үйл ажиллагаанд утгатай нэр өгөөрэй." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Үйл ажиллагаа бүртгэлийн дэвтэрт хадгалагдлаа." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ТҮР ЗОГССОН" Pippy-71/po/mr.po000066400000000000000000000136561311421132100140000ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:38+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: mr\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "पिपी" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s स्त्रोत्रा" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "संपादन करा" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "धावा!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "थांबा" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s उद्योग" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "अँक्टिवीटीमधील चुक नोंदवा" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "कृपया तुमच्या अँक्टिवीटीला नोंदविण्यापुर्वी योग्य नाव द्या" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "ओ के" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "अँक्टिवीटी बंडल बनवा" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "कृपया तुमच्या अँक्टिवीटीला नोंदविण्यापुर्वी योग्य नाव द्या" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "अँक्टिवीटी जनरलमध्य़े टाका" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "थोडा वेळ थांबा" Pippy-71/po/ms.po000066400000000000000000000123231311421132100137670ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: ms\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.1.1rc4\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/mvo.po000066400000000000000000000123241311421132100141520ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: mvo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.1.1rc4\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/nb.po000066400000000000000000000073531311421132100137560ustar00rootroot00000000000000# 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. # 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. # translation of pippy-activity.po to Norsk bokmål # Kent Dahl , 2008. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. msgid "" msgstr "" "Project-Id-Version: pippy-activity\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-06-19 00:34-0400\n" "PO-Revision-Date: 2012-06-26 22:41+0200\n" "Last-Translator: Chris \n" "Language-Team: Norsk bokmål \n" "Language: nb\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Kilde" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Kopier valgt tekst til utklippstavlen" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "Endre" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUSET" #: library/pippy/sound.py:54 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "" #: pippy_app.py:111 msgid "Actions" msgstr "" #: pippy_app.py:138 pippy_app.py:141 msgid "Run!" msgstr "Kjør!" #: pippy_app.py:139 msgid "r" msgstr "" #: pippy_app.py:152 pippy_app.py:158 msgid "Stop" msgstr "Stans" #: pippy_app.py:153 msgid "s" msgstr "" #: pippy_app.py:167 pippy_app.py:173 #, fuzzy msgid "Clear" msgstr "Tøm" #: pippy_app.py:168 msgid "c" msgstr "" #: pippy_app.py:197 msgid "Examples" msgstr "Eksempler" #: pippy_app.py:229 msgid "My examples" msgstr "" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "%s aktivitet" #: pippy_app.py:438 #, fuzzy msgid "Save as Activity Error" msgstr "Lagre som aktivitetsfeil" #: pippy_app.py:439 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Vennligst gi aktiviteten din et meningsfylt navn før du prøver å lagre det " "som en aktivitet." #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "Ok" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "Lager aktivitetspakke..." #: pippy_app.py:479 msgid "Pippy Activity" msgstr "" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "" #: pippy_app.py:484 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Vennligst gi aktiviteten din et meningsfylt navn før du prøver å lagre det " "som en aktivitet." #: pippy_app.py:492 msgid "Creating example..." msgstr "" #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "" #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "Aktivitet lagret til dagbok." #, fuzzy #~ msgid "As Pippy Document" #~ msgstr "Som Pippy-dokument" #, fuzzy #~ msgid "As Activity Bundle" #~ msgstr "Som aktivitetspakke" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Vennligst installer TamTamEdit sitt lydbibliotek." Pippy-71/po/ne.po000066400000000000000000000153751311421132100137640ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:41+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: ne\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "पिप्पी" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s श्रोत" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "ताम्ताम्सम्पादन ध्वनि पुस्तकालयमा भेतिएन । ताम्ताम्सम्पादन इ‍‍‍न्स्तल " "गर्नुभयो ?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "सम्पादन" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "चलाउ!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "रोक" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "सफा गर" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "मेरो उदाहरणहरु" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s क्रियाकलाप" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "क्रियाकलाप त्रुटिको रुपमा बचत गर" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "क्रियाकलापको रुपमा बचत गर्नु अघि कृपया आफ्नो क्रियाकलापलाई उचित नाम देऊ।" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "हुन्छ" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "क्रियाकलाप बंडल बनाउँदै..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "पिप्पी क्रियाकलाप" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "उदाहरण त्रुटि भनेर सेभ गर" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "कृपया तिम्रो क्रियाकलापलाई उदाहरणमा सेभ गर्नु अघि त्यसलाई उचित नाम देऊ ।" #: pippy_app.py:921 msgid "Creating example..." msgstr "उदाहरण सिर्जना गरिदै..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "उदाहरण चेतावनी भनेर सेभ गर" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "यो उदाहरण पहिल्यै रहिआएको छ। के तिमी यसलाई अधिलेखन गर्न चाहन्छौ?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "उदाहरण भनेर सेभ भयो ।" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "क्रियाकलाप खातामा बचत भयो।" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "रोकिएको छ" Pippy-71/po/nl.po000066400000000000000000000161201311421132100137600ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2017-03-27 15:50+0000\n" "Last-Translator: whe \n" "Language-Team: LANGUAGE \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1490629832.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" "Op zoek naar programmeurs! Hier kun je voorbeelden gebruiken on de taal te " "leren die je computer begrijpt, genaamd \"Python.\"" #: filedialog.py:79 msgid "Choose an example to open" msgstr "Kies een te openen voorbeeld" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "Deelnemen aan een activiteit..." #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "Wacht op de verbinding..." #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "Doorgaan met gedeelde activiteit..." #: toolbars.py:42 msgid "Zoom in" msgstr "Zoom in" #: toolbars.py:48 msgid "Zoom out" msgstr "Zoom uit" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Bron" #: icondialog.py:116 msgid "Select an icon" msgstr "Selecteer een icon" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "Nieuw Bronbestand %d" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Kan TamTamEdit geluidsbibliotheek niet vinden. Heb je TamTamEdit " "geïnstalleerd?" #: pippy_app.py:97 msgid "graphics" msgstr "grafisch" #: pippy_app.py:97 msgid "math" msgstr "wiskunde" #: pippy_app.py:97 msgid "python" msgstr "python" #: pippy_app.py:97 msgid "sound" msgstr "geluid" #: pippy_app.py:98 msgid "string" msgstr "snaar" #: pippy_app.py:98 msgid "tutorials" msgstr "oefeningen" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "Importeer Python bestand in nieuwe tab" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "Uitvoer als Pippy document" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "Bewaar dit bestand in de Pippy bibliotheek" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "Uitvoer als nieuw Pippy voorbeeld" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "Maak een Sugar activiteit bundel" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "Exporteer als een distutils package" #: pippy_app.py:228 msgid "Edit" msgstr "Bewerken" #: pippy_app.py:242 msgid "View" msgstr "Bekijk" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "Toon uitvoerpaneel" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Uitvoeren!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Stop" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Wissen" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "Open een voorbeeld" #: pippy_app.py:389 msgid "My examples" msgstr "Mijn voorbeelden" #: pippy_app.py:496 msgid "Hide output panel" msgstr "Verberg uitvoerpaneel" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Activiteit" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "Python Bestand aan Bibliotheek toegevoegd" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" "Het geselecteerde bestand is aan de bibliotheek toegevoegd. Gebruik \"import " "{importnaam}\" om de bibliotheek te importeren voor gebruik." #: pippy_app.py:719 msgid "Saved" msgstr "Bewaard" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "Het document is in het logboek bewaard." #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "Fout bij importeren Python bestand" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "Het geselecteerde bestand is geen Python bestand." #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "Het geselecteerde bestand is al open" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Fout bij bewaren als Activiteit" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Geef je activiteit een betekenisvolle naam voordat je hem bewaart als " "activiteit." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "Activiteit icon" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "Selecteer een activiteit icon." #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Bezig met activiteit bundel maken..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Pippy Activiteit" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "Bewaar als distutils package fout" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" "Geef je activiteit een zinvolle naam voor het bewaren als een distutils " "package." #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Bewaar als Voorbeeld Fout" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Geef je activiteit een betekenisvolle naam voordat je hem bewaart " "alsvoorbeeld." #: pippy_app.py:921 msgid "Creating example..." msgstr "Voorbeeld aanmaken..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Bewaar als Voorbeeld Waarschuwing" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Dit voorbeeld bestaat al. Wil je het overschrijven?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Bewaard als voorbeeld." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "Fout bij bewaren van activiteit in het logboek." #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Activiteit is bewaard in je dagboek." #: pippy_app.py:1119 msgid "Error" msgstr "Fout" #: pippy_app.py:1120 msgid "Error reading data." msgstr "Fout bij lezen van data." #: pippy_app.py:1448 msgid "Working..." msgstr "Bezig..." #: pippy_app.py:1451 msgid "done!" msgstr "klaar!" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "GEPAUZEERD" Pippy-71/po/pa.po000066400000000000000000000123201311421132100137450ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: pa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/pap.po000066400000000000000000000131241311421132100141300ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2013-07-07 01:09+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: pap\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Fuente" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Edita" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Prosesá!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Stòp" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Aktividat" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Warda komo Eròr Aktividat" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Por fabor, duna bo aktividat un nòmber signifikativo promé ku bo ward'é komo " "un aktividat." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Kreando pakkete di aktividat..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Por fabor, duna bo aktividat un nòmber signifikativo promé ku bo ward'é komo " "un aktividat." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Aktividat ta wardá den bo diario." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Den pausa" Pippy-71/po/pbs.po000066400000000000000000000140331311421132100141340ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-08-29 01:58+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: pbs\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Peppy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format #, python-format, msgid "%s Source" msgstr "%skiñgye'" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Kad-ep makejé ravu se makjaat se vatei' ne ngutajap re Tam TamEdit ¿nduma'ai " "ndukjuat ne ngutajap Tam TamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Malejeiñ" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "¡vipiúp!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Ndama'ai" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Matseiñ'" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Peuk tu'uei tutsjaú" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format #, python-format, msgid "%s Activity" msgstr "%s ndul'ajau" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Makjat ndich'u ne ngul'ajau" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "Vichjaut majau kutap lamejep majau ngunjiu' ne ngul'ajau kjup kikjiat." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Majau" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Manaja vatsjau nda ngul'ajau matseu' makjat..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Ngul'ajau pippy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Makjat k'ua lanu peuk vakja se ndich'u" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "vichjaut majau lamejep ngunjiu pu ngul'ajau kutap statjum kikjiat k'ua lanu " "peuk me'ei matsjau." #: pippy_app.py:921 msgid "Creating example..." msgstr "Mata'au peuk k'ua le'ei lanu peuk mane'ei ma natsjau..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Makjat k'ua lanu sania' maljús" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" "Nanji ndanu peuk me'ei mantsjau limi makjat se kimieng tsukuet ma nad-ets'" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Makjat k'ua lanú peuk me'ei matsjau." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Ngul'ajau makjat pu nguk'uix xiñi'iu me'ets." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "MAMA'AI" Pippy-71/po/pl.po000066400000000000000000000137761311421132100140000ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:46+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" # Źródło czegoś, tak? #: activity.py:65 #, python-format msgid "%s Source" msgstr "Źródło %s" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Nie mogę znaleźć biblioteki dźwięków TamTamEdytora. Czy zainstalowałeś " "TamTamEdytor?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Edytuj" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Uruchom!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Stop" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Wyczyść" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Moje przykłady" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "Czynność %s" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" # kapitalizacja #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Zapisz jako błąd Aktywności" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Proszę nadaj swojej czynności nazwę, która ją dobrze opisuje, zanim " "zapiszesz ją jako czynność." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Tworzę pakiet aktywności..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Aplikacja Pippy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Zapisz jako przykład błędu" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Proszę nadaj swojej aktywności nazwę która ją dobrze opisuje, zanim " "zapiszesz ją jako przykład." #: pippy_app.py:921 msgid "Creating example..." msgstr "Tworzę przykład..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Zapisz jako przykład ostrzeżenia" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Ten przykład już istnieje. Czy chcesz go zmienić?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Zapisane jako przykład." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Aktywność zapisana w dzienniku." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUZA" Pippy-71/po/ps.po000066400000000000000000000135061311421132100137760ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2011-09-17 09:25+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: ps\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: Pootle 2.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "پپي" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s سرچينه" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "سمون" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "وځغلوه!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s چارندتیا" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "ساتل د چارندتیا د تیروتنو په څیر" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "مخکې له دې، چې خپله چارندتیا د یوې چارند په څېر وساتۍ، مهرباني وکړﺉ یو مانا " "لرونکې نوم ورکړﺉ." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "هو" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "د چارندتیا بنډل پنځونه..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "مخکې له دې، چې خپله چارندتیا د یوې چارند په څېر وساتۍ، مهرباني وکړﺉ یو مانا " "لرونکې نوم ورکړﺉ." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "د ورځپاڼې چارندتیا وساتل شوه. " #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ځنډول شوی" Pippy-71/po/pseudo.po000066400000000000000000000031261311421132100146500ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-05-27 00:30-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity.py:26 #, python-format msgid "%s Source" msgstr "" #: activity.py:62 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:67 msgid "Edit" msgstr "" #: library/pippy/game.py:19 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:179 msgid "Please install TamTamEdit's sound library." msgstr "" #: pippy_app.py:61 msgid "As Pippy Document" msgstr "" #: pippy_app.py:66 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:83 msgid "Examples" msgstr "" #: pippy_app.py:152 msgid "_Run!" msgstr "" #: pippy_app.py:252 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:308 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:309 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:311 msgid "Ok" msgstr "" #: pippy_app.py:317 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:376 msgid "Activity saved to journal." msgstr "" Pippy-71/po/pt.po000066400000000000000000000135731311421132100140030ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-25 02:11+0200\n" "Last-Translator: Luis \n" "Language-Team: LANGUAGE \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "Código-fonte de %s" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Não foi possível encontrar a biblioteca de som TamTamEdit. Instalaste o " "TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Editar" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Corre!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Parar" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Limpar" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Os meus exemplos" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "Atividade %s" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Erro a Guardar como Atividade" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Por favor dá à tua atividade um nome relevante antes de tentares guardá-la " "como uma atividade." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "A criar pacote de atividade..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Atividade Pippy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Erro a Guardar como Exemplo" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Por favor dá à tua atividade um nome relevante antes de tentares guardá-la " "como um exemplo." #: pippy_app.py:921 msgid "Creating example..." msgstr "A criar exemplo..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Aviso ao Guardar como Exemplo" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Este exemplo já existe. Queres substituí-lo?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Guardado como exemplo." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Atividade guardada no diário." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "EM PAUSA" Pippy-71/po/pt_BR.po000066400000000000000000000136361311421132100143660ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2015-01-30 16:57+0000\n" "Last-Translator: Felipe \n" "Language-Team: LANGUAGE \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: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1422637042.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "Fonte de %s" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Não foi possível encontrar a biblioteca de som TamTamEdit. Você já instalou " "o TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Editar" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Rodar!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Parar" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Limpar" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Meus exemplos" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "Atividade %s" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Salvar como Erro de Atividade" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Por favor dê à sua atividade um nome único antes de tentar salvá-la como uma " "atividade." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Confirma" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Criando pacote de atividade..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Atividade Pippy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Salvar como Erro de Exemplo" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Por favor dê à sua atividade um nome significativo antes de tentar salvá-la " "como um exemplo." #: pippy_app.py:921 msgid "Creating example..." msgstr "Criando exemplo..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Avisar ao gravar como exemplo" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Este exemplo já existe. Você quer sobrescrevê-lo?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Salvo como exemplo" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Atividade salva no diário." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUSADO" Pippy-71/po/quz.po000066400000000000000000000150461311421132100141740ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-07-16 01:28+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: quz\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 % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" "X-Generator: Pootle 2.0.5\n" # "Peppy" #: activity/activity.info:2 msgid "Pippy" msgstr "Amarucha" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" # "%s Fuente" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Código fuente nisqa" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" # "No se pudo encontrar la librería de audio de la Actividad TamTamEdit. ¿Ha " # "instalado la Actividad TamTamEdit?" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Actividad TamTamEdit sutiyuqpiqa manam maypin uyarinakuna kasqantaqa " "tarikunchu. Churarankichu chay Actividad TamTamEdit nisqata?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" # "Editar" #: pippy_app.py:228 msgid "Edit" msgstr "Allinchay" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" # "¡_Empieza!" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Qallariy!" # "r" #: pippy_app.py:266 msgid "r" msgstr "r" # "_Parar" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Sayachiy" # "s" #: pippy_app.py:282 msgid "s" msgstr "s" # "_Limpiar" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Pichay" # "c" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Qhawarichisqaykuna" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" # "%s Actividad" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Ruwana" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" # "Guardar como error de la Actividad" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Ruwanap pantaynintahina waqaychay" # "Por favor de a su actividad un nombre con significado antes de intentar " # "guardarlo como una actividad." #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "Ruwanaykita manaraq waqaychaspaqa, allin sutitaraq churay." # "Bien" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Chaskiy" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" # "Creando una actividad empaquetada..." #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Q'ipichasqa ruwana kamarikuchkan..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Amarucha Ruwana" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Pantay qhawarichina hinata waqaychay" # "Por favor de a su actividad un nombre con significado antes de intentar " # "guardarlo como una actividad." #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "Ruwanaykita manaraq waqaychaspaqa, allin sutiwanraq churay." #: pippy_app.py:921 msgid "Creating example..." msgstr "Qhawarichinam kamarikuchkan..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Qhawarichina hinata waqaychay" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Kay qhawarichinaqa kanña. Kay pataman qillqayta munankichu?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Qhawarichinata waqaychay." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" # "Actividad guardada en el diario." #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Ruwanaqa p'anqapim waqaycharikun." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" # "PAUSADO" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "SAYARICHISQA" Pippy-71/po/ro.po000066400000000000000000000132301311421132100137660ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:48+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "Sursa %s" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Pornește!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Oprește" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Șterge" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "Activitatea %s" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Salvează ca eroare de activitate" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Înainte de a încerca să salvaţi ca activitate daţi un nume sugestiv " "activităţii voastre." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Se crează pachetul activităţii..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Înainte de a încerca să salvaţi ca activitate daţi un nume sugestiv " "activităţii voastre." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Activitate salvată în jurnal." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUZĂ" Pippy-71/po/ru.po000066400000000000000000000147761311421132100140140ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2016-04-21 01:31+0000\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1461202318.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Питон Пиппи" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Источник" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Невозможно найти звуковую библиотеку TamTamEdit. Вы установили TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Редактировать" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Пуск!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Стоп" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Очистить" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Мои образцы" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format #, python-format, fuzzy msgid "%s Activity" msgstr "%s Активность" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Сохранить как Ошибку Упражнения" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Пожалуйста дайте своему упражнению разумное название прежде чем пытаться " "сохранить его как упражнение" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ок" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Создается упражнение..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Упражнение Пиппи" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Сохранить как Образец Ошибки" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Пожалуйста дайте своему упражнению разумное название прежде чем пытаться " "сохранить его как упражнение." #: pippy_app.py:921 msgid "Creating example..." msgstr "Создается образец..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Сохранить Как Предупреждение Образца" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Этот образец уже существует. Заменить?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Сохранено как образец." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Упражнение сохранено в журнале." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ПАУЗА" Pippy-71/po/rw.po000066400000000000000000000133041311421132100140000ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:33+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: rw\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Isooko" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Hindura" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Gukoresha!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Guhagarara" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Gusiba" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 #, fuzzy msgid "My examples" msgstr "Ingero zange" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Igikorwa" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Bika nkaho ari Ikosa ry`Igikorwa" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Banza utange izina risobanutse ku gikorwa cyawe mbere yo kugerageza kubika " "nk'igikorwa." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Rema ihuriro ry'ibikorwa..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Banza utange izina risobanutse ku gikorwa cyawe mbere yo kugerageza kubika " "nk'igikorwa." #: pippy_app.py:921 #, fuzzy msgid "Creating example..." msgstr "Kora urugero..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 #, fuzzy msgid "Saved as example." msgstr "Byabitswe nkurugero." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Igikorwa kibitswe mu kinyamakuru." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Bihagaritswe by'akanya gato" Pippy-71/po/sd.po000066400000000000000000000123231311421132100137560ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: sd\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.1.1rc4\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/si.po000066400000000000000000000144301311421132100137640ustar00rootroot00000000000000# translation of pippy-activity.po to Sinhalese # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. msgid "" msgstr "" "Project-Id-Version: pippy-activity\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:52+0200\n" "Last-Translator: Chris \n" "Language-Team: Sinhalese \n" "Language: si\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "පිපී" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s මූලය" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "TamTamEdit ශබ්ද පුස්තකාලය සොයාගැනීමට නොහැක. ඔබ TamTamEdit ස්ථාපනය කලාද?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "සකසන්න" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "දුවන්න!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "නවත්වන්න" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s ක්‍රියාකාරකම" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "ක්‍රියාකාරකම් දෝෂයක් ලෙස සුරකින්න" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "ක්‍රියාකාරකමක් ලෙස සුරකීමට පෙර කරුණාකර ඔබගේ ක්‍රියාකාරකමට අර්ථවත් නමක් දෙන්න." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "හරි" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "ක්‍රියාකාරකම් පොදියක් සාදයි..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "ක්‍රියාකාරකමක් ලෙස සුරකීමට පෙර කරුණාකර ඔබගේ ක්‍රියාකාරකමට අර්ථවත් නමක් දෙන්න." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "ක්‍රියාකාරකම ජ'නලයට සුරකින ලදි." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "විරාමයක් ගෙන ඇත" Pippy-71/po/sk.po000066400000000000000000000131541311421132100137700ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:50+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Zdroj" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Upraviť" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Spustiť!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Vyčistiť" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format #, fuzzy msgid "%s Activity" msgstr "%s Aktivity" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Uložiť ako chybu Aktivity" #: pippy_app.py:768 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Uveďte, prosím, zmysluplný názov vašej činnosti, predtým, než ju uložíte." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 #, fuzzy msgid "Creating activity bundle..." msgstr "Vytváram balík Activity..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Uveďte, prosím, zmysluplný názov vašej činnosti, predtým, než ju uložíte." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Aktivita uložená do denníka." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Pauza" Pippy-71/po/sl.po000066400000000000000000000136111311421132100137670ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:57+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " "n%100==4 ? 2 : 3);\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Izvora" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Zvočne knjižnice TamTamEdit ni mogoče najti. Ali je program TamTamEdit " "ustrezno nameščen?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Uredi" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Zaženi!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Zaustavi" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Počisti" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Moji primeri" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s Aktivnosti" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Shrani kot napako aktvinosti" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Prosim daj tvoji aktivnosti primerno ime, preden jo poskušaš shraniti kot " "aktivnost." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "V redu" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Ustvarjam paket aktivnosti..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Dejavnost Pippy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Shrani kot primer napake" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "Dejavnost je kot primer treba pred shranjevanjem pomensko poimenovati." #: pippy_app.py:921 msgid "Creating example..." msgstr "Ustvarjanje primera..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Shrani kot primer opozorila" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Primer že obstaja. Ali ga želite prepisati?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Shranjeno kot primer." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Aktivnost je shranjena v beležko." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "USTAVLJENO" Pippy-71/po/sq.po000066400000000000000000000137221311421132100137770ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2016-10-26 18:41+0000\n" "Last-Translator: Besnik_b \n" "Language-Team: LANGUAGE \n" "Language: sq\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: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1477507308.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pipi" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "Burim %s" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "S’gjendet dot libraria e tingujve TamTamEdit. E keni instaluar TamTamEdit-in?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Përpunojeni" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Xhiroje!" #: pippy_app.py:266 msgid "r" msgstr "x" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Ndale" #: pippy_app.py:282 msgid "s" msgstr "r" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Pastroje" #: pippy_app.py:298 msgid "c" msgstr "k" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Shembujt e mi" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "Veprimtaria %s" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Ruaje si Gabim Veprimtarie" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Ju lutemi, përpara se të provoni ta ruani si një veprimtari, jepini " "veprimtarisë suaj një emër që ka kuptim." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Po krijohet grup veprimtarish…" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Veprimtaria Pipi" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Ruaje si Gabim Shembulli" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Ju lutemi, përpara se të provoni ta ruani si një shembull, jepini " "veprimtarisë suaj një emër që ka kuptim." #: pippy_app.py:921 msgid "Creating example..." msgstr "Po krijohet shembull…" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Ruaje si Paralajmërim Shembulli" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Ka tashmë një shembull të tillë. Doni të mbishkruhet?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "U ruajt si shembull." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Veprimtaria u ruajt në ditar." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "E PUSHUAR" Pippy-71/po/sr.po000066400000000000000000000147001311421132100137750ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:48+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Пипи" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s извор" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Не могу да пронађем ТамТамЕдит звучну библиотеку. Да ли сте је инсталирали?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Уреди" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Покрени!" #: pippy_app.py:266 msgid "r" msgstr "р" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Заустави" #: pippy_app.py:282 msgid "s" msgstr "с" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Очисти" #: pippy_app.py:298 msgid "c" msgstr "ц" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Моји примери" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s активност" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Сачувај као грешку активности" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Молим дајте вашој активности неки препознатљив назив пре него што покушате " "да је сачувате као активност." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "У реду" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Правим скуп активности..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Активности Пипија" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Сачувај као грешку примера" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Молим дајте вашој активности неки препознатљив назив пре него што покушате " "да је сачувате као пример." #: pippy_app.py:921 msgid "Creating example..." msgstr "Правим пример..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Сачувај као упозорење примера" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Овај пример већ постоји. Да ли желите да га замените?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Сачувано као пример." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Активност је сачувана у дневник." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ПАУЗИРАНО" Pippy-71/po/sv.po000066400000000000000000000157741311421132100140150ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2017-03-29 11:24+0000\n" "Last-Translator: Anders \n" "Language-Team: LANGUAGE \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1490786653.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" "Söker efter programmerare! Här kan du använda exempel för att börja lära dig " "språket \"Python\" som din dator förstår." #: filedialog.py:79 msgid "Choose an example to open" msgstr "Välj ett exempel att öppna" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "Går med i aktivitet..." #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "Vänta på anslutningen..." #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "Återupptar delad aktivitet..." #: toolbars.py:42 msgid "Zoom in" msgstr "Zooma in" #: toolbars.py:48 msgid "Zoom out" msgstr "Zooma ut" #: activity.py:65 #, python-format msgid "%s Source" msgstr "Källkod för %s" #: icondialog.py:116 msgid "Select an icon" msgstr "Välj en ikon" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "Ny källfil %d" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "Kan inte hitta TamTamEdit-ljudbibliotek. Har du installerat TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "grafik" #: pippy_app.py:97 msgid "math" msgstr "matematik" #: pippy_app.py:97 msgid "python" msgstr "python" #: pippy_app.py:97 msgid "sound" msgstr "ljud" #: pippy_app.py:98 msgid "string" msgstr "sträng" #: pippy_app.py:98 msgid "tutorials" msgstr "guider" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "Importera Python-fil till ny flik" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "Exportera som Pippy-dokument" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "Spara denna fil till Pippy-biblioteket" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "Exportera som nytt Pippy-exempel" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "Skapa ett Sugar-aktivitetspaket" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "Exportera som ett distutils-paket" #: pippy_app.py:228 msgid "Edit" msgstr "Redigera" #: pippy_app.py:242 msgid "View" msgstr "Visa" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "Visa utmatningspanel" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Kör!" #: pippy_app.py:266 msgid "r" msgstr "k" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Stoppa" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Rensa" #: pippy_app.py:298 msgid "c" msgstr "r" #: pippy_app.py:314 msgid "Open an example" msgstr "Öppna ett exempel" #: pippy_app.py:389 msgid "My examples" msgstr "Mina exempel" #: pippy_app.py:496 msgid "Hide output panel" msgstr "Dölj utmatningspanel" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s-aktivitet" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "Python-fil tillagd till bibliotek" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" "Filen som du valde har lagts till i biblioteket. använd \"import {importnamn}" "\" för att importera biblioteket för användning." #: pippy_app.py:719 msgid "Saved" msgstr "Sparat" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "Dokumentet har sparats till dagboken." #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "Fel vid import av Python-fil" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "Filen som du valt är inte en Python-fil." #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "Filen som du valt är redan öppen" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Spara som aktivitetsfel" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Ge din aktivitet ett betydelsefullt namn innan du försöker spara den som en " "aktivitet." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "Aktivitetsikon" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "Välj en aktivitetsikon." #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Skapar en aktivitet..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Pippy-aktivitet" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "Fel vid sparande som distutils-paket" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" "Ge din aktivitet ett betydelsefullt namn innan du försöker spara den som ett " "distutils-paket." #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Fel vid sparande som exempel" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Ge din aktivitet ett betydelsefullt namn innan du försöker spara den som ett " "exempel." #: pippy_app.py:921 msgid "Creating example..." msgstr "Skapar exempel..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Spara som exempel-varning" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Detta exempel finns redan. Vill du skriva över det?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Sparad som exempel." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "Fel då aktivitet skulle sparas i dagboken." #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Aktiviteten har sparats i dagboken." #: pippy_app.py:1119 msgid "Error" msgstr "Fel" #: pippy_app.py:1120 msgid "Error reading data." msgstr "Fel vid läsning av data." #: pippy_app.py:1448 msgid "Working..." msgstr "Arbetar..." #: pippy_app.py:1451 msgid "done!" msgstr "färdig!" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUSAD" Pippy-71/po/sw.po000066400000000000000000000123731311421132100140060ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2011-03-20 05:17+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: sw\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: Pootle 2.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Hariri" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Sawa" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/ta.po000066400000000000000000000156621311421132100137650ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 23:05+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: ta\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "பிப்பி" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s வளம்" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "ஒலிக்கான TamTamEdit library காணவில்லை. TamTamEdit யை நிறுவி உள்ளீர்களா?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "திருத்துக" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "ஓடு!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "நிறுத்து" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "நீக்கு" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "என்னுடைய உதாரணங்கள்" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s செயற்பாடு" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "செயற்பாட்டு தவறை மாற்றிசேமிக்கவும்" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "தயவுசெய்து உங்கள்செயற்பாட்டிற்கு அர்த்தமுள்ளபெயரை வழங்கியபின்னர் முயற்சித்து " "அச்செயற்பாட்டை சேமிக்க" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "சரி" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "ஆக்கபூர்வ செயற்பாட்டுத்தொகுதி" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "பிப்பியின் செயற்பாடு" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "உதாரண தவறாக சேமி" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "தயவுசெய்து உங்கள்செயற்பாட்டிற்கு அர்த்தமுள்ளபெயரை வழங்கியபின்னர் முயற்சித்து " "அச்செயற்பாட்டை சேமிக்க" #: pippy_app.py:921 msgid "Creating example..." msgstr "உதாரணங்கள் உருவாக்கம்..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "எச்சரிக்கான உதாரணமாக சேமி" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "இந்த உதாரணம் ஏற்கனவேயுள்ளது. உங்களுக்கு மீண்டும் மாற்றி எழுத வேண்டுமா?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "உதாரணமாக சேமி." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "செயற்பாட்டைநாட்குறிப்பேட்டில்சேமி" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "இடைநிறுத்து" Pippy-71/po/te.po000066400000000000000000000136311311421132100137630ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 23:01+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: te\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "పిప్పీ" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s మూలం" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "కూర్చు" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "నడుపు !" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s వ్యాపకం" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "వ్యాపకంలో పొరబాటుగా బద్రపరచు" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "మీ వ్యాపకాన్ని దాచేమొందు దానికి ఒక అర్దవంతమైన పేరుఇవ్వండి." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "సరి" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "వ్యపకాల కట్టని తయారు చేస్తున్నా" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "మీ వ్యాపకాన్ని దాచేమొందు దానికి ఒక అర్దవంతమైన పేరుఇవ్వండి." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "వ్యపకాన్ని పద్దులో దాచా" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ఆగినది" Pippy-71/po/th.po000066400000000000000000000147231311421132100137710ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:53+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: th\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Source" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "ไม่พบ ไลบารี่เสียงของ TamTamEdit คุณได้ติดตั้ง TamTamEdit แล้วหรือยัง?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "แก้ไข" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "รัน!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "หยุด" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "ล้าง" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "ตัวอย่างของฉัน" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "กิจกรรม %sx" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "บันทึกเป็นข้อผิดพลาดกิจกรรม" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "โปรดใส่ชื่อกิจกรรมก่อนจะบันทึกเป็นกิจกรรม" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "กำลังสร้างชุดกิจกรรม..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "กิจกรรม Pippy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "บันทึกเป็นตัวอย่างของ error" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "โปรดใส่ชื่อกิจกรรมก่อนจะบันทึกเป็นตัวอย่าง" #: pippy_app.py:921 msgid "Creating example..." msgstr "สร้างตัวอย่าง..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "บันทึกเป็นตัวอย่างสำหรับเตือน" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "ตัวอย่างนี้มีอยู่แล้ว คุณต้องการจะบันทึกซ้ำหรือไม่" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "เก็บเป็นตัวอย่าง" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "บันทึกกิจกรรมลงบันทึกประจำวันแล้ว" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "หยุดการทำงาน" Pippy-71/po/to.po000066400000000000000000000133021311421132100137700ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:53+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: to\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 #, fuzzy msgid "Pippy" msgstr "Pipi" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Ma'u'anga" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "'Oku 'ikai ke ma'u e Tam TamEdit ia 'ihe laipeli ongo. Na'ake fokotu'u e Tam " "TamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "'Etita" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Lele!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Ta'ohi" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Fakama'a" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s 'Ekitiviti" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Seivi koe 'Ekitiviti Fehalaaki" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Kataki 'ai ha hingoa mahuinga ki ho'o 'ekitivti kimu'a pea ke toki feinga ke " "seivi ia koe 'ekitiviti." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Ok" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Ko hono fokotu'u ha falukunga 'ekitiviti..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Kataki 'ai ha hingoa mahuinga ki ho'o 'ekitivti kimu'a pea ke toki feinga ke " "seivi ia koe 'ekitiviti." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Kuo Seivi'i e 'Ekitiviti ki he Senolo." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "POOSI" Pippy-71/po/tr.po000066400000000000000000000131431311421132100137760ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 23:06+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s kaynak" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "düzenleyiniz." #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 #, fuzzy msgid "Run!" msgstr "çalıştırınız!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Dur" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Temizle" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s aktivite" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "aktivite hatası olarak kaydediniz." #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "lütfen aktivitenize anlamlı bir isim verip öyle aktivite olarak kaydediniz." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "tamam" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "aktivite kümesi oluşturuluyor." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "lütfen aktivitenize anlamlı bir isim verip öyle aktivite olarak kaydediniz." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "aktivite günlüğe kaydedilmiştir." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Ara" Pippy-71/po/tvl.po000066400000000000000000000060111311421132100141520ustar00rootroot00000000000000# 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. # 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. # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-06-19 00:34-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.3.0\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity.py:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:54 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "" #: pippy_app.py:111 msgid "Actions" msgstr "" #: pippy_app.py:138 pippy_app.py:141 msgid "Run!" msgstr "" #: pippy_app.py:139 msgid "r" msgstr "" #: pippy_app.py:152 pippy_app.py:158 msgid "Stop" msgstr "" #: pippy_app.py:153 msgid "s" msgstr "" #: pippy_app.py:167 pippy_app.py:173 msgid "Clear" msgstr "" #: pippy_app.py:168 msgid "c" msgstr "" #: pippy_app.py:197 msgid "Examples" msgstr "" #: pippy_app.py:229 msgid "My examples" msgstr "" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:439 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:479 msgid "Pippy Activity" msgstr "" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "" #: pippy_app.py:484 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:492 msgid "Creating example..." msgstr "" #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "" #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "" Pippy-71/po/tzm.po000066400000000000000000000124421311421132100141640ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 23:03+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: tzm\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "ⴱⴷⴷⴻⵍ" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "ⴱⴷ" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "ⵎⵃⵓ" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s ⴰⵎⵓⵙⵙⵓ" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/tzo.po000066400000000000000000000123211311421132100141620ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: tzo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.7.0\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/ug.po000066400000000000000000000124221311421132100137630ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-02-27 06:38+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: ug\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "مەنبە %s" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 #, fuzzy msgid "Edit" msgstr "تەھرىرلەش" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-71/po/uk.po000066400000000000000000000213431311421132100137710ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2017-04-07 13:01+0000\n" "Last-Translator: yurchor \n" "Language-Team: LANGUAGE \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1491570088.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" "Шукаємо програмістів! Тут ви можете скористатися прикладами для того, щоб " "почати вчити мову, яку розуміє ваш комп’ютер і яка називається «Python»." #: filedialog.py:79 msgid "Choose an example to open" msgstr "Виберіть приклад, який слід відкрити" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "Долучаємося до дії…" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "Будь ласка, зачекайте, доки буде встановлено з’єднання…" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "Відновлюємо спільні дії…" #: toolbars.py:42 msgid "Zoom in" msgstr "Збільшити" #: toolbars.py:48 msgid "Zoom out" msgstr "Зменшити" #: activity.py:65 #, python-format msgid "%s Source" msgstr "Код %s" #: icondialog.py:116 msgid "Select an icon" msgstr "Вибрати піктограму" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "Новий файл коду %d" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Не вдалося знайти бібліотеки для роботи зі звуком TamTamEdit. Чи встановлено " "TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "графіка" #: pippy_app.py:97 msgid "math" msgstr "математика" #: pippy_app.py:97 msgid "python" msgstr "python" #: pippy_app.py:97 msgid "sound" msgstr "звук" #: pippy_app.py:98 msgid "string" msgstr "рядок" #: pippy_app.py:98 msgid "tutorials" msgstr "підручники" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "Імпортувати файл Python до нової вкладки" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "Експортувати як документ Pippy" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "Зберегти цей файл до бібліотеки Pippy" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "Експортувати як новий приклад Pippy" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "Створити пакунок дії Sugar" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "Експортувати як пакунок distutils" #: pippy_app.py:228 msgid "Edit" msgstr "Зміни" #: pippy_app.py:242 msgid "View" msgstr "Перегляд" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "Показати панель виведення" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Виконати!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Зупинити" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Спорожнити" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "Відкрити приклад" #: pippy_app.py:389 msgid "My examples" msgstr "Мої приклади" #: pippy_app.py:496 msgid "Hide output panel" msgstr "Приховати панель виведення" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "Дія %s" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "До бібліотеки додано файл Python" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" "Позначений вами файл було додано до бібліотеки. Скористайтеся командою «" "import {importname}», щоб імпортувати бібліотеку для використання." #: pippy_app.py:719 msgid "Saved" msgstr "Збережено" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "Документ було збережено до журналу." #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "Помилка під час спроби імпортувати файл Python" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "Вибраний вами файл не є файлом коду Python." #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "Вибраний вами файл вже відкрито" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Зберегти як помилку дії" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Будь ласка, надайте цій дії змістовної назви, перш ніж намагатися зберегти " "її як дію." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Гаразд" #: pippy_app.py:779 msgid "Activity icon" msgstr "Піктограма дії" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "Будь ласка, виберіть піктограму дії." #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Створюємо пакунок дії…" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Дія Pippy" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "Помилка під час спроби зберегти як пакунок distutils" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" "Будь ласка, надайте цій дії змістовної назви, перш ніж намагатися зберегти " "її як пакунок distutils." #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Помилка під час збереження прикладу" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Будь ласка, надайте цій дії змістовної назви, перш ніж намагатися зберегти " "її як приклад." #: pippy_app.py:921 msgid "Creating example..." msgstr "Створюємо приклад…" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Попередження під час збереження прикладу" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Цей приклад вже існує. Ви дійсно хочете перезаписати його?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Збережено як приклад." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "Помилка під час спроби зберегти дію до журналу." #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Дію збережено до журналу." #: pippy_app.py:1119 msgid "Error" msgstr "Помилка" #: pippy_app.py:1120 msgid "Error reading data." msgstr "Помилка під час спроби прочитати дані." #: pippy_app.py:1448 msgid "Working..." msgstr "Працюємо…" #: pippy_app.py:1451 msgid "done!" msgstr "Готово!" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ПРИЗУПИНЕНО" Pippy-71/po/ur.po000066400000000000000000000134121311421132100137760ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 22:54+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: ur\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: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "پپی" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s ذريعہ" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "تبديل کريں" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "چلاو!" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "روک دو" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s سرگرمی" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "سرگرمی غلطی کے طور پر محفوظ کریں" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "اپنی سرگرمی کو محفوظ کرنے سے پہلے براہ مہربانی اسے کوئی بامعانی نام دیں۔" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "ٹھیک ہے" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "سرگرمی کا بنڈل بنا رہا ہے..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "اپنی سرگرمی کو محفوظ کرنے سے پہلے براہ مہربانی اسے کوئی بامعانی نام دیں۔" #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "سرگرمی جریدے میں محفوظ ہو گئی۔" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "رکا ہوا" Pippy-71/po/vi.po000066400000000000000000000132421311421132100137670ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 23:02+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.0.5\n" # Tên: không nên dịch #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "Nguồn %s" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Sửa" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Chạy !" #: pippy_app.py:266 msgid "r" msgstr "" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Dừng" #: pippy_app.py:282 msgid "s" msgstr "" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "" #: pippy_app.py:298 msgid "c" msgstr "" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "Hoạt động %s" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Lưu dạng Lỗi hoạt động" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Hãy đặt một tên có ý nghĩa cho hoạt động trước khi thử lưu nó dạng hoạt động." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "OK" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Đang tạo bộ hoạt động..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "" #: pippy_app.py:912 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Hãy đặt một tên có ý nghĩa cho hoạt động trước khi thử lưu nó dạng hoạt động." #: pippy_app.py:921 msgid "Creating example..." msgstr "" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Hoạt động đã được lưu vào nhật ký." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "BỊ TẠM DỪNG" Pippy-71/po/wa.po000066400000000000000000000060141311421132100137570ustar00rootroot00000000000000# 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. # 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. # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-06-19 00:34-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.1.1rc4\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity.py:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:54 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "" #: pippy_app.py:111 msgid "Actions" msgstr "" #: pippy_app.py:138 pippy_app.py:141 msgid "Run!" msgstr "" #: pippy_app.py:139 msgid "r" msgstr "" #: pippy_app.py:152 pippy_app.py:158 msgid "Stop" msgstr "" #: pippy_app.py:153 msgid "s" msgstr "" #: pippy_app.py:167 pippy_app.py:173 msgid "Clear" msgstr "" #: pippy_app.py:168 msgid "c" msgstr "" #: pippy_app.py:197 msgid "Examples" msgstr "" #: pippy_app.py:229 msgid "My examples" msgstr "" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:439 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:479 msgid "Pippy Activity" msgstr "" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "" #: pippy_app.py:484 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: pippy_app.py:492 msgid "Creating example..." msgstr "" #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "" #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "" Pippy-71/po/yo.po000066400000000000000000000137731311421132100140110ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2016-09-23 23:35+0000\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: yo\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: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1474673719.000000\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s Orisun" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "Ko le ri TamTamEdit ohun ìkàwé. Nje o fi sori ẹrọ TamTamEdit?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "Ṣatunkọ" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "Ṣiṣe awọn!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "Duro" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "Parẹ́" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "Mi apeere" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s aṣayan iṣẹ-ṣiṣe" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "Fi bi aṣayan iṣẹ-ṣiṣe aṣiṣe" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Jọwọ fun ṣiṣe kan ti o nilari orukọ ṣaaju ki o to pinnu lati fi o bi ohun-" "ṣiṣe." #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "Dara" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "Ṣiṣẹda aṣayan iṣẹ-ṣiṣe lapapo..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "Pippy aṣayan iṣẹ-ṣiṣe" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "Fi bi Apere aṣiṣe" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Jọwọ fun ṣiṣe kan ti o nilari orukọ ṣaaju ki o to pinnu lati fi o bi ohun " "apẹẹrẹ." #: pippy_app.py:921 msgid "Creating example..." msgstr "Ṣiṣẹda apẹẹrẹ..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "Fi bi Apere Ikilọ" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "Yi apẹẹrẹ tẹlẹ wa. Ṣe o fẹ lati ìkọlélórí o?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "Ti o ti fipamọ bi awọn apẹẹrẹ." #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "Aṣayan iṣẹ-ṣiṣe ti o ti fipamọ to akosile." #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Bii" Pippy-71/po/zh_CN.po000066400000000000000000000140141311421132100143500ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-24 01:47+0200\n" "Last-Translator: lite \n" "Language-Team: LANGUAGE \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=1; plural=0;\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "小蟒" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s 源码" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "找不到TamTamEdit声音库,你有安装TamTamEdit吗?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "编辑" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" # literally, "go/begin" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "执行!" #: pippy_app.py:266 msgid "r" msgstr "r" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "停止" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "清除" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "我的示例" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s 活动" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" # This is a bad translation - literally, "mistake in preserving as activity." #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "活动保存错误" # "First give your activity a name, afterwards, save it." #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "在进行储存前,请为活动取一个有意义的名字。" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "确定" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "创建活动套件包中..." #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "小蟒活动" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "保存为范例时出错" # "First give your activity a name, afterwards, save it." #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "在保存为范例前,请为你的活动取一个有意义的名字。" #: pippy_app.py:921 msgid "Creating example..." msgstr "创建范例..." #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "保存为范例时的警告" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "该范例已存在。要覆盖它吗?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "保存为范例。" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" # Using the existing words for "activity" and "journal" here. #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "活动保存到日志。" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" # literally, "suspended." #: library/pippy/game.py:36 msgid "PAUSED" msgstr "暂停" Pippy-71/po/zh_TW.po000066400000000000000000000133631311421132100144100ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-03-24 17:39+1100\n" "PO-Revision-Date: 2012-06-26 20:59+0200\n" "Last-Translator: Chris \n" "Language-Team: LANGUAGE \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "小蟒軟體開發" #: activity/activity.info:3 msgid "" "Searching for programmers! Here you can use examples to begin learning the " "language your computer understands called \"Python.\"" msgstr "" #: filedialog.py:79 msgid "Choose an example to open" msgstr "" #: collabwrapper.py:178 msgid "Joining activity..." msgstr "" #: collabwrapper.py:179 collabwrapper.py:191 msgid "Please wait for the connection..." msgstr "" #: collabwrapper.py:190 msgid "Resuming shared activity..." msgstr "" #: toolbars.py:42 msgid "Zoom in" msgstr "" #: toolbars.py:48 msgid "Zoom out" msgstr "" #: activity.py:65 #, python-format msgid "%s Source" msgstr "%s 原始碼" #: icondialog.py:116 msgid "Select an icon" msgstr "" #: notebook.py:219 #, python-format msgid "New Source File %d" msgstr "" #: sound_check.py:27 library/pippy/sound.py:41 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "找不到TamTamEdit聲音庫,安裝TamTamEdit了嗎?" #: pippy_app.py:97 msgid "graphics" msgstr "" #: pippy_app.py:97 msgid "math" msgstr "" #: pippy_app.py:97 msgid "python" msgstr "" #: pippy_app.py:97 msgid "sound" msgstr "" #: pippy_app.py:98 msgid "string" msgstr "" #: pippy_app.py:98 msgid "tutorials" msgstr "" #: pippy_app.py:185 msgid "Import Python file to new tab" msgstr "" #: pippy_app.py:191 msgid "Export as Pippy document" msgstr "" #: pippy_app.py:197 msgid "Save this file to the Pippy library" msgstr "" #: pippy_app.py:205 msgid "Export as new Pippy example" msgstr "" #: pippy_app.py:211 msgid "Create a Sugar activity bundle" msgstr "" #. TRANS: A distutils package is used to distribute Python modules #: pippy_app.py:218 msgid "Export as a distutils package" msgstr "" #: pippy_app.py:228 msgid "Edit" msgstr "編輯" #: pippy_app.py:242 msgid "View" msgstr "" #: pippy_app.py:252 pippy_app.py:500 msgid "Show output panel" msgstr "" #: pippy_app.py:265 pippy_app.py:268 msgid "Run!" msgstr "執行!" #: pippy_app.py:266 msgid "r" msgstr "F" #: pippy_app.py:281 pippy_app.py:287 msgid "Stop" msgstr "停止" #: pippy_app.py:282 msgid "s" msgstr "s" #: pippy_app.py:297 pippy_app.py:303 msgid "Clear" msgstr "清除" #: pippy_app.py:298 msgid "c" msgstr "c" #: pippy_app.py:314 msgid "Open an example" msgstr "" #: pippy_app.py:389 msgid "My examples" msgstr "我的範例" #: pippy_app.py:496 msgid "Hide output panel" msgstr "" #: pippy_app.py:598 #, python-format msgid "%s Activity" msgstr "%s 活動" #: pippy_app.py:708 msgid "Python File added to Library" msgstr "" #: pippy_app.py:709 #, python-brace-format msgid "" "The file you selected has been added to the library. Use \"import " "{importname}\" to import the library for using." msgstr "" #: pippy_app.py:719 msgid "Saved" msgstr "" #: pippy_app.py:720 msgid "The document has been saved to journal." msgstr "" #: pippy_app.py:734 pippy_app.py:741 msgid "Error importing Python file" msgstr "" #: pippy_app.py:735 msgid "The file you selected is not a Python file." msgstr "" #: pippy_app.py:742 msgid "The file you selected is already open" msgstr "" #: pippy_app.py:767 pippy_app.py:826 msgid "Save as Activity Error" msgstr "儲存為活動時發生錯誤" #: pippy_app.py:768 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "在進行儲存前,請先為你的活動取一個有意義的名字。" #: pippy_app.py:771 pippy_app.py:778 pippy_app.py:873 pippy_app.py:915 msgid "Ok" msgstr "確定" #: pippy_app.py:779 msgid "Activity icon" msgstr "" #: pippy_app.py:780 msgid "Please select an activity icon." msgstr "" #: pippy_app.py:785 pippy_app.py:800 msgid "Creating activity bundle..." msgstr "建立活動套件包中…" #: pippy_app.py:866 pippy_app.py:908 msgid "Pippy Activity" msgstr "小蟒活動" #: pippy_app.py:868 msgid "Save as distutils package error" msgstr "" #: pippy_app.py:869 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an distutils package." msgstr "" #: pippy_app.py:910 msgid "Save as Example Error" msgstr "儲存為錯誤範例" #: pippy_app.py:912 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "在儲存為範例之前,請先為你的活動取一個有意義的名字。" #: pippy_app.py:921 msgid "Creating example..." msgstr "建立範例" #: pippy_app.py:927 msgid "Save as Example Warning" msgstr "儲存為警告範例" #: pippy_app.py:928 msgid "This example already exists. Do you want to overwrite it?" msgstr "這個範例已經存在,覆寫它嗎?" #: pippy_app.py:935 pippy_app.py:993 msgid "Saved as example." msgstr "儲存為範例" #: pippy_app.py:957 msgid "Error saving activity to journal." msgstr "" #: pippy_app.py:977 msgid "Activity saved to journal." msgstr "活動已存入日誌。" #: pippy_app.py:1119 msgid "Error" msgstr "" #: pippy_app.py:1120 msgid "Error reading data." msgstr "" #: pippy_app.py:1448 msgid "Working..." msgstr "" #: pippy_app.py:1451 msgid "done!" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "暫停" Pippy-71/setup.py000077500000000000000000000014741311421132100141140ustar00rootroot00000000000000#!/usr/bin/env python # Copyright (C) 2006, Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from sugar3.activity import bundlebuilder bundlebuilder.start() Pippy-71/sound_check.py000066400000000000000000000041451311421132100152340ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright (C) 2013,14 Walter Bender (walter@sugarlabs.org) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import os from gettext import gettext as _ from sugar3 import env class SoundLibraryNotFoundError(Exception): def __init__(self): Exception.__init__(self, _('Cannot find TamTamEdit sound library.' ' Did you install TamTamEdit?')) def finddir(): paths = ['/usr/share/sugar/activities', env.get_user_activities_path()] paths.append(os.path.join(os.path.expanduser('~'), 'Activities')) sound_candidate_dirs = None for path in paths: if not os.path.exists(path): continue for f in os.listdir(path): if f in ['TamTamMini.activity', 'TamTamJam.activity', 'TamTamEdit.activity', 'TamTamSynthLab.activity', 'MusicKeyboard.activity']: bundle_dir = os.path.join(path, f) tamtam_subdir = str( os.path.join(bundle_dir, 'common', 'Resources', 'Sounds')) sound_candidate_dirs = [ os.path.expandvars('$SUGAR_PATH/activities') + tamtam_subdir, tamtam_subdir ] if sound_candidate_dirs is not None: for directory in sound_candidate_dirs: if os.path.isdir(directory): return directory raise SoundLibraryNotFoundError() Pippy-71/texteditor.py000066400000000000000000000173141311421132100151440ustar00rootroot00000000000000# Copyright (C) 2015, Batchu Venkat Vishal # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import logging from gi.repository import Gtk ''' The texteditor module provides a text editor widget which can be included in any activity and then multiple users can collaborate and edit together in the editor. ''' class CollabTextEditor(Gtk.TextView): ''' A CollabTextEditor widget is a adjustable text editor which can be placed on an activity screen. The `changed` signal is usually emitted when the text in the editor is changed by a user. The `message` signal is usually emitted when another user makes changes in the text editor, so they are reflected in your editor. The widget can be embedded in a window which can be displayed. Example usage: editorinstance = CollabTextEditor(self) scrolled_window.add(editorinstance) scrolled_window.show() ''' def __init__(self, activity, editor_id, collab): Gtk.TextView.__init__(self) self.set_editable(True) self.set_cursor_visible(True) self.set_wrap_mode(Gtk.WrapMode.WORD) self.textbuffer = self.get_buffer() self._collaberizer = TextBufferCollaberizer( self.textbuffer, editor_id, collab) self.textbuffer.set_text("") self.show() class TextBufferCollaberizer(object): def __init__(self, textbuffer, editor_id, collab): self._id = editor_id self._buffer = textbuffer self._callbacks_status = True self.has_initialized = False self._collab = collab self._collab.connect('message', self.__message_cb) self._collab.connect('joined', self.__joined_cb) self._buffer.connect('insert-text', self.__text_buffer_inserted_cb) self._buffer.connect('delete-range', self.__text_buffer_deleted_cb) self._buffer.set_text('') if not self._collab._leader: # We must be joining an activity and just made the buffer self._collab.post(dict( action='init_request', res_id=self._id )) ''' The message callback is called whenever another user edits something in the text editor and the changes are reflected in the editor or when a new buddy joins and we send them the latest version of the text buffer. Args: buddy : another user who sent the message message : updates send over from other users ''' def __message_cb(self, collab, buddy, message): action = message.get('action') if str(message.get('res_id')) != self._id: return if action == 'init_response' or action == 'sync_editors': self.has_initialized = True self._callbacks_status = False self._buffer.set_text(message.get('current_content')) self._callbacks_status = True if action == 'entry_inserted': start_iter = self._buffer.get_iter_at_line_offset( message.get('start_iter_line'), message.get('start_iter_offset')) self._callbacks_status = False self._buffer.insert(start_iter, message.get('new_text')) self._callbacks_status = True if action == 'entry_deleted': start_iter = self._buffer.get_iter_at_line_offset( message.get('start_iter_line'), message.get('start_iter_offset')) end_iter = self._buffer.get_iter_at_line_offset( message.get('end_iter_line'), message.get('end_iter_offset')) self._callbacks_status = False self._buffer.delete(start_iter, end_iter) self._callbacks_status = True if action == 'init_request': text = self._buffer.get_text( self._buffer.get_start_iter(), self._buffer.get_end_iter(), True) self._collab.post(dict( action='init_response', res_id=self._id, current_content=text )) def __joined_cb(self, sender): if self._collab._leader: return self._collab.post(dict( action='init_request', res_id=self._id )) ''' This will send a message to all your buddies to set their editors to sync with the text specified as an argument. Args: text : Text to be set in all the editors ''' def __set_text_synced(self, text): if self._callbacks_status is False: return if self.has_initialized is False: self.has_initialized = True self._callbacks_status = False self._buffer.set_text(text) self._callbacks_status = True self._collab.post(dict(action='sync_editors', res_id=self._id, current_content=text)) ''' The text buffer inserted callback is called whenever text is inserted in the editor, so that other users get updated with these changes. Args: textbuffer (:class:`Gtk.TextBuffer`): text storage widget start (:class:`Gtk.Iterator`): a pointer to the start position ''' def __text_buffer_inserted_cb(self, textbuffer, start, text, length): if self._callbacks_status is False: return if self.has_initialized is False: self.has_initialized = True logging.debug('Text inserted is %s' % (text)) logging.debug('Text has been updated, %s' % (textbuffer.get_text( textbuffer.get_start_iter(), textbuffer.get_end_iter(), True))) self._collab.post(dict(action='entry_inserted', res_id=self._id, start_iter_offset=start.get_line_offset(), start_iter_line=start.get_line(), new_text=text)) ''' The text buffer deleted callback is called whenever any text is removed in the editor, so that other users get updated with these changes. Args: textbuffer (:class:`Gtk.TextBuffer`): text storage widget start (:class:`Gtk.Iterator`): a pointer to the start position end (:class:`Gtk.Iterator`): a pointer to the end position ''' def __text_buffer_deleted_cb(self, textbuffer, start, end): if self._callbacks_status is False: return if self.has_initialized is False: self.has_initialized = True logging.debug('Text deleted is %s' % (textbuffer.get_text(start, end, True))) logging.debug('Text has been updated, %s' % (textbuffer.get_text( textbuffer.get_start_iter(), textbuffer.get_end_iter(), True))) self._collab.post(dict(action='entry_deleted', res_id=self._id, start_iter_offset=start.get_line_offset(), start_iter_line=start.get_line(), end_iter_offset=end.get_line_offset(), end_iter_line=end.get_line())) Pippy-71/toolbars.py000066400000000000000000000042751311421132100146000ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2014 Walter Bender # Copyright (C) 2014 Sai Vineet # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from gi.repository import Gtk from gi.repository import GObject from gettext import gettext as _ from sugar3.graphics.toolbutton import ToolButton from notebook import FONT_CHANGE_STEP, DEFAULT_FONT_SIZE class DevelopViewToolbar(Gtk.Toolbar): __gsignals__ = { 'font-size-changed': (GObject.SIGNAL_RUN_FIRST, None, (int,)), } def __init__(self, _activity): GObject.GObject.__init__(self) self._activity = _activity self.font_size = DEFAULT_FONT_SIZE self.font_plus = ToolButton('zoom-in') self.font_plus.connect('clicked', self._font_size_increase) self.font_plus.set_tooltip(_('Zoom in')) self.insert(self.font_plus, -1) self.font_plus.show() self.font_minus = ToolButton('zoom-out') self.font_minus.connect('clicked', self._font_size_decrease) self.font_minus.set_tooltip(_('Zoom out')) self.insert(self.font_minus, -1) self.font_minus.show() self.show() def set_font_size(self, font_size): self.font_size = font_size self.emit('font-size-changed', self.font_size) def _font_size_increase(self, button): self.font_size += FONT_CHANGE_STEP self.emit('font-size-changed', self.font_size) def _font_size_decrease(self, button): self.font_size -= FONT_CHANGE_STEP self.emit('font-size-changed', self.font_size)