Pippy-46~dfsg/0000755000000000000000000000000011760470375012160 5ustar rootrootPippy-46~dfsg/activity/0000755000000000000000000000000011760470375014014 5ustar rootrootPippy-46~dfsg/activity/activity-default.svg0000644000000000000000000000457411710330413020004 0ustar rootroot ]> Pippy-46~dfsg/activity/activity-icon.svg0000644000000000000000000000256711710330413017310 0ustar rootroot ]> Pippy-46~dfsg/activity/activity.info0000644000000000000000000000034711717500572016524 0ustar rootroot[Activity] name = Pippy bundle_id = org.laptop.Pippy exec = sugar-activity pippy_app.PippyActivity icon = activity-icon activity_version = 46 mime_types = text/x-python, pickle/groupthink-pippy show_launcher = yes license = GPLv2+ Pippy-46~dfsg/port/0000755000000000000000000000000011760470375013144 5ustar rootrootPippy-46~dfsg/port/__init__.py0000644000000000000000000000000011710330413015222 0ustar rootrootPippy-46~dfsg/port/style.py0000644000000000000000000000220511710330413014634 0ustar rootroot# 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 """ GUI look&feel related declarations """ from sugar.graphics import style def font_zoom(size): """ 21 Returns the proper font size for current Sugar environment NOTE: Use this function only if you are targeting activity for XO with 0.82 Sugar and want non-default font sizes, otherwise just do not mention font sizes in your code """ if hasattr(style, '_XO_DPI'): return style.zoom(size) else: return size Pippy-46~dfsg/COPYING0000644000000000000000000004310311710330413013173 0ustar rootroot 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-46~dfsg/activity.py0000755000000000000000000002135311710330413014354 0ustar rootroot#!/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.""" from sugar.activity import activity 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) def _key_press_cb(self, widget, event): import gtk if gtk.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 sugar import profile from sugar.datastore import datastore from sugar.activity.activity \ import get_bundle_name, get_bundle_path from gettext import gettext as _ 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 sugar.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): import gtk import pango import vte from sugar.graphics.toolbutton import ToolButton from gettext import gettext as _ super(VteActivity, self).__init__(handle) toolbox = activity.ActivityToolbox(self) toolbar = toolbox.get_activity_toolbar() self.set_toolbox(toolbox) toolbox.show() # 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 # 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(gtk.gdk.color_parse('#000000'), gtk.gdk.color_parse('#E7E7E7'), []) self._vte.connect('selection-changed', self._on_selection_changed_cb) self._vte.drag_dest_set(gtk.DEST_DEFAULT_ALL, [("text/plain", 0, TARGET_TYPE_TEXT)], gtk.gdk.ACTION_COPY) self._vte.connect('drag_data_received', self._on_drop_cb) # ...and its scrollbar vtebox = gtk.HBox() vtebox.pack_start(self._vte) vtesb = gtk.VScrollbar(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. toolbar.keep.hide() 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 self._pid = self._vte.fork_command( command='/bin/sh', argv=['/bin/sh', '-c', 'python %s/pippy_app.py; sleep 1' % bundle_path], envv=["PYTHONPATH=%s/library" % bundle_path], directory=bundle_path) 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) import gobject 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.""" from sugar.activity import activityfactory from sugar.activity.registry import ActivityInfo from sugar.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-46~dfsg/po/0000755000000000000000000000000011760470375012576 5ustar rootrootPippy-46~dfsg/po/pap.po0000644000000000000000000000540511710330413013701 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2010-02-23 23:37+0200\n" "Last-Translator: \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.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Fuente" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Kopia e teksto selekta na clipboard" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "Edita" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Den pausa" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Komo Dokumento Pippy" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Komo Bónder di Aktividat" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "_Prosesá!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Ehempelnan" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s Aktividad" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "Warda komo Eròr Aktividad" #: pippy_app.py:419 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:422 msgid "Ok" msgstr "Ok" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "Kreando pakkete di aktividad..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "Aktividat ta wardá den bo diario." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Por fabor instala TamTamEdit su sound library." Pippy-46~dfsg/po/ne.po0000644000000000000000000001411611710330413013522 0ustar rootroot# 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: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2011-09-08 11:18+0200\n" "Last-Translator: \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.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "पिप्पी" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "%s श्रोत" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "सेलेक्ट गरिएको पाठलाई क्लिपबोर्डमा प्रतिलिपि बनाऊ" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "सम्पादन" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "पिप्पी डकुमेन्टको रुपमा" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "क्रियाकलाप बंडलको रुपमा" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "पिप्पी उदाहरणको रुपमा" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "कार्यहरु" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr "_चलाउ!" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "r" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "_रोक" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "s" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "_सफा गर" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "c" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "उदाहरणहरु" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "मेरो उदाहरणहरु" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "%s क्रियाकलाप" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "क्रियाकलाप त्रुटिको रुपमा बचत गर" #: /home/rafael/Activities/pippy/pippy_app.py:433 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "क्रियाकलापको रुपमा बचत गर्नु अघि कृपया आफ्नो क्रियाकलापलाई उचित नाम देऊ।" #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "हुन्छ" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "क्रियाकलाप बंडल बनाउँदै..." #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "पिप्पी क्रियाकलाप" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "उदाहरण त्रुटि भनेर सेभ गर" #: /home/rafael/Activities/pippy/pippy_app.py:478 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "कृपया तिम्रो क्रियाकलापलाई उदाहरणमा सेभ गर्नु अघि त्यसलाई उचित नाम देऊ ।" #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "उदाहरण सिर्जना गरिदै.." #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "उदाहरण चेतावनी भनेर सेभ गर" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "यो उदाहरण पहिल्यै रहिआएको छ। के तिमी यसलाई अधिलेखन गर्न चाहन्छौ?" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "उदाहरण भनेर सेभ भयो ।" #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "क्रियाकलाप खातामा बचत भयो।" #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "ताम्ताम्सम्पादन ध्वनि पुस्तकालयमा भेतिएन । ताम्ताम्सम्पादन इ‍‍‍न्स्तल " "गर्नुभयो ?" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "रोकिएको छ" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "कृपया ट्याम्को सम्पादनको आवाज संग्रह ।" #~ msgid "Run!" #~ msgstr "चलाउ!" Pippy-46~dfsg/po/mn.po0000644000000000000000000000733311710330413013535 0ustar rootroot# 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. # 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2011-10-11 18:46+0200\n" "Last-Translator: Cris Anderson \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.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:108 pippy_app.py:113 msgid "Edit" msgstr "Засварлах" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ТҮР ЗОГССОН" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Пиппид тохирох бичвэрээр" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Үйл ажиллагааны бүрдлээр" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "_Гүйцэтгэх!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "_Зогсоох" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "_Арилгах" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Жишээ" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s Үйл ажиллагаа" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "Үйл ажиллагаагаар хадгалхад алдаа гарлаа" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Үйл ажиллагаагаар хадгалахын өмнө өөрийн үйл ажиллагаанд утгатай нэр " "өгөөрэй." #: pippy_app.py:422 msgid "Ok" msgstr "За" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "Үйл ажиллагааны бүрдэл бүтээгдэж байна..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "Үйл ажиллагаа бүртгэлийн дэвтэрт хадгалагдлаа." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "TamTamEdit-ийн дууны архивыг суулгана уу." Pippy-46~dfsg/po/ay.po0000644000000000000000000000443711710330413013536 0ustar rootroot# 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: 2011-03-04 00:46-0500\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:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/zh_TW.po0000644000000000000000000001132211710330413014147 0ustar rootroot# 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: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2011-07-24 18:57+0200\n" "Last-Translator: Kenzen \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" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "小蟒軟體開發" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "%s 原始碼" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "將選取的文字複製到剪貼簿" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "編輯" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "儲存為小蟒文件" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "儲存為活動套件包" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "儲存為小蟒範例" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "動作" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr " 執行!" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "F" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "_停止" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "s" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "_清除" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "c" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "範例" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "我的範例" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "%s 活動" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "儲存為活動時發生錯誤" #: /home/rafael/Activities/pippy/pippy_app.py:433 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "在進行儲存前,請先為你的活動取一個有意義的名字。" #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "確定" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "建立活動套件包中…" #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "小蟒活動" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "儲存為錯誤範例" #: /home/rafael/Activities/pippy/pippy_app.py:478 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "在儲存為範例之前,請先為你的活動取一個有意義的名字。" #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "建立範例" #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "儲存為警告範例" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "這個範例已經存在,覆寫它嗎?" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "儲存為範例" #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "活動已存入日誌。" #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "找不到TamTamEdit聲音庫,安裝TamTamEdit了嗎?" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "暫停" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "請安裝 咚咚鏘編輯 的音效資料庫" Pippy-46~dfsg/po/it.po0000644000000000000000000001075211710330413013536 0ustar rootroot# 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: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2010-03-25 22:18+0200\n" "Last-Translator: Chris \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" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.3\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "%s Sorgente" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "Copia il testo selezionato negli appunti" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "Modifica" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "Come Documento Pippy" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "Come Pacchetto Attività" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr "_Run!" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "Esempi" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "%s Attività" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "Salva come Errore dell'Attività" #: /home/rafael/Activities/pippy/pippy_app.py:433 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." #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "Ok" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "Creazione di una attività integrata..." #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:478 #, fuzzy 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." #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "Attività salvata nel diario." #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "INPAUSA" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Installa la libreria di suoni di TamTamEdit." Pippy-46~dfsg/po/hus.po0000644000000000000000000001146411710330413013722 0ustar rootroot# 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: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2011-09-04 09:36+0200\n" "Last-Translator: Francisco \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" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.1\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" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "%s Elel" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "K'ot'biy tákudh dhuchlab ba' an kitnom-úw" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "Jalk'uy" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "Etil i dhuchlab Pippy" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "Etil i dhu'badh t'ojlab" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "Etil in t'iplabil a Pippy" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "Pakdhá t'ojlabchik" #: /home/rafael/Activities/pippy/pippy_app.py:139 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 #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "r" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "_Kuba'" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "s" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "T'_oka'" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "o" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "T'iplabchik" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "U t'iplabilchik" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "%s T'ojlab" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "Ka dhaya' etil jun i k'ibts'ontaláb ti t'ojláb" #: /home/rafael/Activities/pippy/pippy_app.py:433 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." #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "Alwa'" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "Dhayk'al jun i t'ojlab axi dhayk'adh ti yan..." #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "T'ojlab Pippy" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "Ka dhaya' etil jun i uk'pidh t'ojlab" #: /home/rafael/Activities/pippy/pippy_app.py:478 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." #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "Dhayk'andhal jun i t'iplab..." #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "Ka dhaya' etil jun i T'ipodh Ok'xidh olchixtaláb" #: /home/rafael/Activities/pippy/pippy_app.py:494 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'?" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "Dhayach etil i t'iplab." #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "T'ojláb dhayach ti chudhel dhuchadh úw." #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 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?" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "TONK'IDH" Pippy-46~dfsg/po/dz.po0000644000000000000000000000454511710330413013542 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/ar.po0000644000000000000000000001160111710330413013516 0ustar rootroot# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # 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: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2011-08-24 08:51+0200\n" "Last-Translator: Khaled Hosny \n" "Language-Team: Arabic \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" "X-Generator: Virtaal 0.7.0\n" #: activity/activity.info:2 msgid "Pippy" msgstr "بِبِي" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "مصْدر %s" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "انسخ النص المحدد إلى الحافظة" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "حرّر" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "كمستند ببي" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "كحزمة ببي" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "كمثال ببي" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "الإجراءات" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr "_شغّل" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "ش" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "أوقِ_ف" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "ف" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "ا_مسح" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "م" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "أمثلة" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "أمثلتي" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "نشاط %s" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "عطل في الحفظ كنشاط" #: /home/rafael/Activities/pippy/pippy_app.py:433 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "من فضلك أعطِ لنشاطك اسما ذا معنى قبل أن تحاول حِفظه كنشاط." #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "موافق" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "ينشئ حزمة النشاط..." #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "نشاط ببي" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "عطل في الحفظ كمثال" #: /home/rafael/Activities/pippy/pippy_app.py:478 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "من فضلك أعطِ لنشاطك اسما ذا معنى قبل أن تحاول حِفظه كمثال." #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "ينشئ المثال..." #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "تحذير في الحفظ كمثال" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "المثال موجود مسبقًا. هل تريد الكتابة عليه؟" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "حُفظ كمثال." #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "حُفِظ النشاط في اليوميّات" #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "تعثر العثور على مكتبة TamTamEdit، هل ثبّتها؟" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "متوقف" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "من فضلك ثبّت مكتبة صوت \"طمطم\"" #~ msgid "Run!" #~ msgstr "شغّل" #~ msgid "Stop!" #~ msgstr "قف" Pippy-46~dfsg/po/pt_BR.po0000644000000000000000000001116711710330413014131 0ustar rootroot# 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: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2010-01-16 16:29+0200\n" "Last-Translator: Robson Mendonça \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" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Pootle 2.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "Fonte de %s" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "copiar o texto selecionado para área de trabalho" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "Editar" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "Como Documento Pippy" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "Como Pacote de Atividade" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr "Executar!" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "Exemplos" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "Atividade %s" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "Salvar como Erro de Atividade" #: /home/rafael/Activities/pippy/pippy_app.py:433 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." #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "Confirma" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "Criando pacote de atividade..." #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:478 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Por favor dê à sua atividade um nome único antes de tentar salvá-la como uma " "atividade." #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "Atividade salva no diário." #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUSADO" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Por Favor instale a biblioteca de som TamTamEdit's." #~ msgid "Run!" #~ msgstr "Rodar!" #~ msgid "Stop!" #~ msgstr "Parar!" Pippy-46~dfsg/po/th.po0000644000000000000000000001135111717264437013554 0ustar rootroot# 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: 2011-10-08 00:32-0400\n" "PO-Revision-Date: 2011-11-23 03:34+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.py:49 #, python-format msgid "%s Source" msgstr "%s Source" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "คัดลอกตัวอักษรที่เลือกไว้ลงใน clipboard" #: 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:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "ไม่พบ ไลบารี่เสียงของ TamTamEdit คุณได้ติดตั้ง TamTamEdit แล้วหรือยัง?" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "ส่งออกเป็นเอกสาร Pippy" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "ส่งออกไฟล์เป็น Pippy Example" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "สร้าง Activity Bundle" #: pippy_app.py:111 msgid "Actions" msgstr "การกระทำ" #: pippy_app.py:138 msgid "_Run!" msgstr "_Run!" #: pippy_app.py:139 msgid "r" msgstr "r" #: pippy_app.py:152 msgid "_Stop" msgstr "_หยุด" #: pippy_app.py:153 msgid "s" msgstr "s" #: pippy_app.py:167 msgid "_Clear" msgstr "_ล้าง" #: pippy_app.py:168 msgid "c" msgstr "c" #: 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 "กิจกรรม %sx" #: 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 "Ok" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "กำลังสร้างชุดกิจกรรม..." #: pippy_app.py:479 msgid "Pippy Activity" msgstr "กิจกรรม Pippy" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "บันทึกเป็นตัวอย่างของ error" #: 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 "บันทึกกิจกรรมลงบันทึกประจำวันแล้ว" #~ msgid "As Pippy Document" #~ msgstr "เป็นเอกสาร Pippy" #~ msgid "As Activity Bundle" #~ msgstr "เป็นชุดกิจกรรม" #~ msgid "Run!" #~ msgstr "รัน!" #~ msgid "Stop!" #~ msgstr "หยุด!" Pippy-46~dfsg/po/pt.po0000644000000000000000000001026111710330413013540 0ustar rootroot# 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: 2011-10-08 00:32-0400\n" "PO-Revision-Date: 2012-01-14 23:06+0200\n" "Last-Translator: Eduardo H. \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.py:49 #, python-format msgid "%s Source" msgstr "Código fonte de %s" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Copiar o texto seleccionado para a área de transferência" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "Editar" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "EM PAUSA" #: library/pippy/sound.py:48 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:90 msgid "Export as Pippy Document" msgstr "Exportar como Documento Pippy" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "Exportar como Exemplo Pippy" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "Criar Pacote de Actividade" #: pippy_app.py:111 msgid "Actions" msgstr "Acções" #: pippy_app.py:138 msgid "_Run!" msgstr "_Executar!" #: pippy_app.py:139 msgid "r" msgstr "r" #: pippy_app.py:152 msgid "_Stop" msgstr "_Parar" #: pippy_app.py:153 msgid "s" msgstr "s" #: pippy_app.py:167 msgid "_Clear" msgstr "_Limpar" #: pippy_app.py:168 msgid "c" msgstr "c" #: pippy_app.py:197 msgid "Examples" msgstr "Exemplos" #: pippy_app.py:229 msgid "My examples" msgstr "Os meus exemplos" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "Actividade %s" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "Erro ao Guardar como Actividade" #: pippy_app.py:439 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Por favor dá à tua actividade um nome relevante antes de tentares gravá-la " "como uma actividade." #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "Ok" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "A criar uma actividade empacotada..." #: pippy_app.py:479 msgid "Pippy Activity" msgstr "Actividade Pippy" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "Gravar como exemplo de erro" #: pippy_app.py:484 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Por favor dá à tua actividade um nome relevante antes de tentares gravá-la " "como um exemplo." #: pippy_app.py:492 msgid "Creating example..." msgstr "A criar exemplo..." #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "Gravar como aviso de exemplo" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "Este exemplo já exite. Queres sobrescrevê-lo?" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "Gravado como exemplo." #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "Actividade guardada no diário." #~ msgid "As Pippy Document" #~ msgstr "Como documento Pippy" #~ msgid "As Activity Bundle" #~ msgstr "Como Actividade empacotada" #~ msgid "As Pippy Example" #~ msgstr "Como exemplo Pippy" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Por favor instala a biblioteca de som do TamTamEdit." #~ msgid "Run!" #~ msgstr "Corre!" #~ msgid "Stop!" #~ msgstr "Pára!" Pippy-46~dfsg/po/ms.po0000644000000000000000000000444211710330413013540 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/Pippy.pot0000644000000000000000000000705611710330413014412 0ustar rootroot# 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: 2011-08-02 09:26-0500\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 "" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:433 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:478 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "" #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-46~dfsg/po/wa.po0000644000000000000000000000444211710330413013530 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/fa_AF.po0000644000000000000000000000576711710330413014070 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2009-07-30 03:30-0400\n" "Last-Translator: Sohaib Obaidi \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 1.2.1\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:108 pippy_app.py:113 msgid "Edit" msgstr "تنظیم کردن" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "مکث شده" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "بحیث سند پیپی" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "بحیث مجموعه فعالیتی" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "_اجراکن!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "مثال ها" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "فعالیت: %s" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "بحیث یک خطای فعالیتی ثبت شود" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "لطفاً فعالیت خود را قبل از ثبت آن بحیث یک فعالیت یک نام پرمعنی بدهید." #: pippy_app.py:422 msgid "Ok" msgstr "درست است" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "در حال ساختن مجموعه فعالیتی..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "فعالیت در ژورنال ثبت گردید." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "لطفا مجموعه صداهای تمتم ویرایش را بارگذاری کنید." Pippy-46~dfsg/po/es.po0000644000000000000000000001133611710330413013530 0ustar rootroot# 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. # 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. # 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: 2011-10-08 00:32-0400\n" "PO-Revision-Date: 2011-10-11 21:08+0200\n" "Last-Translator: Gonzalo \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.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Peppy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Fuente" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Copiar el texto seleccionado al portapapeles" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "Editar" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUSADO" #: library/pippy/sound.py:48 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:90 msgid "Export as Pippy Document" msgstr "Exportar como Documento Peppy" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "Exportar como ejemplo de Peppy" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "Crear una actividad" #: pippy_app.py:111 msgid "Actions" msgstr "Acciones" #: pippy_app.py:138 msgid "_Run!" msgstr "¡_Empieza!" #: pippy_app.py:139 msgid "r" msgstr "r" #: pippy_app.py:152 msgid "_Stop" msgstr "_Parar" #: pippy_app.py:153 msgid "s" msgstr "s" #: pippy_app.py:167 msgid "_Clear" msgstr "_Limpiar" #: pippy_app.py:168 msgid "c" msgstr "c" #: pippy_app.py:197 msgid "Examples" msgstr "Ejemplos" #: pippy_app.py:229 msgid "My examples" msgstr "Mis ejemplos" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "%s Actividad" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "Guardar como error de la Actividad" #: pippy_app.py:439 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:442 pippy_app.py:486 msgid "Ok" msgstr "Bien" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "Creando una actividad empaquetada..." #: pippy_app.py:479 msgid "Pippy Activity" msgstr "Actividad Pippy" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "Guardar como Ejemplo Erróneo" #: pippy_app.py:484 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:492 msgid "Creating example..." msgstr "Generando ejemplo..." #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "Guardar como Ejemplo de Advertencia" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "Este ejemplo ya existe. Deseas sobreescribirlo?" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "Guardado como ejemplo." #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "Actividad guardada en el diario." #~ msgid "As Pippy Document" #~ msgstr "Como documento Pippy" #~ msgid "As Activity Bundle" #~ msgstr "Como Actividad empaquetada" #~ msgid "As Pippy Example" #~ msgstr "Como el ejemplo de Pippy" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Por favor instale la librería de sonido de TamTamEdit." #~ msgid "Stop!" #~ msgstr "Para!" Pippy-46~dfsg/po/pl.po0000644000000000000000000001012311710330413013525 0ustar rootroot# 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: 2011-10-08 00:32-0400\n" "PO-Revision-Date: 2011-10-26 18:28+0200\n" "Last-Translator: Jakub \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" # Źródło czegoś, tak? #: activity.py:49 #, python-format msgid "%s Source" msgstr "Źródło %s" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Skopuj zaznaczony tekst do schowka" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "Edytuj" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUZA" #: library/pippy/sound.py:48 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:90 msgid "Export as Pippy Document" msgstr "Eksportuj jako dokument Pippy" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "Eksportuj jako przykładowy dokument Pippy" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "Utwórz pakiet aktywności" #: pippy_app.py:111 msgid "Actions" msgstr "Akcje" #: pippy_app.py:138 msgid "_Run!" msgstr "_Uruchom!" #: pippy_app.py:139 msgid "r" msgstr "r" #: pippy_app.py:152 msgid "_Stop" msgstr "_Stop" #: pippy_app.py:153 msgid "s" msgstr "s" #: pippy_app.py:167 msgid "_Clear" msgstr "_Wyczyść" #: pippy_app.py:168 msgid "c" msgstr "c" #: pippy_app.py:197 msgid "Examples" msgstr "Przykłady" #: pippy_app.py:229 msgid "My examples" msgstr "Moje przykłady" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "Czynność %s" # kapitalizacja #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "Zapisz jako błąd Aktywności" #: pippy_app.py:439 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:442 pippy_app.py:486 msgid "Ok" msgstr "Ok" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "Tworzę pakiet aktywności..." #: pippy_app.py:479 msgid "Pippy Activity" msgstr "Aplikacja Pippy" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "Zapisz jako przykład błędu" #: pippy_app.py:484 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:492 msgid "Creating example..." msgstr "Tworzę przykład..." #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "Zapisz jako przykład ostrzeżenia" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "Ten przykład już istnieje. Czy chcesz go zmienić?" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "Zapisane jako przykład." #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "Aktywność zapisana w dzienniku." #~ msgid "As Pippy Document" #~ msgstr "Jako dokument Pippy" #~ msgid "As Activity Bundle" #~ msgstr "Jako Pakiet Aktywności" #~ msgid "As Pippy Example" #~ msgstr "Jako przykład Pippy" Pippy-46~dfsg/po/messages.mo0000644000000000000000000000261711710330413014727 0ustar rootroot,   ),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-46~dfsg/po/rw.po0000644000000000000000000000532511710330413013552 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2010-02-07 05:49+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" "X-Generator: Pootle 2.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Isooko" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Koporora inyandiko yatoranyijwe ku kibaho" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "Hindura" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Bihagaritswe by'akanya gato" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "As Pippy Document" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Nk`igikorwa gifatika" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "_Kwiruka!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Ingero" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s Igikorwa" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "Bika nkaho ari Ikosa ry`Igikorwa" #: pippy_app.py:419 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:422 msgid "Ok" msgstr "Ok" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "Rema ihuriro ry'ibikorwa..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "Igikorwa kibitswe mu kinyamakuru." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Nyamuneka shyiramo ububiko bw`amajwi." Pippy-46~dfsg/po/en.po0000644000000000000000000000767011710330413013531 0ustar rootroot# 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: 2011-10-08 00:32-0400\n" "PO-Revision-Date: 2011-10-12 04:00+0200\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.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:48 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 msgid "_Run!" msgstr "_Run!" #: pippy_app.py:139 msgid "r" msgstr "r" #: pippy_app.py:152 msgid "_Stop" msgstr "_Stop" #: pippy_app.py:153 msgid "s" msgstr "s" #: pippy_app.py:167 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 "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." Pippy-46~dfsg/po/aym.po0000644000000000000000000001202411710330413013702 0ustar rootrootmsgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2011-11-23 07:32+0200\n" "Last-Translator: Chris \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" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "%s Tunu" # "Copiar el texto seleccionado al portapapeles" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "Talliqaña ajllita qillqanaka laphi k'ipiru" # "Editar" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "Chiqachaña" # "Como documento Pippy" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "Pippy qillqatajama" # "Como Actividad empaquetada" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "Wakichäwinakajama" # "Como el ejemplo de Pippy" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "Pippy uñanchajama" # "Acciones" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "Lurañanaka" # "¡_Empieza!" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr "_¡Jasma!" # "r" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "r" # "_Parar" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "_Sayt'ayaña" # "s" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "s" # "_Limpiar" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "_Q'umachaña" # "c" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "c" # "Ejemplos" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "Uñancha" # "Mis ejemplos" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "Uñanchaja" # "%s Actividad" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "%s Lurawi" # "Guardar como error de la Actividad" #: /home/rafael/Activities/pippy/pippy_app.py:432 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." #: /home/rafael/Activities/pippy/pippy_app.py:433 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" #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "Waliki" # "Creando una actividad empaquetada..." #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "Lurawinaka lurapji..." # "Actividad Pippy" #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "Pippy lurawi" # "Guardar como Ejemplo Erróneo" #: /home/rafael/Activities/pippy/pippy_app.py:477 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." #: /home/rafael/Activities/pippy/pippy_app.py:478 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..." #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "Uñanchayapjiwa..." # "Guardar como Ejemplo de Advertencia" #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "Imañtata ma sañjama" # "Este ejemplo ya existe. Deseas sobreescribirlo?" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "Uñanchaña utjiwa. ¿Cchaqayañacha?" # "Guardado como ejemplo." #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "Ma uñanchajama imtataskiwa." # "Actividad guardada en el diario." #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "Lurawi sapüru luräwiru imtataskiwa." # "No se pudo encontrar la librería de audio de la Actividad TamTamEdit. ¿Ha " # "instalado la Actividad TamTamEdit?" #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "Tam TamEdit istañanaka jani utkiti. ¿Tam TamEdit uchastati?" # "PAUSADO" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "Suyt'ayaña" Pippy-46~dfsg/po/mk.po0000644000000000000000000000561411710330413013532 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2007-12-17 19:09+0000\n" "Last-Translator: novica \n" "Language-Team: LANGUAGE \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 || n%10==1 ? 0 : 1;\n" "X-Generator: Pootle 1.0.2\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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ПАУЗИРАНО" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Како документ на Pippy" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Како сноп на активности" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 #, fuzzy msgid "_Run!" msgstr "Изврши!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Примери" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s Активност" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "Сними како грешка во активност" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Доделете осмислено име на активноста пред да пробате да ја снимите како " "таква." #: pippy_app.py:422 msgid "Ok" msgstr "Во ред" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "Создавам сноп на активности..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "Активноста е снимена во дневникот." #~ msgid "Run!" #~ msgstr "Изврши!" #~ msgid "Stop!" #~ msgstr "Стој!" Pippy-46~dfsg/po/pseudo.po0000644000000000000000000000312611710330413014416 0ustar rootroot# 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-46~dfsg/po/sl.po0000644000000000000000000000545111710330413013540 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2010-02-07 04:58+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.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s izvora" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Kopiraj izbran tekst na odložišče" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "Uredi" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "USTAVLJENO" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Kot Pippy dokument" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Kot Pippy paket" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "_Zaženi!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Primeri" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s aktivnosti" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "Shrani kot napako aktvinosti" #: pippy_app.py:419 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:422 msgid "Ok" msgstr "V redu" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "Ustvarjam paket aktivnosti..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "Aktivnost je shranjena v beležko." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Namestite TamTamEdit's zvočno knjižnico." Pippy-46~dfsg/po/ug.po0000644000000000000000000000444211710330413013534 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/tpi.po0000644000000000000000000000444211710330413013715 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/mr.po0000644000000000000000000000640711710330413013542 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2010-03-27 08:30+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.3\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:108 pippy_app.py:113 msgid "Edit" msgstr "संपादन करा" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "थोडा वेळ थांबा" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "पिप्प्यच्या कागदपत्रानुसार" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "अँक्टिवीटी बंडलनुसार" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "_धावा!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "उदाहरण" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s उद्योग" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "अँक्टिवीटीमधील चुक नोंदवा" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "कृपया तुमच्या अँक्टिवीटीला नोंदविण्यापुर्वी योग्य नाव द्या" #: pippy_app.py:422 msgid "Ok" msgstr "ओ के" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "अँक्टिवीटी बंडल बनवा" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "अँक्टिवीटी जनरलमध्य़े टाका" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "कृपया टॅम टॅम एडित साउंड लाइब्ररी इंस्टाल करा" Pippy-46~dfsg/po/mg.po0000644000000000000000000000554211710330413013526 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2011-02-14 18:57+0200\n" "Last-Translator: Zafimamy Gabriella Ralaivao \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.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pipay" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s loharano" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Adikao amin'ny solaitra famangitra ny lahatsoratra voafidy" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "Ovao" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Mijanona" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "ho tahirinkevitra Pipay" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Ho tamba-tsahanasa" #: pippy_app.py:106 msgid "Actions" msgstr "Ireo hetsika" #: pippy_app.py:133 msgid "_Run!" msgstr "_alefa!" #: pippy_app.py:134 msgid "r" msgstr "r" #: pippy_app.py:147 msgid "_Stop" msgstr "_Ajanony" #: pippy_app.py:148 msgid "s" msgstr "s" #: pippy_app.py:162 msgid "_Clear" msgstr "_Fafao" #: pippy_app.py:163 msgid "c" msgstr "c" #: pippy_app.py:192 msgid "Examples" msgstr "Ohatra" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s Sahanasa" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "Tehirizo ho Sahanasa Diso" #: pippy_app.py:419 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:422 msgid "Ok" msgstr "Ok" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "Eo am-pamoronana tamba-tsahanasa..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "Voatahiry ao amin'ny firaketana ny sahanasa." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Ampidiro ny fanovana ny tahirim-peo TamTam azafady" Pippy-46~dfsg/po/ml.po0000644000000000000000000000443711710330413013535 0ustar rootroot# 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: 2011-03-04 00:46-0500\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:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/bg.po0000644000000000000000000000600211710330413013503 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2008-03-30 13:34-0400\n" "Last-Translator: Alexander Todorov \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: Pootle 1.1.0rc2\n" #: activity/activity.info:2 #, fuzzy msgid "Pippy" msgstr "Пипи" #: activity.py:49 #, python-format #, fuzzy, python-format msgid "%s Source" msgstr "%s изходен код" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "СПРЯН" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Като документ на Pippy" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Като съвкупност от дейности" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 #, fuzzy msgid "_Run!" msgstr "_Старт!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Примери" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "Занятие %s" #: pippy_app.py:418 #, fuzzy msgid "Save as Activity Error" msgstr "Запазване като грешка на занятието" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "Моля, задайте разумно име преди да запазите като дейност." #: pippy_app.py:422 msgid "Ok" msgstr "ОК" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "Създаване на съвкупност от дейности..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "Дейността е запазена в дневника." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Моля инсталирайте звуковата библиотека на Там-Там Редактор." #~ msgid "Run!" #~ msgstr "Старт!" Pippy-46~dfsg/po/bn_IN.po0000644000000000000000000000615111710330413014105 0ustar rootroot# 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: xo-bundled\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2008-02-04 00:27-0500\n" "Last-Translator: Sankarshan Mukhopadhyay \n" "Language-Team: Bengali \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "স্থগিত" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Pippy ডকুমেন্ট রূপে" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Activity গুচ্ছ রূপে" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 #, fuzzy msgid "_Run!" msgstr "চালাও!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "উদাহরণসমূহ" #: pippy_app.py:338 #, python-format #, fuzzy msgid "%s Activity" msgstr "%s অ্যাক্টিভিটি" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "অ্যাক্টিভিটির ত্রুটি হিসাবে সংরক্ষণ করুন" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "আপনার অ্যাক্টিভিটিকে একটি বোধগম্য নাম দিয়ে সংরক্ষণ করুন" #: pippy_app.py:422 msgid "Ok" msgstr "ঠিক আছে" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "অ্যাক্টিভিটি গুচ্ছ তৈরী করা হচ্ছে..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "জার্নালে অ্যাক্টিভিটি সংরক্ষণ করা হয়েছে" #, fuzzy #~ msgid "Run!" #~ msgstr "চালাও!" #~ msgid "Stop!" #~ msgstr "থামাও!" Pippy-46~dfsg/po/ig.po0000644000000000000000000000443711710330413013524 0ustar rootroot# 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: 2011-03-04 00:46-0500\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:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/sd.po0000644000000000000000000000444211710330413013527 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/sv.po0000644000000000000000000000527011710330413013551 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2010-02-12 05:57+0200\n" "Last-Translator: Chris \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.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s källkod" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Kopiera markerad text" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "Redigera" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUSAD" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Som ett Pippydokument" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Som en aktivitet" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "_Kör!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Exempel" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s Aktivitet" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "Spara som aktivitetsfel" #: pippy_app.py:419 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 sparar den." #: pippy_app.py:422 msgid "Ok" msgstr "Ok" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "Skapar en aktivitet..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "Aktiviteten har sparats i dagboken." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Installera TamTamRedigerarens ljudbibliotek." Pippy-46~dfsg/po/pa.po0000644000000000000000000000443711710330413013525 0ustar rootroot# 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: 2011-03-04 00:46-0500\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:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/ht.po0000644000000000000000000000525111710330413013533 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2008-06-26 13:44-0400\n" "Last-Translator: Jude Augusma \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: Pootle 1.1.0rc2\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Sous" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Kopye tèks chwazi-a sou ekritwa" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "Korije" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Poze" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Kòm dokiman Pippy" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Kòm pakè aktivite" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "_Fè mache!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Ezanp yo" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s Aktivite" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "Sove kòm Aktivite Erè" #: pippy_app.py:419 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:422 msgid "Ok" msgstr "Ok" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "pakè aktivite an kreyasyon..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "Aktivite sove nan jounal." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Souple intale korektè TamTam librèri son." Pippy-46~dfsg/po/fi.po0000644000000000000000000000444211710330413013517 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/hu.po0000644000000000000000000000524211710330413013534 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2011-03-13 17:52+0200\n" "Last-Translator: \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.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Forrás" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Másolja a kiválasztott szöveg a vágólapra" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "Szerkesztés" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Szünet" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Pippy dokumentként" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Aktivitás csomagként" #: pippy_app.py:106 msgid "Actions" msgstr "Intézkedések" #: pippy_app.py:133 msgid "_Run!" msgstr "_Futtat!" #: pippy_app.py:134 msgid "r" msgstr "r" #: pippy_app.py:147 msgid "_Stop" msgstr "_Állj" #: pippy_app.py:148 msgid "s" msgstr "s" #: pippy_app.py:162 msgid "_Clear" msgstr "_Töröl" #: pippy_app.py:163 msgid "c" msgstr "c" #: pippy_app.py:192 msgid "Examples" msgstr "Példák" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s Aktivitás" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "Mentés Aktivitás hibaként" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Kérem telepítse a TamTamEdit's sound könyvtárat" Pippy-46~dfsg/po/nb.po0000644000000000000000000000550211710330413013516 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2009-09-02 01:43-0400\n" "Last-Translator: Chris Leonard \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 1.2.1\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:108 pippy_app.py:113 msgid "Edit" msgstr "Endre" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUSET" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 #, fuzzy msgid "As Pippy Document" msgstr "Som Pippy-dokument" #: pippy_app.py:94 #, fuzzy msgid "As Activity Bundle" msgstr "Som aktivitetspakke" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "_Kjør!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Eksempler" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s aktivitet" #: pippy_app.py:418 #, fuzzy msgid "Save as Activity Error" msgstr "Lagre som aktivitetsfeil" #: pippy_app.py:419 #, 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:422 msgid "Ok" msgstr "Ok" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "Lager aktivitetspakke..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "Aktivitet lagret til dagbok." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Vennligst installer TamTamEdit sitt lydbibliotek." Pippy-46~dfsg/po/quz.po0000644000000000000000000001161211710330413013735 0ustar rootroot# 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: 2011-10-08 00:32-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.7.0\n" # "Peppy" # [es] "Peppy" #: activity/activity.info:2 msgid "Pippy" msgstr "Amarucha" # "%s Fuente" # [es] "%s Fuente" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Código fuente nisqa" # "Copiar el texto seleccionado al portapapeles" # [es] "Copiar el texto seleccionado al portapapeles" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Akllasqa qillqataqa raphi-apaykachaqman kikinchay" # "Editar" # [es] "Editar" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "Allinchay" # "PAUSADO" # [es] "PAUSADO" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "SAYARICHISQA" # "No se pudo encontrar la librería de audio de la Actividad TamTamEdit. ¿Ha " # "instalado la Actividad TamTamEdit?" # [es] "" # [es] "No se pudo encontrar la librería de audio de la Actividad TamTamEdit. ¿Ha " # [es] "instalado la Actividad TamTamEdit ?" #: library/pippy/sound.py:48 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: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 "" # "Acciones" # [es] "Acciones" #: pippy_app.py:111 msgid "Actions" msgstr "Llamk'aykuna" # "¡_Empieza!" # [es] "¡_Empieza!" #: pippy_app.py:138 msgid "_Run!" msgstr "¡_Qallariy!" # "r" # [es] "r" #: pippy_app.py:139 msgid "r" msgstr "r" # "_Parar" # [es] "_Parar" #: pippy_app.py:152 msgid "_Stop" msgstr "_Sayachiy" # "s" # [es] "s" #: pippy_app.py:153 msgid "s" msgstr "s" # "_Limpiar" # [es] "_Limpiar" #: pippy_app.py:167 msgid "_Clear" msgstr "_Pichay" # "c" # [es] "c" #: pippy_app.py:168 msgid "c" msgstr "c" # "Ejemplos" # [es] "Ejemplos" #: pippy_app.py:197 msgid "Examples" msgstr "Qhawarichikuna" #: pippy_app.py:229 msgid "My examples" msgstr "" # "%s Actividad" # [es] "%s Actividad" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "%s Ruwana" # "Guardar como error de la Actividad" # [es] "Guardar como error de la Actividad" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "Ruwanap pantayninta hina allchay" # "Por favor de a su actividad un nombre con significado antes de intentar " # "guardarlo como una actividad." # [es] "" # [es] "Por favor de a su actividad un nombre con significado antes de intentar " # [es] "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 "Ruwanaykita manaraq allchaspaqa, allin sutitaraq churay." # "Bien" # [es] "Bien" #: pippy_app.py:442 pippy_app.py:486 msgid "Ok" msgstr "Allin" # "Creando una actividad empaquetada..." # [es] "Creando una actividad empaquetada..." #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "Q'ipichasqa ruwana kamarikuchkan..." #: pippy_app.py:479 msgid "Pippy Activity" msgstr "" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "" # "Por favor de a su actividad un nombre con significado antes de intentar " # "guardarlo como una actividad." # [es] "" # [es] "Por favor de a su actividad un nombre con significado antes de intentar " # [es] "guardarlo como una actividad." #: pippy_app.py:484 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "Ruwanaykita manaraq allchaspaqa, allin sutitaraq churay." #: 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 "" # "Actividad guardada en el diario." # [es] "Actividad guardada en el diario." #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "Ruwanaqa p'anqapi allcharisqam." # "Como documento Pippy" # [es] "Como documento Pippy" #~ msgid "As Pippy Document" #~ msgstr "Amarucha khipun hina" # "Como Actividad empaquetada" # [es] "Como Actividad empaquetada" #~ msgid "As Activity Bundle" #~ msgstr "Q'ipichasqa ruwana hina" Pippy-46~dfsg/po/is.po0000644000000000000000000000460411710330413013534 0ustar rootroot# 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: 2011-03-04 00:46-0500\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 "Pippi" #: 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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 #, fuzzy msgid "_Run!" msgstr "Keyra!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Dæmi" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" #~ msgid "Run!" #~ msgstr "Keyra!" #~ msgid "Stop!" #~ msgstr "Stöðva!" Pippy-46~dfsg/po/ur.po0000644000000000000000000000605411710330413013550 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2008-07-10 14:42-0400\n" "Last-Translator: salman minhas \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: Pootle 1.1.0rc2\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:108 pippy_app.py:113 msgid "Edit" msgstr "تبديل کريں" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "رکا ہوا" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Pippy دستاویز کے طور پر" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "سرگرمی بنڈل کے طور پر" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 #, fuzzy msgid "_Run!" msgstr "_چلائيں!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "مثاليں" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s سرگرمی" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "سرگرمی غلطی کے طور پر محفوظ کریں" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "اپنی سرگرمی کو محفوظ کرنے سے پہلے براہ مہربانی اسے کوئی بامعانی نام دیں۔" #: pippy_app.py:422 msgid "Ok" msgstr "ٹھیک ہے" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "سرگرمی کا بنڈل بنا رہا ہے..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "سرگرمی جریدے میں محفوظ ہو گئی۔" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "براے مہربانی ٹيم ٹيم ايڈٹ انسٹال کريں۔" #~ msgid "Run!" #~ msgstr "چلاو!" #~ msgid "Stop!" #~ msgstr "روک دو!" Pippy-46~dfsg/po/yo.po0000644000000000000000000000443711710330413013554 0ustar rootroot# 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: 2011-03-04 00:46-0500\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:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/zh_CN.po0000644000000000000000000000560711710330413014126 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2008-11-25 05:20-0500\n" "Last-Translator: Alice Zhang \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: Pootle 1.1.0rc2\n" #: activity/activity.info:2 msgid "Pippy" msgstr "pippy软件" #: 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:108 pippy_app.py:113 msgid "Edit" msgstr "编辑" # literally, "suspended." #: library/pippy/game.py:36 msgid "PAUSED" msgstr "暂停" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "储存为pippy文件" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "储存为活动套件包" #: pippy_app.py:106 msgid "Actions" msgstr "" # literally, "go/begin" #: pippy_app.py:133 msgid "_Run!" msgstr "_执行!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "例子" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s 活动" # This is a bad translation - literally, "mistake in preserving as activity." #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "活动保存错误" # "First give your activity a name, afterwards, save it." #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "在进行储存前,请为活动取一个有意义的名字。" #: pippy_app.py:422 msgid "Ok" msgstr "确定" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "创建活动套件包中..." # Using the existing words for "activity" and "journal" here. #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "活动保存到日志" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "请安装弹弹编辑的音效资料库。" Pippy-46~dfsg/po/sk.po0000644000000000000000000000544611710330413013543 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2009-08-25 15:31-0400\n" "Last-Translator: Chris Leonard \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 1.2.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Zdroj" #: activity.py:91 #, fuzzy msgid "Copy selected text to clipboard" msgstr "Kopírovať zvolený text do schránky" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "Upraviť" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Pauza" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Ako Pippy dokument" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr " Spustiť!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Príklady" #: pippy_app.py:338 #, python-format #, fuzzy msgid "%s Activity" msgstr "%s Aktivity" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "Uložiť ako chybu Aktivity" #: pippy_app.py:419 #, 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:422 msgid "Ok" msgstr "Ok" #: pippy_app.py:428 #, fuzzy msgid "Creating activity bundle..." msgstr "Vytváram balík Activity..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "Aktivita uložená do denníka." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Prosím nainštalovať TamTamEdit zvukovú knižnicu" Pippy-46~dfsg/po/he.po0000644000000000000000000000540311710330413013513 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2008-12-19 23:42-0500\n" "Last-Translator: Chris Leonard \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: Pootle 1.1.0rc2\n" #: activity/activity.info:2 #, fuzzy msgid "Pippy" msgstr "Pippy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 #, fuzzy msgid "Copy selected text to clipboard" msgstr "העתק את הטקסט הנבחר ללוח הכתיבה" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 #, fuzzy msgid "Edit" msgstr "עריכה" #: library/pippy/game.py:36 #, fuzzy msgid "PAUSED" msgstr "מושהה" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 #, fuzzy msgid "As Pippy Document" msgstr "כמסמך Pippy" #: pippy_app.py:94 #, fuzzy msgid "As Activity Bundle" msgstr "כחבילת פעילות" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 #, fuzzy msgid "_Run!" msgstr "_ריצה!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 #, fuzzy msgid "Examples" msgstr "דוגמאות" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 #, fuzzy msgid "Save as Activity Error" msgstr "שמור כשגיאת פעילות" #: pippy_app.py:419 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "יש לתת שם בעל משמעות לפעילות לפני שמנסים לשמור אותה בתור פעילות." #: pippy_app.py:422 #, fuzzy msgid "Ok" msgstr "אישור" #: pippy_app.py:428 #, fuzzy msgid "Creating activity bundle..." msgstr "מייצר חבילת פעילות..." #: pippy_app.py:491 #, fuzzy msgid "Activity saved to journal." msgstr "פעילות נשמרה ביומן." Pippy-46~dfsg/po/hy.po0000644000000000000000000001155511710330413013544 0ustar rootroot# 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: 2011-10-08 00:32-0400\n" "PO-Revision-Date: 2011-12-19 04:46+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.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:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "TamTamEdit -ի ձայնդարանը չեմ գտնում: Դուք տեղադրե՞լ եք TamTamEdit - ը:" #: 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 msgid "_Run!" msgstr "_մեկնարկիր!" #: pippy_app.py:139 msgid "r" msgstr "r" #: pippy_app.py:152 msgid "_Stop" msgstr "_Կանգ" #: pippy_app.py:153 msgid "s" msgstr "s" #: pippy_app.py:167 msgid "_Clear" msgstr "_Մաքրել" #: pippy_app.py:168 msgid "c" msgstr "c" #: 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 "OK" #: 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 "Գործունեությունը պահված է մատյանում:" #~ msgid "As Pippy Document" #~ msgstr "Պիպպիի փաստաթղթի նման" #~ msgid "As Activity Bundle" #~ msgstr "Ինչպես գործողություների հավաքածու" #~ msgid "As Pippy Example" #~ msgstr "Պիպպիի օրինակի նման" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Խնդրում եմ տեղադրեք TamTamEdit's ձայների գրադարանը" Pippy-46~dfsg/po/en_GB.po0000644000000000000000000000767311717264437014127 0ustar rootroot# 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: 2011-10-08 00:32-0400\n" "PO-Revision-Date: 2011-10-11 17:23+0200\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.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:48 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 msgid "_Run!" msgstr "_Run!" #: pippy_app.py:139 msgid "r" msgstr "r" #: pippy_app.py:152 msgid "_Stop" msgstr "_Stop" #: pippy_app.py:153 msgid "s" msgstr "s" #: pippy_app.py:167 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 "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." Pippy-46~dfsg/po/si.po0000644000000000000000000000762111710330413013536 0ustar rootroot# 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 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2011-09-28 08:13+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.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:108 pippy_app.py:113 msgid "Edit" msgstr "සකසන්න" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "විරාමයක් ගෙන ඇත" #: library/pippy/sound.py:47 #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "TamTamEdit ශබ්ද පුස්තකාලය සොයාගැනීමට නොහැක. ඔබ TamTamEdit ස්ථාපනය කලාද?" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "පිපී ලිපියක් ලෙස" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "ක්‍රියාකාරකම් පොදියක් ලෙස" #: pippy_app.py:106 #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "ක්‍රියා" #: pippy_app.py:133 msgid "_Run!" msgstr "දුවන්න!(_R)" #: pippy_app.py:134 #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "r" #: pippy_app.py:147 #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "_Stop" #: pippy_app.py:148 #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "s" #: pippy_app.py:162 #, fuzzy msgid "_Clear" msgstr "_Clear" #: pippy_app.py:163 #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "c" #: pippy_app.py:192 msgid "Examples" msgstr "උදාහරණ" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s ක්‍රියාකාරකම" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "ක්‍රියාකාරකම් දෝෂයක් ලෙස සුරකින්න" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "ක්‍රියාකාරකමක් ලෙස සුරකීමට පෙර කරුණාකර ඔබගේ ක්‍රියාකාරකමට අර්ථවත් නමක් " "දෙන්න." #: pippy_app.py:422 msgid "Ok" msgstr "හරි" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "ක්‍රියාකාරකම් පොදියක් සාදයි..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "ක්‍රියාකාරකම ජ'නලයට සුරකින ලදි." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "කරුණාකර ටැම්ටැම්එඩිට් හි නාද ආගාරය ස්ථාපනය කරන්න" Pippy-46~dfsg/po/ja.po0000644000000000000000000001135211710330413013511 0ustar rootroot# 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: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2008-07-27 11:26-0400\n" "Last-Translator: korakurider \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: Pootle 1.1.0rc2\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "%s ソース" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "選択されたテキストをクリップボードにコピー" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "編集" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "Pippyドキュメントとして" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "アクティビティバンドルとして" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr "実行!" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "例" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "%s アクティビティ" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "「アクティビティとして保存」のエラー" #: /home/rafael/Activities/pippy/pippy_app.py:433 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "わかりやすい名前を付けてから、アクティビティとして保存してください。" #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "了解" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "アクティビティバンドルを生成中..." #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:478 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "わかりやすい名前を付けてから、アクティビティとして保存してください。" #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "ジャーナルにアクティビティを保存しました。" #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "一時停止中" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "TamTamエディタのサウンドライブラリをインストールしてください" #, fuzzy #~ msgid "Stop!" #~ msgstr "止まれ!" Pippy-46~dfsg/po/pis.po0000644000000000000000000000444211710330413013714 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/tzo.po0000644000000000000000000000443711710330413013741 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/ru.po0000644000000000000000000001320211710330413013541 0ustar rootroot# 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: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2011-09-28 19:52+0200\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.0.5\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Питон Пиппи" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "%s Источник" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "Скопировать выделенный текст" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "Редактировать" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "Как Документ Пиппи" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "Как Упражнение" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "Как Образец Пиппи" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "Действия" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr "_Пуск!" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "r" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "_Стоп" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "s" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "_Очистить" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "c" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "Образцы" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "Мои образцы" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format #, python-format, fuzzy msgid "%s Activity" msgstr "%s Активность" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "Сохранить как Ошибку Упражнения" #: /home/rafael/Activities/pippy/pippy_app.py:433 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Пожалуйста дайте своему упражнению разумное название прежде чем пытаться " "сохранить его как упражнение" #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "Ок" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "Создается упражнение..." #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "Упражнение Пиппи" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "Сохранить как Образец Ошибки" #: /home/rafael/Activities/pippy/pippy_app.py:478 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Пожалуйста дайте своему упражнению разумное название прежде чем пытаться " "сохранить его как упражнение." #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "Создается образец..." #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "Сохранить Как Предупреждение Образца" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "Этот образец уже существует. Заменить?" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "Сохранено как образец." #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "Упражнение сохранено в журнале." #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Невозможно найти звуковую библиотеку TamTamEdit. Вы установили TamTamEdit?" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "ПАУЗА" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Пожалуйста, установите звуковую библиотеку ТамТам редактора" #~ msgid "Run!" #~ msgstr "Пуск!" #~ msgid "Stop!" #~ msgstr "Стоп!" Pippy-46~dfsg/po/ta.po0000644000000000000000000001430111710330413013520 0ustar rootroot# 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: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2011-07-03 13:54+0200\n" "Last-Translator: Chris \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" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "பிப்பி" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "%s வளம்" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "மறைப்பலகையில்உரையை தெரிவு செய்து பிரதிசெய்தல்" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "திருத்துக" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "பிப்பி ஆவணங்கள்" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "செயற்பாட்டுத்தொகுதி" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "பிப்பி மாதறியான உதாரணம்" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "செயல்கள்" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr "ஓடு!" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "r" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "_நிறுத்து" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "s" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "_நீக்கு" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "c" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "உதாரணங்கள்" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "என்னுடைய உதாரணங்கள்" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "%s செயற்பாடு" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "செயற்பாட்டு தவறை மாற்றிசேமிக்கவும்" #: /home/rafael/Activities/pippy/pippy_app.py:433 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "தயவுசெய்து உங்கள்செயற்பாட்டிற்கு அர்த்தமுள்ளபெயரை வழங்கியபின்னர் முயற்சித்து " "அச்செயற்பாட்டை சேமிக்க" #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "சரி" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "ஆக்கபூர்வ செயற்பாட்டுத்தொகுதி" #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "பிப்பியின் செயற்பாடு" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "உதாரண தவறாக சேமி" #: /home/rafael/Activities/pippy/pippy_app.py:478 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "தயவுசெய்து உங்கள்செயற்பாட்டிற்கு அர்த்தமுள்ளபெயரை வழங்கியபின்னர் முயற்சித்து " "அச்செயற்பாட்டை சேமிக்க" #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "உதாரணங்கள் உருவாக்கம்..." #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "எச்சரிக்கான உதாரணமாக சேமி" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "இந்த உதாரணம் ஏற்கனவேயுள்ளது. உங்களுக்கு மீண்டும் மாற்றி எழுத வேண்டுமா?" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "உதாரணமாக சேமி." #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "செயற்பாட்டைநாட்குறிப்பேட்டில்சேமி" #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "ஒலிக்கான TamTamEdit library காணவில்லை. TamTamEdit யை நிறுவி உள்ளீர்களா?" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "இடைநிறுத்து" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "தயவு செய்து TAMTAMEDIT`S ஒலியை நூலகத்தில் சேமிக்க" Pippy-46~dfsg/po/cpp.po0000644000000000000000000000444211710330413013703 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/de.po0000644000000000000000000001455511710330413013517 0ustar rootroot# 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. # 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. # 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. # 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. # 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: Fructose-de\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-10-08 00:32-0400\n" "PO-Revision-Date: 2011-10-10 20:45+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" "X-Poedit-Country: Germany\n" "X-Poedit-Language: German\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Quelltext" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Ausgewählten Text in die Zwischenablage kopieren" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "Bearbeiten" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ANGEHALTEN" #: library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Kann die TamTamEdit-Klangbibliothek nicht finden. Hast du TamTamEdit " "installiert?" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "Exportieren als Pippy-Dokument" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "Exportieren als Pippy-Beispiel" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "Aktivitätspaket erstellen" #: pippy_app.py:111 msgid "Actions" msgstr "Aktionen" #: pippy_app.py:138 msgid "_Run!" msgstr "_Los!" #: pippy_app.py:139 msgid "r" msgstr "l" #: pippy_app.py:152 msgid "_Stop" msgstr "_Stopp!" #: pippy_app.py:153 msgid "s" msgstr "s" # (Markus S.) war '_Säubern' #: pippy_app.py:167 msgid "_Clear" msgstr "_Leeren" # (Markus S.) sollte zu 'Leeren' passen, aber 'l' ist schon zuvor belegt. #: pippy_app.py:168 msgid "c" msgstr "e" #: pippy_app.py:197 msgid "Examples" msgstr "Beispiele" #: pippy_app.py:229 msgid "My examples" msgstr "Meine Beispiele" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "%s Aktivität" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "Als Aktivitätsfehler speichern" #: pippy_app.py:439 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:442 pippy_app.py:486 msgid "Ok" msgstr "Ok" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "Erstelle Aktivitätspaket..." #: pippy_app.py:479 msgid "Pippy Activity" msgstr "Pippy-Aktivität" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "Als Beispielfehler speichern" #: pippy_app.py:484 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:492 msgid "Creating example..." msgstr "Erstelle Beispiel..." #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "Als Beispielwarnung speichern" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "Dieses Beispiel existiert bereits. Willst du es überschreiben?" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "Als Beispiel gespeichert." #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "Aktivität ins Tagebuch gespeichert." #~ msgid "As Pippy Document" #~ msgstr "Als Pippy-Dokument" #~ msgid "As Activity Bundle" #~ msgstr "Als Aktivitätspaket" #~ msgid "As Pippy Example" #~ msgstr "Als Pippy-Beispiel" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Bitte die Klangbibliothek von TamTamEdit installieren." #~ msgid "Run!" #~ msgstr "Los!" #~ msgid "Stop!" #~ msgstr "Stopp!" Pippy-46~dfsg/po/ro.po0000644000000000000000000000535611710330413013546 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2008-02-19 14:01-0500\n" "Last-Translator: Adi Roiban \n" "Language-Team: LANGUAGE \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 1.0.2\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "Sursa %s" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUZĂ" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Ca document Pippy" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Ca activitate incorporată" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "_Pornește!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Exemple" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "Activitatea %s" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "Salvează ca eroare de activitate" #: pippy_app.py:419 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:422 msgid "Ok" msgstr "Ok" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "Se crează pachetul activităţii..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "Activitate salvată în jurnal." #~ msgid "Run!" #~ msgstr "Pornește!" #~ msgid "Stop!" #~ msgstr "Oprește!" Pippy-46~dfsg/po/gu.po0000644000000000000000000000443711710330413013540 0ustar rootroot# 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: 2011-03-04 00:46-0500\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:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/sq.po0000644000000000000000000000511711710330413013544 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2009-11-13 15:52-0400\n" "Last-Translator: Edonit Rexhepi \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 1.2.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Burim" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Kopjo tekstin e zgjedhur në clipboard" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "Ndrysho" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "E PUSHUAR" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Shembujt" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s Aktiviteti" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Ju lutem jepni aktivitetin tuaj një emër kuptimplotë para se të përpiqet për " "të ruajtur atë si një aktivitet." #: pippy_app.py:422 msgid "Ok" msgstr "Në Rregull" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "Aktivizimi i ruajtur në ditar." Pippy-46~dfsg/po/ps.po0000644000000000000000000000601011710330413013534 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2008-03-28 12:10-0400\n" "Last-Translator: Ahmad Jawed \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: Pootle 1.1.0rc2\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:108 pippy_app.py:113 msgid "Edit" msgstr "سمون" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ځنډول شوی" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "د پپي لاسوند په څېر" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "د چارندتیا بنډل په څېر" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "_ځغلول!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "مثالونه" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "٪s چارندتیا" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "ساتل د چارندتیا د تیروتنو په څیر" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "مخکې له دې، چې خپله چارندتیا د یوې چارند په څېر وساتۍ، مهرباني وکړﺉ یو مانا " "لرونکې نوم ورکړﺉ." #: pippy_app.py:422 msgid "Ok" msgstr "هو" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "د چارندتیا بنډل پنځونه..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "د ورځپاڼې چارندتیا وساتل شوه. " #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "مهرباني وکړﺉ د ټم ټم اېډېټ د غږ کتابتون ولګوﺉ" #~ msgid "Run!" #~ msgstr "وځغلوه!" Pippy-46~dfsg/po/km.po0000644000000000000000000000734611710330413013536 0ustar rootroot# 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: 2011-10-08 00:32-0400\n" "PO-Revision-Date: 2011-10-27 11:19+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.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:48 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 msgid "_Run!" msgstr "_រត់!" #: pippy_app.py:139 msgid "r" msgstr "" #: pippy_app.py:152 msgid "_Stop" msgstr "_បញ្ឈប់" #: pippy_app.py:153 msgid "s" msgstr "" #: pippy_app.py:167 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 #, fuzzy 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 "រក្សាទុកសកម្មភាពក្នុងសៀវភៅទានានុប្បវត្តិ" Pippy-46~dfsg/po/en_US.po0000644000000000000000000000774011710330413014136 0ustar rootroot# 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: 2011-10-08 00:32-0400\n" "PO-Revision-Date: 2011-10-12 04:01+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:48 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 msgid "_Run!" msgstr "_Run!" #: pippy_app.py:139 msgid "r" msgstr "r" #: pippy_app.py:152 msgid "_Stop" msgstr "_Stop" #: pippy_app.py:153 msgid "s" msgstr "s" #: pippy_app.py:167 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 "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-46~dfsg/po/el.po0000644000000000000000000001371311710330413013522 0ustar rootroot# 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: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2011-06-25 16:19+0200\n" "Last-Translator: Yannis \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" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.1\n" # Τι να μεταφράσεις από αυτό;;;;το αφήνω ίδιο #: activity/activity.info:2 msgid "Pippy" msgstr "Πίπης" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "Κώδικας του %s" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "Αντιγραφή επιλεγμένου κειμένου στο πρόχειρο" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "Επεξεργασία" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "Ως έγγραφο του Πίπη" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "Ως Πακέτο Δραστηριότητας" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "Ως παράδειγμα του Πίπη" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "Δράσεις" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr "_Τρέξε!" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "r" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "_Διακοπή" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "s" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "_Καθαρισμός" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "c" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "Παραδείγματα" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "Τα δικά μου παραδείγματα" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "Δραστηριότητα %s" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "Αποθήκευση ως σφάλμα δραστηριότητας" #: /home/rafael/Activities/pippy/pippy_app.py:433 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Παρακαλώ δώσε στη δραστηριότητα σου ένα όνομα με κάποιο νόημα πριν " "προσπαθήσεις να την αποθηκεύσεις σαν δραστηριότητα." #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "Εντάξει" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "Δημιουργώ πακέτο δραστηριότητας..." #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "Δραστηριότητα του Πίπη" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "Αποθήκευση ως σφάλμα παραδείγματος" #: /home/rafael/Activities/pippy/pippy_app.py:478 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" "Παρακαλώ δώσε στη δραστηριότητα σου ένα όνομα με κάποιο νόημα πριν " "προσπαθήσεις να την αποθηκεύσεις ως παράδειγμα." #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "Δημιουργία παραδείγματος..." #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "Αποθήκευση ως προειδοποίηση παραδείγματος" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "Το παράδειγμα υπάρχει ήδη. Θέλετε να το αντικαταστήσετε;" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "Αποθηκεύτηκε ως παράδειγμα." #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "Η Δραστηριότητα αποθηκεύτηκε στο Ημερολόγιο." #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Αδυναμία εύρεσης της βιβλιοθήκης ήχων του TamTamEdit. Έχετε εγκαταστήσει το " "TamTamEdit;" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "ΣΕ ΠΑΥΣΗ" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Παρακαλώ εγκαταστήστε τη βιβλιοθήκη ήχων του Επεξεργαστή Ταμ-Ταμ." #~ msgid "Run!" #~ msgstr "Τρέξε!" #~ msgid "Stop!" #~ msgstr "Σταμάτα!" Pippy-46~dfsg/po/id.po0000644000000000000000000000451011710330413013511 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2010-02-11 06:30+0200\n" "Last-Translator: Chris \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.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:108 pippy_app.py:113 msgid "Edit" msgstr "Sunting" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/qu.po0000644000000000000000000000443711710330413013552 0ustar rootroot# 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: 2011-03-04 00:46-0500\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:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/fr.po0000644000000000000000000001026511710330413013530 0ustar rootroot# 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: 2011-10-08 00:32-0400\n" "PO-Revision-Date: 2011-10-11 22:50+0200\n" "Last-Translator: samy boutayeb \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.py:49 #, python-format msgid "%s Source" msgstr "Source %s" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Copier le texte sélectionné vers le presse-papier" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "Editer" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PAUSE" #: library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Bibliothèque audio TamTamEdit introuvable. Avez-vous installé TamTamEdit ?" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "Exporter vers un document Pippy" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "Exporter vers un exemple Pippy" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "Créer un paquet d'activité" #: pippy_app.py:111 msgid "Actions" msgstr "Actions" #: pippy_app.py:138 msgid "_Run!" msgstr "_Démarrer !" #: pippy_app.py:139 msgid "r" msgstr "r" #: pippy_app.py:152 msgid "_Stop" msgstr "_Arrêt" #: pippy_app.py:153 msgid "s" msgstr "s" #: pippy_app.py:167 msgid "_Clear" msgstr "_Effacer" #: pippy_app.py:168 msgid "c" msgstr "c" #: pippy_app.py:197 msgid "Examples" msgstr "Exemples" #: pippy_app.py:229 msgid "My examples" msgstr "Mes exemples" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "Activité %s" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "Erreur de sauvegarde comme activité" #: pippy_app.py:439 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:442 pippy_app.py:486 msgid "Ok" msgstr "Ok" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "Création de paquet activité en cours..." #: pippy_app.py:479 msgid "Pippy Activity" msgstr "Activité Pippy" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "Enregistrer comme exemple d'erreur" #: pippy_app.py:484 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:492 msgid "Creating example..." msgstr "Création d'un exemple..." #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "Enregistrer comme exemple d'avertissement" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "Cet exemple existe déjà. Voulez-vous le remplacer ?" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "Enregistré comme exemple." #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "L'activité a été enregistrée dans le journal." #~ msgid "As Pippy Document" #~ msgstr "Comme document Pippy" #~ msgid "As Activity Bundle" #~ msgstr "Comme paquet activité" #~ msgid "As Pippy Example" #~ msgstr "Comme exemple Pippy" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Merci d'installer la librairie de sons de TamTamEdit." #~ msgid "Run!" #~ msgstr "Démarrer !" #~ msgid "Stop!" #~ msgstr "Arrêter !" Pippy-46~dfsg/po/te.po0000644000000000000000000000634111710330413013531 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2008-07-24 14:30+0100\n" "Last-Translator: Satyanarayana Murthy Saladi \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: Pootle 1.0.2\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:108 pippy_app.py:113 msgid "Edit" msgstr "కూర్చు" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ఆగినది" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "పిప్పీ దస్తావేజుగా" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "వ్యాపకాల కట్టగా" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr " నడుపు !" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "ఉదాహరణలు" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s వ్యాపకం" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "వ్యాపకంలో పొరబాటుగా బద్రపరచు" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "మీ వ్యాపకాన్ని దాచేమొందు దానికి ఒక అర్దవంతమైన పేరుఇవ్వండి." #: pippy_app.py:422 msgid "Ok" msgstr "సరి" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "వ్యపకాల కట్టని తయారు చేస్తున్నా" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "వ్యపకాన్ని పద్దులో దాచా" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "దయ చేసి TamTamEdit ధ్వని సముదాయాన్ని ప్రతిష్టించండి " Pippy-46~dfsg/po/hi.po0000644000000000000000000000715311710330413013523 0ustar rootroot# 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. # 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2010-03-22 22:50+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.3\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:108 pippy_app.py:113 msgid "Edit" msgstr "संपादन" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "विराम" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "पीप्पी दस्तावेज की तरह" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "क्रिया की गठरी की तरह" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "चलाएँ! (_R)" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "उदाहरण" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s क्रिया" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "क्रिया त्रुटि जैसे सहेजें" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "अपनी क्रिया को सहेजने की कोशिश करने से पहले कृपया इसे कोई अर्थयुक्त नाम दें." #: pippy_app.py:422 msgid "Ok" msgstr "ठीक है" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "क्रिया संग्रह बनाया जा रहा है..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "क्रिया दैनिकी में सहेजा गया." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "कुपया टॅम टॅम एडिट की संगीत पुस्तककालय का संपादन करे." #~ msgid "Run!" #~ msgstr "दोडो!" #~ msgid "Stop!" #~ msgstr "रुको!" Pippy-46~dfsg/po/ko.po0000644000000000000000000000621111710330413013526 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2010-10-12 22:50+0200\n" "Last-Translator: frannyberry \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.0.3\n" # McYLTS dznvcizixegd, [url=http://zmgykicykfdh.com/]zmgykicykfdh[/url], [link=http://pddpkggkbjrf.com/]pddpkggkbjrf[/link], http://auvxuabsmltf.com/ #: activity/activity.info:2 msgid "Pippy" msgstr "" "McYLTS dznvcizixegd, " "[url=http://zmgykicykfdh.com/]zmgykicykfdh[/url], " "[link=http://pddpkggkbjrf.com/]pddpkggkbjrf[/link], http://auvxuabsmltf.com/" #: 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:108 pippy_app.py:113 msgid "Edit" msgstr "편집" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "잠시 멈춤" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "피피 문서로" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "활동 묶음으로" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "_실행!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "예제" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s 활동" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "활동 에러 저장하기" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "활동을 저장하기 전에 당신의 활동을 의미 있는 이름으로 지어 주세요." #: pippy_app.py:422 msgid "Ok" msgstr "완료" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "활동 묶음 만들기" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "일지에 활동 저장" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "탐탐편집기의 사운드 라이브러리를 설치하세요" Pippy-46~dfsg/po/kos.po0000644000000000000000000000443711710330413013721 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/bi.po0000644000000000000000000000444211710330413013513 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/tvl.po0000644000000000000000000000443711710330413013732 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/br.po0000644000000000000000000000724311710330413013526 0ustar rootroot# 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: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2011-08-29 07:41+0200\n" "Last-Translator: Chris \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" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Pootle 2.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "r" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "_Arsaviñ" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "s" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "_Skarzhañ" #: /home/rafael/Activities/pippy/pippy_app.py:169 #, fuzzy msgid "c" msgstr "r" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "%s Oberiantiz" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:433 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:478 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "" #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "" Pippy-46~dfsg/po/fa.po0000644000000000000000000000534311710330413013510 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2008-01-09 10:30+0000\n" "Last-Translator: Sohaib Obaidi \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: Pootle 1.0.2\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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "مکث شده" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "بحیث سند پیپی" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "بحیث مجموعه فعالیتی" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 #, fuzzy msgid "_Run!" msgstr "بران" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "مثال ها" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s فعالیت" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "بحیث یک اشتباه فعالیتی ثبت شود" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "لطفاً فغالیت خود را قبل از ثبت آن بحیث یک فعالیت یک نام پرمعنی بدهید" #: pippy_app.py:422 msgid "Ok" msgstr "درست است" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "در حال ساختن مجموعه فعالیتی" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "فعالیت بحیث یک یادداشت ثبت گردید" #~ msgid "Run!" #~ msgstr "بران" Pippy-46~dfsg/po/ca.po0000644000000000000000000000553011710330413013503 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2009-12-16 00:15+0100\n" "Last-Translator: el_libre -- www.catmidia.cat \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 1.2.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s codi font" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Copia el text seleccionat al portapapers" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "Editar" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "ATURAT" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Com a document Pippy" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Com un grup d'activitats" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "_Engega!" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Ejemples" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s Activitat" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "Desa com a un Error de l'Activitat" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" "Si us plau, dóna el nom principal de l'Activitat abans de provar de desar-la " "com a Activitat" #: pippy_app.py:422 msgid "Ok" msgstr "D'acord" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "Creant grup d'Activitats ..." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "L'Activitat s'ha desat al Diari" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Si us plau instal·li la llibreria de só de TamTamEdit." #~ msgid "Run!" #~ msgstr "Engega!" Pippy-46~dfsg/po/vi.po0000644000000000000000000001116011710330413013532 0ustar rootroot# 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: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2009-02-13 07:54-0500\n" "Last-Translator: Clytie Siddall \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: Pootle 1.1.0rc2\n" # Tên: không nên dịch #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "Nguồn %s" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "Sao chép sang bảng nháp đoạn văn đã chọn" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "Sửa" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "Dạng tài liệu Pippy" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "Dạng bộ hoạt động" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr "_Chạy !" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "Ví dụ" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "Hoạt động %s" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "Lưu dạng Lỗi hoạt động" #: /home/rafael/Activities/pippy/pippy_app.py:433 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." #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "OK" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "Đang tạo bộ hoạt động..." #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:478 #, 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." #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "Hoạt động đã được lưu vào nhật ký." #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "BỊ TẠM DỪNG" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Hãy cài đặt thư viện âm thanh của TamTamEdit." Pippy-46~dfsg/po/fil.po0000644000000000000000000000471411710330413013675 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.py:49 #, python-format msgid "%s Source" msgstr "%s Pinagmulan" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Kopyahin ang napiling teksto sa clipboard" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "Baguhin" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Bilang Pippy na Dokumento" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "Bilang Aktibidad na Bundle" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "Mga halimbawa" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "Ok" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/am.po0000644000000000000000000000571411710330413013521 0ustar rootroot# 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. # 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2011-04-13 02:31+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.1\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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "_ቁም ቁሚ አቁም አቁሚ" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "_ሰርዝ" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s ድርጊት" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "እሺ" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/da.po0000644000000000000000000000764111710330413013511 0ustar rootroot# 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: 2011-10-08 00:32-0400\n" "PO-Revision-Date: 2011-10-12 11:10+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.py:49 #, python-format msgid "%s Source" msgstr "%s Kilde" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "Kopiér valgte tekst til udklipsholder" #: activity.py:96 pippy_app.py:113 pippy_app.py:118 msgid "Edit" msgstr "Redigér" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "PÅ PAUSE" #: library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Kan ikke finde lydbiblioteket for TamTamEdit. Har du installeret TamTamEdit?" #: pippy_app.py:90 msgid "Export as Pippy Document" msgstr "Eksportér som Pippy-dokument" #: pippy_app.py:96 msgid "Export as Pippy Example" msgstr "Eksportér som Pippy-eksempel" #: pippy_app.py:102 msgid "Create Activity Bundle" msgstr "Opret aktivitetsbundt" #: pippy_app.py:111 msgid "Actions" msgstr "Handlinger" #: pippy_app.py:138 msgid "_Run!" msgstr "_Kør!" #: pippy_app.py:139 msgid "r" msgstr "k" #: pippy_app.py:152 msgid "_Stop" msgstr "_Stop" #: pippy_app.py:153 msgid "s" msgstr "s" #: pippy_app.py:167 msgid "_Clear" msgstr "_Ryd" #: pippy_app.py:168 msgid "c" msgstr "r" #: pippy_app.py:197 msgid "Examples" msgstr "Eksempler" #: pippy_app.py:229 msgid "My examples" msgstr "Mine eksempler" #: pippy_app.py:358 #, python-format msgid "%s Activity" msgstr "%s Aktivitet" #: pippy_app.py:438 msgid "Save as Activity Error" msgstr "Gem som aktivitetsfejl" #: pippy_app.py:439 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:442 pippy_app.py:486 msgid "Ok" msgstr "Ok" #: pippy_app.py:448 msgid "Creating activity bundle..." msgstr "Opretter aktivitetsbundt..." #: pippy_app.py:479 msgid "Pippy Activity" msgstr "Pippy-aktivitet" #: pippy_app.py:483 msgid "Save as Example Error" msgstr "Gem som Eksempel-fejl" #: pippy_app.py:484 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:492 msgid "Creating example..." msgstr "Opretter eksempel..." #: pippy_app.py:499 msgid "Save as Example Warning" msgstr "Gem som Eksempel-advarsel" #: pippy_app.py:500 msgid "This example already exists. Do you want to overwrite it?" msgstr "Dette eksempel eksisterer allerede. Ønsker du at overskrive det?" #: pippy_app.py:506 pippy_app.py:562 msgid "Saved as example." msgstr "Gemt som eksempel." #: pippy_app.py:546 msgid "Activity saved to journal." msgstr "Aktivitet gemt i journal." #~ msgid "As Pippy Document" #~ msgstr "Som et Pippy-dokument" #~ msgid "As Activity Bundle" #~ msgstr "Som et aktivitetsbundt" #~ msgid "As Pippy Example" #~ msgstr "Som Pippy-eksempel" Pippy-46~dfsg/po/ha.po0000644000000000000000000000443711710330413013515 0ustar rootroot# 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: 2011-03-04 00:46-0500\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:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/af.po0000644000000000000000000000451311710330413013506 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.py:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "Reg" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/sw.po0000644000000000000000000000452211710330413013551 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.py:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "Hariri" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "Sawa" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/ff.po0000644000000000000000000000443711710330413013520 0ustar rootroot# 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: 2011-03-04 00:46-0500\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:49 #, python-format msgid "%s Source" msgstr "" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/bn.po0000644000000000000000000001244211710330413013517 0ustar rootroot# 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: xo-bundled\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2009-08-26 00:18-0400\n" "Last-Translator: Chris Leonard \n" "Language-Team: Bengali \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.2.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "পিপ্পি" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "%s উৎস" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "নির্বাচিত লেখা গুলো ক্লিপবোর্ডে কপি করো" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "সম্পাদনা" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "পিপ্পি ডকুমেন্ট হিসাবে" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "সক্রিয়তার গুচ্ছ হিসাবে" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:139 #, fuzzy msgid "_Run!" msgstr "চালাও!" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "উদাহরনসনহ" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "%s সক্রিয়তা" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "সক্রিয়তার সমস্যা হিসাবে সংরক্ষন" #: /home/rafael/Activities/pippy/pippy_app.py:433 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "অনুগ্রহ করে সংরক্ষন করার পুর্বে আপনার সক্রিয়তার একটি অর্থবহ নাম দিন।" #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "ঠিক আছে" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "সক্রিয়তার গুচ্ছ তৈরি করছি..." #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:478 #, fuzzy msgid "" "Please give your activity a meaningful name before attempting to save it as " "an example." msgstr "অনুগ্রহ করে সংরক্ষন করার পুর্বে আপনার সক্রিয়তার একটি অর্থবহ নাম দিন।" #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "জার্নালে সক্রিয়তাটি সংরক্ষন করা হয়েছে." #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "স্থগিত" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "অনুগ্রহ করে TamTamEdit এর শব্দ লাইব্রেরি ইনস্টল করুন।" #~ msgid "Run!" #~ msgstr "চালাও!" #~ msgid "Stop!" #~ msgstr "থামাও!" Pippy-46~dfsg/po/nl.po0000644000000000000000000001164311710330413013533 0ustar rootroot# 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. # 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: 2011-08-02 09:26-0500\n" "PO-Revision-Date: 2011-07-21 20:55+0200\n" "Last-Translator: Myckel Habets \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" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: /home/rafael/Activities/pippy/activity.py:49 #, python-format msgid "%s Source" msgstr "%s Bron" #: /home/rafael/Activities/pippy/activity.py:91 msgid "Copy selected text to clipboard" msgstr "Kopieer geselecteerde tekst naar klembord" #: /home/rafael/Activities/pippy/activity.py:96 #: /home/rafael/Activities/pippy/pippy_app.py:114 #: /home/rafael/Activities/pippy/pippy_app.py:119 msgid "Edit" msgstr "Bewerken" #: /home/rafael/Activities/pippy/pippy_app.py:87 msgid "As Pippy Document" msgstr "Als Pippy document" #: /home/rafael/Activities/pippy/pippy_app.py:94 msgid "As Activity Bundle" msgstr "Als Activiteit bundel" #: /home/rafael/Activities/pippy/pippy_app.py:102 msgid "As Pippy Example" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:112 msgid "Actions" msgstr "Acties" #: /home/rafael/Activities/pippy/pippy_app.py:139 msgid "_Run!" msgstr "_Uitvoeren!" #: /home/rafael/Activities/pippy/pippy_app.py:140 msgid "r" msgstr "r" #: /home/rafael/Activities/pippy/pippy_app.py:153 msgid "_Stop" msgstr "_Stop" #: /home/rafael/Activities/pippy/pippy_app.py:154 msgid "s" msgstr "s" #: /home/rafael/Activities/pippy/pippy_app.py:168 msgid "_Clear" msgstr "_Wissen" #: /home/rafael/Activities/pippy/pippy_app.py:169 msgid "c" msgstr "c" #: /home/rafael/Activities/pippy/pippy_app.py:198 msgid "Examples" msgstr "Voorbeelden" #: /home/rafael/Activities/pippy/pippy_app.py:230 msgid "My examples" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:352 #, python-format msgid "%s Activity" msgstr "%s Activiteit" #: /home/rafael/Activities/pippy/pippy_app.py:432 msgid "Save as Activity Error" msgstr "Fout bij bewaren als Activiteit" #: /home/rafael/Activities/pippy/pippy_app.py:433 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." #: /home/rafael/Activities/pippy/pippy_app.py:436 #: /home/rafael/Activities/pippy/pippy_app.py:480 msgid "Ok" msgstr "Ok" #: /home/rafael/Activities/pippy/pippy_app.py:442 msgid "Creating activity bundle..." msgstr "Bezig met activiteit bundel maken..." #: /home/rafael/Activities/pippy/pippy_app.py:473 msgid "Pippy Activity" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:477 msgid "Save as Example Error" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:478 #, fuzzy 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 als " "activiteit." #: /home/rafael/Activities/pippy/pippy_app.py:486 msgid "Creating example..." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:493 msgid "Save as Example Warning" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:494 msgid "This example already exists. Do you want to overwrite it?" msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:500 #: /home/rafael/Activities/pippy/pippy_app.py:556 msgid "Saved as example." msgstr "" #: /home/rafael/Activities/pippy/pippy_app.py:540 msgid "Activity saved to journal." msgstr "Activiteit is bewaard in je dagboek." #: /home/rafael/Activities/pippy/library/pippy/sound.py:48 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" "Kan TamTamEdit geluidsbibliotheek niet vinden. Heb je TamTamEdit " "geïnstalleerd?" #: /home/rafael/Activities/pippy/library/pippy/game.py:36 msgid "PAUSED" msgstr "GEPAUZEERD" #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "Installeer aub TamTamEdit's geluidsbibliotheek." #~ msgid "Run!" #~ msgstr "Uitvoeren!" #~ msgid "Stop!" #~ msgstr "Stoppen!" Pippy-46~dfsg/po/mvo.po0000644000000000000000000000444211710330413013722 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/cs.po0000644000000000000000000000460711710330413013531 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2011-04-14 03:46+0200\n" "Last-Translator: Chris \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.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s Pramen" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "" #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "_Zastavit" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "_Smazat" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s Činnost" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/mi.po0000644000000000000000000000444211710330413013526 0ustar rootroot# 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: 2011-03-04 00:46-0500\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.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:108 pippy_app.py:113 msgid "Edit" msgstr "" #: library/pippy/game.py:36 msgid "PAUSED" msgstr "" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "" #: pippy_app.py:134 msgid "r" msgstr "" #: pippy_app.py:147 msgid "_Stop" msgstr "" #: pippy_app.py:148 msgid "s" msgstr "" #: pippy_app.py:162 msgid "_Clear" msgstr "" #: pippy_app.py:163 msgid "c" msgstr "" #: pippy_app.py:192 msgid "Examples" msgstr "" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "" #: pippy_app.py:419 msgid "" "Please give your activity a meaningful name before attempting to save it as " "an activity." msgstr "" #: pippy_app.py:422 msgid "Ok" msgstr "" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "" #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "" Pippy-46~dfsg/po/tr.po0000644000000000000000000000545011710330413013546 0ustar rootroot# 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: 2011-03-04 00:46-0500\n" "PO-Revision-Date: 2011-02-16 02:45+0200\n" "Last-Translator: \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.1\n" #: activity/activity.info:2 msgid "Pippy" msgstr "Pippy" #: activity.py:49 #, python-format msgid "%s Source" msgstr "%s kaynak" #: activity.py:91 msgid "Copy selected text to clipboard" msgstr "seçilen metni panoya kopyalayınız." #: activity.py:96 pippy_app.py:108 pippy_app.py:113 msgid "Edit" msgstr "düzenleyiniz." #: library/pippy/game.py:36 msgid "PAUSED" msgstr "Ara" #: library/pippy/sound.py:47 msgid "Cannot find TamTamEdit sound library. Did you install TamTamEdit?" msgstr "" #: pippy_app.py:87 msgid "As Pippy Document" msgstr "Pippy dosyası olarak" #: pippy_app.py:94 msgid "As Activity Bundle" msgstr "aktivite kümesi olarak" #: pippy_app.py:106 msgid "Actions" msgstr "" #: pippy_app.py:133 msgid "_Run!" msgstr "çalıştırınız!" #: pippy_app.py:134 msgid "r" msgstr "r" #: pippy_app.py:147 msgid "_Stop" msgstr "_Dur" #: pippy_app.py:148 msgid "s" msgstr "s" #: pippy_app.py:162 msgid "_Clear" msgstr "_Temizle" #: pippy_app.py:163 msgid "c" msgstr "c" #: pippy_app.py:192 msgid "Examples" msgstr "örnekler" #: pippy_app.py:338 #, python-format msgid "%s Activity" msgstr "%s aktivite" #: pippy_app.py:418 msgid "Save as Activity Error" msgstr "aktivite hatası olarak kaydediniz." #: pippy_app.py:419 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:422 msgid "Ok" msgstr "tamam" #: pippy_app.py:428 msgid "Creating activity bundle..." msgstr "aktivite kümesi oluşturuluyor." #: pippy_app.py:491 msgid "Activity saved to journal." msgstr "aktivite günlüğe kaydedilmiştir." #~ msgid "Please install TamTamEdit's sound library." #~ msgstr "TamTamEdit'in ses kataloğunu yükleyiniz." Pippy-46~dfsg/groupthink/0000755000000000000000000000000011760470375014352 5ustar rootrootPippy-46~dfsg/groupthink/dbus_tools.py0000644000000000000000000000152711710330413017065 0ustar rootrootimport 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-46~dfsg/groupthink/listset.py0000644000000000000000000005657711710330413016416 0ustar rootroot""" 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-46~dfsg/groupthink/aatree.py0000644000000000000000000005360411710330413016154 0ustar rootrootclass 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-46~dfsg/groupthink/groupthink_base.py0000644000000000000000000020542611710330413020100 0ustar rootroot""" 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-46~dfsg/groupthink/sugar_tools.py0000644000000000000000000002732311710330413017253 0ustar rootroot# 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 sugar.activity.activity import Activity, ActivityToolbox from sugar.presence import presenceservice from sugar.presence.tubeconn import TubeConnection from sugar.graphics.window import Window import gtk import gobject import groupthink_base as groupthink OLD_TOOLBAR = False try: from sugar.graphics.toolbarbox import ToolbarBox, ToolbarButton from sugar.activity.widgets import ActivityToolbarButton except ImportError: OLD_TOOLBAR = True 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 if OLD_TOOLBAR: self.toolbox = ActivityToolbox(self) self.set_toolbox(self.toolbox) self.toolbox.show() self.set_toolbox(self.toolbox) else: toolbar_box = ToolbarBox() self.activity_button = ActivityToolbarButton(self) toolbar_box.toolbar.insert(self.activity_button, 0) self.set_toolbar_box(toolbar_box) v = gtk.VBox() self.startup_label = gtk.Label(self.message) v.pack_start(self.startup_label) 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(gtk.gdk.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() 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() pass 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.state == gtk.gdk.VISIBILITY_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-46~dfsg/groupthink/aatree_test.py0000644000000000000000000000034011710330413017200 0ustar rootrootfrom 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-46~dfsg/groupthink/gtk_tools.py0000644000000000000000000003125211710330413016713 0ustar rootrootimport 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): gtk.Entry.__init__(self, *args, **kargs) self.logger = logging.getLogger('RecentEntry') self.add_events(gtk.gdk.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.GenericTreeModel): 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())) 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): gtk.TextView.__init__(self, *args, **kargs) self._link = TextBufferSharePoint(self.get_buffer()) def set_handler(self, handler): self._link.set_handler(handler) Pippy-46~dfsg/groupthink/__init__.py0000644000000000000000000000003611710330413016441 0ustar rootrootfrom groupthink_base import * Pippy-46~dfsg/groupthink/stringtree.py0000644000000000000000000005327111710330413017101 0ustar rootrootimport 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-46~dfsg/setup.py0000755000000000000000000000147311710330413013661 0ustar rootroot#!/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 sugar.activity import bundlebuilder bundlebuilder.start() Pippy-46~dfsg/icons/0000755000000000000000000000000011760470375013273 5ustar rootrootPippy-46~dfsg/icons/run_bw.svg0000644000000000000000000000250111710330413015265 0ustar rootroot Pippy-46~dfsg/icons/pippy-export_doc.svg0000644000000000000000000001161311710330413017302 0ustar rootroot ]> Pippy-46~dfsg/icons/pippy-export_example.svg0000644000000000000000000000661211710330413020173 0ustar rootroot ]> Pippy-46~dfsg/icons/stopit_color.svg0000644000000000000000000000476411710330413016526 0ustar rootroot Pippy-46~dfsg/icons/stopit_bw.svg0000644000000000000000000000476411710330413016020 0ustar rootroot Pippy-46~dfsg/icons/eraser_color.svg0000644000000000000000000000316411710330413016456 0ustar rootroot Pippy-46~dfsg/icons/pippy-create_bundle.svg0000644000000000000000000000462711710330413017737 0ustar rootroot ]> Pippy-46~dfsg/icons/run_color.svg0000644000000000000000000000250111710330413015773 0ustar rootroot Pippy-46~dfsg/icons/eraser_bw.svg0000644000000000000000000000344511710330413015752 0ustar rootroot Pippy-46~dfsg/NEWS0000644000000000000000000001144611710330413012644 0ustar rootroot43 * 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-46~dfsg/pippy_app.py0000644000000000000000000010423211712011063014513 0ustar rootroot#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright (C) 2007,2008,2009 Chris Ball, based on Collabora's # "hellomesh" demo. # # 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 gtk import logging import pango import vte import re import os import gobject import time from port.style import font_zoom from signal import SIGTERM from gettext import gettext as _ from sugar.activity import activity from activity import ViewSourceActivity, TARGET_TYPE_TEXT from sugar.activity.activity import ActivityToolbox, \ EditToolbar, get_bundle_path, get_bundle_name from sugar.graphics import style from sugar.graphics.toolbutton import ToolButton import groupthink.sugar_tools import groupthink.gtk_tools text_buffer = None # magic prefix to use utf-8 source encoding PYTHON_PREFIX = """#!/usr/bin/python # -*- coding: utf-8 -*- """ OLD_TOOLBAR = False try: from sugar.graphics.toolbarbox import ToolbarBox, ToolbarButton from sugar.activity.widgets import StopButton except ImportError: OLD_TOOLBAR = True # get screen sizes SIZE_X = gtk.gdk.screen_width() SIZE_Y = gtk.gdk.screen_height() groupthink_mimetype = 'pickle/groupthink-pippy' class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): """Pippy Activity as specified in activity.info""" def early_setup(self): global text_buffer import gtksourceview2 text_buffer = gtksourceview2.Buffer() def initialize_display(self): self._logger = logging.getLogger('pippy-activity') # Activity toolbar with title input, share button and export buttons: if OLD_TOOLBAR: activity_toolbar = self.toolbox.get_activity_toolbar() else: activity_toolbar = self.activity_button.page # Hide keep button for Sugar versions prior to 0.94: activity_toolbar.keep.hide() separator = gtk.SeparatorToolItem() separator.show() activity_toolbar.insert(separator, -1) export_doc_button = ToolButton('pippy-export_doc') export_doc_button.set_tooltip(_("Export as Pippy Document")) export_doc_button.connect('clicked', self._export_document_cb) export_doc_button.show() activity_toolbar.insert(export_doc_button, -1) export_example_button = ToolButton('pippy-export_example') export_example_button.set_tooltip(_("Export as Pippy Example")) export_example_button.connect('clicked', self._export_example_cb) export_example_button.show() activity_toolbar.insert(export_example_button, -1) create_bundle_button = ToolButton('pippy-create_bundle') create_bundle_button.set_tooltip(_("Create Activity Bundle")) create_bundle_button.connect('clicked', self._create_bundle_cb) create_bundle_button.show() activity_toolbar.insert(create_bundle_button, -1) self._edit_toolbar = activity.EditToolbar() if OLD_TOOLBAR: activity_toolbar = gtk.Toolbar() self.toolbox.add_toolbar(_('Actions'), activity_toolbar) self.toolbox.set_current_toolbar(1) self.toolbox.add_toolbar(_('Edit'), self._edit_toolbar) else: edit_toolbar_button = ToolbarButton() edit_toolbar_button.set_page(self._edit_toolbar) edit_toolbar_button.props.icon_name = 'toolbar-edit' edit_toolbar_button.props.label = _('Edit') self.get_toolbar_box().toolbar.insert(edit_toolbar_button, -1) 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) if OLD_TOOLBAR: actions_toolbar = activity_toolbar else: actions_toolbar = self.get_toolbar_box().toolbar # The "go" button goicon_bw = gtk.Image() goicon_bw.set_from_file("%s/icons/run_bw.svg" % os.getcwd()) goicon_color = gtk.Image() goicon_color.set_from_file("%s/icons/run_color.svg" % os.getcwd()) gobutton = ToolButton(label=_("_Run!")) gobutton.props.accelerator = _('r') gobutton.set_icon_widget(goicon_bw) gobutton.set_tooltip("Run") gobutton.connect('clicked', self.flash_cb, dict({'bw': goicon_bw, 'color': goicon_color})) gobutton.connect('clicked', self.gobutton_cb) actions_toolbar.insert(gobutton, -1) # The "stop" button stopicon_bw = gtk.Image() stopicon_bw.set_from_file("%s/icons/stopit_bw.svg" % os.getcwd()) stopicon_color = gtk.Image() stopicon_color.set_from_file("%s/icons/stopit_color.svg" % os.getcwd()) stopbutton = ToolButton(label=_("_Stop")) stopbutton.props.accelerator = _('s') stopbutton.set_icon_widget(stopicon_bw) stopbutton.connect('clicked', self.flash_cb, dict({'bw': stopicon_bw, 'color': stopicon_color})) stopbutton.connect('clicked', self.stopbutton_cb) stopbutton.set_tooltip("Stop Running") actions_toolbar.insert(stopbutton, -1) # The "clear" button clearicon_bw = gtk.Image() clearicon_bw.set_from_file("%s/icons/eraser_bw.svg" % os.getcwd()) clearicon_color = gtk.Image() clearicon_color.set_from_file("%s/icons/eraser_color.svg" % os.getcwd()) clearbutton = ToolButton(label=_("_Clear")) clearbutton.props.accelerator = _('c') clearbutton.set_icon_widget(clearicon_bw) clearbutton.connect('clicked', self.clearbutton_cb) clearbutton.connect('clicked', self.flash_cb, dict({'bw': clearicon_bw, 'color': clearicon_color})) clearbutton.set_tooltip("Clear") actions_toolbar.insert(clearbutton, -1) activity_toolbar.show() if not OLD_TOOLBAR: 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) # Main layout. self.hpane = gtk.HPaned() self.vpane = gtk.VPaned() # The sidebar. self.sidebar = gtk.VBox() self.model = gtk.TreeStore(gobject.TYPE_PYOBJECT, gobject.TYPE_STRING) treeview = gtk.TreeView(self.model) cellrenderer = gtk.CellRendererText() treecolumn = gtk.TreeViewColumn(_("Examples"), cellrenderer, text=1) treeview.get_selection().connect("changed", self.selection_cb) treeview.append_column(treecolumn) treeview.set_size_request(int(SIZE_X * 0.3), SIZE_Y) # Create scrollbars around the view. scrolled = gtk.ScrolledWindow() scrolled.add(treeview) self.sidebar.pack_start(scrolled) self.hpane.add1(self.sidebar) root = os.path.join(get_bundle_path(), 'data') for d in sorted(os.listdir(root)): if not os.path.isdir(os.path.join(root, d)): continue # skip non-dirs direntry = {"name": _(d.capitalize()), "path": os.path.join(root, d) + "/"} olditer = self.model.insert_before(None, None) self.model.set_value(olditer, 0, direntry) self.model.set_value(olditer, 1, direntry["name"]) for _file in sorted(os.listdir(os.path.join(root, d))): if _file.endswith('~'): continue # skip emacs backups entry = {"name": _(_file.capitalize()), "path": os.path.join(root, d, _file)} _iter = self.model.insert_before(olditer, None) self.model.set_value(_iter, 0, entry) self.model.set_value(_iter, 1, entry["name"]) # Adding local examples root = os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'],'data') direntry_examples = { "name": _("My examples"), "path": root + "/" } self.example_iter = self.model.insert_before(None, None) self.model.set_value(self.example_iter, 0, direntry_examples) self.model.set_value(self.example_iter, 1, direntry_examples["name"]) for _file in sorted(os.listdir(root)): file_name = os.path.join(root, _file) if os.path.isfile(file_name): entry = {"name": _file, "path": file_name} _iter = self.model.insert_before(self.example_iter, None) self.model.set_value(_iter, 0, entry) self.model.set_value(_iter, 1, entry["name"]) treeview.expand_all() # Source buffer import gtksourceview2 global text_buffer lang_manager = gtksourceview2.language_manager_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) # The GTK source view window self.text_view = gtksourceview2.View(text_buffer) self.text_view.set_size_request(0, int(SIZE_Y * 0.5)) self.text_view.set_editable(True) self.text_view.set_cursor_visible(True) self.text_view.set_show_line_numbers(True) self.text_view.set_wrap_mode(gtk.WRAP_CHAR) self.text_view.set_insert_spaces_instead_of_tabs(True) self.text_view.set_tab_width(2) self.text_view.set_auto_indent(True) self.text_view.modify_font(pango.FontDescription("Monospace " + str(font_zoom(style.FONT_SIZE)))) # We could change the color theme here, if we want to. #mgr = gtksourceview2.style_manager_get_default() #style_scheme = mgr.get_scheme('kate') #self.text_buffer.set_style_scheme(style_scheme) codesw = gtk.ScrolledWindow() codesw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) codesw.add(self.text_view) self.vpane.add1(codesw) # An hbox to hold the vte window and its scrollbar. outbox = gtk.HBox() # The vte python window self._vte = vte.Terminal() self._vte.set_encoding('utf-8') self._vte.set_size(30, 5) font = 'Monospace ' + str(font_zoom(style.FONT_SIZE)) self._vte.set_font(pango.FontDescription(font)) self._vte.set_colors(gtk.gdk.color_parse('#000000'), gtk.gdk.color_parse('#E7E7E7'), []) self._vte.connect('child_exited', self.child_exited_cb) self._child_exited_handler = None self._vte.drag_dest_set(gtk.DEST_DEFAULT_ALL, [("text/plain", 0, TARGET_TYPE_TEXT)], gtk.gdk.ACTION_COPY) self._vte.connect('drag_data_received', self.vte_drop_cb) outbox.pack_start(self._vte) outsb = gtk.VScrollbar(self._vte.get_adjustment()) outsb.show() outbox.pack_start(outsb, False, False, 0) self.vpane.add2(outbox) self.hpane.add2(self.vpane) return self.hpane def when_shared(self): self.hpane.remove(self.hpane.get_child1()) global text_buffer self.cloud.sharefield = \ groupthink.gtk_tools.TextBufferSharePoint(text_buffer) # HACK : There are issues with undo/redoing while in shared # mode. So disable the 'undo' and 'redo' buttons when the activity # is shared. self._edit_toolbar.undo.set_sensitive(False) self._edit_toolbar.redo.set_sensitive(False) def vte_drop_cb(self, widget, context, x, y, selection, targetType, time): if targetType == TARGET_TYPE_TEXT: self._vte.feed_child(selection.data) def selection_cb(self, column): self.save() model, _iter = column.get_selected() value = model.get_value(_iter, 0) self._logger.debug("clicked! %s" % value['path']) _file = open(value['path'], 'r') lines = _file.readlines() global text_buffer text_buffer.set_text("".join(lines)) self.metadata['title'] = value['name'] self.stopbutton_cb(None) self._reset_vte() self.text_view.grab_focus() 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 clearbutton_cb(self, button): self.save() global text_buffer text_buffer.set_text("") self.metadata['title'] = _('%s Activity') % get_bundle_name() self.stopbutton_cb(None) self._reset_vte() self.text_view.grab_focus() def _write_text_buffer(self, filename): global text_buffer start, end = text_buffer.get_bounds() text = text_buffer.get_text(start, end) with open(filename, 'w') as f: # write utf-8 coding prefix if there's not already one 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 _reset_vte(self): self._vte.grab_focus() self._vte.feed("\x1B[H\x1B[J\x1B[0;39m") def __undobutton_cb(self, button): global text_buffer if text_buffer.can_undo(): text_buffer.undo() def __redobutton_cb(self, button): global text_buffer if text_buffer.can_redo(): text_buffer.redo() def __copybutton_cb(self, button): global text_buffer text_buffer.copy_clipboard(gtk.Clipboard()) def __pastebutton_cb(self, button): global text_buffer text_buffer.paste_clipboard(gtk.Clipboard(), None, True) def gobutton_cb(self, button): from shutil import copy2 self.stopbutton_cb(button) # try stopping old code first. self._reset_vte() # FIXME: We're losing an odd race here # gtk.main_iteration(block=False) pippy_app_name = '%s/tmp/pippy_app.py' % self.get_activity_root() self._write_text_buffer(pippy_app_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()) self._pid = self._vte.fork_command( command="/bin/sh", argv=["/bin/sh", "-c", "python %s; sleep 1" % pippy_app_name], envv=["PYTHONPATH=%s/library:%s" % (get_bundle_path(), os.getenv("PYTHONPATH", ""))], directory=get_bundle_path()) def stopbutton_cb(self, button): try: os.kill(self._pid, SIGTERM) except: pass # process must already be dead. def _export_document_cb(self, __): self.copy() def _create_bundle_cb(self, __): from shutil import copytree, copy2, rmtree from tempfile import mkdtemp # get the name of this pippy program. title = self.metadata['title'] if title == 'Pippy Activity': from sugar.graphics.alert import Alert from sugar.graphics.icon import Icon 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.RESPONSE_OK, _('Ok'), ok_icon) alert.connect('response', self.dismiss_alert_cb) self.add_alert(alert) return self.stopbutton_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. try: # write out application code self._write_text_buffer(sourcefile) # hook up a callback for when the bundle builder is done. # we can't use gobject.child_watch_add because vte will reap our # children before we can. self._child_exited_handler = \ lambda: self.bundle_cb(title, app_temp) # invoke bundle builder self._pid = self._vte.fork_command( command="/usr/bin/python", argv=["/usr/bin/python", "%s/pippy_app.py" % get_bundle_path(), '-p', '%s/library' % get_bundle_path(), '-d', app_temp, title, sourcefile], directory=app_temp) except: rmtree(app_temp, ignore_errors=True) # clean up! raise def _export_example_cb(self, __): # get the name of this pippy program. title = self.metadata['title'] if title == _('Pippy Activity'): from sugar.graphics.alert import Alert from sugar.graphics.icon import Icon 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.RESPONSE_OK, _('Ok'), ok_icon) alert.connect('response', self.dismiss_alert_cb) self.add_alert(alert) return self.stopbutton_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): from sugar.graphics.alert import ConfirmationAlert 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 sugar import profile from shutil import rmtree from sugar.datastore import datastore 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: self._logger.debug("Couldn't find bundle: %s" % str(bundle_file)) 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(): jobject.metadata[k] = v # the dict.update method is missing =( 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.RESPONSE_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): # def for add example 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 save_to_journal(self, file_path, cloudstring): _file = open(file_path, 'w') if not self._shared_activity: self.metadata['mime_type'] = 'text/x-python' global text_buffer start, end = text_buffer.get_bounds() text = text_buffer.get_text(start, end) _file.write(text) else: self.metadata['mime_type'] = groupthink_mimetype _file.write(cloudstring) def load_from_journal(self, file_path): if self.metadata['mime_type'] == 'text/x-python': text = open(file_path).read() # discard the '#!/usr/bin/python' and 'coding: utf-8' lines, # if present text = re.sub(r'^' + re.escape(PYTHON_PREFIX), '', text) global text_buffer text_buffer.set_text(text) elif self.metadata['mime_type'] == groupthink_mimetype: return open(file_path).read() ############# TEMPLATES AND INLINE FILES ############## ACTIVITY_INFO_TEMPLATE = """ [Activity] name = %(title)s bundle_id = %(bundle_id)s service_name = %(bundle_id)s class = %(class)s icon = activity-icon activity_version = %(version)d mime_types = %(mime_types)s show_launcher = yes %(extra_info)s """ PIPPY_ICON = \ """ ]> """ PIPPY_DEFAULT_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() extra['activity/activity-default.svg'] = PIPPY_DEFAULT_ICON 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 sugar import profile from sugar.activity import bundlebuilder import sys parser = OptionParser(usage='%prog [options] [title] [sourcefile]') 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) != 2: parser.error('The title and sourcefile arguments are required.') title = args[0] sourcefile = args[1] 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) # things we look for: bundle_info = { 'version': 1, 'extra_files': {}, 'news': 'No news.', 'icon': PIPPY_DEFAULT_ICON, 'class': 'activity.VteActivity', 'bundle_id': ('org.laptop.pippy.%s' % pytitle), '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) # write MANIFEST file. with open('%s/MANIFEST' % app_temp, 'w') as f: for dirpath, dirnames, filenames in sorted(os.walk(app_temp)): for name in sorted(filenames): fn = os.path.join(dirpath, name) fn = fn.replace(app_temp + '/', '') if fn == 'MANIFEST': continue f.write('%s\n' % fn) # invoke bundle builder olddir = os.getcwd() oldargv = sys.argv os.chdir(app_temp) sys.argv = ['setup.py', 'dist_xo'] bundlebuilder.start() sys.argv = oldargv os.chdir(olddir) # move to destination directory. copy2('%s/dist/%s-%d.xo' % (app_temp, pytitle, bundle_info['version']), '%s/%s-%d.xo' % (options.dir, pytitle, bundle_info['version'])) finally: rmtree(app_temp, ignore_errors=True) if __name__ == '__main__': from gettext import gettext as _ import sys 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-46~dfsg/.gitmodules0000644000000000000000000000000011710330413014302 0ustar rootrootPippy-46~dfsg/library/0000755000000000000000000000000011760470375013624 5ustar rootrootPippy-46~dfsg/library/pippy/0000755000000000000000000000000011760470375014765 5ustar rootrootPippy-46~dfsg/library/pippy/console.py0000644000000000000000000001230411710330413016760 0ustar rootroot"""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-46~dfsg/library/pippy/__init__.py0000644000000000000000000000206411710330413017057 0ustar rootroot# 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-46~dfsg/library/pippy/query.py0000644000000000000000000002636611710330413016500 0ustar rootroot# 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 self._dict.has_key(uid): 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-46~dfsg/library/pippy/sound.py0000755000000000000000000003056111717502257016474 0ustar rootroot#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright (C) 2007,2008 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 import errno import os import sys import sugar.env from gettext import gettext as _ from sugar.activity import activity path = activity.get_bundle_path() path = path.split("/")[0:-1] path = "/".join(path) for f in os.listdir(path): if f == 'TamTamEdit.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 ] orchlines = [] scorelines = [] instrlist = [] fnum = [100] """XXX: This function seems to be broken. (CSA) def quit(self): perf.Stop() perf.Join() cs.Reset() cs = None """ class SoundLibraryNotFoundError(Exception): def __init__(self): Exception.__init__(self, _('Cannot find TamTamEdit sound library.' ' Did you install TamTamEdit?')) def finddir(): 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 = finddir() + str(sound) if loop == False: lp = 0 else: lp = 1 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: from sugar import env temp_path = env.get_profile_path() + '/pippy' if not os.path.isdir(temp_path): os.mkdir(temp_path) path = temp_path csd = open(path + "/temp.csd", "w") csd.write("\n\n") csd.write("\n") if file == None: csd.write("-+rtaudio=alsa -odevaudio -m0 -d -b256 -B512\n") else: file = path + "/" + str(file) + ".wav" 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-46~dfsg/library/pippy/game.py0000644000000000000000000000615311710330413016234 0ustar rootroot"""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-46~dfsg/data/0000755000000000000000000000000011760470375013071 5ustar rootrootPippy-46~dfsg/data/graphics/0000755000000000000000000000000011760470375014671 5ustar rootrootPippy-46~dfsg/data/graphics/jump0000644000000000000000000000103211710330413015542 0ustar rootrootimport 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-46~dfsg/data/graphics/snow0000644000000000000000000000313711710330413015565 0ustar rootroot# 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-46~dfsg/data/graphics/tree0000644000000000000000000000357711710330413015546 0ustar rootroot# 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-46~dfsg/data/graphics/physics0000644000000000000000000000303011710330413016251 0ustar rootroot# 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-46~dfsg/data/graphics/life0000644000000000000000000000514511710330413015517 0ustar rootroot# -*- 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 """ rows = len(grid) cols = len(grid[1]) for x in range(rows): for y in range(cols): if grid[x][y] != 1: print '.', else: 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 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 """ rows = len(grid) cols = len(grid[1]) neighbors = 0 for x in range(rows): for y in range(cols): neighbors = CountNeighbors(grid, x, y) if grid[x][y] == 1: if neighbors < 2 or neighbors > 3: grid[x][y] = 0 else: if neighbors == 3: grid[x][y] = 1 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) 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, number, pulses) Pippy-46~dfsg/data/graphics/camera0000644000000000000000000000326311710330413016027 0ustar rootroot# 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-46~dfsg/data/graphics/pong0000644000000000000000000001300411710330413015534 0ustar rootroot# 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) # turn on key repeating (repeat 40 times per second) pygame.key.set_repeat(25, 25) # 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) step = 6 # paddle moves 3 pixels at a go # 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(3, 5), randint(3, 5)] 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() elif event.key == 273 \ or event.key == 265 \ or event.key == 264: # up paddle_location = paddle_location - step elif event.key == 274 \ or event.key == 259 \ or event.key == 258: # down paddle_location = paddle_location + step # 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() # 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-46~dfsg/data/graphics/bounce0000644000000000000000000000404011710330413016044 0ustar rootroot# 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-46~dfsg/data/graphics/lines0000644000000000000000000000557011710330413015714 0ustar rootroot# 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-46~dfsg/data/string/0000755000000000000000000000000011760470375014377 5ustar rootrootPippy-46~dfsg/data/string/thanks0000644000000000000000000001137611710330413015601 0ustar rootroottable = { '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..', '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..', '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..', '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', 'Country Support': 'Carla Gomez Monroy, David Cavallo, Matt Keller, Khaled Hassounah, Antonio Battro, Audrey Choi, Habib Kahn, Arnan (Roger) Sipitakiat', '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-46~dfsg/data/string/hello0000644000000000000000000000010611710330413015401 0ustar rootrootname = raw_input("Type your name here: ") print "Hello " + name + "!" Pippy-46~dfsg/data/string/jeringoso0000644000000000000000000000125611710330413016304 0ustar rootroot# 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-46~dfsg/data/math/0000755000000000000000000000000011760470375014022 5ustar rootrootPippy-46~dfsg/data/math/guess0000644000000000000000000000064011710330413015052 0ustar rootrootimport 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-46~dfsg/data/math/factorial0000644000000000000000000000211411710330413015666 0ustar rootrootimport 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-46~dfsg/data/math/times0000644000000000000000000000014711710330413015047 0ustar rootrootnumber = input('Which times table? ') for i in range(1, 13): print i, 'x', number, '=', i * number Pippy-46~dfsg/data/math/sierpinski0000644000000000000000000000106111710330413016102 0ustar rootroot# 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-46~dfsg/data/math/fibonacci0000644000000000000000000000007511710330413015643 0ustar rootroota, b = 0, 1 while b < 1001: print b, a, b = b, a + b Pippy-46~dfsg/data/math/pascal0000644000000000000000000000063311710330413015171 0ustar rootroot# 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-46~dfsg/data/python/0000755000000000000000000000000011760470375014412 5ustar rootrootPippy-46~dfsg/data/python/function0000644000000000000000000000006411710330413016141 0ustar rootrootdef square(x): print x * x square(3) square(4) Pippy-46~dfsg/data/python/interpreter0000644000000000000000000000007211710330413016656 0ustar rootrootimport code code.InteractiveConsole().interact(banner='') Pippy-46~dfsg/data/python/recursion0000644000000000000000000000042211710330413016323 0ustar rootrootdef 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-46~dfsg/data/python/if0000644000000000000000000000022611710330413014712 0ustar rootrootnumber = input('Enter a number: ') if number > 5: print 'Greater than 5' elif number < 5: print 'Less than 5' else: print 'Number is 5!' Pippy-46~dfsg/data/sound/0000755000000000000000000000000011760470375014221 5ustar rootrootPippy-46~dfsg/data/sound/playWave0000644000000000000000000000014411710330413015712 0ustar rootrootimport pippy pippy.sound.playWave(sound='didjeridu', loop=True, duration=5) pippy.sound.audioOut() Pippy-46~dfsg/data/sound/getSoundList0000644000000000000000000000007111710330413016545 0ustar rootrootimport pippy print " ".join(pippy.sound.getSoundList()) Pippy-46~dfsg/data/sound/sequence0000644000000000000000000000036011710330413015732 0ustar rootrootimport 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-46~dfsg/data/sound/playSine0000644000000000000000000000012611710330413015706 0ustar rootrootimport pippy pippy.sound.playSine(pitch=1000, amplitude=5000) pippy.sound.audioOut() Pippy-46~dfsg/MAINTAINERS0000644000000000000000000000014211710330413013631 0ustar rootroot2010-05-07: Anish Mangal Formerly: Brian Jordan