Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AUTHORS3
-rw-r--r--COPYING339
-rw-r--r--MANIFEST294
-rw-r--r--NEWS138
-rw-r--r--activity.py350
-rw-r--r--activity/activity-memorize.svg14
-rw-r--r--activity/activity.info9
-rw-r--r--activity/application-x-memorize-project.svg21
-rw-r--r--activity/mimetypes.xml9
-rw-r--r--audio.py62
-rw-r--r--audiograb.py491
-rw-r--r--cardlist.py408
-rw-r--r--cardtable.py288
-rw-r--r--config.py51
-rw-r--r--createcardpanel.py492
-rw-r--r--createtoolbar.py168
-rw-r--r--demos/addition.zipbin0 -> 372 bytes
-rw-r--r--demos/letters.zipbin0 -> 386 bytes
-rw-r--r--demos/sounds.zipbin0 -> 577355 bytes
-rw-r--r--face.py78
-rw-r--r--game.py386
-rw-r--r--icons/import_picture.svg111
-rw-r--r--icons/import_sensor.svg10
-rw-r--r--icons/import_sound.svg87
-rw-r--r--icons/pair-add.svg99
-rw-r--r--icons/pair-update.svg110
-rw-r--r--icons/speak.svg14
-rw-r--r--images/card.svg79
-rw-r--r--images/equal_pairs1.svg106
-rw-r--r--images/equal_pairs2.svg150
-rw-r--r--images/game-load.svg166
-rw-r--r--images/game-new.svg129
-rw-r--r--images/game-restart.svg130
-rw-r--r--images/game-save.svg164
-rw-r--r--images/score.svg81
-rw-r--r--images/stock-buddy.svg17
-rw-r--r--images/white.pngbin0 -> 269 bytes
-rw-r--r--locale/af/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/af/activity.linfo2
-rw-r--r--locale/am/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/am/activity.linfo2
-rw-r--r--locale/ar/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 3553 bytes
-rw-r--r--locale/ar/activity.linfo2
-rw-r--r--locale/ay/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1492 bytes
-rw-r--r--locale/ay/activity.linfo2
-rw-r--r--locale/bg/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 2043 bytes
-rw-r--r--locale/bg/activity.linfo2
-rw-r--r--locale/bi/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/bi/activity.linfo2
-rw-r--r--locale/bn/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/bn/activity.linfo2
-rw-r--r--locale/bn_IN/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 2020 bytes
-rw-r--r--locale/bn_IN/activity.linfo2
-rw-r--r--locale/ca/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1674 bytes
-rw-r--r--locale/ca/activity.linfo2
-rw-r--r--locale/cpp/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/cpp/activity.linfo2
-rw-r--r--locale/cs/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/cs/activity.linfo2
-rw-r--r--locale/de/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 2971 bytes
-rw-r--r--locale/de/activity.linfo2
-rw-r--r--locale/dz/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/dz/activity.linfo2
-rw-r--r--locale/el/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 2066 bytes
-rw-r--r--locale/el/activity.linfo2
-rw-r--r--locale/en/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/en/activity.linfo2
-rw-r--r--locale/es/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 3120 bytes
-rw-r--r--locale/es/activity.linfo2
-rw-r--r--locale/fa/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1896 bytes
-rw-r--r--locale/fa/activity.linfo2
-rw-r--r--locale/fa_AF/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 2000 bytes
-rw-r--r--locale/fa_AF/activity.linfo2
-rw-r--r--locale/ff/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/ff/activity.linfo2
-rw-r--r--locale/fil/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/fil/activity.linfo2
-rw-r--r--locale/fr/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 3206 bytes
-rw-r--r--locale/fr/activity.linfo2
-rw-r--r--locale/gu/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/gu/activity.linfo2
-rw-r--r--locale/ha/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/ha/activity.linfo2
-rw-r--r--locale/he/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/he/activity.linfo2
-rw-r--r--locale/hi/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/hi/activity.linfo2
-rw-r--r--locale/ht/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1631 bytes
-rw-r--r--locale/ht/activity.linfo2
-rw-r--r--locale/hu/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/hu/activity.linfo2
-rw-r--r--locale/ig/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/ig/activity.linfo2
-rw-r--r--locale/is/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/is/activity.linfo2
-rw-r--r--locale/it/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 3115 bytes
-rw-r--r--locale/it/activity.linfo2
-rw-r--r--locale/ja/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 2051 bytes
-rw-r--r--locale/ja/activity.linfo2
-rw-r--r--locale/km/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 2155 bytes
-rw-r--r--locale/km/activity.linfo2
-rw-r--r--locale/ko/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/ko/activity.linfo2
-rw-r--r--locale/kos/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 481 bytes
-rw-r--r--locale/kos/activity.linfo2
-rw-r--r--locale/mg/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/mg/activity.linfo2
-rw-r--r--locale/mk/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/mk/activity.linfo2
-rw-r--r--locale/ml/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/ml/activity.linfo2
-rw-r--r--locale/mn/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 3019 bytes
-rw-r--r--locale/mn/activity.linfo2
-rw-r--r--locale/mr/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 2138 bytes
-rw-r--r--locale/mr/activity.linfo2
-rw-r--r--locale/ms/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/ms/activity.linfo2
-rw-r--r--locale/mvo/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/mvo/activity.linfo2
-rw-r--r--locale/na/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/na/activity.linfo2
-rw-r--r--locale/nb/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1337 bytes
-rw-r--r--locale/nb/activity.linfo2
-rw-r--r--locale/ne/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 2004 bytes
-rw-r--r--locale/ne/activity.linfo2
-rw-r--r--locale/nl/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 3047 bytes
-rw-r--r--locale/nl/activity.linfo2
-rw-r--r--locale/pa/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/pa/activity.linfo2
-rw-r--r--locale/pap/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1603 bytes
-rw-r--r--locale/pap/activity.linfo2
-rw-r--r--locale/pis/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/pis/activity.linfo2
-rw-r--r--locale/pl/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/pl/activity.linfo2
-rw-r--r--locale/ps/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1795 bytes
-rw-r--r--locale/ps/activity.linfo2
-rw-r--r--locale/pt/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1637 bytes
-rw-r--r--locale/pt/activity.linfo2
-rw-r--r--locale/pt_BR/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1717 bytes
-rw-r--r--locale/pt_BR/activity.linfo2
-rw-r--r--locale/qu/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/qu/activity.linfo2
-rw-r--r--locale/ro/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/ro/activity.linfo2
-rw-r--r--locale/ru/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/ru/activity.linfo2
-rw-r--r--locale/rw/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1706 bytes
-rw-r--r--locale/rw/activity.linfo2
-rw-r--r--locale/sd/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/sd/activity.linfo2
-rw-r--r--locale/si/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 2506 bytes
-rw-r--r--locale/si/activity.linfo2
-rw-r--r--locale/sk/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/sk/activity.linfo2
-rw-r--r--locale/sl/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1578 bytes
-rw-r--r--locale/sl/activity.linfo2
-rw-r--r--locale/sq/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/sq/activity.linfo2
-rw-r--r--locale/sv/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1585 bytes
-rw-r--r--locale/sv/activity.linfo2
-rw-r--r--locale/sw/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/sw/activity.linfo2
-rw-r--r--locale/ta/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 4591 bytes
-rw-r--r--locale/ta/activity.linfo2
-rw-r--r--locale/te/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 2152 bytes
-rw-r--r--locale/te/activity.linfo2
-rw-r--r--locale/th/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/th/activity.linfo2
-rw-r--r--locale/tpi/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/tpi/activity.linfo2
-rw-r--r--locale/tr/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1628 bytes
-rw-r--r--locale/tr/activity.linfo2
-rw-r--r--locale/tvl/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/tvl/activity.linfo2
-rw-r--r--locale/tzo/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/tzo/activity.linfo2
-rw-r--r--locale/ug/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/ug/activity.linfo2
-rw-r--r--locale/ur/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1960 bytes
-rw-r--r--locale/ur/activity.linfo2
-rw-r--r--locale/vi/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 3249 bytes
-rw-r--r--locale/vi/activity.linfo2
-rw-r--r--locale/wa/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 407 bytes
-rw-r--r--locale/wa/activity.linfo2
-rw-r--r--locale/yo/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 404 bytes
-rw-r--r--locale/yo/activity.linfo2
-rw-r--r--locale/zh_CN/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1651 bytes
-rw-r--r--locale/zh_CN/activity.linfo2
-rw-r--r--locale/zh_TW/LC_MESSAGES/org.laptop.Memorize.mobin0 -> 1575 bytes
-rw-r--r--locale/zh_TW/activity.linfo2
-rw-r--r--memorize.dtd29
-rw-r--r--memorizetoolbar.py172
-rw-r--r--messenger.py232
-rw-r--r--model.py381
-rw-r--r--playerscoreboard.py169
-rw-r--r--po/Memorize.pot265
-rw-r--r--po/af.po117
-rw-r--r--po/am.po124
-rw-r--r--po/ar.po281
-rw-r--r--po/ay.po144
-rw-r--r--po/bg.po130
-rw-r--r--po/bi.po117
-rw-r--r--po/bn.po113
-rw-r--r--po/bn_IN.po125
-rw-r--r--po/ca.po126
-rw-r--r--po/cpp.po117
-rw-r--r--po/cs.po117
-rw-r--r--po/de.po285
-rw-r--r--po/dz.po124
-rw-r--r--po/el.po124
-rw-r--r--po/en.po124
-rw-r--r--po/es.po333
-rw-r--r--po/fa.po124
-rw-r--r--po/fa_AF.po123
-rw-r--r--po/ff.po124
-rw-r--r--po/fil.po261
-rw-r--r--po/fr.po299
-rw-r--r--po/gu.po129
-rw-r--r--po/ha.po124
-rw-r--r--po/he.po117
-rw-r--r--po/hi.po124
-rw-r--r--po/ht.po115
-rw-r--r--po/hu.po117
-rw-r--r--po/ig.po124
-rw-r--r--po/is.po124
-rw-r--r--po/it.po307
-rw-r--r--po/ja.po268
-rw-r--r--po/km.po116
-rw-r--r--po/ko.po124
-rw-r--r--po/kos.po266
-rw-r--r--po/mg.po117
-rw-r--r--po/mk.po124
-rw-r--r--po/ml.po124
-rw-r--r--po/mn.po276
-rw-r--r--po/mr.po112
-rw-r--r--po/ms.po117
-rw-r--r--po/mvo.po117
-rw-r--r--po/na.po117
-rw-r--r--po/nb.po122
-rw-r--r--po/ne.po118
-rw-r--r--po/nl.po297
-rw-r--r--po/pa.po124
-rw-r--r--po/pap.po116
-rw-r--r--po/pis.po117
-rw-r--r--po/pl.po124
-rw-r--r--po/ps.po125
-rw-r--r--po/pt.po115
-rw-r--r--po/pt_BR.po123
-rw-r--r--po/qu.po124
-rw-r--r--po/ro.po124
-rw-r--r--po/ru.po124
-rw-r--r--po/rw.po116
-rw-r--r--po/sd.po117
-rw-r--r--po/si.po121
-rw-r--r--po/sk.po117
-rw-r--r--po/sl.po116
-rw-r--r--po/sq.po117
-rw-r--r--po/sv.po116
-rw-r--r--po/sw.po117
-rw-r--r--po/ta.po291
-rw-r--r--po/te.po124
-rw-r--r--po/th.po124
-rw-r--r--po/tpi.po117
-rw-r--r--po/tr.po112
-rw-r--r--po/tvl.po261
-rw-r--r--po/tzo.po265
-rw-r--r--po/ug.po117
-rw-r--r--po/ur.po124
-rw-r--r--po/vi.po275
-rw-r--r--po/wa.po117
-rw-r--r--po/yo.po124
-rw-r--r--po/zh_CN.po123
-rw-r--r--po/zh_TW.po124
-rw-r--r--port/COPYING340
-rw-r--r--port/README18
-rw-r--r--port/__init__.py0
-rw-r--r--port/chooser.py68
-rw-r--r--port/widgets.py403
-rw-r--r--score.py71
-rw-r--r--scoreboard.py87
-rw-r--r--setup.py21
-rw-r--r--speak/COPYING674
-rw-r--r--speak/__init__.py0
-rw-r--r--speak/espeak.py118
-rw-r--r--speak/espeak_cmd.py64
-rw-r--r--speak/espeak_gst.py54
-rw-r--r--speak/eye.py157
-rw-r--r--speak/face.py184
-rw-r--r--speak/fft_mouth.py128
-rw-r--r--speak/glasses.py81
-rw-r--r--speak/mouth.py101
-rw-r--r--speak/voice.py134
-rw-r--r--speak/waveform_mouth.py80
-rw-r--r--speak/widgets.py48
-rw-r--r--svgcard.py407
-rw-r--r--svglabel.py99
-rw-r--r--theme.py28
298 files changed, 21400 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..09e8967
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,3 @@
+Simon Schampijer - simon@schampijer.de
+Muriel de Souza Godoi - muriel@laptop.org
+Nicholas Doiron - ndoiron@mapmeld.com
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+ 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 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.
+
+ <signature of Ty Coon>, 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.
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..0c7357d
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,294 @@
+svglabel.py
+model.py
+NEWS
+face.py
+playerscoreboard.py
+createtoolbar.py
+AUTHORS
+createcardpanel.py
+setup.py
+messenger.py
+memorizetoolbar.py
+theme.py
+cardlist.py
+COPYING
+game.py
+score.py
+svgcard.py
+cardtable.py
+scoreboard.py
+memorize.dtd
+audio.py
+activity.py
+locale/sd/activity.linfo
+locale/sd/LC_MESSAGES/org.laptop.Memorize.mo
+locale/nl/activity.linfo
+locale/nl/LC_MESSAGES/org.laptop.Memorize.mo
+locale/it/activity.linfo
+locale/it/LC_MESSAGES/org.laptop.Memorize.mo
+locale/fr/activity.linfo
+locale/fr/LC_MESSAGES/org.laptop.Memorize.mo
+locale/es/activity.linfo
+locale/es/LC_MESSAGES/org.laptop.Memorize.mo
+locale/dz/activity.linfo
+locale/dz/LC_MESSAGES/org.laptop.Memorize.mo
+locale/wa/activity.linfo
+locale/wa/LC_MESSAGES/org.laptop.Memorize.mo
+locale/bn/activity.linfo
+locale/bn/LC_MESSAGES/org.laptop.Memorize.mo
+locale/zh_TW/activity.linfo
+locale/zh_TW/LC_MESSAGES/org.laptop.Memorize.mo
+locale/km/activity.linfo
+locale/km/LC_MESSAGES/org.laptop.Memorize.mo
+locale/tr/activity.linfo
+locale/tr/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ta/activity.linfo
+locale/ta/LC_MESSAGES/org.laptop.Memorize.mo
+locale/qu/activity.linfo
+locale/qu/LC_MESSAGES/org.laptop.Memorize.mo
+locale/hi/activity.linfo
+locale/hi/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ht/activity.linfo
+locale/ht/LC_MESSAGES/org.laptop.Memorize.mo
+locale/tzo/activity.linfo
+locale/tzo/LC_MESSAGES/org.laptop.Memorize.mo
+locale/af/activity.linfo
+locale/af/LC_MESSAGES/org.laptop.Memorize.mo
+locale/tvl/activity.linfo
+locale/tvl/LC_MESSAGES/org.laptop.Memorize.mo
+locale/pap/activity.linfo
+locale/pap/LC_MESSAGES/org.laptop.Memorize.mo
+locale/bi/activity.linfo
+locale/bi/LC_MESSAGES/org.laptop.Memorize.mo
+locale/cs/activity.linfo
+locale/cs/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ko/activity.linfo
+locale/ko/LC_MESSAGES/org.laptop.Memorize.mo
+locale/bn_IN/activity.linfo
+locale/bn_IN/LC_MESSAGES/org.laptop.Memorize.mo
+locale/el/activity.linfo
+locale/el/LC_MESSAGES/org.laptop.Memorize.mo
+locale/sk/activity.linfo
+locale/sk/LC_MESSAGES/org.laptop.Memorize.mo
+locale/vi/activity.linfo
+locale/vi/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ru/activity.linfo
+locale/ru/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ro/activity.linfo
+locale/ro/LC_MESSAGES/org.laptop.Memorize.mo
+locale/mk/activity.linfo
+locale/mk/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ne/activity.linfo
+locale/ne/LC_MESSAGES/org.laptop.Memorize.mo
+locale/mvo/activity.linfo
+locale/mvo/LC_MESSAGES/org.laptop.Memorize.mo
+locale/is/activity.linfo
+locale/is/LC_MESSAGES/org.laptop.Memorize.mo
+locale/zh_CN/activity.linfo
+locale/zh_CN/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ig/activity.linfo
+locale/ig/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ay/activity.linfo
+locale/ay/LC_MESSAGES/org.laptop.Memorize.mo
+locale/sl/activity.linfo
+locale/sl/LC_MESSAGES/org.laptop.Memorize.mo
+locale/si/activity.linfo
+locale/si/LC_MESSAGES/org.laptop.Memorize.mo
+locale/sv/activity.linfo
+locale/sv/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ar/activity.linfo
+locale/ar/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ff/activity.linfo
+locale/ff/LC_MESSAGES/org.laptop.Memorize.mo
+locale/am/activity.linfo
+locale/am/LC_MESSAGES/org.laptop.Memorize.mo
+locale/gu/activity.linfo
+locale/gu/LC_MESSAGES/org.laptop.Memorize.mo
+locale/mr/activity.linfo
+locale/mr/LC_MESSAGES/org.laptop.Memorize.mo
+locale/cpp/activity.linfo
+locale/cpp/LC_MESSAGES/org.laptop.Memorize.mo
+locale/tpi/activity.linfo
+locale/tpi/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ha/activity.linfo
+locale/ha/LC_MESSAGES/org.laptop.Memorize.mo
+locale/hu/activity.linfo
+locale/hu/LC_MESSAGES/org.laptop.Memorize.mo
+locale/sq/activity.linfo
+locale/sq/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ms/activity.linfo
+locale/ms/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ug/activity.linfo
+locale/ug/LC_MESSAGES/org.laptop.Memorize.mo
+locale/sw/activity.linfo
+locale/sw/LC_MESSAGES/org.laptop.Memorize.mo
+locale/en/activity.linfo
+locale/en/LC_MESSAGES/org.laptop.Memorize.mo
+locale/rw/activity.linfo
+locale/rw/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ps/activity.linfo
+locale/ps/LC_MESSAGES/org.laptop.Memorize.mo
+locale/yo/activity.linfo
+locale/yo/LC_MESSAGES/org.laptop.Memorize.mo
+locale/pa/activity.linfo
+locale/pa/LC_MESSAGES/org.laptop.Memorize.mo
+locale/pl/activity.linfo
+locale/pl/LC_MESSAGES/org.laptop.Memorize.mo
+locale/de/activity.linfo
+locale/de/LC_MESSAGES/org.laptop.Memorize.mo
+locale/kos/activity.linfo
+locale/kos/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ja/activity.linfo
+locale/ja/LC_MESSAGES/org.laptop.Memorize.mo
+locale/pt/activity.linfo
+locale/pt/LC_MESSAGES/org.laptop.Memorize.mo
+locale/mg/activity.linfo
+locale/mg/LC_MESSAGES/org.laptop.Memorize.mo
+locale/he/activity.linfo
+locale/he/LC_MESSAGES/org.laptop.Memorize.mo
+locale/fa/activity.linfo
+locale/fa/LC_MESSAGES/org.laptop.Memorize.mo
+locale/bg/activity.linfo
+locale/bg/LC_MESSAGES/org.laptop.Memorize.mo
+locale/na/activity.linfo
+locale/na/LC_MESSAGES/org.laptop.Memorize.mo
+locale/pt_BR/activity.linfo
+locale/pt_BR/LC_MESSAGES/org.laptop.Memorize.mo
+locale/th/activity.linfo
+locale/th/LC_MESSAGES/org.laptop.Memorize.mo
+locale/fa_AF/activity.linfo
+locale/fa_AF/LC_MESSAGES/org.laptop.Memorize.mo
+locale/nb/activity.linfo
+locale/nb/LC_MESSAGES/org.laptop.Memorize.mo
+locale/fil/activity.linfo
+locale/fil/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ca/activity.linfo
+locale/ca/LC_MESSAGES/org.laptop.Memorize.mo
+locale/te/activity.linfo
+locale/te/LC_MESSAGES/org.laptop.Memorize.mo
+locale/mn/activity.linfo
+locale/mn/LC_MESSAGES/org.laptop.Memorize.mo
+locale/pis/activity.linfo
+locale/pis/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ml/activity.linfo
+locale/ml/LC_MESSAGES/org.laptop.Memorize.mo
+locale/ur/activity.linfo
+locale/ur/LC_MESSAGES/org.laptop.Memorize.mo
+images/game-load.svg
+images/equal_pairs2.svg
+images/equal_pairs1.svg
+images/stock-buddy.svg
+images/game-restart.svg
+images/game-new.svg
+images/score.svg
+images/white.png
+images/game-save.svg
+images/card.svg
+demos/sounds.zip
+demos/addition.zip
+demos/letters.zip
+port/README
+port/__init__.py
+port/widgets.py
+port/chooser.py
+port/COPYING
+speak/__init__.py
+speak/waveform_mouth.py
+speak/widgets.py
+speak/espeak_cmd.py
+speak/espeak_gst.py
+speak/face.py
+speak/fft_mouth.py
+speak/eye.py
+speak/voice.py
+speak/glasses.py
+speak/COPYING
+speak/espeak.py
+speak/mouth.py
+activity/application-x-memorize-project.svg
+activity/mimetypes.xml
+activity/activity.info
+activity/activity-memorize.svg
+icons/import_picture.svg
+icons/speak.svg
+icons/import_sound.svg
+icons/pair-update.svg
+icons/pair-add.svg
+po/he.po
+po/te.po
+po/km.po
+po/mr.po
+po/pt_BR.po
+po/ko.po
+po/dz.po
+po/ug.po
+po/fr.po
+po/af.po
+po/cs.po
+po/ay.po
+po/hu.po
+po/fa.po
+po/ht.po
+po/tr.po
+po/am.po
+po/ru.po
+po/tvl.po
+po/pa.po
+po/ml.po
+po/mk.po
+po/ig.po
+po/tpi.po
+po/sq.po
+po/sv.po
+po/fil.po
+po/de.po
+po/hi.po
+po/bn_IN.po
+po/es.po
+po/kos.po
+po/ur.po
+po/vi.po
+po/sk.po
+po/ar.po
+po/mn.po
+po/el.po
+po/bg.po
+po/yo.po
+po/sl.po
+po/bn.po
+po/tzo.po
+po/mg.po
+po/ha.po
+po/fa_AF.po
+po/ro.po
+po/qu.po
+po/zh_CN.po
+po/sd.po
+po/ta.po
+po/nb.po
+po/cpp.po
+po/wa.po
+po/mvo.po
+po/ms.po
+po/si.po
+po/ja.po
+po/it.po
+po/bi.po
+po/rw.po
+po/pap.po
+po/ps.po
+po/Memorize.pot
+po/ff.po
+po/pt.po
+po/is.po
+po/nl.po
+po/zh_TW.po
+po/pis.po
+po/ne.po
+po/gu.po
+po/ca.po
+po/pl.po
+po/sw.po
+po/en.po
+po/th.po
+po/na.po
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..a1ae258
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,138 @@
+34
+
+* Skip full flipping animation if second speaking card is correct
+* Typo in Memorize #1233
+* Can't play a shared memorize game #1503
+* Pass parent to ObjectChooser
+
+33
+
+* Add Speak feature, create speaking tiles
+* #1030 Fonts wrap on memorize tiles
+
+30
+
+* Make activity screen resolution independent
+* OLPC#6618 Update-pair-button's sensitivity reflects to selected pair
+* OLPC#5242 Suppress wrong positions in players list
+
+29
+
+28
+
+27
+
+26
+
+* Fix sound issue when using Memorize with non-US language more: #3165
+
+25
+
+* Add 43 .po and .mo files from pootle users
+
+24
+
+* Change temp folder permisson to allow activity access
+* Fix the mime-type folder location
+
+23
+
+* Add support do ogg Record files
+* Changed drumgit sound to 16KHz as ogg Record files
+* Add application-x-memorize-project mime-type icon
+
+22
+
+* Brought the drumgit game back (erikos)
+* Release sound device when not in focus (erikos)
+
+21
+
+* Temp folders changed for Rainbow compliance #4872, #5069
+* Fix in mode flag which was broken sharing mode #4752
+
+20
+
+* Changes to Memorize use environ['SUGAR_ACTIVITY_ROOT']
+
+19
+
+* New pot files for create game mode
+* Allow kids create their own games using text, audio and images #3311
+* When a player join an already started game, it receives the game state #3471
+* Added support to be able to play wav and aiff format (erikos)
+* Games tab renamed to Play (Muriel)
+* New icon and tooltip for reset game button #3965 (Muriel)
+* Only enable add-pair/update-pair buttons when the card has content (Muriel)
+* Import pictures and audio from journal (Muriel)
+* Create mode read/write in datastore (Muriel)
+* New memorize game file format based on zip file (Muriel)
+* New icons to create mode (Muriel)
+* New system to svgcards using cache, decreasing memory usage #3106 (Muriel)
+* Adopt to actvivity launch changes (erikos)
+* Start on game toolbar (erikos)
+* Do not set title #3061 (erikos)
+* Fix for memorize accepts clicks when it should not #3727 (erikos)
+
+18
+
+* Fix for #3160: all games have a complete 6x6 grid (Muriel)
+
+17
+
+* New activity icon, Fix for #2829 (erikos)
+
+16
+
+* Internacionalization for activity name, games tab, and standard game set names. Fix for #3068 (Muriel)
+* Card code cleaned and with some otmizations (Muriel)
+* Letters1 and Letters2 merged in Letters (Muriel)
+
+15
+
+* Fix for high memory consumption #3106
+ After deleting a pixbuf you have to call the garbage collector
+ manualy to free the memory.(erikos)
+
+* Only try to connect to presence service when offline.
+ Fix for #3099 (erikos)
+
+14
+
+13
+
+* Use sugar's tubeconn.py. (erikos)
+
+12
+
+* Removed absolute path for game icons and sounds
+which was cauing problems when a game is shared between
+an XO and a sugar-jhbuild emulator (erikos)
+
+* Free the audio device when not in focus (erikos)
+
+* Memorize now uses the ogg vorbis format to play sounds
+and shrinkd it's size by the factor of six (erikos)
+
+* Fix bugs on display back card labels and add code to consider text alignment (Muriel)
+
+* Fixes in the model for writing the game config to xml (erikos)
+
+* Changed the sounds to use 22Khz and converted them to ogg vorbis (erikos)
+
+* Added sound to the games: letters1, letters2, numbers and phonemes (Muriel)
+
+* New card text render and new game Capitals (Muriel)
+* Added global align parameter for text displayed on cards (Muriel)
+
+* Added support for sound to the memorize activity using csound (erikos)
+
+* Fixes for leaving and joining of buddies (erikos)
+* Added new model which handles config files for games in xml
+* Adopted the ui to use the model
+* Adopted the dbus methods to send the new grid when a game changes
+
+* Starting to merge the memosono game and the memorize game into one activity. (erikos)
+ Activity is known now as 'memorize'
+
+* First version of the collaborated memosono. (erikos)
diff --git a/activity.py b/activity.py
new file mode 100644
index 0000000..9dd3819
--- /dev/null
+++ b/activity.py
@@ -0,0 +1,350 @@
+# Copyright (C) 2006, 2007, 2008 One Laptop Per Child
+# Copyright (C) 2009 Simon Schampijer, Aleksey Lim
+#
+# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+from audiograb import AudioGrab
+from struct import unpack
+
+# activate threads for gst needs
+import gobject
+gobject.threads_init()
+
+import locale
+locale.setlocale(locale.LC_NUMERIC, 'C')
+
+import logging
+_logger = logging.getLogger('memorize-activity')
+
+from gettext import gettext as _
+from os.path import join, dirname
+
+import gtk
+import telepathy
+import telepathy.client
+
+from sugar.activity.activity import Activity, ActivityToolbox
+from sugar.presence import presenceservice
+from sugar.presence.tubeconn import TubeConnection
+
+from sugar import profile
+import cardtable
+import scoreboard
+import game
+import messenger
+import memorizetoolbar
+import createtoolbar
+import cardlist
+import createcardpanel
+import face
+
+SERVICE = 'org.laptop.Memorize'
+IFACE = SERVICE
+PATH = '/org/laptop/Memorize'
+
+_TOOLBAR_PLAY = 1
+_TOOLBAR_CREATE = 2
+
+class MemorizeActivity(Activity):
+
+ def __init__(self, handle):
+ Activity.__init__(self, handle)
+
+ self.create_load = False
+ self.play_mode = None
+ self.max_samples = 115
+ self.main_buffers = []
+ self.avg = 0
+
+ toolbox = ActivityToolbox(self)
+ activity_toolbar = toolbox.get_activity_toolbar()
+
+ self._memorizeToolbar = memorizetoolbar.MemorizeToolbar(self)
+ toolbox.add_toolbar(_('Play'), self._memorizeToolbar)
+ self._memorizeToolbar.show()
+
+ self._createToolbar = createtoolbar.CreateToolbar(self)
+ toolbox.add_toolbar(_('Create'), self._createToolbar)
+ self._createToolbar.show()
+
+ self.set_toolbox(toolbox)
+ toolbox.show()
+
+ # Play game mode
+ self.table = cardtable.CardTable()
+ self.scoreboard = scoreboard.Scoreboard()
+ self.game = game.MemorizeGame()
+
+ self.table.connect('key-press-event', self.table.key_press_event)
+ self.table.connect('card-flipped', self.game.card_flipped)
+ self.table.connect('card-overflipped', self.game.card_overflipped)
+ self.table.connect('card-highlighted', self.game.card_highlighted)
+
+ self.audiograb = AudioGrab(self.new_buffer,None)
+ self.audiograb.start_grabbing()
+ self.connect('destroy', self.audiograb.on_activity_quit)
+
+ self.game.connect('set-border', self.table.set_border)
+ self.game.connect('flop-card', self.table.flop_card)
+ self.game.connect('flip-card', self.table.flip_card)
+ self.game.connect('cement-card', self.table.cement_card)
+ self.game.connect('highlight-card', self.table.highlight_card)
+ self.game.connect('load_mode', self.table.load_msg)
+
+ self.game.connect('msg_buddy', self.scoreboard.set_buddy_message)
+ self.game.connect('add_buddy', self.scoreboard.add_buddy)
+ self.game.connect('rem_buddy', self.scoreboard.rem_buddy)
+ self.game.connect('increase-score', self.scoreboard.increase_score)
+ self.game.connect('wait_mode_buddy', self.scoreboard.set_wait_mode)
+ self.game.connect('change-turn', self.scoreboard.set_selected)
+ self.game.connect('change_game', self.scoreboard.change_game)
+
+ self.game.connect('reset_scoreboard', self.scoreboard.reset)
+ self.game.connect('reset_table', self.table.reset)
+
+ self.game.connect('load_game', self.table.load_game)
+ self.game.connect('change_game', self.table.change_game)
+ self.game.connect('load_game', self._memorizeToolbar.update_toolbar)
+ self.game.connect('change_game', self._memorizeToolbar.update_toolbar)
+
+ self._memorizeToolbar.connect('game_changed', self.game.change_game)
+
+ self.hbox = gtk.HBox(False)
+ self.set_canvas(self.hbox)
+
+ # connect to the in/out events of the memorize activity
+ self.connect('focus_in_event', self._focus_in)
+ self.connect('focus_out_event', self._focus_out)
+ self.connect('destroy', self._cleanup_cb)
+
+ self.add_events(gtk.gdk.POINTER_MOTION_MASK)
+ self.connect('motion_notify_event',
+ lambda widget, event: face.look_at())
+
+ # start on the game toolbar, might change this
+ # to the create toolbar later
+ self.toolbox.connect('current-toolbar-changed', self.change_mode)
+ self.toolbox.set_current_toolbar(_TOOLBAR_PLAY)
+
+ # Get the Presence Service
+ self.pservice = presenceservice.get_instance()
+ self.initiating = None
+
+ # Buddy object for you
+ owner = self.pservice.get_owner()
+ self.owner = owner
+ self.current = 0
+
+ self.game.set_myself(self.owner)
+ self.connect('shared', self._shared_cb)
+
+ # Owner.props.key
+ if self._shared_activity:
+ # We are joining the activity
+ self.connect('joined', self._joined_cb)
+ if self.get_shared():
+ # We've already joined
+ self._joined_cb()
+ else:
+ _logger.debug('buddy joined - __init__: %s', self.owner.props.nick)
+ game_file = join(dirname(__file__), 'demos', 'addition.zip')
+ self.game.load_game(game_file, 4, 'demo')
+ _logger.debug('loading conventional')
+ self.game.add_buddy(self.owner)
+ self.show_all()
+
+ def read_file(self, file_path):
+ if self.metadata['mime_type'] == 'application/x-memorize-project':
+ self.toolbox.set_current_toolbar(_TOOLBAR_PLAY)
+ if self.metadata.has_key('icon-color'):
+ color = self.metadata['icon-color']
+ else:
+ color = profile.get_color().to_string()
+ self.game.change_game(None, file_path, 4, 'file',
+ self.metadata['title'], color)
+
+ def new_buffer(self, buf):
+ buf = str(buf)
+ self.str_buffer = buf
+ tmp_val = self.max_samples - 1
+ self.integer_buffer = list(unpack(str(int(len(buf))/2)+'h',buf))
+ self.avg = self.integer_buffer[0]
+ if(len(self.main_buffers)>tmp_val):
+ del self.main_buffers[0:(len(self.main_buffers)-tmp_val)]
+ self.main_buffers += self.integer_buffer
+ if(self.table is not None):
+ self.table.trysensor(self.avg)
+ return True
+
+ def change_mode(self, notebook, index):
+ if index == _TOOLBAR_CREATE:
+ if not self.create_load:
+ # Create game mode
+ self.cardlist = cardlist.CardList()
+ self.createcardpanel = createcardpanel.CreateCardPanel(self)
+ self.createcardpanel.connect('add-pair', self.cardlist.add_pair)
+ self.createcardpanel.connect('update-pair',
+ self.cardlist.update_selected)
+ self.cardlist.connect('pair-selected',
+ self.createcardpanel.pair_selected)
+ self.cardlist.connect('update-create-toolbar',
+ self._createToolbar.update_create_toolbar)
+ self.cardlist.connect('update-create-buttons',
+ self._createToolbar.update_buttons_status)
+ self._createToolbar.connect('create_new_game',
+ self.cardlist.clean_list)
+ self._createToolbar.connect('create_new_game',
+ self.createcardpanel.clean)
+ self._createToolbar.connect('create_load_game',
+ self.cardlist.load_game)
+ self._createToolbar.connect('create_save_game',
+ self.cardlist.save_game)
+ self._createToolbar.connect('create_equal_pairs', \
+ self.createcardpanel.change_equal_pairs)
+ self.create_load = True
+
+ self.hbox.remove(self.scoreboard)
+ self.hbox.remove(self.table)
+ self.hbox.pack_start(self.createcardpanel, False)
+ self.hbox.pack_start(self.cardlist)
+ self.play_mode = False
+
+ else:
+ if self.play_mode == False:
+ self.hbox.remove(self.createcardpanel)
+ self.hbox.remove(self.cardlist)
+ if self.play_mode in (False, None):
+ self.hbox.pack_start(self.scoreboard)
+ self.hbox.pack_start(self.table, False)
+ self.play_mode = True
+
+ def restart(self, widget):
+ self.game.reset()
+
+ def change_game(self, game_name, size, title=None, color=None):
+ self.game.change_game(game_name, size, title, color)
+
+ def _shared_cb(self, activity):
+ _logger.debug('My activity was shared')
+ self.initiating = True
+ self._sharing_setup()
+
+ _logger.debug('This is my activity: making a tube...')
+ id_ = self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].OfferDBusTube(
+ SERVICE, {})
+
+ def _sharing_setup(self):
+ if self._shared_activity is None:
+ _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)
+
+ self._shared_activity.connect('buddy-joined', self._buddy_joined_cb)
+ self._shared_activity.connect('buddy-left', self._buddy_left_cb)
+
+ def _list_tubes_reply_cb(self, tubes):
+ for tube_info in tubes:
+ self._new_tube_cb(*tube_info)
+
+ def _list_tubes_error_cb(self, e):
+ _logger.error('ListTubes() failed: %s', e)
+
+ def _joined_cb(self, activity):
+ if not self._shared_activity:
+ return
+
+ _logger.debug('Joined an existing shared activity')
+
+ for buddy in self._shared_activity.get_joined_buddies():
+ if buddy != self.owner:
+ _logger.debug("buddy joined - _joined_cb: %s "
+ "(get buddies and add them to my list)",
+ buddy.props.nick)
+ self.game.add_buddy(buddy)
+
+ self.game.add_buddy(self.owner)
+ self.initiating = False
+ self._sharing_setup()
+
+ _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, identifier, initiator, tube_type, service,
+ params, state):
+ _logger.debug('New tube: ID=%d initator=%d type=%d service=%s '
+ 'params=%r state=%d', identifier, initiator, tube_type,
+ service, params, state)
+
+ if (tube_type == telepathy.TUBE_TYPE_DBUS and
+ service == SERVICE):
+ if state == telepathy.TUBE_STATE_LOCAL_PENDING:
+ self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].AcceptDBusTube( \
+ identifier)
+
+ self.tube_conn = TubeConnection(self.conn,
+ self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES], identifier,
+ group_iface=self.text_chan[telepathy.CHANNEL_INTERFACE_GROUP])
+
+ self.messenger = messenger.Messenger(self.tube_conn,
+ self.initiating,
+ self._get_buddy, self.game)
+ self.game.connect('flip-card-signal', self.messenger.flip_sender)
+ self.game.connect('change_game_signal', self.messenger.change_game)
+
+ def _get_buddy(self, cs_handle):
+ """Get a Buddy from a channel specific handle."""
+ group = self.text_chan[telepathy.CHANNEL_INTERFACE_GROUP]
+ my_csh = group.GetSelfHandle()
+ if my_csh == cs_handle:
+ handle = self.conn.GetSelfHandle()
+ else:
+ handle = group.GetHandleOwners([cs_handle])[0]
+ assert handle != 0
+ return self.pservice.get_buddy_by_telepathy_handle( \
+ self.tp_conn_name, self.tp_conn_path, handle)
+
+ def _buddy_joined_cb (self, activity, buddy):
+ if buddy != self.owner:
+ if buddy.props.nick == '':
+ _logger.debug("buddy joined: empty nick=%s. Will not add.",
+ buddy.props.nick)
+ else:
+ _logger.debug("buddy joined: %s", buddy.props.nick)
+ self.game.add_buddy(buddy)
+
+ def _buddy_left_cb (self, activity, buddy):
+ if buddy.props.nick == '':
+ _logger.debug("buddy joined: empty nick=%s. Will not remove",
+ buddy.props.nick)
+ else:
+ _logger.debug("buddy left: %s", buddy.props.nick)
+ self.game.rem_buddy(buddy)
+
+ def _focus_in(self, event, data=None):
+ self.game.audio.play()
+
+ def _focus_out(self, event, data=None):
+ self.game.audio.pause()
+
+ def _cleanup_cb(self, data=None):
+ self.game.audio.stop()
diff --git a/activity/activity-memorize.svg b/activity/activity-memorize.svg
new file mode 100644
index 0000000..4eaf312
--- /dev/null
+++ b/activity/activity-memorize.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#010101">
+ <!ENTITY fill_color "#FFFFFF">
+]><svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="activity-memorize">
+ <rect display="inline" fill="&stroke_color;" height="10" stroke="&stroke_color;" stroke-width="3.5" width="10" x="7.291" y="7.833"/>
+ <rect display="inline" fill="&fill_color;" height="10" stroke="&stroke_color;" stroke-width="3.5" width="10" x="22.625" y="7.833"/>
+ <rect display="inline" fill="&stroke_color;" height="10" stroke="&stroke_color;" stroke-width="3.5" width="10" x="37.375" y="7.833"/>
+ <rect display="inline" fill="&stroke_color;" height="10" stroke="&stroke_color;" stroke-width="3.5" width="10" x="7.291" y="22.75"/>
+ <rect display="inline" fill="&stroke_color;" height="10" stroke="&stroke_color;" stroke-width="3.5" width="10" x="22.625" y="22.75"/>
+ <rect display="inline" fill="&fill_color;" height="10" stroke="&stroke_color;" stroke-width="3.5" width="10" x="37.375" y="22.75"/>
+ <rect display="inline" fill="&fill_color;" height="10" stroke="&stroke_color;" stroke-width="3.5" width="10" x="7.291" y="37.625"/>
+ <rect display="inline" fill="&fill_color;" height="10" stroke="&stroke_color;" stroke-width="3.5" width="10" x="22.625" y="37.625"/>
+ <rect display="inline" fill="&fill_color;" height="10" stroke="&stroke_color;" stroke-width="3.5" width="10" x="37.375" y="37.625"/>
+</g></svg>
diff --git a/activity/activity.info b/activity/activity.info
new file mode 100644
index 0000000..260c7fe
--- /dev/null
+++ b/activity/activity.info
@@ -0,0 +1,9 @@
+[Activity]
+name = Memorize
+bundle_id = org.laptop.Memorize
+exec = sugar-activity activity.MemorizeActivity
+icon = activity-memorize
+activity_version = 38
+show_launcher = yes
+mime_types = application/x-memorize-project;
+license = GPLv2+
diff --git a/activity/application-x-memorize-project.svg b/activity/application-x-memorize-project.svg
new file mode 100644
index 0000000..a3c7ce0
--- /dev/null
+++ b/activity/application-x-memorize-project.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#010101">
+ <!ENTITY fill_color "#FFFFFF">
+]><svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="clipping-text">
+ <g display="inline">
+ <g>
+ <polygon fill="&fill_color;" points="10.932,6.088 31.874,6.088 43.818,18.027 43.818,48.914 10.932,48.914 " stroke="&stroke_color;" stroke-width="3.5"/>
+ <polyline fill="none" points="43.818,18.027 31.874,18.027 31.874,6.088 " stroke="&stroke_color;" stroke-width="3.5"/>
+
+ <rect display="inline" fill="&stroke_color;" height="5" stroke="&stroke_color;" stroke-width="2" width="5" x="17.291" y="22.833"/>
+ <rect display="inline" fill="&fill_color;" height="5" stroke="&stroke_color;" stroke-width="2" width="5" x="24.625" y="22.833"/>
+ <rect display="inline" fill="&stroke_color;" height="5" stroke="&stroke_color;" stroke-width="2" width="5" x="32.375" y="22.833"/>
+ <rect display="inline" fill="&stroke_color;" height="5" stroke="&stroke_color;" stroke-width="2" width="5" x="17.291" y="30.75"/>
+ <rect display="inline" fill="&stroke_color;" height="5" stroke="&stroke_color;" stroke-width="2" width="5" x="24.625" y="30.75"/>
+ <rect display="inline" fill="&fill_color;" height="5" stroke="&stroke_color;" stroke-width="2" width="5" x="32.375" y="30.75"/>
+ <rect display="inline" fill="&fill_color;" height="5" stroke="&stroke_color;" stroke-width="2" width="5" x="17.291" y="38.625"/>
+ <rect display="inline" fill="&fill_color;" height="5" stroke="&stroke_color;" stroke-width="2" width="5" x="24.625" y="38.625"/>
+ <rect display="inline" fill="&fill_color;" height="5" stroke="&stroke_color;" stroke-width="2" width="5" x="32.375" y="38.625"/>
+ </g>
+ </g>
+</g></svg> \ No newline at end of file
diff --git a/activity/mimetypes.xml b/activity/mimetypes.xml
new file mode 100644
index 0000000..f732fd0
--- /dev/null
+++ b/activity/mimetypes.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ <mime-type type="application/x-memorize-project">
+ <comment xml:lang="en">Memorize Game</comment>
+ <comment xml:lang="de">Merken Spiel</comment>
+ <glob pattern="*.memorize"/>
+ </mime-type>
+</mime-info>
+
diff --git a/audio.py b/audio.py
new file mode 100644
index 0000000..09522bb
--- /dev/null
+++ b/audio.py
@@ -0,0 +1,62 @@
+# Copyright (C) 2006, 2007, 2008 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import gst
+import logging
+
+_logger = logging.getLogger('memorize-activity')
+
+class Audio(object):
+ def __init__(self):
+ self._player = gst.element_factory_make('playbin', 'player')
+ fakesink = gst.element_factory_make('fakesink', 'my-fakesink')
+ self._player.set_property('video-sink', fakesink)
+ self._playing = None
+
+ bus = self._player.get_bus()
+ bus.add_signal_watch()
+ bus.connect('message', self._gstmessage_cb)
+
+ def play(self, filename=None):
+ if filename:
+ _logger.debug('play audio %s' % filename)
+ self._player.set_property('uri', 'file://' + filename)
+ self._player.set_state(gst.STATE_NULL)
+ elif self._playing == None:
+ return
+ else:
+ _logger.debug('continue audio')
+
+ self._player.set_state(gst.STATE_PLAYING)
+ self._playing = True
+
+ def pause(self):
+ if self._playing != None:
+ _logger.debug('pause audio')
+ self._player.set_state(gst.STATE_PAUSED)
+ self._playing = False
+
+ def stop(self):
+ self._player.set_state(gst.STATE_NULL)
+
+ def _gstmessage_cb(self, bus, message):
+ message_type = message.type
+
+ if message_type in (gst.MESSAGE_EOS, gst.MESSAGE_ERROR):
+ self._player.set_state(gst.STATE_NULL)
+ self._playing = None
+ _logger.debug('audio stoped with type %d' % message_type)
diff --git a/audiograb.py b/audiograb.py
new file mode 100644
index 0000000..519d68a
--- /dev/null
+++ b/audiograb.py
@@ -0,0 +1,491 @@
+#! /usr/bin/python
+#
+# Author: Arjun Sarwal arjun@laptop.org
+# Copyright (C) 2007, OLPC
+#
+#
+# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+import pygst
+pygst.require("0.10")
+import gst
+import gobject
+import os
+import subprocess
+from struct import unpack
+from string import find
+import config #This has all the globals
+
+
+class AudioGrab():
+
+
+ def __init__(self, callable1, journal):
+
+ self.callable1 = callable1
+ self.ji = journal
+
+ self.temp_buffer = []
+ self.picture_buffer = []
+
+ self.draw_graph_status = False
+ self.f = None
+ self.logging_status = False
+ self.screenshot = True
+
+ self.rate = 48000
+ self.final_count = 0
+ self.count_temp = 0
+ self.entry_count = 0
+
+
+ self.waveform_id = 1
+ self.logging_state = False
+ self.buffer_interval_logging = 0
+ self.counter_buffer = 0
+
+ ####Variables for saving and resuming state of sound device######
+ self.master = self.get_master()
+ self.PCM = self.get_PCM_gain()
+ self.mic = self.get_mic_gain()
+ self.bias = config.BIAS
+ self.dcmode = config.DC_MODE_ENABLE
+ self.capture_gain = config.CAPTURE_GAIN
+ self.mic_boost = config.MIC_BOOST
+ #################################################################
+
+
+ self.pipeline = gst.Pipeline("pipeline")
+ self.alsasrc = gst.element_factory_make("alsasrc", "alsa-source")
+ self.pipeline.add(self.alsasrc)
+ self.caps1 = gst.element_factory_make("capsfilter", "caps1")
+ self.pipeline.add(self.caps1)
+ caps_str = "audio/x-raw-int,rate=%d,channels=1,depth=16" % (config.RATE, )
+ self.caps1.set_property("caps", gst.caps_from_string(caps_str) )
+ self.fakesink = gst.element_factory_make("fakesink", "fsink")
+ self.pipeline.add(self.fakesink)
+ self.fakesink.connect("handoff", self.on_buffer)
+ self.fakesink.set_property("signal-handoffs",True)
+ gst.element_link_many(self.alsasrc, self.caps1, self.fakesink)
+
+
+ self.dont_queue_the_buffer = False
+
+
+ def set_handoff_signal(self, handoff_state):
+ """Sets whether the handoff signal would generate an interrupt or not"""
+ self.fakesink.set_property("signal-handoffs",handoff_state)
+
+ def _new_buffer(self,buf):
+ if self.dont_queue_the_buffer == False:
+ self.callable1(str(buf))
+ #print "$$audiograb:have just called callback to update buffer for drawing"
+ else:
+ pass
+ #print "$$audiograb:not queuing2"
+
+
+
+ def on_buffer(self, element, buffer, pad):
+ """The function that is called whenever new data is available
+ This is the signal handler for the handoff signal"""
+ self.temp_buffer = buffer
+ if self.dont_queue_the_buffer == False:
+ #gobject.timeout_add(config.AUDIO_BUFFER_TIMEOUT, self._new_buffer, self.temp_buffer)
+ self._new_buffer(self.temp_buffer)
+ else:
+ pass
+
+ if self.logging_state==True:
+ if self.waveform_id == config.SOUND_MAX_WAVE_LOGS:
+ self.waveform_id = 1
+ self.logging_state = False
+ #self.ji.stop_session()
+ else:
+ if self.counter_buffer == self.buffer_interval_logging:
+ #gobject.timeout_add(300, self._emit_for_logging, self.temp_buffer)
+ self._emit_for_logging(str(self.temp_buffer))
+ self.counter_buffer=0
+
+ self.counter_buffer+=1
+
+ if self.buffer_interval_logging ==0: #If a record is to be written, thats all for the logging session
+ self.logging_state = False
+ #self.ji.stop_session()
+ self.waveform_id = 1
+
+ return False
+
+
+ def set_freeze_the_display(self, freeze = False):
+ """Useful when just the display is needed to be frozen, but logging should continue"""
+ self.dont_queue_the_buffer = not freeze
+
+
+ def get_freeze_the_display(self):
+ """Returns state of queueing the buffer"""
+ return not self.dont_queue_the_buffer
+
+ def _emit_for_logging(self, buf):
+ """Sends the data for logging"""
+ if self.buffer_interval_logging==0:
+ #self.ji.write_record(self.picture_buffer)
+ #self.ji.take_screenshot()
+ self.ji = None
+ else:
+ if self.screenshot == True:
+ #self.ji.take_screenshot(self.waveform_id)
+ self.waveform_id+=1
+ else:
+ temp_buf = list(unpack( str(int(len(buf))/2)+'h' , buf))
+ #self.ji.write_value(temp_buf[0])
+
+
+ def start_sound_device(self):
+ """Start or Restart grabbing data from the audio capture"""
+ gst.event_new_flush_start()
+ self.pipeline.set_state(gst.STATE_PLAYING)
+
+
+ def stop_sound_device(self):
+ """Stop grabbing data from capture device"""
+ gst.event_new_flush_stop()
+ self.pipeline.set_state(gst.STATE_NULL)
+
+
+ def save_state(self):
+ """Saves the state of all audio controls"""
+ self.master = self.get_master()
+ self.PCM = self.get_PCM_gain()
+ self.mic = self.get_mic_gain()
+ self.bias = self.get_bias()
+ self.dcmode = self.get_dc_mode()
+ self.capture_gain = self.get_capture_gain()
+ self.mic_boost = self.get_mic_boost()
+
+ def resume_state(self):
+ """Put back all audio control settings from the saved state"""
+ self.set_master(self.master)
+ self.set_PCM_gain(self.PCM )
+ self.set_mic_gain(self.mic)
+ self.set_bias(self.bias)
+ self.set_dc_mode(self.dcmode)
+ self.set_capture_gain(self.capture_gain)
+ self.set_mic_boost(self.mic_boost)
+
+
+ def set_logging_params(self, start_stop=False, interval=0, screenshot = True):
+ """Configures for logging of data i.e. starts or stops a session
+ Sets an interval if logging interval is to be started
+ Sets if screenshot of waveform is to be taken or values need to be written"""
+ self.logging_state = start_stop
+ self.set_buffer_interval_logging(interval)
+ #if interval==0:
+ # self.take_picture()
+ self.reset_counter_buffer()
+ self.screenshot = screenshot
+
+ def take_picture(self):
+ """Used to grab and temporarily store the current buffer"""
+ self.picture_buffer = list(unpack( str(int(len(str(self.temp_buffer)))/2)+'h' , str(self.temp_buffer)))
+
+ def set_logging_state(self, start_stop=False):
+ """Sets whether buffer is to be emited for logging (True) or not (False)"""
+ self.logging_state = start_stop
+
+ def set_buffer_interval_logging(self, interval=0):
+ """Sets the number of buffers after which a buffer needs to be emitted"""
+ self.buffer_interval_logging = interval
+
+ def reset_counter_buffer(self):
+ """Resets the counter buffer used to keep track of after how many buffers to emit a buffer for logging"""
+ self.counter_buffer = 0
+
+
+ def mute_master(self):
+ """Mutes the Master Control"""
+ os.system("amixer set Master mute")
+
+ def unmute_master(self):
+ """Unmutes the Master Control"""
+ os.system("amixer set Master unmute")
+
+ def mute_PCM(self):
+ """Mutes the PCM Control"""
+ os.system("amixer set PCM mute")
+
+ def unmute_PCM(self):
+ """Unmutes the PCM Control"""
+ os.system("amixer set PCM unmute")
+
+ def mute_mic(self):
+ """Mutes the Mic Control"""
+ os.system("amixer set Mic mute")
+
+ def unmute_mic(self):
+ """Unmutes the Mic Control"""
+ os.system("amixer set Mic unmute")
+
+ def set_master(self, master_val ):
+ """Sets the Master gain slider settings
+ master_val must be given as an integer between 0 and 100 indicating the
+ percentage of the slider to be set"""
+ os.system("amixer set Master " + str(master_val) + "%")
+
+
+ def get_master(self):
+ """Gets the Master gain slider settings. The value returned is an integer between 0-100
+ and is an indicative of the percentage 0 - 100%"""
+ p = str(subprocess.Popen(["amixer", "get", "Master"], stdout=subprocess.PIPE).communicate()[0])
+ p = p[find(p,"Front Left:"):]
+ p = p[find(p,"[")+1:]
+ p = p[:find(p,"%]")]
+ return int(p)
+
+
+
+ def get_mix_for_recording(self):
+ """Returns True if Mix is set as recording device and False if it isn't """
+ p = str(subprocess.Popen(["amixer", "get", "Mix", "capture", "cap"], stdout=subprocess.PIPE).communicate()[0])
+ p = p[find(p,"Mono:"):]
+ p = p[find(p,"[")+1:]
+ p = p[:find(p,"]")]
+ if p=="on" :
+ return True
+ else:
+ return False
+
+
+ def get_mic_for_recording(self):
+ """Returns True if mic is set as recording device and False if it isn't """
+ p = str(subprocess.Popen(["amixer", "get", "Mic", "capture", "cap"], stdout=subprocess.PIPE).communicate()[0])
+ p = p[find(p,"Mono:"):]
+ p = p[find(p,"[")+1:]
+ p = p[:find(p,"]")]
+ if p=="on" :
+ return True
+ else:
+ return False
+
+ def set_mic_for_recording(self):
+ """Sets Mic as the default recording source"""
+ os.system("amixer set Mic capture cap")
+
+ def set_mix_for_recording(self):
+ """Sets Mix as the default recording source"""
+ os.system("amixer set Mix capture cap")
+
+
+ def set_bias(self,bias_state=False):
+ """Sets the Bias control
+ pass False to disable and True to enable"""
+ if bias_state==False:
+ bias_str="mute"
+ else:
+ bias_str="unmute"
+ os.system("amixer set 'V_REFOUT Enable' " + bias_str)
+
+ def get_bias(self):
+ """Returns the setting of Bias control
+ i.e. True: Enabled and False: Disabled"""
+ p = str(subprocess.Popen(["amixer", "get", "'V_REFOUT Enable'"], stdout=subprocess.PIPE).communicate()[0])
+ p = p[find(p,"Mono:"):]
+ p = p[find(p,"[")+1:]
+ p = p[:find(p,"]")]
+ if p=="on" :
+ return True
+ else:
+ return False
+
+ def set_dc_mode(self, dc_mode = False):
+ """Sets the DC Mode Enable control
+ pass False to mute and True to unmute"""
+ if dc_mode==False:
+ dcm_str="mute"
+ else:
+ dcm_str="unmute"
+ os.system("amixer set 'DC Mode Enable' " + dcm_str)
+
+ def get_dc_mode(self):
+ """Returns the setting of DC Mode Enable control
+ i .e. True: Unmuted and False: Muted"""
+ p = str(subprocess.Popen(["amixer", "get", "'DC Mode Enable'"], stdout=subprocess.PIPE).communicate()[0])
+ p = p[find(p,"Mono:"):]
+ p = p[find(p,"[")+1:]
+ p = p[:find(p,"]")]
+ if p=="on" :
+ return True
+ else:
+ return False
+
+ def set_mic_boost(self, mic_boost=False):
+ """Sets the Mic Boost +20dB control
+ pass False to mute and True to unmute"""
+ if mic_boost==False:
+ mb_str="mute"
+ else:
+ mb_str="unmute"
+ os.system("amixer set 'Mic Boost (+20dB)' " + mb_str)
+
+ def get_mic_boost(self):
+ """Returns the setting of Mic Boost +20dB control
+ i.e. True: Unmuted and False: Muted"""
+ p = str(subprocess.Popen(["amixer", "get", "'Mic Boost (+20dB)'"], stdout=subprocess.PIPE).communicate()[0])
+ p = p[find(p,"Mono:"):]
+ p = p[find(p,"[")+1:]
+ p = p[:find(p,"]")]
+ if p=="on" :
+ return True
+ else:
+ return False
+
+
+ def set_capture_gain(self, capture_val):
+ """Sets the Capture gain slider settings
+ capture_val must be given as an integer between 0 and 100 indicating the
+ percentage of the slider to be set"""
+ os.system("amixer set Capture " + str(capture_val) + "%")
+
+
+ def get_capture_gain(self):
+ """Gets the Capture gain slider settings. The value returned is an integer between 0-100
+ and is an indicative of the percentage 0 - 100%"""
+ p = str(subprocess.Popen(["amixer", "get", "Capture"], stdout=subprocess.PIPE).communicate()[0])
+ p = p[find(p,"Front Left:"):]
+ p = p[find(p,"[")+1:]
+ p = p[:find(p,"%]")]
+ return int(p)
+
+
+ def set_PCM_gain(self, PCM_val):
+ """Sets the PCM gain slider settings
+ PCM_val must be given as an integer between 0 and 100 indicating the
+ percentage of the slider to be set"""
+ os.system("amixer set PCM " + str(PCM_val) + "%")
+
+ def get_PCM_gain(self):
+ """Gets the PCM gain slider settings. The value returned is an indicative of the percentage 0 - 100%"""
+ p = str(subprocess.Popen(["amixer", "get", "PCM"], stdout=subprocess.PIPE).communicate()[0])
+ p = p[find(p,"Front Left:"):]
+ p = p[find(p,"[")+1:]
+ p = p[:find(p,"%]")]
+ return int(p)
+
+
+ def set_mic_gain(self, mic_val):
+ """Sets the MIC gain slider settings
+ mic_val must be given as an integer between 0 and 100 indicating the
+ percentage of the slider to be set"""
+ os.system("amixer set Mic " + str(mic_val) + "%")
+
+ def get_mic_gain(self):
+ """Gets the MIC gain slider settings. The value returned is an indicative of the percentage 0 - 100%"""
+ p = str(subprocess.Popen(["amixer", "get", "Mic"], stdout=subprocess.PIPE).communicate()[0])
+ p = p[find(p,"Mono:"):]
+ p = p[find(p,"[")+1:]
+ p = p[:find(p,"%]")]
+ return int(p)
+
+ def set_sampling_rate(self, sr):
+ """Sets the sampling rate of the capture device
+ Sampling rate must be given as an integer for example 16000 for setting 16Khz sampling rate
+ The sampling rate would be set in the device to the nearest available"""
+ self.pause_grabbing()
+ caps_str = "audio/x-raw-int,rate=%d,channels=1,depth=16" % (sr, )
+ self.caps1.set_property("caps", gst.caps_from_string(caps_str) )
+ self.resume_grabbing()
+
+
+ def get_sampling_rate(self):
+ """Gets the sampling rate of the capture device"""
+ return int(self.caps1.get_property("caps")[0]['rate'] )
+
+
+ def set_callable1(self, callable1):
+ """Sets the callable to the drawing function for giving the
+ data at the end of idle-add"""
+ self.callable1 = callable1
+
+
+ def set_sensor_type(self, sensor_type=1):
+ """Set the type of sensor you want to use. Set sensor_type according to the following
+ 0 - AC coupling with Bias Off --> Very rarely used. Use when connecting a dynamic microphone externally
+ 1 - AC coupling with Bias On --> The default settings. The internal MIC uses these
+ 2 - DC coupling with Bias Off --> Used when using a voltage output sensor. For example LM35 which gives output proportional to temperature
+ 3 - DC coupling with Bias On --> Used with resistive sensors. For example"""
+ if sensor_type==0:
+ self.set_dc_mode(False)
+ self.set_bias(False)
+ self.set_capture_gain(50)
+ self.set_mic_boost(True)
+ elif sensor_type==1:
+ self.set_dc_mode(False)
+ self.set_bias(True)
+ self.set_capture_gain(40)
+ self.set_mic_boost(True)
+ elif sensor_type==2:
+ self.set_dc_mode(True)
+ self.set_bias(False)
+ self.set_capture_gain(0)
+ self.set_mic_boost(False)
+ elif sensor_type==3:
+ self.set_dc_mode(True)
+ self.set_bias(True)
+ self.set_capture_gain(0)
+ self.set_mic_boost(False)
+
+
+ def start_grabbing(self):
+ """Called right at the start of the Activity"""
+ self.start_sound_device()
+ #self.set_handoff_signal(True)
+ ####Sound device settings at start####
+ self.set_sampling_rate(config.RATE)
+ self.set_mic_boost(config.MIC_BOOST)
+ self.set_dc_mode(config.DC_MODE_ENABLE)
+ self.set_capture_gain(config.CAPTURE_GAIN)
+ self.set_bias(config.BIAS)
+ ######################################
+
+
+
+ def pause_grabbing(self):
+ """When Activity goes into background"""
+ self.save_state()
+ self.stop_sound_device()
+
+ def resume_grabbing(self):
+ """When Activity becomes active after going to background"""
+ self.start_sound_device()
+ self.resume_state()
+
+
+ def stop_grabbing(self):
+ self.stop_sound_device()
+ self.set_handoff_signal(False)
+
+ def on_activity_quit(self, data=None):
+ """When Activity quits"""
+ self.set_mic_boost(config.QUIT_MIC_BOOST)
+ self.set_dc_mode(config.QUIT_DC_MODE_ENABLE)
+ self.set_capture_gain(config.QUIT_CAPTURE_GAIN)
+ self.set_bias(config.QUIT_BIAS)
+ self.set_PCM_gain(config.QUIT_PCM)
+ self.stop_sound_device()
+
+
+
+
+
diff --git a/cardlist.py b/cardlist.py
new file mode 100644
index 0000000..5b5793e
--- /dev/null
+++ b/cardlist.py
@@ -0,0 +1,408 @@
+# Copyright (C) 2006, 2007, 2008 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import gtk
+import svgcard
+import logging
+
+import os
+from os import environ
+from os.path import join
+
+import model
+import zipfile
+import tempfile
+from gobject import SIGNAL_RUN_FIRST, TYPE_PYOBJECT
+
+from sugar.graphics import style
+from sugar.graphics.icon import Icon
+
+import theme
+
+_logger = logging.getLogger('memorize-activity')
+
+class CardList(gtk.EventBox):
+
+ __gsignals__ = {
+ 'pair-selected': (SIGNAL_RUN_FIRST, None, 11 * [TYPE_PYOBJECT]),
+ 'update-create-toolbar': (SIGNAL_RUN_FIRST, None, 3 * [TYPE_PYOBJECT]),
+ 'update-create-buttons': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]),
+ }
+
+ def __init__(self):
+ gtk.EventBox.__init__(self)
+ self.model = model.Model()
+ self.pairs = []
+ self.current_pair = None
+ self.current_game_key = None
+
+ self.vbox = gtk.VBox(False)
+
+ fill_box = gtk.Label()
+ fill_box.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#000000'))
+ fill_box.show()
+ self.vbox.pack_end(fill_box, True, True)
+
+ scroll = gtk.ScrolledWindow()
+ scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ scroll.add_with_viewport(self.vbox)
+ scroll.set_border_width(0)
+ scroll.get_child().modify_bg(gtk.STATE_NORMAL,
+ gtk.gdk.color_parse('#000000'))
+ self.add(scroll)
+ self.show_all()
+
+ def load_game(self, widget, game_name):
+ self.model.read(game_name)
+ self.current_game_key = self.model.data['game_file']
+ self.emit('update-create-toolbar', self.model.data['name'],
+ self.model.data.get('equal_pairs', 'False'),
+ self.model.data.get('divided', '0'))
+ game_pairs = self.model.pairs
+ game_data = self.model.data
+ self.clean_list()
+ for key in game_pairs:
+ if game_pairs[key].props.aimg != None:
+ aimg = gtk.gdk.pixbuf_new_from_file( \
+ join(self.model.data['pathimg'],
+ game_pairs[key].props.aimg))
+ else:
+ aimg = None
+
+ if game_pairs[key].props.bimg != None:
+ bimg = gtk.gdk.pixbuf_new_from_file( \
+ join(self.model.data['pathimg'],
+ game_pairs[key].props.bimg))
+ else:
+ bimg = None
+
+ if game_pairs[key].props.asnd != None:
+ asnd = join(self.model.data['pathsnd'],
+ game_pairs[key].props.asnd)
+ else:
+ asnd = None
+
+ if game_pairs[key].props.bsnd != None:
+ bsnd = join(self.model.data['pathsnd'],
+ game_pairs[key].props.bsnd)
+ else:
+ bsnd = None
+
+ if game_pairs[key].props.asensor != None:
+ asensor = game_pairs[key].props.asensor
+ if game_pairs[key].props.bsensor != None:
+ bsensor = game_pairs[key].props.bsensor
+
+ self.add_pair(None, game_pairs[key].props.achar,
+ game_pairs[key].props.bchar, aimg, bimg, asnd, bsnd,
+ game_pairs[key].props.aspeak, game_pairs[key].props.bspeak,
+ game_pairs[key].props.asensor, game_pairs[key].props.bsensor,
+ False)
+
+ def save_game(self, widget, game_name, equal_pairs, grouped):
+
+ tmp_root = join(environ['SUGAR_ACTIVITY_ROOT'], 'instance')
+ temp_folder = tempfile.mkdtemp(dir=tmp_root)
+ os.chmod(temp_folder, 0777)
+ temp_img_folder = join(temp_folder, 'images')
+ temp_snd_folder = join(temp_folder, 'sounds')
+
+ os.makedirs(temp_img_folder)
+ os.makedirs(temp_snd_folder)
+
+ game_zip = zipfile.ZipFile(join(temp_folder, 'game.zip'), 'w')
+
+ game_model = model.Model(temp_folder)
+ game_model.data['name'] = game_name
+ for pair in range(len(self.pairs)):
+ pair_card = model.Pair()
+
+ # achar
+ achar = self.pairs[pair].get_text(1)
+ if achar != '':
+ pair_card.set_property('achar', achar)
+
+ # bchar
+ bchar = self.pairs[pair].get_text(2)
+ if bchar != '':
+ pair_card.set_property('bchar', bchar)
+
+ # aspeak
+ aspeak = self.pairs[pair].get_speak(1)
+ pair_card.set_property('aspeak', aspeak)
+
+ # bspeak
+ bspeak = self.pairs[pair].get_speak(2)
+ pair_card.set_property('bspeak', bspeak)
+
+ # aimg
+ aimg = self.pairs[pair].get_pixbuf(1)
+ if aimg != None:
+
+ if equal_pairs:
+ aimgfile = 'img' + str(pair) + '.jpg'
+ else:
+ aimgfile = 'aimg' + str(pair) + '.jpg'
+ aimg.save(join(temp_img_folder, aimgfile), 'jpeg',
+ {'quality':'85'})
+ game_zip.write(join(temp_img_folder, aimgfile),
+ join('images', aimgfile))
+ pair_card.set_property('aimg', aimgfile)
+
+ # bimg
+ bimg = self.pairs[pair].get_pixbuf(2)
+ if bimg != None:
+ if equal_pairs:
+ bimgfile = 'img' + str(pair) + '.jpg'
+ else:
+ bimgfile = 'bimg' + str(pair) + '.jpg'
+ bimg.save(join(temp_img_folder, bimgfile), 'jpeg',
+ {'quality':'85'})
+ game_zip.write(join(temp_img_folder, bimgfile),
+ join('images', bimgfile))
+ pair_card.set_property('bimg', bimgfile)
+ # asnd
+ asnd = self.pairs[pair].get_sound(1)
+ if asnd != None:
+ if equal_pairs:
+ asndfile = 'snd' + str(pair) + '.ogg'
+ else:
+ asndfile = 'asnd' + str(pair) + '.ogg'
+ _logger.error(asndfile + ': ' + asnd)
+ game_zip.write(asnd, join('sounds', asndfile))
+ pair_card.set_property('asnd', asndfile)
+
+ # bsnd
+ bsnd = self.pairs[pair].get_sound(2)
+ if bsnd != None:
+ if equal_pairs:
+ bsndfile = 'snd'+str(pair)+'.ogg'
+ else:
+ bsndfile = 'bsnd' + str(pair) + '.ogg'
+ game_zip.write(bsnd, join('sounds', bsndfile))
+ _logger.error(bsndfile + ': ' + bsnd)
+ pair_card.set_property('bsnd', bsndfile)
+
+ game_model.pairs[pair] = pair_card
+ game_model.write(equal_pairs, grouped)
+ game_zip.write(join(temp_folder, 'game.xml'), 'game.xml')
+ game_zip.close()
+ game_model.save_byte_array(join(temp_folder, 'game.zip'), game_name)
+
+ def clean_list(self, button = None):
+ if button != None:
+ self.current_game_key = None
+ map(lambda x: self.vbox.remove(x), self.pairs)
+ del self.pairs
+ self.pairs = []
+
+ def clean_tmp_folder(self, path):
+ for root, dirs, files in os.walk(path, topdown=False):
+ for name in files:
+ os.remove(join(root, name))
+ for name in dirs:
+ os.rmdir(join(root, name))
+ os.rmdir(path)
+
+ def trysensor(self, avg):
+ for pair in self.pairs:
+ if(abs(avg-int(pair.asensor)) < 100):
+ self.bcard1.set_sensor(pair.asensor)
+ elif(abs(avg-int(pair.bsensor)) < 100):
+ self.bcard2.set_sensor(pair.bsensor)
+
+ def add_pair(self, widget, achar, bchar, aimg, bimg, asnd, bsnd,
+ aspeak, bspeak, asensor, bsensor, show = True):
+ pair = Pair(achar, bchar, aimg, bimg, asnd, bsnd, aspeak, bspeak, asensor, bsensor)
+ self.vbox.pack_end(pair, False, True)
+ self.pairs.append(pair)
+ pair.connect('pair-selected', self.set_selected)
+ pair.connect('pair-closed', self.rem_pair)
+ self.emit('update-create-buttons', True, True)
+ if show:
+ self.show_all()
+
+ def rem_pair(self, widget, event):
+ self.vbox.remove(widget)
+ self.pairs.remove(widget)
+ del widget
+ self.emit('update-create-buttons', True, True)
+ self.emit('pair-selected', False, None, None, None, None, None, None,
+ False, False, False, False)
+
+ def set_selected(self, widget, event):
+ if self.current_pair is not None:
+ current_pair = self.current_pair
+ current_pair.set_selected(False)
+ self.current_pair = widget
+ widget.set_selected(True)
+ self.emit('pair-selected', True,
+ self.current_pair.get_text(1), self.current_pair.get_text(2),
+ self.current_pair.get_pixbuf(1), self.current_pair.get_pixbuf(2),
+ self.current_pair.get_sound(1), self.current_pair.get_sound(2),
+ self.current_pair.get_speak(1), self.current_pair.get_speak(2),
+ self.current_pair.get_sensor(1), self.current_pair.get_sensor(2))
+
+ def update_selected(self, widget, newtext1, newtext2, aimg, bimg,
+ asnd, bsnd, aspeak, bspeak, asensor, bsensor):
+ self.current_pair.change_text(newtext1, newtext2)
+ self.current_pair.change_pixbuf(aimg, bimg)
+ self.current_pair.change_sound(asnd, bsnd)
+ self.current_pair.change_speak(aspeak, bspeak)
+ self.current_pair.change_sensor(asensor, bsensor)
+
+ self.emit('update-create-buttons', True, True)
+
+class Pair(gtk.EventBox):
+
+ __gsignals__ = {
+ 'pair-selected': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
+ 'pair-closed': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
+ }
+
+ def __init__(self, text1, text2 = None, aimg = None, bimg = None,
+ asnd = None, bsnd = None, aspeak=None, bspeak=None, asensor=None, bsensor=None):
+ gtk.EventBox.__init__(self)
+ self.bg_color = '#000000'
+
+ self.asnd = asnd
+ self.bsnd = bsnd
+ self.asensor = asensor
+ self.bsensor = bsensor
+
+ self.current_game_key = None
+
+ row = gtk.HBox()
+ row.props.border_width = 10
+ row.props.spacing = 10
+
+ self.bcard1 = svgcard.SvgCard(-1,
+ { 'front_text' : { 'card_text' : text1,
+ 'speak' : aspeak,
+ 'text_color' : '#ffffff' },
+ 'front' : { 'fill_color' : '#4c4d4f',
+ 'stroke_color' : '#ffffff',
+ 'opacity' : '1' } },
+ None, theme.PAIR_SIZE, 1, self.bg_color)
+ self.bcard1.flip()
+ self.bcard1.set_pixbuf(aimg)
+ self.bcard1.set_sensor(asensor)
+ align = gtk.Alignment(.5, .5, 0, 0)
+ align.add(self.bcard1)
+ row.pack_start(align)
+
+ self.bcard2 = svgcard.SvgCard(-1,
+ { 'front_text' : { 'card_text' : text2,
+ 'speak' : bspeak,
+ 'text_color' : '#ffffff' },
+ 'front' : { 'fill_color' : '#4c4d4f',
+ 'stroke_color' : '#ffffff',
+ 'opacity' : '1' } },
+ None, theme.PAIR_SIZE, 1, self.bg_color)
+ self.bcard2.flip()
+ self.bcard2.set_pixbuf(bimg)
+ self.bcard2.set_sensor(bsensor)
+ align = gtk.Alignment(.5, .5, 0, 0)
+ align.add(self.bcard2)
+ row.pack_start(align)
+
+ close_image = Icon(
+ icon_name='remove',
+ icon_size=gtk.ICON_SIZE_LARGE_TOOLBAR)
+ align = gtk.Alignment(.5, .5)
+ align.add(close_image)
+ close_button = gtk.ToolButton()
+ close_button.set_icon_widget(align)
+ close_button.connect('clicked', self.emit_close)
+ close_button.set_size_request(style.STANDARD_ICON_SIZE,
+ style.STANDARD_ICON_SIZE)
+ align = gtk.Alignment(.5, 0, 0, 0)
+ align.add(close_button)
+ row.pack_start(align, False)
+
+ self.connect('button-press-event', self.emit_selected)
+ self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self.bg_color))
+ self.add(row)
+ self.show_all()
+
+ def emit_selected(self, widget, event):
+ self.emit('pair-selected', self)
+
+ def emit_close(self, widget):
+ self.emit('pair-closed', self)
+
+ def set_selected(self, status):
+ if not status:
+ self.bg_color = '#000000'
+ else:
+ self.bg_color = '#b2b3b7'
+
+ self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self.bg_color))
+ self.bcard1.set_background(self.bg_color)
+ self.bcard2.set_background(self.bg_color)
+
+ def change_pixbuf(self, aimg, bimg):
+ self.bcard1.set_pixbuf(aimg)
+ self.bcard2.set_pixbuf(bimg)
+
+ def change_text(self, text1, text2):
+ self.bcard1.change_text(text1)
+ self.bcard2.change_text(text2)
+
+ def change_sound(self, asnd, bsnd):
+ self.asnd = asnd
+ self.bsnd = bsnd
+
+ def change_sensor(self, asensor, bsensor):
+ self.asensor = asensor
+ self.bcard1.set_sensor(asensor)
+ self.bsensor = bsensor
+ self.bcard2.set_sensor(bsensor)
+
+ def get_text(self, card):
+ if card == 1:
+ return self.bcard1.get_text()
+ else:
+ return self.bcard2.get_text()
+
+ def change_speak(self, aspeak, bspeak):
+ self.bcard1.change_speak(aspeak)
+ self.bcard2.change_speak(bspeak)
+
+ def get_speak(self, card):
+ if card == 1:
+ return self.bcard1.get_speak()
+ else:
+ return self.bcard2.get_speak()
+
+ def get_pixbuf(self, card):
+ if card == 1:
+ return self.bcard1.get_pixbuf()
+ else:
+ return self.bcard2.get_pixbuf()
+
+ def get_sound(self, card):
+ if card == 1:
+ return self.asnd
+ else:
+ return self.bsnd
+
+ def get_sensor(self, card):
+ if card == 1:
+ return self.asensor
+ else:
+ return self.bsensor
diff --git a/cardtable.py b/cardtable.py
new file mode 100644
index 0000000..4eca7eb
--- /dev/null
+++ b/cardtable.py
@@ -0,0 +1,288 @@
+# Copyright (C) 2006, 2007, 2008 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import gtk
+import pango
+import svgcard
+import os
+import math
+import gc
+from gobject import SIGNAL_RUN_FIRST, TYPE_PYOBJECT
+
+import logging
+_logger = logging.getLogger('memorize-activity')
+
+import theme
+
+class CardTable(gtk.EventBox):
+
+ __gsignals__ = {
+ 'card-flipped': (SIGNAL_RUN_FIRST, None, [int, TYPE_PYOBJECT]),
+ 'card-overflipped': (SIGNAL_RUN_FIRST, None, [int]),
+ 'card-highlighted': (SIGNAL_RUN_FIRST, None, [int, TYPE_PYOBJECT]),
+ }
+
+ def __init__(self):
+ gtk.EventBox.__init__(self)
+ self.data = None
+ self.cards_data = None
+ self._workspace_size = 0
+ self.lastcard = None
+
+ # set request size to 100x100 to skip first time sizing in _allocate_cb
+ self.set_size_request(100, 100)
+ self.connect('size-allocate', self._allocate_cb)
+
+ # Set table settings
+ self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#000000'))
+ self.table = gtk.Table()
+ self.table.grab_focus()
+ self.table.set_flags(gtk.CAN_FOCUS)
+ self.table.set_flags(gtk.CAN_DEFAULT)
+ self.table.set_row_spacings(theme.CARD_PAD)
+ self.table.set_col_spacings(theme.CARD_PAD)
+ self.table.set_border_width(theme.CARD_PAD)
+ self.table.set_resize_mode(gtk.RESIZE_IMMEDIATE)
+ self.set_property('child', self.table)
+ self.load_message = gtk.Label('Loading Game')
+ self.load_message.modify_fg(gtk.STATE_NORMAL,
+ gtk.gdk.color_parse('#ffffff'))
+ self.load_message.modify_font(pango.FontDescription("10"))
+ self.load_message.show()
+ self.first_load = True
+ self.load_mode = False
+ self.dict = None
+ self.show_all()
+
+ def _allocate_cb(self, widget, allocation):
+ size = allocation.height
+
+ if size == 100:
+ # skip first time sizing
+ return
+
+ # do it once
+ if self._workspace_size:
+ return
+
+ _logger.debug('Use %s allocation' % str(self.allocation))
+
+ self.set_size_request(size, size)
+ self._workspace_size = size
+ if self.data:
+ self.load_game(None, self.data, self.cards_data)
+
+ def load_game(self, widget, data, grid):
+ self.data = data
+ self.cards_data = grid
+
+ if self._workspace_size == 0:
+ # widow is not allocated, thus postpone loading
+ return
+
+ self.size = int(math.ceil(math.sqrt(len(grid))))
+ if self.size < 4:
+ self.size = 4
+ self.table.resize(self.size, self.size)
+ self.card_size = self.get_card_size(self.size)
+ self.cards = {}
+ self.cd2id = {}
+ self.id2cd = {}
+ self.dict = {}
+ self.selected_card = [0, 0]
+ self.flipped_card = -1
+ self.table_positions = {}
+
+ # Build the table
+ if data['divided'] == '1':
+ text1 = str(self.data.get('face1', ''))
+ text2 = str(self.data.get('face2', ''))
+ else:
+ text1 = str(self.data.get('face', ''))
+ text2 = str(self.data.get('face', ''))
+
+ x = 0
+ y = 0
+ identifier = 0
+
+ for card in self.cards_data:
+ if card.get('img', None):
+ jpg = os.path.join(self.data['pathimg'], card['img'])
+ else:
+ jpg = None
+ props = {}
+ props['front_text'] = {'card_text':card.get('char', ''),
+ 'speak': card.get('speak')}
+
+ if card['ab'] == 'a':
+ props['back_text'] = {'card_text':text1}
+ elif card['ab'] == 'b':
+ props['back_text'] = {'card_text':text2}
+
+ align = self.data.get('align', '1')
+ try:
+ sensor = card.get('sensor')
+ except:
+ sensor = None
+ card = svgcard.SvgCard(identifier, props, jpg,
+ self.card_size, align, sensor)
+ card.connect('enter-notify-event', self.mouse_event, [x, y])
+ card.connect("button-press-event", self.flip_card_mouse, identifier)
+ self.table_positions[(x, y)] = 1
+ self.cd2id[card] = identifier
+ self.id2cd[identifier] = card
+ self.cards[(x, y)] = card
+ self.dict[identifier] = (x, y)
+ self.table.attach(card, x, x+1, y, y+1, gtk.SHRINK, gtk.SHRINK)
+
+ x += 1
+ if x == self.size:
+ x = 0
+ y += 1
+ identifier += 1
+ self.first_load = False
+ if self.load_mode:
+ self._set_load_mode(False)
+ self.show_all()
+ #gc.collect()
+
+ def change_game(self, widget, data, grid):
+ if not self.first_load:
+ for card in self.cards.values():
+ self.table.remove(card)
+ del card
+ #gc.collect()
+ self.load_game(None, data, grid)
+
+ def get_card_size(self, size_table):
+ x = (self._workspace_size + theme.CARD_PAD * (size_table-1)) / \
+ size_table - theme.CARD_PAD * 2
+ return x
+
+ def mouse_event(self, widget, event, coord):
+ #self.table.grab_focus()
+ card = self.cards[coord[0], coord[1]]
+ identifier = self.cd2id.get(card)
+ self.emit('card-highlighted', identifier, True)
+ self.selected_card = (coord[0], coord[1])
+
+ def key_press_event(self, widget, event):
+ #self.table.grab_focus()
+ x = self.selected_card[0]
+ y = self.selected_card[1]
+
+ if event.keyval in (gtk.keysyms.Left, gtk.keysyms.KP_Left):
+ if self.table_positions.has_key((x-1, y)):
+ card = self.cards[x-1, y]
+ identifier = self.cd2id.get(card)
+ self.emit('card-highlighted', identifier, False)
+
+ elif event.keyval in (gtk.keysyms.Right, gtk.keysyms.KP_Right):
+ if self.table_positions.has_key((x+1, y)):
+ card = self.cards[x+1, y]
+ identifier = self.cd2id.get(card)
+ self.emit('card-highlighted', identifier, False)
+
+ elif event.keyval in (gtk.keysyms.Up, gtk.keysyms.KP_Up):
+ if self.table_positions.has_key((x, y-1)):
+ card = self.cards[x, y-1]
+ identifier = self.cd2id.get(card)
+ self.emit('card-highlighted', identifier, False)
+
+ elif event.keyval in (gtk.keysyms.Down, gtk.keysyms.KP_Down):
+ if self.table_positions.has_key((x, y+1)):
+ card = self.cards[x, y+1]
+ identifier = self.cd2id.get(card)
+ self.emit('card-highlighted', identifier, False)
+
+ elif event.keyval in (gtk.keysyms.space, gtk.keysyms.KP_Page_Down):
+ card = self.cards[x, y]
+ self.card_flipped(card)
+
+ def flip_card_mouse(self, widget, event, identifier):
+ position = self.dict[identifier]
+ card = self.cards[position]
+ self.card_flipped(card)
+
+ def trysensor(self, avg):
+ for card in self.cards.values():
+ #card = self.cards[xy[0],xy[1]]
+ #if(card.get_sensor() is not None):
+ cardcode = card.get_text()
+ if((cardcode.find('s~')!=-1) and (not card.flipped)):
+ if (abs(int(cardcode[cardcode.find('s~')+2:len(cardcode)]) - avg)<2000):
+ if(self.lastcard == card):
+ #self.lastcard = self.cd2id[card]
+ #card.flip(True)
+ #card.flip(False)
+ self.card_flipped(card)
+ card.flip(True)
+ #card.animate(True)
+ #self.card_flipped(card)
+ #card.flip(True)
+ #card.flip(True)
+ #card.flip(False)
+ #card.flip(False)
+ break
+ else:
+ self.lastcard = card
+
+ def card_flipped(self, card):
+ identifer = self.cd2id[card]
+ if card.is_flipped():
+ self.emit('card-overflipped', identifer)
+ else:
+ self.emit('card-flipped', identifer, False)
+
+ def set_border(self, widget, identifer, stroke_color, fill_color):
+ self.id2cd[identifer].set_border(stroke_color, fill_color)
+
+ def flop_card(self, widget, identifer):
+ self.id2cd.get(identifer).flop()
+
+ def flip_card(self, widget, identifer, full_animation):
+ self.id2cd.get(identifer).flip(full_animation)
+
+ def cement_card(self, widget, identifer):
+ self.id2cd.get(identifer).cement()
+
+ def highlight_card(self, widget, identifer, status):
+ if self.dict != None:
+ self.selected_card = self.dict.get(identifer)
+ self.id2cd.get(identifer).set_highlight(status)
+
+ def reset(self, widget):
+ for identifer in self.id2cd.keys():
+ self.id2cd[identifer].reset()
+
+ def _set_load_mode(self, mode):
+ if mode:
+ self.remove(self.table)
+ self.set_property('child', self.load_message)
+ else:
+ self.remove(self.load_message)
+ self.set_property('child', self.table)
+ self.load_mode = mode
+ self.queue_draw()
+ while gtk.events_pending():
+ gtk.main_iteration()
+
+ def load_msg(self, widget, msg):
+ if not self.load_mode:
+ self._set_load_mode(True)
+ self.load_message.set_text(msg)
+ self.queue_draw()
diff --git a/config.py b/config.py
new file mode 100644
index 0000000..13a96a0
--- /dev/null
+++ b/config.py
@@ -0,0 +1,51 @@
+import os
+import os.path
+import tempfile
+from sugar.activity import activity
+
+MEASURE_ROOT = activity.get_bundle_path()
+ICONS_DIR = MEASURE_ROOT + '/icons'
+
+
+#Waveform drawing area dimensions
+WINDOW_W=1200.0
+WINDOW_H=700.0
+
+
+#In milliseconds, the delay interval after which the waveform draw function will be queued"
+REFRESH_TIME = 30
+
+#Multiplied with width and height to set placement of text
+TEXT_X_M = 0.65
+TEXT_Y_M = 0.70
+
+#Maximum number of graphs that can be simultaneously be displayed
+MAX_GRAPHS = 4
+
+#Device settings at start of Activity
+RATE = 48000
+MIC_BOOST = False
+DC_MODE_ENABLE = True
+CAPTURE_GAIN = 0
+BIAS = True
+
+#Interval, in ms, after which audio buffer will be sent to drawing class
+AUDIO_BUFFER_TIMEOUT = 30
+
+#When Activity quits
+QUIT_MIC_BOOST = False
+QUIT_DC_MODE_ENABLE = False
+QUIT_CAPTURE_GAIN = 100
+QUIT_BIAS = True
+QUIT_PCM = 70
+
+#Which context is active on start
+# 1 - sound
+# 2 - sensors
+CONTEXT = 2
+
+#How many maximum screenshots Measure will save while recording in Sound context
+SOUND_MAX_WAVE_LOGS = 10
+
+#To track if one context is logging, other wouldn't also do it simultaneously
+LOGGING_IN_SESSION = False
diff --git a/createcardpanel.py b/createcardpanel.py
new file mode 100644
index 0000000..e1df932
--- /dev/null
+++ b/createcardpanel.py
@@ -0,0 +1,492 @@
+#
+# Copyright (C) 2006, 2007, 2008 One Laptop Per Child
+# Copyright (C) 2009 Simon Schampijer
+#
+# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import gtk
+from os import environ
+from os.path import join, basename
+import hippo
+
+import shutil
+import tempfile
+from gettext import gettext as _
+import svgcard
+import logging
+from gobject import SIGNAL_RUN_FIRST, TYPE_PYOBJECT
+from sugar.graphics import style
+from sugar.graphics.toolbutton import ToolButton
+from sugar.graphics.icon import Icon
+from sugar.graphics.palette import Palette
+from port.widgets import ToggleToolButton
+from port.widgets import CanvasRoundBox, ToolComboBox
+from port import chooser
+
+import theme
+import speak.espeak
+import speak.widgets
+import speak.face
+
+_logger = logging.getLogger('memorize-activity')
+
+class CreateCardPanel(gtk.EventBox):
+ __gsignals__ = {
+ 'add-pair': (SIGNAL_RUN_FIRST, None, 10 * [TYPE_PYOBJECT]),
+ 'update-pair': (SIGNAL_RUN_FIRST, None, 10 * [TYPE_PYOBJECT]),
+ }
+
+ def __init__(self, activity):
+ def make_label(icon_name, label):
+ label_box = gtk.HBox()
+ icon = Icon(
+ icon_name=icon_name,
+ icon_size=gtk.ICON_SIZE_LARGE_TOOLBAR)
+ label_box.pack_start(icon, False)
+ label = gtk.Label(label)
+ label.modify_fg(gtk.STATE_NORMAL,
+ style.COLOR_TOOLBAR_GREY.get_gdk_color())
+ label_box.pack_start(label)
+ label_box.show_all()
+ return label_box
+
+ gtk.EventBox.__init__(self)
+ self.activity = activity
+
+ self.equal_pairs = False
+ self._updatebutton_sensitive = False
+ self._card1_has_sound = False
+ self._card2_has_sound = False
+
+ # save buttons
+
+ buttons_bar = gtk.HBox()
+ buttons_bar.props.border_width = 10
+
+ self._addbutton = ToolButton(
+ tooltip=_('Add as new pair'),
+ sensitive=False)
+ self._addbutton.set_icon_widget(
+ make_label('pair-add', ' ' + _('Add')))
+ self._addbutton.connect('clicked', self.emit_add_pair)
+ buttons_bar.pack_start(self._addbutton, False)
+
+ self._updatebutton = ToolButton(
+ tooltip=_('Update selected pair'),
+ sensitive=False)
+ self._updatebutton.set_icon_widget(
+ make_label('pair-update', ' ' + _('Update')))
+ self._updatebutton.connect('clicked', self.emit_update_pair)
+ buttons_bar.pack_start(self._updatebutton, False)
+
+ # Set card editors
+
+ self.cardeditor1 = CardEditor(self.activity)
+ self.cardeditor2 = CardEditor(self.activity)
+ self.clean(None)
+ self.cardeditor1.connect('has-text', self.receive_text_signals)
+ self.cardeditor2.connect('has-text', self.receive_text_signals)
+ self.cardeditor1.connect('has-picture', self.receive_picture_signals)
+ self.cardeditor2.connect('has-picture', self.receive_picture_signals)
+ self.cardeditor1.connect('has-sound', self.receive_sound_signals)
+ self.cardeditor2.connect('has-sound', self.receive_sound_signals)
+ self.cardeditor1.connect('has-sensor', self.receive_sensor_signals)
+ self.cardeditor2.connect('has-sensor', self.receive_sensor_signals)
+
+ # edit panel
+
+ self.card_box = gtk.HBox()
+ self.card_box.pack_start(self.cardeditor1)
+ self.card_box.pack_start(self.cardeditor2)
+
+ box = gtk.VBox()
+ box.pack_start(self.card_box, False)
+ box.pack_start(buttons_bar, False)
+ self.add(box)
+
+ self.show_all()
+
+ def emit_add_pair(self, widget):
+ self._addbutton.set_sensitive(False)
+ if self.equal_pairs:
+ self.emit('add-pair', self.cardeditor1.get_text(),
+ self.cardeditor1.get_text(),
+ self.cardeditor1.get_pixbuf(),
+ self.cardeditor1.get_pixbuf(),
+ self.cardeditor1.get_snd(), self.cardeditor1.get_snd(),
+ self.cardeditor1.get_speak(), self.cardeditor1.get_speak(),
+ self.cardeditor1.get_sensor(), self.cardeditor1.get_sensor()
+ )
+ else:
+ self.emit('add-pair', self.cardeditor1.get_text(),
+ self.cardeditor2.get_text(),
+ self.cardeditor1.get_pixbuf(),
+ self.cardeditor2.get_pixbuf(),
+ self.cardeditor1.get_snd(), self.cardeditor2.get_snd(),
+ self.cardeditor1.get_speak(), self.cardeditor2.get_speak(),
+ self.cardeditor1.get_sensor(), self.cardeditor2.get_sensor()
+ )
+ self.clean(None)
+
+ def emit_update_pair(self, widget):
+ self._addbutton.set_sensitive(False)
+ if self.equal_pairs:
+ self.emit('update-pair', self.cardeditor1.get_text(),
+ self.cardeditor1.get_text(),
+ self.cardeditor1.get_pixbuf(),
+ self.cardeditor1.get_pixbuf(),
+ self.cardeditor1.get_snd(), self.cardeditor1.get_snd(),
+ self.cardeditor1.get_speak(), self.cardeditor1.get_speak(),
+ self.cardeditor1.get_sensor(), self.cardeditor1.get_sensor()
+ )
+ else:
+ self.emit('update-pair', self.cardeditor1.get_text(),
+ self.cardeditor2.get_text(),
+ self.cardeditor1.get_pixbuf(),
+ self.cardeditor2.get_pixbuf(),
+ self.cardeditor1.get_snd(), self.cardeditor2.get_snd(),
+ self.cardeditor1.get_speak(), self.cardeditor2.get_speak(),
+ self.cardeditor1.get_sensor(), self.cardeditor2.get_sensor()
+ )
+ self.clean(None)
+
+ def pair_selected(self, widget, selected, newtext1, newtext2, aimg, bimg,
+ asnd, bsnd, aspeak, bspeak, asensor, bsensor):
+ if selected:
+ self.cardeditor1.set_text(newtext1)
+ self.cardeditor2.set_text(newtext2)
+ self.cardeditor1.set_pixbuf(aimg)
+ self.cardeditor2.set_pixbuf(bimg)
+ self.cardeditor1.set_snd(asnd)
+ self.cardeditor2.set_snd(bsnd)
+ self.cardeditor1.set_speak(aspeak)
+ self.cardeditor2.set_speak(bspeak)
+ self.cardeditor1.set_sensor(asensor)
+ self.cardeditor2.set_sensor(bsensor)
+ self._addbutton.set_sensitive(True)
+ self._updatebutton.set_sensitive(selected)
+ self._updatebutton_sensitive = selected
+
+ def change_equal_pairs(self, widget, state):
+ self.equal_pairs = state
+ self.clean(None)
+
+ if self.equal_pairs:
+ if self.cardeditor2.parent:
+ self.card_box.remove(self.cardeditor2)
+ else:
+ if not self.cardeditor2.parent:
+ self.card_box.pack_start(self.cardeditor2)
+
+ def clean(self, widget):
+ self.cardeditor1.clean()
+ self.cardeditor2.clean()
+ self._addbutton.set_sensitive(False)
+ self._card1_has_text = False
+ self._card2_has_text = False
+ self._card1_has_picture = False
+ self._card2_has_picture = False
+ self._card1_has_sensor = False
+ self._card2_has_sensor = False
+
+ def receive_text_signals(self, widget, has_text):
+ if widget == self.cardeditor1:
+ self._card1_has_text = has_text
+ if widget == self.cardeditor2:
+ self._card2_has_text = has_text
+ self._update_buttom_status()
+
+ def receive_sensor_signals(self, widget, has_sensor):
+ if widget == self.cardeditor1:
+ self._card1_has_sensor = has_sensor
+ if widget == self.cardeditor2:
+ self._card2_has_sensor = has_sensor
+ self._update_buttom_status()
+
+ def receive_picture_signals(self, widget, has_picture):
+ if widget == self.cardeditor1:
+ self._card1_has_picture = has_picture
+ if widget == self.cardeditor2:
+ self._card2_has_picture = has_picture
+ self._update_buttom_status()
+
+ def receive_sound_signals(self, widget, has_sound):
+ if widget == self.cardeditor1:
+ self._card1_has_sound = has_sound
+ if widget == self.cardeditor2:
+ self._card2_has_sound = has_sound
+ self._update_buttom_status()
+
+ def _update_buttom_status(self):
+ if not self.equal_pairs:
+ if (self._card1_has_text or self._card1_has_picture \
+ or self._card1_has_sound or self._card1_has_sensor) and (self._card2_has_text
+ or self._card2_has_picture
+ or self._card2_has_sound or self._card2_has_sensor):
+ self._addbutton.set_sensitive(True)
+ self._updatebutton.set_sensitive(self._updatebutton_sensitive)
+ else:
+ self._addbutton.set_sensitive(False)
+ self._updatebutton.set_sensitive(False)
+ else:
+ if (self._card1_has_text or self._card1_has_picture \
+ or self._card1_has_sound or self._card1_has_sensor):
+ self._addbutton.set_sensitive(True)
+ self._updatebutton.set_sensitive(self._updatebutton_sensitive)
+ else:
+ self._addbutton.set_sensitive(False)
+ self._updatebutton.set_sensitive(False)
+
+class CardEditor(gtk.EventBox):
+
+ __gsignals__ = {
+ 'has-text': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
+ 'has-picture': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
+ 'has-sound': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
+ 'has-sensor': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT])
+ }
+
+ def __init__(self, activity):
+ gtk.EventBox.__init__(self)
+
+ self.snd = None
+ self.activity = activity
+
+ tmp_root = join(environ['SUGAR_ACTIVITY_ROOT'], 'instance')
+ self.temp_folder = tempfile.mkdtemp(dir=tmp_root)
+
+ box = gtk.VBox()
+ box.props.spacing = theme.PAD
+ box.props.border_width = theme.PAD
+
+ self.previewlabel = gtk.Label(_('Preview:'))
+ self.previewlabel.set_alignment(0, 1)
+ box.pack_start(self.previewlabel, False)
+
+ self.card = svgcard.SvgCard(-1,
+ { 'front_text' : { 'card_text' : '',
+ 'text_color' : '#ffffff' },
+ 'front_border': { 'fill_color' : '#4c4d4f',
+ 'stroke_color' : '#ffffff',
+ 'opacity' : '1' } },
+ None, theme.PAIR_SIZE, 1, '#c0c0c0')
+ self.card.flip()
+ card_align = gtk.Alignment(.5, .5, 0, 0)
+ card_align.add(self.card)
+ box.pack_start(card_align, False)
+
+ textlabel = gtk.Label(_('Text:'))
+ textlabel.set_alignment(0, 1)
+ box.pack_start(textlabel, False)
+
+ self.textentry = gtk.Entry()
+ self.textentry.connect('changed', self.update_text)
+ box.pack_start(self.textentry, False)
+
+ toolbar = gtk.HBox()
+
+ browsepicture = ToolButton(
+ icon_name='import_picture',
+ tooltip=_('Insert picture'))
+ toolbar.pack_start(browsepicture, False)
+
+ browsesound = ToolButton(
+ icon_name='import_sound',
+ tooltip=_('Insert sound'))
+ toolbar.pack_start(browsesound, False)
+
+ browsepicture.connect('clicked', self._load_image)
+ browsesound.connect('clicked', self._load_audio)
+
+ if speak.espeak.supported:
+ self.usespeak = ToggleToolButton(
+ named_icon='speak',
+ palette=SpeakPalette(self))
+ toolbar.pack_start(self.usespeak, False)
+ self.usespeak.connect('toggled', self._usespeak_cb)
+ else:
+ self.usespeak = None
+
+ browseSensor = ToolButton(
+ icon_name ='import_sensor',
+ tooltip=_('Insert sensor'))
+ toolbar.pack_start(browseSensor,False)
+ browseSensor.connect('clicked', self._load_sensor)
+
+ toolbar_box = CanvasRoundBox(
+ radius=8,
+ border=2,
+ border_color=style.COLOR_BUTTON_GREY.get_int(),
+ background_color=style.COLOR_PANEL_GREY.get_int())
+ toolbar_box.append(hippo.CanvasWidget(widget=toolbar),
+ hippo.PACK_EXPAND)
+ toolbar_canvas = hippo.Canvas()
+ toolbar_canvas.set_root(toolbar_box)
+ box.pack_start(toolbar_canvas, False)
+
+ self.add(box)
+
+ def update_text(self, entry):
+ self.card.change_text(entry.get_text())
+ if len(entry.get_text()) == 0:
+ self.emit('has-text', False)
+ else:
+ self.emit('has-text', True)
+
+ def get_text(self):
+ return self.textentry.get_text()
+
+ def set_text(self, newtext):
+ if newtext == None:
+ newtext = ''
+ self.textentry.set_text(newtext)
+
+ def get_speak(self):
+ if self.usespeak is None:
+ return None
+ if self.usespeak.props.active:
+ return self.usespeak.palette.face.status.voice.friendlyname
+
+ def set_speak(self, value):
+ if self.usespeak is None:
+ return
+ if value is None:
+ self.usespeak.props.active = False
+ else:
+ try:
+ self.usespeak.handler_block_by_func(self._usespeak_cb)
+ self.usespeak.props.active = True
+ finally:
+ self.usespeak.handler_unblock_by_func(self._usespeak_cb)
+ self.usespeak.palette.voices.resume(value)
+
+ def get_pixbuf(self):
+ return self.card.get_pixbuf()
+
+ def set_pixbuf(self, pixbuf):
+ self.card.set_pixbuf(pixbuf)
+
+ def _load_sensor(self, widget):
+ sensorVal = self.activity.avg
+ self.set_sensor(sensorVal)
+ #self.card.set_sensor(sensorVal)
+ self.emit('has-sensor',True)
+
+ def get_sensor(self):
+ return self.card.get_sensor()
+
+ def set_sensor(self,sensor):
+ self.card.set_sensor(sensor)
+ if(sensor is not None):
+ self.set_text(self.get_text().split('s~')[0]+"s~"+str(sensor))
+
+ def _load_image(self, widget):
+ def load(jobject):
+ index = jobject.file_path
+
+ self.set_speak(None)
+
+ pixbuf_t = gtk.gdk.pixbuf_new_from_file_at_size(
+ index, theme.PAIR_SIZE - theme.PAD*2,
+ theme.PAIR_SIZE - theme.PAD*2)
+ size = max(pixbuf_t.get_width(), pixbuf_t.get_height())
+ pixbuf_z = gtk.gdk.pixbuf_new_from_file_at_size(
+ 'images/white.png', size, size)
+ pixbuf_t.composite(pixbuf_z, 0, 0, pixbuf_t.get_width(),
+ pixbuf_t.get_height(), 0, 0, 1, 1,
+ gtk.gdk.INTERP_BILINEAR, 255)
+ self.card.set_pixbuf(pixbuf_z)
+ _logger.debug('Picture Loaded: '+index)
+ self.emit('has-picture', True)
+ del pixbuf_t
+ del pixbuf_z
+
+ chooser.pick(parent=self.get_toplevel(),
+ what=chooser.IMAGE,
+ cb=load)
+
+ def _load_audio(self, widget):
+ def load(jobject):
+ index = jobject.file_path
+
+ self.set_speak(None)
+
+ dst = join(self.temp_folder, basename(index))
+ shutil.copy(index, dst)
+ self.set_snd(dst)
+ icon_theme = gtk.icon_theme_get_default()
+ pixbuf_t = icon_theme.load_icon("audio-x-generic",
+ style.XLARGE_ICON_SIZE, 0)
+ self.card.set_pixbuf(pixbuf_t)
+ self.emit('has-sound', True)
+ _logger.debug('Audio Loaded: '+dst)
+
+ chooser.pick(parent=self.get_toplevel(),
+ what=chooser.AUDIO,
+ cb=load)
+
+ def _usespeak_cb(self, button):
+ self.card.change_speak(button.props.active)
+
+ if not button.props.active:
+ self.usespeak.palette.face.shut_up()
+ return
+
+ self.snd = None
+ self.card.set_pixbuf(None)
+ self.emit('has-sound', False)
+ self.emit('has-picture', False)
+
+ button.palette.face.say(self.get_text().split('s~')[0])
+
+ def set_snd(self, snd):
+ self.snd = snd
+
+ def get_snd(self):
+ return self.snd
+
+ def clean(self):
+ self.textentry.set_text('')
+ self.card.set_pixbuf(None)
+ self.card.set_sensor(None)
+ self.snd = None
+ self.emit('has-text', False)
+ self.emit('has-picture', False)
+ self.emit('has-sound', False)
+ self.emit('has-sensor', False)
+ if self.usespeak is not None:
+ self.usespeak.props.active = False
+ self.usespeak.palette.face.shut_up()
+
+class SpeakPalette(Palette):
+ def __init__(self, editor):
+ Palette.__init__(self, _('Pronounce text during tile flip'))
+
+ self.face = speak.face.View()
+
+ toolbar = gtk.HBox()
+ toolbar.modify_bg(gtk.STATE_NORMAL, style.COLOR_BLACK.get_gdk_color())
+
+ usespeak_play = ToolButton(icon_name='media-playback-start')
+ usespeak_play.connect('clicked', lambda button:
+ self.face.say(editor.get_text().split('s~')[0]))
+ toolbar.pack_start(usespeak_play, False)
+
+ self.voices = speak.widgets.Voices(self.face)
+ toolbar.pack_start(ToolComboBox(self.voices))
+
+ toolbar.show_all()
+ self.set_content(toolbar)
diff --git a/createtoolbar.py b/createtoolbar.py
new file mode 100644
index 0000000..b5c72fe
--- /dev/null
+++ b/createtoolbar.py
@@ -0,0 +1,168 @@
+# Copyright (C) 2006, 2007, 2008 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import logging
+from gettext import gettext as _
+
+import gtk
+from os.path import join, dirname
+from gobject import SIGNAL_RUN_FIRST, TYPE_PYOBJECT
+
+from sugar.graphics.toolbutton import ToolButton
+from sugar.graphics.toggletoolbutton import ToggleToolButton
+from sugar.graphics.toolcombobox import ToolComboBox
+from sugar.graphics.objectchooser import ObjectChooser
+
+class CreateToolbar(gtk.Toolbar):
+ __gtype_name__ = 'CreateToolbar'
+
+ __gsignals__ = {
+ 'create_new_game': (SIGNAL_RUN_FIRST, None, []),
+ 'create_load_game': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
+ 'create_save_game': (SIGNAL_RUN_FIRST, None, 3 * [TYPE_PYOBJECT]),
+ 'create_equal_pairs': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
+ }
+
+ def __init__(self, activity):
+ gtk.Toolbar.__init__(self)
+ self.activity = activity
+ self._lock = True
+
+ # New Button
+ new_icon = join(dirname(__file__), 'images', 'game-new.svg')
+ new_image = gtk.Image()
+ new_image.set_from_file(new_icon)
+ self._new_button = ToolButton()
+ self._new_button.set_icon_widget(new_image)
+ self._new_button.set_tooltip(_('New game'))
+ self._new_button.connect('clicked', self._new_game_bt)
+ self._add_widget(self._new_button)
+
+ # Load Button
+ load_icon = join(dirname(__file__), 'images', 'game-load.svg')
+ load_image = gtk.Image()
+ load_image.set_from_file(load_icon)
+ self._load_button = ToolButton()
+ self._load_button.set_icon_widget(load_image)
+ self._load_button.set_tooltip(_('Load game'))
+ self._load_button.connect('clicked', self._load_game)
+ self._add_widget(self._load_button)
+
+ # Save Button
+ save_icon = join(dirname(__file__), 'images', 'game-save.svg')
+ save_image = gtk.Image()
+ save_image.set_from_file(save_icon)
+ self._save_button = ToolButton()
+ self._save_button.set_icon_widget(save_image)
+ self._save_button.set_tooltip(_('Save game'))
+ self._save_button.connect('clicked', self._save_game_bt)
+ self._save_button.set_sensitive(False)
+ self._add_widget(self._save_button)
+
+ # Separator
+ separator2 = gtk.SeparatorToolItem()
+ separator2.set_draw(True)
+ self.insert(separator2, -1)
+
+ self._add_widget(gtk.Label(_('Game name') + ': '))
+ self.game_name_entry = gtk.Entry()
+ self._add_widget(self.game_name_entry)
+
+ self._equal_pairs = gtk.CheckButton(_('Equal pairs'))
+ self._add_widget(self._equal_pairs)
+ self._equal_pairs.connect('toggled', self._emit_equal_pairs)
+
+ self._grouped_icon1 = join(dirname(__file__), 'images', 'equal_pairs1.svg')
+ self._grouped_icon2 = join(dirname(__file__), 'images', 'equal_pairs2.svg')
+ self._grouped_image1 = gtk.Image()
+ self._grouped_image2 = gtk.Image()
+ self._grouped_image1.set_from_file(self._grouped_icon1)
+ self._grouped_image2.set_from_file(self._grouped_icon2)
+ self._grouped = ToggleToolButton()
+ self._grouped.set_icon_widget(self._grouped_image1)
+ self._grouped.set_tooltip(_('Click for grouped game'))
+ self._grouped.connect('toggled', self._grouped_cb)
+ self._add_widget(self._grouped)
+
+ def _add_widget(self, widget, expand=False):
+ tool_item = gtk.ToolItem()
+ tool_item.set_expand(expand)
+ tool_item.add(widget)
+ widget.show()
+ self.insert(tool_item, -1)
+ tool_item.show()
+
+ def _game_changed_cb(self, combobox, game_name):
+ self.game_name_entry.set_text(game_name)
+ self.emit('create_load_game', game_name)
+
+ def _load_game(self, button):
+ chooser = ObjectChooser(_('Choose memorize game'),
+ parent=self.activity,
+ flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
+ jobject = ''
+ try:
+ result = chooser.run()
+ if result == gtk.RESPONSE_ACCEPT:
+ logging.debug('ObjectChooser: %r' % chooser.get_selected_object())
+ jobject = chooser.get_selected_object()
+ if not jobject or not jobject.file_path:
+ return
+ finally:
+ chooser.destroy()
+ del chooser
+
+ if jobject and jobject.file_path:
+ self.emit('create_load_game', jobject.file_path)
+ self._save_button.set_sensitive(False)
+
+ def _new_game_bt(self, button):
+ self.game_name_entry.set_text('')
+ self._equal_pairs.set_active(False)
+ self._grouped.set_active(False)
+ self.emit('create_new_game')
+ self._new_button.set_sensitive(False)
+ self._save_button.set_sensitive(False)
+
+ def _save_game_bt(self, button):
+ self.emit('create_save_game', self.game_name_entry.get_text(), self._equal_pairs.get_active(), self._grouped.get_active())
+ self._save_button.set_sensitive(False)
+
+ def _emit_equal_pairs(self, checkbutton):
+ self.emit('create_equal_pairs', checkbutton.get_active())
+ self._save_button.set_sensitive(True)
+
+ def _grouped_cb(self, widget):
+ self._save_button.set_sensitive(True)
+ if self._grouped.get_active():
+ self._grouped.set_icon_widget(self._grouped_image2)
+ self._grouped_image2.show()
+ self._grouped.set_tooltip(_('Click for ungrouped game'))
+ else:
+ self._grouped.set_icon_widget(self._grouped_image1)
+ self._grouped_image1.show()
+ self._grouped.set_tooltip(_('Click for grouped game'))
+
+ def update_create_toolbar(self, widget, game_name, equal_pairs, grouped):
+ self.game_name_entry.set_text(game_name)
+ self._equal_pairs.set_active(equal_pairs == 'True')
+ self._grouped.set_active(grouped == '1')
+
+ def update_buttons_status(self, widget, new, save):
+ self._new_button.set_sensitive(new)
+ self._save_button.set_sensitive(save)
+
diff --git a/demos/addition.zip b/demos/addition.zip
new file mode 100644
index 0000000..1633af3
--- /dev/null
+++ b/demos/addition.zip
Binary files differ
diff --git a/demos/letters.zip b/demos/letters.zip
new file mode 100644
index 0000000..0c57769
--- /dev/null
+++ b/demos/letters.zip
Binary files differ
diff --git a/demos/sounds.zip b/demos/sounds.zip
new file mode 100644
index 0000000..6d0dc77
--- /dev/null
+++ b/demos/sounds.zip
Binary files differ
diff --git a/face.py b/face.py
new file mode 100644
index 0000000..64693f6
--- /dev/null
+++ b/face.py
@@ -0,0 +1,78 @@
+# 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 gtk
+
+import logging
+_logger = logging.getLogger('memorize-activity')
+
+from sugar.graphics import style
+
+import speak.espeak
+import speak.face
+import theme
+
+class Face(gtk.EventBox):
+ def __init__(self):
+ gtk.EventBox.__init__(self)
+
+ self.modify_bg(gtk.STATE_NORMAL, style.COLOR_BLACK.get_gdk_color())
+
+ self.face = speak.face.View(style.Color('#4b4c4e'))
+ self.face.set_border_width(theme.SVG_PAD)
+ self.add(self.face)
+ self.show_all()
+
+ self.set_app_paintable(True)
+ self.connect('expose-event', self._expose_cb)
+ self.connect('unrealize', self._unrealize_cb)
+
+ def _unrealize_cb(self, widget):
+ self.face.shut_up()
+
+ def _expose_cb(self, widget, event):
+ card = self.parent.parent
+ pixbuf = card._read_icon_data('front')
+ self.window.draw_pixbuf(None, pixbuf, 0, 0, 0, 0)
+
+def look_at():
+ if not speak.espeak.supported:
+ return
+
+ display = gtk.gdk.display_get_default()
+ screen_, x, y, modifiers_ = display.get_pointer()
+
+ for i in _cache:
+ if i.parent:
+ i.face.look_at(x, y)
+
+def acquire():
+ if not speak.espeak.supported:
+ return None
+
+ face = None
+
+ for i in _cache:
+ i.face.shut_up()
+ if not i.parent:
+ face = i
+
+ if not face:
+ face = Face()
+ _cache.append(face)
+ _logger.debug('face._cache size %s' % len(_cache))
+
+ return face
+
+_cache = []
diff --git a/game.py b/game.py
new file mode 100644
index 0000000..c8df347
--- /dev/null
+++ b/game.py
@@ -0,0 +1,386 @@
+# Copyright (C) 2006, 2007, 2008 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import logging
+import gobject
+from os.path import join
+
+from gettext import gettext as _
+from gobject import SIGNAL_RUN_FIRST, TYPE_PYOBJECT, GObject, timeout_add
+from gobject import source_remove
+
+from model import Model
+from audio import Audio
+import theme
+
+_logger = logging.getLogger('memorize-activity')
+
+SERVICE = 'org.laptop.Memorize'
+IFACE = SERVICE
+PATH = '/org/laptop/Memorize'
+
+
+class MemorizeGame(GObject):
+
+ __gsignals__ = {
+ 'reset_scoreboard': (SIGNAL_RUN_FIRST, None, []),
+ 'reset_table': (SIGNAL_RUN_FIRST, None, []),
+ 'load_mode': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
+ 'load_game': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]),
+ 'change_game': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]),
+ 'change_game_signal': (SIGNAL_RUN_FIRST, None, 5 * [TYPE_PYOBJECT]),
+ 'set-border': (SIGNAL_RUN_FIRST, None, 3 * [TYPE_PYOBJECT]),
+ 'flip-card': (SIGNAL_RUN_FIRST, None, [int, bool]),
+ 'flip-card-signal': (SIGNAL_RUN_FIRST, None, [int]),
+ 'cement-card': (SIGNAL_RUN_FIRST, None, [int]),
+ 'flop-card': (SIGNAL_RUN_FIRST, None, [int]),
+ 'highlight-card': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]),
+ 'add_buddy': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]),
+ 'rem_buddy': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
+ 'increase-score': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
+ 'wait_mode_buddy': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]),
+ 'msg_buddy': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]),
+ 'change-turn': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
+ }
+
+ def __init__(self):
+ gobject.GObject.__init__(self)
+ self.myself = None
+ self.players_score = {}
+ self.players = []
+ self.waiting_players = []
+ self.current_player = None
+ self.last_flipped = -1
+ self.last_highlight = 1
+ self._flop_card_timeout = -1
+ self.messenger = None
+ self.sentitive = True
+
+ self.model = Model()
+ self.flip_block = False
+ self._flop_cards = None
+
+ self.audio = Audio()
+
+ def load_game(self, game_name, size, mode):
+ self.set_load_mode('Loading game')
+ if self.model.read(game_name) == 0:
+ self.model.def_grid(size)
+ self.model.data['running'] = 'False'
+ self.model.data['mode'] = mode
+ logging.debug(' Read setup file %r: %r ',
+ game_name, self.model.grid)
+ self.emit('load_game', self.model.data, self.model.grid)
+ else:
+ logging.error(' Reading setup file %s', game_name)
+
+ def load_remote(self, grid, data, mode, signal = False):
+ self.set_load_mode(_('Loading game...'))
+ self.model.grid = grid
+ self.model.data = data
+ self.model.data['mode'] = mode
+ self.emit('reset_scoreboard')
+ if not signal:
+ self.emit('change_game_signal',
+ mode,
+ self.get_grid(),
+ self.model.data,
+ self.waiting_players,
+ self.model.data['game_file'])
+ self.emit('change_game', self.model.data, self.get_grid())
+ for buddy in self.players:
+ self.players_score[buddy] = 0
+ self.current_player = None
+ self.last_flipped = -1
+ self.last_highlight = 1
+ self.change_turn()
+ self.model.data['running'] = 'False'
+
+ for card in self.model.grid:
+ if card['state'] == '1':
+ self.emit('flip-card', self.model.grid.index(card), False)
+ self.last_flipped = self.model.grid.index(card)
+ elif card['state'] != '0':
+ stroke_color, fill_color = card['state'].split(',')
+ self.emit('flip-card', self.model.grid.index(card), False)
+ self.emit('set-border', self.model.grid.index(card),
+ stroke_color, fill_color)
+
+ def add_buddy(self, buddy, score = 0):
+ _logger.debug('Buddy %r was added to game', buddy.props.nick)
+ self.players.append(buddy)
+ self.players_score[buddy] = score
+ self.emit('add_buddy', buddy, score)
+ logging.debug(str(buddy))
+
+ if self.current_player == None:
+ self.current_player = buddy
+ self.change_turn()
+
+ def rem_buddy(self, buddy):
+ _logger.debug('Buddy %r was removed from game', buddy.props.nick)
+ if self.current_player == buddy and len(self.players) >= 2:
+ if self.last_flipped != -1:
+ self.emit('flop-card', self.last_flipped)
+ self.model.grid[self.last_flipped]['state'] = '0'
+ self.last_flipped = -1
+ self.change_turn()
+ index = self.players.index(buddy)
+ del self.players[index]
+ del (self.players_score[buddy])
+ self.emit('rem_buddy', buddy)
+
+ def buddy_message(self, buddy, text):
+ self.emit('msg_buddy', buddy, text)
+
+ def update_turn(self):
+ self.set_sensitive(self.current_player == self.myself)
+ self.emit('change-turn', self.current_player)
+
+ def change_turn(self):
+ if len(self.players) <= 1:
+ self.current_player = self.players[0]
+ if self.current_player == None:
+ self.current_player = self.players[0]
+ elif self.current_player == self.players[-1]:
+ self.current_player = self.players[0]
+ else:
+ next_player = self.players.index(self.current_player) + 1
+ self.current_player = self.players[next_player]
+ self.update_turn()
+
+ def card_overflipped(self, widget, identifier):
+ if self._flop_cards and identifier in self._flop_cards:
+ self.card_flipped(widget, identifier)
+
+ def card_flipped(self, widget, identifier, signal = False):
+ if self._flop_cards:
+ source_remove(self._flop_card_timeout)
+ self.flop_card(self._flop_cards[0], self._flop_cards[1])
+
+ # Check if is my turn
+ if (not self.sentitive and not signal) or \
+ self.last_flipped == identifier:
+ return
+
+ # Handle groups if needed
+ if self.model.data.get('divided') == '1':
+ if self.last_flipped == -1 and identifier \
+ >= (len(self.model.grid)/2):
+ return
+ if self.last_flipped != -1 and identifier \
+ < (len(self.model.grid)/2):
+ return
+
+ # do not process flips when flipping back
+ if self.flip_block:
+ return
+ else:
+ self.flip_block = True
+
+ self.model.data['running'] = 'True'
+
+ def flip_card(full_animation):
+ self.emit('flip-card', identifier, full_animation)
+ if not signal:
+ self.emit('flip-card-signal', identifier)
+
+ snd = self.model.grid[identifier].get('snd', None)
+ if snd != None:
+ sound_file = join(self.model.data.get('pathsnd'), snd)
+ self.audio.play(sound_file)
+
+ # First card case
+ if self.last_flipped == -1:
+ flip_card(full_animation=True)
+
+ self.last_flipped = identifier
+ self.model.grid[identifier]['state'] = '1'
+ self.flip_block = False
+
+ # Second card case
+ else:
+ # Pair matched
+ pair_key_1 = self.model.grid[self.last_flipped]['pairkey']
+ pair_key_2 = self.model.grid[identifier]['pairkey']
+
+ if pair_key_1 == pair_key_2:
+ flip_card(full_animation=False)
+
+ stroke_color, fill_color = \
+ self.current_player.props.color.split(',')
+ self.emit('set-border', identifier, stroke_color, fill_color)
+ self.emit('set-border', self.last_flipped,
+ stroke_color, fill_color)
+
+ self.increase_point(self.current_player)
+ self.model.grid[identifier]['state'] = \
+ self.current_player.props.color
+ self.model.grid[self.last_flipped]['state'] = \
+ self.current_player.props.color
+ self.flip_block = False
+
+ self.emit('cement-card', identifier)
+ self.emit('cement-card', self.last_flipped)
+
+ # Pair didn't match
+ else:
+ flip_card(full_animation=True)
+
+ self.model.grid[identifier]['state'] = '1'
+ self.set_sensitive(False)
+ self._flop_cards = (identifier, self.last_flipped)
+ self._flop_card_timeout = timeout_add(theme.FLOP_BACK_TIMEOUT,
+ self.flop_card, identifier, self.last_flipped)
+ self.last_flipped = -1
+
+ def new_buffer(self, buf):
+ buf = str(buf)
+ self.str_buffer = buf
+ tmp_val = self.max_samples - 1
+ self.integer_buffer = list(unpack(str(int(len(buf))/2)+'h',buf))
+ self.avg = self.integer_buffer[0]
+ if(len(self.main_buffers)>tmp_val):
+ del elf.main_buffers[0:(len(self.main_buffers)-tmp_val)]
+ self.main_buffers += self.integer_buffer
+ logging.debug(self.avg)
+ return True
+
+ def flop_card(self, identifier, identifier2):
+ self._flop_card_timeout = -1
+ self._flop_cards = None
+
+ self.emit('flop-card', identifier)
+ self.model.grid[identifier]['state'] = '0'
+ self.emit('flop-card', identifier2)
+ self.model.grid[identifier2]['state'] = '0'
+
+ #if self.model.data['divided'] == '1':
+ # self.card_highlighted(widget, -1, False)
+ self.set_sensitive(True)
+ self.flip_block = False
+ self.change_turn()
+
+ def card_highlighted(self, widget, identifier, mouse):
+ self.emit('highlight-card', self.last_highlight, False)
+ self.last_highlight = identifier
+
+ if identifier == -1 or not self.sentitive:
+ return
+
+ if self.model.data['divided'] == '1':
+ if self.last_flipped == -1 and identifier \
+ >= (len(self.model.grid)/2):
+ return
+ if self.last_flipped != -1 and identifier \
+ < (len(self.model.grid)/2):
+ return
+
+ if mouse and self.model.grid[identifier]['state'] == '0' or not mouse:
+ self.emit('highlight-card', identifier, True)
+
+
+ def increase_point(self, buddy, inc=1):
+ self.players_score[buddy] += inc
+ for i_ in range(inc):
+ self.emit('increase-score', buddy)
+
+ def get_grid(self):
+ return self.model.grid
+
+ def collect_data(self):
+ for player, score in self.players_score.items():
+ index = self.players.index(player)
+ score = self.players_score[player]
+ self.model.data[str(index)] = str(score)
+ return self.model.data
+
+ def change_game(self, widget, game_name, size, mode,
+ title = None, color= None):
+ if mode in ['file', 'demo']:
+ if self.model.read(game_name) != 0:
+ logging.error(' Reading setup file %s', game_name)
+ return
+ if size == None:
+ size = int(self.model.data['size'])
+ self.model.def_grid(size)
+
+ if title != None:
+ self.model.data['title'] = title
+ if color != None:
+ self.model.data['color'] = color
+ self.load_remote(self.model.grid, self.model.data, mode, False)
+
+ def reset_game(self, size = None):
+ if size == None:
+ size = int(self.model.data['size'])
+ self.model.def_grid(size)
+ self.load_remote(self.model.grid, self.model.data, False)
+
+ def set_load_mode(self, msg):
+ self.emit('load_mode', msg)
+
+ def set_messenger(self, messenger):
+ self.messenger = messenger
+
+ def set_sensitive(self, status):
+ self.sentitive = status
+ if not status:
+ self.emit('highlight-card', self.last_highlight, False)
+
+ def get_sensitive(self):
+ return self.sentitive
+
+ def get_current_player(self):
+ return self.current_player
+
+ def get_players_data(self):
+ data = []
+ for player, score in self.players_score.items():
+ data.append([player.props.key, player.props.nick,
+ player.props.color, score])
+ return data
+
+ def set_wait_list(self, wait_list):
+ self.waiting_players = wait_list
+ for w in wait_list:
+ for p in self.players:
+ if w[0] == p.props.key:
+ list.remove(w)
+ for i_ in range(w[3]):
+ self.increase_point(p)
+
+ def set_myself(self, buddy):
+ self.myself = buddy
+
+ def add_to_waiting_list(self, buddy):
+ self.players.remove(buddy)
+ self.waiting_players.append(buddy)
+ self.emit('wait_mode_buddy', buddy, True)
+
+ def rem_to_waiting_list(self, buddy):
+ self.waiting_players.remove(buddy)
+ self.players.append(buddy)
+ self.emit('wait_mode_buddy', buddy, False)
+
+ def load_waiting_list(self, wait_list):
+ for buddy in wait_list:
+ self.add_to_waiting_list(buddy)
+
+ def empty_waiting_list(self):
+ for buddy in self.waiting_players:
+ self.rem_to_waiting_list(buddy)
diff --git a/icons/import_picture.svg b/icons/import_picture.svg
new file mode 100644
index 0000000..3029498
--- /dev/null
+++ b/icons/import_picture.svg
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="42"
+ height="42"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.45.1"
+ version="1.0"
+ sodipodi:docbase="/home/msgodoi/olpc/workspace/Memorize.activity/images"
+ sodipodi:docname="import_picture2.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16.119048"
+ inkscape:cx="21"
+ inkscape:cy="21"
+ inkscape:document-units="px"
+ inkscape:current-layer="g6207"
+ width="42px"
+ height="42px"
+ inkscape:window-width="1432"
+ inkscape:window-height="871"
+ inkscape:window-x="4"
+ inkscape:window-y="25" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g6207"
+ transform="matrix(1.1572772,0,0,1.1572772,-4.2605572,6.7107864)">
+ <path
+ id="path4267"
+ d="M 5.4593796,20.224519 C 38.339735,20.224519 38.339735,20.472673 38.339735,20.472673"
+ style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.59229163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.59229159;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 21.479131,-4.0705774 C 21.479131,12.654873 21.479131,3.3232479 21.479131,9.1167959"
+ id="path8177"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.59229183;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 26.27629,4.3453376 C 20.432698,10.18893 23.693011,6.9286162 21.668843,8.9527852"
+ id="path9150"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.59229183;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 16.709475,4.3879849 C 22.553067,10.231577 19.292754,6.9712635 21.316922,8.9954325"
+ id="path9152"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:#404040;stroke-width:0.39234692;stroke-opacity:1;overflow:visible"
+ id="path9"
+ d="M 21.827577,10.566639 C 12.107601,10.566639 4.0271383,20.247579 4.0271383,20.247579 C 4.0271383,20.247579 12.107601,29.967555 21.827577,29.967555 C 31.547554,29.967555 39.628016,20.208542 39.628016,20.208542 C 39.628016,20.208542 31.547554,10.566639 21.827577,10.566639 z M 21.827577,27.078888 C 18.080116,27.078888 14.996268,24.034076 14.996268,20.247579 C 14.996268,16.500118 18.041081,13.41627 21.827577,13.41627 C 25.575038,13.41627 28.658886,16.461082 28.658886,20.247579 C 28.658886,24.034076 25.614075,27.078888 21.827577,27.078888 z "
+ class="st0" />
+ <circle
+ style="fill:#404040;fill-opacity:1;stroke:#404040;stroke-width:0.44639024;stroke-opacity:1;overflow:visible"
+ sodipodi:ry="7.9000001"
+ sodipodi:rx="7.9000001"
+ sodipodi:cy="25.4"
+ sodipodi:cx="46.299999"
+ id="circle2362"
+ r="7.9000001"
+ cy="25.4"
+ cx="46.299999"
+ class="st0"
+ transform="matrix(0.8789325,0,0,0.8789325,-18.866997,-2.0353805)" />
+ <circle
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.00508869;stroke-opacity:1;overflow:visible"
+ sodipodi:ry="7.9000001"
+ sodipodi:rx="7.9000001"
+ sodipodi:cy="25.4"
+ sodipodi:cx="46.299999"
+ id="circle11"
+ r="7.9000001"
+ cy="25.4"
+ cx="46.299999"
+ class="st0"
+ transform="matrix(0.3903605,0,0,0.3903605,3.7538862,10.371458)" />
+ </g>
+ </g>
+</svg>
diff --git a/icons/import_sensor.svg b/icons/import_sensor.svg
new file mode 100644
index 0000000..e55d7ce
--- /dev/null
+++ b/icons/import_sensor.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#010101">
+ <!ENTITY fill_color "#FFFFFF">
+]><svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="activity-measure">
+ <g>
+ <path d="M48.143,36.983c0,3.3-2.7,6-6,6H12.705c-3.3,0-6-2.7-6-6V18.213c0-3.3,2.7-6,6-6h29.438c3.3,0,6,2.7,6,6 V36.983z" fill="&fill_color;"/>
+ <path d="M48.143,36.983c0,3.3-2.7,6-6,6H12.705 c-3.3,0-6-2.7-6-6V18.213c0-3.3,2.7-6,6-6h29.438c3.3,0,6,2.7,6,6V36.983z" fill="none" stroke="&stroke_color;" stroke-linejoin="round" stroke-width="3.5"/>
+ </g>
+ <path d="M8.007,27.598 c10.118,0,6.243,9.431,11.213,9.431c4.375,0,2.154-19.154,6.279-19.154c4.875,0,1.719,19.154,6.719,19.154 c4.406,0,1.781-11.529,5.156-11.529s2,4.875,4.25,4.875c2.375,0,0.25-3.375,5.75-3.375" fill="&fill_color;" stroke="&stroke_color;" stroke-linejoin="round" stroke-width="3.5"/>
+</g></svg> \ No newline at end of file
diff --git a/icons/import_sound.svg b/icons/import_sound.svg
new file mode 100644
index 0000000..a2c5ba8
--- /dev/null
+++ b/icons/import_sound.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="42"
+ height="42"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.45.1"
+ version="1.0"
+ sodipodi:docbase="/home/msgodoi/olpc/workspace/Memorize.activity/images"
+ sodipodi:docname="import_sound.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16.119048"
+ inkscape:cx="21"
+ inkscape:cy="22.457633"
+ inkscape:document-units="px"
+ inkscape:current-layer="g6207"
+ width="42px"
+ height="42px"
+ inkscape:window-width="1432"
+ inkscape:window-height="871"
+ inkscape:window-x="4"
+ inkscape:window-y="25" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g6207"
+ transform="matrix(1.1572772,0,0,1.1572772,-4.2605572,6.7107864)">
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path2327"
+ d="M 5.211226,20.224521 C 16.756465,32.39809 27.826101,31.198735 38.711967,20.22452 C 34.369968,16.906754 27.814245,8.5157151 21.961596,13.896602 C 13.884782,9.0002916 10.160766,16.276986 5.211226,20.224521 z "
+ style="fill:#404040;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.59229163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1" />
+ <path
+ id="path4267"
+ d="M 5.4593796,20.224519 C 38.339735,20.224519 38.339735,20.472673 38.339735,20.472673"
+ style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.59229163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.59229159;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 21.479131,-4.0705774 C 21.479131,12.654873 21.479131,3.3232479 21.479131,9.1167959"
+ id="path8177"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.59229183;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 26.27629,4.3453376 C 20.432698,10.18893 23.693011,6.9286162 21.668843,8.9527852"
+ id="path9150"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.59229183;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 16.709475,4.3879849 C 22.553067,10.231577 19.292754,6.9712635 21.316922,8.9954325"
+ id="path9152"
+ sodipodi:nodetypes="cc" />
+ </g>
+ </g>
+</svg>
diff --git a/icons/pair-add.svg b/icons/pair-add.svg
new file mode 100644
index 0000000..37d1e4d
--- /dev/null
+++ b/icons/pair-add.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="42"
+ height="42"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.45.1"
+ version="1.0"
+ sodipodi:docname="pair-new.svg"
+ sodipodi:docbase="/home/msgodoi/olpc/workspace/Memorize.activity/images"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="12.238095"
+ inkscape:cx="21"
+ inkscape:cy="21"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ width="42px"
+ height="42px"
+ inkscape:window-width="806"
+ inkscape:window-height="718"
+ inkscape:window-x="522"
+ inkscape:window-y="132" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:#4c4d4f;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect7017"
+ width="30.046175"
+ height="30.046175"
+ x="1.9769126"
+ y="1.9769124"
+ ry="4.5299301" />
+ <rect
+ style="fill:#4c4d4f;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3133"
+ width="30.046175"
+ height="30.046175"
+ x="9.9769125"
+ y="9.9769125"
+ ry="4.5299301" />
+ <g
+ id="g8128"
+ transform="matrix(1.1533304,0,0,1.1849266,64.979745,2.4656882)"
+ style="stroke:#ffffff;stroke-opacity:1">
+ <path
+ sodipodi:nodetypes="cccccc"
+ id="path6167"
+ d="M -27.423669,19.213102 L -34.384959,18.667751 L -41.332006,19.051133 L -34.303975,19.649604 L -27.488656,19.213102 L -34.44067,18.736178"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;marker-start:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ id="path6165"
+ d="M -34.432262,26.112846 L -33.886911,19.151556 L -34.270293,12.204509 L -34.868764,19.23254 L -34.432262,26.047859 L -33.955338,19.095845"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;marker-start:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ id="path6169"
+ d="M -29.517762,24.133282 L -34.054516,18.825285 L -39.237912,14.184073 L -34.691527,19.576825 L -29.563716,24.087329 L -34.142295,18.834277"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;marker-start:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ id="path6171"
+ d="M -29.403233,14.298603 L -34.71123,18.835357 L -39.352442,24.018753 L -33.959691,19.472367 L -29.449186,14.344555 L -34.702238,18.923135"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;marker-start:none;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/icons/pair-update.svg b/icons/pair-update.svg
new file mode 100644
index 0000000..d251be5
--- /dev/null
+++ b/icons/pair-update.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="42"
+ height="42"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.45.1"
+ version="1.0"
+ sodipodi:docname="pair-update.svg"
+ sodipodi:docbase="/home/msgodoi/olpc/workspace/Memorize.activity/images"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="21"
+ inkscape:cy="21"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ width="42px"
+ height="42px"
+ inkscape:window-width="1432"
+ inkscape:window-height="871"
+ inkscape:window-x="4"
+ inkscape:window-y="25" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:#4c4d4f;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect7017"
+ width="30.046175"
+ height="30.046175"
+ x="1.9769126"
+ y="1.9769124"
+ ry="4.5299301" />
+ <rect
+ style="fill:#4c4d4f;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3133"
+ width="30.046175"
+ height="30.046175"
+ x="9.9769125"
+ y="9.9769125"
+ ry="4.5299301" />
+ <g
+ id="g7384"
+ transform="matrix(0.7398804,-0.1417707,0.1417707,0.7398804,3.1769353,8.481073)">
+ <g
+ id="g8361"
+ style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.32742107;stroke-linecap:round;stroke-opacity:1"
+ transform="matrix(-0.9813845,-0.1920532,0.1920532,-0.9813845,45.325983,56.360102)">
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.65484214;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 17.241246,23.778211 C 18.873784,13.334226 32.631006,13.66595 33.910507,23.614787"
+ id="path8363"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.65484214;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 14.571628,18.545494 L 17.02506,23.922425 L 22.654737,22.143297 L 22.654737,22.143297"
+ id="path8365" />
+ </g>
+ </g>
+ <g
+ id="g8380"
+ transform="matrix(-0.7454146,0.108991,-0.108991,-0.7454146,47.363957,41.428291)">
+ <g
+ id="g8382"
+ style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.32742107;stroke-linecap:round;stroke-opacity:1"
+ transform="matrix(-0.9813845,-0.1920532,0.1920532,-0.9813845,45.325983,56.360102)">
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.65484214;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 17.241246,23.778211 C 18.873784,13.334226 32.631006,13.66595 33.910507,23.614787"
+ id="path8384"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.65484214;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 14.571628,18.545494 L 17.02506,23.922425 L 22.654737,22.143297 L 22.654737,22.143297"
+ id="path8386" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/icons/speak.svg b/icons/speak.svg
new file mode 100644
index 0000000..82d12a5
--- /dev/null
+++ b/icons/speak.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY fill_color "#FFFFFF">
+ <!ENTITY stroke_color "#000000">
+]>
+<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
+ <ellipse fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" cx="13" cy="17" rx="10" ry="10"/>
+ <ellipse fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" cx="37" cy="17" rx="10" ry="10"/>
+ <circle fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" cx="17" cy="15" r="2"/>
+ <circle fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" cx="41" cy="15" r="2"/>
+ <ellipse fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" cx="26" cy="39" rx="20" ry="4"/>
+</svg>
+
diff --git a/images/card.svg b/images/card.svg
new file mode 100644
index 0000000..5db83ce
--- /dev/null
+++ b/images/card.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+ <!ENTITY stroke_color "#000000">
+ <!ENTITY fill_color "#888888">
+ <!ENTITY opacity "0">
+]>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="size_card1"
+ height="size_card1"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.45"
+ sodipodi:modified="true"
+ version="1.0">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4"
+ inkscape:cx="71.742462"
+ inkscape:cy="67.822008"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ width="119px"
+ height="119px"
+ inkscape:window-width="1434"
+ inkscape:window-height="848"
+ inkscape:window-x="0"
+ inkscape:window-y="0" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:&stroke_color;;fill-opacity:0;stroke:&stroke_color;;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2160"
+ width="size_card2"
+ height="size_card2"
+ x="3.0095644"
+ y="3.0095644"
+ ry="9.8352585" />
+ <rect
+ style="fill:&fill_color;;fill-opacity:&opacity;;stroke:&fill_color;;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3133"
+ width="size_card3"
+ height="size_card3"
+ x="8.7060242"
+ y="8.7060242"
+ ry="4.1414652" />
+ </g>
+</svg>
diff --git a/images/equal_pairs1.svg b/images/equal_pairs1.svg
new file mode 100644
index 0000000..47544eb
--- /dev/null
+++ b/images/equal_pairs1.svg
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="55"
+ height="55"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.45.1"
+ version="1.0"
+ sodipodi:docname="equal_pairs1.svg"
+ sodipodi:docbase="/home/msgodoi/olpc/workspace/Memorize.activity/images"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#404040"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="12.309091"
+ inkscape:cx="27.5"
+ inkscape:cy="27.5"
+ inkscape:document-units="px"
+ inkscape:current-layer="g5562"
+ width="55px"
+ height="55px"
+ inkscape:window-width="1432"
+ inkscape:window-height="871"
+ inkscape:window-x="4"
+ inkscape:window-y="25" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g5499"
+ transform="translate(-0.7444609,-1.3648449)">
+ <g
+ id="g5512"
+ transform="matrix(1.0512821,0,0,1.051282,-6.381851e-2,0.8717949)">
+ <g
+ id="g5562"
+ transform="translate(0.4512195,17.493391)">
+ <rect
+ style="fill:#404040;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.42682922;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4522"
+ width="23.304878"
+ height="23.304878"
+ x="1.9822657"
+ y="-15.359758"
+ ry="2.184521"
+ rx="2.184521" />
+ <rect
+ style="fill:#404040;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.42682922;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4470"
+ width="23.304878"
+ height="23.304878"
+ x="27.665192"
+ y="-15.359757"
+ ry="2.184521"
+ rx="2.184521" />
+ <rect
+ style="fill:#404040;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.42682922;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4476"
+ width="23.304878"
+ height="23.304878"
+ x="1.9822657"
+ y="10.32317"
+ ry="2.184521"
+ rx="2.184521" />
+ <rect
+ style="fill:#404040;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.42682922;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4482"
+ width="23.304878"
+ height="23.304878"
+ x="27.665192"
+ y="10.323171"
+ ry="2.184521"
+ rx="2.184521" />
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/images/equal_pairs2.svg b/images/equal_pairs2.svg
new file mode 100644
index 0000000..700d0cb
--- /dev/null
+++ b/images/equal_pairs2.svg
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="55"
+ height="55"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.45.1"
+ version="1.0"
+ sodipodi:docname="equal_pairs2.svg"
+ sodipodi:docbase="/home/msgodoi/olpc/workspace/Memorize.activity/images"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#404040"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="12.309091"
+ inkscape:cx="27.5"
+ inkscape:cy="27.5"
+ inkscape:document-units="px"
+ inkscape:current-layer="g5562"
+ width="55px"
+ height="55px"
+ inkscape:window-width="1432"
+ inkscape:window-height="871"
+ inkscape:window-x="4"
+ inkscape:window-y="25" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g5499"
+ transform="translate(-0.7444609,-1.3648449)">
+ <g
+ id="g5512"
+ transform="matrix(1.0512821,0,0,1.051282,-6.381851e-2,0.8717949)">
+ <g
+ id="g5562"
+ transform="translate(0.4512195,17.493391)">
+ <rect
+ style="fill:#404040;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.42682922;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4522"
+ width="23.304878"
+ height="23.304878"
+ x="1.9822657"
+ y="-15.359758"
+ ry="2.184521"
+ rx="2.184521" />
+ <text
+ xml:space="preserve"
+ style="font-size:11.1061306px;font-style:normal;font-weight:normal;fill:#c7c8cc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="5.497498"
+ y="4.3117237"
+ id="text4526"><tspan
+ sodipodi:role="line"
+ id="tspan4528"
+ x="5.497498"
+ y="4.3117237"
+ style="font-size:22px;font-weight:bold;fill:#c7c8cc;fill-opacity:1">1</tspan></text>
+ <rect
+ style="fill:#404040;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.42682922;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4470"
+ width="23.304878"
+ height="23.304878"
+ x="27.665192"
+ y="-15.359757"
+ ry="2.184521"
+ rx="2.184521" />
+ <text
+ xml:space="preserve"
+ style="font-size:11.1061306px;font-style:normal;font-weight:normal;fill:#c7c8cc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="31.180424"
+ y="4.3117247"
+ id="text4472"><tspan
+ sodipodi:role="line"
+ id="tspan4474"
+ x="31.180424"
+ y="4.3117247"
+ style="font-size:22px;font-weight:bold;fill:#c7c8cc;fill-opacity:1">1</tspan></text>
+ <rect
+ style="fill:#404040;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.42682922;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4476"
+ width="23.304878"
+ height="23.304878"
+ x="1.9822657"
+ y="10.32317"
+ ry="2.184521"
+ rx="2.184521" />
+ <text
+ xml:space="preserve"
+ style="font-size:11.1061306px;font-style:normal;font-weight:normal;fill:#c7c8cc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="6.066834"
+ y="30.139671"
+ id="text4478"><tspan
+ sodipodi:role="line"
+ id="tspan4480"
+ x="6.066834"
+ y="30.139671"
+ style="font-size:22px;font-weight:bold;fill:#c7c8cc;fill-opacity:1">2</tspan></text>
+ <rect
+ style="fill:#404040;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.42682922;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4482"
+ width="23.304878"
+ height="23.304878"
+ x="27.665192"
+ y="10.323171"
+ ry="2.184521"
+ rx="2.184521" />
+ <text
+ xml:space="preserve"
+ style="font-size:11.1061306px;font-style:normal;font-weight:normal;fill:#c7c8cc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="31.74976"
+ y="30.139671"
+ id="text4484"><tspan
+ sodipodi:role="line"
+ id="tspan4486"
+ x="31.74976"
+ y="30.139671"
+ style="font-size:22px;font-weight:bold;fill:#c7c8cc;fill-opacity:1">2</tspan></text>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/images/game-load.svg b/images/game-load.svg
new file mode 100644
index 0000000..4222b7a
--- /dev/null
+++ b/images/game-load.svg
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="55px"
+ version="1.1"
+ viewBox="0 0 55 55"
+ width="55px"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg5142"
+ sodipodi:version="0.32"
+ inkscape:version="0.45.1"
+ sodipodi:docname="game-load.svg"
+ sodipodi:docbase="/home/msgodoi/olpc/workspace/Memorize.activity/images"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
+ id="metadata5176"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs5174">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ </defs><sodipodi:namedview
+ inkscape:window-height="871"
+ inkscape:window-width="1432"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.96862745"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#4b4b4b"
+ id="base"
+ inkscape:zoom="12.145455"
+ inkscape:cx="27.5"
+ inkscape:cy="30.793413"
+ inkscape:window-x="4"
+ inkscape:window-y="25"
+ inkscape:current-layer="g4140" /><g
+ id="g5125"
+ transform="translate(-2,2)"><g
+ id="g5147">
+ <g
+ id="g5149">
+ <path
+ style="fill:#ffffff;stroke:#8c8c8c;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round"
+ id="path5151"
+ d="M 6.736,49.002 L 31.256,49.002 C 33.481,49.002 34.695,47.555 34.695,45.561 L 34.695,18.281 C 34.695,16.551 32.963,14.84 31.256,14.84 L 26.867,14.84" />
+ </g>
+ </g><g
+ id="g5153">
+ <g
+ id="g5155">
+ <path
+ style="fill:#ffffff;stroke:#8c8c8c;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round"
+ id="path5157"
+ d="M 26.867,38.592 C 26.867,40.428 25.522,41.793 23.426,42.639 L 6.736,49.002 L 6.736,14.84 L 23.426,6.241 C 25.654,5.847 26.867,7.081 26.867,9.075 L 26.867,38.592 z " />
+ </g>
+ </g><path
+ style="fill:none;stroke:#8c8c8c;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round"
+ id="path5159"
+ d="M 9.424,42.607 C 9.424,42.607 8.073,42.064 6.722,42.064 C 5.371,42.064 4.019,42.607 4.019,42.607" /><path
+ style="fill:none;stroke:#8c8c8c;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round"
+ id="path5161"
+ d="M 9.424,32.006 C 9.424,32.006 8.185,31.463 6.609,31.463 C 5.032,31.463 4.019,32.006 4.019,32.006" /><path
+ style="fill:none;stroke:#8c8c8c;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round"
+ id="path5163"
+ d="M 9.424,21.678 C 9.424,21.678 8.299,21.134 6.497,21.134 C 4.695,21.134 4.019,21.678 4.019,21.678" /><line
+ style="fill:none;stroke:#8c8c8c;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round"
+ id="line5165"
+ y2="11.505"
+ y1="46.533001"
+ x2="13.209"
+ x1="13.209" /></g><g
+ id="g4140"
+ transform="matrix(0.8372116,0,0,0.8372116,8.751416,-7.2720533e-2)"><rect
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.79166174;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2221"
+ height="5.0509453"
+ width="5.0529833"
+ y="2.5762157"
+ x="32.743912" /><rect
+ style="fill:#404040;stroke:#ffffff;stroke-width:1.79166175;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+ id="rect2223"
+ height="5.0509453"
+ width="5.0529833"
+ y="2.5764074"
+ x="40.25333" /><rect
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.79166175;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+ id="rect2225"
+ height="5.0509453"
+ width="5.0529833"
+ y="2.5764074"
+ x="47.70649" /><rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.79166174;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2227"
+ height="5.0509453"
+ width="5.0529833"
+ y="10.110711"
+ x="32.743912" /><rect
+ style="fill:#404040;fill-opacity:1;stroke:#ffffff;stroke-width:1.79166174;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2229"
+ height="5.0509453"
+ width="5.0529833"
+ y="17.624184"
+ x="40.25333" /><rect
+ style="fill:#404040;stroke:#ffffff;stroke-width:1.79166175;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+ id="rect2231"
+ height="5.0509453"
+ width="5.0529833"
+ y="10.110903"
+ x="47.70649" /><rect
+ style="fill:#404040;fill-opacity:1;stroke:#ffffff;stroke-width:1.79166174;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2233"
+ height="5.0509453"
+ width="5.0529833"
+ y="17.623993"
+ x="32.743912" /><rect
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.79166174;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2235"
+ height="5.0509453"
+ width="5.0529833"
+ y="10.110903"
+ x="40.25333" /><rect
+ style="fill:#404040;stroke:#ffffff;stroke-width:1.79166175;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+ id="rect2237"
+ height="5.0509453"
+ width="5.0529833"
+ y="17.624184"
+ x="47.70649" /></g><line
+ style="fill:none;stroke:#ffffff;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ id="line5169"
+ y2="36.425068"
+ y1="22.462688"
+ x2="44.528595"
+ x1="44.72258" /><polyline
+ style="fill:none;stroke:#ffffff;stroke-width:5.1055975;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ id="polyline5171"
+ points=" 51.562,15.306 41.17,16.188 42.053,5.794 "
+ transform="matrix(-0.5053552,0.4648229,-0.493202,-0.4762768,73.4836,10.383118)" /><line
+ style="fill:none;stroke:#ffffff;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ id="line4138"
+ y2="36.52364"
+ y1="36.329655"
+ x2="44.443764"
+ x1="36.409523" /></svg> \ No newline at end of file
diff --git a/images/game-new.svg b/images/game-new.svg
new file mode 100644
index 0000000..b71ccc1
--- /dev/null
+++ b/images/game-new.svg
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Icon"
+ width="43.584"
+ height="43.292"
+ viewBox="0 0 43.584 43.292"
+ overflow="visible"
+ enable-background="new 0 0 43.584 43.292"
+ xml:space="preserve"
+ sodipodi:version="0.32"
+ inkscape:version="0.45.1"
+ sodipodi:docname="game-new.svg"
+ sodipodi:docbase="/home/msgodoi/olpc/workspace/Memorize.activity/images"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
+ id="metadata2242"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs2240" /><sodipodi:namedview
+ inkscape:window-height="879"
+ inkscape:window-width="1440"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="1"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#4b4b4b"
+ id="base"
+ inkscape:zoom="15.637993"
+ inkscape:cx="21.792"
+ inkscape:cy="26.761746"
+ inkscape:window-x="0"
+ inkscape:window-y="21"
+ inkscape:current-layer="Icon"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+<rect
+ x="1.5007635"
+ y="1.5007635"
+ width="8.5757914"
+ height="8.5757914"
+ id="rect2221"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:3.00152707;stroke-opacity:1" />
+<rect
+ x="14.650882"
+ y="1.5007635"
+ width="8.5757914"
+ height="8.5757914"
+ id="rect2223"
+ style="fill:#404040;stroke:#ffffff;stroke-width:3.00152707;stroke-opacity:1;fill-opacity:1" />
+
+
+<rect
+ x="14.522763"
+ y="27.082636"
+ width="8.5757914"
+ height="8.5757914"
+ id="rect2229"
+ style="fill:#404040;fill-opacity:1;stroke:#ffffff;stroke-width:3.00152707;stroke-opacity:1" />
+<rect
+ x="27.300175"
+ y="14.320445"
+ width="8.5757914"
+ height="8.5757914"
+ id="rect2231"
+ style="fill:#404040;fill-opacity:1;stroke:#ffffff;stroke-width:3.00152707;stroke-opacity:1" />
+<rect
+ x="1.5007635"
+ y="27.049763"
+ width="8.5757914"
+ height="8.5757914"
+ id="rect2233"
+ style="fill:#404040;stroke:#ffffff;stroke-width:3.00152707;stroke-opacity:1;fill-opacity:1" />
+<rect
+ x="14.522988"
+ y="14.320445"
+ width="8.5757914"
+ height="8.5757914"
+ id="rect2235"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:3.00152707;stroke-opacity:1" />
+<rect
+ x="27.300175"
+ y="27.049763"
+ width="8.5757914"
+ height="8.5757914"
+ id="rect2237"
+ style="fill:#404040;fill-opacity:1;stroke:#ffffff;stroke-width:3.00152707;stroke-opacity:1" />
+<g
+ id="g8128"
+ transform="matrix(1.1533304,0,0,1.1849266,74.491613,11.842114)"
+ style="stroke:#ffffff;stroke-opacity:1"><path
+ sodipodi:nodetypes="cccccc"
+ id="path6167"
+ d="M -27.423669,19.213102 L -34.384959,18.667751 L -41.332006,19.051133 L -34.303975,19.649604 L -27.488656,19.213102 L -34.44067,18.736178"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;marker-start:none;stroke-opacity:1" /><path
+ sodipodi:nodetypes="cccccc"
+ id="path6165"
+ d="M -34.432262,26.112846 L -33.886911,19.151556 L -34.270293,12.204509 L -34.868764,19.23254 L -34.432262,26.047859 L -33.955338,19.095845"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;marker-start:none;stroke-opacity:1" /><path
+ sodipodi:nodetypes="cccccc"
+ id="path6169"
+ d="M -29.517762,24.133282 L -34.054516,18.825285 L -39.237912,14.184073 L -34.691527,19.576825 L -29.563716,24.087329 L -34.142295,18.834277"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;marker-start:none;stroke-opacity:1" /><path
+ sodipodi:nodetypes="cccccc"
+ id="path6171"
+ d="M -29.403233,14.298603 L -34.71123,18.835357 L -39.352442,24.018753 L -33.959691,19.472367 L -29.449186,14.344555 L -34.702238,18.923135"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;marker-start:none;stroke-opacity:1" /></g><rect
+ x="1.5007635"
+ y="14.320629"
+ width="8.5757914"
+ height="8.5757914"
+ id="rect2337"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:3.00152707;stroke-opacity:1" /><rect
+ x="27.299765"
+ y="1.5004449"
+ width="8.5757914"
+ height="8.5757914"
+ id="rect2339"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:3.00152707;stroke-opacity:1" /></svg> \ No newline at end of file
diff --git a/images/game-restart.svg b/images/game-restart.svg
new file mode 100644
index 0000000..326d4c8
--- /dev/null
+++ b/images/game-restart.svg
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="Icon"
+ width="55"
+ height="55"
+ viewBox="0 0 43.584 43.292"
+ overflow="visible"
+ enable-background="new 0 0 43.584 43.292"
+ xml:space="preserve"
+ sodipodi:version="0.32"
+ inkscape:version="0.45.1"
+ sodipodi:docname="game-restart.svg"
+ sodipodi:docbase="/home/msgodoi/olpc/workspace/Memorize.activity/images"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
+ id="metadata2242"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs2240" /><sodipodi:namedview
+ inkscape:window-height="871"
+ inkscape:window-width="1432"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="1"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#404040"
+ id="base"
+ inkscape:zoom="1"
+ inkscape:cx="27.5"
+ inkscape:cy="27.5"
+ inkscape:window-x="4"
+ inkscape:window-y="25"
+ inkscape:current-layer="g7707"
+ width="55px"
+ height="55px" />
+<rect
+ x="6.5091267"
+ y="12.102893"
+ width="9.3666306"
+ height="9.3634796"
+ id="rect2221"
+ style="fill:#ffffff;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+<rect
+ x="17.313606"
+ y="12.102893"
+ width="9.3666306"
+ height="9.3634796"
+ id="rect2223"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+<rect
+ x="28.118086"
+ y="12.102893"
+ width="9.3666306"
+ height="9.3634796"
+ id="rect2225"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+<rect
+ x="6.5091267"
+ y="22.765926"
+ width="9.3666306"
+ height="9.3634796"
+ id="rect2227"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+<rect
+ x="17.313606"
+ y="22.765926"
+ width="9.3666306"
+ height="9.3634796"
+ id="rect2229"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+<rect
+ x="28.118086"
+ y="22.765926"
+ width="9.3666306"
+ height="9.3634796"
+ id="rect2231"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+<rect
+ x="6.5091267"
+ y="33.428959"
+ width="9.3666306"
+ height="9.3634796"
+ id="rect2233"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+<rect
+ x="17.313606"
+ y="33.428959"
+ width="9.3666306"
+ height="9.3634796"
+ id="rect2235"
+ style="fill:#ffffff;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+<rect
+ x="28.118086"
+ y="33.428959"
+ width="9.3666306"
+ height="9.3634796"
+ id="rect2237"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+<g
+ transform="matrix(0.8205513,0,0,0.8205513,6.0016399,6.8019757)"
+ id="g3696"><g
+ id="g6733"
+ transform="matrix(1.4726213,0,0,1.7601655,-10.157993,1.3703924)"><g
+ id="g7707"
+ transform="matrix(0.7791286,0,0,0.7791286,3.4314416,-1.0263174)"><g
+ id="g8681"
+ transform="translate(-0.2716888,-0.7287783)"><path
+ style="fill:none;fill-rule:evenodd;stroke:#8c8c8c;stroke-width:2.91463447;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 21.479131,-3.6648374 C 21.479131,12.592068 21.479131,3.5218581 21.479131,9.1531062"
+ id="path8177"
+ sodipodi:nodetypes="cc" /><path
+ style="fill:none;fill-rule:evenodd;stroke:#8c8c8c;stroke-width:2.91463447;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 26.27629,4.3453376 C 20.432698,10.18893 23.693011,6.9286162 21.668843,8.9527852"
+ id="path9150"
+ sodipodi:nodetypes="cc" /><path
+ style="fill:none;fill-rule:evenodd;stroke:#8c8c8c;stroke-width:2.91463447;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 16.709475,4.3879849 C 22.553067,10.231577 19.292754,6.9712635 21.316922,8.9954325"
+ id="path9152"
+ sodipodi:nodetypes="cc" /></g></g></g></g></svg> \ No newline at end of file
diff --git a/images/game-save.svg b/images/game-save.svg
new file mode 100644
index 0000000..67742a7
--- /dev/null
+++ b/images/game-save.svg
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="55px"
+ version="1.1"
+ viewBox="0 0 55 55"
+ width="55px"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg5142"
+ sodipodi:version="0.32"
+ inkscape:version="0.45.1"
+ sodipodi:docname="game-save.svg"
+ sodipodi:docbase="/home/msgodoi/olpc/workspace/Memorize.activity/images"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
+ id="metadata5176"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs5174">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ </defs><sodipodi:namedview
+ inkscape:window-height="871"
+ inkscape:window-width="1432"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="1"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#4b4b4b"
+ id="base"
+ inkscape:zoom="12.145455"
+ inkscape:cx="27.5"
+ inkscape:cy="30.793413"
+ inkscape:window-x="4"
+ inkscape:window-y="25"
+ inkscape:current-layer="svg5142" /><g
+ id="g5125"
+ transform="translate(-2,2)"><g
+ id="g5147">
+ <g
+ id="g5149">
+ <path
+ style="fill:#ffffff;stroke:#8c8c8c;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round"
+ id="path5151"
+ d="M 6.736,49.002 L 31.256,49.002 C 33.481,49.002 34.695,47.555 34.695,45.561 L 34.695,18.281 C 34.695,16.551 32.963,14.84 31.256,14.84 L 26.867,14.84" />
+ </g>
+ </g><g
+ id="g5153">
+ <g
+ id="g5155">
+ <path
+ style="fill:#ffffff;stroke:#8c8c8c;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round"
+ id="path5157"
+ d="M 26.867,38.592 C 26.867,40.428 25.522,41.793 23.426,42.639 L 6.736,49.002 L 6.736,14.84 L 23.426,6.241 C 25.654,5.847 26.867,7.081 26.867,9.075 L 26.867,38.592 z " />
+ </g>
+ </g><path
+ style="fill:none;stroke:#8c8c8c;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round"
+ id="path5159"
+ d="M 9.424,42.607 C 9.424,42.607 8.073,42.064 6.722,42.064 C 5.371,42.064 4.019,42.607 4.019,42.607" /><path
+ style="fill:none;stroke:#8c8c8c;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round"
+ id="path5161"
+ d="M 9.424,32.006 C 9.424,32.006 8.185,31.463 6.609,31.463 C 5.032,31.463 4.019,32.006 4.019,32.006" /><path
+ style="fill:none;stroke:#8c8c8c;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round"
+ id="path5163"
+ d="M 9.424,21.678 C 9.424,21.678 8.299,21.134 6.497,21.134 C 4.695,21.134 4.019,21.678 4.019,21.678" /><line
+ style="fill:none;stroke:#8c8c8c;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round"
+ id="line5165"
+ y2="11.505"
+ y1="46.533001"
+ x2="13.209"
+ x1="13.209" /></g><line
+ style="fill:none;stroke:#ffffff;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ id="line5169"
+ y2="36.425068"
+ y1="22.462688"
+ x2="45.845959"
+ x1="46.039944" /><polyline
+ style="fill:none;stroke:#ffffff;stroke-width:5.1055975;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ id="polyline5171"
+ points=" 51.562,15.306 41.17,16.188 42.053,5.794 "
+ transform="matrix(0.4648229,0.5053552,-0.4762768,0.493202,24.919883,7.4889306)" /><line
+ style="fill:none;stroke:#ffffff;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ id="line4138"
+ y2="36.52364"
+ y1="36.329655"
+ x2="45.78508"
+ x1="37.750839" /><rect
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2221"
+ height="4.2287102"
+ width="4.2304163"
+ y="2.0430667"
+ x="36.411789" /><rect
+ style="fill:#404040;fill-opacity:1;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2223"
+ height="4.2287102"
+ width="4.2304163"
+ y="2.0432274"
+ x="42.698757" /><rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2225"
+ height="4.2287102"
+ width="4.2304163"
+ y="2.0432274"
+ x="48.938633" /><rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2227"
+ height="4.2287102"
+ width="4.2304163"
+ y="8.3510332"
+ x="36.411789" /><rect
+ style="fill:#404040;fill-opacity:1;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2229"
+ height="4.2287102"
+ width="4.2304163"
+ y="14.641401"
+ x="42.698757" /><rect
+ style="fill:#404040;fill-opacity:1;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2231"
+ height="4.2287102"
+ width="4.2304163"
+ y="8.3511934"
+ x="48.938633" /><rect
+ style="fill:#404040;fill-opacity:1;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2233"
+ height="4.2287102"
+ width="4.2304163"
+ y="14.641241"
+ x="36.411789" /><rect
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2235"
+ height="4.2287102"
+ width="4.2304163"
+ y="8.3511934"
+ x="42.698757" /><rect
+ style="fill:#404040;fill-opacity:1;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2237"
+ height="4.2287102"
+ width="4.2304163"
+ y="14.641401"
+ x="48.938633" /></svg> \ No newline at end of file
diff --git a/images/score.svg b/images/score.svg
new file mode 100644
index 0000000..5b779fc
--- /dev/null
+++ b/images/score.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+ <!ENTITY stroke_color "#020202">
+ <!ENTITY fill_color "#B2B2B2">
+]>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="30"
+ height="30"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.45"
+ version="1.0"
+ sodipodi:docname="score.svg"
+ sodipodi:docbase="/home/msgodoi/olpc/sugar-jhbuild/build/share/activities/Memorize.activity"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:modified="true">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="12.238095"
+ inkscape:cx="21"
+ inkscape:cy="21"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ width="42px"
+ height="42px"
+ inkscape:window-width="806"
+ inkscape:window-height="718"
+ inkscape:window-x="580"
+ inkscape:window-y="114" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:&fill_color;;fill-opacity:1;fill-rule:evenodd;stroke:&stroke_color;;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect7017"
+ width="22.5"
+ height="22.5"
+ x="1.25"
+ y="1.25"
+ ry="2.5299301" />
+ <rect
+ style="fill:&fill_color;;fill-opacity:1;fill-rule:evenodd;stroke:&stroke_color;;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3133"
+ width="22.5"
+ height="22.5"
+ x="6.0769125"
+ y="6.0769125"
+ ry="2.5299301" />
+ </g>
+</svg>
diff --git a/images/stock-buddy.svg b/images/stock-buddy.svg
new file mode 100644
index 0000000..7ed2aa6
--- /dev/null
+++ b/images/stock-buddy.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+ <!ENTITY stroke_color "#020202">
+ <!ENTITY fill_color "#B2B2B2">
+]>
+<svg version="1.1" id="Icon" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="37.855" height="53.047"
+ viewBox="0 0 37.855 53.047" overflow="visible" enable-background="new 0 0 37.855 53.047" xml:space="preserve">
+<path fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" d="M24.787,34.124l10.1,10.1c0.752,0.75,1.217,1.785,1.217,2.932
+ c0,2.287-1.855,4.143-4.146,4.143c-1.145,0-2.178-0.463-2.932-1.211l-10.1-10.102l-10.1,10.1c-0.75,0.75-1.787,1.211-2.933,1.211
+ c-2.285,0-4.142-1.854-4.142-4.141c0-1.146,0.465-2.184,1.212-2.934l10.103-10.1L2.963,24.02c-0.747-0.749-1.212-1.785-1.212-2.93
+ c0-2.289,1.853-4.145,4.145-4.145c1.143,0,2.18,0.465,2.93,1.214L18.925,28.26l10.1-10.102c0.754-0.749,1.787-1.214,2.934-1.214
+ c2.289,0,4.146,1.856,4.146,4.145c0,1.145-0.467,2.179-1.217,2.93L24.787,34.124z"/>
+<circle fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5" cx="18.925" cy="9.872" r="8.122"/>
+</svg>
diff --git a/images/white.png b/images/white.png
new file mode 100644
index 0000000..a601c49
--- /dev/null
+++ b/images/white.png
Binary files differ
diff --git a/locale/af/LC_MESSAGES/org.laptop.Memorize.mo b/locale/af/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/af/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/af/activity.linfo b/locale/af/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/af/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/am/LC_MESSAGES/org.laptop.Memorize.mo b/locale/am/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/am/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/am/activity.linfo b/locale/am/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/am/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ar/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ar/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..abb645c
--- /dev/null
+++ b/locale/ar/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ar/activity.linfo b/locale/ar/activity.linfo
new file mode 100644
index 0000000..3bccf1a
--- /dev/null
+++ b/locale/ar/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = تذكّر
diff --git a/locale/ay/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ay/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..6841de2
--- /dev/null
+++ b/locale/ay/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ay/activity.linfo b/locale/ay/activity.linfo
new file mode 100644
index 0000000..14da9c1
--- /dev/null
+++ b/locale/ay/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = P'iqin katuña
diff --git a/locale/bg/LC_MESSAGES/org.laptop.Memorize.mo b/locale/bg/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..4c0e29f
--- /dev/null
+++ b/locale/bg/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/bg/activity.linfo b/locale/bg/activity.linfo
new file mode 100644
index 0000000..5a6eb20
--- /dev/null
+++ b/locale/bg/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Запаметяване
diff --git a/locale/bi/LC_MESSAGES/org.laptop.Memorize.mo b/locale/bi/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/bi/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/bi/activity.linfo b/locale/bi/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/bi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/bn/LC_MESSAGES/org.laptop.Memorize.mo b/locale/bn/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..a955d94
--- /dev/null
+++ b/locale/bn/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/bn/activity.linfo b/locale/bn/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/bn/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/bn_IN/LC_MESSAGES/org.laptop.Memorize.mo b/locale/bn_IN/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..5aaf559
--- /dev/null
+++ b/locale/bn_IN/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/bn_IN/activity.linfo b/locale/bn_IN/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/bn_IN/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ca/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ca/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..d16ede8
--- /dev/null
+++ b/locale/ca/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ca/activity.linfo b/locale/ca/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/ca/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/cpp/LC_MESSAGES/org.laptop.Memorize.mo b/locale/cpp/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/cpp/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/cpp/activity.linfo b/locale/cpp/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/cpp/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/cs/LC_MESSAGES/org.laptop.Memorize.mo b/locale/cs/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/cs/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/cs/activity.linfo b/locale/cs/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/cs/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/de/LC_MESSAGES/org.laptop.Memorize.mo b/locale/de/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..7a6a42b
--- /dev/null
+++ b/locale/de/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/de/activity.linfo b/locale/de/activity.linfo
new file mode 100644
index 0000000..bc8b097
--- /dev/null
+++ b/locale/de/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Merken
diff --git a/locale/dz/LC_MESSAGES/org.laptop.Memorize.mo b/locale/dz/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/dz/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/dz/activity.linfo b/locale/dz/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/dz/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/el/LC_MESSAGES/org.laptop.Memorize.mo b/locale/el/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..aeeafc9
--- /dev/null
+++ b/locale/el/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/el/activity.linfo b/locale/el/activity.linfo
new file mode 100644
index 0000000..f6de4b5
--- /dev/null
+++ b/locale/el/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Απομνημόνευση
diff --git a/locale/en/LC_MESSAGES/org.laptop.Memorize.mo b/locale/en/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/en/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/en/activity.linfo b/locale/en/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/en/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/es/LC_MESSAGES/org.laptop.Memorize.mo b/locale/es/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..bebc266
--- /dev/null
+++ b/locale/es/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/es/activity.linfo b/locale/es/activity.linfo
new file mode 100644
index 0000000..a58b0ce
--- /dev/null
+++ b/locale/es/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorizar
diff --git a/locale/fa/LC_MESSAGES/org.laptop.Memorize.mo b/locale/fa/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..5abad18
--- /dev/null
+++ b/locale/fa/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/fa/activity.linfo b/locale/fa/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/fa/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/fa_AF/LC_MESSAGES/org.laptop.Memorize.mo b/locale/fa_AF/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dae4235
--- /dev/null
+++ b/locale/fa_AF/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/fa_AF/activity.linfo b/locale/fa_AF/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/fa_AF/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ff/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ff/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/ff/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ff/activity.linfo b/locale/ff/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/ff/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/fil/LC_MESSAGES/org.laptop.Memorize.mo b/locale/fil/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..700afc0
--- /dev/null
+++ b/locale/fil/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/fil/activity.linfo b/locale/fil/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/fil/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/fr/LC_MESSAGES/org.laptop.Memorize.mo b/locale/fr/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..12b9fc0
--- /dev/null
+++ b/locale/fr/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/fr/activity.linfo b/locale/fr/activity.linfo
new file mode 100644
index 0000000..c79511c
--- /dev/null
+++ b/locale/fr/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Mémoriser
diff --git a/locale/gu/LC_MESSAGES/org.laptop.Memorize.mo b/locale/gu/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..60aa5bc
--- /dev/null
+++ b/locale/gu/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/gu/activity.linfo b/locale/gu/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/gu/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ha/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ha/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/ha/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ha/activity.linfo b/locale/ha/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/ha/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/he/LC_MESSAGES/org.laptop.Memorize.mo b/locale/he/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/he/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/he/activity.linfo b/locale/he/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/he/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/hi/LC_MESSAGES/org.laptop.Memorize.mo b/locale/hi/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/hi/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/hi/activity.linfo b/locale/hi/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/hi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ht/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ht/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..9fa14b6
--- /dev/null
+++ b/locale/ht/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ht/activity.linfo b/locale/ht/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/ht/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/hu/LC_MESSAGES/org.laptop.Memorize.mo b/locale/hu/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/hu/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/hu/activity.linfo b/locale/hu/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/hu/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ig/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ig/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/ig/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ig/activity.linfo b/locale/ig/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/ig/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/is/LC_MESSAGES/org.laptop.Memorize.mo b/locale/is/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/is/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/is/activity.linfo b/locale/is/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/is/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/it/LC_MESSAGES/org.laptop.Memorize.mo b/locale/it/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..406475f
--- /dev/null
+++ b/locale/it/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/it/activity.linfo b/locale/it/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/it/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ja/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ja/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..4d7e6e9
--- /dev/null
+++ b/locale/ja/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ja/activity.linfo b/locale/ja/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/ja/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/km/LC_MESSAGES/org.laptop.Memorize.mo b/locale/km/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..bf49874
--- /dev/null
+++ b/locale/km/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/km/activity.linfo b/locale/km/activity.linfo
new file mode 100644
index 0000000..9e8569a
--- /dev/null
+++ b/locale/km/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = ទន្ទេញ
diff --git a/locale/ko/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ko/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/ko/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ko/activity.linfo b/locale/ko/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/ko/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/kos/LC_MESSAGES/org.laptop.Memorize.mo b/locale/kos/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..9cdf85b
--- /dev/null
+++ b/locale/kos/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/kos/activity.linfo b/locale/kos/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/kos/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/mg/LC_MESSAGES/org.laptop.Memorize.mo b/locale/mg/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/mg/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/mg/activity.linfo b/locale/mg/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/mg/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/mk/LC_MESSAGES/org.laptop.Memorize.mo b/locale/mk/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/mk/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/mk/activity.linfo b/locale/mk/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/mk/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ml/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ml/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/ml/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ml/activity.linfo b/locale/ml/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/ml/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/mn/LC_MESSAGES/org.laptop.Memorize.mo b/locale/mn/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..1e01fb5
--- /dev/null
+++ b/locale/mn/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/mn/activity.linfo b/locale/mn/activity.linfo
new file mode 100644
index 0000000..351698d
--- /dev/null
+++ b/locale/mn/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Цээжлэх
diff --git a/locale/mr/LC_MESSAGES/org.laptop.Memorize.mo b/locale/mr/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..fddaf11
--- /dev/null
+++ b/locale/mr/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/mr/activity.linfo b/locale/mr/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/mr/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ms/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ms/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/ms/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ms/activity.linfo b/locale/ms/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/ms/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/mvo/LC_MESSAGES/org.laptop.Memorize.mo b/locale/mvo/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/mvo/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/mvo/activity.linfo b/locale/mvo/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/mvo/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/na/LC_MESSAGES/org.laptop.Memorize.mo b/locale/na/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/na/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/na/activity.linfo b/locale/na/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/na/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/nb/LC_MESSAGES/org.laptop.Memorize.mo b/locale/nb/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..8dd7263
--- /dev/null
+++ b/locale/nb/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/nb/activity.linfo b/locale/nb/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/nb/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ne/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ne/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..8bb20dd
--- /dev/null
+++ b/locale/ne/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ne/activity.linfo b/locale/ne/activity.linfo
new file mode 100644
index 0000000..810bd32
--- /dev/null
+++ b/locale/ne/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = याद गर
diff --git a/locale/nl/LC_MESSAGES/org.laptop.Memorize.mo b/locale/nl/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..81f268c
--- /dev/null
+++ b/locale/nl/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/nl/activity.linfo b/locale/nl/activity.linfo
new file mode 100644
index 0000000..e8bb392
--- /dev/null
+++ b/locale/nl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Onthouden
diff --git a/locale/pa/LC_MESSAGES/org.laptop.Memorize.mo b/locale/pa/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/pa/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/pa/activity.linfo b/locale/pa/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/pa/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/pap/LC_MESSAGES/org.laptop.Memorize.mo b/locale/pap/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..b292ef0
--- /dev/null
+++ b/locale/pap/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/pap/activity.linfo b/locale/pap/activity.linfo
new file mode 100644
index 0000000..562d381
--- /dev/null
+++ b/locale/pap/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorisá
diff --git a/locale/pis/LC_MESSAGES/org.laptop.Memorize.mo b/locale/pis/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/pis/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/pis/activity.linfo b/locale/pis/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/pis/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/pl/LC_MESSAGES/org.laptop.Memorize.mo b/locale/pl/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/pl/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/pl/activity.linfo b/locale/pl/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/pl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ps/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ps/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..c500278
--- /dev/null
+++ b/locale/ps/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ps/activity.linfo b/locale/ps/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/ps/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/pt/LC_MESSAGES/org.laptop.Memorize.mo b/locale/pt/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..e6dce81
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/pt/activity.linfo b/locale/pt/activity.linfo
new file mode 100644
index 0000000..a58b0ce
--- /dev/null
+++ b/locale/pt/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorizar
diff --git a/locale/pt_BR/LC_MESSAGES/org.laptop.Memorize.mo b/locale/pt_BR/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..17ed667
--- /dev/null
+++ b/locale/pt_BR/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/pt_BR/activity.linfo b/locale/pt_BR/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/pt_BR/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/qu/LC_MESSAGES/org.laptop.Memorize.mo b/locale/qu/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/qu/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/qu/activity.linfo b/locale/qu/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/qu/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ro/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ro/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/ro/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ro/activity.linfo b/locale/ro/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/ro/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ru/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ru/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/ru/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ru/activity.linfo b/locale/ru/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/ru/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/rw/LC_MESSAGES/org.laptop.Memorize.mo b/locale/rw/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..0713881
--- /dev/null
+++ b/locale/rw/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/rw/activity.linfo b/locale/rw/activity.linfo
new file mode 100644
index 0000000..9493799
--- /dev/null
+++ b/locale/rw/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Fata mumutwe
diff --git a/locale/sd/LC_MESSAGES/org.laptop.Memorize.mo b/locale/sd/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/sd/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/sd/activity.linfo b/locale/sd/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/sd/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/si/LC_MESSAGES/org.laptop.Memorize.mo b/locale/si/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..0d3bc37
--- /dev/null
+++ b/locale/si/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/si/activity.linfo b/locale/si/activity.linfo
new file mode 100644
index 0000000..6236e29
--- /dev/null
+++ b/locale/si/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = මතක තබා ගන්න
diff --git a/locale/sk/LC_MESSAGES/org.laptop.Memorize.mo b/locale/sk/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/sk/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/sk/activity.linfo b/locale/sk/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/sk/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/sl/LC_MESSAGES/org.laptop.Memorize.mo b/locale/sl/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..ad74202
--- /dev/null
+++ b/locale/sl/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/sl/activity.linfo b/locale/sl/activity.linfo
new file mode 100644
index 0000000..cd6fa13
--- /dev/null
+++ b/locale/sl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Spomin
diff --git a/locale/sq/LC_MESSAGES/org.laptop.Memorize.mo b/locale/sq/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..6cc0eb9
--- /dev/null
+++ b/locale/sq/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/sq/activity.linfo b/locale/sq/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/sq/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/sv/LC_MESSAGES/org.laptop.Memorize.mo b/locale/sv/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..876eacf
--- /dev/null
+++ b/locale/sv/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/sv/activity.linfo b/locale/sv/activity.linfo
new file mode 100644
index 0000000..4216ae9
--- /dev/null
+++ b/locale/sv/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Komihåg
diff --git a/locale/sw/LC_MESSAGES/org.laptop.Memorize.mo b/locale/sw/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/sw/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/sw/activity.linfo b/locale/sw/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/sw/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ta/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ta/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..10b7874
--- /dev/null
+++ b/locale/ta/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ta/activity.linfo b/locale/ta/activity.linfo
new file mode 100644
index 0000000..0b252e5
--- /dev/null
+++ b/locale/ta/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = நினைவில் நிறுத்திக்கொள்
diff --git a/locale/te/LC_MESSAGES/org.laptop.Memorize.mo b/locale/te/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..706e3b2
--- /dev/null
+++ b/locale/te/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/te/activity.linfo b/locale/te/activity.linfo
new file mode 100644
index 0000000..d250b26
--- /dev/null
+++ b/locale/te/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = గుర్తింపు ఆట
diff --git a/locale/th/LC_MESSAGES/org.laptop.Memorize.mo b/locale/th/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/th/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/th/activity.linfo b/locale/th/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/th/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/tpi/LC_MESSAGES/org.laptop.Memorize.mo b/locale/tpi/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/tpi/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/tpi/activity.linfo b/locale/tpi/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/tpi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/tr/LC_MESSAGES/org.laptop.Memorize.mo b/locale/tr/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..bd8033f
--- /dev/null
+++ b/locale/tr/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/tr/activity.linfo b/locale/tr/activity.linfo
new file mode 100644
index 0000000..459d20e
--- /dev/null
+++ b/locale/tr/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Eşleştirme
diff --git a/locale/tvl/LC_MESSAGES/org.laptop.Memorize.mo b/locale/tvl/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..700afc0
--- /dev/null
+++ b/locale/tvl/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/tvl/activity.linfo b/locale/tvl/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/tvl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/tzo/LC_MESSAGES/org.laptop.Memorize.mo b/locale/tzo/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dfbd544
--- /dev/null
+++ b/locale/tzo/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/tzo/activity.linfo b/locale/tzo/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/tzo/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ug/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ug/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/ug/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ug/activity.linfo b/locale/ug/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/ug/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/ur/LC_MESSAGES/org.laptop.Memorize.mo b/locale/ur/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dfcb1da
--- /dev/null
+++ b/locale/ur/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/ur/activity.linfo b/locale/ur/activity.linfo
new file mode 100644
index 0000000..dab4a22
--- /dev/null
+++ b/locale/ur/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = ذہن میں محفوظ کريں
diff --git a/locale/vi/LC_MESSAGES/org.laptop.Memorize.mo b/locale/vi/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..be7c0d7
--- /dev/null
+++ b/locale/vi/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/vi/activity.linfo b/locale/vi/activity.linfo
new file mode 100644
index 0000000..e76df6a
--- /dev/null
+++ b/locale/vi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Ghi nhớ
diff --git a/locale/wa/LC_MESSAGES/org.laptop.Memorize.mo b/locale/wa/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..f70d806
--- /dev/null
+++ b/locale/wa/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/wa/activity.linfo b/locale/wa/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/wa/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/yo/LC_MESSAGES/org.laptop.Memorize.mo b/locale/yo/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..dbc3e15
--- /dev/null
+++ b/locale/yo/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/yo/activity.linfo b/locale/yo/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/yo/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/zh_CN/LC_MESSAGES/org.laptop.Memorize.mo b/locale/zh_CN/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..044ec3e
--- /dev/null
+++ b/locale/zh_CN/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/zh_CN/activity.linfo b/locale/zh_CN/activity.linfo
new file mode 100644
index 0000000..e3fbfbe
--- /dev/null
+++ b/locale/zh_CN/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = Memorize
diff --git a/locale/zh_TW/LC_MESSAGES/org.laptop.Memorize.mo b/locale/zh_TW/LC_MESSAGES/org.laptop.Memorize.mo
new file mode 100644
index 0000000..9d53b39
--- /dev/null
+++ b/locale/zh_TW/LC_MESSAGES/org.laptop.Memorize.mo
Binary files differ
diff --git a/locale/zh_TW/activity.linfo b/locale/zh_TW/activity.linfo
new file mode 100644
index 0000000..70f55e8
--- /dev/null
+++ b/locale/zh_TW/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = 記憶遊戲
diff --git a/memorize.dtd b/memorize.dtd
new file mode 100644
index 0000000..b624524
--- /dev/null
+++ b/memorize.dtd
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<!ELEMENT memorize (#PCDATA|pair)*>
+<!ATTLIST memorize
+ name CDATA #REQUIRED
+ scoresnd CDATA #IMPLIED
+ winsnd CDATA #IMPLIED
+ divided CDATA #IMPLIED
+ face CDATA #IMPLIED
+ face1 CDATA #IMPLIED
+ face2 CDATA #IMPLIED
+ align CDATA #IMPLIED
+ equal_pairs CDATA #IMPLIED
+>
+
+<!ELEMENT pair (#PCDATA)* >
+<!ATTLIST pair
+ aimg CDATA #IMPLIED
+ asnd CDATA #IMPLIED
+ achar CDATA #IMPLIED
+ bimg CDATA #IMPLIED
+ bsnd CDATA #IMPLIED
+ bchar CDATA #IMPLIED
+ color CDATA #IMPLIED
+ aspeak CDATA #IMPLIED
+ bspeak CDATA #IMPLIED
+ asensor CDATA #IMPLIED
+ bsensor CDATA #IMPLIED
+>
diff --git a/memorizetoolbar.py b/memorizetoolbar.py
new file mode 100644
index 0000000..782f818
--- /dev/null
+++ b/memorizetoolbar.py
@@ -0,0 +1,172 @@
+# Copyright (C) 2006, 2007, 2008 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import gtk
+from os.path import join, dirname
+
+from gettext import gettext as _
+from sugar.graphics.toolbutton import ToolButton
+from sugar.graphics.toolcombobox import ToolComboBox
+from sugar.graphics.objectchooser import ObjectChooser
+from sugar import profile
+
+import logging
+from gobject import SIGNAL_RUN_FIRST, TYPE_PYOBJECT
+
+_logger = logging.getLogger('memorize-activity')
+
+class MemorizeToolbar(gtk.Toolbar):
+ __gtype_name__ = 'MemoryToolbar'
+
+ standard_game_names = ['Load demo games',
+ 'addition',
+ 'letters',
+ 'sounds'
+ ]
+ translated_game_names = [_('Load demo games'),
+ _('addition'),
+ _('letters'),
+ _('sounds')
+ ]
+
+ __gsignals__ = {
+ 'game_changed': (SIGNAL_RUN_FIRST, None, 5 * [TYPE_PYOBJECT])
+ }
+
+ def __init__(self, activity):
+ gtk.Toolbar.__init__(self)
+ self.activity = activity
+ self._lock = True
+ self.jobject = None
+
+ # Reset Button
+ restart_icon = join(dirname(__file__), 'images', 'game-restart.svg')
+ restart_image = gtk.Image()
+ restart_image.set_from_file(restart_icon)
+ self._restart_button = ToolButton()
+ self._restart_button.set_icon_widget(restart_image)
+ self._restart_button.connect('clicked', self._game_reset_cb)
+ self._restart_button.set_tooltip(_('Restart Game'))
+ self.insert(self._restart_button, -1)
+ self._restart_button.show()
+
+ # Load Button
+ load_icon = join(dirname(__file__), 'images', 'game-load.svg')
+ load_image = gtk.Image()
+ load_image.set_from_file(load_icon)
+ self._load_button = ToolButton()
+ self._load_button.set_icon_widget(load_image)
+ self._load_button.set_tooltip(_('Load game'))
+ self._load_button.connect('clicked', self._load_game)
+ self._add_widget(self._load_button)
+
+ # Separator
+ separator = gtk.SeparatorToolItem()
+ separator.set_draw(True)
+ self.insert(separator, -1)
+
+ # Change size combobox
+ self._size_combo = ToolComboBox()
+ self._sizes = ['4 X 4', '5 X 5', '6 X 6']
+ for i, f in enumerate(self._sizes):
+ self._size_combo.combo.append_item(i, f)
+ self.size_handle_id = self._size_combo.combo.connect( \
+ 'changed', self._game_size_cb)
+ self._add_widget(self._size_combo)
+ self._size_combo.combo.set_active(0)
+
+ separator = gtk.SeparatorToolItem()
+ separator.set_draw(True)
+ self.insert(separator, -1)
+ self._lock = False
+
+ # Change demo games combobox
+ self._game_combo = ToolComboBox()
+ for i, f in enumerate(self.standard_game_names):
+ f = _(f)
+ self._game_combo.combo.append_item(i, f)
+ self._game_combo.combo.set_active(0)
+ self._game_combo.combo.connect('changed', self._game_changed_cb)
+ self._add_widget(self._game_combo)
+
+ def _add_widget(self, widget, expand=False):
+ tool_item = gtk.ToolItem()
+ tool_item.set_expand(expand)
+ tool_item.add(widget)
+ widget.show()
+ self.insert(tool_item, -1)
+ tool_item.show()
+
+ def _game_reset_cb(self, widget):
+ self.emit('game_changed', None, None, 'reset', None, None)
+
+ def _load_game(self, button):
+ chooser = ObjectChooser(_('Choose memorize game'),
+ parent=self.activity,
+ flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
+ jobject = ''
+ try:
+ result = chooser.run()
+ if result == gtk.RESPONSE_ACCEPT:
+ logging.debug('ObjectChooser: %r',
+ chooser.get_selected_object())
+ jobject = chooser.get_selected_object()
+ if not jobject or not jobject.file_path:
+ return
+ finally:
+ chooser.destroy()
+ del chooser
+
+ if jobject and jobject.file_path:
+ title = jobject.metadata['title']
+ if jobject.metadata.has_key('icon-color'):
+ color = jobject.metadata['icon-color']
+ else:
+ color = profile.get_color().to_string()
+ self.emit('game_changed', jobject.file_path, 4,
+ 'file', title, color)
+
+ if self.jobject != None:
+ self.jobject.destroy()
+ self.jobject = jobject
+
+ def _game_size_cb(self, widget):
+ game_size = int(self._sizes[self._size_combo.combo.get_active()][0])
+ self.emit('game_changed', None, game_size, 'size', None, None)
+
+ def _game_changed_cb(self, combobox):
+ if combobox.get_active() == 0:
+ return
+ current_game = self._game_combo.combo.get_active()
+ game_name = self.standard_game_names[current_game]
+ title = game_name
+ game_size = int(self._sizes[self._size_combo.combo.get_active()][0])
+
+ if game_name in self.translated_game_names:
+ index = self.translated_game_names.index(game_name)
+ game_name = self.standard_game_names[index]
+
+ game_file = join(dirname(__file__), 'demos', game_name+'.zip')
+ self.emit('game_changed', game_file, game_size, 'demo', title, None)
+ self._game_combo.combo.set_active(0)
+
+ def update_toolbar(self, widget, data, grid):
+ size = data.get('size')
+ self._size_combo.combo.handler_block(self.size_handle_id)
+ size_index = self._sizes.index(size+' X '+size)
+ self._size_combo.combo.set_active(int(size_index))
+ self._size_combo.combo.handler_unblock(self.size_handle_id)
diff --git a/messenger.py b/messenger.py
new file mode 100644
index 0000000..658ee08
--- /dev/null
+++ b/messenger.py
@@ -0,0 +1,232 @@
+# Copyright (C) 2006, 2007, 2008 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import logging
+_logger = logging.getLogger('memorize-activity')
+
+import tempfile
+from os import environ, chmod
+from os.path import join, getsize, dirname, basename
+from dbus.service import method, signal
+from dbus.gobject_service import ExportedGObject
+from sugar.datastore import datastore
+from gettext import gettext as _
+
+SERVICE = 'org.laptop.Memorize'
+IFACE = SERVICE
+PATH = '/org/laptop/Memorize'
+
+class Messenger(ExportedGObject):
+
+ def __init__(self, tube, is_initiator, get_buddy, game):
+ ExportedGObject.__init__(self, tube, PATH)
+ self._tube = tube
+ self.is_initiator = is_initiator
+ self._get_buddy = get_buddy
+ self.game = game
+ self.ordered_bus_names = []
+ self.entered = False
+ self._tube.watch_participants(self.participant_change_cb)
+ self.files = {}
+
+ def participant_change_cb(self, added, removed):
+ if not self.entered:
+ if self.is_initiator:
+ self._flip_handler()
+ self._change_game_handler()
+ self._file_part_handler()
+
+ self.player_id = self._tube.get_unique_name()
+ self.ordered_bus_names = [self.player_id]
+ self._hello_handler()
+ else:
+ self._hello_signal()
+ self.entered = True
+
+ # hello methods
+
+ @signal(IFACE, signature='')
+ def _hello_signal(self):
+ pass
+
+ def _hello_handler(self):
+ self._tube.add_signal_receiver(self._hello_receiver,
+ '_hello_signal',
+ IFACE,
+ path=PATH,
+ sender_keyword='sender')
+
+ def _hello_receiver(self, sender=None):
+ self.ordered_bus_names.append(sender)
+ data = self.game.model.data
+ path = data['game_file']
+ if self.game.model.data['mode'] == 'file':
+ title = data.get('title', 'Received game')
+ color = data.get('color', '#ff00ff,#00ff00')
+ self.file_sender(sender, path, title, color)
+
+ remote_object = self._tube.get_object(sender, PATH)
+ remote_object.load_game(self.ordered_bus_names,
+ self.game.get_grid(),
+ self.game.collect_data(),
+ self.game.players.index(self.game.current_player),
+ #self.game.waiting_players,
+ path)
+
+ @method(dbus_interface=IFACE, in_signature='asaa{ss}a{ss}ns',
+ out_signature='', byte_arrays=True)
+ def load_game(self, bus_names, grid, data, current_player, path):
+ self.ordered_bus_names = bus_names
+ self.player_id = bus_names.index(self._tube.get_unique_name())
+ #self.game.load_waiting_list(list)
+ self._change_game_receiver(data['mode'], grid, data, path)
+
+ for i in range(len(self.game.players)):
+ self.game.increase_point(self.game.players[i],
+ int(data.get(str(i), '0')))
+
+ self.game.current_player = self.game.players[current_player]
+ self.game.update_turn()
+
+ self._flip_handler()
+ self._change_game_handler()
+ self._file_part_handler()
+
+ def change_game(self, sender, mode, grid, data, waiting_list, zip):
+ path = self.game.model.data['game_file']
+
+ if mode == 'file':
+ title = data.get('title', 'Received game')
+ color = data.get('color', '')
+ self.file_sender('all', path, title, color)
+
+ self._change_game_signal(mode, grid, data, path)
+
+ def _change_game_handler(self):
+ self._tube.add_signal_receiver(self._change_game_receiver,
+ '_change_game_signal',
+ IFACE, path=PATH,
+ sender_keyword='sender',
+ byte_arrays=True)
+
+ @signal(IFACE, signature='saa{ss}a{ss}s')
+ def _change_game_signal(self, mode, grid, data, path):
+ pass
+
+ def _change_game_receiver(self, mode, grid, data, path, sender=None):
+ # ignore my own signal
+ if sender == self._tube.get_unique_name():
+ return
+ if mode == 'demo':
+ game_name = basename(data.get('game_file', 'debug-demo'))
+ game_file = join(dirname(__file__), 'demos',
+ game_name).encode('ascii')
+ self.game.model.read(game_file)
+ if mode == 'file':
+ self.game.model.read(self.files[path])
+
+ if self.game.model.data.has_key('path'):
+ data['path'] = self.game.model.data['path']
+ data['pathimg'] = self.game.model.data['pathimg']
+ data['pathsnd'] = self.game.model.data['pathsnd']
+ self.game.load_remote(grid, data, mode, True)
+
+ # File transfer methods
+
+ def file_sender(self, target, filename, title, color):
+ size = getsize(filename)
+ f = open(filename, 'rb')
+ part_size = 8192
+ num_parts = (size / part_size) + 1
+ for part in range(num_parts):
+ bytes = f.read(part_size)
+ self._file_part_signal(target, filename, part + 1,
+ num_parts, bytes, title, color)
+ f.close()
+
+ @signal(dbus_interface=IFACE, signature='ssuuayss')
+ def _file_part_signal(self, target, filename, part, numparts,
+ bytes, title, color):
+ pass
+
+ def _file_part_handler(self):
+ self._tube.add_signal_receiver(self._file_part_receiver,
+ '_file_part_signal',
+ IFACE,
+ path=PATH,
+ sender_keyword='sender',
+ byte_arrays=True)
+
+ def _file_part_receiver(self, target, filename, part, numparts,
+ bytes, title=None, color=None, sender=None):
+ # ignore my own signal
+ if sender == self._tube.get_unique_name():
+ return
+
+ if not (target == 'all' or target == self._tube.get_unique_name()):
+ return
+
+ # first chunk
+ if part == 1:
+ tmp_root = join(environ['SUGAR_ACTIVITY_ROOT'], 'instance')
+ temp_dir = tempfile.mkdtemp(dir=tmp_root)
+ chmod(temp_dir, 0777)
+ self.temp_file = join(temp_dir, 'game.zip')
+ self.files[filename] = self.temp_file
+ self.f = open(self.temp_file, 'a+b')
+
+ self.f.write(bytes)
+
+ percentage = int(float(part) / float(numparts) * 100.0)
+ self.game.set_load_mode(_('Receiving game') + ': '
+ + str(percentage) + '% ' + _('done') + '.')
+
+ # last chunk
+ if part == numparts:
+ self.f.close()
+ #file = self.files[filename]
+ # Saves the zip in datastore
+ gameObject = datastore.create()
+ gameObject.metadata['title'] = title
+ gameObject.metadata['mime_type'] = 'application/x-memorize-project'
+ gameObject.metadata['icon-color'] = color
+ gameObject.file_path = self.temp_file
+ datastore.write(gameObject)
+ #gameObject.destroy()
+
+
+ # flip card methods
+
+ def flip_sender(self, widget, id):
+ self._flip_signal(id)
+
+ def _flip_handler(self):
+ self._tube.add_signal_receiver(self._flip_receiver,
+ '_flip_signal',
+ IFACE,
+ path=PATH,
+ sender_keyword='sender')
+
+ @signal(IFACE, signature='n')
+ def _flip_signal(self, card_number):
+ pass
+
+ def _flip_receiver(self, card_number, sender=None):
+ # ignore my own signal
+ if sender == self._tube.get_unique_name():
+ return
+ self.game.card_flipped(None, card_number, True)
diff --git a/model.py b/model.py
new file mode 100644
index 0000000..187100e
--- /dev/null
+++ b/model.py
@@ -0,0 +1,381 @@
+# Copyright (C) 2006, 2007, 2008 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import libxml2
+from os import environ, makedirs, chmod
+from os.path import join, basename, isdir, split, normpath
+import logging
+import random
+import gobject
+import zipfile
+import tempfile
+
+from sugar import profile
+from sugar.datastore import datastore
+from sugar.activity.activity import get_bundle_path, get_activity_root
+
+_logger = logging.getLogger('model')
+
+class Pair(gobject.GObject):
+ __gproperties__ = {
+ 'aimg' : (str, None, None, None, gobject.PARAM_READWRITE),
+ 'asnd' : (str, None, None, None, gobject.PARAM_READWRITE),
+ 'achar': (str, None, None, None, gobject.PARAM_READWRITE),
+ 'bimg' : (str, None, None, None, gobject.PARAM_READWRITE),
+ 'bsnd' : (str, None, None, None, gobject.PARAM_READWRITE),
+ 'bchar': (str, None, None, None, gobject.PARAM_READWRITE),
+ 'aspeak': (str, None, None, None, gobject.PARAM_READWRITE),
+ 'bspeak': (str, None, None, None, gobject.PARAM_READWRITE),
+ 'asensor': (str, None, None, None, gobject.PARAM_READWRITE),
+ 'bsensor': (str, None, None, None, gobject.PARAM_READWRITE),
+ 'color' : (gobject.TYPE_INT, 'Base', 'Base', 0, 10, 0, \
+ gobject.PARAM_READWRITE)
+ }
+
+ def __init__(self):
+ gobject.GObject.__init__(self)
+ self._properties = {'aimg':None, 'asnd':None, 'achar':None, 'bimg':None,
+ 'bsnd':None, 'bchar':None, 'color':100,
+ 'aspeak':None, 'bspeak':None, 'asensor':None, 'bsensor':None}
+
+ def do_get_property(self, pspec):
+ """Retrieve a particular property from our property dictionary
+ """
+ if pspec.name == "aimg":
+ return self._properties["aimg"]
+ elif pspec.name == "asnd":
+ return self._properties["asnd"]
+ elif pspec.name == "achar":
+ return self._properties["achar"]
+ elif pspec.name == "bimg":
+ return self._properties["bimg"]
+ elif pspec.name == "bsnd":
+ return self._properties["bsnd"]
+ elif pspec.name == "bchar":
+ return self._properties["bchar"]
+ elif pspec.name == "color":
+ return self._properties["color"]
+ elif pspec.name == "aspeak":
+ return self._properties["aspeak"]
+ elif pspec.name == "bspeak":
+ return self._properties["bspeak"]
+ elif pspec.name == "asensor":
+ return self._properties["asensor"]
+ elif pspec.name == "bsensor":
+ return self._properties["bsensor"]
+
+ def set_property(self, name, value):
+ if name == 'aimg':
+ self._properties['aimg'] = value
+ elif name == "asnd":
+ self._properties["asnd"] = value
+ elif name == "achar":
+ self._properties["achar"] = value
+ elif name == "bimg":
+ self._properties["bimg"] = value
+ elif name == "bsnd":
+ self._properties["bsnd"] = value
+ elif name == "bchar":
+ self._properties["bchar"] = value
+ elif name == "color":
+ self._properties["color"] = value
+ elif name == "aspeak":
+ self._properties["aspeak"] = value
+ elif name == "bspeak":
+ self._properties["bspeak"] = value
+ elif name == "asensor":
+ self._properties["asensor"] = value
+ elif name == "bsensor":
+ self._properties["bsensor"] = value
+
+
+class Model(object):
+ ''' The model of the activity. Contains methods to read and write
+ the configuration for a game from xml. Stores the pairs and grid
+ information.
+ '''
+
+ def __init__(self, game_path=None):
+ self.data = {}
+
+ if game_path is None:
+ game_path = get_activity_root()
+
+ if isdir(game_path):
+ self.game_path = game_path
+ else:
+ _logger.error('Game_path not found in %s' % game_path)
+ return
+
+ self.data['face'] = ''
+ self.data['align'] = '1'
+
+ try:
+ self.dtd = libxml2.parseDTD(None, join(get_bundle_path(),
+ 'memorize.dtd'))
+ except libxml2.parserError, e:
+ _logger.error('Init: no memorize.dtd found ' +str(e))
+ self.dtd = None
+ self.ctxt = libxml2.newValidCtxt()
+
+ self.pairs = {}
+ self.grid = []
+
+ # used by the leader of the game to keep track of the game state
+ self.players = {}
+ self.player_active = 0
+ self.selected = 0
+ self.turn = 0
+ self.started = 0
+ self.count = 0
+
+ def read(self, game_file):
+ tmp_root = join(environ['SUGAR_ACTIVITY_ROOT'], 'instance')
+ temp_folder = tempfile.mkdtemp(dir=tmp_root)
+ chmod(temp_folder, 0777)
+ self.data['key'] = basename(game_file)
+ self.data['game_file'] = game_file
+ self.data['path'] = temp_folder
+ self.data['pathimg'] = join(self.data['path'], 'images')
+ self.data['pathsnd'] = join(self.data['path'], 'sounds')
+
+ ''' extracts files in the zip file '''
+ game_name = basename(game_file)[:-4]
+ zipFile = zipfile.ZipFile(game_file, "r")
+ for each in zipFile.namelist():
+ if not each.endswith('/'):
+ root, name = split(each)
+ directory = normpath(join(self.data['path'], root))
+ if not isdir(directory):
+ makedirs(directory)
+ file(join(directory, name), 'wb').write(zipFile.read(each))
+
+ self.pairs = {}
+
+ ''' reads the configuration from an xml file '''
+ try:
+ xml_file = join(environ['SUGAR_ACTIVITY_ROOT'],
+ self.data['path'], 'game.xml')
+ doc = libxml2.parseFile(xml_file)
+ if doc.validateDtd(self.ctxt, self.dtd):
+
+ # get the requested nodes
+ xpa = doc.xpathNewContext()
+ res = xpa.xpathEval("//*")
+
+ # write their content to the data structure
+ idpair = 0
+ for elem in res:
+ attributes = elem.get_properties()
+ pair = Pair()
+ if(elem.name == 'pair'):
+ for attribute in attributes:
+ if(attribute.name == 'text'):
+ pass
+ else:
+ pair.set_property(attribute.name,
+ attribute.content)
+ self.pairs[str(idpair)] = pair
+ idpair += 1
+ elif(elem.name == 'memorize'):
+ for attribute in attributes:
+ if(attribute.name == 'text'):
+ pass
+ elif(attribute.name == 'name'):
+ self.data['name'] = attribute.content
+ elif(attribute.name == 'scoresnd'):
+ self.data['scoresnd'] = attribute.content
+ elif(attribute.name == 'winsnd'):
+ self.data['winsnd'] = attribute.content
+ elif(attribute.name == 'divided'):
+ self.data['divided'] = attribute.content
+ elif(attribute.name == 'face'):
+ self.data['face'] = attribute.content
+ elif(attribute.name == 'face1'):
+ self.data['face1'] = attribute.content
+ elif(attribute.name == 'face2'):
+ self.data['face2'] = attribute.content
+ elif(attribute.name == 'align'):
+ self.data['align'] = attribute.content
+ elif(attribute.name == 'equal_pairs'):
+ self.data['equal_pairs'] = attribute.content
+ xpa.xpathFreeContext()
+ else:
+ _logger.error('Read: Error in validation of the file')
+ doc.freeDoc()
+ return 1
+ doc.freeDoc()
+ return 0
+ except libxml2.parserError, e:
+ _logger.error('Read: Error parsing file ' +str(e))
+ return 2
+
+ def write(self, equal_pairs, divided):
+ ''' writes the configuration to an xml file '''
+ doc = libxml2.newDoc("1.0")
+ root = doc.newChild(None, "memorize", None)
+
+ if(self.data.get('name', None) != None):
+ root.setProp("name", self.data['name'])
+
+ if divided:
+ root.setProp('divided', '1')
+ root.setProp('face1', '1')
+ root.setProp('face2', '2')
+ else:
+ root.setProp('divided', '0')
+
+ if equal_pairs:
+ root.setProp('equal_pairs', str(equal_pairs))
+
+ if(self.data.get('scoresnd', None) != None):
+ root.setProp("scoresnd", self.data['scoresnd'])
+ if(self.data.get('winsnd', None) != None):
+ root.setProp("winsnd", self.data['winsnd'])
+ if(self.data.get('divided', None) != None):
+ root.setProp("divided", self.data['divided'])
+ if(self.data.get('face', None) != None):
+ root.setProp("face", self.data['face'])
+ if(self.data.get('face1', None) != None):
+ root.setProp("face1", self.data['face1'])
+ if(self.data.get('face2', None) != None):
+ root.setProp("face2", self.data['face2'])
+ if(self.data.get('align', None) != None):
+ root.setProp("align", self.data['align'])
+
+ for key in self.pairs:
+ elem = root.newChild(None, "pair", None)
+ if self.pairs[key].props.aimg != None:
+ elem.setProp("aimg", self.pairs[key].props.aimg)
+ if self.pairs[key].props.asnd != None:
+ elem.setProp("asnd", self.pairs[key].props.asnd)
+ if self.pairs[key].props.achar != None:
+ elem.setProp("achar", self.pairs[key].props.achar)
+ if self.pairs[key].props.bimg != None:
+ elem.setProp("bimg", self.pairs[key].props.bimg)
+ if self.pairs[key].props.bsnd != None:
+ elem.setProp("bsnd", self.pairs[key].props.bsnd)
+ if self.pairs[key].props.bchar != None:
+ elem.setProp("bchar", self.pairs[key].props.bchar)
+ if self.pairs[key].props.aspeak != None:
+ elem.setProp("aspeak", self.pairs[key].props.aspeak)
+ if self.pairs[key].props.bspeak != None:
+ elem.setProp("bspeak", self.pairs[key].props.bspeak)
+ if self.pairs[key].props.asensor != None:
+ elem.setProp("asensor", self.pairs[key].props.asensor)
+ if self.pairs[key].props.bsensor != None:
+ elem.setProp("bsensor", self.pairs[key].props.bsensor)
+ # elem.setProp("color", str(self.pairs[key].props.color))
+
+ if doc.validateDtd(self.ctxt, self.dtd):
+ doc.saveFormatFile(join(self.game_path, 'game.xml'), 1)
+ else:
+ _logger.error('Write: Error in validation of the file')
+ doc.freeDoc()
+ return 2
+ doc.freeDoc()
+ return 0
+
+
+ def def_grid(self, size):
+ ''' create the grid for the play from the pairs information
+ and shuffles the grid so they always appear in a different
+ place
+ '''
+ psize = (size * size / 2)
+ _logger.debug('Size requested: %d', psize)
+ self.grid = []
+ temp1 = []
+ temp2 = []
+ i = 0
+
+ # shuffle the pairs first to avoid only taking the first ones
+ # when there are more pairs in the config file then the grid is using
+ keys = self.pairs.keys()
+ random.shuffle(keys)
+
+ for key in keys:
+ if i < psize:
+ elem = {}
+ elem['pairkey'] = key
+ elem['state'] = '0'
+ elem['ab'] = 'a'
+ if self.pairs[key].props.aimg != None:
+ elem['img'] = self.pairs[key].props.aimg
+ if self.pairs[key].props.asnd != None:
+ elem['snd'] = self.pairs[key].props.asnd
+ if self.pairs[key].props.achar != None:
+ elem['char'] = self.pairs[key].props.achar
+ if self.pairs[key].props.aspeak != None:
+ elem['speak'] = self.pairs[key].props.aspeak
+ if self.pairs[key].props.asensor != None:
+ elem['sensor'] = self.pairs[key].props.asensor
+ temp1.append(elem)
+
+ elem = {}
+ elem['pairkey'] = key
+ elem['state'] = '0'
+ elem['ab'] = 'b'
+ if self.pairs[key].props.bimg != None:
+ elem['img'] = self.pairs[key].props.bimg
+ if self.pairs[key].props.bsnd != None:
+ elem['snd'] = self.pairs[key].props.bsnd
+ if self.pairs[key].props.bchar != None:
+ elem['char'] = self.pairs[key].props.bchar
+ if self.pairs[key].props.bspeak != None:
+ elem['speak'] = self.pairs[key].props.bspeak
+ if self.pairs[key].props.bsensor != None:
+ elem['sensor'] = self.pairs[key].props.bsensor
+ temp2.append(elem)
+ i += 1
+ else:
+ break
+
+ numpairs = len(self.pairs)
+ if numpairs < psize:
+ _logger.debug('Defgrid: Not enough pairs, requested=%s had=%s'
+ % (psize, numpairs))
+ self.data['size'] = str(size)
+
+ if self.data['divided'] == '1':
+ random.shuffle(temp1)
+ random.shuffle(temp2)
+ temp1.extend(temp2)
+ else:
+ temp1.extend(temp2)
+ random.shuffle(temp1)
+ self.grid = temp1
+ _logger.debug('Defgrid: grid( size=%s ): %s'
+ % (self.data['size'], self.grid))
+ _logger.debug('Defgrid: data: %s', self.data)
+
+ def set_data_grid(self, data, grid):
+ self.data = data
+ self.grid = grid
+
+ def save_byte_array(self, path, title= None, color= None):
+ if color == None:
+ color = profile.get_color().to_string()
+ _logger.debug('Save new game in datastore')
+
+ # Saves the zip in datastore
+ gameObject = datastore.create()
+ gameObject.metadata['title'] = title
+ gameObject.metadata['mime_type'] = 'application/x-memorize-project'
+ gameObject.metadata['icon-color'] = color
+ gameObject.file_path = path
+ datastore.write(gameObject)
diff --git a/playerscoreboard.py b/playerscoreboard.py
new file mode 100644
index 0000000..99b11bb
--- /dev/null
+++ b/playerscoreboard.py
@@ -0,0 +1,169 @@
+# Copyright (C) 2006, 2007, 2008 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import gtk
+
+import svglabel
+import logging
+from os.path import join, dirname
+from score import Score
+import math
+
+import theme
+
+_logger = logging.getLogger('memorize-activity')
+
+class PlayerScoreboard(gtk.EventBox):
+
+ def __init__(self, nick, fill_color, stroke_color, score = 0):
+ gtk.EventBox.__init__(self)
+
+ self.default_color = '#4c4d4f'
+ self.selected_color = '#818286'
+ self.current_color = '#4c4d4f'
+ self.status = False
+ self._score_width = 0
+ self._score_cols = 0
+ self._game_size = 16
+ self.fill_color = fill_color
+ self.stroke_color = stroke_color
+
+ self.connect('size-allocate', self._allocate_cb)
+
+ # Set table
+ self.table = gtk.Table(2, 2, False)
+ self.modify_bg(gtk.STATE_NORMAL,
+ gtk.gdk.color_parse(self.current_color))
+ self.table.set_row_spacings(theme.PAD/2)
+ self.table.set_col_spacings(theme.PAD/2)
+ self.table.set_border_width(theme.PAD)
+
+ # Score table
+ self.score_table = gtk.Table()
+ self.score_table.set_row_spacings(theme.PAD/2)
+ self.score_table.set_col_spacings(theme.PAD/2)
+
+ self.scores = []
+ self.current_x = 0
+ self.current_y = 0
+
+ # Set buddy icon
+ self.xo_buddy = join(dirname(__file__), 'images', 'stock-buddy.svg')
+ self.icon = svglabel.SvgLabel(self.xo_buddy, fill_color, stroke_color,
+ False, self.current_color, theme.BODY_WIDTH, theme.BODY_HEIGHT)
+
+ # Set waiting buddy icon
+ self.waiting_icon = svglabel.SvgLabel(self.xo_buddy, \
+ self.default_color, '#ffffff', False, self.current_color,
+ theme.BODY_WIDTH, theme.BODY_HEIGHT)
+
+ # Set nick label
+ self.nick = gtk.Label(nick)
+ self.nick.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#ffffff'))
+ self.nick.set_alignment(0, 0.5)
+
+ # Set message label
+ self.msg = gtk.Label('Waiting for next game...')
+ self.msg.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#ffffff'))
+ self.msg.set_alignment(0, 0.5)
+
+ self.add(self.table)
+ self.table.attach(self.icon, 0, 1, 0, 3, gtk.SHRINK, gtk.SHRINK)
+ self.table.attach(self.nick, 1, 2, 0, 1)
+ self.table.attach(self.score_table, 1, 2, 1, 2)
+
+ if score != 0:
+ for i_ in range(score):
+ self.increase_score()
+
+ def _allocate_cb(self, widget, allocation):
+ self._score_width = allocation.width - theme.BODY_WIDTH \
+ - theme.PAD * 2 - theme.PAD / 2
+ self._score_cols = self._score_width / \
+ (theme.SCORE_SIZE + theme.PAD / 2)
+ self.change_game(self._game_size)
+
+ def change_game(self, size):
+ self._game_size = size
+ if self._score_cols == 0:
+ return
+
+ rows = int(math.ceil(float(size/2) / self._score_cols))
+ self.score_table.resize(rows, self._score_cols)
+ self.score_table.set_size_request(-1,
+ (theme.SCORE_SIZE + theme.PAD / 2) * (rows) - theme.PAD / 2)
+
+ def increase_score(self):
+ if len(self.scores) == 0:
+ # Cache the score icon
+ score_label = Score(self.fill_color, self.stroke_color)
+ score_pixbuf_unsel = score_label.get_pixbuf()
+ score_pixbuf_sel = score_label.get_pixbuf_sel()
+ else:
+ score_pixbuf_unsel = None
+ score_pixbuf_sel = None
+
+ new_score = Score(self.fill_color, self.stroke_color,
+ score_pixbuf_sel, score_pixbuf_unsel, self.status)
+ self.scores.append(new_score)
+ new_score.show()
+ self.score_table.attach(new_score, self.current_x , self.current_x + 1,
+ self.current_y, self.current_y + 1, gtk.SHRINK, gtk.SHRINK)
+ self.current_x += 1
+ if self.current_x == self._score_cols:
+ self.current_x = 0
+ self.current_y += 1
+ self.queue_draw()
+
+ def set_selected(self, sel):
+ self.status = sel
+ if sel:
+ self.current_color = self.selected_color
+ else:
+ self.current_color = self.default_color
+ self.modify_bg(gtk.STATE_NORMAL,
+ gtk.gdk.color_parse(self.current_color))
+ self.icon.set_background(self.current_color)
+ for score in self.scores:
+ score.set_selected(sel)
+ self.queue_draw()
+
+ def reset(self):
+ for score in self.scores:
+ self.score_table.remove(score)
+ self.current_x = 0
+ self.current_y = 0
+ del self.scores
+ self.scores = []
+ self.queue_draw()
+
+ def set_wait_mode(self, status):
+ if status:
+ self.table.remove(self.icon)
+ self.table.attach(self.waiting_icon, 0, 1, 0, 2)
+ if len(self.scores) == 0:
+ self.table.attach(self.msg, 1, 2, 1, 2)
+ else:
+ self.table.remove(self.waiting_icon)
+ self.table.attach(self.icon, 0, 1, 0, 2)
+ self.table.remove(self.msg)
+ if len(self.scores) == 0:
+ self.table.remove(self.msg)
+ self.queue_draw()
+
+ def set_message(self, msg):
+ self.msg.set_text(msg)
diff --git a/po/Memorize.pot b/po/Memorize.pot
new file mode 100644
index 0000000..af62e62
--- /dev/null
+++ b/po/Memorize.pot
@@ -0,0 +1,265 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-07-14 10:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/game.py:93
+msgid "Loading game..."
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/messenger.py:192
+msgid "Receiving game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/messenger.py:192
+msgid "done"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:51
+msgid "New game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:61
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:71
+msgid "Save game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:81
+msgid "Game name"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:85
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:97
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:156
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:114
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:152
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:82
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:85
+msgid "Add"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:90
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:93
+msgid "Update"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:254
+msgid "Preview:"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:270
+msgid "Text:"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:282
+msgid "Insert picture"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:287
+msgid "Insert sound"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:427
+msgid "Pronounce text while fliping tile"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/activity.py:78
+msgid "Create"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:36
+msgid "Brazil"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:37
+msgid "Swedish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:38
+msgid "Icelandic"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:39
+msgid "Romanian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:40
+msgid "Swahili"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:41
+msgid "Hindi"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:42
+msgid "Dutch"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:43
+msgid "Latin"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:44
+msgid "Hungarian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:45
+msgid "Macedonian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:46
+msgid "Welsh"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:47
+msgid "French"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:48
+msgid "Norwegian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:49
+msgid "Russian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:50
+msgid "Afrikaans"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:51
+msgid "Finnish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:52
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:125
+msgid "Default"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:53
+msgid "Cantonese"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:54
+msgid "Scottish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:55
+msgid "Greek"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:56
+msgid "Vietnam"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:57
+msgid "English"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:58
+msgid "Lancashire"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:59
+msgid "Italian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:60
+msgid "Portugal"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:61
+msgid "German"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:62
+msgid "Whisper"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:63
+msgid "Croatian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:64
+msgid "Czech"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:65
+msgid "Slovak"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:66
+msgid "Spanish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:67
+msgid "Polish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:68
+msgid "Esperanto"
+msgstr ""
diff --git a/po/af.po b/po/af.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/af.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/am.po b/po/am.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/am.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/ar.po b/po/ar.po
new file mode 100644
index 0000000..22a6661
--- /dev/null
+++ b/po/ar.po
@@ -0,0 +1,281 @@
+# Khaled Hosny <khaledhosny@eglug.org>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-17 00:32-0400\n"
+"PO-Revision-Date: 2010-02-19 18:18+0300\n"
+"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
+"Language-Team: Arabic <doc@arabeyes.org>\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+"X-Generator: Virtaal 0.5.2\n"
+
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr "تذكّر"
+
+#: activity.py:70
+msgid "Play"
+msgstr "العب"
+
+#: activity.py:74
+msgid "Create"
+msgstr "أنشئ"
+
+#: createcardpanel.py:79
+msgid "Add as new pair"
+msgstr "أضف كزوج جديد"
+
+#: createcardpanel.py:82
+msgid "Add"
+msgstr "أضِف"
+
+#: createcardpanel.py:87
+msgid "Update selected pair"
+msgstr "حدِّث الزوج المحدد"
+
+#: createcardpanel.py:90
+msgid "Update"
+msgstr "حدّث"
+
+#: createcardpanel.py:255
+msgid "Preview:"
+msgstr "معاينة:"
+
+#: createcardpanel.py:271
+msgid "Text:"
+msgstr "نص:"
+
+#: createcardpanel.py:283
+msgid "Insert picture"
+msgstr "أدرِج صورة"
+
+#: createcardpanel.py:288
+msgid "Insert sound"
+msgstr "أدرج صوتا"
+
+#: createcardpanel.py:434
+msgid "Pronounce text during tile flip"
+msgstr "انطق النص عند قلب البلاطة"
+
+#: createtoolbar.py:51
+msgid "New game"
+msgstr "لعبة جديدة"
+
+#: createtoolbar.py:61 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "حمل لعبة"
+
+#: createtoolbar.py:71
+msgid "Save game"
+msgstr "احفظ اللعبة"
+
+#: createtoolbar.py:81
+msgid "Game name"
+msgstr "اسم اللعبة"
+
+#: createtoolbar.py:85
+msgid "Equal pairs"
+msgstr "أزواج متساوية"
+
+#: createtoolbar.py:97 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "انقر لتلعب لعبة جماعية"
+
+#: createtoolbar.py:114 memorizetoolbar.py:118
+msgid "Choose memorize game"
+msgstr "اختر لعبة تذكّر"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "انقر لتلعب لعبة فردية"
+
+#: game.py:92
+msgid "Loading game..."
+msgstr "يُحمّل اللعبة..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "حمّل ألعاب تجريبية"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "الجمع"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "الحروف"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "الأصوات"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "أعِد تشغيل اللعبة"
+
+#: messenger.py:195
+msgid "Receiving game"
+msgstr "يستلم اللعبة"
+
+#: messenger.py:196
+msgid "done"
+msgstr "تمّ"
+
+#: speak/voice.py:36
+msgid "Brazil"
+msgstr "البرازيل"
+
+#: speak/voice.py:37
+msgid "Swedish"
+msgstr "سويدية"
+
+#: speak/voice.py:38
+msgid "Icelandic"
+msgstr "أيسلندية"
+
+#: speak/voice.py:39
+msgid "Romanian"
+msgstr "رومانية"
+
+#: speak/voice.py:40
+msgid "Swahili"
+msgstr "سواحلية"
+
+#: speak/voice.py:41
+msgid "Hindi"
+msgstr "هندية"
+
+#: speak/voice.py:42
+msgid "Dutch"
+msgstr "هولندية"
+
+#: speak/voice.py:43
+msgid "Latin"
+msgstr "لاتينية"
+
+#: speak/voice.py:44
+msgid "Hungarian"
+msgstr "مجرية"
+
+#: speak/voice.py:45
+msgid "Macedonian"
+msgstr "مقدونية"
+
+#: speak/voice.py:46
+msgid "Welsh"
+msgstr "ولزية"
+
+#: speak/voice.py:47
+msgid "French"
+msgstr "فرنسية"
+
+#: speak/voice.py:48
+msgid "Norwegian"
+msgstr "نرويجية"
+
+#: speak/voice.py:49
+msgid "Russian"
+msgstr "روسية"
+
+#: speak/voice.py:50
+msgid "Afrikaans"
+msgstr "أفريكانية"
+
+#: speak/voice.py:51
+msgid "Finnish"
+msgstr "فنلندية"
+
+#: speak/voice.py:52 speak/voice.py:125
+msgid "Default"
+msgstr "المبدئية"
+
+#: speak/voice.py:53
+msgid "Cantonese"
+msgstr "كانتونية"
+
+#: speak/voice.py:54
+msgid "Scottish"
+msgstr "أسكتلندية"
+
+#: speak/voice.py:55
+msgid "Greek"
+msgstr "يونانية"
+
+#: speak/voice.py:56
+msgid "Vietnam"
+msgstr "فيتنامية"
+
+#: speak/voice.py:57
+msgid "English"
+msgstr "إنجليزية"
+
+#: speak/voice.py:58
+msgid "Lancashire"
+msgstr "لانكشايرة"
+
+#: speak/voice.py:59
+msgid "Italian"
+msgstr "إيطالية"
+
+#: speak/voice.py:60
+msgid "Portugal"
+msgstr "برتغالية"
+
+#: speak/voice.py:61
+msgid "German"
+msgstr "ألمانية"
+
+#: speak/voice.py:62
+msgid "Whisper"
+msgstr "همس"
+
+#: speak/voice.py:63
+msgid "Croatian"
+msgstr "كرواتية"
+
+#: speak/voice.py:64
+msgid "Czech"
+msgstr "تشيكية"
+
+#: speak/voice.py:65
+msgid "Slovak"
+msgstr "سلافية"
+
+#: speak/voice.py:66
+msgid "Spanish"
+msgstr "أسبانية"
+
+#: speak/voice.py:67
+msgid "Polish"
+msgstr "بولندية "
+
+#: speak/voice.py:68
+msgid "Esperanto"
+msgstr "إسبرانتو"
+
+#~ msgid "Pronounce text while fliping tile"
+#~ msgstr "نطق النص بينما يتم قلب المربع "
+
+#~ msgid "Choose image"
+#~ msgstr "اختر صورة"
+
+#~ msgid "Choose audio"
+#~ msgstr "اختر صوتا"
+
+#~ msgid "capitals"
+#~ msgstr "الحروف الكبيرة"
+
+#~ msgid "drumgit"
+#~ msgstr "الأصوات"
+
+#~ msgid "numbers"
+#~ msgstr "الأرقام"
+
+#~ msgid "phonemes"
+#~ msgstr "المقاطع"
diff --git a/po/ay.po b/po/ay.po
new file mode 100644
index 0000000..ebfe79d
--- /dev/null
+++ b/po/ay.po
@@ -0,0 +1,144 @@
+# [es] ""
+# [es] "Project-Id-Version: PACKAGE VERSION\n"
+# [es] "Report-Msgid-Bugs-To: \n"
+# [es] "POT-Creation-Date: 2008-02-21 22:31+0100\n"
+# [es] "PO-Revision-Date: 2008-03-11 15:41-0400\n"
+# [es] "Last-Translator: Maria del Pilar Saenz Rodriguez <mapisaro@gmail.com>\n"
+# [es] "Language-Team: LANGUAGE <LL@li.org>\n"
+# [es] "MIME-Version: 1.0\n"
+# [es] "Content-Type: text/plain; charset=UTF-8\n"
+# [es] "Content-Transfer-Encoding: 8bit\n"
+# [es] "X-Generator: Pootle 1.1.0rc2\n"
+msgid ""
+msgstr ""
+"Project-Id-Version: OLPC v.0.82 Sept2008\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-09-13 18:21-0400\n"
+"Last-Translator: OLPC-Bolivia\n"
+"Language-Team: OLE Bolivia <amosbatto@yahoo.com>\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"
+"X-Poedit-Language: Aymara\n"
+"X-Poedit-Country: Bolivia\n"
+
+# [es] "Memorizar"
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr "P'iqin katuña"
+
+# [es] "Jugar"
+#: activity.py:70
+msgid "Play"
+msgstr "Añataña"
+
+# [es] "Crear"
+#: activity.py:74
+msgid "Create"
+msgstr "Uñstayaña"
+
+# [es] "Añadir un nuevo par"
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "Machaq paris yapaña"
+
+# [es] "Actualizar par seleccionado"
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "Paris ajllit jichhakiptaña"
+
+# [es] "Vista previa:"
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "Nayra uñjawi"
+
+# [es] "Texto:"
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "Sawu"
+
+# [es] "Escoger imagen"
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "Salta ajlliña"
+
+# [es] "Escoger audio"
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "Arsu ajlliña"
+
+# [es] "Nuevo juego"
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "Machaq anatawi"
+
+# [es] "Cargar Juego"
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Anataw khumtaña"
+
+# [es] "Guardar juego"
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "Anataw imaña"
+
+# [es] "Nombre del juego"
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "Anatawin sutipa"
+
+# [es] "Pares iguales"
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr " Kipkak parisa"
+
+# [es] "Click para juego en grupo"
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "\"k'kj\" luraña tamanakamp anatañataki"
+
+# [es] "Escoger juego de memoria"
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "Amuyu anatawi uk chhixllaña"
+
+# [es] "Click para juego sin grupo"
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "\"k'kj\" luraña tamanakamp jan anatañataki"
+
+# [es] "Cargando juego..."
+#: game.py:105
+msgid "Loading game..."
+msgstr "Anataw khumuntaña"
+
+# [es] "Cargar juegos de demostración"
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Uñanch anatawinak khumtaña"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/bg.po b/po/bg.po
new file mode 100644
index 0000000..6368f73
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,130 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 21:48+0100\n"
+"PO-Revision-Date: 2008-03-01 13:05-0500\n"
+"Last-Translator: Alexander Todorov <atodorov@redhat.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "Зареждане на играта..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Примерни игри"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "събиране"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr "главни букви"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr "барабани и китари"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "букви"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr "числа"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr "фонеми"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Рестартиране на играта"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Зареждане на игра"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "Избор на игра"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "Получаване на игра"
+
+#: messenger.py:183
+msgid "done"
+msgstr "готово"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Създаване"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Игра"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "Добавяне"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "Обновяване"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "Преглед:"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "Текст:"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "Избор на изображение"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "Избор на звук"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "Нова игра"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "Запазване"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "Име на играта"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "Еднакви елементи"
+
+# показва числа 1 и 2 в квадратчетата, за да не отваряш грешни елементи
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Игра с подсказки"
+
+# Не показва подсказките 1 и 2
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Игра без подсказки"
+
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr "Запаметяване"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "Звуци"
diff --git a/po/bi.po b/po/bi.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/bi.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/bn.po b/po/bn.po
new file mode 100644
index 0000000..95dc619
--- /dev/null
+++ b/po/bn.po
@@ -0,0 +1,113 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/bn_IN.po b/po/bn_IN.po
new file mode 100644
index 0000000..6742041
--- /dev/null
+++ b/po/bn_IN.po
@@ -0,0 +1,125 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: 2008-01-22 09:27+0000\n"
+"Last-Translator: Sankarshan Mukhopadhyay <sankarshan.mukhopadhyay@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr "খেলা শুরু হচ্ছে"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+#, fuzzy
+msgid "Load demo games"
+msgstr "ডেমো খেলাগুলি শুরু হচ্ছে"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr "যোগ কর্ম"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr "রাজধানি"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr "ড্রামগিট"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr "অক্ষরসমূহ"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr "সংখ্যাসমূহ"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr "ফোনিমসমূহ"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr "খেলা পুনরাম্ভ করুন"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr "খেলা শুরু করুন"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr "মেমোরাইজ খেলা বেছে নিন"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr "খেলা গ্রহণ করা হচ্ছে"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr "সমাপ্ত"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr "তৈরী করুন"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr "খেলা করুন"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr "জোড় হিসাবে যোগ করুন"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr "টেক্সট"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr "ছবি বেছে নিন"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr "শব্দস্রোত বেছে নিন"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr "নতুন খেলা"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr "খেলা সংরক্ষণ করুন"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr "খেলার নাম"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "সমান জোড়"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "গ্রুপের খেলার জন্য ক্লিক করুন"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+#, fuzzy
+msgid "Click for ungrouped game"
+msgstr "গ্রুপের খেলার জন্য ক্লিক করুন"
diff --git a/po/ca.po b/po/ca.po
new file mode 100644
index 0000000..3adecbb
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,126 @@
+# !! cal una altra traducció o potser deixar-la així
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: 2008-01-08 18:44+0000\n"
+"Last-Translator: Jaume <jaume@nualart.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr "Carregant el joc"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr "Carrega els jocs demo"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr "suma"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr "Majúscules"
+
+# !! cal una altra traducció o potser deixar-la així
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr "drumgit"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr "lletres"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr "números"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr "fonemes"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr "Reiniciar el joc"
+
+# Carrega el joc o carreja un joc_
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr "Carrega el joc"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr "Tria el joc de memòria"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr "Rebent el joc"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr "fet"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr "Crear"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr "Jugar"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr "Afegir com a nova parella"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr "Actualitzar la parella selecionada"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr "Vista prèvia:"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr "Text:"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr "Tria una imatge"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr "Tria un àudio"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr "Joc nou"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr "Desa el joc"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr "Nom del joc"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "Parelles iguals"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Clic per agrupar el joc"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Clic per desagrupar el joc"
diff --git a/po/cpp.po b/po/cpp.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/cpp.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/cs.po b/po/cs.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 0000000..653b03e
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,285 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-17 00:32-0400\n"
+"PO-Revision-Date: 2010-03-27 23:49+0200\n"
+"Last-Translator: shellige <email@hellige-online.de>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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.3\n"
+
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr "Merken"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Spielen"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Erstellen"
+
+#: createcardpanel.py:79
+msgid "Add as new pair"
+msgstr ""
+"Als neues Paar\n"
+"hinzufügen"
+
+#: createcardpanel.py:82
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: createcardpanel.py:87
+msgid "Update selected pair"
+msgstr ""
+"Ausgewähltes Paar\n"
+"aktualisieren"
+
+#: createcardpanel.py:90
+msgid "Update"
+msgstr "Aktualisieren"
+
+#: createcardpanel.py:255
+msgid "Preview:"
+msgstr "Vorschau:"
+
+#: createcardpanel.py:271
+msgid "Text:"
+msgstr "Text:"
+
+#: createcardpanel.py:283
+msgid "Insert picture"
+msgstr "Bild einfügen"
+
+#: createcardpanel.py:288
+msgid "Insert sound"
+msgstr "Ton einfügen"
+
+#: createcardpanel.py:434
+#, fuzzy
+msgid "Pronounce text during tile flip"
+msgstr "Beim Karten umdrehen Text ausgeben"
+
+#: createtoolbar.py:51
+msgid "New game"
+msgstr "Neues Spiel"
+
+#: createtoolbar.py:61 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Spiel laden"
+
+#: createtoolbar.py:71
+msgid "Save game"
+msgstr "Spiel speichern"
+
+#: createtoolbar.py:81
+msgid "Game name"
+msgstr "Spielname"
+
+#: createtoolbar.py:85
+msgid "Equal pairs"
+msgstr "Gleiches Paar"
+
+#: createtoolbar.py:97 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Klicken für gruppiertes Spiel"
+
+#: createtoolbar.py:114 memorizetoolbar.py:118
+msgid "Choose memorize game"
+msgstr "Spiel auswählen"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Klicken für ungruppiertes Spiel"
+
+#: game.py:92
+msgid "Loading game..."
+msgstr "Spiel laden..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Demo Spiel laden"
+
+# Ich denke "Addieren" trifft es besser. Das Spiel ist wirklich: 3+3 = 6...
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "Hinzufügen"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "Buchstaben"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "Klänge"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Spiel neu starten"
+
+#: messenger.py:195
+msgid "Receiving game"
+msgstr "Spiel empfangen"
+
+#: messenger.py:196
+msgid "done"
+msgstr "Fertig"
+
+#: speak/voice.py:36
+#, fuzzy
+msgid "Brazil"
+msgstr "Brasilianisch"
+
+#: speak/voice.py:37
+msgid "Swedish"
+msgstr "Schwedisch"
+
+#: speak/voice.py:38
+msgid "Icelandic"
+msgstr "Isländisch"
+
+#: speak/voice.py:39
+msgid "Romanian"
+msgstr "Rumänisch"
+
+#: speak/voice.py:40
+msgid "Swahili"
+msgstr "Suaheli"
+
+#: speak/voice.py:41
+msgid "Hindi"
+msgstr "Hindi"
+
+#: speak/voice.py:42
+msgid "Dutch"
+msgstr "Niederländisch"
+
+#: speak/voice.py:43
+msgid "Latin"
+msgstr "Lateinisch"
+
+#: speak/voice.py:44
+msgid "Hungarian"
+msgstr "Ungarisch"
+
+#: speak/voice.py:45
+msgid "Macedonian"
+msgstr "Makedonisch"
+
+#: speak/voice.py:46
+msgid "Welsh"
+msgstr "Walisisch"
+
+#: speak/voice.py:47
+msgid "French"
+msgstr "Französisch"
+
+#: speak/voice.py:48
+msgid "Norwegian"
+msgstr "Neu-Norwegisch"
+
+#: speak/voice.py:49
+msgid "Russian"
+msgstr "Russisch"
+
+#: speak/voice.py:50
+msgid "Afrikaans"
+msgstr "Afrikaans"
+
+#: speak/voice.py:51
+msgid "Finnish"
+msgstr "Finnisch"
+
+#: speak/voice.py:52 speak/voice.py:125
+msgid "Default"
+msgstr "Standard"
+
+#: speak/voice.py:53
+msgid "Cantonese"
+msgstr "Kantonesisch"
+
+#: speak/voice.py:54
+msgid "Scottish"
+msgstr "Schottisch"
+
+#: speak/voice.py:55
+msgid "Greek"
+msgstr "Neugriechisch"
+
+#: speak/voice.py:56
+msgid "Vietnam"
+msgstr "Vietnamesisch"
+
+#: speak/voice.py:57
+msgid "English"
+msgstr "Englisch"
+
+#: speak/voice.py:58
+#, fuzzy
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: speak/voice.py:59
+msgid "Italian"
+msgstr "Italienisch"
+
+#: speak/voice.py:60
+msgid "Portugal"
+msgstr "Portugiesisch"
+
+#: speak/voice.py:61
+msgid "German"
+msgstr "Deutsch"
+
+#: speak/voice.py:62
+#, fuzzy
+msgid "Whisper"
+msgstr "Flüstern"
+
+#: speak/voice.py:63
+msgid "Croatian"
+msgstr "Kroatisch"
+
+#: speak/voice.py:64
+msgid "Czech"
+msgstr "Tschechisch"
+
+#: speak/voice.py:65
+msgid "Slovak"
+msgstr "Slowakisch"
+
+#: speak/voice.py:66
+msgid "Spanish"
+msgstr "Spanisch"
+
+#: speak/voice.py:67
+msgid "Polish"
+msgstr "Polnisch"
+
+#: speak/voice.py:68
+msgid "Esperanto"
+msgstr "Esperanto"
+
+#~ msgid "Choose image"
+#~ msgstr "Bild auswählen"
+
+#~ msgid "Choose audio"
+#~ msgstr "Audio auswählen"
+
+#~ msgid "capitals"
+#~ msgstr "Großbuchstaben"
+
+#~ msgid "drumgit"
+#~ msgstr "Instrumente"
+
+#~ msgid "numbers"
+#~ msgstr "Zahlen"
+
+#~ msgid "phonemes"
+#~ msgstr "Foneme"
diff --git a/po/dz.po b/po/dz.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/dz.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/el.po b/po/el.po
new file mode 100644
index 0000000..3b36c55
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,124 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-03-23 13:40-0400\n"
+"Last-Translator: Γιάννης Κασκαμανίδης <ttnfy17@yahoo.gr>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "Απομνημόνευση"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Πάιξε"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Δημιούργησε"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "Πρόσθεσε σαν νέο ζευγάρι"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "Ενημέρωσε το επιλεγμένο ζευγάρι"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "Προεπισκόπηση:"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "Κείμενο:"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "Διάλλεξε φωτογραφία"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "Διάλλεξε ήχο"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "Νέο παιχνίδι"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Φόρτωσε το παιχνίδι"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "Αποθήκευσε το παιχνίδι"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "Όνομα παιχνιδιού"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "Όμοια ζευγάρια"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Κλίκ για ομαδικό παιχνίδι"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "Διάλλεξε παιχνίδι μνήμης"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Κλίκ για μη ομαδικό παιχνίδι"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "Φόρτωση παιχνιδιού..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Φόρτωσε δοκιμαστικά παιχνίδια"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "προσθήκη"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "γράμματα"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "ήχοι"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Ξαναπαίξε"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "Λαμβάνω το παιχνίδι"
+
+#: messenger.py:183
+msgid "done"
+msgstr "έτοιμο"
+
+#~ msgid "capitals"
+#~ msgstr "κεφαλαία"
+
+#~ msgid "drumgit"
+#~ msgstr "ψηφία"
+
+#~ msgid "numbers"
+#~ msgstr "αριθμοί"
+
+#~ msgid "phonemes"
+#~ msgstr "φωνήεντα"
diff --git a/po/en.po b/po/en.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/en.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/es.po b/po/es.po
new file mode 100644
index 0000000..97a2afc
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,333 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-17 00:32-0400\n"
+"PO-Revision-Date: 2010-02-24 21:31+0200\n"
+"Last-Translator: <aliosh2006@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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.1\n"
+
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr "Memorizar"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Jugar"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Crear"
+
+#: createcardpanel.py:79
+msgid "Add as new pair"
+msgstr "Añadir un nuevo par"
+
+#: createcardpanel.py:82
+msgid "Add"
+msgstr "Añadir"
+
+#: createcardpanel.py:87
+msgid "Update selected pair"
+msgstr "Actualizar par seleccionado"
+
+#: createcardpanel.py:90
+msgid "Update"
+msgstr "Actualizar"
+
+#: createcardpanel.py:255
+msgid "Preview:"
+msgstr "Vista previa:"
+
+#: createcardpanel.py:271
+msgid "Text:"
+msgstr "Texto:"
+
+#: createcardpanel.py:283
+msgid "Insert picture"
+msgstr "Insertar imagen"
+
+#: createcardpanel.py:288
+msgid "Insert sound"
+msgstr "Insertar sonido"
+
+#: createcardpanel.py:434
+msgid "Pronounce text during tile flip"
+msgstr "Pronunciar texto mientras voltea la carta"
+
+#: createtoolbar.py:51
+msgid "New game"
+msgstr "Nuevo juego"
+
+#: createtoolbar.py:61 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Cargar Juego"
+
+#: createtoolbar.py:71
+msgid "Save game"
+msgstr "Guardar juego"
+
+#: createtoolbar.py:81
+msgid "Game name"
+msgstr "Nombre del juego"
+
+#: createtoolbar.py:85
+msgid "Equal pairs"
+msgstr "Pares iguales"
+
+#: createtoolbar.py:97 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Click para juego en grupo"
+
+#: createtoolbar.py:114 memorizetoolbar.py:118
+msgid "Choose memorize game"
+msgstr "Escoger juego de memoria"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Click para juego sin grupo"
+
+#: game.py:92
+msgid "Loading game..."
+msgstr "Cargando juego..."
+
+# How about "Cargar juegos de demostración". Demo might not be readily understood in all locales.
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Cargar juegos de demostración"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "adición"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "letras"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "sonidos"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Reiniciar Juego"
+
+#: messenger.py:195
+msgid "Receiving game"
+msgstr "Recibiendo juego"
+
+#: messenger.py:196
+msgid "done"
+msgstr "hecho"
+
+#: speak/voice.py:36
+msgid "Brazil"
+msgstr "Brasil"
+
+#: speak/voice.py:37
+msgid "Swedish"
+msgstr "Sueco"
+
+#: speak/voice.py:38
+msgid "Icelandic"
+msgstr "Islandés"
+
+#: speak/voice.py:39
+msgid "Romanian"
+msgstr "Rumano"
+
+#: speak/voice.py:40
+msgid "Swahili"
+msgstr "Swahili"
+
+#: speak/voice.py:41
+msgid "Hindi"
+msgstr "Hindi"
+
+#: speak/voice.py:42
+msgid "Dutch"
+msgstr "Holandés"
+
+#: speak/voice.py:43
+msgid "Latin"
+msgstr "Latín"
+
+#: speak/voice.py:44
+msgid "Hungarian"
+msgstr "Húngaro"
+
+#: speak/voice.py:45
+msgid "Macedonian"
+msgstr "Macedonio"
+
+#: speak/voice.py:46
+msgid "Welsh"
+msgstr "Galés"
+
+#: speak/voice.py:47
+msgid "French"
+msgstr "Francés"
+
+#: speak/voice.py:48
+msgid "Norwegian"
+msgstr "Noruego"
+
+#: speak/voice.py:49
+msgid "Russian"
+msgstr "Ruso"
+
+#: speak/voice.py:50
+msgid "Afrikaans"
+msgstr "Afrikáans"
+
+#: speak/voice.py:51
+msgid "Finnish"
+msgstr "Finés"
+
+#: speak/voice.py:52 speak/voice.py:125
+msgid "Default"
+msgstr "Predeterminada"
+
+#: speak/voice.py:53
+msgid "Cantonese"
+msgstr "Cantonés"
+
+#: speak/voice.py:54
+msgid "Scottish"
+msgstr "Escocés"
+
+#: speak/voice.py:55
+msgid "Greek"
+msgstr "Griego"
+
+#: speak/voice.py:56
+msgid "Vietnam"
+msgstr "Vietnamita"
+
+#: speak/voice.py:57
+msgid "English"
+msgstr "Inglés"
+
+#: speak/voice.py:58
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: speak/voice.py:59
+msgid "Italian"
+msgstr "Italiano"
+
+#: speak/voice.py:60
+msgid "Portugal"
+msgstr "Portugués"
+
+#: speak/voice.py:61
+msgid "German"
+msgstr "Alemán"
+
+#: speak/voice.py:62
+msgid "Whisper"
+msgstr "Susurro"
+
+#: speak/voice.py:63
+msgid "Croatian"
+msgstr "Croata"
+
+#: speak/voice.py:64
+msgid "Czech"
+msgstr "Checo"
+
+#: speak/voice.py:65
+msgid "Slovak"
+msgstr "Eslovaco"
+
+#: speak/voice.py:66
+msgid "Spanish"
+msgstr "Español"
+
+#: speak/voice.py:67
+msgid "Polish"
+msgstr "Polaco"
+
+#: speak/voice.py:68
+msgid "Esperanto"
+msgstr "Esperanto"
+
+#~ msgid "Pronounce text while fliping tile"
+#~ msgstr "Pronuncia el texto mientras das la vuelta a la carta"
+
+#~ msgid "Choose image"
+#~ msgstr "Escoger imagen"
+
+#~ msgid "Choose audio"
+#~ msgstr "Escoger audio"
+
+#~ msgid "capitals"
+#~ msgstr "capitales"
+
+#, fuzzy
+#~ msgid "drumgit"
+#~ msgstr "drumgit"
+
+#~ msgid "numbers"
+#~ msgstr "números"
+
+#~ msgid "phonemes"
+#~ msgstr "fonemas"
diff --git a/po/fa.po b/po/fa.po
new file mode 100644
index 0000000..e9bba06
--- /dev/null
+++ b/po/fa.po
@@ -0,0 +1,124 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: 2008-01-09 09:15+0000\n"
+"Last-Translator: Sohaib Obaidi <ebtihaj_obaidi@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr "بارگذاری بازی در حال جریان"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+#, fuzzy
+msgid "Load demo games"
+msgstr "بارگذاری بازی های دمو"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr "افزایش"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr "حروف بزرگ"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr "حروف"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr "اعداد"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr "صدا های ساده"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr "شروع دوباره بازی"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr "بارگذاری بازی"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr "بازی حافظیی را انتخاب نمائید"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr "بدست آوردن بازی"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr "شد"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr "آفریدن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr "بازی"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr "یک جوره تازه را اضافه کن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr "جوره انتخاب شده را بروز کن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr "پیش نمایش:"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr "متن:"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr "شکل را انتخاب کن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr "شنیدنی را انتخاب کن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr "بازی جدید"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr "بازی را ثبت کن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr "نام بازی"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "جوره های مساوی"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "برای بازی گروهی تیک کن "
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "برای بازی غیرگروهی تیک کن"
diff --git a/po/fa_AF.po b/po/fa_AF.po
new file mode 100644
index 0000000..24a153c
--- /dev/null
+++ b/po/fa_AF.po
@@ -0,0 +1,123 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: 2008-01-28 05:34-0500\n"
+"Last-Translator: Sohaib Obaidi <ebtihaj_obaidi@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr "در حال اجرای بازی..."
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr "اجرای بازی های نمونه نمايشی"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr "افزایش"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr "حروف بزرگ"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr "درم گت"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr "حروف"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr "اعداد"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr "صدا های ساده"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr "شروع دوباره بازی"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr "بارگذاری بازی"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr "بازی حافظیی را انتخاب نمائید"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr "بدست آوردن بازی"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr "شد"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr "آفریدن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr "بازی"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr "یک جوره تازه را اضافه کن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr "جوره انتخاب شده را بروز کن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr "پیش نمایش:"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr "متن:"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr "شکل را انتخاب کن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr "شنیدنی را انتخاب کن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr "بازی جدید"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr "بازی را ثبت کن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr "نام بازی"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "جوره های مساوی"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "برای بازی گروهی تیک کن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "برای بازی غیرگروهی تیک کن"
diff --git a/po/ff.po b/po/ff.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/ff.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/fil.po b/po/fil.po
new file mode 100644
index 0000000..3ae9605
--- /dev/null
+++ b/po/fil.po
@@ -0,0 +1,261 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-17 00:32-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:79
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:82
+msgid "Add"
+msgstr ""
+
+#: createcardpanel.py:87
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:90
+msgid "Update"
+msgstr ""
+
+#: createcardpanel.py:255
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:271
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:283
+msgid "Insert picture"
+msgstr ""
+
+#: createcardpanel.py:288
+msgid "Insert sound"
+msgstr ""
+
+#: createcardpanel.py:434
+msgid "Pronounce text during tile flip"
+msgstr ""
+
+#: createtoolbar.py:51
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:61 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:71
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:81
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:85
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:97 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:114 memorizetoolbar.py:118
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:92
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:195
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:196
+msgid "done"
+msgstr ""
+
+#: speak/voice.py:36
+msgid "Brazil"
+msgstr ""
+
+#: speak/voice.py:37
+msgid "Swedish"
+msgstr ""
+
+#: speak/voice.py:38
+msgid "Icelandic"
+msgstr ""
+
+#: speak/voice.py:39
+msgid "Romanian"
+msgstr ""
+
+#: speak/voice.py:40
+msgid "Swahili"
+msgstr ""
+
+#: speak/voice.py:41
+msgid "Hindi"
+msgstr ""
+
+#: speak/voice.py:42
+msgid "Dutch"
+msgstr ""
+
+#: speak/voice.py:43
+msgid "Latin"
+msgstr ""
+
+#: speak/voice.py:44
+msgid "Hungarian"
+msgstr ""
+
+#: speak/voice.py:45
+msgid "Macedonian"
+msgstr ""
+
+#: speak/voice.py:46
+msgid "Welsh"
+msgstr ""
+
+#: speak/voice.py:47
+msgid "French"
+msgstr ""
+
+#: speak/voice.py:48
+msgid "Norwegian"
+msgstr ""
+
+#: speak/voice.py:49
+msgid "Russian"
+msgstr ""
+
+#: speak/voice.py:50
+msgid "Afrikaans"
+msgstr ""
+
+#: speak/voice.py:51
+msgid "Finnish"
+msgstr ""
+
+#: speak/voice.py:52 speak/voice.py:125
+msgid "Default"
+msgstr ""
+
+#: speak/voice.py:53
+msgid "Cantonese"
+msgstr ""
+
+#: speak/voice.py:54
+msgid "Scottish"
+msgstr ""
+
+#: speak/voice.py:55
+msgid "Greek"
+msgstr ""
+
+#: speak/voice.py:56
+msgid "Vietnam"
+msgstr ""
+
+#: speak/voice.py:57
+msgid "English"
+msgstr ""
+
+#: speak/voice.py:58
+msgid "Lancashire"
+msgstr ""
+
+#: speak/voice.py:59
+msgid "Italian"
+msgstr ""
+
+#: speak/voice.py:60
+msgid "Portugal"
+msgstr ""
+
+#: speak/voice.py:61
+msgid "German"
+msgstr ""
+
+#: speak/voice.py:62
+msgid "Whisper"
+msgstr ""
+
+#: speak/voice.py:63
+msgid "Croatian"
+msgstr ""
+
+#: speak/voice.py:64
+msgid "Czech"
+msgstr ""
+
+#: speak/voice.py:65
+msgid "Slovak"
+msgstr ""
+
+#: speak/voice.py:66
+msgid "Spanish"
+msgstr ""
+
+#: speak/voice.py:67
+msgid "Polish"
+msgstr ""
+
+#: speak/voice.py:68
+msgid "Esperanto"
+msgstr ""
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 0000000..f7e095a
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,299 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-17 00:32-0400\n"
+"PO-Revision-Date: 2009-11-11 00:54-0400\n"
+"Last-Translator: samy boutayeb <s.boutayeb@free.fr>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr "Mémoriser"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Jouer"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Créer"
+
+#: createcardpanel.py:79
+msgid "Add as new pair"
+msgstr "Ajouter une nouvelle paire"
+
+#: createcardpanel.py:82
+msgid "Add"
+msgstr "Ajouter"
+
+#: createcardpanel.py:87
+msgid "Update selected pair"
+msgstr "Mettre à jour la paire sélectionnée"
+
+#: createcardpanel.py:90
+msgid "Update"
+msgstr "Mise à jour"
+
+#: createcardpanel.py:255
+msgid "Preview:"
+msgstr "Aperçu :"
+
+#: createcardpanel.py:271
+msgid "Text:"
+msgstr "Texte :"
+
+#: createcardpanel.py:283
+msgid "Insert picture"
+msgstr "Insérer une image"
+
+#: createcardpanel.py:288
+msgid "Insert sound"
+msgstr "Insérer un son"
+
+#: createcardpanel.py:434
+msgid "Pronounce text during tile flip"
+msgstr "Prononcer le texte pendant le retournement"
+
+#: createtoolbar.py:51
+msgid "New game"
+msgstr "Nouvelle partie"
+
+#: createtoolbar.py:61 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Charge la partie"
+
+#: createtoolbar.py:71
+msgid "Save game"
+msgstr "Sauvegarder la partie"
+
+#: createtoolbar.py:81
+msgid "Game name"
+msgstr "Nom de la partie"
+
+#: createtoolbar.py:85
+msgid "Equal pairs"
+msgstr "Paires égales"
+
+#: createtoolbar.py:97 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Cliquer pour une partie en groupe"
+
+#: createtoolbar.py:114 memorizetoolbar.py:118
+msgid "Choose memorize game"
+msgstr "Choisis la partie mémorisée"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Cliquer pour une partie hors groupe"
+
+#: game.py:92
+msgid "Loading game..."
+msgstr "Chargement d'une partie..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Charge des parties de démonstrations"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "addition"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "lettres"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "sons"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Redémarre la partie"
+
+#: messenger.py:195
+msgid "Receiving game"
+msgstr "Réception d'une partie"
+
+#: messenger.py:196
+msgid "done"
+msgstr "terminé"
+
+#: speak/voice.py:36
+msgid "Brazil"
+msgstr "Brésil"
+
+#: speak/voice.py:37
+msgid "Swedish"
+msgstr "Suédois"
+
+#: speak/voice.py:38
+msgid "Icelandic"
+msgstr "Icelandais"
+
+#: speak/voice.py:39
+msgid "Romanian"
+msgstr "Roumain"
+
+#: speak/voice.py:40
+msgid "Swahili"
+msgstr "Swahili"
+
+#: speak/voice.py:41
+msgid "Hindi"
+msgstr "Hindi"
+
+#: speak/voice.py:42
+msgid "Dutch"
+msgstr "Néerlandais"
+
+#: speak/voice.py:43
+msgid "Latin"
+msgstr "Latin"
+
+#: speak/voice.py:44
+msgid "Hungarian"
+msgstr "Hongrois"
+
+#: speak/voice.py:45
+msgid "Macedonian"
+msgstr "Macédonien"
+
+#: speak/voice.py:46
+msgid "Welsh"
+msgstr "Gallois"
+
+#: speak/voice.py:47
+msgid "French"
+msgstr "Français"
+
+#: speak/voice.py:48
+msgid "Norwegian"
+msgstr "Norvégien"
+
+#: speak/voice.py:49
+msgid "Russian"
+msgstr "Russe"
+
+#: speak/voice.py:50
+msgid "Afrikaans"
+msgstr "Afrikaans"
+
+#: speak/voice.py:51
+msgid "Finnish"
+msgstr "Finnois"
+
+#: speak/voice.py:52 speak/voice.py:125
+msgid "Default"
+msgstr "Défaut"
+
+#: speak/voice.py:53
+msgid "Cantonese"
+msgstr "Cantonais"
+
+#: speak/voice.py:54
+msgid "Scottish"
+msgstr "Écossais"
+
+#: speak/voice.py:55
+msgid "Greek"
+msgstr "Grec"
+
+#: speak/voice.py:56
+msgid "Vietnam"
+msgstr "Vietnamien"
+
+#: speak/voice.py:57
+msgid "English"
+msgstr "Anglais"
+
+#: speak/voice.py:58
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: speak/voice.py:59
+msgid "Italian"
+msgstr "Italien"
+
+#: speak/voice.py:60
+msgid "Portugal"
+msgstr "Portugais"
+
+#: speak/voice.py:61
+msgid "German"
+msgstr "Allemand"
+
+#: speak/voice.py:62
+msgid "Whisper"
+msgstr "Chuchoté"
+
+#: speak/voice.py:63
+msgid "Croatian"
+msgstr "Croate"
+
+#: speak/voice.py:64
+msgid "Czech"
+msgstr "Tchèque"
+
+#: speak/voice.py:65
+msgid "Slovak"
+msgstr "Slovaque"
+
+#: speak/voice.py:66
+msgid "Spanish"
+msgstr "Espagnol"
+
+#: speak/voice.py:67
+msgid "Polish"
+msgstr "Polonais"
+
+#: speak/voice.py:68
+msgid "Esperanto"
+msgstr "Esperanto"
+
+#~ msgid "Pronounce text while fliping tile"
+#~ msgstr "Prononce le texte en retournant la carte"
+
+#~ msgid "Choose image"
+#~ msgstr "Choisir une image"
+
+#~ msgid "Choose audio"
+#~ msgstr "Choisir un son"
+
+#~ msgid "capitals"
+#~ msgstr "capitales"
+
+#~ msgid "drumgit"
+#~ msgstr "drumgit"
+
+#~ msgid "numbers"
+#~ msgstr "nombres"
+
+#~ msgid "phonemes"
+#~ msgstr "phonèmes"
diff --git a/po/gu.po b/po/gu.po
new file mode 100644
index 0000000..ddc4371
--- /dev/null
+++ b/po/gu.po
@@ -0,0 +1,129 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 21:48+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
diff --git a/po/ha.po b/po/ha.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/ha.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/he.po b/po/he.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/he.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/hi.po b/po/hi.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/hi.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/ht.po b/po/ht.po
new file mode 100644
index 0000000..ea13476
--- /dev/null
+++ b/po/ht.po
@@ -0,0 +1,115 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-03-11 10:11-0400\n"
+"Last-Translator: Jude Augusma <jayme2901@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "Memorize"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Jwe"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Kreye"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "Ajoute yon nouvo pè"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "Mete pè seleksyone-a ajou"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "Previze:"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "Tèks:"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "Chwazi imaj"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "Chwazi son"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "Nouvo jwèt"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Louvri jwèt"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "Sove jwèt la"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "Non jwèt la"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "Pè egal ego"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Klike pou jwenn jwèt ki gwoupe yo"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "Chwazi jwèt memorize"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Klike pou jwenn jwèt ki pa gwoupe yo"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "Jwèl la ap louvri....."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Louvri demonstrasyon jwèt yo"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "Adisyon"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "Lèt yo"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "Son yo"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Rekòmanse jwèt la"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "Ap resevwa jwèt"
+
+#: messenger.py:183
+msgid "done"
+msgstr "Fini"
+
+#~ msgid "numbers"
+#~ msgstr "Nonb yo"
diff --git a/po/hu.po b/po/hu.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/ig.po b/po/ig.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/ig.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/is.po b/po/is.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/is.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 0000000..c3c239d
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,307 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-17 00:32-0400\n"
+"PO-Revision-Date: 2009-11-09 02:52-0400\n"
+"Last-Translator: Carlo Falciola <cfalciola@yahoo.it>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
+
+# Il nome indentifica il gioco ... il termine memorizza non rende l'idea anche se letteralmente sarebbe corretto.
+# Preferisco lasciare Memorize
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr "Memorize"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Gioca"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Crea"
+
+#: createcardpanel.py:79
+msgid "Add as new pair"
+msgstr "Aggiungi come nuova coppia"
+
+#: createcardpanel.py:82
+msgid "Add"
+msgstr "Aggiungi"
+
+#: createcardpanel.py:87
+msgid "Update selected pair"
+msgstr "Aggiorna la coppia selezionata"
+
+#: createcardpanel.py:90
+msgid "Update"
+msgstr "Aggiorna"
+
+#: createcardpanel.py:255
+msgid "Preview:"
+msgstr "Anteprima:"
+
+#: createcardpanel.py:271
+msgid "Text:"
+msgstr "Testo:"
+
+#: createcardpanel.py:283
+msgid "Insert picture"
+msgstr "Inserisci immagine"
+
+#: createcardpanel.py:288
+msgid "Insert sound"
+msgstr "Inserisci suono"
+
+#: createcardpanel.py:434
+msgid "Pronounce text during tile flip"
+msgstr "Leggi il testo girando la carta"
+
+#: createtoolbar.py:51
+msgid "New game"
+msgstr "Nuova partita"
+
+#: createtoolbar.py:61 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Carica partita"
+
+#: createtoolbar.py:71
+msgid "Save game"
+msgstr "Salva partita"
+
+#: createtoolbar.py:81
+msgid "Game name"
+msgstr "Nome partita"
+
+#: createtoolbar.py:85
+msgid "Equal pairs"
+msgstr "Coppie identiche"
+
+#: createtoolbar.py:97 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Seleziona per partita di gruppo"
+
+# o gioco di memorizzazione??? (si c'è una attività memorize, infatti (cf))
+# Memorizzato sarebbe stored o altro
+#
+# Io lascerei il nome Memorize ... in questo caso forse si può mettere anche "Scegli il gioco".
+#: createtoolbar.py:114 memorizetoolbar.py:118
+msgid "Choose memorize game"
+msgstr "Scegli il gioco Memorize"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Seleziona per partita da solo"
+
+#: game.py:92
+msgid "Loading game..."
+msgstr "Caricamento partita..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Carica partite dimostrative"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "somme"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "lettere"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "suoni"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Ricomincia partita"
+
+#: messenger.py:195
+msgid "Receiving game"
+msgstr "Ricezione partita"
+
+#: messenger.py:196
+msgid "done"
+msgstr "fatto"
+
+#: speak/voice.py:36
+msgid "Brazil"
+msgstr "Brasile"
+
+#: speak/voice.py:37
+msgid "Swedish"
+msgstr "Svedese"
+
+#: speak/voice.py:38
+msgid "Icelandic"
+msgstr "Islandese"
+
+#: speak/voice.py:39
+msgid "Romanian"
+msgstr "Rumeno"
+
+#: speak/voice.py:40
+msgid "Swahili"
+msgstr "Swahili"
+
+#: speak/voice.py:41
+msgid "Hindi"
+msgstr "Hindi"
+
+#: speak/voice.py:42
+msgid "Dutch"
+msgstr "Olandese"
+
+#: speak/voice.py:43
+msgid "Latin"
+msgstr "Latino"
+
+#: speak/voice.py:44
+msgid "Hungarian"
+msgstr "Ungherese"
+
+#: speak/voice.py:45
+msgid "Macedonian"
+msgstr "Macedone"
+
+#: speak/voice.py:46
+msgid "Welsh"
+msgstr "Gallese"
+
+#: speak/voice.py:47
+msgid "French"
+msgstr "Francese"
+
+#: speak/voice.py:48
+msgid "Norwegian"
+msgstr "Norvegese"
+
+#: speak/voice.py:49
+msgid "Russian"
+msgstr "Russo"
+
+#: speak/voice.py:50
+msgid "Afrikaans"
+msgstr "Afrikaans"
+
+#: speak/voice.py:51
+msgid "Finnish"
+msgstr "Finlandese"
+
+#: speak/voice.py:52 speak/voice.py:125
+msgid "Default"
+msgstr "Default"
+
+#: speak/voice.py:53
+msgid "Cantonese"
+msgstr "Cantonese"
+
+#: speak/voice.py:54
+msgid "Scottish"
+msgstr "Scozzese"
+
+#: speak/voice.py:55
+msgid "Greek"
+msgstr "Greco"
+
+#: speak/voice.py:56
+msgid "Vietnam"
+msgstr "Vietnamita"
+
+#: speak/voice.py:57
+msgid "English"
+msgstr "Inglese"
+
+#: speak/voice.py:58
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: speak/voice.py:59
+msgid "Italian"
+msgstr "Italiano"
+
+#: speak/voice.py:60
+msgid "Portugal"
+msgstr "Portoghese"
+
+#: speak/voice.py:61
+msgid "German"
+msgstr "Tedesco"
+
+#: speak/voice.py:62
+msgid "Whisper"
+msgstr "Whisper"
+
+#: speak/voice.py:63
+msgid "Croatian"
+msgstr "Croato"
+
+#: speak/voice.py:64
+msgid "Czech"
+msgstr "Ceco"
+
+#: speak/voice.py:65
+msgid "Slovak"
+msgstr "Slovacco"
+
+#: speak/voice.py:66
+msgid "Spanish"
+msgstr "Spagnolo"
+
+#: speak/voice.py:67
+msgid "Polish"
+msgstr "Polacco"
+
+#: speak/voice.py:68
+msgid "Esperanto"
+msgstr "Esperanto"
+
+#~ msgid "Pronounce text while fliping tile"
+#~ msgstr "Pronuncia il testo mentre giri i tasselli"
+
+#~ msgid "Choose image"
+#~ msgstr "Scegli immagine"
+
+#~ msgid "Choose audio"
+#~ msgstr "Scegli suono"
+
+#~ msgid "capitals"
+#~ msgstr "maiuscole"
+
+# The word entered isn't in the dictionary....
+#, fuzzy
+#~ msgid "drumgit"
+#~ msgstr "drumgit"
+
+#~ msgid "numbers"
+#~ msgstr "numeri"
+
+#~ msgid "phonemes"
+#~ msgstr "fonemi"
diff --git a/po/ja.po b/po/ja.po
new file mode 100644
index 0000000..a4f76a9
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,268 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-07-14 10:26+0000\n"
+"PO-Revision-Date: 2009-11-01 06:55-0400\n"
+"Last-Translator: korakurider <korakurider@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr "Memorize"
+
+#: /home/sugar/src/activities/memorize.activity/game.py:93
+msgid "Loading game..."
+msgstr "ゲームを読み込んでいます..."
+
+#: /home/sugar/src/activities/memorize.activity/messenger.py:192
+msgid "Receiving game"
+msgstr "ゲームを受け取る"
+
+#: /home/sugar/src/activities/memorize.activity/messenger.py:192
+msgid "done"
+msgstr "完了"
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:51
+msgid "New game"
+msgstr "新しいゲーム"
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:61
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:73
+msgid "Load game"
+msgstr "ゲームを読み込む"
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:71
+msgid "Save game"
+msgstr "ゲームを保存"
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:81
+msgid "Game name"
+msgstr "ゲームの名前"
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:85
+msgid "Equal pairs"
+msgstr "同じもののペア"
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:97
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:156
+msgid "Click for grouped game"
+msgstr "クリックすると、グループ化されたゲームになります"
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:114
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "記憶ゲームを選ぶ"
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:152
+msgid "Click for ungrouped game"
+msgstr "クリックすると、グループ化されていないゲームになります"
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "デモゲームを読み込む"
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:41
+msgid "addition"
+msgstr "足し算"
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:42
+msgid "letters"
+msgstr "文字"
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:43
+msgid "sounds"
+msgstr "音"
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "ゲームをやり直す"
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:82
+msgid "Add as new pair"
+msgstr "新しいペアとして追加"
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:85
+msgid "Add"
+msgstr "追加"
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:90
+msgid "Update selected pair"
+msgstr "選ばれたペアを更新"
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:93
+msgid "Update"
+msgstr "更新"
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:254
+msgid "Preview:"
+msgstr "プレビュー:"
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:270
+msgid "Text:"
+msgstr "文字:"
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:282
+msgid "Insert picture"
+msgstr "画像を入れる"
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:287
+msgid "Insert sound"
+msgstr "音を入れる"
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:427
+msgid "Pronounce text while fliping tile"
+msgstr "タイルをめくる時テキストを読み上げる"
+
+#: /home/sugar/src/activities/memorize.activity/activity.py:74
+msgid "Play"
+msgstr "遊ぶ"
+
+#: /home/sugar/src/activities/memorize.activity/activity.py:78
+msgid "Create"
+msgstr "作成"
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:36
+msgid "Brazil"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:37
+msgid "Swedish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:38
+msgid "Icelandic"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:39
+msgid "Romanian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:40
+msgid "Swahili"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:41
+msgid "Hindi"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:42
+msgid "Dutch"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:43
+msgid "Latin"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:44
+msgid "Hungarian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:45
+msgid "Macedonian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:46
+msgid "Welsh"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:47
+msgid "French"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:48
+msgid "Norwegian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:49
+msgid "Russian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:50
+msgid "Afrikaans"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:51
+msgid "Finnish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:52
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:125
+msgid "Default"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:53
+msgid "Cantonese"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:54
+msgid "Scottish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:55
+msgid "Greek"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:56
+msgid "Vietnam"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:57
+msgid "English"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:58
+msgid "Lancashire"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:59
+msgid "Italian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:60
+msgid "Portugal"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:61
+msgid "German"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:62
+msgid "Whisper"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:63
+msgid "Croatian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:64
+msgid "Czech"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:65
+msgid "Slovak"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:66
+msgid "Spanish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:67
+msgid "Polish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:68
+msgid "Esperanto"
+msgstr ""
+
+#~ msgid "Choose image"
+#~ msgstr "画像を選ぶ"
+
+#~ msgid "Choose audio"
+#~ msgstr "音を選ぶ"
diff --git a/po/km.po b/po/km.po
new file mode 100644
index 0000000..2990a23
--- /dev/null
+++ b/po/km.po
@@ -0,0 +1,116 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-03-17 18:01-0400\n"
+"Last-Translator: Rit Lim <rit.lim@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "ទន្ទេញ"
+
+#: activity.py:70
+msgid "Play"
+msgstr "លេញ"
+
+#: activity.py:74
+msgid "Create"
+msgstr "បង្កើត"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "ថែមទៅជាគូថ្មី"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "កែជំរើស​គូ"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "ព្រាង"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "អត្ថបត"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "ជ្ររើស​រូបភាប"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "ជ្ររើស​សំលេង"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "លេង​សាឡើងវិញ"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "រៀបចំ​ល្បែង"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "ថត​ទុក"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "ឈ្មោះ​ល្បែង"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "គូប៉ុន​គ្នា"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "ចុច​ដើម្បី​លេង​ល្បែង​ជា​ក្រុម"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "ច្រើសរើស​ចំណាំ​ល្បែង"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "ចុច​ដើម្បី​លេង​ល្បែង​មិនជា​ក្រុម"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "រៀប​ចំ​ល្បែង"
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "រៀប​ចំ​​បង្ហាញ​ល្បែង"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "បូក​លេខ"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "អក្សរ"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "សំលេញ"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "ចាប់​ផ្ដើម​ឡើង​វិញ"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "កំពុង​ទទួល​ល្បែង"
+
+#: messenger.py:183
+msgid "done"
+msgstr "រួច​ហើយ"
diff --git a/po/ko.po b/po/ko.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/ko.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/kos.po b/po/kos.po
new file mode 100644
index 0000000..bd54689
--- /dev/null
+++ b/po/kos.po
@@ -0,0 +1,266 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-07-14 10:26+0000\n"
+"PO-Revision-Date: 2009-09-02 21:33-0400\n"
+"Last-Translator: Chris Leonard <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: kos\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 "Memorize"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/game.py:93
+msgid "Loading game..."
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/messenger.py:192
+msgid "Receiving game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/messenger.py:192
+msgid "done"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:51
+msgid "New game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:61
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:71
+msgid "Save game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:81
+msgid "Game name"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:85
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:97
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:156
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:114
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:152
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:82
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:85
+msgid "Add"
+msgstr "Sang"
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:90
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:93
+msgid "Update"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:254
+msgid "Preview:"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:270
+msgid "Text:"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:282
+msgid "Insert picture"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:287
+msgid "Insert sound"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:427
+msgid "Pronounce text while fliping tile"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/activity.py:78
+msgid "Create"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:36
+msgid "Brazil"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:37
+msgid "Swedish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:38
+msgid "Icelandic"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:39
+msgid "Romanian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:40
+msgid "Swahili"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:41
+msgid "Hindi"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:42
+msgid "Dutch"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:43
+msgid "Latin"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:44
+msgid "Hungarian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:45
+msgid "Macedonian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:46
+msgid "Welsh"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:47
+msgid "French"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:48
+msgid "Norwegian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:49
+msgid "Russian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:50
+msgid "Afrikaans"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:51
+msgid "Finnish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:52
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:125
+msgid "Default"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:53
+msgid "Cantonese"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:54
+msgid "Scottish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:55
+msgid "Greek"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:56
+msgid "Vietnam"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:57
+msgid "English"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:58
+msgid "Lancashire"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:59
+msgid "Italian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:60
+msgid "Portugal"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:61
+msgid "German"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:62
+msgid "Whisper"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:63
+msgid "Croatian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:64
+msgid "Czech"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:65
+msgid "Slovak"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:66
+msgid "Spanish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:67
+msgid "Polish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:68
+msgid "Esperanto"
+msgstr ""
diff --git a/po/mg.po b/po/mg.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/mg.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/mk.po b/po/mk.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/mk.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/ml.po b/po/ml.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/ml.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/mn.po b/po/mn.po
new file mode 100644
index 0000000..1ccec33
--- /dev/null
+++ b/po/mn.po
@@ -0,0 +1,276 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-17 00:32-0400\n"
+"PO-Revision-Date: 2010-01-06 00:41-0400\n"
+"Last-Translator: Chris Leonard <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr "Цээжлэх"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Тоглох"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Үүсгэх"
+
+#: createcardpanel.py:79
+msgid "Add as new pair"
+msgstr "Шинэ хос болгон нэмэх"
+
+#: createcardpanel.py:82
+msgid "Add"
+msgstr "Нэмэх"
+
+#: createcardpanel.py:87
+msgid "Update selected pair"
+msgstr "Сонгосон хосыг шинэчлэх"
+
+#: createcardpanel.py:90
+msgid "Update"
+msgstr "Шинэчлэх"
+
+#: createcardpanel.py:255
+msgid "Preview:"
+msgstr "Урьдчилан харах:"
+
+#: createcardpanel.py:271
+msgid "Text:"
+msgstr "Бичвэр:"
+
+#: createcardpanel.py:283
+msgid "Insert picture"
+msgstr "Зураг оруулах"
+
+#: createcardpanel.py:288
+msgid "Insert sound"
+msgstr "Дуу чимээ оруулах"
+
+#: createcardpanel.py:434
+msgid "Pronounce text during tile flip"
+msgstr ""
+
+#: createtoolbar.py:51
+msgid "New game"
+msgstr "Шинэ тоглоом"
+
+#: createtoolbar.py:61 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Тоглоом ачаалах"
+
+#: createtoolbar.py:71
+msgid "Save game"
+msgstr "Тоглоомыг хадгалах"
+
+#: createtoolbar.py:81
+msgid "Game name"
+msgstr "Тоглоомын нэр"
+
+#: createtoolbar.py:85
+msgid "Equal pairs"
+msgstr "Тэнцүү хосууд"
+
+#: createtoolbar.py:97 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Бүлгээрээ тоглохдоо энд дарна уу"
+
+#: createtoolbar.py:114 memorizetoolbar.py:118
+msgid "Choose memorize game"
+msgstr "Тоглоом сонгох"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Ганцаараа тоглохдоо энд дарна уу"
+
+#: game.py:92
+msgid "Loading game..."
+msgstr "Тоглоомыг ачаалж байна..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Жишээ тоглоомыг ачаалах"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "нэмэлт"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "үсэгнүүд"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "дуу"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Тоглоомыг дахин эхлүүлэх"
+
+#: messenger.py:195
+msgid "Receiving game"
+msgstr "Тоглоомыг хүлээн авч байна"
+
+#: messenger.py:196
+msgid "done"
+msgstr "боллоо"
+
+#: speak/voice.py:36
+msgid "Brazil"
+msgstr ""
+
+#: speak/voice.py:37
+msgid "Swedish"
+msgstr "Швед"
+
+#: speak/voice.py:38
+msgid "Icelandic"
+msgstr "Исланд"
+
+#: speak/voice.py:39
+msgid "Romanian"
+msgstr "Румын"
+
+#: speak/voice.py:40
+msgid "Swahili"
+msgstr "Свахили"
+
+#: speak/voice.py:41
+msgid "Hindi"
+msgstr "Хинди"
+
+#: speak/voice.py:42
+msgid "Dutch"
+msgstr "Нидерланд"
+
+#: speak/voice.py:43
+msgid "Latin"
+msgstr "Латин"
+
+#: speak/voice.py:44
+msgid "Hungarian"
+msgstr "Унгар"
+
+#: speak/voice.py:45
+msgid "Macedonian"
+msgstr "Макидони"
+
+#: speak/voice.py:46
+msgid "Welsh"
+msgstr "Уэльс"
+
+#: speak/voice.py:47
+msgid "French"
+msgstr "Франц"
+
+#: speak/voice.py:48
+msgid "Norwegian"
+msgstr "Норвеги"
+
+#: speak/voice.py:49
+msgid "Russian"
+msgstr "Орос"
+
+#: speak/voice.py:50
+msgid "Afrikaans"
+msgstr "Африк"
+
+#: speak/voice.py:51
+msgid "Finnish"
+msgstr "Финнлянд"
+
+#: speak/voice.py:52 speak/voice.py:125
+msgid "Default"
+msgstr ""
+
+#: speak/voice.py:53
+msgid "Cantonese"
+msgstr ""
+
+#: speak/voice.py:54
+msgid "Scottish"
+msgstr ""
+
+#: speak/voice.py:55
+msgid "Greek"
+msgstr "Грек"
+
+#: speak/voice.py:56
+msgid "Vietnam"
+msgstr "Ветьнам"
+
+#: speak/voice.py:57
+msgid "English"
+msgstr ""
+
+#: speak/voice.py:58
+msgid "Lancashire"
+msgstr ""
+
+#: speak/voice.py:59
+msgid "Italian"
+msgstr "Итали"
+
+#: speak/voice.py:60
+msgid "Portugal"
+msgstr "Португали"
+
+#: speak/voice.py:61
+msgid "German"
+msgstr "Герман"
+
+#: speak/voice.py:62
+msgid "Whisper"
+msgstr ""
+
+#: speak/voice.py:63
+msgid "Croatian"
+msgstr "Хорват"
+
+#: speak/voice.py:64
+msgid "Czech"
+msgstr "Чех"
+
+#: speak/voice.py:65
+msgid "Slovak"
+msgstr "Словак"
+
+#: speak/voice.py:66
+msgid "Spanish"
+msgstr "Испани"
+
+#: speak/voice.py:67
+msgid "Polish"
+msgstr "Польш"
+
+#: speak/voice.py:68
+msgid "Esperanto"
+msgstr "Аспиранто"
+
+#~ msgid "Choose image"
+#~ msgstr "Зураг сонгох"
+
+#~ msgid "Choose audio"
+#~ msgstr "Дуу сонгох"
+
+#~ msgid "capitals"
+#~ msgstr "Нийслэлүүд"
+
+#~ msgid "drumgit"
+#~ msgstr "Хөгжмүүд"
+
+#~ msgid "numbers"
+#~ msgstr "Тоонууд"
+
+#~ msgid "phonemes"
+#~ msgstr "Авианууд"
diff --git a/po/mr.po b/po/mr.po
new file mode 100644
index 0000000..6a99c9e
--- /dev/null
+++ b/po/mr.po
@@ -0,0 +1,112 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-04-28 02:33-0400\n"
+"Last-Translator: Sandip Gawas <sandip.gawas@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "Memorize"
+
+#: activity.py:70
+msgid "Play"
+msgstr "खेळा"
+
+#: activity.py:74
+msgid "Create"
+msgstr "निर्माण करणे"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "नवीन जोडी जोडा"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "निवडलेली जोडी अद्यावात करा "
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "पूर्ववालोकन"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "संदर्भ"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "चित्र निवडा"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "आवाज निवडा"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "नवीन खेळ"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "खेळ सुरू करा"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "खेळ राखून ठेवा"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "खेळाचे नाव"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "समान जोडी"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "गटामधे खेळ खेळण्यासाठी क्लिक करा"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "मेमराइज खेळ निवडा"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "एकटे खेळण्यासाठी क्लिक करा"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr " खेळ सुरू होत आहे"
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "प्रदर्शनि खेळ सुरू करा"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "बेरीज"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "शब्द"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "आवाज"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "खेळ पुन्हा चालू करा"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "खेळ घेणे"
+
+#: messenger.py:183
+msgid "done"
+msgstr "समाप्त"
diff --git a/po/ms.po b/po/ms.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/ms.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/mvo.po b/po/mvo.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/mvo.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/na.po b/po/na.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/na.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/nb.po b/po/nb.po
new file mode 100644
index 0000000..35dca5f
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,122 @@
+# translation of memorize.po to Norsk bokmål
+# Kent Dahl <kentda@pvv.org>, 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: memorize\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-07-26 13:46+0200\n"
+"Last-Translator: Kent Dahl <kentda@pvv.org>\n"
+"Language-Team: Norsk bokmål <i18n-no@lister.ping.uio.no>\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: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2
+#, fuzzy
+msgid "Memorize"
+msgstr "Minne"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Spill"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Lag"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "Legg til som nytt par"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "Oppdater valgt par"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "Forhåndsvisning:"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "Tekst:"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "Velg bilde"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "Velg lyd"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "Nytt spill"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Last spill"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "Lagre spill"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "Spillnavn"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "Like par"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+#, fuzzy
+msgid "Click for grouped game"
+msgstr "Klikk for gruppert spill"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+#, fuzzy
+msgid "Choose memorize game"
+msgstr "Velg minnespill"
+
+#: createtoolbar.py:154
+#, fuzzy
+msgid "Click for ungrouped game"
+msgstr "Klikk for ugruppert spill"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "Laster spill..."
+
+#: memorizetoolbar.py:40
+#, fuzzy
+msgid "Load demo games"
+msgstr "Last spilldemonstrasjoner"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "addisjon"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "bokstaver"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "lyder"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Start spillet på nytt"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "Mottar spill"
+
+#: messenger.py:183
+msgid "done"
+msgstr "ferdig"
diff --git a/po/ne.po b/po/ne.po
new file mode 100644
index 0000000..862746a
--- /dev/null
+++ b/po/ne.po
@@ -0,0 +1,118 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-03-21 15:24-0400\n"
+"Last-Translator: Shankar Pokharel <memshankar@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "याद गर"
+
+#: activity.py:70
+msgid "Play"
+msgstr "खेल"
+
+#: activity.py:74
+msgid "Create"
+msgstr "बनाऊ"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "नया जोडी बनाउ"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "छानेको जोडी फेर"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "झलक"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "पाठ:"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "चित्र छान"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "आवाज छान"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "नयाँ खेल"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "खेल छान"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "खेल साँच"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "खेलको नाम"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "मिलेका जोडीहरु"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "सामुहिक खेलको लागी थिच"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "जोडी बनाऊ छान "
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "\"बेजोड समुह खेल\" को लागी क्लिक गर "
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "खेल सुरु गर्दै ..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "खेलको झलक शुरु"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "जोड"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "अक्षरहरु"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "आवाजहरु"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "खेल फेरी सुरु गर"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "खेल प्राप्त गर्दै"
+
+#: messenger.py:183
+msgid "done"
+msgstr "सक्यो"
+
+#~ msgid "numbers"
+#~ msgstr "अंकहरु"
+
+#~ msgid "phonemes"
+#~ msgstr "उच्चारणहरु"
diff --git a/po/nl.po b/po/nl.po
new file mode 100644
index 0000000..0a1ad88
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,297 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-17 00:32-0400\n"
+"PO-Revision-Date: 2010-07-01 22:43+0200\n"
+"Last-Translator: whe <heppew@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.3\n"
+
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr "Onthouden"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Speel"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Maken"
+
+#: createcardpanel.py:79
+msgid "Add as new pair"
+msgstr "Toevoegen als nieuw paar"
+
+#: createcardpanel.py:82
+msgid "Add"
+msgstr "Toevoegen"
+
+#: createcardpanel.py:87
+msgid "Update selected pair"
+msgstr "Geselecteerd paar vernieuwen"
+
+#: createcardpanel.py:90
+msgid "Update"
+msgstr "Bijwerken"
+
+#: createcardpanel.py:255
+msgid "Preview:"
+msgstr "Bekijken:"
+
+#: createcardpanel.py:271
+msgid "Text:"
+msgstr "Tekst:"
+
+#: createcardpanel.py:283
+msgid "Insert picture"
+msgstr "Afbeelding invoegen"
+
+#: createcardpanel.py:288
+msgid "Insert sound"
+msgstr "Geluid invoegen"
+
+#: createcardpanel.py:434
+msgid "Pronounce text during tile flip"
+msgstr "Spreek de tekst uit gedurende de tegel omslag"
+
+#: createtoolbar.py:51
+msgid "New game"
+msgstr "Nieuw spel"
+
+#: createtoolbar.py:61 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Laad spel"
+
+#: createtoolbar.py:71
+msgid "Save game"
+msgstr "Spel opslaan"
+
+#: createtoolbar.py:81
+msgid "Game name"
+msgstr "Spelnaam"
+
+#: createtoolbar.py:85
+msgid "Equal pairs"
+msgstr "Gelijke paren"
+
+#: createtoolbar.py:97 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Kies groepsspel"
+
+#: createtoolbar.py:114 memorizetoolbar.py:118
+msgid "Choose memorize game"
+msgstr "Kies geheugenspel"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Kies niet-groepsspel"
+
+#: game.py:92
+msgid "Loading game..."
+msgstr "Laad spel..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Laad demo spellen"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "optellen"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "letters"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "geluiden"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Herstart spel"
+
+#: messenger.py:195
+msgid "Receiving game"
+msgstr "Spel ontvangen"
+
+#: messenger.py:196
+msgid "done"
+msgstr "klaar"
+
+#: speak/voice.py:36
+msgid "Brazil"
+msgstr "Braziliaans"
+
+#: speak/voice.py:37
+msgid "Swedish"
+msgstr "Zweeds"
+
+#: speak/voice.py:38
+msgid "Icelandic"
+msgstr "IJslands"
+
+#: speak/voice.py:39
+msgid "Romanian"
+msgstr "Roemeens"
+
+#: speak/voice.py:40
+msgid "Swahili"
+msgstr "Swahili"
+
+#: speak/voice.py:41
+msgid "Hindi"
+msgstr "Hindi"
+
+#: speak/voice.py:42
+msgid "Dutch"
+msgstr "Nederlands"
+
+#: speak/voice.py:43
+msgid "Latin"
+msgstr "Latijns"
+
+#: speak/voice.py:44
+msgid "Hungarian"
+msgstr "Hongaars"
+
+#: speak/voice.py:45
+msgid "Macedonian"
+msgstr "Macedonisch"
+
+#: speak/voice.py:46
+msgid "Welsh"
+msgstr "Welsh"
+
+#: speak/voice.py:47
+msgid "French"
+msgstr "Frans"
+
+#: speak/voice.py:48
+msgid "Norwegian"
+msgstr "Noors"
+
+#: speak/voice.py:49
+msgid "Russian"
+msgstr "Russisch"
+
+#: speak/voice.py:50
+msgid "Afrikaans"
+msgstr "Afrikaans"
+
+#: speak/voice.py:51
+msgid "Finnish"
+msgstr "Fins"
+
+#: speak/voice.py:52 speak/voice.py:125
+msgid "Default"
+msgstr "Standaard"
+
+#: speak/voice.py:53
+msgid "Cantonese"
+msgstr "Kantonees"
+
+#: speak/voice.py:54
+msgid "Scottish"
+msgstr "Schots"
+
+#: speak/voice.py:55
+msgid "Greek"
+msgstr "Grieks"
+
+#: speak/voice.py:56
+msgid "Vietnam"
+msgstr "Vietnamees"
+
+#: speak/voice.py:57
+msgid "English"
+msgstr "Engels"
+
+#: speak/voice.py:58
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: speak/voice.py:59
+msgid "Italian"
+msgstr "Italiaans"
+
+#: speak/voice.py:60
+msgid "Portugal"
+msgstr "Portugees"
+
+#: speak/voice.py:61
+msgid "German"
+msgstr "Duits"
+
+#: speak/voice.py:62
+msgid "Whisper"
+msgstr "Fluister"
+
+#: speak/voice.py:63
+msgid "Croatian"
+msgstr "Kroatisch"
+
+#: speak/voice.py:64
+msgid "Czech"
+msgstr "Tsjechisch"
+
+#: speak/voice.py:65
+msgid "Slovak"
+msgstr "Slowaaks"
+
+#: speak/voice.py:66
+msgid "Spanish"
+msgstr "Spaans"
+
+#: speak/voice.py:67
+msgid "Polish"
+msgstr "Pools"
+
+#: speak/voice.py:68
+msgid "Esperanto"
+msgstr "Esperanto"
+
+#~ msgid "Pronounce text while fliping tile"
+#~ msgstr "Tekst uitspreken bij omdraaien van tegel"
+
+#~ msgid "Choose image"
+#~ msgstr "Kies afbeelding"
+
+#~ msgid "Choose audio"
+#~ msgstr "Kies geluid"
+
+#~ msgid "numbers"
+#~ msgstr "nummers"
+
+#~ msgid "phonemes"
+#~ msgstr "klanken"
diff --git a/po/pa.po b/po/pa.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/pa.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/pap.po b/po/pap.po
new file mode 100644
index 0000000..995ab3c
--- /dev/null
+++ b/po/pap.po
@@ -0,0 +1,116 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-06-19 08:02-0400\n"
+"Last-Translator: Urso Wieske <uwieske@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "Memorisá"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Reprodusi"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Krea"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "Agrega komo un par nobo"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "Aktualisa e par selektá"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "Bista previo"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "Teksto"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "Skohe imagen"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "Skohe audio"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "Wega nobo"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Karga wega"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "Warda wega"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "Nomber di wega"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "Par igual"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Klik pa wega den grupo"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "Skohe wega di memoria"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Klik for di wega sin grupo"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "Kargando wega..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Karga weganan di demonstrashon"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "adishon"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "letranan"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "sonidonan"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Reinisia Wega"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "Resibiendo wega"
+
+#: messenger.py:183
+msgid "done"
+msgstr "kla"
diff --git a/po/pis.po b/po/pis.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/pis.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/pl.po b/po/pl.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/ps.po b/po/ps.po
new file mode 100644
index 0000000..d29a07d
--- /dev/null
+++ b/po/ps.po
@@ -0,0 +1,125 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: 2008-01-09 09:06+0000\n"
+"Last-Translator: usman mansoor ansari <jalalkut@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr "لوبه پېلېدل"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr "ډېمو لوبې پیل کړﺉ"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr "زیاتونې"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr "لوتوري"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+#, fuzzy
+msgid "drumgit"
+msgstr "ډرم جېټ"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr "ليكونه"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr "شمېرې"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr "غږونه"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr "لوبه بیاپیلول"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr "لوبه تیارول"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+#, fuzzy
+msgid "Choose memorize game"
+msgstr "د یادې لوبې چڼل"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr "لوبه د ترلاسه کولو په حال کې"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr "هوکې"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr "پنځول"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr "غږول"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr "د نوې جوړې په توګه زیاتوونې"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr "ټاکلې جوړه اوسمهالول"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr "مخليد"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr "متن"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr "انځور چوڼل"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr "اوريز چوڼل"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr "نوې لوبه"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr "لوبه ساتل"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr "د لوبې نوم"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "برابرې جوړې"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "د ډله ییزې لوبې لپاره ټک وکړه"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "د... لپاره ټک وکړﺉ"
diff --git a/po/pt.po b/po/pt.po
new file mode 100644
index 0000000..859df1f
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,115 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-08-26 19:21-0400\n"
+"Last-Translator: Eduardo H. Silva <HoboPrimate@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "Memorizar"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Jogar"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Criar"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "Adicionar como novo par"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "Actualizar par selecionado"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "Previsualização:"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "Texto:"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "Escolhe imagem"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "Escolhe áudio"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "Novo jogo"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Carregar jogo"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "Guardar jogo"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "Nome do jogo"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "Pares iguais"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Clica para jogo agrupado"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "Escolhe o jogo da memória"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Clica para jogo desagrupado"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "Carregando jogo..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Carregar jogos de demonstração"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "adição"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "letras"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "sons"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Reiniciar jogo"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "Recebendo jogo"
+
+#: messenger.py:183
+msgid "done"
+msgstr "pronto"
+
+#~ msgid "capitals"
+#~ msgstr "capitais"
diff --git a/po/pt_BR.po b/po/pt_BR.po
new file mode 100644
index 0000000..d5f0a58
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,123 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: 2008-01-18 20:45+0000\n"
+"Last-Translator: Eduardo H. Silva <HoboPrimate@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr "Carregando jogo..."
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr "Carregar jogos de demonstração"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr "adição"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr "maiúsculas e minúsculas"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr "instrumentos"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr "letras"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr "números"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr "fonemas"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr "Reiniciar jogo"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr "Carregar jogo"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr "Escolha o jogo da memória"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr "Recebendo jogo"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr "pronto"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr "Criar"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr "Jogar"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr "Adicionar como novo par"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr "Atualizar par selecionado"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr "Previsão:"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr "Texto:"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr "Escolha imagem"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr "Escolha áudio"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr "Novo jogo"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr "Salvar jogo"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr "Nome do jogo"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "Pares iguais"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Clique para jogo agrupado"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Clique para jogo desagrupado"
diff --git a/po/qu.po b/po/qu.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/qu.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/ro.po b/po/ro.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/rw.po b/po/rw.po
new file mode 100644
index 0000000..365b1b2
--- /dev/null
+++ b/po/rw.po
@@ -0,0 +1,116 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-07-31 12:21+0200\n"
+"Last-Translator: GASHAYIJA Guillaume <gashayija2002@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "Fata mumutwe"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Kina"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Rema"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "Ongeraho nk`umuguru mushya"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "Ha agaciro umugurui watoranyijwe"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "Ibibanziriza"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "Umwandiko"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "Toranya vishusho"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "Toranya isohiora majwi"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "Umukino mushya"
+
+#: createtoolbar.py:63
+#: memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Load umukino"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "Bika umukino"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "Izina ry`u mukino"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "Iiminguru ingana"
+
+#: createtoolbar.py:99
+#: createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Kanda kw`itsinda ry`umukino"
+
+#: createtoolbar.py:116
+#: memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "Toranya gufata umukino mu mutwe"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Kanda umukino utari mw`itsinda"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "Loading umukino.."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Load demo imikino"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "Igiteranyo"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "Amabaruwa"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "Amajwi"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Kongera gutangira umukino"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "Umukino urimo kwakirwa"
+
+#: messenger.py:183
+msgid "done"
+msgstr "Icyakozwe"
+
diff --git a/po/sd.po b/po/sd.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/sd.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/si.po b/po/si.po
new file mode 100644
index 0000000..d6176e9
--- /dev/null
+++ b/po/si.po
@@ -0,0 +1,121 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-05-23 09:21-0400\n"
+"Last-Translator: Rashan Anushka <rashan.uoc@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "මතක තබා ගන්න"
+
+#: activity.py:70
+msgid "Play"
+msgstr "ක්‍රිඩා කරන්න"
+
+#: activity.py:74
+msgid "Create"
+msgstr "නිර්මානය කරන්න"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "අලුත් යුගලයක් ලෙස එකතු කරන්න "
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "තෝරාගත් යුගලය යාවත්කාල කරන්න "
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "පෙරදසුන:"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "පෙළ:"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "පින්තූරයක් තොරන්න"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "ශබ්දය තෝරන්න "
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "අලුත් ක්‍රීඩාවක්"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "ක්‍රීඩාව ආරම්භ කරන්න"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "ක්‍රීඩාව සුරකින්න "
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "ක්‍රීඩාවේ නම"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "සමාන යුගල"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "සමුහ ක්‍රීඩාවක් සඳහා ක්ලික් කරන්න"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "මතක ක්‍රීඩාව තෝරනන්"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "සමුහ නොවන ක්‍රීඩාවක් සඳහා ක්ලික් කරන්න"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "ක්‍රීඩාව ආරම්භ වෙමින් පවතී..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "නිදර්ශන ක්‍රීඩා ආරම්භ කරන්න"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "එකතුව"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "අකුරු"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "ශබ්ද"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "ක්‍රීඩාව නැවත පටන් ගන්න"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "ක්‍රීඩාව ප්‍රතිග්‍රාහනය වෙමින් පවතී"
+
+#: messenger.py:183
+msgid "done"
+msgstr "සම්පුර්ණ කලා"
+
+#~ msgid "capitals"
+#~ msgstr "කැපිටල් අකුරු"
+
+#~ msgid "numbers"
+#~ msgstr "ඉලක්කම්"
+
+#~ msgid "phonemes"
+#~ msgstr "ශබ්දාණු"
diff --git a/po/sk.po b/po/sk.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/sl.po b/po/sl.po
new file mode 100644
index 0000000..e3748c2
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,116 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-07-09 08:32-0400\n"
+"Last-Translator: Denis Oštir <denis.ostir@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "Spomin"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Igraj"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Ustvari"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "Dodaj nov par"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "Posodobi izbran par"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "Predogled:"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "Besedilo:"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "Izberi sliko"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "Izberi zvok"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "Nova igra"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Naloži igro"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "Shrani igro"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "Ime igre"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "Enaka para"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Pritisni za skupinsko igro"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "Izberi igro spomin"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Pritisni za samostojno igro"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "Nalagam igro ..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Naloži vzorčne igre"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "dodatek"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "črke"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "zvoki"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Znova začni igro"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "Prejemam igro"
+
+#: messenger.py:183
+msgid "done"
+msgstr "konec"
diff --git a/po/sq.po b/po/sq.po
new file mode 100644
index 0000000..9761f38
--- /dev/null
+++ b/po/sq.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/sv.po b/po/sv.po
new file mode 100644
index 0000000..e835f4b
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,116 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2009-01-11 13:44-0500\n"
+"Last-Translator: Nicci Manns <nicci@saunalahti.fi>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "Komihåg"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Spela"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Skapa"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "Lägg till som nytt par"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "Uppdatera markerat par"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "Förhandsgranskning:"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "Text:"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "Välj bild"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "Välj ljud"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "Nytt spel"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Ladda spel"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "Spara spel"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "Spelnamn"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "Jämt antal par"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Klicka för grupperat spel"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "Välj komihågspel"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Klicka för ogrupperat spel"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "Laddar spel..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Ladda demospel"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "addition"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "bokstäver"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "ljud"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Starta om spel"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "Tar emot spel"
+
+#: messenger.py:183
+msgid "done"
+msgstr "klar"
diff --git a/po/sw.po b/po/sw.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/sw.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/ta.po b/po/ta.po
new file mode 100644
index 0000000..cef6744
--- /dev/null
+++ b/po/ta.po
@@ -0,0 +1,291 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-17 00:32-0400\n"
+"PO-Revision-Date: 2010-08-03 23:26+0200\n"
+"Last-Translator: தங்கமணி <thangam.arunx@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ta\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.3\n"
+
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr "நினைவில் நிறுத்திக்கொள்"
+
+#: activity.py:70
+msgid "Play"
+msgstr "ஆடு"
+
+#: activity.py:74
+msgid "Create"
+msgstr "உருவாக்கு"
+
+#: createcardpanel.py:79
+msgid "Add as new pair"
+msgstr "புதிய இணையாகச் சேர்"
+
+#: createcardpanel.py:82
+msgid "Add"
+msgstr "சேர்"
+
+#: createcardpanel.py:87
+msgid "Update selected pair"
+msgstr "தெரிவு செய்யப்பட்ட இணையை இற்றைப்படுத்தல்"
+
+#: createcardpanel.py:90
+msgid "Update"
+msgstr "புதுப்பி"
+
+#: createcardpanel.py:255
+msgid "Preview:"
+msgstr "பார்வை மாதிரி"
+
+#: createcardpanel.py:271
+msgid "Text:"
+msgstr "உள்ளடக்கம்"
+
+#: createcardpanel.py:283
+msgid "Insert picture"
+msgstr "படத்தைச் செருகு"
+
+#: createcardpanel.py:288
+msgid "Insert sound"
+msgstr "ஒலியைச் செருகு"
+
+#: createcardpanel.py:434
+msgid "Pronounce text during tile flip"
+msgstr "தலை மாறும்போது உரையை உச்சரிக்கவும்"
+
+#: createtoolbar.py:51
+msgid "New game"
+msgstr "புதிய ஆட்டம்"
+
+#: createtoolbar.py:61 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "ஆட்டத்தை ஏற்றுதல்"
+
+#: createtoolbar.py:71
+msgid "Save game"
+msgstr "ஆட்டத்தை சேமி"
+
+#: createtoolbar.py:81
+msgid "Game name"
+msgstr "ஆட்டப் பெயர்"
+
+#: createtoolbar.py:85
+msgid "Equal pairs"
+msgstr "சமமான இணை"
+
+#: createtoolbar.py:97 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "குழு ஆட்டத்திற்கு இவ்விடத்தில் சொடுக்கக்வும் "
+
+#: createtoolbar.py:114 memorizetoolbar.py:118
+msgid "Choose memorize game"
+msgstr "நினைவகத்திலுள்ள ஆட்டத்தை தெரிக்வு செய்"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "தனியாட்டததை சொடுக்கு"
+
+#: game.py:92
+msgid "Loading game..."
+msgstr "ஆட்டத்தை ஏற்று"
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "மாதிரி ஆட்டத்தை ஏற்றுக"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "கூட்டு"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "எழுத்துக்கள்"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "ஒலிகள்"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "மீண்டும் ஆட்டத்தைத் துவக்கு"
+
+#: messenger.py:195
+msgid "Receiving game"
+msgstr "ஆட்டத்தை பெறு"
+
+#: messenger.py:196
+msgid "done"
+msgstr "முடிவு"
+
+#: speak/voice.py:36
+msgid "Brazil"
+msgstr "பிறேசில்"
+
+#: speak/voice.py:37
+msgid "Swedish"
+msgstr "சுவிடிஸ்"
+
+#: speak/voice.py:38
+msgid "Icelandic"
+msgstr "அயர்லாந்திய"
+
+#: speak/voice.py:39
+msgid "Romanian"
+msgstr "உரோமைய"
+
+#: speak/voice.py:40
+msgid "Swahili"
+msgstr "சுவகிலி"
+
+#: speak/voice.py:41
+msgid "Hindi"
+msgstr "கிந்தி"
+
+#: speak/voice.py:42
+msgid "Dutch"
+msgstr "டச்"
+
+#: speak/voice.py:43
+msgid "Latin"
+msgstr "லத்தீன்"
+
+#: speak/voice.py:44
+msgid "Hungarian"
+msgstr "கங்கேரியன்"
+
+#: speak/voice.py:45
+msgid "Macedonian"
+msgstr "மக்டோனியன்"
+
+#: speak/voice.py:46
+msgid "Welsh"
+msgstr "வேல்ஸ்"
+
+#: speak/voice.py:47
+msgid "French"
+msgstr "பிரான்சிய"
+
+#: speak/voice.py:48
+msgid "Norwegian"
+msgstr "நோர்வேயின்"
+
+#: speak/voice.py:49
+msgid "Russian"
+msgstr "ரசியன்"
+
+#: speak/voice.py:50
+msgid "Afrikaans"
+msgstr "ஆவ்ப்ரிக்கன்"
+
+#: speak/voice.py:51
+msgid "Finnish"
+msgstr "பின்லாந்திய"
+
+#: speak/voice.py:52 speak/voice.py:125
+msgid "Default"
+msgstr "கொடாநிலை"
+
+#: speak/voice.py:53
+msgid "Cantonese"
+msgstr "சீன மொழி"
+
+#: speak/voice.py:54
+msgid "Scottish"
+msgstr "ஸ்கொட்லாந்திய"
+
+#: speak/voice.py:55
+msgid "Greek"
+msgstr "கிரேக்க"
+
+#: speak/voice.py:56
+msgid "Vietnam"
+msgstr "வியட்னாம்"
+
+#: speak/voice.py:57
+msgid "English"
+msgstr "ஆங்கிலம்"
+
+#: speak/voice.py:58
+msgid "Lancashire"
+msgstr "லான்சஸ்றி"
+
+#: speak/voice.py:59
+msgid "Italian"
+msgstr "இத்தாலிய"
+
+#: speak/voice.py:60
+msgid "Portugal"
+msgstr "போர்த்துக்கல்"
+
+#: speak/voice.py:61
+msgid "German"
+msgstr "யேர்மன்"
+
+#: speak/voice.py:62
+msgid "Whisper"
+msgstr "விஸ்பர்"
+
+#: speak/voice.py:63
+msgid "Croatian"
+msgstr "குறோறியன்"
+
+#: speak/voice.py:64
+msgid "Czech"
+msgstr "செச்"
+
+#: speak/voice.py:65
+msgid "Slovak"
+msgstr "சலோவக்"
+
+#: speak/voice.py:66
+msgid "Spanish"
+msgstr "ஸ்பானிஸ்"
+
+#: speak/voice.py:67
+msgid "Polish"
+msgstr "பொலிஸ்"
+
+#: speak/voice.py:68
+msgid "Esperanto"
+msgstr "எஸ்பிறன்ரோ"
+
+#~ msgid "Pronounce text while fliping tile"
+#~ msgstr "காட்சி வில்லையை ஏற்றும் போது உரையை உச்சரி"
+
+#~ msgid "Choose image"
+#~ msgstr "படத்தை தெரிதல்"
+
+#~ msgid "Choose audio"
+#~ msgstr "ஒலியைத் தெரிதல் "
diff --git a/po/te.po b/po/te.po
new file mode 100644
index 0000000..3674ce5
--- /dev/null
+++ b/po/te.po
@@ -0,0 +1,124 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-07-02 23:48+0100\n"
+"Last-Translator: Satyanarayana Murthy Saladi <saladism@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "గుర్తింపు ఆట"
+
+#: activity.py:70
+msgid "Play"
+msgstr "ఆడు"
+
+#: activity.py:74
+msgid "Create"
+msgstr "సృష్టించు"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "కొత్త జంట చేర్చు"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "ఎంచుకొన్న జతను తాజాపరచు"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "రిహార్సు:"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "వచనం:"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "చిత్రం కోరుకో"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "ద్వని కోరుకో"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "కొత్త ఆట"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "ఆట అమర్చు"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "ఆట బద్రపరచు"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "ఆట పేరు"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "సమాన జతలు"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "గుంపు ఆటకు నొక్కు"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "గుర్తింపు ఆట కోరుకో "
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "గుంపుగా కాని ఆటకు నొక్కు"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "ఆట అమరుస్తున్నా..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "ఉదహరించే ఆటలు అమర్చనా"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "కూడిక"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "అక్షరములు"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "శబ్దము"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "ఆట తిరిగి ఆడు"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "ఆట అందుకోబడుతోంది"
+
+#: messenger.py:183
+msgid "done"
+msgstr "పూర్తయింది"
+
+#~ msgid "capitals"
+#~ msgstr "మొదటిబరి అక్షరములు"
+
+#~ msgid "drumgit"
+#~ msgstr "డ్రంజిట్"
+
+#~ msgid "numbers"
+#~ msgstr "అంకెలు"
+
+#~ msgid "phonemes"
+#~ msgstr "సూక్ష్మద్వని "
diff --git a/po/th.po b/po/th.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/th.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/tpi.po b/po/tpi.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/tpi.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/tr.po b/po/tr.po
new file mode 100644
index 0000000..0954071
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,112 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-10-07 03:21-0400\n"
+"Last-Translator: abdullah kocabas <abdullah.kocabas@abcdizustu.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "Eşleştirme"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Oynat"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Oluştur"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "Yeni bir çift olarak ekle"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "Seçilen çifti güncelle"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "Önizleme"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "Metin:"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "Görüntü seç"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "Ses seç"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "Yeni oyun"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Oyun yükle"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "Oyunu kaydet"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "Oyun adı"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "Eşit çiftler"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Grup oyunu için tıkla"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "Eşleştirme oyunu seç"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Tekli oyun için tıkla"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "Oyun yükleniyor.."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Oyun demolarını yükle"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "ekleme"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "harfler"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "sesler"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Oyunu yeniden başlat"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "Açılan oyun"
+
+#: messenger.py:183
+msgid "done"
+msgstr "tamam"
diff --git a/po/tvl.po b/po/tvl.po
new file mode 100644
index 0000000..3ae9605
--- /dev/null
+++ b/po/tvl.po
@@ -0,0 +1,261 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-17 00:32-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:79
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:82
+msgid "Add"
+msgstr ""
+
+#: createcardpanel.py:87
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:90
+msgid "Update"
+msgstr ""
+
+#: createcardpanel.py:255
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:271
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:283
+msgid "Insert picture"
+msgstr ""
+
+#: createcardpanel.py:288
+msgid "Insert sound"
+msgstr ""
+
+#: createcardpanel.py:434
+msgid "Pronounce text during tile flip"
+msgstr ""
+
+#: createtoolbar.py:51
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:61 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:71
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:81
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:85
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:97 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:114 memorizetoolbar.py:118
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:92
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:195
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:196
+msgid "done"
+msgstr ""
+
+#: speak/voice.py:36
+msgid "Brazil"
+msgstr ""
+
+#: speak/voice.py:37
+msgid "Swedish"
+msgstr ""
+
+#: speak/voice.py:38
+msgid "Icelandic"
+msgstr ""
+
+#: speak/voice.py:39
+msgid "Romanian"
+msgstr ""
+
+#: speak/voice.py:40
+msgid "Swahili"
+msgstr ""
+
+#: speak/voice.py:41
+msgid "Hindi"
+msgstr ""
+
+#: speak/voice.py:42
+msgid "Dutch"
+msgstr ""
+
+#: speak/voice.py:43
+msgid "Latin"
+msgstr ""
+
+#: speak/voice.py:44
+msgid "Hungarian"
+msgstr ""
+
+#: speak/voice.py:45
+msgid "Macedonian"
+msgstr ""
+
+#: speak/voice.py:46
+msgid "Welsh"
+msgstr ""
+
+#: speak/voice.py:47
+msgid "French"
+msgstr ""
+
+#: speak/voice.py:48
+msgid "Norwegian"
+msgstr ""
+
+#: speak/voice.py:49
+msgid "Russian"
+msgstr ""
+
+#: speak/voice.py:50
+msgid "Afrikaans"
+msgstr ""
+
+#: speak/voice.py:51
+msgid "Finnish"
+msgstr ""
+
+#: speak/voice.py:52 speak/voice.py:125
+msgid "Default"
+msgstr ""
+
+#: speak/voice.py:53
+msgid "Cantonese"
+msgstr ""
+
+#: speak/voice.py:54
+msgid "Scottish"
+msgstr ""
+
+#: speak/voice.py:55
+msgid "Greek"
+msgstr ""
+
+#: speak/voice.py:56
+msgid "Vietnam"
+msgstr ""
+
+#: speak/voice.py:57
+msgid "English"
+msgstr ""
+
+#: speak/voice.py:58
+msgid "Lancashire"
+msgstr ""
+
+#: speak/voice.py:59
+msgid "Italian"
+msgstr ""
+
+#: speak/voice.py:60
+msgid "Portugal"
+msgstr ""
+
+#: speak/voice.py:61
+msgid "German"
+msgstr ""
+
+#: speak/voice.py:62
+msgid "Whisper"
+msgstr ""
+
+#: speak/voice.py:63
+msgid "Croatian"
+msgstr ""
+
+#: speak/voice.py:64
+msgid "Czech"
+msgstr ""
+
+#: speak/voice.py:65
+msgid "Slovak"
+msgstr ""
+
+#: speak/voice.py:66
+msgid "Spanish"
+msgstr ""
+
+#: speak/voice.py:67
+msgid "Polish"
+msgstr ""
+
+#: speak/voice.py:68
+msgid "Esperanto"
+msgstr ""
diff --git a/po/tzo.po b/po/tzo.po
new file mode 100644
index 0000000..46a8a8b
--- /dev/null
+++ b/po/tzo.po
@@ -0,0 +1,265 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-07-14 10:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/game.py:93
+msgid "Loading game..."
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/messenger.py:192
+msgid "Receiving game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/messenger.py:192
+msgid "done"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:51
+msgid "New game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:61
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:71
+msgid "Save game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:81
+msgid "Game name"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:85
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:97
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:156
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:114
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createtoolbar.py:152
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:82
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:85
+msgid "Add"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:90
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:93
+msgid "Update"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:254
+msgid "Preview:"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:270
+msgid "Text:"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:282
+msgid "Insert picture"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:287
+msgid "Insert sound"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/createcardpanel.py:427
+msgid "Pronounce text while fliping tile"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/activity.py:78
+msgid "Create"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:36
+msgid "Brazil"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:37
+msgid "Swedish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:38
+msgid "Icelandic"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:39
+msgid "Romanian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:40
+msgid "Swahili"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:41
+msgid "Hindi"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:42
+msgid "Dutch"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:43
+msgid "Latin"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:44
+msgid "Hungarian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:45
+msgid "Macedonian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:46
+msgid "Welsh"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:47
+msgid "French"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:48
+msgid "Norwegian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:49
+msgid "Russian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:50
+msgid "Afrikaans"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:51
+msgid "Finnish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:52
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:125
+msgid "Default"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:53
+msgid "Cantonese"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:54
+msgid "Scottish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:55
+msgid "Greek"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:56
+msgid "Vietnam"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:57
+msgid "English"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:58
+msgid "Lancashire"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:59
+msgid "Italian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:60
+msgid "Portugal"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:61
+msgid "German"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:62
+msgid "Whisper"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:63
+msgid "Croatian"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:64
+msgid "Czech"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:65
+msgid "Slovak"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:66
+msgid "Spanish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:67
+msgid "Polish"
+msgstr ""
+
+#: /home/sugar/src/activities/memorize.activity/speak/voice.py:68
+msgid "Esperanto"
+msgstr ""
diff --git a/po/ug.po b/po/ug.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/ug.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/ur.po b/po/ur.po
new file mode 100644
index 0000000..2fbefa1
--- /dev/null
+++ b/po/ur.po
@@ -0,0 +1,124 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-07-08 05:35-0400\n"
+"Last-Translator: salman minhas <sulmanminhas@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr "ذہن میں محفوظ کريں"
+
+#: activity.py:70
+msgid "Play"
+msgstr "کھيليں"
+
+#: activity.py:74
+msgid "Create"
+msgstr "بنائيں"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "نئے جوڑے کا اضافہ کريں"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "منتخب کيے ہوئے جوڑے کو اپ ڈيٹ کريں"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "ديکھيں"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "متن:"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "تصوير منتخب کريں"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "آڈيو منتخب کريں"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "نيا کھيل"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "کھيل چلائيں"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "کھيل محفوظ کريں"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "کھيل کا نام"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "برابر جوڑے"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "اکھٹے کھيلنے کے ليے کلک کريں"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "ياداشت کا کھيل منتخب کريں"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "گروپ ميں نہ کھيلنے کے ليۓ کلک کريں"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "گيم لوڈ ہو رہی ہے۔۔۔"
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "نمونہ کھيل لوڈ کريں"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "ا‍ضافہ کريں"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "خطوط"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "آوازيں"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "کھيل دوبارہ شروع کريں"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "کھيل حاصل کريں"
+
+#: messenger.py:183
+msgid "done"
+msgstr "مکمل"
+
+#~ msgid "capitals"
+#~ msgstr "کيپيٹل"
+
+#~ msgid "drumgit"
+#~ msgstr "ڈرم گٹ"
+
+#~ msgid "numbers"
+#~ msgstr "ہندسے"
+
+#~ msgid "phonemes"
+#~ msgstr "فون ميس"
diff --git a/po/vi.po b/po/vi.po
new file mode 100644
index 0000000..81bd3b4
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,275 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-17 00:32-0400\n"
+"PO-Revision-Date: 2010-03-07 16:48+0200\n"
+"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: vi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Memorize"
+msgstr "Ghi nhớ"
+
+#: activity.py:70
+msgid "Play"
+msgstr "Chơi"
+
+#: activity.py:74
+msgid "Create"
+msgstr "Tạo"
+
+#: createcardpanel.py:79
+msgid "Add as new pair"
+msgstr "Thêm dạng cặp mới"
+
+#: createcardpanel.py:82
+msgid "Add"
+msgstr "Thêm"
+
+#: createcardpanel.py:87
+msgid "Update selected pair"
+msgstr "Cập nhật cặp đã chọn"
+
+#: createcardpanel.py:90
+msgid "Update"
+msgstr "Cập nhật"
+
+#: createcardpanel.py:255
+msgid "Preview:"
+msgstr "Xem thử : "
+
+#: createcardpanel.py:271
+msgid "Text:"
+msgstr "Văn bản: "
+
+#: createcardpanel.py:283
+msgid "Insert picture"
+msgstr "Chèn ảnh"
+
+#: createcardpanel.py:288
+msgid "Insert sound"
+msgstr "Chèn âm thanh"
+
+#: createcardpanel.py:434
+msgid "Pronounce text during tile flip"
+msgstr "Phát âm chuỗi trong khi lật ngói"
+
+#: createtoolbar.py:51
+msgid "New game"
+msgstr "Lượt chơi mới"
+
+#: createtoolbar.py:61 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "Nạp lượt chơi"
+
+#: createtoolbar.py:71
+msgid "Save game"
+msgstr "Lưu lượt chơi"
+
+#: createtoolbar.py:81
+msgid "Game name"
+msgstr "Tên lượt chơi"
+
+#: createtoolbar.py:85
+msgid "Equal pairs"
+msgstr "Cặp đều"
+
+#: createtoolbar.py:97 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "Nhấn chuột để chơi trong nhóm"
+
+#: createtoolbar.py:114 memorizetoolbar.py:118
+msgid "Choose memorize game"
+msgstr "Chọn lượt chơi đã ghi nhớ"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "Nhấn chuột để chơi một mình"
+
+#: game.py:92
+msgid "Loading game..."
+msgstr "Đang nạp lượt chơi..."
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "Nạp các lượt chơi minh họa"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "phép cộng"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "chữ"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "âm"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "Chạy lại lượt chơi"
+
+#: messenger.py:195
+msgid "Receiving game"
+msgstr "Đang nhận lươt chơi"
+
+#: messenger.py:196
+msgid "done"
+msgstr "hoàn tất"
+
+#: speak/voice.py:36
+msgid "Brazil"
+msgstr "Bra-xin"
+
+#: speak/voice.py:37
+msgid "Swedish"
+msgstr "Thuỵ Điển"
+
+#: speak/voice.py:38
+msgid "Icelandic"
+msgstr "Băng Đảo"
+
+#: speak/voice.py:39
+msgid "Romanian"
+msgstr "Rô-ma-ni"
+
+#: speak/voice.py:40
+msgid "Swahili"
+msgstr "Xouă-hi-li"
+
+#: speak/voice.py:41
+msgid "Hindi"
+msgstr "Hin-đi"
+
+#: speak/voice.py:42
+msgid "Dutch"
+msgstr "Hoà Lan"
+
+#: speak/voice.py:43
+msgid "Latin"
+msgstr "La-tinh"
+
+#: speak/voice.py:44
+msgid "Hungarian"
+msgstr "Hun-ga-ri"
+
+#: speak/voice.py:45
+msgid "Macedonian"
+msgstr "Ma-xê-đô-ni"
+
+#: speak/voice.py:46
+msgid "Welsh"
+msgstr "Ouen-s"
+
+#: speak/voice.py:47
+msgid "French"
+msgstr "Pháp"
+
+#: speak/voice.py:48
+msgid "Norwegian"
+msgstr "Na Uy"
+
+#: speak/voice.py:49
+msgid "Russian"
+msgstr "Nga"
+
+#: speak/voice.py:50
+msgid "Afrikaans"
+msgstr "Hoà Phi"
+
+#: speak/voice.py:51
+msgid "Finnish"
+msgstr "Phần Lan"
+
+#: speak/voice.py:52 speak/voice.py:125
+msgid "Default"
+msgstr "Mặc định"
+
+#: speak/voice.py:53
+msgid "Cantonese"
+msgstr "Quảng Đông"
+
+#: speak/voice.py:54
+msgid "Scottish"
+msgstr "E-cốt"
+
+#: speak/voice.py:55
+msgid "Greek"
+msgstr "Hy Lạp"
+
+#: speak/voice.py:56
+msgid "Vietnam"
+msgstr "Việt"
+
+#: speak/voice.py:57
+msgid "English"
+msgstr "Anh"
+
+#: speak/voice.py:58
+msgid "Lancashire"
+msgstr "Anh Lan-ca-xi"
+
+#: speak/voice.py:59
+msgid "Italian"
+msgstr "Ý"
+
+#: speak/voice.py:60
+msgid "Portugal"
+msgstr "Bồ Đào Nha"
+
+#: speak/voice.py:61
+msgid "German"
+msgstr "Đức"
+
+#: speak/voice.py:62
+msgid "Whisper"
+msgstr "Nói thầm"
+
+#: speak/voice.py:63
+msgid "Croatian"
+msgstr "Cợ-rô-a-ti-a"
+
+#: speak/voice.py:64
+msgid "Czech"
+msgstr "Séc"
+
+#: speak/voice.py:65
+msgid "Slovak"
+msgstr "Xlô-vác"
+
+#: speak/voice.py:66
+msgid "Spanish"
+msgstr "Tây Ban Nha"
+
+#: speak/voice.py:67
+msgid "Polish"
+msgstr "Ba Lan"
+
+#: speak/voice.py:68
+msgid "Esperanto"
+msgstr "Ét-pe-ran-tô"
+
+#~ msgid "Pronounce text while fliping tile"
+#~ msgstr "Phát âm văn bản trong khi lật gạch lát"
+
+#~ msgid "Choose image"
+#~ msgstr "Chọn ảnh"
+
+#~ msgid "Choose audio"
+#~ msgstr "Chọn âm thanh"
diff --git a/po/wa.po b/po/wa.po
new file mode 100644
index 0000000..45b2728
--- /dev/null
+++ b/po/wa.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Memorize"
+msgstr ""
+
+#: activity.py:70
+msgid "Play"
+msgstr ""
+
+#: activity.py:74
+msgid "Create"
+msgstr ""
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr ""
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr ""
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr ""
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr ""
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr ""
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr ""
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr ""
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr ""
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
+
+#: game.py:105
+msgid "Loading game..."
+msgstr ""
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr ""
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr ""
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr ""
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr ""
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr ""
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr ""
+
+#: messenger.py:183
+msgid "done"
+msgstr ""
diff --git a/po/yo.po b/po/yo.po
new file mode 100644
index 0000000..2a89254
--- /dev/null
+++ b/po/yo.po
@@ -0,0 +1,124 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr ""
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
new file mode 100644
index 0000000..11206d2
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,123 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Memorize\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-31 16:33-0300\n"
+"PO-Revision-Date: 2008-01-11 08:18+0000\n"
+"Last-Translator: Yuan Chao <yuanchao@gmail.com>\n"
+"Language-Team: Yuan CHAO <yuanchao@gmail.com>\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"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/game.py:103
+msgid "Loading game..."
+msgstr "游戏加载中..."
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:43
+msgid "Load demo games"
+msgstr "示范游戏加载中..."
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:44
+msgid "addition"
+msgstr "加法"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:45
+msgid "capitals"
+msgstr "大写字母"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:46
+msgid "drumgit"
+msgstr "打击乐器"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:47
+msgid "letters"
+msgstr "字母"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:48
+msgid "numbers"
+msgstr "数字"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:49
+msgid "phonemes"
+msgstr "音符"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:69
+msgid "Restart Game"
+msgstr "重新开始"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:79
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:63
+msgid "Load game"
+msgstr "载入游戏"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/memorizetoolbar.py:123
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:116
+msgid "Choose memorize game"
+msgstr "选择记忆游戏"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "Receiving game"
+msgstr "游戏接收中"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/messenger.py:180
+msgid "done"
+msgstr "完成"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:70
+msgid "Create"
+msgstr "开始新游戏"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/activity.py:74
+msgid "Play"
+msgstr "游玩"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:50
+msgid "Add as new pair"
+msgstr "增加新配对"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:58
+msgid "Update selected pair"
+msgstr "更新选定的配对"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:175
+msgid "Preview:"
+msgstr "预览:"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:177
+msgid "Text:"
+msgstr "文字:"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:238
+msgid "Choose image"
+msgstr "选择图片"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createcardpanel.py:258
+msgid "Choose audio"
+msgstr "选择音频"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:53
+msgid "New game"
+msgstr "新游戏"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:73
+msgid "Save game"
+msgstr "保存游戏"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:83
+msgid "Game name"
+msgstr "游戏名称"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "等同配对"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:99
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "点选团体游戏"
+
+#: /home/msgodoi/olpc/workspace/Memorize.activity/createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "点菜单人游戏"
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644
index 0000000..209b3b3
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,124 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Memorize\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-21 22:31+0100\n"
+"PO-Revision-Date: 2008-03-07 22:22-0500\n"
+"Last-Translator: Yuan Chao <yuanchao@gmail.com>\n"
+"Language-Team: Yuan CHAO <yuanchao@gmail.com>\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 "Memorize"
+msgstr "記憶遊戲"
+
+#: activity.py:70
+msgid "Play"
+msgstr "遊玩"
+
+#: activity.py:74
+msgid "Create"
+msgstr "開始新遊戲"
+
+#: createcardpanel.py:52
+msgid "Add as new pair"
+msgstr "增加新配對"
+
+#: createcardpanel.py:60
+msgid "Update selected pair"
+msgstr "更新選取的配對"
+
+#: createcardpanel.py:180
+msgid "Preview:"
+msgstr "預覽:"
+
+#: createcardpanel.py:182
+msgid "Text:"
+msgstr "文字:"
+
+#: createcardpanel.py:243
+msgid "Choose image"
+msgstr "選擇圖片"
+
+#: createcardpanel.py:263
+msgid "Choose audio"
+msgstr "選擇音效"
+
+#: createtoolbar.py:53
+msgid "New game"
+msgstr "新遊戲"
+
+#: createtoolbar.py:63 memorizetoolbar.py:73
+msgid "Load game"
+msgstr "載入遊戲"
+
+#: createtoolbar.py:73
+msgid "Save game"
+msgstr "儲存遊戲"
+
+#: createtoolbar.py:83
+msgid "Game name"
+msgstr "遊戲名稱"
+
+#: createtoolbar.py:87
+msgid "Equal pairs"
+msgstr "等同配對"
+
+#: createtoolbar.py:99 createtoolbar.py:158
+msgid "Click for grouped game"
+msgstr "點選團體遊戲"
+
+#: createtoolbar.py:116 memorizetoolbar.py:117
+msgid "Choose memorize game"
+msgstr "選擇記憶遊戲"
+
+#: createtoolbar.py:154
+msgid "Click for ungrouped game"
+msgstr "點選單人遊戲"
+
+#: game.py:105
+msgid "Loading game..."
+msgstr "遊戲載入中…"
+
+#: memorizetoolbar.py:40
+msgid "Load demo games"
+msgstr "載入範例遊戲"
+
+#: memorizetoolbar.py:41
+msgid "addition"
+msgstr "加法"
+
+#: memorizetoolbar.py:42
+msgid "letters"
+msgstr "字母"
+
+#: memorizetoolbar.py:43
+msgid "sounds"
+msgstr "聲音"
+
+#: memorizetoolbar.py:63
+msgid "Restart Game"
+msgstr "重新開始"
+
+#: messenger.py:183
+msgid "Receiving game"
+msgstr "遊戲接收中"
+
+#: messenger.py:183
+msgid "done"
+msgstr "完成"
+
+#~ msgid "capitals"
+#~ msgstr "大寫字母"
+
+#~ msgid "drumgit"
+#~ msgstr "打擊樂器"
+
+#~ msgid "numbers"
+#~ msgstr "數字"
+
+#~ msgid "phonemes"
+#~ msgstr "音符"
diff --git a/port/COPYING b/port/COPYING
new file mode 100644
index 0000000..623b625
--- /dev/null
+++ b/port/COPYING
@@ -0,0 +1,340 @@
+ 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 Library 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 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.
+
+ <signature of Ty Coon>, 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 Library General
+Public License instead of this License.
diff --git a/port/README b/port/README
new file mode 100644
index 0000000..256200d
--- /dev/null
+++ b/port/README
@@ -0,0 +1,18 @@
+About
+-----
+
+A set of sugar components/libraries/etc to simplify writing activities.
+
+Cornerstone purposes for this project:
+* Total backwards compatibility for sugar-port API
+* Run on all sugar platforms beginning from 0.82
+
+In most cases sugar-port could be embedded to activity's directory tree.
+There is no need to include the whole sugar-port project only top level
+files/directories you are using directly - sugar-port's top level entities
+don't import each other.
+
+Get it
+------
+
+http://wiki.sugarlabs.org/go/Development_Team/sugar-port
diff --git a/port/__init__.py b/port/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/port/__init__.py
diff --git a/port/chooser.py b/port/chooser.py
new file mode 100644
index 0000000..1ee4023
--- /dev/null
+++ b/port/chooser.py
@@ -0,0 +1,68 @@
+# 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
+
+"""Object chooser method"""
+
+import gtk
+import logging
+
+from sugar import mime
+from sugar.graphics.objectchooser import ObjectChooser
+
+TEXT = hasattr(mime, 'GENERIC_TYPE_TEXT') and mime.GENERIC_TYPE_TEXT or None
+IMAGE = hasattr(mime, 'GENERIC_TYPE_IMAGE') and mime.GENERIC_TYPE_IMAGE or None
+AUDIO = hasattr(mime, 'GENERIC_TYPE_AUDIO') and mime.GENERIC_TYPE_AUDIO or None
+VIDEO = hasattr(mime, 'GENERIC_TYPE_VIDEO') and mime.GENERIC_TYPE_VIDEO or None
+LINK = hasattr(mime, 'GENERIC_TYPE_LINK') and mime.GENERIC_TYPE_LINK or None
+
+def pick(cb=None, default=None, parent=None, what=None):
+ """
+ Opens object chooser.
+
+ Method returns:
+
+ * cb(jobject), if object was choosen and cb is not None
+ * jobject, if object was choosen and cb is None
+ * default, otherwise
+
+ NOTE: 'what' makes sense only for sugar >= 0.84
+ """
+ what = what and {'what_filter': what} or {}
+ chooser = ObjectChooser(parent=parent, **what)
+
+ logging.error(chooser)
+
+ jobject = None
+ out = None
+
+ try:
+ if chooser.run() == gtk.RESPONSE_ACCEPT:
+ jobject = chooser.get_selected_object()
+ logging.debug('ObjectChooser: %r' % jobject)
+
+ if jobject and jobject.file_path:
+ if cb:
+ out = cb(jobject)
+ else:
+ out = jobject
+ finally:
+ if jobject and id(jobject) != id(out):
+ jobject.destroy()
+ chooser.destroy()
+ del chooser
+
+ if out:
+ return out
+ else:
+ return default
diff --git a/port/widgets.py b/port/widgets.py
new file mode 100644
index 0000000..9531c97
--- /dev/null
+++ b/port/widgets.py
@@ -0,0 +1,403 @@
+# 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 gtk
+import hippo
+import gobject
+import logging
+import math
+
+from sugar.graphics import style
+from sugar.graphics import palette
+from sugar.graphics import toolbutton
+from sugar.graphics import radiotoolbutton
+from sugar.graphics import icon
+from sugar.graphics import toggletoolbutton
+from sugar.graphics import combobox
+from sugar.graphics import roundbox
+
+def labelize(text, widget):
+ box = hippo.CanvasBox()
+ box.props.spacing = style.DEFAULT_SPACING
+
+ text = hippo.CanvasText(text=text)
+ text.props.color = style.COLOR_SELECTION_GREY.get_int()
+ if gtk.widget_get_default_direction() == gtk.TEXT_DIR_RTL:
+ text.props.xalign = hippo.ALIGNMENT_END
+ else:
+ text.props.xalign = hippo.ALIGNMENT_START
+ box.append(text)
+
+ box.append(widget, hippo.PACK_EXPAND)
+
+ return box
+
+class Entry(hippo.CanvasWidget):
+ def __init__(self, text=None, frame_color=style.COLOR_WHITE.get_gdk_color(),
+ **kwargs):
+ hippo.CanvasWidget.__init__(self, **kwargs)
+
+ self.entry = gtk.Entry()
+ self.entry.modify_bg(gtk.STATE_INSENSITIVE, frame_color)
+
+ self.props.widget = self.entry
+
+ if text:
+ self.text = text
+
+ def get_text(self):
+ return self.entry.props.text
+
+ def set_text(self, value):
+ self.entry.props.text = value
+
+ text = gobject.property(type=str, setter=set_text, getter=get_text)
+ text = property(get_text, set_text)
+
+class TextView(hippo.CanvasWidget):
+ def __init__(self, text=None, **kwargs):
+ hippo.CanvasWidget.__init__(self, **kwargs)
+
+ self.view = gtk.TextView()
+ self.view.props.left_margin = style.DEFAULT_SPACING
+ self.view.props.right_margin = style.DEFAULT_SPACING
+ self.view.props.wrap_mode = gtk.WRAP_WORD
+ self.view.props.accepts_tab = False
+ self.view.show()
+
+ scrolled_window = gtk.ScrolledWindow()
+ scrolled_window.set_shadow_type(gtk.SHADOW_OUT)
+ scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+ scrolled_window.add(self.view)
+
+ self.props.widget = scrolled_window
+
+ if text:
+ self.text = text
+
+ def get_text(self):
+ return self.view.props.buffer.props.text
+
+ def set_text(self, value):
+ self.view.props.buffer.props.text = value or ''
+
+ text = gobject.property(type=str, setter=set_text, getter=get_text)
+ text = property(get_text, set_text)
+
+class Image(hippo.CanvasWidget):
+ def __init__(self, pal=None, tooltip=None, pixbuf=None, **kwargs):
+ self.image = gtk.Image()
+ self._invoker = palette.CanvasInvoker()
+
+ hippo.CanvasBox.__init__(self, widget=self.image)
+
+ self._invoker._position_hint = self._invoker.AT_CURSOR
+ self._invoker.attach(self)
+
+ self.palette_class = None
+
+ self.connect('destroy', self._destroy_cb)
+
+ if pal:
+ self.palette = pal
+ if tooltip:
+ self.tooltip = tooltip
+ if pixbuf:
+ self.pixbuf = pixbuf
+
+ def _destroy_cb(self, widget):
+ if self._invoker is not None:
+ self._invoker.detach()
+
+ def create_palette(self):
+ if self.palette_class is None:
+ return None
+ if isinstance(self.palette_class, tuple):
+ return self.palette_class[0](*self.palette_class[1:])
+ else:
+ return self.palette_class()
+
+ def get_palette(self):
+ return self._invoker.palette
+
+ def set_palette(self, palette):
+ self._invoker.palette = palette
+
+ palette = gobject.property(type=object,
+ setter=set_palette, getter=get_palette)
+ palette = property(get_palette, set_palette)
+
+ def get_tooltip(self):
+ return self._invoker.palette and self._invoker.palette.primary_text
+
+ def set_tooltip(self, text):
+ self.set_palette(palette.Palette(text))
+
+ tooltip = gobject.property(type=str, setter=set_tooltip, getter=get_tooltip)
+ tooltip = property(get_tooltip, set_tooltip)
+
+ def set_pixbuf(self, value):
+ self.image.set_from_pixbuf(value)
+ self.props.box_width = value.get_width()
+ self.props.box_height = value.get_height()
+
+ pixbuf = gobject.property(type=object, setter=set_pixbuf, getter=None)
+ pixbuf = property(None, set_pixbuf)
+
+class ToolButton(toolbutton.ToolButton):
+ def __init__(self,
+ icon_name,
+ size=gtk.ICON_SIZE_SMALL_TOOLBAR,
+ padding=None,
+ **kwargs):
+
+ toolbutton.ToolButton.__init__(self, **kwargs)
+
+ image = icon.Icon(icon_name=icon_name, icon_size=size)
+ image.show()
+
+ # The alignment is a hack to work around gtk.ToolButton code
+ # that sets the icon_size when the icon_widget is a gtk.Image
+ alignment = gtk.Alignment(0.5, 0.5)
+ alignment.show()
+ alignment.add(image)
+
+ self.set_icon_widget(alignment)
+
+ sizes = { gtk.ICON_SIZE_SMALL_TOOLBAR: style.SMALL_ICON_SIZE,
+ gtk.ICON_SIZE_LARGE_TOOLBAR: style.STANDARD_ICON_SIZE }
+
+ if padding is not None and sizes.has_key(size):
+ button_size = sizes[size] + style.DEFAULT_SPACING + padding
+ self.set_size_request(button_size, button_size)
+
+class RadioToolButton(radiotoolbutton.RadioToolButton):
+ def __init__(self,
+ icon_name,
+ size=gtk.ICON_SIZE_SMALL_TOOLBAR,
+ padding=None,
+ **kwargs):
+
+ radiotoolbutton.RadioToolButton.__init__(self, **kwargs)
+
+ image = icon.Icon(icon_name=icon_name, icon_size=size)
+ image.show()
+
+ # The alignment is a hack to work around gtk.ToolButton code
+ # that sets the icon_size when the icon_widget is a gtk.Image
+ alignment = gtk.Alignment(0.5, 0.5)
+ alignment.show()
+ alignment.add(image)
+
+ self.set_icon_widget(alignment)
+
+ sizes = { gtk.ICON_SIZE_SMALL_TOOLBAR: style.SMALL_ICON_SIZE,
+ gtk.ICON_SIZE_LARGE_TOOLBAR: style.STANDARD_ICON_SIZE }
+
+ if padding is not None and sizes.has_key(size):
+ button_size = sizes[size] + style.DEFAULT_SPACING + padding
+ self.set_size_request(button_size, button_size)
+
+class ToolWidget(gtk.ToolItem):
+ def __init__(self, widget):
+ gtk.ToolItem.__init__(self)
+ self.add(widget)
+ widget.show()
+
+class ToggleToolButton(toggletoolbutton.ToggleToolButton):
+ def __init__(self, named_icon=None, tooltip=None, palette=None, **kwargs):
+ toggletoolbutton.ToggleToolButton.__init__(self, named_icon, **kwargs)
+
+ if tooltip:
+ self.set_tooltip(tooltip)
+ if palette:
+ self.set_palette(palette)
+
+class Palette(palette.Palette):
+ def __init__(self, **kwargs):
+ palette.Palette.__init__(self, **kwargs)
+
+ def popup(self, immediate=False, state=None):
+ if not self.props.invoker:
+ if _none_invoker.palette:
+ _none_invoker.palette.popdown(immediate=True)
+ _none_invoker.palette = self
+ self.props.invoker = _none_invoker
+ palette.Palette.popup(self, immediate, state)
+
+class _NoneInvoker(palette.Invoker):
+ def __init__(self):
+ palette.Invoker.__init__(self)
+ self._position_hint = palette.Invoker.AT_CURSOR
+
+ def get_rect(self):
+ return gtk.gdk.Rectangle(0, 0, 0, 0)
+
+ def get_toplevel(self):
+ return None
+
+_none_invoker = _NoneInvoker()
+
+class ComboBox(combobox.ComboBox):
+ def __init__(self, **kwargs):
+ combobox.ComboBox.__init__(self, **kwargs)
+
+ def select(self, id=None, name=None):
+ if id is not None:
+ column = 0
+ value = id
+ elif name is not None:
+ column = 1
+ value = name
+ else:
+ return
+
+ for i, item in enumerate(self.get_model()):
+ if item[column] != value:
+ continue
+ self.set_active(i)
+ break
+
+ def append_item(self, action_id, text, icon_name=None, file_name=None):
+ item = self._item_new(action_id, text, icon_name, file_name)
+ self.get_model().append(item)
+
+ def set_item(self, action_id, text=None, icon_name=None, file_name=None):
+ for i, value in enumerate(self.get_model()):
+ if value[0] == action_id:
+ item = self._item_new(action_id, text, icon_name, file_name)
+ iter = self.get_model().iter_nth_child(None, i)
+ if text is not None:
+ self.get_model().set(iter, 1, item[1])
+ if icon_name is not None or file_name is not None:
+ self.get_model().set(iter, 2, item[2])
+ return True
+ return False
+
+ def _item_new(self, action_id, text, icon_name, file_name):
+ if not self._icon_renderer and (icon_name or file_name):
+ self._icon_renderer = gtk.CellRendererPixbuf()
+
+ settings = self.get_settings()
+ w, h = gtk.icon_size_lookup_for_settings(
+ settings, gtk.ICON_SIZE_MENU)
+ self._icon_renderer.props.stock_size = max(w, h)
+
+ self.pack_start(self._icon_renderer, False)
+ self.add_attribute(self._icon_renderer, 'pixbuf', 2)
+
+ if not self._text_renderer and text:
+ self._text_renderer = gtk.CellRendererText()
+ self.pack_end(self._text_renderer, True)
+ self.add_attribute(self._text_renderer, 'text', 1)
+
+ if icon_name or file_name:
+ if text:
+ size = gtk.ICON_SIZE_MENU
+ else:
+ size = gtk.ICON_SIZE_LARGE_TOOLBAR
+ width, height = gtk.icon_size_lookup(size)
+
+ if icon_name:
+ file_name = self._get_real_name_from_theme(icon_name, size)
+
+ pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(
+ file_name, width, height)
+ else:
+ pixbuf = None
+
+ return (action_id, text, pixbuf, False)
+
+class ToolComboBox(gtk.ToolItem):
+ __gproperties__ = {
+ 'label-text' : (str, None, None, None,
+ gobject.PARAM_WRITABLE),
+ }
+
+ def __init__(self, combo=None, **kwargs):
+ self.label = None
+ self._label_text = ''
+
+ gobject.GObject.__init__(self, **kwargs)
+
+ self.set_border_width(style.DEFAULT_PADDING)
+
+ hbox = gtk.HBox(False, style.DEFAULT_SPACING)
+
+ self.label = gtk.Label(self._label_text)
+ hbox.pack_start(self.label, False)
+ self.label.show()
+
+ if combo:
+ self.combo = combo
+ else:
+ self.combo = ComboBox()
+
+ hbox.pack_start(self.combo)
+ self.combo.show()
+
+ self.add(hbox)
+ hbox.show()
+
+ def do_set_property(self, pspec, value):
+ if pspec.name == 'label-text':
+ self._label_text = value
+ if self.label:
+ self.label.set_text(self._label_text)
+
+class CanvasRoundBox(roundbox.CanvasRoundBox):
+ def __init__(self, radius=style.zoom(10), **kwargs):
+ hippo.CanvasBox.__init__(self, **kwargs)
+ self.set_radius(radius)
+
+ def get_radius(self):
+ return self._radius
+
+ def set_radius(self, radius):
+ self._radius = radius
+ self.props.border_left = radius
+ self.props.border_right = radius
+
+ radius = property(get_radius, set_radius)
+
+ def do_paint_background(self, cr, damaged_box):
+ [width, height] = self.get_allocation()
+
+ cr.rectangle(0, 0, width, height)
+ hippo.cairo_set_source_rgba32(cr, self.props.background_color)
+ cr.fill()
+
+ x = self.props.border_top/2
+ y = self.props.border_top/2
+ width -= self.props.border_top
+ height -= self.props.border_top
+
+ cr.move_to(x + self._radius, y)
+ cr.arc(x + width - self._radius, y + self._radius,
+ self._radius, math.pi * 1.5, math.pi * 2)
+ cr.arc(x + width - self._radius, x + height - self._radius,
+ self._radius, 0, math.pi * 0.5)
+ cr.arc(x + self._radius, y + height - self._radius,
+ self._radius, math.pi * 0.5, math.pi)
+ cr.arc(x + self._radius, y + self._radius, self._radius,
+ math.pi, math.pi * 1.5)
+
+ hippo.cairo_set_source_rgba32(cr, self.props.background_color)
+ cr.fill_preserve()
+
+ # TODO: we should be more consistent here with the border properties.
+ if self.props.border_color:
+ hippo.cairo_set_source_rgba32(cr, self.props.border_color)
+ cr.set_line_width(self.props.border_top)
+ cr.stroke()
diff --git a/score.py b/score.py
new file mode 100644
index 0000000..947c1e9
--- /dev/null
+++ b/score.py
@@ -0,0 +1,71 @@
+# Copyright (C) 2006, 2007, 2008 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import svglabel
+import gtk
+import os
+
+import theme
+
+class Score(svglabel.SvgLabel):
+
+ selected_color = "#818286"
+ default_color = "#4c4d4f"
+ status = False
+
+ def __init__(self, fill_color, stroke_color, pixbuf=None,
+ pixbuf_sel=None, status=False):
+ filename = os.path.join(os.path.dirname(__file__), "images/score.svg")
+ self.pixbuf_un = pixbuf
+ self.pixbuf_sel = pixbuf_sel
+ self.status = status
+ if self.pixbuf_un == None:
+ self.pixbuf_un = svglabel.SvgLabel(filename, fill_color,
+ stroke_color, False,
+ self.default_color).get_pixbuf()
+ if self.pixbuf_sel == None:
+ label = svglabel.SvgLabel(filename, fill_color, stroke_color,
+ False, self.selected_color)
+ self.pixbuf_sel = label.get_pixbuf()
+
+ if status:
+ self.pixbuf = self.pixbuf_sel
+ else:
+ self.pixbuf = self.pixbuf_un
+
+ svglabel.SvgLabel.__init__(self, filename, fill_color, stroke_color,
+ self.pixbuf, self.default_color, theme.SCORE_SIZE,
+ theme.SCORE_SIZE)
+ self.set_selected(status)
+
+ def set_selected(self, status):
+ self.status = status
+ if status:
+ self.pixbuf = self.pixbuf_sel
+ self.modify_bg(gtk.STATE_NORMAL,
+ gtk.gdk.color_parse(self.selected_color))
+ else:
+ self.pixbuf = self.pixbuf_un
+ self.modify_bg(gtk.STATE_NORMAL,
+ gtk.gdk.color_parse(self.default_color))
+ self.queue_draw()
+
+ def get_pixbuf_un(self):
+ return self.pixbuf_un
+
+ def get_pixbuf_sel(self):
+ return self.pixbuf_sel
diff --git a/scoreboard.py b/scoreboard.py
new file mode 100644
index 0000000..e11d3dd
--- /dev/null
+++ b/scoreboard.py
@@ -0,0 +1,87 @@
+# Copyright (C) 2006, 2007, 2008 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import gtk
+import logging
+from playerscoreboard import PlayerScoreboard
+
+_logger = logging.getLogger('memorize-activity')
+
+class Scoreboard(gtk.EventBox):
+ def __init__(self):
+ gtk.EventBox.__init__(self)
+
+ self.players = {}
+ self.current_buddy = None
+
+ self.vbox = gtk.VBox(False)
+
+ fill_box = gtk.EventBox()
+ fill_box.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#4c4d4f'))
+ fill_box.show()
+ self.vbox.pack_end(fill_box, True, True)
+
+ scroll = gtk.ScrolledWindow()
+ scroll.props.shadow_type = gtk.SHADOW_NONE
+ scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+ scroll.add_with_viewport(self.vbox)
+ scroll.set_border_width(0)
+ scroll.get_child().set_property('shadow-type', gtk.SHADOW_NONE)
+ self.add(scroll)
+ self.show_all()
+
+ def change_game(self, widget, data, grid):
+ for buddy in self.players.keys():
+ self.players[buddy].change_game(len(grid))
+
+ def add_buddy(self, widget, buddy, score):
+ ### FIXME: this breaks when the body is empty
+ nick = buddy.props.nick
+ stroke_color, fill_color = buddy.props.color.split(',')
+ player = PlayerScoreboard(nick, fill_color, stroke_color, score)
+ player.show()
+ self.players[buddy] = player
+ self.vbox.pack_start(player, False, False)
+ if score == -1:
+ player.set_wait_mode(True)
+ self.show_all()
+
+ def rem_buddy(self, widget, buddy):
+ self.vbox.remove(self.players[buddy])
+ del self.players[buddy] ### fix for self.players[id]
+
+ def set_selected(self, widget, buddy):
+ if self.current_buddy is not None:
+ old = self.players[self.current_buddy]
+ old.set_selected(False)
+ self.current_buddy = buddy
+ player = self.players[buddy]
+ player.set_selected(True)
+
+ def set_buddy_message(self, widget, buddy, msg):
+ self.players[buddy].set_message(msg)
+
+ def increase_score(self, widget, buddy):
+ self.players[buddy].increase_score()
+
+ def reset(self, widget):
+ for buddy in self.players.keys():
+ self.players[buddy].reset()
+
+ def set_wait_mode(self, widget, buddy, status):
+ self.players[buddy].set_wait_mode(status)
+
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..530f97c
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,21 @@
+#!/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()
diff --git a/speak/COPYING b/speak/COPYING
new file mode 100644
index 0000000..20d40b6
--- /dev/null
+++ b/speak/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>. \ No newline at end of file
diff --git a/speak/__init__.py b/speak/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/speak/__init__.py
diff --git a/speak/espeak.py b/speak/espeak.py
new file mode 100644
index 0000000..389045d
--- /dev/null
+++ b/speak/espeak.py
@@ -0,0 +1,118 @@
+# 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 gst
+import gobject
+import subprocess
+
+import logging
+logger = logging.getLogger('speak')
+
+supported = True
+
+class BaseAudioGrab(gobject.GObject):
+ __gsignals__ = {
+ 'new-buffer': (gobject.SIGNAL_RUN_FIRST, None, [gobject.TYPE_PYOBJECT])
+ }
+
+ def __init__(self):
+ gobject.GObject.__init__(self)
+ self.pipeline = None
+ self.quiet = True
+
+ def restart_sound_device(self):
+ self.quiet = False
+
+ self.pipeline.set_state(gst.STATE_NULL)
+ self.pipeline.set_state(gst.STATE_PLAYING)
+
+ def stop_sound_device(self):
+ if self.pipeline is None:
+ return
+
+ self.pipeline.set_state(gst.STATE_NULL)
+ # Shut theirs mouths down
+ self._new_buffer('')
+
+ self.quiet = True
+
+ def make_pipeline(self, cmd):
+ if self.pipeline is not None:
+ self.stop_sound_device()
+ del self.pipeline
+
+ # build a pipeline that reads the given file
+ # and sends it to both the real audio output
+ # and a fake one that we use to draw from
+ self.pipeline = gst.parse_launch(
+ cmd + ' ' \
+ '! decodebin ' \
+ '! tee name=tee ' \
+ 'tee.! audioconvert ' \
+ '! alsasink ' \
+ 'tee.! queue ' \
+ '! audioconvert ! fakesink name=sink')
+
+ def on_buffer(element, buffer, pad):
+ # we got a new buffer of data, ask for another
+ gobject.timeout_add(100, self._new_buffer, str(buffer))
+ return True
+
+ sink = self.pipeline.get_by_name('sink')
+ sink.props.signal_handoffs = True
+ sink.connect('handoff', on_buffer)
+
+ def gstmessage_cb(bus, message):
+ self._was_message = True
+
+ if message.type == gst.MESSAGE_WARNING:
+ def check_after_warnings():
+ if not self._was_message:
+ self.stop_sound_device()
+ return True
+
+ logger.debug(message.type)
+ self._was_message = False
+ gobject.timeout_add(500, self._new_buffer, str(buffer))
+
+ elif message.type in (gst.MESSAGE_EOS, gst.MESSAGE_ERROR):
+ logger.debug(message.type)
+ self.stop_sound_device()
+
+ self._was_message = False
+ bus = self.pipeline.get_bus()
+ bus.add_signal_watch()
+ bus.connect('message', gstmessage_cb)
+
+ def _new_buffer(self, buf):
+ if not self.quiet:
+ # pass captured audio to anyone who is interested
+ self.emit("new-buffer", buf)
+ return False
+
+# load proper espeak plugin
+try:
+ import gst
+ gst.element_factory_make('espeak')
+ from espeak_gst import AudioGrabGst as AudioGrab
+ from espeak_gst import *
+ logger.info('use gst-plugins-espeak')
+except Exception, e:
+ logger.info('disable gst-plugins-espeak: %s' % e)
+ if subprocess.call('which espeak', shell=True) == 0:
+ from espeak_cmd import AudioGrabCmd as AudioGrab
+ from espeak_cmd import *
+ else:
+ logger.info('disable espeak_cmd')
+ supported = False
diff --git a/speak/espeak_cmd.py b/speak/espeak_cmd.py
new file mode 100644
index 0000000..682bfcd
--- /dev/null
+++ b/speak/espeak_cmd.py
@@ -0,0 +1,64 @@
+# 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 re
+import subprocess
+
+import logging
+logger = logging.getLogger('speak')
+
+import espeak
+
+PITCH_MAX = 99
+RATE_MAX = 99
+PITCH_DEFAULT = PITCH_MAX/2
+RATE_DEFAULT = RATE_MAX/3
+
+class AudioGrabCmd(espeak.BaseAudioGrab):
+ def speak(self, status, text):
+ self.make_pipeline('filesrc name=file-source')
+
+ # espeak uses 80 to 370
+ rate = 80 + (370-80) * int(status.rate) / 100
+ wavpath = "/tmp/speak.wav"
+
+ subprocess.call(["espeak", "-w", wavpath, "-p", str(status.pitch),
+ "-s", str(rate), "-v", status.voice.name, text],
+ stdout=subprocess.PIPE)
+
+ self.stop_sound_device()
+
+ # set the source file
+ self.pipeline.get_by_name("file-source").props.location = wavpath
+
+ # play
+ self.restart_sound_device()
+
+def voices():
+ out = []
+ result = subprocess.Popen(["espeak", "--voices"], stdout=subprocess.PIPE) \
+ .communicate()[0]
+
+ for line in result.split('\n'):
+ m = re.match(r'\s*\d+\s+([\w-]+)\s+([MF])\s+([\w_-]+)\s+(.+)', line)
+ if not m:
+ continue
+ language, gender, name, stuff = m.groups()
+ if stuff.startswith('mb/') or \
+ name in ('en-rhotic','english_rp','english_wmids'):
+ # these voices don't produce sound
+ continue
+ out.append((language, name))
+
+ return out
diff --git a/speak/espeak_gst.py b/speak/espeak_gst.py
new file mode 100644
index 0000000..85cfa26
--- /dev/null
+++ b/speak/espeak_gst.py
@@ -0,0 +1,54 @@
+# 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
+logger = logging.getLogger('speak')
+
+import gst
+import espeak
+
+PITCH_MAX = 200
+RATE_MAX = 200
+PITCH_DEFAULT = PITCH_MAX/2
+RATE_DEFAULT = RATE_MAX/2
+
+class AudioGrabGst(espeak.BaseAudioGrab):
+ def speak(self, status, text):
+ self.make_pipeline('espeak name=espeak ! wavenc')
+ src = self.pipeline.get_by_name('espeak')
+
+ pitch = int(status.pitch) - 100
+ rate = int(status.rate) - 100
+
+ logger.debug('pitch=%d rate=%d voice=%s text=%s' % (pitch, rate,
+ status.voice.name, text))
+
+ src.props.text = text
+ src.props.pitch = pitch
+ src.props.rate = rate
+ src.props.voice = status.voice.name
+
+ self.restart_sound_device()
+
+def voices():
+ out = []
+
+ for i in gst.element_factory_make('espeak').props.voices:
+ name, language, dialect = i
+ if name in ('en-rhotic','english_rp','english_wmids'):
+ # these voices don't produce sound
+ continue
+ out.append((language, name))
+
+ return out
diff --git a/speak/eye.py b/speak/eye.py
new file mode 100644
index 0000000..1fe23f5
--- /dev/null
+++ b/speak/eye.py
@@ -0,0 +1,157 @@
+# Speak.activity
+# A simple front end to the espeak text-to-speech engine on the XO laptop
+# http://wiki.laptop.org/go/Speak
+#
+# Copyright (C) 2008 Joshua Minor
+# This file is part of Speak.activity
+#
+# Parts of Speak.activity are based on code from Measure.activity
+# Copyright (C) 2007 Arjun Sarwal - arjun@laptop.org
+#
+# Speak.activity is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Speak.activity 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 Speak.activity. If not, see <http://www.gnu.org/licenses/>.
+
+import pygtk
+import gtk
+import gtk.gdk
+import gobject
+import cairo
+import math
+
+class Eye(gtk.DrawingArea):
+ def __init__(self, fill_color):
+ gtk.DrawingArea.__init__(self)
+ self.connect("expose_event", self.expose)
+ self.frame = 0
+ self.blink = False
+ self.x, self.y = 0,0
+ self.fill_color = fill_color
+
+ # listen for clicks
+ self.add_events(gtk.gdk.BUTTON_PRESS_MASK)
+ self.add_events(gtk.gdk.BUTTON_RELEASE_MASK)
+ self.connect("button_press_event", self._mouse_pressed_cb)
+ self.connect("button_release_event", self._mouse_released_cb)
+
+ # Instead of listening for mouse move events we could poll to see if the mouse has moved
+ # would let us react to the mouse even when it isn't directly over this widget.
+ # Unfortunately that would cause a lot of CPU usage. So instead we rely on our parent to
+ # tell us to redraw when the mouse has moved. We still need to call add_events so that
+ # our parent will get mouse motion events, but we don't connect the callback for them ourselves.
+ self.add_events(gtk.gdk.POINTER_MOTION_MASK)
+ # self.connect("motion_notify_event", self._mouse_moved_cb)
+
+ def _mouse_moved_cb(self, widget, event):
+ self.queue_draw()
+
+ def _mouse_pressed_cb(self, widget, event):
+ self.blink = True
+ self.queue_draw()
+
+ def _mouse_released_cb(self, widget, event):
+ self.blink = False
+ self.queue_draw()
+
+ def look_at(self, x, y):
+ self.x = x
+ self.y = y
+ self.queue_draw()
+
+ def look_ahead(self):
+ self.x = None
+ self.y = None
+ self.queue_draw()
+
+ # Thanks to xeyes :)
+ def computePupil(self):
+ a = self.get_allocation()
+
+ if self.x is None or self.y is None:
+ # look ahead, but not *directly* in the middle
+ if a.x + a.width/2 < self.parent.get_allocation().width/2:
+ cx = a.width * 0.6
+ else:
+ cx = a.width * 0.4
+ return cx, a.height * 0.6
+
+ EYE_X, EYE_Y = self.translate_coordinates(
+ self.get_toplevel(), a.width/2, a.height/2)
+ EYE_HWIDTH = a.width
+ EYE_HHEIGHT = a.height
+ BALL_DIST = EYE_HWIDTH/4
+
+ dx = self.x - EYE_X
+ dy = self.y - EYE_Y
+
+ if dx or dy:
+ angle = math.atan2(dy, dx)
+ cosa = math.cos(angle)
+ sina = math.sin(angle)
+ h = math.hypot(EYE_HHEIGHT * cosa, EYE_HWIDTH * sina)
+ x = (EYE_HWIDTH * EYE_HHEIGHT) * cosa / h
+ y = (EYE_HWIDTH * EYE_HHEIGHT) * sina / h
+ dist = BALL_DIST * math.hypot(x, y)
+
+ if dist < math.hypot(dx, dy):
+ dx = dist * cosa
+ dy = dist * sina
+
+ return a.width/2 + dx, a.height/2 + dy
+
+ def expose(self, widget, event):
+ self.frame += 1
+ bounds = self.get_allocation()
+
+ eyeSize = min(bounds.width, bounds.height)
+ outlineWidth = eyeSize/20.0
+ pupilSize = eyeSize/10.0
+ pupilX, pupilY = self.computePupil()
+ dX = pupilX - bounds.width/2.
+ dY = pupilY - bounds.height/2.
+ distance = math.sqrt(dX*dX + dY*dY)
+ limit = eyeSize/2 - outlineWidth*2 - pupilSize
+ if distance > limit:
+ pupilX = bounds.width/2 + dX*limit/distance
+ pupilY = bounds.height/2 + dY*limit/distance
+
+ self.context = widget.window.cairo_create()
+ #self.context.set_antialias(cairo.ANTIALIAS_NONE)
+
+ #set a clip region for the expose event. This reduces redrawing work (and time)
+ self.context.rectangle(event.area.x, event.area.y, event.area.width, event.area.height)
+ self.context.clip()
+
+ # background
+ self.context.set_source_rgba(*self.fill_color.get_rgba())
+ self.context.rectangle(0,0,bounds.width,bounds.height)
+ self.context.fill()
+
+ # eye ball
+ self.context.arc(bounds.width/2,bounds.height/2, eyeSize/2-outlineWidth/2, 0,360)
+ self.context.set_source_rgb(1,1,1)
+ self.context.fill()
+
+ # outline
+ self.context.set_line_width(outlineWidth)
+ self.context.arc(bounds.width/2,bounds.height/2, eyeSize/2-outlineWidth/2, 0,360)
+ self.context.set_source_rgb(0,0,0)
+ self.context.stroke()
+
+ # pupil
+ self.context.arc(pupilX,pupilY,pupilSize,0,360)
+ self.context.set_source_rgb(0,0,0)
+ self.context.fill()
+
+ self.blink = False
+
+ return True
diff --git a/speak/face.py b/speak/face.py
new file mode 100644
index 0000000..5ad632c
--- /dev/null
+++ b/speak/face.py
@@ -0,0 +1,184 @@
+# Speak.activity
+# A simple front end to the espeak text-to-speech engine on the XO laptop
+# http://wiki.laptop.org/go/Speak
+#
+# Copyright (C) 2008 Joshua Minor
+# This file is part of Speak.activity
+#
+# Parts of Speak.activity are based on code from Measure.activity
+# Copyright (C) 2007 Arjun Sarwal - arjun@laptop.org
+#
+# Speak.activity is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Speak.activity 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 Speak.activity. If not, see <http://www.gnu.org/licenses/>.
+
+
+import logging
+import gtk
+import cjson
+from gettext import gettext as _
+
+import sugar.graphics.style as style
+
+import espeak
+import eye
+import glasses
+import mouth
+import voice
+import fft_mouth
+import waveform_mouth
+
+logger = logging.getLogger('speak')
+
+FACE_PAD = 2
+
+class Status:
+ def __init__(self):
+ self.voice = voice.defaultVoice()
+ self.pitch = espeak.PITCH_DEFAULT
+ self.rate = espeak.RATE_DEFAULT
+ self.eyes = [eye.Eye] * 2
+ self.mouth = mouth.Mouth
+
+ def serialize(self):
+ eyes = { eye.Eye : 1,
+ glasses.Glasses : 2 }
+ mouths = { mouth.Mouth : 1,
+ fft_mouth.FFTMouth : 2,
+ waveform_mouth.WaveformMouth : 3 }
+
+ return cjson.encode({
+ 'voice' : { 'language' : self.voice.language,
+ 'name' : self.voice.name },
+ 'pitch' : self.pitch,
+ 'rate' : self.rate,
+ 'eyes' : [eyes[i] for i in self.eyes],
+ 'mouth' : mouths[self.mouth] })
+
+ def deserialize(self, buf):
+ eyes = { 1: eye.Eye,
+ 2: glasses.Glasses }
+ mouths = { 1: mouth.Mouth,
+ 2: fft_mouth.FFTMouth,
+ 3: waveform_mouth.WaveformMouth }
+
+ data = cjson.decode(buf)
+ self.voice = voice.Voice(data['voice']['language'],
+ data['voice']['name'])
+ self.pitch = data['pitch']
+ self.rate = data['rate']
+ self.eyes = [eyes[i] for i in data['eyes']]
+ self.mouth = mouths[data['mouth']]
+
+ return self
+
+ def clone(self):
+ new = Status()
+ new.voice = self.voice
+ new.pitch = self.pitch
+ new.rate = self.rate
+ new.eyes = self.eyes
+ new.mouth = self.mouth
+ return new
+
+class View(gtk.EventBox):
+ def __init__(self, fill_color=style.COLOR_BUTTON_GREY):
+ gtk.EventBox.__init__(self)
+
+ self.status = Status()
+ self.fill_color = fill_color
+
+ self.connect('size-allocate', self._size_allocate_cb)
+
+ self._audio = espeak.AudioGrab()
+
+ # make an empty box for some eyes
+ self._eyes = None
+ self._eyebox = gtk.HBox()
+ self._eyebox.show()
+
+ # make an empty box to put the mouth in
+ self._mouth = None
+ self._mouthbox = gtk.HBox()
+ self._mouthbox.show()
+
+ # layout the screen
+ box = gtk.VBox(homogeneous=False)
+ box.pack_start(self._eyebox)
+ box.pack_start(self._mouthbox, False)
+ box.set_border_width(FACE_PAD)
+ self.modify_bg(gtk.STATE_NORMAL, self.fill_color.get_gdk_color())
+ self.add(box)
+
+ self._mapped = False
+ self._peding = None
+ self.connect("map_event",self._map_event)
+
+ self.update()
+
+ def _map_event(self, widget, event):
+ self._mapped = True
+ if self._peding:
+ self.update(self._peding)
+ self._peding = None
+
+ def look_ahead(self):
+ if self._eyes:
+ map(lambda e: e.look_ahead(), self._eyes)
+
+ def look_at(self, x, y):
+ if self._eyes:
+ map(lambda e, x=x, y=y: e.look_at(x,y), self._eyes)
+
+ def update(self, status = None):
+ if not status:
+ status = self.status
+ else:
+ if not self._mapped:
+ self._peding = status
+ return
+ self.status = status
+
+ if self._eyes:
+ for eye in self._eyes:
+ self._eyebox.remove(eye)
+ if self._mouth:
+ self._mouthbox.remove(self._mouth)
+
+ self._eyes = []
+
+ for i in status.eyes:
+ eye = i(self.fill_color)
+ self._eyes.append(eye)
+ self._eyebox.pack_start(eye, padding=FACE_PAD)
+ eye.show()
+
+ self._mouth = status.mouth(self._audio, self.fill_color)
+ self._mouth.show()
+ self._mouthbox.add(self._mouth)
+
+ # enable mouse move events so we can track the eyes while the mouse is over the mouth
+ #self._mouth.add_events(gtk.gdk.POINTER_MOTION_MASK)
+
+ def say(self, something):
+ self._audio.speak(self._peding or self.status, something)
+
+ def say_notification(self, something):
+ status = (self._peding or self.status).clone()
+ status.voice = voice.defaultVoice()
+ self._audio.speak(status, something)
+
+ def shut_up(self):
+ self._audio.stop_sound_device()
+
+ def _size_allocate_cb(self, widget, allocation):
+ self._mouthbox.set_size_request(-1, int(allocation.height/2.5))
diff --git a/speak/fft_mouth.py b/speak/fft_mouth.py
new file mode 100644
index 0000000..53bcadf
--- /dev/null
+++ b/speak/fft_mouth.py
@@ -0,0 +1,128 @@
+# Speak.activity
+# A simple front end to the espeak text-to-speech engine on the XO laptop
+# http://wiki.laptop.org/go/Speak
+#
+# Copyright (C) 2008 Joshua Minor
+# This file is part of Speak.activity
+#
+# Parts of Speak.activity are based on code from Measure.activity
+# Copyright (C) 2007 Arjun Sarwal - arjun@laptop.org
+#
+# Speak.activity is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Speak.activity 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 Speak.activity. If not, see <http://www.gnu.org/licenses/>.
+
+# This code is a stripped down version of the fft view from Measure
+
+from mouth import *
+
+# Newer OLPC builds (and Fedora) have numpy instead of numeric:
+try:
+ from numpy.oldnumeric import ceil
+ from numpy.fft import *
+except:
+ from Numeric import ceil
+ from FFT import *
+
+class FFTMouth(Mouth):
+ def __init__(self, audioSource, fill_color):
+
+ Mouth.__init__(self, audioSource, fill_color)
+
+ self.peaks = []
+
+ self.y_mag = 1.7
+ self.freq_range=70
+ self.draw_interval = 1
+ self.num_of_points = 105
+
+ self.stop=False
+
+ self.y_mag_bias_multiplier = 1 #constant to multiply with self.param2 while scaling values
+
+ self.fftx = []
+
+ self.scaleX = "10"
+ self.scaleY = "10"
+
+
+ def processBuffer(self, bounds):
+ self.param1 = bounds.height/65536.0
+ self.param2 = bounds.height/2.0
+
+ if(self.stop==False):
+
+ Fs = 48000
+ nfft= 65536
+ self.newest_buffer=self.newest_buffer[0:256]
+ self.fftx = fft(self.newest_buffer, 256,-1)
+
+ self.fftx=self.fftx[0:self.freq_range*2]
+ self.draw_interval=bounds.width/(self.freq_range*2.)
+
+ NumUniquePts = ceil((nfft+1)/2)
+ self.buffers=abs(self.fftx)*0.02
+ self.y_mag_bias_multiplier=0.1
+ self.scaleX = "hz"
+ self.scaleY = ""
+
+ if(len(self.buffers)==0):
+ return False
+
+ # Scaling the values
+ val = []
+ for i in self.buffers:
+ temp_val_float = float(self.param1*i*self.y_mag) + self.y_mag_bias_multiplier * self.param2
+
+ if(temp_val_float >= bounds.height):
+ temp_val_float = bounds.height-25
+ if(temp_val_float <= 0):
+ temp_val_float = 25
+ val.append( temp_val_float )
+
+ self.peaks = val
+
+ def expose(self, widget, event):
+ """This function is the "expose" event handler and does all the drawing."""
+
+ bounds = self.get_allocation()
+
+ self.processBuffer(bounds)
+
+ #Create context, disable antialiasing
+ self.context = widget.window.cairo_create()
+ self.context.set_antialias(cairo.ANTIALIAS_NONE)
+
+ #set a clip region for the expose event. This reduces redrawing work (and time)
+ self.context.rectangle(event.area.x, event.area.y,event.area.width, event.area.height)
+ self.context.clip()
+
+ # background
+ self.context.set_source_rgba(*self.fill_color.get_rgba())
+ self.context.rectangle(0,0, bounds.width,bounds.height)
+ self.context.fill()
+
+ # Draw the waveform
+ self.context.set_line_width(min(bounds.height/10.0, 10))
+ self.context.set_source_rgb(0,0,0)
+ count = 0
+ for peak in self.peaks:
+ self.context.line_to(bounds.width/2 + count,bounds.height/2 - peak)
+ count += self.draw_interval
+ self.context.stroke()
+ count = 0
+ for peak in self.peaks:
+ self.context.line_to(bounds.width/2 - count,bounds.height/2 - peak)
+ count += self.draw_interval
+ self.context.stroke()
+
+ return True
diff --git a/speak/glasses.py b/speak/glasses.py
new file mode 100644
index 0000000..fb64bbd
--- /dev/null
+++ b/speak/glasses.py
@@ -0,0 +1,81 @@
+# Speak.activity
+# A simple front end to the espeak text-to-speech engine on the XO laptop
+# http://wiki.laptop.org/go/Speak
+#
+# Copyright (C) 2008 Joshua Minor
+# This file is part of Speak.activity
+#
+# Parts of Speak.activity are based on code from Measure.activity
+# Copyright (C) 2007 Arjun Sarwal - arjun@laptop.org
+#
+# Speak.activity is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Speak.activity 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 Speak.activity. If not, see <http://www.gnu.org/licenses/>.
+
+from eye import *
+
+class Glasses(Eye):
+ def __init__(self, fill_color):
+ Eye.__init__(self, fill_color)
+
+ def expose(self, widget, event):
+ bounds = self.get_allocation()
+
+ eyeSize = min(bounds.width, bounds.height)
+ outlineWidth = eyeSize/20.0
+ pupilSize = eyeSize/10.0
+ pupilX, pupilY = self.pupil_position()
+ dX = pupilX - bounds.width/2.
+ dY = pupilY - bounds.height/2.
+ distance = math.sqrt(dX*dX + dY*dY)
+ limit = eyeSize/2 - outlineWidth*2 - pupilSize
+ if distance > limit:
+ pupilX = bounds.width/2 + dX*limit/distance
+ pupilY = bounds.height/2 + dY*limit/distance
+
+ self.context = widget.window.cairo_create()
+ #self.context.set_antialias(cairo.ANTIALIAS_NONE)
+
+ #set a clip region for the expose event. This reduces redrawing work (and time)
+ self.context.rectangle(event.area.x, event.area.y, event.area.width, event.area.height)
+ self.context.clip()
+
+ # background
+ self.context.set_source_rgba(*self.fill_color.get_rgba())
+ self.context.rectangle(0,0,bounds.width,bounds.height)
+ self.context.fill()
+
+ def roundrect(x1,y1, x2,y2):
+ self.context.move_to(x1, (y1+y2)/2.)
+ self.context.curve_to(x1,y1, x1,y1, (x1+x2)/2.,y1)
+ self.context.curve_to(x2,y1, x2,y1, x2,(y1+y2)/2.)
+ self.context.curve_to(x2,y2, x2,y2, (x1+x2)/2.,y2)
+ self.context.curve_to(x1,y2, x1,y2, x1,(y1+y2)/2.)
+
+ # eye ball
+ roundrect(outlineWidth,outlineWidth, bounds.width-outlineWidth,bounds.height-outlineWidth)
+ self.context.set_source_rgb(1,1,1)
+ self.context.fill()
+
+ # outline
+ self.context.set_line_width(outlineWidth)
+ roundrect(outlineWidth,outlineWidth, bounds.width-outlineWidth,bounds.height-outlineWidth)
+ #roundrect(0,0, bounds.width,bounds.height)
+ self.context.set_source_rgb(0,0,0)
+ self.context.stroke()
+
+ # pupil
+ self.context.arc(pupilX,pupilY,pupilSize,0,360)
+ self.context.set_source_rgb(0,0,0)
+ self.context.fill()
+
+ return True
diff --git a/speak/mouth.py b/speak/mouth.py
new file mode 100644
index 0000000..b01155a
--- /dev/null
+++ b/speak/mouth.py
@@ -0,0 +1,101 @@
+# Speak.activity
+# A simple front end to the espeak text-to-speech engine on the XO laptop
+# http://wiki.laptop.org/go/Speak
+#
+# Copyright (C) 2008 Joshua Minor
+# This file is part of Speak.activity
+#
+# Parts of Speak.activity are based on code from Measure.activity
+# Copyright (C) 2007 Arjun Sarwal - arjun@laptop.org
+#
+# Speak.activity is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Speak.activity 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 Speak.activity. If not, see <http://www.gnu.org/licenses/>.
+
+# This code is a super-stripped down version of the waveform view from Measure
+
+import gtk
+import cairo
+from struct import unpack
+import numpy.core
+
+class Mouth(gtk.DrawingArea):
+ def __init__(self, audioSource, fill_color):
+
+ gtk.DrawingArea.__init__(self)
+ self.connect("expose_event",self.expose)
+ self.buffers = []
+ self.buffer_size = 256
+ self.main_buffers = []
+ self.newest_buffer = []
+ self.fill_color = fill_color
+
+ audioSource.connect("new-buffer", self._new_buffer)
+
+ def _new_buffer(self, obj, buf):
+ if len(buf) < 28:
+ self.newest_buffer = []
+ else:
+ self.newest_buffer = list(unpack( str(int(len(buf))/2)+'h' , buf))
+ self.main_buffers += self.newest_buffer
+ if(len(self.main_buffers)>self.buffer_size):
+ del self.main_buffers[0:(len(self.main_buffers)- \
+ self.buffer_size)]
+
+ self.queue_draw()
+ return True
+
+ def processBuffer(self, bounds):
+ if len(self.main_buffers) == 0 or len(self.newest_buffer) == 0:
+ self.volume = 0
+ else:
+ self.volume = numpy.core.max(self.main_buffers)# - numpy.core.min(self.main_buffers)
+
+ def expose(self, widget, event):
+ """This function is the "expose" event handler and does all the drawing."""
+ bounds = self.get_allocation()
+
+ self.processBuffer(bounds)
+
+ #Create context, disable antialiasing
+ self.context = widget.window.cairo_create()
+ self.context.set_antialias(cairo.ANTIALIAS_NONE)
+
+ #set a clip region for the expose event. This reduces redrawing work (and time)
+ self.context.rectangle(event.area.x, event.area.y,event.area.width, event.area.height)
+ self.context.clip()
+
+ # background
+ self.context.set_source_rgba(*self.fill_color.get_rgba())
+ self.context.rectangle(0,0, bounds.width,bounds.height)
+ self.context.fill()
+
+ # Draw the mouth
+ volume = self.volume / 65535.
+ mouthH = volume * bounds.height
+ mouthW = volume**2 * (bounds.width/2.) + bounds.width/2.
+ # T
+ # L R
+ # B
+ Lx,Ly = bounds.width/2 - mouthW/2, bounds.height/2
+ Tx,Ty = bounds.width/2, bounds.height/2 - mouthH/2
+ Rx,Ry = bounds.width/2 + mouthW/2, bounds.height/2
+ Bx,By = bounds.width/2, bounds.height/2 + mouthH/2
+ self.context.set_line_width(min(bounds.height/10.0, 10))
+ self.context.move_to(Lx,Ly)
+ self.context.curve_to(Tx,Ty, Tx,Ty, Rx,Ry)
+ self.context.curve_to(Bx,By, Bx,By, Lx,Ly)
+ self.context.set_source_rgb(0,0,0)
+ self.context.close_path()
+ self.context.stroke()
+
+ return True
diff --git a/speak/voice.py b/speak/voice.py
new file mode 100644
index 0000000..5fc732e
--- /dev/null
+++ b/speak/voice.py
@@ -0,0 +1,134 @@
+# Speak.activity
+# A simple front end to the espeak text-to-speech engine on the XO laptop
+# http://wiki.laptop.org/go/Speak
+#
+# Copyright (C) 2008 Joshua Minor
+# This file is part of Speak.activity
+#
+# Parts of Speak.activity are based on code from Measure.activity
+# Copyright (C) 2007 Arjun Sarwal - arjun@laptop.org
+#
+# Speak.activity is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Speak.activity 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 Speak.activity. If not, see <http://www.gnu.org/licenses/>.
+
+import re, os
+from gettext import gettext as _
+
+import logging
+logger = logging.getLogger('speak')
+
+import espeak
+
+# Lets trick gettext into generating entries for the voice names we expect espeak to have
+# If espeak actually has new or different names then they won't get translated, but they
+# should still show up in the interface.
+expectedVoiceNames = [
+ _("Brazil"),
+ _("Swedish"),
+ _("Icelandic"),
+ _("Romanian"),
+ _("Swahili"),
+ _("Hindi"),
+ _("Dutch"),
+ _("Latin"),
+ _("Hungarian"),
+ _("Macedonian"),
+ _("Welsh"),
+ _("French"),
+ _("Norwegian"),
+ _("Russian"),
+ _("Afrikaans"),
+ _("Finnish"),
+ _("Default"),
+ _("Cantonese"),
+ _("Scottish"),
+ _("Greek"),
+ _("Vietnam"),
+ _("English"),
+ _("Lancashire"),
+ _("Italian"),
+ _("Portugal"),
+ _("German"),
+ _("Whisper"),
+ _("Croatian"),
+ _("Czech"),
+ _("Slovak"),
+ _("Spanish"),
+ _("Polish"),
+ _("Esperanto")
+]
+
+_allVoices = {}
+_defaultVoice = None
+
+class Voice:
+ def __init__(self, language, name):
+ self.language = language
+ self.name = name
+
+ friendlyname = name
+ friendlyname = friendlyname.replace('-test','')
+ friendlyname = friendlyname.replace('_test','')
+ friendlyname = friendlyname.replace('en-','')
+ friendlyname = friendlyname.replace('english-wisper','whisper')
+ friendlyname = friendlyname.capitalize()
+ self.friendlyname = _(friendlyname)
+
+def allVoices():
+ if _allVoices:
+ return _allVoices
+
+ for language, name in espeak.voices():
+ voice = Voice(language, name)
+ _allVoices[voice.friendlyname] = voice
+
+ return _allVoices
+
+def by_name(name):
+ return allVoices().get(name, defaultVoice())
+
+def defaultVoice():
+ """Try to figure out the default voice, from the current locale ($LANG).
+ Fall back to espeak's voice called Default."""
+
+ global _defaultVoice
+
+ if _defaultVoice:
+ return _defaultVoice
+
+ voices = allVoices()
+
+ def fit(a,b):
+ "Compare two language ids to see if they are similar."
+ as_ = re.split(r'[^a-z]+', a.lower())
+ bs = re.split(r'[^a-z]+', b.lower())
+ for count in range(0, min(len(as_),len(bs))):
+ if as_[count] != bs[count]:
+ count -= 1
+ break
+ return count
+ try:
+ lang = os.environ["LANG"]
+ except:
+ lang = ""
+
+ best = voices[_("Default")]
+ for voice in voices.values():
+ voiceMetric = fit(voice.language, lang)
+ bestMetric = fit(best.language, lang)
+ if voiceMetric > bestMetric:
+ best = voice
+
+ print "Best voice for LANG %s seems to be %s %s" % (lang, best.language, best.friendlyname)
+ _defaultVoice = best
+ return best
diff --git a/speak/waveform_mouth.py b/speak/waveform_mouth.py
new file mode 100644
index 0000000..71a10ea
--- /dev/null
+++ b/speak/waveform_mouth.py
@@ -0,0 +1,80 @@
+# Speak.activity
+# A simple front end to the espeak text-to-speech engine on the XO laptop
+# http://wiki.laptop.org/go/Speak
+#
+# Copyright (C) 2008 Joshua Minor
+# This file is part of Speak.activity
+#
+# Parts of Speak.activity are based on code from Measure.activity
+# Copyright (C) 2007 Arjun Sarwal - arjun@laptop.org
+#
+# Speak.activity is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Speak.activity 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 Speak.activity. If not, see <http://www.gnu.org/licenses/>.
+
+# This code is a stripped down version of the waveform view from Measure
+
+from mouth import *
+
+class WaveformMouth(Mouth):
+ def __init__(self, audioSource, fill_color):
+
+ Mouth.__init__(self, audioSource, fill_color)
+
+ self.buffer_size = 100
+ self.peaks = []
+
+ self.stop=False
+
+ self.y_mag_bias_multiplier = 1
+ self.y_mag = 0.7
+
+ def expose(self, widget, event):
+ """This function is the "expose" event handler and does all the drawing."""
+
+ bounds = self.get_allocation()
+ self.param1 = bounds.height/65536.0
+ self.param2 = bounds.height/2.0
+
+ #Create context, disable antialiasing
+ self.context = widget.window.cairo_create()
+ self.context.set_antialias(cairo.ANTIALIAS_NONE)
+
+ #set a clip region for the expose event. This reduces redrawing work (and time)
+ self.context.rectangle(event.area.x, event.area.y,event.area.width, event.area.height)
+ self.context.clip()
+
+ # background
+ self.context.set_source_rgba(*self.fill_color.get_rgba())
+ self.context.rectangle(0,0, bounds.width,bounds.height)
+ self.context.fill()
+
+ # Draw the waveform
+ self.context.set_line_width(min(bounds.height/10.0, 10))
+ count = 0
+ buflen = float(len(self.main_buffers))
+ for value in self.main_buffers:
+ peak = float(self.param1*value*self.y_mag) + self.y_mag_bias_multiplier * self.param2
+
+ if peak >= bounds.height:
+ peak = bounds.height
+ if peak <= 0:
+ peak = 0
+
+ x = count / buflen * bounds.width
+ self.context.line_to(x,bounds.height - peak)
+
+ count += 1
+ self.context.set_source_rgb(0,0,0)
+ self.context.stroke()
+
+ return True
diff --git a/speak/widgets.py b/speak/widgets.py
new file mode 100644
index 0000000..e20ae35
--- /dev/null
+++ b/speak/widgets.py
@@ -0,0 +1,48 @@
+# 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
+
+from port.widgets import ComboBox
+
+import voice
+
+class Voices(ComboBox):
+ def __init__(self, face, **kwargs):
+ ComboBox.__init__(self, **kwargs)
+
+ self.face = face
+
+ voices = voice.allVoices()
+ voicenames = voices.keys()
+ voicenames.sort()
+
+ for name in voicenames:
+ self.append_item(voices[name], name)
+
+ self.select(voice.defaultVoice())
+
+ self.connect('changed', self._changed_cb)
+
+ def _changed_cb(self, widget):
+ self.face.status.voice = widget.props.value
+ self.face.say_notification(self.face.status.voice.friendlyname)
+
+ def resume(self, value):
+ try:
+ self.handler_block_by_func(self._changed_cb)
+ self.select(name=value)
+ self.face.status.voice = self.props.value
+ finally:
+ self.handler_unblock_by_func(self._changed_cb)
diff --git a/svgcard.py b/svgcard.py
new file mode 100644
index 0000000..6af4e3e
--- /dev/null
+++ b/svgcard.py
@@ -0,0 +1,407 @@
+# Copyright (C) 2007, 2008 One Laptop Per Child
+#
+# Muriel de Souza Godoi - muriel@laptop.org
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+from os.path import join, dirname
+import gc
+import rsvg
+import re
+import gtk
+import pango
+import logging
+
+from sugar.util import LRU
+
+import theme
+import face
+import speak.voice
+
+_logger = logging.getLogger('memorize-activity')
+
+class SvgCard(gtk.EventBox):
+
+ border_svg = join(dirname(__file__), 'images', 'card.svg')
+
+ # Default properties
+ default_props = {}
+ default_props['back'] = {'fill_color':'#b2b3b7', 'stroke_color':'#b2b3b7',
+ 'opacity':'1'}
+ default_props['back_h'] = {'fill_color':'#b2b3b7',
+ 'stroke_color':'#ffffff', 'opacity':'1'}
+ default_props['back_text'] = {'text_color':'#c7c8cc'}
+ default_props['front'] = {'fill_color':'#4c4d4f', 'stroke_color':'#ffffff',
+ 'opacity':'1'}
+ default_props['front_h'] = {'fill_color':'#555555',
+ 'stroke_color':'#888888', 'opacity':'1'}
+ default_props['front_text'] = {'text_color':'#ffffff'}
+
+ cache = {}
+
+ def __init__(self, identifier, pprops, jpeg, size,
+ align, sensor, bg_color='#000000'):
+ gtk.EventBox.__init__(self)
+
+ self.bg_color = bg_color
+ self.flipped = False
+ self.flipped_once = False
+ self.id = identifier
+ self.jpeg = jpeg
+ self.show_jpeg = False
+ self.show_text = False
+ self.size = size
+ self.align = align
+ self.text_layouts = [None, None]
+
+ self.sensor = sensor
+
+ self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(bg_color))
+ self.set_size_request(size, size)
+
+ # Views properties
+ views = ['back', 'back_h', 'back_text', 'front',
+ 'front_h', 'front_text']
+ self.pprops = pprops
+ self.props = {}
+ for view in views:
+ self.props[view] = {}
+ self.props[view].update(self.default_props[view])
+ self.props[view].update(pprops.get(view, {}))
+
+ if len(self.props['back_text'].get('card_text', '')) > 0:
+ self.show_text = True
+ self.current_face = 'back'
+
+ self.draw = gtk.DrawingArea()
+ self.draw.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(bg_color))
+ self.draw.set_events(gtk.gdk.ALL_EVENTS_MASK)
+ self.draw.connect('expose-event', self._expose_cb)
+ self.draw.connect('realize', self._realize_cb)
+ self.draw.show_all()
+
+ self.workspace = gtk.VBox()
+ self.workspace.add(self.draw)
+ self.add(self.workspace)
+ self.show_all()
+
+ #gc.collect()
+
+ def _realize_cb(self, widget):
+ self.gc = widget.window.new_gc()
+
+ def _expose_cb(self, widget, event):
+ pixbuf = self._read_icon_data(self.current_face)
+ widget.window.draw_pixbuf(None, pixbuf, 0, 0, 0, 0)
+
+ if self.show_jpeg:
+ widget.window.draw_pixbuf(None, self.jpeg, 0, 0,
+ theme.SVG_PAD, theme.SVG_PAD)
+
+ if self.show_text:
+ props = self.props[self.flipped and 'front_text' or 'back_text']
+ layout = self.text_layouts[self.flipped]
+
+ if not layout:
+ layout = self.text_layouts[self.flipped] = \
+ self.create_text_layout(props['card_text'])
+
+ width, height = layout.get_pixel_size()
+ y = (self.size - height)/2
+ if self.flipped:
+ if self.align == '2': # top
+ y = 0
+ elif self.align == '3': # bottom
+ y = self.size - height
+
+ widget.window.draw_layout(self.gc, layout=layout,
+ x=(self.size - width)/2, y=y,
+ foreground=gtk.gdk.color_parse(props['text_color']))
+
+ return False
+
+ def _read_icon_data(self, view):
+ icon_data = self.props[view]
+ key = str(self.size) + icon_data.get('fill_color') + \
+ icon_data.get('stroke_color')
+ if self.cache.has_key(key):
+ return self.cache[key]
+
+ icon_file = open(self.border_svg, 'r')
+ data = icon_file.read()
+ icon_file.close()
+
+ # Replace borders parameters
+ entity = '<!ENTITY fill_color "%s">' % icon_data.get('fill_color', '')
+ data = re.sub('<!ENTITY fill_color .*>', entity, data)
+
+ entity = '<!ENTITY stroke_color "%s">' % \
+ icon_data.get('stroke_color', '')
+ data = re.sub('<!ENTITY stroke_color .*>', entity, data)
+
+ entity = '<!ENTITY opacity "%s">' % icon_data.get('opacity', '')
+ data = re.sub('<!ENTITY opacity .*>', entity, data)
+
+ data = re.sub('size_card1', str(self.size), data)
+ data = re.sub('size_card2', str(self.size-6), data)
+ data = re.sub('size_card3', str(self.size-17), data)
+ pixbuf = rsvg.Handle(data=data).get_pixbuf()
+ self.cache[key] = pixbuf
+ return pixbuf
+
+ def set_border(self, stroke_color, fill_color):
+ self.props['front'].update({'fill_color' : fill_color,
+ 'stroke_color' : stroke_color})
+ self.queue_draw()
+ while gtk.events_pending():
+ gtk.main_iteration()
+
+ def set_pixbuf(self, pixbuf):
+ if pixbuf == None:
+ self.jpeg = None
+ self.show_jpeg = False
+ else:
+ if self.jpeg != None:
+ del self.jpeg
+
+ self.jpeg = pixbuf
+ del pixbuf
+ self.show_jpeg = True
+
+ self.queue_draw()
+ while gtk.events_pending():
+ gtk.main_iteration()
+
+ def get_pixbuf(self):
+ return self.jpeg
+
+ def set_highlight(self, status, mouse = False):
+ if self.flipped:
+ if mouse:
+ return
+ if status:
+ self.current_face = 'front_h'
+ else:
+ self.current_face = 'front'
+ else:
+ if status:
+ self.current_face = 'back_h'
+ else:
+ self.current_face = 'back'
+ self.queue_draw()
+
+ def flip(self, full_animation=False):
+ if self.flipped:
+ if self.id != -1 and self.get_speak():
+ speaking_face = face.acquire()
+ if speaking_face:
+ self._switch_to_face(speaking_face)
+ speaking_face.face.status.voice = \
+ speak.voice.by_name(self.get_speak())
+ self.speaktext = self.get_text().split('s~')[0]
+ speaking_face.face.say(self.speaktext)
+ return
+
+ if not self.flipped_once:
+ if self.jpeg is not None:
+ pixbuf_t = gtk.gdk.pixbuf_new_from_file(self.jpeg)
+ if pixbuf_t.get_width() != self.size - 22 \
+ or pixbuf_t.get_height() != self.size - 22:
+ self.jpeg = pixbuf_t.scale_simple(self.size - 22,
+ self.size - 22,
+ gtk.gdk.INTERP_BILINEAR)
+ del pixbuf_t
+ else:
+ self.jpeg = pixbuf_t
+ self.flipped_once = True
+
+ if self.jpeg is not None:
+ self.show_jpeg = True
+ text = self.props.get('front_text', {}).get('card_text', '')
+ if text != None and len(text) > 0:
+ self.show_text = True
+ else:
+ self.show_text = False
+
+ if full_animation:
+ if self.id != -1 and self.get_speak():
+ speaking_face = face.acquire()
+ if speaking_face:
+ self._switch_to_face(speaking_face)
+ speaking_face.face.status.voice = \
+ speak.voice.by_name(self.get_speak())
+ self.speaktext = self.get_text().split('s~')[0]
+ speaking_face.face.say(self.speaktext)
+
+ self.current_face = 'front'
+ self.flipped = True
+ self.queue_draw()
+
+ while gtk.events_pending():
+ gtk.main_iteration()
+
+ #gc.collect()
+
+ def animate(self, full_animation=False):
+ #if self.flipped:
+ # return
+
+ #if not self.flipped_once:
+ if self.jpeg is not None:
+ pixbuf_t = gtk.gdk.pixbuf_new_from_file(self.jpeg)
+ if pixbuf_t.get_width() != self.size - 22 \
+ or pixbuf_t.get_height() != self.size - 22:
+ self.jpeg = pixbuf_t.scale_simple(self.size - 22,
+ self.size - 22,
+ gtk.gdk.INTERP_BILINEAR)
+ del pixbuf_t
+ else:
+ self.jpeg = pixbuf_t
+ #self.flipped_once = True
+
+ if self.jpeg is not None:
+ self.show_jpeg = True
+ text = self.props.get('front_text', {}).get('card_text', '')
+ if text != None and len(text) > 0:
+ self.show_text = True
+ #else:
+ # self.show_text = False
+
+ if full_animation:
+ if self.id != -1 and self.get_speak():
+ speaking_face = face.acquire()
+ if speaking_face:
+ self._switch_to_face(speaking_face)
+ speaking_face.face.status.voice = \
+ speak.voice.by_name(self.get_speak())
+ self.speaktext = self.get_text().split('s~')[0]
+ speaking_face.face.say(self.speaktext)
+
+ self.current_face = 'front'
+ #self.flipped = True
+ self.queue_draw()
+
+ while gtk.events_pending():
+ gtk.main_iteration()
+
+ gc.collect()
+
+
+ def cement(self):
+ if not self.get_speak():
+ return
+ self._switch_to_face(self.draw)
+
+ def flop(self):
+ self.current_face = 'back'
+ if len(self.props['back_text'].get('card_text', '')) > 0:
+ self.show_text = True
+ else:
+ self.show_text = False
+ self.flipped = False
+ self.show_jpeg = False
+
+ if self.id != -1 and self.get_speak():
+ self._switch_to_face(self.draw)
+
+ self.queue_draw()
+
+ def _switch_to_face(self, widget):
+ for i in self.workspace.get_children():
+ self.workspace.remove(i)
+ self.workspace.add(widget)
+ widget.set_size_request(self.size, self.size)
+
+ def is_flipped(self):
+ return self.flipped
+
+ def get_id(self):
+ return self.id
+
+ def reset(self):
+ if self.flipped:
+ front_border = self.default_props.get('front_border')
+ fill_color = front_border.get('fill_color')
+ front_text = self.default_propsfront_text
+ stroke_color = front_text.get('front_border').get('stroke_color')
+ self.set_border(fill_color, stroke_color)
+ self.flop()
+
+ def create_text_layout(self, text):
+ key = (self.size, text)
+ if key in _text_layout_cache:
+ return _text_layout_cache[key]
+
+ max_lines_count = len([i for i in text.split(' ') if i])
+
+ for size in range(80, 66, -8) + range(66, 44, -6) + \
+ range(44, 24, -4) + range(24, 15, -2) + range(15, 7, -1):
+
+ card_size = self.size - theme.SVG_PAD * 2
+ layout = self.create_pango_layout(text)
+ layout.set_width(PIXELS_PANGO(card_size))
+ layout.set_wrap(pango.WRAP_WORD)
+ desc = pango.FontDescription('Deja Vu Sans bold ' + str(size))
+ layout.set_font_description(desc)
+
+ if layout.get_line_count() <= max_lines_count and \
+ layout.get_pixel_size()[0] <= card_size and \
+ layout.get_pixel_size()[1] <= card_size:
+ break
+
+ if layout.get_line_count() > 1:
+ # XXX for single line ALIGN_CENTER wrongly affects on text position
+ # and also in some cases for multilined text
+ layout.set_alignment(pango.ALIGN_CENTER)
+
+ _text_layout_cache[key] = layout
+
+ return layout
+
+ def set_background(self, color):
+ self.bg_color = color
+ self.draw.modify_bg(gtk.STATE_NORMAL,
+ gtk.gdk.color_parse(self.bg_color))
+
+ def change_text(self, newtext):
+ self.text_layouts[self.flipped] = None
+ self.props['front_text']['card_text'] = newtext
+ if len(newtext) > 0:
+ self.show_text = True
+ self.queue_draw()
+
+ def get_text(self):
+ return self.props['front_text'].get('card_text', '')
+
+ def set_sensor(self, value):
+ self.sensor = value
+
+ def change_sensor(self, value):
+ self.sensor = value
+
+ def get_sensor(self):
+ return self.sensor
+
+ def change_speak(self, value):
+ self.props['front_text']['speak'] = value
+
+ def get_speak(self):
+ return self.props['front_text'].get('speak')
+
+def PIXELS_PANGO(x):
+ return x * 1000
+
+_text_layout_cache = LRU(50)
diff --git a/svglabel.py b/svglabel.py
new file mode 100644
index 0000000..ef2ab74
--- /dev/null
+++ b/svglabel.py
@@ -0,0 +1,99 @@
+# Copyright (C) 2006, 2007, 2008 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import gtk, pygtk
+import rsvg
+import cairo
+import re
+
+class SvgLabel(gtk.DrawingArea):
+
+ filename = ''
+ fill_color = ''
+ stroke_color = ''
+ background_color = ''
+
+
+ def __init__(self, filename, fill_color, stroke_color, pixbuf = False, background_color = '', request_x = 45, request_y = 45):
+ gtk.DrawingArea.__init__(self)
+ self.set_size_request(request_x, request_y)
+ self.filename = filename
+ self.background_color = background_color
+ self.fill_color = fill_color
+ self.stroke_color = stroke_color
+ self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(background_color))
+ if pixbuf:
+ self.pixbuf = pixbuf
+ else:
+ self.pixbuf = self._read_icon_data(self.filename, self.fill_color, self.stroke_color)
+
+ self.connect('expose-event', self._expose_cb)
+
+ def _expose_cb(self, widget, event):
+ widget.window.draw_pixbuf(None, self.pixbuf, 0, 0, 0, 0)
+ return False
+
+ def _read_icon_data(self, filename, fill_color, stroke_color):
+ icon_file = open(filename, 'r')
+ data = icon_file.read()
+ icon_file.close()
+
+ if fill_color:
+ entity = '<!ENTITY fill_color "%s">' % fill_color
+ data = re.sub('<!ENTITY fill_color .*>', entity, data)
+
+ if stroke_color:
+ entity = '<!ENTITY stroke_color "%s">' % stroke_color
+ data = re.sub('<!ENTITY stroke_color .*>', entity, data)
+
+ self.data_size = len(data)
+ return rsvg.Handle(data=data).get_pixbuf()
+
+ def set_color(self, fill_color, stroke_color):
+ self.fill_color = fill_color
+ self.stroke_color = stroke_color
+ self.pixmap = self._read_icon_data(self.filename, self.fill_color, self.stroke_color)
+ self.queue_draw()
+
+ def set_fill_color(self, fill_color):
+ self.fill_color = fill_color
+ self.pixmap = self._read_icon_data(self.filename, self.fill_color, self.stroke_color)
+ self.queue_draw()
+
+ def get_fill_color(self):
+ return self.fill_color
+
+ def set_stroke_color(self, stroke_color):
+ self.stroke_color = stroke_color
+ self.pixmap = self._read_icon_data(self.filename, self.fill_color, self.stroke_color)
+ self.queue_draw()
+
+ def get_stroke_color(self):
+ return self.stroke_color
+
+ def get_pixbuf(self):
+ return self.pixbuf
+
+ def set_pixbuf(self, pixbuf):
+ self.pixbuf = pixbuf
+ self.queue_draw()
+
+ def set_background(self, background_color):
+ self.background_color = background_color
+ self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self.background_color))
+ self.queue_draw()
+
diff --git a/theme.py b/theme.py
new file mode 100644
index 0000000..4250629
--- /dev/null
+++ b/theme.py
@@ -0,0 +1,28 @@
+# Copyright (C) 2006, 2007, 2008 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+import gtk
+
+PAIR_SIZE = gtk.gdk.screen_width() / 5
+PAD = 10
+SVG_PAD = 10
+CARD_PAD = 4
+BODY_WIDTH = 45
+BODY_HEIGHT = 55
+STARS_COLS = 6
+SCORE_SIZE = 30
+FLOP_BACK_TIMEOUT = 2000