Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <marco@localhost.localdomain>2008-02-06 09:20:33 (GMT)
committer Marco Pesenti Gritti <marco@localhost.localdomain>2008-02-06 09:20:33 (GMT)
commit488402df7d37cf68d421229968632696a2a97bd7 (patch)
treeddc02e5244f67489658258c590bedfd076cc118d
parent44efc2a1315efe90eb2edc7a24b1372382222408 (diff)
Split sugar-toolkit out of sugar shell.
-rw-r--r--.gitignore57
-rw-r--r--COPYING.LIB504
-rw-r--r--Makefile.am16
-rw-r--r--README33
-rw-r--r--bin/.gitignore4
-rw-r--r--bin/Makefile.am14
-rw-r--r--bin/sugar-activity149
-rw-r--r--bin/sugar-backup11
-rw-r--r--bin/sugar-control-panel.in26
-rw-r--r--bin/sugar-emulator.in26
-rw-r--r--bin/sugar-install-bundle12
-rw-r--r--bin/sugar-launch86
-rw-r--r--bin/sugar-shell-service.in26
-rw-r--r--bin/sugar-shell.in26
-rw-r--r--bin/sugar.in8
-rw-r--r--configure.ac54
-rw-r--r--data/Makefile.am43
-rw-r--r--data/activities.defaults19
-rwxr-xr-xdata/em.py3302
-rw-r--r--data/gtkrc.em14
-rw-r--r--data/kbdconfig3
-rw-r--r--data/mime.defaults21
-rw-r--r--data/sugar.xml.in11
-rw-r--r--docs/GPL-C.txt18
-rw-r--r--docs/GPL-python.txt16
-rw-r--r--docs/LGPL-C.txt18
-rw-r--r--docs/LGPL-python.txt17
-rw-r--r--docs/controls.txt199
-rw-r--r--docs/design.txt126
-rw-r--r--lib/.gitignore1
-rw-r--r--lib/Makefile.am1
-rw-r--r--lib/sugar/.gitignore2
-rwxr-xr-xmaint-helper.py227
-rw-r--r--po/.gitignore3
-rw-r--r--po/ChangeLog0
-rw-r--r--po/POTFILES.in15
-rw-r--r--po/POTFILES.skip1
-rw-r--r--po/am.po420
-rw-r--r--po/ar.po436
-rw-r--r--po/ay.po420
-rw-r--r--po/bg.po428
-rw-r--r--po/bn.po419
-rw-r--r--po/bn_IN.po419
-rw-r--r--po/ca.po422
-rw-r--r--po/de.po432
-rw-r--r--po/dz.po420
-rw-r--r--po/el.po437
-rw-r--r--po/en.po420
-rw-r--r--po/es.po484
-rw-r--r--po/fa.po419
-rw-r--r--po/fa_AF.po419
-rw-r--r--po/ff.po420
-rw-r--r--po/fr.po467
-rw-r--r--po/ha.po447
-rw-r--r--po/hi.po419
-rw-r--r--po/ig.po448
-rw-r--r--po/is.po420
-rw-r--r--po/it.po517
-rw-r--r--po/ja.po494
-rw-r--r--po/ko.po420
-rw-r--r--po/mk.po432
-rw-r--r--po/ml.po420
-rw-r--r--po/mn.po419
-rw-r--r--po/ne.po419
-rw-r--r--po/nl.po420
-rw-r--r--po/pa.po420
-rw-r--r--po/pl.po485
-rw-r--r--po/ps.po424
-rw-r--r--po/pt.po419
-rw-r--r--po/pt_BR.po445
-rw-r--r--po/qu.po420
-rw-r--r--po/ro.po419
-rw-r--r--po/ru.po420
-rw-r--r--po/rw.po420
-rw-r--r--po/sugar.pot342
-rw-r--r--po/te.po425
-rw-r--r--po/th.po420
-rw-r--r--po/ur.po419
-rw-r--r--po/yo.po448
-rw-r--r--po/zh_CN.po420
-rw-r--r--po/zh_TW.po461
-rwxr-xr-xpylint.sh9
-rw-r--r--service/.gitignore1
-rw-r--r--service/Makefile.am33
-rw-r--r--service/__init__.py16
-rw-r--r--service/activityregistryservice.py134
-rw-r--r--service/bundleregistry.py151
-rw-r--r--service/clipboardobject.py122
-rw-r--r--service/clipboardservice.py212
-rw-r--r--service/config.py.in17
-rwxr-xr-xservice/main.py46
-rw-r--r--service/org.laptop.ActivityRegistry.service.in4
-rw-r--r--service/org.laptop.Clipboard.service.in4
-rw-r--r--service/org.laptop.ObjectTypeRegistry.service.in4
-rw-r--r--src/.gitignore1
-rw-r--r--src/Makefile.am11
-rw-r--r--src/__init__.py26
-rw-r--r--src/config.py.in18
-rw-r--r--src/controlpanel/Makefile.am5
-rw-r--r--src/controlpanel/__init__.py16
-rw-r--r--src/controlpanel/cmd.py80
-rw-r--r--src/controlpanel/control.py481
-rwxr-xr-xsrc/emulator.py156
-rw-r--r--src/hardware/Makefile.am13
-rw-r--r--src/hardware/NetworkManagerInfo.conf26
-rw-r--r--src/hardware/__init__.py16
-rw-r--r--src/hardware/hardwaremanager.py143
-rw-r--r--src/hardware/keydialog.py351
-rw-r--r--src/hardware/nmclient.py721
-rw-r--r--src/hardware/nminfo.py525
-rw-r--r--src/hardware/schoolserver.py45
-rw-r--r--src/intro/Makefile.am10
-rw-r--r--src/intro/__init__.py0
-rw-r--r--src/intro/colorpicker.py42
-rw-r--r--src/intro/default-picture.pngbin10442 -> 0 bytes
-rw-r--r--src/intro/glive.py196
-rw-r--r--src/intro/intro.py267
-rw-r--r--src/logsmanager.py54
-rw-r--r--src/main.py153
-rw-r--r--src/model/BuddyModel.py164
-rw-r--r--src/model/Friends.py114
-rw-r--r--src/model/Invites.py72
-rw-r--r--src/model/Makefile.am14
-rw-r--r--src/model/MeshModel.py235
-rw-r--r--src/model/Owner.py87
-rw-r--r--src/model/__init__.py16
-rw-r--r--src/model/accesspointmodel.py81
-rw-r--r--src/model/devices/Makefile.am8
-rw-r--r--src/model/devices/__init__.py16
-rw-r--r--src/model/devices/battery.py96
-rw-r--r--src/model/devices/device.py45
-rw-r--r--src/model/devices/devicesmodel.py136
-rw-r--r--src/model/devices/network/Makefile.am6
-rw-r--r--src/model/devices/network/__init__.py16
-rw-r--r--src/model/devices/network/mesh.py75
-rw-r--r--src/model/devices/network/wired.py28
-rw-r--r--src/model/devices/network/wireless.py96
-rw-r--r--src/model/homeactivity.py215
-rw-r--r--src/model/homemodel.py283
-rw-r--r--src/model/shellmodel.py112
-rw-r--r--src/shellservice.py130
-rw-r--r--src/view/ActivityHost.py118
-rw-r--r--src/view/BuddyIcon.py54
-rw-r--r--src/view/BuddyMenu.py113
-rw-r--r--src/view/Makefile.am14
-rw-r--r--src/view/OverlayWindow.py68
-rw-r--r--src/view/Shell.py298
-rw-r--r--src/view/__init__.py16
-rw-r--r--src/view/clipboardicon.py165
-rw-r--r--src/view/clipboardmenu.py223
-rw-r--r--src/view/devices/Makefile.am7
-rw-r--r--src/view/devices/__init__.py16
-rw-r--r--src/view/devices/battery.py100
-rw-r--r--src/view/devices/deviceview.py27
-rw-r--r--src/view/devices/network/Makefile.am6
-rw-r--r--src/view/devices/network/__init__.py16
-rw-r--r--src/view/devices/network/mesh.py125
-rw-r--r--src/view/devices/network/wired.py22
-rw-r--r--src/view/devices/network/wireless.py132
-rw-r--r--src/view/frame/Makefile.am14
-rw-r--r--src/view/frame/__init__.py16
-rw-r--r--src/view/frame/activitiestray.py159
-rw-r--r--src/view/frame/activitybutton.py65
-rw-r--r--src/view/frame/clipboardbox.py193
-rw-r--r--src/view/frame/clipboardpanelwindow.py99
-rw-r--r--src/view/frame/eventarea.py106
-rw-r--r--src/view/frame/frame.py272
-rw-r--r--src/view/frame/frameinvoker.py39
-rw-r--r--src/view/frame/framewindow.py104
-rw-r--r--src/view/frame/friendstray.py142
-rw-r--r--src/view/frame/overlaybox.py32
-rw-r--r--src/view/frame/zoomtoolbar.py84
-rw-r--r--src/view/home/FriendView.py86
-rw-r--r--src/view/home/FriendsBox.py67
-rw-r--r--src/view/home/HomeBox.py287
-rw-r--r--src/view/home/HomeWindow.py141
-rw-r--r--src/view/home/Makefile.am14
-rw-r--r--src/view/home/MeshBox.py615
-rw-r--r--src/view/home/MyIcon.py24
-rw-r--r--src/view/home/__init__.py16
-rwxr-xr-xsrc/view/home/activitiesdonut.py556
-rwxr-xr-xsrc/view/home/proc_smaps.py107
-rw-r--r--src/view/home/snowflakelayout.py108
-rw-r--r--src/view/home/spreadlayout.py246
-rw-r--r--src/view/home/transitionbox.py93
-rw-r--r--src/view/keyhandler.py237
-rw-r--r--src/view/pulsingicon.py90
-rw-r--r--sugar/.gitignore4
-rw-r--r--sugar/.license (renamed from lib/sugar/.license)0
-rw-r--r--sugar/Makefile.am (renamed from lib/sugar/Makefile.am)4
-rw-r--r--sugar/_sugarext.defs (renamed from lib/sugar/_sugarext.defs)0
-rw-r--r--sugar/_sugarext.override (renamed from lib/sugar/_sugarext.override)0
-rw-r--r--sugar/_sugarextmodule.c (renamed from lib/sugar/_sugarextmodule.c)0
-rw-r--r--sugar/activity/Makefile.am (renamed from lib/sugar/activity/Makefile.am)0
-rw-r--r--sugar/activity/__init__.py (renamed from lib/sugar/activity/__init__.py)0
-rw-r--r--sugar/activity/__init__py (renamed from lib/sugar/activity/__init__py)0
-rw-r--r--sugar/activity/activity.py (renamed from lib/sugar/activity/activity.py)0
-rw-r--r--sugar/activity/activityfactory.py (renamed from lib/sugar/activity/activityfactory.py)0
-rw-r--r--sugar/activity/activityhandle.py (renamed from lib/sugar/activity/activityhandle.py)0
-rw-r--r--sugar/activity/activityservice.py (renamed from lib/sugar/activity/activityservice.py)0
-rw-r--r--sugar/activity/bundlebuilder.py (renamed from lib/sugar/activity/bundlebuilder.py)0
-rw-r--r--sugar/activity/registry.py (renamed from lib/sugar/activity/registry.py)0
-rw-r--r--sugar/bundle/Makefile.am (renamed from lib/sugar/bundle/Makefile.am)0
-rw-r--r--sugar/bundle/__init__.py (renamed from lib/sugar/bundle/__init__.py)0
-rw-r--r--sugar/bundle/activitybundle.py (renamed from lib/sugar/bundle/activitybundle.py)0
-rw-r--r--sugar/bundle/bundle.py (renamed from lib/sugar/bundle/bundle.py)0
-rw-r--r--sugar/bundle/contentbundle.py (renamed from lib/sugar/bundle/contentbundle.py)0
-rw-r--r--sugar/clipboard/Makefile.am (renamed from lib/sugar/clipboard/Makefile.am)0
-rw-r--r--sugar/clipboard/__init__.py (renamed from lib/sugar/clipboard/__init__.py)0
-rw-r--r--sugar/clipboard/clipboardservice.py (renamed from lib/sugar/clipboard/clipboardservice.py)0
-rw-r--r--sugar/datastore/Makefile.am (renamed from lib/sugar/datastore/Makefile.am)0
-rw-r--r--sugar/datastore/__init__.py (renamed from lib/sugar/datastore/__init__.py)0
-rw-r--r--sugar/datastore/datastore.py (renamed from lib/sugar/datastore/datastore.py)0
-rw-r--r--sugar/datastore/dbus_helpers.py (renamed from lib/sugar/datastore/dbus_helpers.py)0
-rw-r--r--sugar/eggaccelerators.c (renamed from lib/sugar/eggaccelerators.c)0
-rw-r--r--sugar/eggaccelerators.h (renamed from lib/sugar/eggaccelerators.h)0
-rw-r--r--sugar/env.py (renamed from lib/sugar/env.py)0
-rw-r--r--sugar/graphics/Makefile.am (renamed from lib/sugar/graphics/Makefile.am)0
-rw-r--r--sugar/graphics/__init__.py (renamed from lib/sugar/graphics/__init__.py)0
-rw-r--r--sugar/graphics/alert.py (renamed from lib/sugar/graphics/alert.py)0
-rw-r--r--sugar/graphics/animator.py (renamed from lib/sugar/graphics/animator.py)0
-rw-r--r--sugar/graphics/combobox.py (renamed from lib/sugar/graphics/combobox.py)0
-rw-r--r--sugar/graphics/entry.py (renamed from lib/sugar/graphics/entry.py)0
-rw-r--r--sugar/graphics/icon.py (renamed from lib/sugar/graphics/icon.py)0
-rw-r--r--sugar/graphics/iconentry.py (renamed from lib/sugar/graphics/iconentry.py)0
-rw-r--r--sugar/graphics/menuitem.py (renamed from lib/sugar/graphics/menuitem.py)0
-rw-r--r--sugar/graphics/notebook.py (renamed from lib/sugar/graphics/notebook.py)0
-rw-r--r--sugar/graphics/objectchooser.py (renamed from lib/sugar/graphics/objectchooser.py)0
-rw-r--r--sugar/graphics/palette.py (renamed from lib/sugar/graphics/palette.py)0
-rw-r--r--sugar/graphics/palettegroup.py (renamed from lib/sugar/graphics/palettegroup.py)0
-rw-r--r--sugar/graphics/panel.py (renamed from lib/sugar/graphics/panel.py)0
-rw-r--r--sugar/graphics/radiotoolbutton.py (renamed from lib/sugar/graphics/radiotoolbutton.py)0
-rw-r--r--sugar/graphics/roundbox.py (renamed from lib/sugar/graphics/roundbox.py)0
-rw-r--r--sugar/graphics/style.py (renamed from lib/sugar/graphics/style.py)0
-rw-r--r--sugar/graphics/toggletoolbutton.py (renamed from lib/sugar/graphics/toggletoolbutton.py)0
-rw-r--r--sugar/graphics/toolbox.py (renamed from lib/sugar/graphics/toolbox.py)0
-rw-r--r--sugar/graphics/toolbutton.py (renamed from lib/sugar/graphics/toolbutton.py)0
-rw-r--r--sugar/graphics/toolcombobox.py (renamed from lib/sugar/graphics/toolcombobox.py)0
-rw-r--r--sugar/graphics/tray.py (renamed from lib/sugar/graphics/tray.py)0
-rw-r--r--sugar/graphics/window.py (renamed from lib/sugar/graphics/window.py)0
-rw-r--r--sugar/graphics/xocolor.py (renamed from lib/sugar/graphics/xocolor.py)0
-rw-r--r--sugar/network.py (renamed from lib/sugar/network.py)0
-rw-r--r--sugar/presence/Makefile.am (renamed from lib/sugar/presence/Makefile.am)0
-rw-r--r--sugar/presence/__init__.py (renamed from lib/sugar/presence/__init__.py)0
-rw-r--r--sugar/presence/activity.py (renamed from lib/sugar/presence/activity.py)0
-rw-r--r--sugar/presence/buddy.py (renamed from lib/sugar/presence/buddy.py)0
-rw-r--r--sugar/presence/presenceservice.py (renamed from lib/sugar/presence/presenceservice.py)0
-rw-r--r--sugar/presence/test_presence.txt (renamed from lib/sugar/presence/test_presence.txt)0
-rw-r--r--sugar/presence/tubeconn.py (renamed from lib/sugar/presence/tubeconn.py)0
-rw-r--r--sugar/profile.py (renamed from lib/sugar/profile.py)0
-rw-r--r--sugar/sexy-icon-entry.c (renamed from lib/sugar/sexy-icon-entry.c)0
-rw-r--r--sugar/sexy-icon-entry.h (renamed from lib/sugar/sexy-icon-entry.h)0
-rw-r--r--sugar/sugar-address-entry.c (renamed from lib/sugar/sugar-address-entry.c)0
-rw-r--r--sugar/sugar-address-entry.h (renamed from lib/sugar/sugar-address-entry.h)0
-rw-r--r--sugar/sugar-key-grabber.c (renamed from lib/sugar/sugar-key-grabber.c)0
-rw-r--r--sugar/sugar-key-grabber.h (renamed from lib/sugar/sugar-key-grabber.h)0
-rw-r--r--sugar/sugar-marshal.list (renamed from lib/sugar/sugar-marshal.list)0
-rw-r--r--sugar/sugar-menu.c (renamed from lib/sugar/sugar-menu.c)0
-rw-r--r--sugar/sugar-menu.h (renamed from lib/sugar/sugar-menu.h)0
-rw-r--r--sugar/sugar-preview.c (renamed from lib/sugar/sugar-preview.c)0
-rw-r--r--sugar/sugar-preview.h (renamed from lib/sugar/sugar-preview.h)0
-rw-r--r--sugar/util.py (renamed from lib/sugar/util.py)0
-rw-r--r--sugar/wm.py (renamed from lib/sugar/wm.py)0
263 files changed, 31 insertions, 35736 deletions
diff --git a/.gitignore b/.gitignore
index 5ecb9c7..37411ad 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,58 +1,23 @@
-# Generic
-
+*.la
+*.lo
*.pyc
*~
+.deps
+.libs
+
+py-compile
Makefile
Makefile.in
-*.deps
-*.libs
-*.la
-*.o
-*.lo
-*.loT
-.*.sw?
-*.service
-stamp-*
-
-# Absolute
-
aclocal.m4
autom4te.cache
-config.h
-config.h.in
+config.guess
config.log
config.status
-configure
-compile
-install-sh
-missing
-py-compile
-dbus-installed.conf
-intltool-extract
-intltool-extract.in
-intltool-merge
-intltool-merge.in
-intltool-update
-intltool-update.in
-mkinstalldirs
-po/Makefile.in.in
-po/POTFILES
-po/*.gmo
-po/.intltool-merge-cache
-sugar/__installed__.py
-tools/sugar-setup-activity
-threadframe
-config.guess
config.sub
+configure
depcomp
+install-sh
+intltool-*
libtool
ltmain.sh
-m4/intltool.m4
-sugar/browser/_sugarbrowser.c
-browser/sugar-marshal.c
-browser/sugar-marshal.h
-bin/sugar
-shell/extensions/_extensions.c
-data/sugar.gtkrc
-data/sugar.xml
-data/sugar-xo.gtkrc
+missing
diff --git a/COPYING.LIB b/COPYING.LIB
deleted file mode 100644
index 5ab7695..0000000
--- a/COPYING.LIB
+++ /dev/null
@@ -1,504 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 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.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-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 and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, 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 library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete 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 distribute a copy of this License along with the
-Library.
-
- 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 Library or any portion
-of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-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 Library, 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 Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you 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.
-
- If distribution of 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 satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be 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.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library 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.
-
- 9. 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 Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-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 with
-this License.
-
- 11. 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 Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library 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 Library.
-
-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.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library 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.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser 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 Library
-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 Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-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
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "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
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. 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 LIBRARY 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
-LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. 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 library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/Makefile.am b/Makefile.am
index 0c2d35b..16f4831 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,17 +1,3 @@
ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = bin data lib po src service
-
-DISTCLEANFILES = \
- intltool-extract \
- intltool-merge \
- intltool-update
-
-EXTRA_DIST = \
- $(bin_SCRIPTS) \
- COPYING.LIB \
- intltool-merge.in \
- intltool-update.in \
- intltool-extract.in
-
-DISTCHECK_CONFIGURE_FLAGS = --disable-update-mimedb
+SUBDIRS = sugar
diff --git a/README b/README
index 9cdd6a9..e69de29 100644
--- a/README
+++ b/README
@@ -1,33 +0,0 @@
-Building
-========
-
-See:
-http://wiki.laptop.org/go/Sugar_with_sugar-jhbuild
-
-Running multiple instances on the same machine
-==============================================
-
-You can use the SUGAR_PROFILE command line options.
-For example:
-
-SUGAR_PROFILE=profile-1 sugar
-SUGAR_PROFILE=profile-2 sugar
-...
-
-
-Emulator key bindings
-=====================
-
-F1 Mesh zoom level
-F2 Friends zoom level
-F3 Home zoom level
-F4 Activity zoom level
-
-Alt+f Show the frame
-Alt+r Rotate the screen
-Alt+o Toggle overlay visibility
-Alt+= Open the developer console
-Alt+0 Open the developer console
-Alt+q Quit the emulator
-
-Ctrl+s Activate sketch mode in chat
diff --git a/bin/.gitignore b/bin/.gitignore
deleted file mode 100644
index 99544b2..0000000
--- a/bin/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-sugar-control-panel
-sugar-emulator
-sugar-shell
-sugar-shell-service
diff --git a/bin/Makefile.am b/bin/Makefile.am
deleted file mode 100644
index ca6ddef..0000000
--- a/bin/Makefile.am
+++ /dev/null
@@ -1,14 +0,0 @@
-bin_SCRIPTS = \
- sugar \
- sugar-activity \
- sugar-backup \
- sugar-control-panel \
- sugar-emulator \
- sugar-install-bundle \
- sugar-launch \
- sugar-shell \
- sugar-shell-service
-
-EXTRA_DIST = $(bin_SCRIPTS) sugar.in
-
-DISTCLEANFILES = sugar
diff --git a/bin/sugar-activity b/bin/sugar-activity
deleted file mode 100644
index c01b263..0000000
--- a/bin/sugar-activity
+++ /dev/null
@@ -1,149 +0,0 @@
-#!/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
-
-import os
-import sys
-import gettext
-from optparse import OptionParser
-
-import pygtk
-pygtk.require('2.0')
-import gtk
-import dbus
-import dbus.service
-import dbus.glib
-
-from sugar.activity import activityhandle
-from sugar.bundle.activitybundle import ActivityBundle
-from sugar import _sugarbaseext
-from sugar import logger
-
-activity_instances = []
-
-def activity_destroy_cb(window):
- activity_instances.remove(window)
- if len(activity_instances) == 0:
- gtk.main_quit()
-
-def create_activity_instance(constructor, handle):
- activity = constructor(handle)
- activity.connect('destroy', activity_destroy_cb)
- activity.show()
-
- activity_instances.append(activity)
-
-def get_single_process_name(bundle_id):
- return bundle_id
-
-def get_single_process_path(bundle_id):
- return '/' + bundle_id.replace('.', '/')
-
-class SingleProcess(dbus.service.Object):
- def __init__(self, service_name, constructor):
- self.constructor = constructor
-
- bus = dbus.SessionBus()
- bus_name = dbus.service.BusName(service_name, bus = bus)
- object_path = get_single_process_path(service_name)
- dbus.service.Object.__init__(self, bus_name, object_path)
-
- @dbus.service.method("org.laptop.SingleProcess", in_signature="a{ss}")
- def create(self, handle_dict):
- handle = activityhandle.create_from_dict(handle_dict)
- create_activity_instance(self.constructor, handle)
-
-parser = OptionParser()
-parser.add_option("-b", "--bundle-id", dest="bundle_id",
- help="identifier of the activity bundle")
-parser.add_option("-a", "--activity-id", dest="activity_id",
- help="identifier of the activity instance")
-parser.add_option("-o", "--object-id", dest="object_id",
- help="identifier of the associated datastore object")
-parser.add_option("-u", "--uri", dest="uri",
- help="URI to load")
-parser.add_option('-s', '--single-process', dest='single_process',
- action='store_true',
- help='start all the instances in the same process')
-(options, args) = parser.parse_args()
-
-logger.start()
-
-if 'SUGAR_BUNDLE_PATH' not in os.environ:
- print 'SUGAR_BUNDLE_PATH is not defined in the environment.'
- sys.exit(1)
-
-if len(args) == 0:
- print 'A python class must be specified as first argument.'
- sys.exit(1)
-
-bundle_path = os.environ['SUGAR_BUNDLE_PATH']
-sys.path.append(bundle_path)
-
-bundle = ActivityBundle(bundle_path)
-
-os.environ['SUGAR_BUNDLE_ID'] = bundle.get_bundle_id()
-os.environ['SUGAR_BUNDLE_NAME'] = bundle.get_name()
-
-gtk.icon_theme_get_default().append_search_path(bundle.get_icons_path())
-
-gettext.bindtextdomain(bundle.get_bundle_id(),
- bundle.get_locale_path())
-gettext.textdomain(bundle.get_bundle_id())
-
-splitted_module = args[0].rsplit('.', 1)
-module_name = splitted_module[0]
-class_name = splitted_module[1]
-
-module = __import__(module_name)
-for comp in module_name.split('.')[1:]:
- module = getattr(module, comp)
-
-constructor = getattr(module, class_name)
-handle = activityhandle.ActivityHandle(
- activity_id=options.activity_id,
- object_id=options.object_id, uri=options.uri)
-
-if options.single_process is True:
- bus = dbus.SessionBus()
-
- service_name = get_single_process_name(options.bundle_id)
- service_path = get_single_process_path(options.bundle_id)
-
- bus_object = bus.get_object(
- 'org.freedesktop.DBus', '/org/freedesktop/DBus')
- try:
- name = bus_object.GetNameOwner(
- service_name, dbus_interface='org.freedesktop.DBus')
- except dbus.DBusException:
- name = None
-
- if not name:
- service = SingleProcess(service_name, constructor)
- else:
- single_process = bus.get_object(service_name, service_path)
- single_process.create(handle.get_dict())
-
- print 'Created %s in a single process.' % service_name
- sys.exit(0)
-
-if hasattr(module, 'start'):
- module.start()
-
-create_activity_instance(constructor, handle)
-
-gtk.main()
diff --git a/bin/sugar-backup b/bin/sugar-backup
deleted file mode 100644
index c90da63..0000000
--- a/bin/sugar-backup
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import time
-
-i = 0
-while i <= 100:
- time.sleep(0.5)
- sys.stdout.write('%d\n' % i)
- sys.stdout.flush()
- i += 5
diff --git a/bin/sugar-control-panel.in b/bin/sugar-control-panel.in
deleted file mode 100644
index 922f95c..0000000
--- a/bin/sugar-control-panel.in
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env python
-# Copyright (C) 2008, 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
-
-import sys
-
-sys.path.insert(0, '@prefix@/share/sugar/shell')
-
-from controlpanel.cmd import main
-
-main()
-
-
diff --git a/bin/sugar-emulator.in b/bin/sugar-emulator.in
deleted file mode 100644
index 1ee6fc5..0000000
--- a/bin/sugar-emulator.in
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env python
-# Copyright (C) 2008, 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
-
-import sys
-
-sys.path.insert(0, '@prefix@/share/sugar/shell')
-
-from emulator import main
-
-main()
-
-
diff --git a/bin/sugar-install-bundle b/bin/sugar-install-bundle
deleted file mode 100644
index ce28977..0000000
--- a/bin/sugar-install-bundle
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/env python
-import sys
-
-from sugar.bundle.activitybundle import ActivityBundle
-
-from dbus.mainloop.glib import DBusGMainLoop
-DBusGMainLoop(set_as_default=True)
-
-bundle = ActivityBundle(sys.argv[1])
-bundle.install()
-
-print "%s: '%s' installed." % (sys.argv[0], sys.argv[1])
diff --git a/bin/sugar-launch b/bin/sugar-launch
deleted file mode 100644
index a0a5387..0000000
--- a/bin/sugar-launch
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (C) 2007, 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
-
-import os
-import sys
-from optparse import OptionParser
-
-from sugar import env
-from sugar.activity import activityfactory
-from sugar.activity.registry import get_registry
-
-usage = "usage: %prog [options] activity"
-parser = OptionParser(usage)
-parser.add_option("-d", "--debug", action="store_true", dest="debug",
- help="launch activity inside gdb")
-(options, args) = parser.parse_args()
-
-if len(args) == 0:
- print 'You need to specify the activity name or part of it.'
- sys.exit(1)
-
-registry = get_registry()
-activities = registry.find_activity(args[0])
-if len(activities) == 0:
- print 'Activity not found.'
-
-activity = activities[0]
-cmd_args = activityfactory.get_command(activity)
-
-def _which(exec_file):
- if 'PATH' in os.environ:
- envpath = os.environ['PATH']
- else:
- envpath = defpath
-
- for path in envpath.split(os.pathsep):
- fullname = os.path.join(path, exec_file)
- if os.path.exists(fullname):
- return fullname
-
- return None
-
-def _get_interpreter(exec_file):
- if os.path.exists(exec_file):
- abs_path = exec_file
- else:
- abs_path = _which(exec_file)
- if not abs_path:
- return exec_file
-
- f = open(abs_path)
- line = f.readline(100)
- if line.startswith('#!'):
- cmds = line[2:].strip().split(' ')
- cmds.append(abs_path)
-
- if '/usr/bin/env' in cmds:
- cmds.remove('/usr/bin/env')
-
- return cmds
-
- return exec_file
-
-if options.debug:
- act_args = cmd_args
- cmd_args = ['gdb', '--args']
- cmd_args.extend(_get_interpreter(act_args.pop(0)))
- cmd_args.extend(act_args)
-
-os.execvpe(cmd_args[0], cmd_args, activityfactory.get_environment(activity))
-
diff --git a/bin/sugar-shell-service.in b/bin/sugar-shell-service.in
deleted file mode 100644
index e88ea65..0000000
--- a/bin/sugar-shell-service.in
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env python
-# Copyright (C) 2008, 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
-
-import sys
-
-sys.path.insert(0, '@prefix@/share/sugar/service')
-
-from main import main
-
-main()
-
-
diff --git a/bin/sugar-shell.in b/bin/sugar-shell.in
deleted file mode 100644
index 2b73c4a..0000000
--- a/bin/sugar-shell.in
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env python
-# Copyright (C) 2008, 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
-
-import sys
-
-sys.path.insert(0, '@prefix@/share/sugar/shell')
-
-from main import main
-
-main()
-
-
diff --git a/bin/sugar.in b/bin/sugar.in
deleted file mode 100644
index 88b4168..0000000
--- a/bin/sugar.in
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-
-export GTK2_RC_FILES=@prefix@/share/sugar/data/sugar-xo.gtkrc
-if [ -f /etc/olpc-security ] ; then
- exec dbus-launch --exit-with-session --config-file=/etc/dbus-1/session-olpc.conf sugar-shell
-else
- exec dbus-launch --exit-with-session sugar-shell
-fi
diff --git a/configure.ac b/configure.ac
index 8af8f4e..e026b6f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT([Sugar],[0.75.0],[],[sugar])
+AC_INIT([sugar-toolkit],[0.79.0],[],[sugar-toolkit])
AC_PREREQ([2.59])
@@ -17,62 +17,28 @@ AM_CHECK_PYTHON_HEADERS(,[AC_MSG_ERROR(could not find Python headers)])
AC_PATH_PROG(PYGTK_CODEGEN, pygtk-codegen-2.0, no)
-PKG_CHECK_MODULES(SHELL, pygtk-2.0 gtk+-2.0)
-
-PKG_CHECK_MODULES(LIB, pygtk-2.0 gtk+-2.0)
+PKG_CHECK_MODULES(EXT, pygtk-2.0 gtk+-2.0)
PYGTK_DEFSDIR=`$PKG_CONFIG --variable=defsdir pygtk-2.0`
AC_SUBST(PYGTK_DEFSDIR)
# Setup GETTEXT
#
-ALL_LINGUAS="am ar ay bn de dz el en es fa fr ha hi ig is it ja ko mk ml ne nl pa pl pt pt_BR qu ro ru rw th ur yo zh_CN zh_TW"
+ALL_LINGUAS=""
GETTEXT_PACKAGE=sugar
AC_PROG_INTLTOOL([0.33])
AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext package])
AM_GLIB_GNU_GETTEXT
-AC_ARG_ENABLE(update-mimedb,
- AC_HELP_STRING([--disable-update-mimedb],
- [disable the update-mime-database after install [default=no]]),,
- enable_update_mimedb=yes)
-AM_CONDITIONAL(ENABLE_UPDATE_MIMEDB, test x$enable_update_mimedb = xyes)
-
-AC_CONFIG_FILES([
-bin/sugar
-bin/sugar-control-panel
-bin/sugar-emulator
-bin/sugar-shell
-bin/sugar-shell-service
-service/config.py
-src/config.py
-])
-
AC_OUTPUT([
Makefile
-bin/Makefile
-data/Makefile
-lib/Makefile
-lib/sugar/Makefile
-lib/sugar/activity/Makefile
-lib/sugar/bundle/Makefile
-lib/sugar/clipboard/Makefile
-lib/sugar/graphics/Makefile
-lib/sugar/presence/Makefile
-lib/sugar/datastore/Makefile
-service/Makefile
-src/Makefile
-src/controlpanel/Makefile
-src/intro/Makefile
-src/hardware/Makefile
-src/view/Makefile
-src/view/devices/Makefile
-src/view/devices/network/Makefile
-src/view/frame/Makefile
-src/view/home/Makefile
-src/model/Makefile
-src/model/devices/Makefile
-src/model/devices/network/Makefile
+sugar/Makefile
+sugar/activity/Makefile
+sugar/bundle/Makefile
+sugar/clipboard/Makefile
+sugar/graphics/Makefile
+sugar/presence/Makefile
+sugar/datastore/Makefile
po/Makefile.in
])
diff --git a/data/Makefile.am b/data/Makefile.am
deleted file mode 100644
index dcf2087..0000000
--- a/data/Makefile.am
+++ /dev/null
@@ -1,43 +0,0 @@
-sugar.gtkrc: gtkrc.em
- $(srcdir)/em.py -D theme=\'sugar\' $(srcdir)/gtkrc.em > \
- $(top_builddir)/data/sugar.gtkrc
-
-sugar-xo.gtkrc: gtkrc.em
- $(srcdir)/em.py -D theme=\'sugar-xo\' $(srcdir)/gtkrc.em > \
- $(top_builddir)/data/sugar-xo.gtkrc
-
-sugardir = $(pkgdatadir)/data
-sugar_DATA = \
- activities.defaults \
- kbdconfig \
- mime.defaults \
- $(GTKRC_FILES)
-
-GTKRC_FILES = \
- sugar.gtkrc \
- sugar-xo.gtkrc
-
-
-mime_xml_in_files = sugar.xml.in
-mime_xml_files = $(mime_xml_in_files:.xml.in=.xml)
-@INTLTOOL_XML_RULE@
-
-mimedir = $(datadir)/mime/packages
-mime_DATA = $(mime_xml_files)
-
-install-data-hook:
-if ENABLE_UPDATE_MIMEDB
- if [ -z "$$DESTDIR" ]; then \
- update-mime-database "$(datadir)/mime"; \
- fi
-endif
-
-uninstall-hook:
-if ENABLE_UPDATE_MIMEDB
- if [ -z "$$DESTDIR" ]; then \
- update-mime-database "$(datadir)/mime"; \
- fi
-endif
-
-EXTRA_DIST = $(sugar_DATA) $(mime_xml_in_files) em.py gtkrc.em
-CLEANFILES = $(GTKRC_FILES) $(mime_xml_files)
diff --git a/data/activities.defaults b/data/activities.defaults
deleted file mode 100644
index af368f0..0000000
--- a/data/activities.defaults
+++ /dev/null
@@ -1,19 +0,0 @@
-# Ordered list of the activities displayed in the frame
-
-org.laptop.Chat
-org.laptop.WebActivity
-org.laptop.AbiWordActivity
-org.laptop.RecordActivity
-org.laptop.Oficina
-org.laptop.TamTamMini
-org.vpri.EtoysActivity
-org.laptop.TurtleArtActivity
-org.laptop.Pippy
-org.laptop.Calculate
-org.laptop.Terminal
-org.laptop.MeasureActivity
-org.laptop.AcousticMeasure
-org.laptop.Memorize
-org.laptop.TamTamJam
-org.laptop.TamTamEdit
-org.laptop.TamTamSynthLab
diff --git a/data/em.py b/data/em.py
deleted file mode 100755
index 165d29e..0000000
--- a/data/em.py
+++ /dev/null
@@ -1,3302 +0,0 @@
-#!/usr/bin/env python
-#
-# $Id: //projects/empy/em.py#146 $ $Date: 2003/10/27 $
-
-# 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
-
-"""
-A system for processing Python as markup embedded in text.
-"""
-
-
-__program__ = 'empy'
-__version__ = '3.3'
-__url__ = 'http://www.alcyone.com/software/empy/'
-__author__ = 'Erik Max Francis <max@alcyone.com>'
-__copyright__ = 'Copyright (C) 2002-2003 Erik Max Francis'
-__license__ = 'LGPL'
-
-
-import copy
-import getopt
-import os
-import re
-import string
-import sys
-import types
-
-try:
- # The equivalent of import cStringIO as StringIO.
- import cStringIO
- StringIO = cStringIO
- del cStringIO
-except ImportError:
- import StringIO
-
-# For backward compatibility, we can't assume these are defined.
-False, True = 0, 1
-
-# Some basic defaults.
-FAILURE_CODE = 1
-DEFAULT_PREFIX = '@'
-DEFAULT_PSEUDOMODULE_NAME = 'empy'
-DEFAULT_SCRIPT_NAME = '?'
-SIGNIFICATOR_RE_SUFFIX = r"%(\S+)\s*(.*)\s*$"
-SIGNIFICATOR_RE_STRING = DEFAULT_PREFIX + SIGNIFICATOR_RE_SUFFIX
-BANGPATH = '#!'
-DEFAULT_CHUNK_SIZE = 8192
-DEFAULT_ERRORS = 'strict'
-
-# Character information.
-IDENTIFIER_FIRST_CHARS = '_abcdefghijklmnopqrstuvwxyz' \
- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-IDENTIFIER_CHARS = IDENTIFIER_FIRST_CHARS + '0123456789.'
-ENDING_CHARS = {'(': ')', '[': ']', '{': '}'}
-
-# Environment variable names.
-OPTIONS_ENV = 'EMPY_OPTIONS'
-PREFIX_ENV = 'EMPY_PREFIX'
-PSEUDO_ENV = 'EMPY_PSEUDO'
-FLATTEN_ENV = 'EMPY_FLATTEN'
-RAW_ENV = 'EMPY_RAW_ERRORS'
-INTERACTIVE_ENV = 'EMPY_INTERACTIVE'
-BUFFERED_ENV = 'EMPY_BUFFERED_OUTPUT'
-NO_OVERRIDE_ENV = 'EMPY_NO_OVERRIDE'
-UNICODE_ENV = 'EMPY_UNICODE'
-INPUT_ENCODING_ENV = 'EMPY_UNICODE_INPUT_ENCODING'
-OUTPUT_ENCODING_ENV = 'EMPY_UNICODE_OUTPUT_ENCODING'
-INPUT_ERRORS_ENV = 'EMPY_UNICODE_INPUT_ERRORS'
-OUTPUT_ERRORS_ENV = 'EMPY_UNICODE_OUTPUT_ERRORS'
-
-# Interpreter options.
-BANGPATH_OPT = 'processBangpaths' # process bangpaths as comments?
-BUFFERED_OPT = 'bufferedOutput' # fully buffered output?
-RAW_OPT = 'rawErrors' # raw errors?
-EXIT_OPT = 'exitOnError' # exit on error?
-FLATTEN_OPT = 'flatten' # flatten pseudomodule namespace?
-OVERRIDE_OPT = 'override' # override sys.stdout with proxy?
-CALLBACK_OPT = 'noCallbackError' # is no custom callback an error?
-
-# Usage info.
-OPTION_INFO = [
-("-V --version", "Print version and exit"),
-("-h --help", "Print usage and exit"),
-("-H --extended-help", "Print extended usage and exit"),
-("-k --suppress-errors", "Do not exit on errors; go interactive"),
-("-p --prefix=<char>", "Change prefix to something other than @"),
-(" --no-prefix", "Do not do any markup processing at all"),
-("-m --module=<name>", "Change the internal pseudomodule name"),
-("-f --flatten", "Flatten the members of pseudmodule to start"),
-("-r --raw-errors", "Show raw Python errors"),
-("-i --interactive", "Go into interactive mode after processing"),
-("-n --no-override-stdout", "Do not override sys.stdout with proxy"),
-("-o --output=<filename>", "Specify file for output as write"),
-("-a --append=<filename>", "Specify file for output as append"),
-("-b --buffered-output", "Fully buffer output including open"),
-(" --binary", "Treat the file as a binary"),
-(" --chunk-size=<chunk>", "Use this chunk size for reading binaries"),
-("-P --preprocess=<filename>", "Interpret EmPy file before main processing"),
-("-I --import=<modules>", "Import Python modules before processing"),
-("-D --define=<definition>", "Execute Python assignment statement"),
-("-E --execute=<statement>", "Execute Python statement before processing"),
-("-F --execute-file=<filename>", "Execute Python file before processing"),
-(" --pause-at-end", "Prompt at the ending of processing"),
-(" --relative-path", "Add path of EmPy script to sys.path"),
-(" --no-callback-error", "Custom markup without callback is error"),
-(" --no-bangpath-processing", "Suppress bangpaths as comments"),
-("-u --unicode", "Enable Unicode subsystem (Python 2+ only)"),
-(" --unicode-encoding=<e>", "Set both input and output encodings"),
-(" --unicode-input-encoding=<e>", "Set input encoding"),
-(" --unicode-output-encoding=<e>", "Set output encoding"),
-(" --unicode-errors=<E>", "Set both input and output error handler"),
-(" --unicode-input-errors=<E>", "Set input error handler"),
-(" --unicode-output-errors=<E>", "Set output error handler"),
-]
-
-USAGE_NOTES = """\
-Notes: Whitespace immediately inside parentheses of @(...) are
-ignored. Whitespace immediately inside braces of @{...} are ignored,
-unless ... spans multiple lines. Use @{ ... }@ to suppress newline
-following expansion. Simple expressions ignore trailing dots; `@x.'
-means `@(x).'. A #! at the start of a file is treated as a @#
-comment."""
-
-MARKUP_INFO = [
-("@# ... NL", "Comment; remove everything up to newline"),
-("@? NAME NL", "Set the current context name"),
-("@! INTEGER NL", "Set the current context line number"),
-("@ WHITESPACE", "Remove following whitespace; line continuation"),
-("@\\ ESCAPE_CODE", "A C-style escape sequence"),
-("@@", "Literal @; @ is escaped (duplicated prefix)"),
-("@), @], @}", "Literal close parenthesis, bracket, brace"),
-("@ STRING_LITERAL", "Replace with string literal contents"),
-("@( EXPRESSION )", "Evaluate expression and substitute with str"),
-("@( TEST [? THEN [! ELSE]] )", "If test is true, evaluate then, otherwise else"),
-("@( TRY $ CATCH )", "Expand try expression, or catch if it raises"),
-("@ SIMPLE_EXPRESSION", "Evaluate simple expression and substitute;\n"
- "e.g., @x, @x.y, @f(a, b), @l[i], etc."),
-("@` EXPRESSION `", "Evaluate expression and substitute with repr"),
-("@: EXPRESSION : [DUMMY] :", "Evaluates to @:...:expansion:"),
-("@{ STATEMENTS }", "Statements are executed for side effects"),
-("@[ CONTROL ]", "Control markups: if E; elif E; for N in E;\n"
- "while E; try; except E, N; finally; continue;\n"
- "break; end X"),
-("@%% KEY WHITESPACE VALUE NL", "Significator form of __KEY__ = VALUE"),
-("@< CONTENTS >", "Custom markup; meaning provided by user"),
-]
-
-ESCAPE_INFO = [
-("@\\0", "NUL, null"),
-("@\\a", "BEL, bell"),
-("@\\b", "BS, backspace"),
-("@\\dDDD", "three-digit decimal code DDD"),
-("@\\e", "ESC, escape"),
-("@\\f", "FF, form feed"),
-("@\\h", "DEL, delete"),
-("@\\n", "LF, linefeed, newline"),
-("@\\N{NAME}", "Unicode character named NAME"),
-("@\\oOOO", "three-digit octal code OOO"),
-("@\\qQQQQ", "four-digit quaternary code QQQQ"),
-("@\\r", "CR, carriage return"),
-("@\\s", "SP, space"),
-("@\\t", "HT, horizontal tab"),
-("@\\uHHHH", "16-bit hexadecimal Unicode HHHH"),
-("@\\UHHHHHHHH", "32-bit hexadecimal Unicode HHHHHHHH"),
-("@\\v", "VT, vertical tab"),
-("@\\xHH", "two-digit hexadecimal code HH"),
-("@\\z", "EOT, end of transmission"),
-]
-
-PSEUDOMODULE_INFO = [
-("VERSION", "String representing EmPy version"),
-("SIGNIFICATOR_RE_STRING", "Regular expression matching significators"),
-("SIGNIFICATOR_RE_SUFFIX", "The above stub, lacking the prefix"),
-("interpreter", "Currently-executing interpreter instance"),
-("argv", "The EmPy script name and command line arguments"),
-("args", "The command line arguments only"),
-("identify()", "Identify top context as name, line"),
-("setContextName(name)", "Set the name of the current context"),
-("setContextLine(line)", "Set the line number of the current context"),
-("atExit(callable)", "Invoke no-argument function at shutdown"),
-("getGlobals()", "Retrieve this interpreter's globals"),
-("setGlobals(dict)", "Set this interpreter's globals"),
-("updateGlobals(dict)", "Merge dictionary into interpreter's globals"),
-("clearGlobals()", "Start globals over anew"),
-("saveGlobals([deep])", "Save a copy of the globals"),
-("restoreGlobals([pop])", "Restore the most recently saved globals"),
-("defined(name, [loc])", "Find if the name is defined"),
-("evaluate(expression, [loc])", "Evaluate the expression"),
-("serialize(expression, [loc])", "Evaluate and serialize the expression"),
-("execute(statements, [loc])", "Execute the statements"),
-("single(source, [loc])", "Execute the 'single' object"),
-("atomic(name, value, [loc])", "Perform an atomic assignment"),
-("assign(name, value, [loc])", "Perform an arbitrary assignment"),
-("significate(key, [value])", "Significate the given key, value pair"),
-("include(file, [loc])", "Include filename or file-like object"),
-("expand(string, [loc])", "Explicitly expand string and return"),
-("string(data, [name], [loc])", "Process string-like object"),
-("quote(string)", "Quote prefixes in provided string and return"),
-("flatten([keys])", "Flatten module contents into globals namespace"),
-("getPrefix()", "Get current prefix"),
-("setPrefix(char)", "Set new prefix"),
-("stopDiverting()", "Stop diverting; data sent directly to output"),
-("createDiversion(name)", "Create a diversion but do not divert to it"),
-("retrieveDiversion(name)", "Retrieve the actual named diversion object"),
-("startDiversion(name)", "Start diverting to given diversion"),
-("playDiversion(name)", "Recall diversion and then eliminate it"),
-("replayDiversion(name)", "Recall diversion but retain it"),
-("purgeDiversion(name)", "Erase diversion"),
-("playAllDiversions()", "Stop diverting and play all diversions in order"),
-("replayAllDiversions()", "Stop diverting and replay all diversions"),
-("purgeAllDiversions()", "Stop diverting and purge all diversions"),
-("getFilter()", "Get current filter"),
-("resetFilter()", "Reset filter; no filtering"),
-("nullFilter()", "Install null filter"),
-("setFilter(shortcut)", "Install new filter or filter chain"),
-("attachFilter(shortcut)", "Attach single filter to end of current chain"),
-("areHooksEnabled()", "Return whether or not hooks are enabled"),
-("enableHooks()", "Enable hooks (default)"),
-("disableHooks()", "Disable hook invocation"),
-("getHooks()", "Get all the hooks"),
-("clearHooks()", "Clear all hooks"),
-("addHook(hook, [i])", "Register the hook (optionally insert)"),
-("removeHook(hook)", "Remove an already-registered hook from name"),
-("invokeHook(name_, ...)", "Manually invoke hook"),
-("getCallback()", "Get interpreter callback"),
-("registerCallback(callback)", "Register callback with interpreter"),
-("deregisterCallback()", "Deregister callback from interpreter"),
-("invokeCallback(contents)", "Invoke the callback directly"),
-("Interpreter", "The interpreter class"),
-]
-
-ENVIRONMENT_INFO = [
-(OPTIONS_ENV, "Specified options will be included"),
-(PREFIX_ENV, "Specify the default prefix: -p <value>"),
-(PSEUDO_ENV, "Specify name of pseudomodule: -m <value>"),
-(FLATTEN_ENV, "Flatten empy pseudomodule if defined: -f"),
-(RAW_ENV, "Show raw errors if defined: -r"),
-(INTERACTIVE_ENV, "Enter interactive mode if defined: -i"),
-(BUFFERED_ENV, "Fully buffered output if defined: -b"),
-(NO_OVERRIDE_ENV, "Do not override sys.stdout if defined: -n"),
-(UNICODE_ENV, "Enable Unicode subsystem: -n"),
-(INPUT_ENCODING_ENV, "Unicode input encoding"),
-(OUTPUT_ENCODING_ENV, "Unicode output encoding"),
-(INPUT_ERRORS_ENV, "Unicode input error handler"),
-(OUTPUT_ERRORS_ENV, "Unicode output error handler"),
-]
-
-class Error(Exception):
- """The base class for all EmPy errors."""
- pass
-
-EmpyError = EmPyError = Error # DEPRECATED
-
-class DiversionError(Error):
- """An error related to diversions."""
- pass
-
-class FilterError(Error):
- """An error related to filters."""
- pass
-
-class StackUnderflowError(Error):
- """A stack underflow."""
- pass
-
-class SubsystemError(Error):
- """An error associated with the Unicode subsystem."""
- pass
-
-class FlowError(Error):
- """An exception related to control flow."""
- pass
-
-class ContinueFlow(FlowError):
- """A continue control flow."""
- pass
-
-class BreakFlow(FlowError):
- """A break control flow."""
- pass
-
-class ParseError(Error):
- """A parse error occurred."""
- pass
-
-class TransientParseError(ParseError):
- """A parse error occurred which may be resolved by feeding more data.
- Such an error reaching the toplevel is an unexpected EOF error."""
- pass
-
-
-class MetaError(Exception):
-
- """A wrapper around a real Python exception for including a copy of
- the context."""
-
- def __init__(self, contexts, exc):
- Exception.__init__(self, exc)
- self.contexts = contexts
- self.exc = exc
-
- def __str__(self):
- backtrace = map(lambda x: str(x), self.contexts)
- return "%s: %s (%s)" % (self.exc.__class__, self.exc, \
- (string.join(backtrace, ', ')))
-
-
-class Subsystem:
-
- """The subsystem class defers file creation so that it can create
- Unicode-wrapped files if desired (and possible)."""
-
- def __init__(self):
- self.useUnicode = False
- self.inputEncoding = None
- self.outputEncoding = None
- self.errors = None
-
- def initialize(self, inputEncoding=None, outputEncoding=None, \
- inputErrors=None, outputErrors=None):
- self.useUnicode = True
- try:
- unicode
- import codecs
- except (NameError, ImportError):
- raise SubsystemError, "Unicode subsystem unavailable"
- defaultEncoding = sys.getdefaultencoding()
- if inputEncoding is None:
- inputEncoding = defaultEncoding
- self.inputEncoding = inputEncoding
- if outputEncoding is None:
- outputEncoding = defaultEncoding
- self.outputEncoding = outputEncoding
- if inputErrors is None:
- inputErrors = DEFAULT_ERRORS
- self.inputErrors = inputErrors
- if outputErrors is None:
- outputErrors = DEFAULT_ERRORS
- self.outputErrors = outputErrors
-
- def assertUnicode(self):
- if not self.useUnicode:
- raise SubsystemError, "Unicode subsystem unavailable"
-
- def open(self, name, mode=None):
- if self.useUnicode:
- return self.unicodeOpen(name, mode)
- else:
- return self.defaultOpen(name, mode)
-
- def defaultOpen(self, name, mode=None):
- if mode is None:
- mode = 'r'
- return open(name, mode)
-
- def unicodeOpen(self, name, mode=None):
- import codecs
- if mode is None:
- mode = 'rb'
- if mode.find('w') >= 0 or mode.find('a') >= 0:
- encoding = self.outputEncoding
- errors = self.outputErrors
- else:
- encoding = self.inputEncoding
- errors = self.inputErrors
- return codecs.open(name, mode, encoding, errors)
-
-theSubsystem = Subsystem()
-
-
-class Stack:
-
- """A simple stack that behaves as a sequence (with 0 being the top
- of the stack, not the bottom)."""
-
- def __init__(self, seq=None):
- if seq is None:
- seq = []
- self.data = seq
-
- def top(self):
- """Access the top element on the stack."""
- try:
- return self.data[-1]
- except IndexError:
- raise StackUnderflowError, "stack is empty for top"
-
- def pop(self):
- """Pop the top element off the stack and return it."""
- try:
- return self.data.pop()
- except IndexError:
- raise StackUnderflowError, "stack is empty for pop"
-
- def push(self, object):
- """Push an element onto the top of the stack."""
- self.data.append(object)
-
- def filter(self, function):
- """Filter the elements of the stack through the function."""
- self.data = filter(function, self.data)
-
- def purge(self):
- """Purge the stack."""
- self.data = []
-
- def clone(self):
- """Create a duplicate of this stack."""
- return self.__class__(self.data[:])
-
- def __nonzero__(self): return len(self.data) != 0
- def __len__(self): return len(self.data)
- def __getitem__(self, index): return self.data[-(index + 1)]
-
- def __repr__(self):
- return '<%s instance at 0x%x [%s]>' % \
- (self.__class__, id(self), \
- string.join(map(repr, self.data), ', '))
-
-
-class AbstractFile:
-
- """An abstracted file that, when buffered, will totally buffer the
- file, including even the file open."""
-
- def __init__(self, filename, mode='w', buffered=False):
- # The calls below might throw, so start off by marking this
- # file as "done." This way destruction of a not-completely-
- # initialized AbstractFile will generate no further errors.
- self.done = True
- self.filename = filename
- self.mode = mode
- self.buffered = buffered
- if buffered:
- self.bufferFile = StringIO.StringIO()
- else:
- self.bufferFile = theSubsystem.open(filename, mode)
- # Okay, we got this far, so the AbstractFile is initialized.
- # Flag it as "not done."
- self.done = False
-
- def __del__(self):
- self.close()
-
- def write(self, data):
- self.bufferFile.write(data)
-
- def writelines(self, data):
- self.bufferFile.writelines(data)
-
- def flush(self):
- self.bufferFile.flush()
-
- def close(self):
- if not self.done:
- self.commit()
- self.done = True
-
- def commit(self):
- if self.buffered:
- file = theSubsystem.open(self.filename, self.mode)
- file.write(self.bufferFile.getvalue())
- file.close()
- else:
- self.bufferFile.close()
-
- def abort(self):
- if self.buffered:
- self.bufferFile = None
- else:
- self.bufferFile.close()
- self.bufferFile = None
- self.done = True
-
-
-class Diversion:
-
- """The representation of an active diversion. Diversions act as
- (writable) file objects, and then can be recalled either as pure
- strings or (readable) file objects."""
-
- def __init__(self):
- self.file = StringIO.StringIO()
-
- # These methods define the writable file-like interface for the
- # diversion.
-
- def write(self, data):
- self.file.write(data)
-
- def writelines(self, lines):
- for line in lines:
- self.write(line)
-
- def flush(self):
- self.file.flush()
-
- def close(self):
- self.file.close()
-
- # These methods are specific to diversions.
-
- def asString(self):
- """Return the diversion as a string."""
- return self.file.getvalue()
-
- def asFile(self):
- """Return the diversion as a file."""
- return StringIO.StringIO(self.file.getvalue())
-
-
-class Stream:
-
- """A wrapper around an (output) file object which supports
- diversions and filtering."""
-
- def __init__(self, file):
- self.file = file
- self.currentDiversion = None
- self.diversions = {}
- self.filter = file
- self.done = False
-
- def write(self, data):
- if self.currentDiversion is None:
- self.filter.write(data)
- else:
- self.diversions[self.currentDiversion].write(data)
-
- def writelines(self, lines):
- for line in lines:
- self.write(line)
-
- def flush(self):
- self.filter.flush()
-
- def close(self):
- if not self.done:
- self.undivertAll(True)
- self.filter.close()
- self.done = True
-
- def shortcut(self, shortcut):
- """Take a filter shortcut and translate it into a filter, returning
- it. Sequences don't count here; these should be detected
- independently."""
- if shortcut == 0:
- return NullFilter()
- elif type(shortcut) is types.FunctionType or \
- type(shortcut) is types.BuiltinFunctionType or \
- type(shortcut) is types.BuiltinMethodType or \
- type(shortcut) is types.LambdaType:
- return FunctionFilter(shortcut)
- elif type(shortcut) is types.StringType:
- return StringFilter(filter)
- elif type(shortcut) is types.DictType:
- raise NotImplementedError, "mapping filters not yet supported"
- else:
- # Presume it's a plain old filter.
- return shortcut
-
- def last(self):
- """Find the last filter in the current filter chain, or None if
- there are no filters installed."""
- if self.filter is None:
- return None
- thisFilter, lastFilter = self.filter, None
- while thisFilter is not None and thisFilter is not self.file:
- lastFilter = thisFilter
- thisFilter = thisFilter.next()
- return lastFilter
-
- def install(self, shortcut=None):
- """Install a new filter; None means no filter. Handle all the
- special shortcuts for filters here."""
- # Before starting, execute a flush.
- self.filter.flush()
- if shortcut is None or shortcut == [] or shortcut == ():
- # Shortcuts for "no filter."
- self.filter = self.file
- else:
- if type(shortcut) in (types.ListType, types.TupleType):
- shortcuts = list(shortcut)
- else:
- shortcuts = [shortcut]
- # Run through the shortcut filter names, replacing them with
- # full-fledged instances of Filter.
- filters = []
- for shortcut in shortcuts:
- filters.append(self.shortcut(shortcut))
- if len(filters) > 1:
- # If there's more than one filter provided, chain them
- # together.
- lastFilter = None
- for filter in filters:
- if lastFilter is not None:
- lastFilter.attach(filter)
- lastFilter = filter
- lastFilter.attach(self.file)
- self.filter = filters[0]
- else:
- # If there's only one filter, assume that it's alone or it's
- # part of a chain that has already been manually chained;
- # just find the end.
- filter = filters[0]
- lastFilter = filter.last()
- lastFilter.attach(self.file)
- self.filter = filter
-
- def attach(self, shortcut):
- """Attached a solitary filter (no sequences allowed here) at the
- end of the current filter chain."""
- lastFilter = self.last()
- if lastFilter is None:
- # Just install it from scratch if there is no active filter.
- self.install(shortcut)
- else:
- # Attach the last filter to this one, and this one to the file.
- filter = self.shortcut(shortcut)
- lastFilter.attach(filter)
- filter.attach(self.file)
-
- def revert(self):
- """Reset any current diversions."""
- self.currentDiversion = None
-
- def create(self, name):
- """Create a diversion if one does not already exist, but do not
- divert to it yet."""
- if name is None:
- raise DiversionError, "diversion name must be non-None"
- if not self.diversions.has_key(name):
- self.diversions[name] = Diversion()
-
- def retrieve(self, name):
- """Retrieve the given diversion."""
- if name is None:
- raise DiversionError, "diversion name must be non-None"
- if self.diversions.has_key(name):
- return self.diversions[name]
- else:
- raise DiversionError, "nonexistent diversion: %s" % name
-
- def divert(self, name):
- """Start diverting."""
- if name is None:
- raise DiversionError, "diversion name must be non-None"
- self.create(name)
- self.currentDiversion = name
-
- def undivert(self, name, purgeAfterwards=False):
- """Undivert a particular diversion."""
- if name is None:
- raise DiversionError, "diversion name must be non-None"
- if self.diversions.has_key(name):
- diversion = self.diversions[name]
- self.filter.write(diversion.asString())
- if purgeAfterwards:
- self.purge(name)
- else:
- raise DiversionError, "nonexistent diversion: %s" % name
-
- def purge(self, name):
- """Purge the specified diversion."""
- if name is None:
- raise DiversionError, "diversion name must be non-None"
- if self.diversions.has_key(name):
- del self.diversions[name]
- if self.currentDiversion == name:
- self.currentDiversion = None
-
- def undivertAll(self, purgeAfterwards=True):
- """Undivert all pending diversions."""
- if self.diversions:
- self.revert() # revert before undiverting!
- names = self.diversions.keys()
- names.sort()
- for name in names:
- self.undivert(name)
- if purgeAfterwards:
- self.purge(name)
-
- def purgeAll(self):
- """Eliminate all existing diversions."""
- if self.diversions:
- self.diversions = {}
- self.currentDiversion = None
-
-
-class NullFile:
-
- """A simple class that supports all the file-like object methods
- but simply does nothing at all."""
-
- def __init__(self): pass
- def write(self, data): pass
- def writelines(self, lines): pass
- def flush(self): pass
- def close(self): pass
-
-
-class UncloseableFile:
-
- """A simple class which wraps around a delegate file-like object
- and lets everything through except close calls."""
-
- def __init__(self, delegate):
- self.delegate = delegate
-
- def write(self, data):
- self.delegate.write(data)
-
- def writelines(self, lines):
- self.delegate.writelines(data)
-
- def flush(self):
- self.delegate.flush()
-
- def close(self):
- """Eat this one."""
- pass
-
-
-class ProxyFile:
-
- """The proxy file object that is intended to take the place of
- sys.stdout. The proxy can manage a stack of file objects it is
- writing to, and an underlying raw file object."""
-
- def __init__(self, bottom):
- self.stack = Stack()
- self.bottom = bottom
-
- def current(self):
- """Get the current stream to write to."""
- if self.stack:
- return self.stack[-1][1]
- else:
- return self.bottom
-
- def push(self, interpreter):
- self.stack.push((interpreter, interpreter.stream()))
-
- def pop(self, interpreter):
- result = self.stack.pop()
- assert interpreter is result[0]
-
- def clear(self, interpreter):
- self.stack.filter(lambda x, i=interpreter: x[0] is not i)
-
- def write(self, data):
- self.current().write(data)
-
- def writelines(self, lines):
- self.current().writelines(lines)
-
- def flush(self):
- self.current().flush()
-
- def close(self):
- """Close the current file. If the current file is the bottom, then
- close it and dispose of it."""
- current = self.current()
- if current is self.bottom:
- self.bottom = None
- current.close()
-
- def _testProxy(self): pass
-
-
-class Filter:
-
- """An abstract filter."""
-
- def __init__(self):
- if self.__class__ is Filter:
- raise NotImplementedError
- self.sink = None
-
- def next(self):
- """Return the next filter/file-like object in the sequence, or None."""
- return self.sink
-
- def write(self, data):
- """The standard write method; this must be overridden in subclasses."""
- raise NotImplementedError
-
- def writelines(self, lines):
- """Standard writelines wrapper."""
- for line in lines:
- self.write(line)
-
- def _flush(self):
- """The _flush method should always flush the sink and should not
- be overridden."""
- self.sink.flush()
-
- def flush(self):
- """The flush method can be overridden."""
- self._flush()
-
- def close(self):
- """Close the filter. Do an explicit flush first, then close the
- sink."""
- self.flush()
- self.sink.close()
-
- def attach(self, filter):
- """Attach a filter to this one."""
- if self.sink is not None:
- # If it's already attached, detach it first.
- self.detach()
- self.sink = filter
-
- def detach(self):
- """Detach a filter from its sink."""
- self.flush()
- self._flush() # do a guaranteed flush to just to be safe
- self.sink = None
-
- def last(self):
- """Find the last filter in this chain."""
- this, last = self, self
- while this is not None:
- last = this
- this = this.next()
- return last
-
-class NullFilter(Filter):
-
- """A filter that never sends any output to its sink."""
-
- def write(self, data): pass
-
-class FunctionFilter(Filter):
-
- """A filter that works simply by pumping its input through a
- function which maps strings into strings."""
-
- def __init__(self, function):
- Filter.__init__(self)
- self.function = function
-
- def write(self, data):
- self.sink.write(self.function(data))
-
-class StringFilter(Filter):
-
- """A filter that takes a translation string (256 characters) and
- filters any incoming data through it."""
-
- def __init__(self, table):
- if not (type(table) == types.StringType and len(table) == 256):
- raise FilterError, "table must be 256-character string"
- Filter.__init__(self)
- self.table = table
-
- def write(self, data):
- self.sink.write(string.translate(data, self.table))
-
-class BufferedFilter(Filter):
-
- """A buffered filter is one that doesn't modify the source data
- sent to the sink, but instead holds it for a time. The standard
- variety only sends the data along when it receives a flush
- command."""
-
- def __init__(self):
- Filter.__init__(self)
- self.buffer = ''
-
- def write(self, data):
- self.buffer = self.buffer + data
-
- def flush(self):
- if self.buffer:
- self.sink.write(self.buffer)
- self._flush()
-
-class SizeBufferedFilter(BufferedFilter):
-
- """A size-buffered filter only in fixed size chunks (excepting the
- final chunk)."""
-
- def __init__(self, bufferSize):
- BufferedFilter.__init__(self)
- self.bufferSize = bufferSize
-
- def write(self, data):
- BufferedFilter.write(self, data)
- while len(self.buffer) > self.bufferSize:
- chunk, self.buffer = \
- self.buffer[:self.bufferSize], self.buffer[self.bufferSize:]
- self.sink.write(chunk)
-
-class LineBufferedFilter(BufferedFilter):
-
- """A line-buffered filter only lets data through when it sees
- whole lines."""
-
- def __init__(self):
- BufferedFilter.__init__(self)
-
- def write(self, data):
- BufferedFilter.write(self, data)
- chunks = string.split(self.buffer, '\n')
- for chunk in chunks[:-1]:
- self.sink.write(chunk + '\n')
- self.buffer = chunks[-1]
-
-class MaximallyBufferedFilter(BufferedFilter):
-
- """A maximally-buffered filter only lets its data through on the final
- close. It ignores flushes."""
-
- def __init__(self):
- BufferedFilter.__init__(self)
-
- def flush(self): pass
-
- def close(self):
- if self.buffer:
- BufferedFilter.flush(self)
- self.sink.close()
-
-
-class Context:
-
- """An interpreter context, which encapsulates a name, an input
- file object, and a parser object."""
-
- DEFAULT_UNIT = 'lines'
-
- def __init__(self, name, line=0, units=DEFAULT_UNIT):
- self.name = name
- self.line = line
- self.units = units
- self.pause = False
-
- def bump(self, quantity=1):
- if self.pause:
- self.pause = False
- else:
- self.line = self.line + quantity
-
- def identify(self):
- return self.name, self.line
-
- def __str__(self):
- if self.units == self.DEFAULT_UNIT:
- return "%s:%s" % (self.name, self.line)
- else:
- return "%s:%s[%s]" % (self.name, self.line, self.units)
-
-
-class Hook:
-
- """The base class for implementing hooks."""
-
- def __init__(self):
- self.interpreter = None
-
- def register(self, interpreter):
- self.interpreter = interpreter
-
- def deregister(self, interpreter):
- if interpreter is not self.interpreter:
- raise Error, "hook not associated with this interpreter"
- self.interpreter = None
-
- def push(self):
- self.interpreter.push()
-
- def pop(self):
- self.interpreter.pop()
-
- def null(self): pass
-
- def atStartup(self): pass
- def atReady(self): pass
- def atFinalize(self): pass
- def atShutdown(self): pass
- def atParse(self, scanner, locals): pass
- def atToken(self, token): pass
- def atHandle(self, meta): pass
- def atInteract(self): pass
-
- def beforeInclude(self, name, file, locals): pass
- def afterInclude(self): pass
-
- def beforeExpand(self, string, locals): pass
- def afterExpand(self, result): pass
-
- def beforeFile(self, name, file, locals): pass
- def afterFile(self): pass
-
- def beforeBinary(self, name, file, chunkSize, locals): pass
- def afterBinary(self): pass
-
- def beforeString(self, name, string, locals): pass
- def afterString(self): pass
-
- def beforeQuote(self, string): pass
- def afterQuote(self, result): pass
-
- def beforeEscape(self, string, more): pass
- def afterEscape(self, result): pass
-
- def beforeControl(self, type, rest, locals): pass
- def afterControl(self): pass
-
- def beforeSignificate(self, key, value, locals): pass
- def afterSignificate(self): pass
-
- def beforeAtomic(self, name, value, locals): pass
- def afterAtomic(self): pass
-
- def beforeMulti(self, name, values, locals): pass
- def afterMulti(self): pass
-
- def beforeImport(self, name, locals): pass
- def afterImport(self): pass
-
- def beforeClause(self, catch, locals): pass
- def afterClause(self, exception, variable): pass
-
- def beforeSerialize(self, expression, locals): pass
- def afterSerialize(self): pass
-
- def beforeDefined(self, name, locals): pass
- def afterDefined(self, result): pass
-
- def beforeLiteral(self, text): pass
- def afterLiteral(self): pass
-
- def beforeEvaluate(self, expression, locals): pass
- def afterEvaluate(self, result): pass
-
- def beforeExecute(self, statements, locals): pass
- def afterExecute(self): pass
-
- def beforeSingle(self, source, locals): pass
- def afterSingle(self): pass
-
-class VerboseHook(Hook):
-
- """A verbose hook that reports all information received by the
- hook interface. This class dynamically scans the Hook base class
- to ensure that all hook methods are properly represented."""
-
- EXEMPT_ATTRIBUTES = ['register', 'deregister', 'push', 'pop']
-
- def __init__(self, output=sys.stderr):
- Hook.__init__(self)
- self.output = output
- self.indent = 0
-
- class FakeMethod:
- """This is a proxy method-like object."""
- def __init__(self, hook, name):
- self.hook = hook
- self.name = name
-
- def __call__(self, **keywords):
- self.hook.output.write("%s%s: %s\n" % \
- (' ' * self.hook.indent, \
- self.name, repr(keywords)))
-
- for attribute in dir(Hook):
- if attribute[:1] != '_' and \
- attribute not in self.EXEMPT_ATTRIBUTES:
- self.__dict__[attribute] = FakeMethod(self, attribute)
-
-
-class Token:
-
- """An element of expansion."""
-
- def run(self, interpreter, locals):
- raise NotImplementedError
-
- def string(self):
- raise NotImplementedError
-
- def __str__(self): return self.string()
-
-class NullToken(Token):
- """A chunk of data not containing markups."""
- def __init__(self, data):
- self.data = data
-
- def run(self, interpreter, locals):
- interpreter.write(self.data)
-
- def string(self):
- return self.data
-
-class ExpansionToken(Token):
- """A token that involves an expansion."""
- def __init__(self, prefix, first):
- self.prefix = prefix
- self.first = first
-
- def scan(self, scanner):
- pass
-
- def run(self, interpreter, locals):
- pass
-
-class WhitespaceToken(ExpansionToken):
- """A whitespace markup."""
- def string(self):
- return '%s%s' % (self.prefix, self.first)
-
-class LiteralToken(ExpansionToken):
- """A literal markup."""
- def run(self, interpreter, locals):
- interpreter.write(self.first)
-
- def string(self):
- return '%s%s' % (self.prefix, self.first)
-
-class PrefixToken(ExpansionToken):
- """A prefix markup."""
- def run(self, interpreter, locals):
- interpreter.write(interpreter.prefix)
-
- def string(self):
- return self.prefix * 2
-
-class CommentToken(ExpansionToken):
- """A comment markup."""
- def scan(self, scanner):
- loc = scanner.find('\n')
- if loc >= 0:
- self.comment = scanner.chop(loc, 1)
- else:
- raise TransientParseError, "comment expects newline"
-
- def string(self):
- return '%s#%s\n' % (self.prefix, self.comment)
-
-class ContextNameToken(ExpansionToken):
- """A context name change markup."""
- def scan(self, scanner):
- loc = scanner.find('\n')
- if loc >= 0:
- self.name = string.strip(scanner.chop(loc, 1))
- else:
- raise TransientParseError, "context name expects newline"
-
- def run(self, interpreter, locals):
- context = interpreter.context()
- context.name = self.name
-
-class ContextLineToken(ExpansionToken):
- """A context line change markup."""
- def scan(self, scanner):
- loc = scanner.find('\n')
- if loc >= 0:
- try:
- self.line = int(scanner.chop(loc, 1))
- except ValueError:
- raise ParseError, "context line requires integer"
- else:
- raise TransientParseError, "context line expects newline"
-
- def run(self, interpreter, locals):
- context = interpreter.context()
- context.line = self.line
- context.pause = True
-
-class EscapeToken(ExpansionToken):
- """An escape markup."""
- def scan(self, scanner):
- try:
- code = scanner.chop(1)
- result = None
- if code in '()[]{}\'\"\\': # literals
- result = code
- elif code == '0': # NUL
- result = '\x00'
- elif code == 'a': # BEL
- result = '\x07'
- elif code == 'b': # BS
- result = '\x08'
- elif code == 'd': # decimal code
- decimalCode = scanner.chop(3)
- result = chr(string.atoi(decimalCode, 10))
- elif code == 'e': # ESC
- result = '\x1b'
- elif code == 'f': # FF
- result = '\x0c'
- elif code == 'h': # DEL
- result = '\x7f'
- elif code == 'n': # LF (newline)
- result = '\x0a'
- elif code == 'N': # Unicode character name
- theSubsystem.assertUnicode()
- import unicodedata
- if scanner.chop(1) != '{':
- raise ParseError, r"Unicode name escape should be \N{...}"
- i = scanner.find('}')
- name = scanner.chop(i, 1)
- try:
- result = unicodedata.lookup(name)
- except KeyError:
- raise SubsystemError, \
- "unknown Unicode character name: %s" % name
- elif code == 'o': # octal code
- octalCode = scanner.chop(3)
- result = chr(string.atoi(octalCode, 8))
- elif code == 'q': # quaternary code
- quaternaryCode = scanner.chop(4)
- result = chr(string.atoi(quaternaryCode, 4))
- elif code == 'r': # CR
- result = '\x0d'
- elif code in 's ': # SP
- result = ' '
- elif code == 't': # HT
- result = '\x09'
- elif code in 'u': # Unicode 16-bit hex literal
- theSubsystem.assertUnicode()
- hexCode = scanner.chop(4)
- result = unichr(string.atoi(hexCode, 16))
- elif code in 'U': # Unicode 32-bit hex literal
- theSubsystem.assertUnicode()
- hexCode = scanner.chop(8)
- result = unichr(string.atoi(hexCode, 16))
- elif code == 'v': # VT
- result = '\x0b'
- elif code == 'x': # hexadecimal code
- hexCode = scanner.chop(2)
- result = chr(string.atoi(hexCode, 16))
- elif code == 'z': # EOT
- result = '\x04'
- elif code == '^': # control character
- controlCode = string.upper(scanner.chop(1))
- if controlCode >= '@' and controlCode <= '`':
- result = chr(ord(controlCode) - ord('@'))
- elif controlCode == '?':
- result = '\x7f'
- else:
- raise ParseError, "invalid escape control code"
- else:
- raise ParseError, "unrecognized escape code"
- assert result is not None
- self.code = result
- except ValueError:
- raise ParseError, "invalid numeric escape code"
-
- def run(self, interpreter, locals):
- interpreter.write(self.code)
-
- def string(self):
- return '%s\\x%02x' % (self.prefix, ord(self.code))
-
-class SignificatorToken(ExpansionToken):
- """A significator markup."""
- def scan(self, scanner):
- loc = scanner.find('\n')
- if loc >= 0:
- line = scanner.chop(loc, 1)
- if not line:
- raise ParseError, "significator must have nonblank key"
- if line[0] in ' \t\v\n':
- raise ParseError, "no whitespace between % and key"
- # Work around a subtle CPython-Jython difference by stripping
- # the string before splitting it: 'a '.split(None, 1) has two
- # elements in Jython 2.1).
- fields = string.split(string.strip(line), None, 1)
- if len(fields) == 2 and fields[1] == '':
- fields.pop()
- self.key = fields[0]
- if len(fields) < 2:
- fields.append(None)
- self.key, self.valueCode = fields
- else:
- raise TransientParseError, "significator expects newline"
-
- def run(self, interpreter, locals):
- value = self.valueCode
- if value is not None:
- value = interpreter.evaluate(string.strip(value), locals)
- interpreter.significate(self.key, value)
-
- def string(self):
- if self.valueCode is None:
- return '%s%%%s\n' % (self.prefix, self.key)
- else:
- return '%s%%%s %s\n' % (self.prefix, self.key, self.valueCode)
-
-class ExpressionToken(ExpansionToken):
- """An expression markup."""
- def scan(self, scanner):
- z = scanner.complex('(', ')', 0)
- try:
- q = scanner.next('$', 0, z, True)
- except ParseError:
- q = z
- try:
- i = scanner.next('?', 0, q, True)
- try:
- j = scanner.next('!', i, q, True)
- except ParseError:
- try:
- j = scanner.next(':', i, q, True) # DEPRECATED
- except ParseError:
- j = q
- except ParseError:
- i = j = q
- code = scanner.chop(z, 1)
- self.testCode = code[:i]
- self.thenCode = code[i + 1:j]
- self.elseCode = code[j + 1:q]
- self.exceptCode = code[q + 1:z]
-
- def run(self, interpreter, locals):
- try:
- result = interpreter.evaluate(self.testCode, locals)
- if self.thenCode:
- if result:
- result = interpreter.evaluate(self.thenCode, locals)
- else:
- if self.elseCode:
- result = interpreter.evaluate(self.elseCode, locals)
- else:
- result = None
- except SyntaxError:
- # Don't catch syntax errors; let them through.
- raise
- except:
- if self.exceptCode:
- result = interpreter.evaluate(self.exceptCode, locals)
- else:
- raise
- if result is not None:
- interpreter.write(str(result))
-
- def string(self):
- result = self.testCode
- if self.thenCode:
- result = result + '?' + self.thenCode
- if self.elseCode:
- result = result + '!' + self.elseCode
- if self.exceptCode:
- result = result + '$' + self.exceptCode
- return '%s(%s)' % (self.prefix, result)
-
-class StringLiteralToken(ExpansionToken):
- """A string token markup."""
- def scan(self, scanner):
- scanner.retreat()
- assert scanner[0] == self.first
- i = scanner.quote()
- self.literal = scanner.chop(i)
-
- def run(self, interpreter, locals):
- interpreter.literal(self.literal)
-
- def string(self):
- return '%s%s' % (self.prefix, self.literal)
-
-class SimpleExpressionToken(ExpansionToken):
- """A simple expression markup."""
- def scan(self, scanner):
- i = scanner.simple()
- self.code = self.first + scanner.chop(i)
-
- def run(self, interpreter, locals):
- interpreter.serialize(self.code, locals)
-
- def string(self):
- return '%s%s' % (self.prefix, self.code)
-
-class ReprToken(ExpansionToken):
- """A repr markup."""
- def scan(self, scanner):
- i = scanner.next('`', 0)
- self.code = scanner.chop(i, 1)
-
- def run(self, interpreter, locals):
- interpreter.write(repr(interpreter.evaluate(self.code, locals)))
-
- def string(self):
- return '%s`%s`' % (self.prefix, self.code)
-
-class InPlaceToken(ExpansionToken):
- """An in-place markup."""
- def scan(self, scanner):
- i = scanner.next(':', 0)
- j = scanner.next(':', i + 1)
- self.code = scanner.chop(i, j - i + 1)
-
- def run(self, interpreter, locals):
- interpreter.write("%s:%s:" % (interpreter.prefix, self.code))
- try:
- interpreter.serialize(self.code, locals)
- finally:
- interpreter.write(":")
-
- def string(self):
- return '%s:%s::' % (self.prefix, self.code)
-
-class StatementToken(ExpansionToken):
- """A statement markup."""
- def scan(self, scanner):
- i = scanner.complex('{', '}', 0)
- self.code = scanner.chop(i, 1)
-
- def run(self, interpreter, locals):
- interpreter.execute(self.code, locals)
-
- def string(self):
- return '%s{%s}' % (self.prefix, self.code)
-
-class CustomToken(ExpansionToken):
- """A custom markup."""
- def scan(self, scanner):
- i = scanner.complex('<', '>', 0)
- self.contents = scanner.chop(i, 1)
-
- def run(self, interpreter, locals):
- interpreter.invokeCallback(self.contents)
-
- def string(self):
- return '%s<%s>' % (self.prefix, self.contents)
-
-class ControlToken(ExpansionToken):
-
- """A control token."""
-
- PRIMARY_TYPES = ['if', 'for', 'while', 'try', 'def']
- SECONDARY_TYPES = ['elif', 'else', 'except', 'finally']
- TERTIARY_TYPES = ['continue', 'break']
- GREEDY_TYPES = ['if', 'elif', 'for', 'while', 'def', 'end']
- END_TYPES = ['end']
-
- IN_RE = re.compile(r"\bin\b")
-
- def scan(self, scanner):
- scanner.acquire()
- i = scanner.complex('[', ']', 0)
- self.contents = scanner.chop(i, 1)
- fields = string.split(string.strip(self.contents), ' ', 1)
- if len(fields) > 1:
- self.type, self.rest = fields
- else:
- self.type = fields[0]
- self.rest = None
- self.subtokens = []
- if self.type in self.GREEDY_TYPES and self.rest is None:
- raise ParseError, "control '%s' needs arguments" % self.type
- if self.type in self.PRIMARY_TYPES:
- self.subscan(scanner, self.type)
- self.kind = 'primary'
- elif self.type in self.SECONDARY_TYPES:
- self.kind = 'secondary'
- elif self.type in self.TERTIARY_TYPES:
- self.kind = 'tertiary'
- elif self.type in self.END_TYPES:
- self.kind = 'end'
- else:
- raise ParseError, "unknown control markup: '%s'" % self.type
- scanner.release()
-
- def subscan(self, scanner, primary):
- """Do a subscan for contained tokens."""
- while True:
- token = scanner.one()
- if token is None:
- raise TransientParseError, \
- "control '%s' needs more tokens" % primary
- if isinstance(token, ControlToken) and \
- token.type in self.END_TYPES:
- if token.rest != primary:
- raise ParseError, \
- "control must end with 'end %s'" % primary
- break
- self.subtokens.append(token)
-
- def build(self, allowed=None):
- """Process the list of subtokens and divide it into a list of
- 2-tuples, consisting of the dividing tokens and the list of
- subtokens that follow them. If allowed is specified, it will
- represent the list of the only secondary markup types which
- are allowed."""
- if allowed is None:
- allowed = SECONDARY_TYPES
- result = []
- latest = []
- result.append((self, latest))
- for subtoken in self.subtokens:
- if isinstance(subtoken, ControlToken) and \
- subtoken.kind == 'secondary':
- if subtoken.type not in allowed:
- raise ParseError, \
- "control unexpected secondary: '%s'" % subtoken.type
- latest = []
- result.append((subtoken, latest))
- else:
- latest.append(subtoken)
- return result
-
- def run(self, interpreter, locals):
- interpreter.invoke('beforeControl', type=self.type, rest=self.rest, \
- locals=locals)
- if self.type == 'if':
- info = self.build(['elif', 'else'])
- elseTokens = None
- if info[-1][0].type == 'else':
- elseTokens = info.pop()[1]
- for secondary, subtokens in info:
- if secondary.type not in ('if', 'elif'):
- raise ParseError, \
- "control 'if' unexpected secondary: '%s'" % secondary.type
- if interpreter.evaluate(secondary.rest, locals):
- self.subrun(subtokens, interpreter, locals)
- break
- else:
- if elseTokens:
- self.subrun(elseTokens, interpreter, locals)
- elif self.type == 'for':
- sides = self.IN_RE.split(self.rest, 1)
- if len(sides) != 2:
- raise ParseError, "control expected 'for x in seq'"
- iterator, sequenceCode = sides
- info = self.build(['else'])
- elseTokens = None
- if info[-1][0].type == 'else':
- elseTokens = info.pop()[1]
- if len(info) != 1:
- raise ParseError, "control 'for' expects at most one 'else'"
- sequence = interpreter.evaluate(sequenceCode, locals)
- for element in sequence:
- try:
- interpreter.assign(iterator, element, locals)
- self.subrun(info[0][1], interpreter, locals)
- except ContinueFlow:
- continue
- except BreakFlow:
- break
- else:
- if elseTokens:
- self.subrun(elseTokens, interpreter, locals)
- elif self.type == 'while':
- testCode = self.rest
- info = self.build(['else'])
- elseTokens = None
- if info[-1][0].type == 'else':
- elseTokens = info.pop()[1]
- if len(info) != 1:
- raise ParseError, "control 'while' expects at most one 'else'"
- atLeastOnce = False
- while True:
- try:
- if not interpreter.evaluate(testCode, locals):
- break
- atLeastOnce = True
- self.subrun(info[0][1], interpreter, locals)
- except ContinueFlow:
- continue
- except BreakFlow:
- break
- if not atLeastOnce and elseTokens:
- self.subrun(elseTokens, interpreter, locals)
- elif self.type == 'try':
- info = self.build(['except', 'finally'])
- if len(info) == 1:
- raise ParseError, "control 'try' needs 'except' or 'finally'"
- type = info[-1][0].type
- if type == 'except':
- for secondary, _tokens in info[1:]:
- if secondary.type != 'except':
- raise ParseError, \
- "control 'try' cannot have 'except' and 'finally'"
- else:
- assert type == 'finally'
- if len(info) != 2:
- raise ParseError, \
- "control 'try' can only have one 'finally'"
- if type == 'except':
- try:
- self.subrun(info[0][1], interpreter, locals)
- except FlowError:
- raise
- except Exception, e:
- for secondary, tokens in info[1:]:
- exception, variable = interpreter.clause(secondary.rest)
- if variable is not None:
- interpreter.assign(variable, e)
- if isinstance(e, exception):
- self.subrun(tokens, interpreter, locals)
- break
- else:
- raise
- else:
- try:
- self.subrun(info[0][1], interpreter, locals)
- finally:
- self.subrun(info[1][1], interpreter, locals)
- elif self.type == 'continue':
- raise ContinueFlow, "control 'continue' without 'for', 'while'"
- elif self.type == 'break':
- raise BreakFlow, "control 'break' without 'for', 'while'"
- elif self.type == 'def':
- signature = self.rest
- definition = self.substring()
- code = 'def %s:\n' \
- ' r"""%s"""\n' \
- ' return %s.expand(r"""%s""", locals())\n' % \
- (signature, definition, interpreter.pseudo, definition)
- interpreter.execute(code, locals)
- elif self.type == 'end':
- raise ParseError, "control 'end' requires primary markup"
- else:
- raise ParseError, \
- "control '%s' cannot be at this level" % self.type
- interpreter.invoke('afterControl')
-
- def subrun(self, tokens, interpreter, locals):
- """Execute a sequence of tokens."""
- for token in tokens:
- token.run(interpreter, locals)
-
- def substring(self):
- return string.join(map(str, self.subtokens), '')
-
- def string(self):
- if self.kind == 'primary':
- return '%s[%s]%s%s[end %s]' % \
- (self.prefix, self.contents, self.substring(), \
- self.prefix, self.type)
- else:
- return '%s[%s]' % (self.prefix, self.contents)
-
-
-class Scanner:
-
- """A scanner holds a buffer for lookahead parsing and has the
- ability to scan for special symbols and indicators in that
- buffer."""
-
- # This is the token mapping table that maps first characters to
- # token classes.
- TOKEN_MAP = [
- (None, PrefixToken),
- (' \t\v\r\n', WhitespaceToken),
- (')]}', LiteralToken),
- ('\\', EscapeToken),
- ('#', CommentToken),
- ('?', ContextNameToken),
- ('!', ContextLineToken),
- ('%', SignificatorToken),
- ('(', ExpressionToken),
- (IDENTIFIER_FIRST_CHARS, SimpleExpressionToken),
- ('\'\"', StringLiteralToken),
- ('`', ReprToken),
- (':', InPlaceToken),
- ('[', ControlToken),
- ('{', StatementToken),
- ('<', CustomToken),
- ]
-
- def __init__(self, prefix, data=''):
- self.prefix = prefix
- self.pointer = 0
- self.buffer = data
- self.lock = 0
-
- def __nonzero__(self): return self.pointer < len(self.buffer)
- def __len__(self): return len(self.buffer) - self.pointer
- def __getitem__(self, index): return self.buffer[self.pointer + index]
-
- def __getslice__(self, start, stop):
- if stop > len(self):
- stop = len(self)
- return self.buffer[self.pointer + start:self.pointer + stop]
-
- def advance(self, count=1):
- """Advance the pointer count characters."""
- self.pointer = self.pointer + count
-
- def retreat(self, count=1):
- self.pointer = self.pointer - count
- if self.pointer < 0:
- raise ParseError, "can't retreat back over synced out chars"
-
- def set(self, data):
- """Start the scanner digesting a new batch of data; start the pointer
- over from scratch."""
- self.pointer = 0
- self.buffer = data
-
- def feed(self, data):
- """Feed some more data to the scanner."""
- self.buffer = self.buffer + data
-
- def chop(self, count=None, slop=0):
- """Chop the first count + slop characters off the front, and return
- the first count. If count is not specified, then return
- everything."""
- if count is None:
- assert slop == 0
- count = len(self)
- if count > len(self):
- raise TransientParseError, "not enough data to read"
- result = self[:count]
- self.advance(count + slop)
- return result
-
- def acquire(self):
- """Lock the scanner so it doesn't destroy data on sync."""
- self.lock = self.lock + 1
-
- def release(self):
- """Unlock the scanner."""
- self.lock = self.lock - 1
-
- def sync(self):
- """Sync up the buffer with the read head."""
- if self.lock == 0 and self.pointer != 0:
- self.buffer = self.buffer[self.pointer:]
- self.pointer = 0
-
- def unsync(self):
- """Undo changes; reset the read head."""
- if self.pointer != 0:
- self.lock = 0
- self.pointer = 0
-
- def rest(self):
- """Get the remainder of the buffer."""
- return self[:]
-
- def read(self, i=0, count=1):
- """Read count chars starting from i; raise a transient error if
- there aren't enough characters remaining."""
- if len(self) < i + count:
- raise TransientParseError, "need more data to read"
- else:
- return self[i:i + count]
-
- def check(self, i, archetype=None):
- """Scan for the next single or triple quote, with the specified
- archetype. Return the found quote or None."""
- quote = None
- if self[i] in '\'\"':
- quote = self[i]
- if len(self) - i < 3:
- for j in range(i, len(self)):
- if self[i] == quote:
- return quote
- else:
- raise TransientParseError, "need to scan for rest of quote"
- if self[i + 1] == self[i + 2] == quote:
- quote = quote * 3
- if quote is not None:
- if archetype is None:
- return quote
- else:
- if archetype == quote:
- return quote
- elif len(archetype) < len(quote) and archetype[0] == quote[0]:
- return archetype
- else:
- return None
- else:
- return None
-
- def find(self, sub, start=0, end=None):
- """Find the next occurrence of the character, or return -1."""
- if end is not None:
- return string.find(self.rest(), sub, start, end)
- else:
- return string.find(self.rest(), sub, start)
-
- def last(self, char, start=0, end=None):
- """Find the first character that is _not_ the specified character."""
- if end is None:
- end = len(self)
- i = start
- while i < end:
- if self[i] != char:
- return i
- i = i + 1
- else:
- raise TransientParseError, "expecting other than %s" % char
-
- def next(self, target, start=0, end=None, mandatory=False):
- """Scan for the next occurrence of one of the characters in
- the target string; optionally, make the scan mandatory."""
- if mandatory:
- assert end is not None
- quote = None
- if end is None:
- end = len(self)
- i = start
- while i < end:
- newQuote = self.check(i, quote)
- if newQuote:
- if newQuote == quote:
- quote = None
- else:
- quote = newQuote
- i = i + len(newQuote)
- else:
- c = self[i]
- if quote:
- if c == '\\':
- i = i + 1
- else:
- if c in target:
- return i
- i = i + 1
- else:
- if mandatory:
- raise ParseError, "expecting %s, not found" % target
- else:
- raise TransientParseError, "expecting ending character"
-
- def quote(self, start=0, end=None, mandatory=False):
- """Scan for the end of the next quote."""
- assert self[start] in '\'\"'
- quote = self.check(start)
- if end is None:
- end = len(self)
- i = start + len(quote)
- while i < end:
- newQuote = self.check(i, quote)
- if newQuote:
- i = i + len(newQuote)
- if newQuote == quote:
- return i
- else:
- c = self[i]
- if c == '\\':
- i = i + 1
- i = i + 1
- else:
- if mandatory:
- raise ParseError, "expecting end of string literal"
- else:
- raise TransientParseError, "expecting end of string literal"
-
- def nested(self, enter, exit, start=0, end=None):
- """Scan from i for an ending sequence, respecting entries and exits
- only."""
- depth = 0
- if end is None:
- end = len(self)
- i = start
- while i < end:
- c = self[i]
- if c == enter:
- depth = depth + 1
- elif c == exit:
- depth = depth - 1
- if depth < 0:
- return i
- i = i + 1
- else:
- raise TransientParseError, "expecting end of complex expression"
-
- def complex(self, enter, exit, start=0, end=None, skip=None):
- """Scan from i for an ending sequence, respecting quotes,
- entries and exits."""
- quote = None
- depth = 0
- if end is None:
- end = len(self)
- last = None
- i = start
- while i < end:
- newQuote = self.check(i, quote)
- if newQuote:
- if newQuote == quote:
- quote = None
- else:
- quote = newQuote
- i = i + len(newQuote)
- else:
- c = self[i]
- if quote:
- if c == '\\':
- i = i + 1
- else:
- if skip is None or last != skip:
- if c == enter:
- depth = depth + 1
- elif c == exit:
- depth = depth - 1
- if depth < 0:
- return i
- last = c
- i = i + 1
- else:
- raise TransientParseError, "expecting end of complex expression"
-
- def word(self, start=0):
- """Scan from i for a simple word."""
- length = len(self)
- i = start
- while i < length:
- if not self[i] in IDENTIFIER_CHARS:
- return i
- i = i + 1
- else:
- raise TransientParseError, "expecting end of word"
-
- def phrase(self, start=0):
- """Scan from i for a phrase (e.g., 'word', 'f(a, b, c)', 'a[i]', or
- combinations like 'x[i](a)'."""
- # Find the word.
- i = self.word(start)
- while i < len(self) and self[i] in '([{':
- enter = self[i]
- if enter == '{':
- raise ParseError, "curly braces can't open simple expressions"
- exit = ENDING_CHARS[enter]
- i = self.complex(enter, exit, i + 1) + 1
- return i
-
- def simple(self, start=0):
- """Scan from i for a simple expression, which consists of one
- more phrases separated by dots."""
- i = self.phrase(start)
- length = len(self)
- while i < length and self[i] == '.':
- i = self.phrase(i)
- # Make sure we don't end with a trailing dot.
- while i > 0 and self[i - 1] == '.':
- i = i - 1
- return i
-
- def one(self):
- """Parse and return one token, or None if the scanner is empty."""
- if not self:
- return None
- if not self.prefix:
- loc = -1
- else:
- loc = self.find(self.prefix)
- if loc < 0:
- # If there's no prefix in the buffer, then set the location to
- # the end so the whole thing gets processed.
- loc = len(self)
- if loc == 0:
- # If there's a prefix at the beginning of the buffer, process
- # an expansion.
- prefix = self.chop(1)
- assert prefix == self.prefix
- first = self.chop(1)
- if first == self.prefix:
- first = None
- for firsts, factory in self.TOKEN_MAP:
- if firsts is None:
- if first is None:
- break
- elif first in firsts:
- break
- else:
- raise ParseError, "unknown markup: %s%s" % (self.prefix, first)
- token = factory(self.prefix, first)
- try:
- token.scan(self)
- except TransientParseError:
- # If a transient parse error occurs, reset the buffer pointer
- # so we can (conceivably) try again later.
- self.unsync()
- raise
- else:
- # Process everything up to loc as a null token.
- data = self.chop(loc)
- token = NullToken(data)
- self.sync()
- return token
-
-
-class Interpreter:
-
- """An interpreter can process chunks of EmPy code."""
-
- # Constants.
-
- VERSION = __version__
- SIGNIFICATOR_RE_SUFFIX = SIGNIFICATOR_RE_SUFFIX
- SIGNIFICATOR_RE_STRING = None
-
- # Types.
-
- Interpreter = None # define this below to prevent a circular reference
- Hook = Hook # DEPRECATED
- Filter = Filter # DEPRECATED
- NullFilter = NullFilter # DEPRECATED
- FunctionFilter = FunctionFilter # DEPRECATED
- StringFilter = StringFilter # DEPRECATED
- BufferedFilter = BufferedFilter # DEPRECATED
- SizeBufferedFilter = SizeBufferedFilter # DEPRECATED
- LineBufferedFilter = LineBufferedFilter # DEPRECATED
- MaximallyBufferedFilter = MaximallyBufferedFilter # DEPRECATED
-
- # Tables.
-
- ESCAPE_CODES = {0x00: '0', 0x07: 'a', 0x08: 'b', 0x1b: 'e', 0x0c: 'f', \
- 0x7f: 'h', 0x0a: 'n', 0x0d: 'r', 0x09: 't', 0x0b: 'v', \
- 0x04: 'z'}
-
- ASSIGN_TOKEN_RE = re.compile(r"[_a-zA-Z][_a-zA-Z0-9]*|\(|\)|,")
-
- DEFAULT_OPTIONS = {BANGPATH_OPT: True,
- BUFFERED_OPT: False,
- RAW_OPT: False,
- EXIT_OPT: True,
- FLATTEN_OPT: False,
- OVERRIDE_OPT: True,
- CALLBACK_OPT: False}
-
- _wasProxyInstalled = False # was a proxy installed?
-
- # Construction, initialization, destruction.
-
- def __init__(self, output=None, argv=None, prefix=DEFAULT_PREFIX, \
- pseudo=None, options=None, globals=None, hooks=None):
- self.interpreter = self # DEPRECATED
- # Set up the stream.
- if output is None:
- output = UncloseableFile(sys.__stdout__)
- self.output = output
- self.prefix = prefix
- if pseudo is None:
- pseudo = DEFAULT_PSEUDOMODULE_NAME
- self.pseudo = pseudo
- if argv is None:
- argv = [DEFAULT_SCRIPT_NAME]
- self.argv = argv
- self.args = argv[1:]
- if options is None:
- options = {}
- self.options = options
- # Initialize any hooks.
- self.hooksEnabled = None # special sentinel meaning "false until added"
- self.hooks = []
- if hooks is None:
- hooks = []
- for hook in hooks:
- self.register(hook)
- # Initialize callback.
- self.callback = None
- # Finalizers.
- self.finals = []
- # The interpreter stacks.
- self.contexts = Stack()
- self.streams = Stack()
- # Now set up the globals.
- self.globals = globals
- self.fix()
- self.history = Stack()
- # Install a proxy stdout if one hasn't been already.
- self.installProxy()
- # Finally, reset the state of all the stacks.
- self.reset()
- # Okay, now flatten the namespaces if that option has been set.
- if self.options.get(FLATTEN_OPT, False):
- self.flatten()
- # Set up old pseudomodule attributes.
- if prefix is None:
- self.SIGNIFICATOR_RE_STRING = None
- else:
- self.SIGNIFICATOR_RE_STRING = prefix + self.SIGNIFICATOR_RE_SUFFIX
- self.Interpreter = self.__class__
- # Done. Now declare that we've started up.
- self.invoke('atStartup')
-
- def __del__(self):
- self.shutdown()
-
- def __repr__(self):
- return '<%s pseudomodule/interpreter at 0x%x>' % \
- (self.pseudo, id(self))
-
- def ready(self):
- """Declare the interpreter ready for normal operations."""
- self.invoke('atReady')
-
- def fix(self):
- """Reset the globals, stamping in the pseudomodule."""
- if self.globals is None:
- self.globals = {}
- # Make sure that there is no collision between two interpreters'
- # globals.
- if self.globals.has_key(self.pseudo):
- if self.globals[self.pseudo] is not self:
- raise Error, "interpreter globals collision"
- self.globals[self.pseudo] = self
-
- def unfix(self):
- """Remove the pseudomodule (if present) from the globals."""
- UNWANTED_KEYS = [self.pseudo, '__builtins__']
- for unwantedKey in UNWANTED_KEYS:
- if self.globals.has_key(unwantedKey):
- del self.globals[unwantedKey]
-
- def update(self, other):
- """Update the current globals dictionary with another dictionary."""
- self.globals.update(other)
- self.fix()
-
- def clear(self):
- """Clear out the globals dictionary with a brand new one."""
- self.globals = {}
- self.fix()
-
- def save(self, deep=True):
- if deep:
- copyMethod = copy.deepcopy
- else:
- copyMethod = copy.copy
- """Save a copy of the current globals on the history stack."""
- self.unfix()
- self.history.push(copyMethod(self.globals))
- self.fix()
-
- def restore(self, destructive=True):
- """Restore the topmost historic globals."""
- if destructive:
- fetchMethod = self.history.pop
- else:
- fetchMethod = self.history.top
- self.unfix()
- self.globals = fetchMethod()
- self.fix()
-
- def shutdown(self):
- """Declare this interpreting session over; close the stream file
- object. This method is idempotent."""
- if self.streams is not None:
- try:
- self.finalize()
- self.invoke('atShutdown')
- while self.streams:
- stream = self.streams.pop()
- stream.close()
- finally:
- self.streams = None
-
- def ok(self):
- """Is the interpreter still active?"""
- return self.streams is not None
-
- # Writeable file-like methods.
-
- def write(self, data):
- self.stream().write(data)
-
- def writelines(self, stuff):
- self.stream().writelines(stuff)
-
- def flush(self):
- self.stream().flush()
-
- def close(self):
- self.shutdown()
-
- # Stack-related activity.
-
- def context(self):
- return self.contexts.top()
-
- def stream(self):
- return self.streams.top()
-
- def reset(self):
- self.contexts.purge()
- self.streams.purge()
- self.streams.push(Stream(self.output))
- if self.options.get(OVERRIDE_OPT, True):
- sys.stdout.clear(self)
-
- def push(self):
- if self.options.get(OVERRIDE_OPT, True):
- sys.stdout.push(self)
-
- def pop(self):
- if self.options.get(OVERRIDE_OPT, True):
- sys.stdout.pop(self)
-
- # Higher-level operations.
-
- def include(self, fileOrFilename, locals=None):
- """Do an include pass on a file or filename."""
- if type(fileOrFilename) is types.StringType:
- # Either it's a string representing a filename ...
- filename = fileOrFilename
- name = filename
- file = theSubsystem.open(filename, 'r')
- else:
- # ... or a file object.
- file = fileOrFilename
- name = "<%s>" % str(file.__class__)
- self.invoke('beforeInclude', name=name, file=file, locals=locals)
- self.file(file, name, locals)
- self.invoke('afterInclude')
-
- def expand(self, data, locals=None):
- """Do an explicit expansion on a subordinate stream."""
- outFile = StringIO.StringIO()
- stream = Stream(outFile)
- self.invoke('beforeExpand', string=data, locals=locals)
- self.streams.push(stream)
- try:
- self.string(data, '<expand>', locals)
- stream.flush()
- expansion = outFile.getvalue()
- self.invoke('afterExpand', result=expansion)
- return expansion
- finally:
- self.streams.pop()
-
- def quote(self, data):
- """Quote the given string so that if it were expanded it would
- evaluate to the original."""
- self.invoke('beforeQuote', string=data)
- scanner = Scanner(self.prefix, data)
- result = []
- i = 0
- try:
- j = scanner.next(self.prefix, i)
- result.append(data[i:j])
- result.append(self.prefix * 2)
- i = j + 1
- except TransientParseError:
- pass
- result.append(data[i:])
- result = string.join(result, '')
- self.invoke('afterQuote', result=result)
- return result
-
- def escape(self, data, more=''):
- """Escape a string so that nonprintable characters are replaced
- with compatible EmPy expansions."""
- self.invoke('beforeEscape', string=data, more=more)
- result = []
- for char in data:
- if char < ' ' or char > '~':
- charOrd = ord(char)
- if Interpreter.ESCAPE_CODES.has_key(charOrd):
- result.append(self.prefix + '\\' + \
- Interpreter.ESCAPE_CODES[charOrd])
- else:
- result.append(self.prefix + '\\x%02x' % charOrd)
- elif char in more:
- result.append(self.prefix + '\\' + char)
- else:
- result.append(char)
- result = string.join(result, '')
- self.invoke('afterEscape', result=result)
- return result
-
- # Processing.
-
- def wrap(self, callable, args):
- """Wrap around an application of a callable and handle errors.
- Return whether no error occurred."""
- try:
- apply(callable, args)
- self.reset()
- return True
- except KeyboardInterrupt, e:
- # Handle keyboard interrupts specially: we should always exit
- # from these.
- self.fail(e, True)
- except Exception, e:
- # A standard exception (other than a keyboard interrupt).
- self.fail(e)
- except:
- # If we get here, then either it's an exception not derived from
- # Exception or it's a string exception, so get the error type
- # from the sys module.
- e = sys.exc_type
- self.fail(e)
- # An error occurred if we leak through to here, so do cleanup.
- self.reset()
- return False
-
- def interact(self):
- """Perform interaction."""
- self.invoke('atInteract')
- done = False
- while not done:
- result = self.wrap(self.file, (sys.stdin, '<interact>'))
- if self.options.get(EXIT_OPT, True):
- done = True
- else:
- if result:
- done = True
- else:
- self.reset()
-
- def fail(self, error, fatal=False):
- """Handle an actual error that occurred."""
- if self.options.get(BUFFERED_OPT, False):
- try:
- self.output.abort()
- except AttributeError:
- # If the output file object doesn't have an abort method,
- # something got mismatched, but it's too late to do
- # anything about it now anyway, so just ignore it.
- pass
- meta = self.meta(error)
- self.handle(meta)
- if self.options.get(RAW_OPT, False):
- raise
- if fatal or self.options.get(EXIT_OPT, True):
- sys.exit(FAILURE_CODE)
-
- def file(self, file, name='<file>', locals=None):
- """Parse the entire contents of a file-like object, line by line."""
- context = Context(name)
- self.contexts.push(context)
- self.invoke('beforeFile', name=name, file=file, locals=locals)
- scanner = Scanner(self.prefix)
- first = True
- done = False
- while not done:
- self.context().bump()
- line = file.readline()
- if first:
- if self.options.get(BANGPATH_OPT, True) and self.prefix:
- # Replace a bangpath at the beginning of the first line
- # with an EmPy comment.
- if string.find(line, BANGPATH) == 0:
- line = self.prefix + '#' + line[2:]
- first = False
- if line:
- scanner.feed(line)
- else:
- done = True
- self.safe(scanner, done, locals)
- self.invoke('afterFile')
- self.contexts.pop()
-
- def binary(self, file, name='<binary>', chunkSize=0, locals=None):
- """Parse the entire contents of a file-like object, in chunks."""
- if chunkSize <= 0:
- chunkSize = DEFAULT_CHUNK_SIZE
- context = Context(name, units='bytes')
- self.contexts.push(context)
- self.invoke('beforeBinary', name=name, file=file, \
- chunkSize=chunkSize, locals=locals)
- scanner = Scanner(self.prefix)
- done = False
- while not done:
- chunk = file.read(chunkSize)
- if chunk:
- scanner.feed(chunk)
- else:
- done = True
- self.safe(scanner, done, locals)
- self.context().bump(len(chunk))
- self.invoke('afterBinary')
- self.contexts.pop()
-
- def string(self, data, name='<string>', locals=None):
- """Parse a string."""
- context = Context(name)
- self.contexts.push(context)
- self.invoke('beforeString', name=name, string=data, locals=locals)
- context.bump()
- scanner = Scanner(self.prefix, data)
- self.safe(scanner, True, locals)
- self.invoke('afterString')
- self.contexts.pop()
-
- def safe(self, scanner, final=False, locals=None):
- """Do a protected parse. Catch transient parse errors; if
- final is true, then make a final pass with a terminator,
- otherwise ignore the transient parse error (more data is
- pending)."""
- try:
- self.parse(scanner, locals)
- except TransientParseError:
- if final:
- # If the buffer doesn't end with a newline, try tacking on
- # a dummy terminator.
- buffer = scanner.rest()
- if buffer and buffer[-1] != '\n':
- scanner.feed(self.prefix + '\n')
- # A TransientParseError thrown from here is a real parse
- # error.
- self.parse(scanner, locals)
-
- def parse(self, scanner, locals=None):
- """Parse and run as much from this scanner as possible."""
- self.invoke('atParse', scanner=scanner, locals=locals)
- while True:
- token = scanner.one()
- if token is None:
- break
- self.invoke('atToken', token=token)
- token.run(self, locals)
-
- # Medium-level evaluation and execution.
-
- def tokenize(self, name):
- """Take an lvalue string and return a name or a (possibly recursive)
- list of names."""
- result = []
- stack = [result]
- for garbage in self.ASSIGN_TOKEN_RE.split(name):
- garbage = string.strip(garbage)
- if garbage:
- raise ParseError, "unexpected assignment token: '%s'" % garbage
- tokens = self.ASSIGN_TOKEN_RE.findall(name)
- # While processing, put a None token at the start of any list in which
- # commas actually appear.
- for token in tokens:
- if token == '(':
- stack.append([])
- elif token == ')':
- top = stack.pop()
- if len(top) == 1:
- top = top[0] # no None token means that it's not a 1-tuple
- elif top[0] is None:
- del top[0] # remove the None token for real tuples
- stack[-1].append(top)
- elif token == ',':
- if len(stack[-1]) == 1:
- stack[-1].insert(0, None)
- else:
- stack[-1].append(token)
- # If it's a 1-tuple at the top level, turn it into a real subsequence.
- if result and result[0] is None:
- result = [result[1:]]
- if len(result) == 1:
- return result[0]
- else:
- return result
-
- def significate(self, key, value=None, locals=None):
- """Declare a significator."""
- self.invoke('beforeSignificate', key=key, value=value, locals=locals)
- name = '__%s__' % key
- self.atomic(name, value, locals)
- self.invoke('afterSignificate')
-
- def atomic(self, name, value, locals=None):
- """Do an atomic assignment."""
- self.invoke('beforeAtomic', name=name, value=value, locals=locals)
- if locals is None:
- self.globals[name] = value
- else:
- locals[name] = value
- self.invoke('afterAtomic')
-
- def multi(self, names, values, locals=None):
- """Do a (potentially recursive) assignment."""
- self.invoke('beforeMulti', names=names, values=values, locals=locals)
- # No zip in 1.5, so we have to do it manually.
- i = 0
- try:
- values = tuple(values)
- except TypeError:
- raise TypeError, "unpack non-sequence"
- if len(names) != len(values):
- raise ValueError, "unpack tuple of wrong size"
- for i in range(len(names)):
- name = names[i]
- if type(name) is types.StringType:
- self.atomic(name, values[i], locals)
- else:
- self.multi(name, values[i], locals)
- self.invoke('afterMulti')
-
- def assign(self, name, value, locals=None):
- """Do a potentially complex (including tuple unpacking) assignment."""
- left = self.tokenize(name)
- # The return value of tokenize can either be a string or a list of
- # (lists of) strings.
- if type(left) is types.StringType:
- self.atomic(left, value, locals)
- else:
- self.multi(left, value, locals)
-
- def import_(self, name, locals=None):
- """Do an import."""
- self.invoke('beforeImport', name=name, locals=locals)
- self.execute('import %s' % name, locals)
- self.invoke('afterImport')
-
- def clause(self, catch, locals=None):
- """Given the string representation of an except clause, turn it into
- a 2-tuple consisting of the class name, and either a variable name
- or None."""
- self.invoke('beforeClause', catch=catch, locals=locals)
- if catch is None:
- exceptionCode, variable = None, None
- elif string.find(catch, ',') >= 0:
- exceptionCode, variable = string.split(string.strip(catch), ',', 1)
- variable = string.strip(variable)
- else:
- exceptionCode, variable = string.strip(catch), None
- if not exceptionCode:
- exception = Exception
- else:
- exception = self.evaluate(exceptionCode, locals)
- self.invoke('afterClause', exception=exception, variable=variable)
- return exception, variable
-
- def serialize(self, expression, locals=None):
- """Do an expansion, involving evaluating an expression, then
- converting it to a string and writing that string to the
- output if the evaluation is not None."""
- self.invoke('beforeSerialize', expression=expression, locals=locals)
- result = self.evaluate(expression, locals)
- if result is not None:
- self.write(str(result))
- self.invoke('afterSerialize')
-
- def defined(self, name, locals=None):
- """Return a Boolean indicating whether or not the name is
- defined either in the locals or the globals."""
- self.invoke('beforeDefined', name=name, local=local)
- if locals is not None:
- if locals.has_key(name):
- result = True
- else:
- result = False
- elif self.globals.has_key(name):
- result = True
- else:
- result = False
- self.invoke('afterDefined', result=result)
-
- def literal(self, text):
- """Process a string literal."""
- self.invoke('beforeLiteral', text=text)
- self.serialize(text)
- self.invoke('afterLiteral')
-
- # Low-level evaluation and execution.
-
- def evaluate(self, expression, locals=None):
- """Evaluate an expression."""
- if expression in ('1', 'True'): return True
- if expression in ('0', 'False'): return False
- self.push()
- try:
- self.invoke('beforeEvaluate', \
- expression=expression, locals=locals)
- if locals is not None:
- result = eval(expression, self.globals, locals)
- else:
- result = eval(expression, self.globals)
- self.invoke('afterEvaluate', result=result)
- return result
- finally:
- self.pop()
-
- def execute(self, statements, locals=None):
- """Execute a statement."""
- # If there are any carriage returns (as opposed to linefeeds/newlines)
- # in the statements code, then remove them. Even on DOS/Windows
- # platforms,
- if string.find(statements, '\r') >= 0:
- statements = string.replace(statements, '\r', '')
- # If there are no newlines in the statements code, then strip any
- # leading or trailing whitespace.
- if string.find(statements, '\n') < 0:
- statements = string.strip(statements)
- self.push()
- try:
- self.invoke('beforeExecute', \
- statements=statements, locals=locals)
- if locals is not None:
- exec statements in self.globals, locals
- else:
- exec statements in self.globals
- self.invoke('afterExecute')
- finally:
- self.pop()
-
- def single(self, source, locals=None):
- """Execute an expression or statement, just as if it were
- entered into the Python interactive interpreter."""
- self.push()
- try:
- self.invoke('beforeSingle', \
- source=source, locals=locals)
- code = compile(source, '<single>', 'single')
- if locals is not None:
- exec code in self.globals, locals
- else:
- exec code in self.globals
- self.invoke('afterSingle')
- finally:
- self.pop()
-
- # Hooks.
-
- def register(self, hook, prepend=False):
- """Register the provided hook."""
- hook.register(self)
- if self.hooksEnabled is None:
- # A special optimization so that hooks can be effectively
- # disabled until one is added or they are explicitly turned on.
- self.hooksEnabled = True
- if prepend:
- self.hooks.insert(0, hook)
- else:
- self.hooks.append(hook)
-
- def deregister(self, hook):
- """Remove an already registered hook."""
- hook.deregister(self)
- self.hooks.remove(hook)
-
- def invoke(self, _name, **keywords):
- """Invoke the hook(s) associated with the hook name, should they
- exist."""
- if self.hooksEnabled:
- for hook in self.hooks:
- hook.push()
- try:
- method = getattr(hook, _name)
- apply(method, (), keywords)
- finally:
- hook.pop()
-
- def finalize(self):
- """Execute any remaining final routines."""
- self.push()
- self.invoke('atFinalize')
- try:
- # Pop them off one at a time so they get executed in reverse
- # order and we remove them as they're executed in case something
- # bad happens.
- while self.finals:
- final = self.finals.pop()
- final()
- finally:
- self.pop()
-
- # Error handling.
-
- def meta(self, exc=None):
- """Construct a MetaError for the interpreter's current state."""
- return MetaError(self.contexts.clone(), exc)
-
- def handle(self, meta):
- """Handle a MetaError."""
- first = True
- self.invoke('atHandle', meta=meta)
- for context in meta.contexts:
- if first:
- if meta.exc is not None:
- desc = "error: %s: %s" % (meta.exc.__class__, meta.exc)
- else:
- desc = "error"
- else:
- desc = "from this context"
- first = False
- sys.stderr.write('%s: %s\n' % (context, desc))
-
- def installProxy(self):
- """Install a proxy if necessary."""
- # Unfortunately, there's no surefire way to make sure that installing
- # a sys.stdout proxy is idempotent, what with different interpreters
- # running from different modules. The best we can do here is to try
- # manipulating the proxy's test function ...
- try:
- sys.stdout._testProxy()
- except AttributeError:
- # ... if the current stdout object doesn't have one, then check
- # to see if we think _this_ particularly Interpreter class has
- # installed it before ...
- if Interpreter._wasProxyInstalled:
- # ... and if so, we have a proxy problem.
- raise Error, "interpreter stdout proxy lost"
- else:
- # Otherwise, install the proxy and set the flag.
- sys.stdout = ProxyFile(sys.stdout)
- Interpreter._wasProxyInstalled = True
-
- #
- # Pseudomodule routines.
- #
-
- # Identification.
-
- def identify(self):
- """Identify the topmost context with a 2-tuple of the name and
- line number."""
- return self.context().identify()
-
- def atExit(self, callable):
- """Register a function to be called at exit."""
- self.finals.append(callable)
-
- # Context manipulation.
-
- def pushContext(self, name='<unnamed>', line=0):
- """Create a new context and push it."""
- self.contexts.push(Context(name, line))
-
- def popContext(self):
- """Pop the top context."""
- self.contexts.pop()
-
- def setContextName(self, name):
- """Set the name of the topmost context."""
- context = self.context()
- context.name = name
-
- def setContextLine(self, line):
- """Set the name of the topmost context."""
- context = self.context()
- context.line = line
-
- setName = setContextName # DEPRECATED
- setLine = setContextLine # DEPRECATED
-
- # Globals manipulation.
-
- def getGlobals(self):
- """Retrieve the globals."""
- return self.globals
-
- def setGlobals(self, globals):
- """Set the globals to the specified dictionary."""
- self.globals = globals
- self.fix()
-
- def updateGlobals(self, otherGlobals):
- """Merge another mapping object into this interpreter's globals."""
- self.update(otherGlobals)
-
- def clearGlobals(self):
- """Clear out the globals with a brand new dictionary."""
- self.clear()
-
- def saveGlobals(self, deep=True):
- """Save a copy of the globals off onto the history stack."""
- self.save(deep)
-
- def restoreGlobals(self, destructive=True):
- """Restore the most recently saved copy of the globals."""
- self.restore(destructive)
-
- # Hook support.
-
- def areHooksEnabled(self):
- """Return whether or not hooks are presently enabled."""
- if self.hooksEnabled is None:
- return True
- else:
- return self.hooksEnabled
-
- def enableHooks(self):
- """Enable hooks."""
- self.hooksEnabled = True
-
- def disableHooks(self):
- """Disable hooks."""
- self.hooksEnabled = False
-
- def getHooks(self):
- """Get the current hooks."""
- return self.hooks[:]
-
- def clearHooks(self):
- """Clear all hooks."""
- self.hooks = []
-
- def addHook(self, hook, prepend=False):
- """Add a new hook; optionally insert it rather than appending it."""
- self.register(hook, prepend)
-
- def removeHook(self, hook):
- """Remove a preexisting hook."""
- self.deregister(hook)
-
- def invokeHook(self, _name, **keywords):
- """Manually invoke a hook."""
- apply(self.invoke, (_name,), keywords)
-
- # Callbacks.
-
- def getCallback(self):
- """Get the callback registered with this interpreter, or None."""
- return self.callback
-
- def registerCallback(self, callback):
- """Register a custom markup callback with this interpreter."""
- self.callback = callback
-
- def deregisterCallback(self):
- """Remove any previously registered callback with this interpreter."""
- self.callback = None
-
- def invokeCallback(self, contents):
- """Invoke the callback."""
- if self.callback is None:
- if self.options.get(CALLBACK_OPT, False):
- raise Error, "custom markup invoked with no defined callback"
- else:
- self.callback(contents)
-
- # Pseudomodule manipulation.
-
- def flatten(self, keys=None):
- """Flatten the contents of the pseudo-module into the globals
- namespace."""
- if keys is None:
- keys = self.__dict__.keys() + self.__class__.__dict__.keys()
- dict = {}
- for key in keys:
- # The pseudomodule is really a class instance, so we need to
- # fumble use getattr instead of simply fumbling through the
- # instance's __dict__.
- dict[key] = getattr(self, key)
- # Stomp everything into the globals namespace.
- self.globals.update(dict)
-
- # Prefix.
-
- def getPrefix(self):
- """Get the current prefix."""
- return self.prefix
-
- def setPrefix(self, prefix):
- """Set the prefix."""
- self.prefix = prefix
-
- # Diversions.
-
- def stopDiverting(self):
- """Stop any diverting."""
- self.stream().revert()
-
- def createDiversion(self, name):
- """Create a diversion (but do not divert to it) if it does not
- already exist."""
- self.stream().create(name)
-
- def retrieveDiversion(self, name):
- """Retrieve the diversion object associated with the name."""
- return self.stream().retrieve(name)
-
- def startDiversion(self, name):
- """Start diverting to the given diversion name."""
- self.stream().divert(name)
-
- def playDiversion(self, name):
- """Play the given diversion and then purge it."""
- self.stream().undivert(name, True)
-
- def replayDiversion(self, name):
- """Replay the diversion without purging it."""
- self.stream().undivert(name, False)
-
- def purgeDiversion(self, name):
- """Eliminate the given diversion."""
- self.stream().purge(name)
-
- def playAllDiversions(self):
- """Play all existing diversions and then purge them."""
- self.stream().undivertAll(True)
-
- def replayAllDiversions(self):
- """Replay all existing diversions without purging them."""
- self.stream().undivertAll(False)
-
- def purgeAllDiversions(self):
- """Purge all existing diversions."""
- self.stream().purgeAll()
-
- def getCurrentDiversion(self):
- """Get the name of the current diversion."""
- return self.stream().currentDiversion
-
- def getAllDiversions(self):
- """Get the names of all existing diversions."""
- names = self.stream().diversions.keys()
- names.sort()
- return names
-
- # Filter.
-
- def resetFilter(self):
- """Reset the filter so that it does no filtering."""
- self.stream().install(None)
-
- def nullFilter(self):
- """Install a filter that will consume all text."""
- self.stream().install(0)
-
- def getFilter(self):
- """Get the current filter."""
- filter = self.stream().filter
- if filter is self.stream().file:
- return None
- else:
- return filter
-
- def setFilter(self, shortcut):
- """Set the filter."""
- self.stream().install(shortcut)
-
- def attachFilter(self, shortcut):
- """Attach a single filter to the end of the current filter chain."""
- self.stream().attach(shortcut)
-
-
-class Document:
-
- """A representation of an individual EmPy document, as used by a
- processor."""
-
- def __init__(self, ID, filename):
- self.ID = ID
- self.filename = filename
- self.significators = {}
-
-
-class Processor:
-
- """An entity which is capable of processing a hierarchy of EmPy
- files and building a dictionary of document objects associated
- with them describing their significator contents."""
-
- DEFAULT_EMPY_EXTENSIONS = ('.em',)
- SIGNIFICATOR_RE = re.compile(SIGNIFICATOR_RE_STRING)
-
- def __init__(self, factory=Document):
- self.factory = factory
- self.documents = {}
-
- def identifier(self, pathname, filename): return filename
-
- def clear(self):
- self.documents = {}
-
- def scan(self, basename, extensions=DEFAULT_EMPY_EXTENSIONS):
- if type(extensions) is types.StringType:
- extensions = (extensions,)
- def _noCriteria(x):
- return True
- def _extensionsCriteria(pathname, extensions=extensions):
- if extensions:
- for extension in extensions:
- if pathname[-len(extension):] == extension:
- return True
- return False
- else:
- return True
- self.directory(basename, _noCriteria, _extensionsCriteria, None)
- self.postprocess()
-
- def postprocess(self):
- pass
-
- def directory(self, basename, dirCriteria, fileCriteria, depth=None):
- if depth is not None:
- if depth <= 0:
- return
- else:
- depth = depth - 1
- filenames = os.listdir(basename)
- for filename in filenames:
- pathname = os.path.join(basename, filename)
- if os.path.isdir(pathname):
- if dirCriteria(pathname):
- self.directory(pathname, dirCriteria, fileCriteria, depth)
- elif os.path.isfile(pathname):
- if fileCriteria(pathname):
- documentID = self.identifier(pathname, filename)
- document = self.factory(documentID, pathname)
- self.file(document, open(pathname))
- self.documents[documentID] = document
-
- def file(self, document, file):
- while True:
- line = file.readline()
- if not line:
- break
- self.line(document, line)
-
- def line(self, document, line):
- match = self.SIGNIFICATOR_RE.search(line)
- if match:
- key, valueS = match.groups()
- valueS = string.strip(valueS)
- if valueS:
- value = eval(valueS)
- else:
- value = None
- document.significators[key] = value
-
-
-def expand(_data, _globals=None, \
- _argv=None, _prefix=DEFAULT_PREFIX, _pseudo=None, _options=None, \
- **_locals):
- """Do an atomic expansion of the given source data, creating and
- shutting down an interpreter dedicated to the task. The sys.stdout
- object is saved off and then replaced before this function
- returns."""
- if len(_locals) == 0:
- # If there were no keyword arguments specified, don't use a locals
- # dictionary at all.
- _locals = None
- output = NullFile()
- interpreter = Interpreter(output, argv=_argv, prefix=_prefix, \
- pseudo=_pseudo, options=_options, \
- globals=_globals)
- if interpreter.options.get(OVERRIDE_OPT, True):
- oldStdout = sys.stdout
- try:
- result = interpreter.expand(_data, _locals)
- finally:
- interpreter.shutdown()
- if _globals is not None:
- interpreter.unfix() # remove pseudomodule to prevent clashes
- if interpreter.options.get(OVERRIDE_OPT, True):
- sys.stdout = oldStdout
- return result
-
-def environment(name, default=None):
- """Get data from the current environment. If the default is True
- or False, then presume that we're only interested in the existence
- or non-existence of the environment variable."""
- if os.environ.has_key(name):
- # Do the True/False test by value for future compatibility.
- if default == False or default == True:
- return True
- else:
- return os.environ[name]
- else:
- return default
-
-def info(table):
- DEFAULT_LEFT = 28
- maxLeft = 0
- maxRight = 0
- for left, right in table:
- if len(left) > maxLeft:
- maxLeft = len(left)
- if len(right) > maxRight:
- maxRight = len(right)
- FORMAT = ' %%-%ds %%s\n' % max(maxLeft, DEFAULT_LEFT)
- for left, right in table:
- if right.find('\n') >= 0:
- for right in right.split('\n'):
- sys.stderr.write(FORMAT % (left, right))
- left = ''
- else:
- sys.stderr.write(FORMAT % (left, right))
-
-def usage(verbose=True):
- """Print usage information."""
- programName = sys.argv[0]
- def warn(line=''):
- sys.stderr.write("%s\n" % line)
- warn("""\
-Usage: %s [options] [<filename, or '-' for stdin> [<argument>...]]
-Welcome to EmPy version %s.""" % (programName, __version__))
- warn()
- warn("Valid options:")
- info(OPTION_INFO)
- if verbose:
- warn()
- warn("The following markups are supported:")
- info(MARKUP_INFO)
- warn()
- warn("Valid escape sequences are:")
- info(ESCAPE_INFO)
- warn()
- warn("The %s pseudomodule contains the following attributes:" % \
- DEFAULT_PSEUDOMODULE_NAME)
- info(PSEUDOMODULE_INFO)
- warn()
- warn("The following environment variables are recognized:")
- info(ENVIRONMENT_INFO)
- warn()
- warn(USAGE_NOTES)
- else:
- warn()
- warn("Type %s -H for more extensive help." % programName)
-
-def invoke(args):
- """Run a standalone instance of an EmPy interpeter."""
- # Initialize the options.
- _output = None
- _options = {BUFFERED_OPT: environment(BUFFERED_ENV, False),
- RAW_OPT: environment(RAW_ENV, False),
- EXIT_OPT: True,
- FLATTEN_OPT: environment(FLATTEN_ENV, False),
- OVERRIDE_OPT: not environment(NO_OVERRIDE_ENV, False),
- CALLBACK_OPT: False}
- _preprocessing = []
- _prefix = environment(PREFIX_ENV, DEFAULT_PREFIX)
- _pseudo = environment(PSEUDO_ENV, None)
- _interactive = environment(INTERACTIVE_ENV, False)
- _extraArguments = environment(OPTIONS_ENV)
- _binary = -1 # negative for not, 0 for default size, positive for size
- _unicode = environment(UNICODE_ENV, False)
- _unicodeInputEncoding = environment(INPUT_ENCODING_ENV, None)
- _unicodeOutputEncoding = environment(OUTPUT_ENCODING_ENV, None)
- _unicodeInputErrors = environment(INPUT_ERRORS_ENV, None)
- _unicodeOutputErrors = environment(OUTPUT_ERRORS_ENV, None)
- _hooks = []
- _pauseAtEnd = False
- _relativePath = False
- if _extraArguments is not None:
- _extraArguments = string.split(_extraArguments)
- args = _extraArguments + args
- # Parse the arguments.
- pairs, remainder = getopt.getopt(args, 'VhHvkp:m:frino:a:buBP:I:D:E:F:', ['version', 'help', 'extended-help', 'verbose', 'null-hook', 'suppress-errors', 'prefix=', 'no-prefix', 'module=', 'flatten', 'raw-errors', 'interactive', 'no-override-stdout', 'binary', 'chunk-size=', 'output=' 'append=', 'preprocess=', 'import=', 'define=', 'execute=', 'execute-file=', 'buffered-output', 'pause-at-end', 'relative-path', 'no-callback-error', 'no-bangpath-processing', 'unicode', 'unicode-encoding=', 'unicode-input-encoding=', 'unicode-output-encoding=', 'unicode-errors=', 'unicode-input-errors=', 'unicode-output-errors='])
- for option, argument in pairs:
- if option in ('-V', '--version'):
- sys.stderr.write("%s version %s\n" % (__program__, __version__))
- return
- elif option in ('-h', '--help'):
- usage(False)
- return
- elif option in ('-H', '--extended-help'):
- usage(True)
- return
- elif option in ('-v', '--verbose'):
- _hooks.append(VerboseHook())
- elif option in ('--null-hook',):
- _hooks.append(Hook())
- elif option in ('-k', '--suppress-errors'):
- _options[EXIT_OPT] = False
- _interactive = True # suppress errors implies interactive mode
- elif option in ('-m', '--module'):
- _pseudo = argument
- elif option in ('-f', '--flatten'):
- _options[FLATTEN_OPT] = True
- elif option in ('-p', '--prefix'):
- _prefix = argument
- elif option in ('--no-prefix',):
- _prefix = None
- elif option in ('-r', '--raw-errors'):
- _options[RAW_OPT] = True
- elif option in ('-i', '--interactive'):
- _interactive = True
- elif option in ('-n', '--no-override-stdout'):
- _options[OVERRIDE_OPT] = False
- elif option in ('-o', '--output'):
- _output = argument, 'w', _options[BUFFERED_OPT]
- elif option in ('-a', '--append'):
- _output = argument, 'a', _options[BUFFERED_OPT]
- elif option in ('-b', '--buffered-output'):
- _options[BUFFERED_OPT] = True
- elif option in ('-B',): # DEPRECATED
- _options[BUFFERED_OPT] = True
- elif option in ('--binary',):
- _binary = 0
- elif option in ('--chunk-size',):
- _binary = int(argument)
- elif option in ('-P', '--preprocess'):
- _preprocessing.append(('pre', argument))
- elif option in ('-I', '--import'):
- for module in string.split(argument, ','):
- module = string.strip(module)
- _preprocessing.append(('import', module))
- elif option in ('-D', '--define'):
- _preprocessing.append(('define', argument))
- elif option in ('-E', '--execute'):
- _preprocessing.append(('exec', argument))
- elif option in ('-F', '--execute-file'):
- _preprocessing.append(('file', argument))
- elif option in ('-u', '--unicode'):
- _unicode = True
- elif option in ('--pause-at-end',):
- _pauseAtEnd = True
- elif option in ('--relative-path',):
- _relativePath = True
- elif option in ('--no-callback-error',):
- _options[CALLBACK_OPT] = True
- elif option in ('--no-bangpath-processing',):
- _options[BANGPATH_OPT] = False
- elif option in ('--unicode-encoding',):
- _unicodeInputEncoding = _unicodeOutputEncoding = argument
- elif option in ('--unicode-input-encoding',):
- _unicodeInputEncoding = argument
- elif option in ('--unicode-output-encoding',):
- _unicodeOutputEncoding = argument
- elif option in ('--unicode-errors',):
- _unicodeInputErrors = _unicodeOutputErrors = argument
- elif option in ('--unicode-input-errors',):
- _unicodeInputErrors = argument
- elif option in ('--unicode-output-errors',):
- _unicodeOutputErrors = argument
- # Set up the Unicode subsystem if required.
- if _unicode or \
- _unicodeInputEncoding or _unicodeOutputEncoding or \
- _unicodeInputErrors or _unicodeOutputErrors:
- theSubsystem.initialize(_unicodeInputEncoding, \
- _unicodeOutputEncoding, \
- _unicodeInputErrors, _unicodeOutputErrors)
- # Now initialize the output file if something has already been selected.
- if _output is not None:
- _output = apply(AbstractFile, _output)
- # Set up the main filename and the argument.
- if not remainder:
- remainder.append('-')
- filename, arguments = remainder[0], remainder[1:]
- # Set up the interpreter.
- if _options[BUFFERED_OPT] and _output is None:
- raise ValueError, "-b only makes sense with -o or -a arguments"
- if _prefix == 'None':
- _prefix = None
- if _prefix and type(_prefix) is types.StringType and len(_prefix) != 1:
- raise Error, "prefix must be single-character string"
- interpreter = Interpreter(output=_output, \
- argv=remainder, \
- prefix=_prefix, \
- pseudo=_pseudo, \
- options=_options, \
- hooks=_hooks)
- try:
- # Execute command-line statements.
- i = 0
- for which, thing in _preprocessing:
- if which == 'pre':
- command = interpreter.file
- target = theSubsystem.open(thing, 'r')
- name = thing
- elif which == 'define':
- command = interpreter.string
- if string.find(thing, '=') >= 0:
- target = '%s{%s}' % (_prefix, thing)
- else:
- target = '%s{%s = None}' % (_prefix, thing)
- name = '<define:%d>' % i
- elif which == 'exec':
- command = interpreter.string
- target = '%s{%s}' % (_prefix, thing)
- name = '<exec:%d>' % i
- elif which == 'file':
- command = interpreter.string
- name = '<file:%d (%s)>' % (i, thing)
- target = '%s{execfile("""%s""")}' % (_prefix, thing)
- elif which == 'import':
- command = interpreter.string
- name = '<import:%d>' % i
- target = '%s{import %s}' % (_prefix, thing)
- else:
- assert 0
- interpreter.wrap(command, (target, name))
- i = i + 1
- # Now process the primary file.
- interpreter.ready()
- if filename == '-':
- if not _interactive:
- name = '<stdin>'
- path = ''
- file = sys.stdin
- else:
- name, file = None, None
- else:
- name = filename
- file = theSubsystem.open(filename, 'r')
- path = os.path.split(filename)[0]
- if _relativePath:
- sys.path.insert(0, path)
- if file is not None:
- if _binary < 0:
- interpreter.wrap(interpreter.file, (file, name))
- else:
- chunkSize = _binary
- interpreter.wrap(interpreter.binary, (file, name, chunkSize))
- # If we're supposed to go interactive afterwards, do it.
- if _interactive:
- interpreter.interact()
- finally:
- interpreter.shutdown()
- # Finally, if we should pause at the end, do it.
- if _pauseAtEnd:
- try:
- raw_input()
- except EOFError:
- pass
-
-def main():
- invoke(sys.argv[1:])
-
-if __name__ == '__main__': main()
diff --git a/data/gtkrc.em b/data/gtkrc.em
deleted file mode 100644
index a19b519..0000000
--- a/data/gtkrc.em
+++ /dev/null
@@ -1,14 +0,0 @@
-@{
-if theme == 'sugar':
- font_name = 'Sans Serif 10'
- icon_sizes = 'gtk-large-toolbar=40,40'
-else:
- font_name = 'Sans Serif 7'
- icon_sizes = 'gtk-large-toolbar=55,55'
-}@
-gtk-theme-name = "@theme"
-gtk-icon-theme-name = "sugar"
-gtk-font-name = "@font_name"
-gtk-cursor-theme-name = "sugar"
-gtk-toolbar-style = GTK_TOOLBAR_ICONS
-gtk-icon-sizes = "@icon_sizes"
diff --git a/data/kbdconfig b/data/kbdconfig
deleted file mode 100644
index 03c288a..0000000
--- a/data/kbdconfig
+++ /dev/null
@@ -1,3 +0,0 @@
-# This is the sugar keyboard configuration for matchbox
-
-<Alt>return=fullscreen
diff --git a/data/mime.defaults b/data/mime.defaults
deleted file mode 100644
index 1cb2687..0000000
--- a/data/mime.defaults
+++ /dev/null
@@ -1,21 +0,0 @@
-# MIME Activity service name
-
-application/pdf org.laptop.sugar.ReadActivity
-
-text/rtf org.laptop.AbiWordActivity
-text/plain org.laptop.AbiWordActivity
-application/x-abiword org.laptop.AbiWordActivity
-text/x-xml-abiword org.laptop.AbiWordActivity
-application/msword org.laptop.AbiWordActivity
-application/rtf org.laptop.AbiWordActivity
-
-image/png org.laptop.WebActivity
-image/gif org.laptop.WebActivity
-image/jpeg org.laptop.WebActivity
-text/html org.laptop.WebActivity
-application/xhtml+xml org.laptop.WebActivity
-application/xml org.laptop.WebActivity
-application/rss+xml org.laptop.WebActivity
-application/ogg org.laptop.WebActivity
-audio/ogg org.laptop.WebActivity
-video/ogg org.laptop.WebActivity
diff --git a/data/sugar.xml.in b/data/sugar.xml.in
deleted file mode 100644
index 6a7f253..0000000
--- a/data/sugar.xml.in
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
- <mime-type type="application/vnd.olpc-sugar">
- <_comment>Sugar activity bundle</_comment>
- <glob pattern="*.xo"/>
- </mime-type>
- <mime-type type="application/vnd.olpc-content">
- <_comment>Sugar content bundle</_comment>
- <glob pattern="*.xol"/>
- </mime-type>
-</mime-info> \ No newline at end of file
diff --git a/docs/GPL-C.txt b/docs/GPL-C.txt
deleted file mode 100644
index aa909b4..0000000
--- a/docs/GPL-C.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * 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
- */
-
diff --git a/docs/GPL-python.txt b/docs/GPL-python.txt
deleted file mode 100644
index 96e81d1..0000000
--- a/docs/GPL-python.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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
-
diff --git a/docs/LGPL-C.txt b/docs/LGPL-C.txt
deleted file mode 100644
index 88798f8..0000000
--- a/docs/LGPL-C.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright (C) 2006, Red Hat, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
diff --git a/docs/LGPL-python.txt b/docs/LGPL-python.txt
deleted file mode 100644
index 1db1ea4..0000000
--- a/docs/LGPL-python.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2006, Red Hat, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
diff --git a/docs/controls.txt b/docs/controls.txt
deleted file mode 100644
index 52591ea..0000000
--- a/docs/controls.txt
+++ /dev/null
@@ -1,199 +0,0 @@
-Colors
-
-Black - palettes, popups
-Toolbar Grey #262626 - toolbars, expanded palette
-Button Grey #808080 - buttons
-Selection Grey #A6A6A6 - selection, expanded panels
-Panel Grey #C0C0C0 - panel, desktop
-Text field Grey #E5E5E5 - text field background
-White - pressed states and multiline text areas
-
-States
-
-Default - gtk.STATE_NORMAL
-Focused - gtk.STATE_SELECTED
-Pressed - gtk.STATE_ACTIVE
-Hover - gtk.STATE_PRELIGHT
-Inactive - gtk.STATE_INSENSITIVE
-
-gtk.Button
-
-* The image should work the same of the image button
-* Need to write a theme to match the visual style
-* Cancel should never be default because you can always activate it with Esc
-* Radius should be 1/2 of the control height
-* Write a list of stock icons people should use and replace them in the theme to match our visual style
-
-sugar.Icon
-
-* Used in canvas-like views so probably an Hippo item.
-* Svg Only.
-* It should support xo colors easily.
-* Rollovers with a focus mark.
-
-sugar.IconButton
-
-* Support for SVG and png.
-* Icons should be grey scale. But might be coloured with the XO colors (svg only)
-* Size of the button is 75 pixels, size of the icon canvas is 55 and suggested icon size is around 45.
-* States, defaults:
- Hover : Black
- Pressed : Rounded rectangle 61 pixels, 10 pixels of radius, filled in selection grey
- Focused : Rounded rectangle 61 pixels, 10 pixels of radius, stroked in white 2.25 points
- Inactive. Fallbacks if no inactive icon is specified.
- Svg: Remove the fill and render the stroke in button grey
- Png: just do some effect on the pixbuf, which also work for grey icons
-* You can set an icon for each states which replace the default except for the Hover state of buttons which has rollover.
-* "palette" boolean property. If true show an arrow active immediately on click (but also on hover)
-
-sugar.ToolButton (support for rollovers)
-
-* Contains IconButton
-* There is no palette but a tooltip.
-* Normal: Button grey rounded filled rectangle
-* Inactive: Button grey rounded stroked rectangle
-
-sugar.ToggleIconButton
-
-* Toggled should be like Pressed
-* Inconsistent should be the same of Default (the action depend on the cases)
-* Pressed state and Toggled state is Selection grey
-
-sugar.ToolIconButton
-
-* Contains a ToggleIconButton
-
-gtk.CheckButton
-
-* Match the visual design, shoul be possible with just theme changes
-
-gtk.RadioButton
-
-* Exactly like CheckButton just a different indicator
-
-gtk.OptionMenu
-
-* Match the visual style. Hopefully only theme changes.
-* Add the scroll thing.
-* Groups. Either by a normal separator or a titled separator.
-* Optional support for showing just the icon from the menu (maybe, low priority)
-* Allow fixed sizing of the "button" and ellipsize the label
-
-sugar.Entry
-
-* Support for packing icons before and after the entry. Extend gtk.Entry.
-* Activate/Cancel functionality.
- Two buttons at the end to the entry and key bindings (Esc and Enter). They are visible only when there are changes.
- The icons appear only when the field is focused and the content is changed since it gained focus.
- When hitting escape revert and select all the text.
-
-gtk.ComboxBox
-
-* We miss accept/cancel functionality. Probably patch gtk to allow to replace the entry in the combo box with sugar.Entry.
-
-sugar.SearchEntry
-
-* Use sugar.Entry
-* Search button on the left. Clicking should focus the entry.
-* Cancel button (Esc) on the right, always visible when there is text in the entry. Clicking it will clear the text and focus the textfield.
-* Activate button (Enter) on the right displayed when the content of the text field changed from the last focus or activation.
-* While activating:
- the Activate button becomes a Spinner.
- clicking the close button also cancel the search.
-* When activation is completed:
- The spinner goes away.
- We *don't* clear the entry but we select the text.
-* Search can either be incremental or on activation. For incremental there is no Accept button. start_spinning and stop_spinning to control the spin icon. start would only spin for an amount of time decided by the widget itself (and documented).
-* The suggestions list is provided by the application. Need to figure out which api to use, either model or signal based.
-* Default implementation of suggestions which automatically save the latest searches.
-
-sugar.DateSelector
-sugar.DateComboBox (lower priority)
-
-* Pluggable calendar implementation to support different kind of calendars (localization).
-* Might reuse gtk.Calendar. We should unify month/year selectors and accellerate the movement gradually.
-
-gtk.SpinButton
-
-* Make it match the visual design, hopefully just theme changes
-
-sugar.ToolItem
-
-* Optional label, either text or icon
-* Used for example to have a label near a SpinButton. Clicking on the label should focus the spin button.
-
-gtk.ProgressBar
-
-* Make it match the visual design, hopefully just theme changes.
-* For determinate progress bars should we always pulse to show that there is activity (power consumption? necessary feedback?)
-* Do not use text inside the progress bar
-
-sugar.Spinner
-
-* pulse() call to keep it running with a timeout
-* stop()
-
-gtk.Range (or sugar.Slider?)
-
-* Property to show the fill in white color, probably default on.
-* Draw the discrete steps.
-* For colored sliders, subclass gtk.Range and add a gradient.
-
-sugar.LevelIndicator
-
-* Set the number of blocks
-* Set the level as percentage
-* Property for discrete or not
-* We can probably use a GtkAdjustment for most of the above.Rollovers
-
-
-gtk.TextView
-
-gtk.ScrolledWindow
-
-* Theme it to match the visual.
-
-sugar.ScrolledWindow
-
-* Support for markers. Line as default and optional support for other shapes (star for bookmarks, circles for xos...). Generic way of add marks and keep them updated (observer?)
-
-gtk.Expander
-
-gtk.Separator
-
-sugar.GroupBox
-
-* just a container
-* set_title and set_title_widget (checkbox, radiobutton...)
-* different color and separator under title
-
-gtk.TreeView
-
-gtk.Notebook
-
-* Expand to fill the whole space by default but property to turn it off
-* Switching tabs with the little arrows should page
-
-Palettes in ToolIconButton, IconButton
-* Inmediately on rollover, show the black background.
-* After a very short delay, show the primary state (name of the action and key shortcut).
-* After a bigger delay, show the popup secondary state.
-* Could be animated.
-* Menu Items would go on the top and then the free-form rollover content.
-* The popup would be a gtk.Window that contains a Label, a MenuShell, an hippo.Canvas (or whatever) and finally a button bar (OK/Cancel).
-* The popup will have a setPrimaryState(label, accelerator) method. For action buttons would be a MenuItem, for the others would only be a Label.
-* The primary state should already have the same width as the secondary state and the expandable areas.
-* Primary states appear and disappear automatically (with a short delay). A click outside makes it disappear instantly.
-* Secondary states appear after a delay, or with a single click on the icon.
-* Secondary disappears with the esc key, clicking outside the popup or clicking on a button inside.
-
-Toolbox
-* When an activity opens, the activity tab should be opened and the focus on the activity title.
-* We must provide an activity tab in the toolbox and would be good to also provide an standard Edit tab.
-
-Grab key
-* We probably will need the grab mode.
-* Highlight the scrollbar in the view the pointer is (the view that will scroll when moving the pointer).
-
-Clipboard
-* Window manager to handle in an invisible window in every corner and forward the events when they are not in the corner, or use XEvIE (X Event Interception Extension).
diff --git a/docs/design.txt b/docs/design.txt
deleted file mode 100644
index 37061af..0000000
--- a/docs/design.txt
+++ /dev/null
@@ -1,126 +0,0 @@
-= Frame =
-
-== Activation and deactivation ==
-
-* Immediately access the frame by hitting any corner pixel (the exact corner point)
-* Hitting any of the screen edges activate the frame after 0.5s delay
-* Pressing and holding the frame key activate the frame until the key is released.
-* Pressing the frame key momentarily toggle the frame. To deactivate it another key press is necessary.
-
-= IRC logs =
-
-Frame
-
-eliason marcopg: First, you can immediately access the frame by hitting any corner pixel.
-dcbw marcopg: I think that's the issue, yes
-eliason Second, you can activate it from any edge, but there is a half second delay. In addition to the delay, the timer on the delay only ticks when the mouse is on an edge pixel and also below some threshold velocity, so if the mouse is moving it will not show up.
-eliason marcopg: Third, there will be a frame key. Pressing and holding this key will invoke the frame until the key is released. Pressing this key momentarily, however, will toggle the frame and keep it in view until the key is pressed again.
-eliason marcopg: All of these things are implemented in Flash (The frame key is 8, I think...), with the exception of the mouse velocity threshold on the edges.
-eliason marcopg: The only other minor usability issue I could see is adding a hit area in the corners. That is, once the frame is out, have an invisible triangle in each corner that is still considered part of the frame, so that rolling out of the frame to get from one edge to another doesn't hide the frame, by accident. In fact, doing this would make the delay on hide unnecessary.
-eliason marcopg: Oh, and other important edges case to think about on the frame: 1) When someone is dragginan object (XO, file, image, etc) the frame should come out prematurely and without delay (maybe once within a large grid cell of the edge) and highlight to indicate where the object could be dropped. 2) When the search field is active, the frame should remain out even if the mouse isn't over it. Only when the search is cleared should it hide again.
-eliason marcopg: The rollover states are as follows: 1) Immediate rollover is a black square in the frame cell itself. 2) Very shortly thereafter (about 1/4 sec) Is the Primary information label and 3) a bit longer after that (about 1/2 sec) the extended panel appears with additional info.
-
-Menu
-
-eliason marcopg: Deactivation is instantaneous at the moment, but again, based on testing with the software we may want to add a very short delay. Also, we may want again to have a invisible triangles between the grid cell in the frame and the extended panel.
-eliason Delay between mouse rollover and showing black square: 0
-eliason Delay before primary info animation begins: 1/10 sec
-eliason Duration of primary info extension animation: 1/5 sec
-eliason Delay from end of primary info animation until secondary info: 1/2 sec
-Duration of secondary info animation: 1/5 sec
-
-Text layout
-
-eliason marcopg: Well, first of all, in the latest screens which we haven't sent out yet, the primary info rollover is designed to fit the text to the nearest microgrid, regardless of the size of the secondary info panel. The second animation segment will both extend the width and height to fit.
-eliason marcopg: As far as cutoff goes, I think that's a reasonable solution. We should allow the primary info text to be as long as the secondary info panel, and beyond that an ellipsis would be a good way to go, though hopefully designers are strongly encouraged NOT to let that happen.
-eliason marcopg: However, there may be cases when we don't want that to happen. I can think of one, which you haven't seen yet: "Invite with X X X X X." The new activity/invite rollover might have the XOs who you are implicitly inviting to start an activity with listed, and we couldn't cut that off (Though we CANget around it and list, say, a max of three people and then indicate that there are 5 more not shown, etc.)
-eliason marcopg: Right. I think that, in most cases, there should be some template for it. If the designer is creating a GUI for an application and making toolsets (such as the color chooser), then we know how big all of those are. Things like "just text" will mostly show up in OS applications like the clippings and such, so we can just pick a preferred size that shows enough text to be meaningful without compromising too much of the screen.
-
-Mesh view
-
-eliason marcopg: also important regarding the results: the fill color should be the background color, so they look like outlines, and the line color should be near enough to the background to make them less contrasty. Also, all XOs in the result set should be z-sorted to the front of their groups. That's key.
-eliason marcopg: The activity icons and XOs are treated separately, so it may be the case that several XOs in a group match the search but the activity their in doesn't, and they would be grayed out independently.
-eliason marcopg: yes, only the color change. Colored stuff is the result. We don't want to actually make things disappear.
-
-
-Mesh discussion
-
-eliason marcopg: Well, the terminology we're now using for the zoom level labels is: My Activities, My Friends, My Neighbors.
-eliason marcopg: Alright, true, so the working terminology (not the labels for the search field, but still used by all of us) is: home, friends, mesh
-eliason marcopg: If you treat each frieeliason marcopg: If you treat each friend or group as a node in a graph, and each edge in the graph as a spring, you can let the system reach an equilibrium using a basic physics simulation that will spread the nodes out evenly.nd or group as a node in a graph, and each edge in the graph as a spring, you can let the system reach an equilibrium using a basic physics simulation that will spread the nodes out evenly.
-eliason marcopg: If you treat each friend or group as a node in a graph, and each edge in the graph as a spring, you can let the system reach an equilibrium using a basic physics simulation that will spread the nodes out evenly.
-eliason marcopg: There's lots of info on this type of thing online. To do it right within a given box, you also have to add anchored springs at the corners and such to stretch the whole thing out to fill the space.
-eliason OK, so another basic idea is to keep a very rough downsampled grayscale image around....
-eliason The grayscale value would map to the number of XOs within the grid cell on screen.
-eliason marcopg: Then, when placing a new one you could just find the best place to place it , though now that I think about it that would probably require a simulated annealing algorithm or something else clever to do...
-marcopg eliason, do you mean macro cell here?
-marcopg i.e. every buddy would be placed in one macro cell
-eliason marcopg: Well, actually I guess you'd kind of want a blurred brayscale image, where each object placed represents a white circle, but with a gaussian blur so that it acts like a topographic map of the mesh.
-eliason marcopg: The white spots would be dense, like hills, the black spots would be void of people, like holes. Then to place a new one, you kind of roll a simulated marble around until you find a good hole to place it in...
-eliason marcopg: And, yet another idea, which could be used in conjunction with or independent of the above. You could simply place a small repulsive force between the objects, so that they push each other apart slightly. You could just place at random and have them adjust accordingly. This works very much like the spring model, though.
-eliason Of course, the drawback of the third idea is that it's n^2 in the number of groups on the mesh, but that number should never be that large.
-eliason The spring model is a little more complicated, but you only have to place springs between nearby objects, which reduces that somewhat.
-eliason marcopg: But actually, I think #3 might be the easiest to implement, and work just as well. It works nicely since it could still allow you to drag them around and the rest of the mesh would react naturally. In the spring model, you'd have to dynamically add and break spring connections when a node is moved around.
-marcopg eliason, mm was just thinking about this would interact with custom placed nodes...
-marcopg eliason, I never done something similar before so I will really need to play a bit with it...
-eliason marcopg: Also, #3 is more forgiving: In the spring model, placing one new node will move EVERY node in the mesh somewhat, if even just a small amount, since the whole system adjusts. With the repulsion force, only nearby nodes would be affected, except of course through a chain reaction...
-eliason marcopg: I'm sure we can find documentation. Basically, you calculate the distance between the two nodes (pythag) and if that distance is less than some threshold you compute the angle between them (atan2) and then you give each one a small repulsive acceleration, and update each frame by treating each with its own acceleration, velocity, and position.
-eliason marcopg: radiusConstant + (numXos*radiusScale) + ((index%3)*offsetScale) <-- that gets pretty close to what I'm working with now.
-eliason marcopg: One addition: When the groups are small, we don't want to add the snowflake effect, since they fit in neat geometric shapes around the ring. So we get....actually, here's the ugly line of code: radius = 25 + .3*(Math.max(participants.length-10,0)) + (i%3)*.5*(Math.max(participants.length-10,0));
-eliason marcopg: The added ugliness is a bit of code that zeros out the 2nd two quantities if there are less than 10 people in the group. You could just place them in an if block actually, but I'd done it this way in case I wanted to change the thresholds independently...eliason marcopg: The added ugliness is a bit of code that zeros out the 2nd two quantities if there are less than 10 people in the group. You could just place them in an if block actually, but I'd done it this way in case I wanted to change the thresholds independently...
-eliason marcopg: OK, cool. The animation is a simple easing algorithm: position += (targetPostition - position)*percentage.
-eliason marcopg: Well, that's a function of the radius and the angle computed from above. targetX = radius*cos(angle), targetY = radius*sin(angle), for each XO.
-marcopg eliason, aaah I see now
-
-eliason marcopg: The basic problem is that people are crossing an index that is a multiple of the mod, so everyone shifts in and out. What if, instead, we adjusted the indeces of every XO with an index of modValue*c greater than the XO that left, and subtract modValue from each of their indices?
-eliason With mod 3, we basically have 3 levels of the ring. This solution would just shift ONE of those rings couter-clockwise one XO position, leaving the other two rings intact as is. We move many fewer XOs than before, but we minimize the movement any given XO has to make by spreading it across the ring level instead of moving the last XO all the way across the circle...eliason marcopg: The basic problem is that people are crossing an index that is a multiple of the mod, so everyone shifts in and out. What if, instead, we adjusted the indeces of every XO with an index of modValue*c greater than the XO that left, and subtract modValue from each of their indices?
-eliason With mod 3, we basically have 3 levels of the ring. This solution would just shift ONE of those rings couter-clockwise one XO position, leaving the other two rings intact as is. We move many fewer XOs than before, but we minimize the movement any given XO has to make by spreading it across the ring level instead of moving the last XO all the way across the circle...
-eliason marcopg: The final detail of that, beyond shifting each index down by the mod value, is to shift the very last group of people in the ring down to fill all the holes, if you get my meaning...
-
-Activity startup feedback
-
-I agree we certainly need feedback for this sort of thing. For
-starters, the icon of the selected activity should immediately appear
-in the ring. Perhaps we can apply some small animation to this
-activity icon to indicate that it is starting up. Marco, could you
-use HSV for the icon color, and modulate the S(aturation) on a sin
-curve so the color pulses betwen, say, 0 and 192 until the activity
-starts, at which point it slides up to 255?
-
-Clipboard
-
-<marcopg> eliason, when should the frame be automatically showed? when
-starting the drag or when hitting the corner
-<marcopg> eliason, (the first one would be tricky to implement)
-<eliason> marcopg: Initially we wanted it to happen on drag, but after
-thinking about this more, it's a bad idea, since it would hide the toolbars,
-and some activities may have toolbars that support drag and drop also. As
-such, we probably just keep the hot corners as is, and perhaps implement the
-"warm edges" too, but only when dragging...
-<marcopg> eliason, which reminds me... the plan is to completely drop edges at
-this point? or at least give it a try? (for the not dragging case)
-<eliason> I still think it's worth trying, but I think the general consensus
-was that we should drop it. That's also the easier option, so for now, I
-guess it's fine.
-<marcopg> ok
-<marcopg> eliason, what should be the title of the clipboard rollover? (we are
-trying to get text objects right for now, but if you have general ideas...)
-<eliason> marcopg: Well, it would depend on what is in the clipboard. For
-instance, if I copy some text, it should say "text clipping", or if I copy an
-image it should say "picture clipping"
-<marcopg> eliason, so [name of the object] + clipping?
-<eliason> marcopg: If it is an activity object, it should be the name of the
-object i.e. "Eben's Shark Drawing", etc.
-<marcopg> oh ok
-<eliason> It's only a clipping if it is part of another larger context.
-<eliason> If the whole thing is an object itself, we use the object's name.
-<marcopg> eliason, I see now
-<marcopg> eliason, we want a preview of the objectm right? For text, should we
-show part of the text in the rollover?
-<eliason> marcopg: yeah, probably the first n characters of it, with an
-ellipsis at the end.
-<marcopg> eliason, on multiple lines I guess?
-<marcopg> something like, 4 lines of text on a 2 grid cells large menu, and
-ellipsize after that
-<marcopg> (the exact numbers doesn't matter, just the logic
-<eliason> marcopg: Right.
diff --git a/lib/.gitignore b/lib/.gitignore
deleted file mode 100644
index 26353e1..0000000
--- a/lib/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-sugar-marshal.*
diff --git a/lib/Makefile.am b/lib/Makefile.am
deleted file mode 100644
index 4fa44db..0000000
--- a/lib/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = sugar
diff --git a/lib/sugar/.gitignore b/lib/sugar/.gitignore
deleted file mode 100644
index f880b0e..0000000
--- a/lib/sugar/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-_sugarext.c
-_sugarext.c
diff --git a/maint-helper.py b/maint-helper.py
deleted file mode 100755
index 7192de4..0000000
--- a/maint-helper.py
+++ /dev/null
@@ -1,227 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (C) 2007, 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
-
-# Latest source available at git://dev.laptop.org/sugar
-
-import os
-import sys
-import re
-import datetime
-import subprocess
-
-source_exts = [ '.py', '.c', '.h', '.cpp' ]
-
-def is_source(path):
- for ext in source_exts:
- if path.endswith(ext):
- return True
-
-def get_name_and_version():
- f = open('configure.ac', 'r')
- config = f.read()
- f.close()
-
- exp = 'AC_INIT\(\[[^\]]+\],\[([^\]]+)\],\[\],\[([^\]]+)\]'
- match = re.search(exp, config)
- if not match:
- print 'Cannot find the package name and version.'
- sys.exit(0)
-
- return [ match.group(2), match.group(1) ]
-
-def cmd_help():
- print 'Usage: \n\
-maint-helper.py build-snapshot - build a source snapshot \n\
-maint-helper.py fix-copyright [path] - fix the copyright year \n\
-maint-helper.py check-licenses - check licenses in the source'
-
-def cmd_build_snapshot():
- [ name, version ] = get_name_and_version()
-
- print 'Update git...'
-
- retcode = subprocess.call(['git', 'pull'])
- if retcode:
- print 'ERROR - cannot pull from git'
-
- cmd = 'git-show-ref --hash=10 refs/heads/master'
- alphatag = os.popen(cmd).readline().strip()
-
- tarball = '%s-%s-git%s.tar.bz2' % (name, version, alphatag)
-
- print 'Build %s...' % tarball
-
- retcode = subprocess.call(['make', 'distcheck'])
- if retcode:
- sys.exit(0)
-
- if 'JOYBUILD_PATH' in os.environ:
- tarball = os.path.join(os.environ['JOYBUILD_PATH'], 'source', tarball)
- os.rename('%s-%s.tar.bz2' % (name, version), tarball)
-
- print 'Update NEWS.sugar...'
-
- if os.environ.has_key('SUGAR_NEWS'):
- sugar_news_path = os.environ['SUGAR_NEWS']
- if os.path.isfile(sugar_news_path):
- f = open(sugar_news_path, 'r')
- sugar_news = f.read()
- f.close()
- else:
- sugar_news = ''
-
- [ name, version ] = get_name_and_version()
- sugar_news += '%s - %s - %s\n\n' % (name, version, alphatag)
-
- f = open('NEWS', 'r')
- for line in f.readlines():
- if len(line.strip()) > 0:
- sugar_news += line
- else:
- break
- f.close()
-
- f = open(sugar_news_path, 'w')
- f.write(sugar_news)
- f.close()
-
- print 'Update NEWS...'
-
- f = open('NEWS', 'r')
- news = f.read()
- f.close()
-
- news = 'Snapshot %s\n\n' % alphatag + news
-
- f = open('NEWS', 'w')
- f.write(news)
- f.close()
-
- print 'Committing to git...'
-
- changelog = 'Snapshot %s.' % alphatag
- retcode = subprocess.call(['git', 'commit', '-a', '-m % s' % changelog])
- if retcode:
- print 'ERROR - cannot commit to git'
-
- retcode = subprocess.call(['git', 'push'])
- if retcode:
- print 'ERROR - cannot push to git'
-
- print 'Done.'
-
-def check_licenses(path, license, missing):
- matchers = { 'LGPL' : 'GNU Lesser General Public',
- 'GPL' : 'GNU General Public License' }
-
- license_file = os.path.join(path, '.license')
- if os.path.isfile(license_file):
- f = open(license_file, 'r')
- license = f.readline().strip()
- f.close()
-
- for item in os.listdir(path):
- full_path = os.path.join(path, item)
-
- if os.path.isdir(full_path):
- check_licenses(full_path, license, missing)
- else:
- check_source = is_source(item)
-
- # Special cases.
- if item.find('marshal') > 0 or \
- item.startswith('egg') > 0:
- check_source = False
-
- if check_source:
- f = open(full_path, 'r')
- source = f.read()
- f.close()
-
- miss_license = True
- if source.find(matchers[license]) > 0:
- miss_license = False
-
- # Special cases.
- if source.find('THIS FILE IS GENERATED') > 0:
- miss_license = False
-
- if miss_license:
- if not missing.has_key(license):
- missing[license] = []
- missing[license].append(full_path)
-
-def cmd_check_licenses():
- missing = {}
- check_licenses(os.getcwd(), 'GPL', missing)
-
- for item in missing.keys():
- print '%s:\n' % item
- for path in missing[item]:
- print path
- print '\n'
-
-COPYRIGHT = 'Copyright (C) '
-
-def fix_copyright(path):
- for item in os.listdir(path):
- full_path = os.path.join(path, item)
-
- if os.path.isdir(full_path):
- fix_copyright(full_path)
- elif is_source(item):
- f = open(full_path, 'r')
- source = f.read()
- f.close()
-
- year_start = -1
- year_end = -1
-
- i1 = source.find(COPYRIGHT)
- if i1 != -1:
- i1 += len(COPYRIGHT)
- i2 = i1 + source[i1:].find(' ')
- if i1 > 0:
- try:
- year_start = int(source[i1:i1 + 4])
- year_end = int(source[i1 + 6: i1 + 10])
- except ValueError:
- pass
-
- if year_start > 0 and year_end < 0:
- year_end = year_start
-
- year = datetime.date.today().year
- if year_end < year:
- result = '%s%d-%d%s' % (source[:i1], year_start,
- year, source[i2:])
- f = open(full_path, 'w')
- f.write(result)
- f.close()
-
-def cmd_fix_copyright(path):
- fix_copyright(path)
-
-if len(sys.argv) < 2:
- cmd_help()
-elif sys.argv[1] == 'build-snapshot':
- cmd_build_snapshot()
-elif sys.argv[1] == 'check-licenses':
- cmd_check_licenses()
-elif sys.argv[1] == 'fix-copyright' and len(sys.argv) > 2:
- cmd_fix_copyright(sys.argv[2])
diff --git a/po/.gitignore b/po/.gitignore
new file mode 100644
index 0000000..85bf2f1
--- /dev/null
+++ b/po/.gitignore
@@ -0,0 +1,3 @@
+Makefile.in.in
+POTFILES
+stamp-it
diff --git a/po/ChangeLog b/po/ChangeLog
deleted file mode 100644
index e69de29..0000000
--- a/po/ChangeLog
+++ /dev/null
diff --git a/po/POTFILES.in b/po/POTFILES.in
index aafd1e8..95fcb31 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,18 +1,3 @@
-shell/intro/intro.py
-shell/view/BuddyMenu.py
-shell/view/clipboardmenu.py
-shell/hardware/keydialog.py
-shell/view/home/activitiesdonut.py
-shell/view/Shell.py
-shell/view/clipboardicon.py
-shell/view/home/HomeBox.py
-shell/view/home/MeshBox.py
-shell/view/devices/battery.py
-shell/view/devices/network/wireless.py
-shell/view/frame/activitybutton.py
-shell/view/frame/zoomtoolbar.py
lib/sugar/activity/activity.py
lib/sugar/graphics/alert.py
lib/sugar/graphics/objectchooser.py
-shell/controlpanel/control.py
-shell/view/devices/network/mesh.py
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
deleted file mode 100644
index f199f9c..0000000
--- a/po/POTFILES.skip
+++ /dev/null
@@ -1 +0,0 @@
-data/sugar.xml.in
diff --git a/po/am.po b/po/am.po
deleted file mode 100644
index a79e711..0000000
--- a/po/am.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+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.0.1\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/ar.po b/po/ar.po
deleted file mode 100644
index 20d44e5..0000000
--- a/po/ar.po
+++ /dev/null
@@ -1,436 +0,0 @@
-# translation of olpc-sugar.master.po to Arabic
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# Khaled Hosny <khaledhosny@eglug.org>, 2007.
-msgid ""
-msgstr ""
-"Project-Id-Version: olpc-sugar.master\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2007-08-16 00:17+0300\n"
-"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
-"Language-Team: Arabic <doc@arabeyes.org>\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: KBabel 1.11.4\n"
-"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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "الاسم:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "انقر لتغيير اللون:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "السابق"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "تمّ"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "التالي"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "أزل صديق"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "اصنع صديق"
-
-#. FIXME check that the buddy is not in the activity already
-#: ../shell/view/BuddyMenu.py:98
-msgid "Invite"
-msgstr "ادعُ"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "أزل"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "افتح"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "أضف يوميّة"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "عنصر الحافظة: %s."
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "الجِوَار"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "مجموعة"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "منزل"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "النشاط"
-
-#: ../services/shell/objecttypeservice.py:32
-msgid "Text"
-msgstr "نص"
-
-#: ../services/shell/objecttypeservice.py:36
-msgid "Image"
-msgstr "صورة"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "نوع الاستيثاق:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "نوع التعمية:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "يبدأ..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "استكمل"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "قف"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "لقطة شاشة"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "أطفيء"
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "شبكة عُروِيّة"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "عمر بطاريتي"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "شحن البطاريّة"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "تفريغ البطاريّة"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "البطارية مشحونة بالكامل"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "خاص"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "جِوارِي"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "ابقِ"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "نشاط %s"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/ay.po b/po/ay.po
deleted file mode 100644
index a79e711..0000000
--- a/po/ay.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+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.0.1\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/bg.po b/po/bg.po
deleted file mode 100644
index e62c1c6..0000000
--- a/po/bg.po
+++ /dev/null
@@ -1,428 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-11 13:59+0000\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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Име:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Натиснете, за да смените цвета:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Назад"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Затваряне"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Следващ"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Изтриване на приятел"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Създаване на приятел"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "Покани в %s"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Премахване"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Отваряне"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Добави към дневника"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "Обект в паметта: %s."
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "Тип ключ:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "Тип удостоверяване:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "Вид криптиране:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "Стартиране..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Продължаване"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Стоп"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "Снимка на екрана"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Рестартиране"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Изключване"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "Регистриране"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "Отделяне..."
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-#, fuzzy
-msgid "Mesh Network"
-msgstr "Mesh мрежа"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "Присъединяване"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Статус на батерията"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Батерията се зарежда"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Батерията се разрежда"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Батерията е напълно заредена"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "Без свързаност"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "Канал"
-
-# взето от руския превод
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Съседи"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Група"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "Начало"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Дейност"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "Сподели с:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "Личен"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Моите съседи"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Запазване"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Отмяна"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Възстановяване"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Копиране"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Поставяне"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s дейност"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "Грешка при запис"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "Грешка при запис: всички промени ще бъдат изгубени"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "Без спиране"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "Спиране винаги"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Отказ"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "Ок"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Продължение"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "ОК"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d година"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d години"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d месец"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d месеца"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d седмица"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d седмици"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d ден"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d дни"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d час"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d часа"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d минута"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d минути"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d секунда"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d секунди"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr " и "
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ", "
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "Моля, рестартирайте графичната среда, за да влязат в сила промените.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "Грешка в зададените цветови модификатори."
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "Грешка в зададените цветове."
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "изключен"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "включен"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "Непознато състояние."
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "Грешка в зададения аргумент, използвайте вкл/изкл."
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-"Отказано е позволение. Трябва да сте администратор, за да изпълните този "
-"метод."
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "Грешка при прочитане на времева зона"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "Грешка при копиране на времева зона (от %s): %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "Замяна на позволенията за времева зона: %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "Грешка, времевата зона не съществува."
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "Отказан е достъп до %s. Моля, създайте стандартни настойки."
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "Не може да бъде определен езикът с код=%s."
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "Съжалявам, но не говоря '%s'."
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "Свързан към училищният Mash портал"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "Търсене на училищем Mesh портал..."
-
-#: ../shell/view/devices/network/mesh.py:110
-#, fuzzy
-msgid "Connected to an XO Mesh Portal"
-msgstr "Свързан към Mesh мрежа от лаптопи XO"
-
-#: ../shell/view/devices/network/mesh.py:112
-#, fuzzy
-msgid "Looking for an XO Mesh Portal..."
-msgstr "Търсене на Mesh мрежа от лаптопи XO..."
-
-#: ../shell/view/devices/network/mesh.py:115
-#, fuzzy
-msgid "Connected to a Simple Mesh"
-msgstr "Свързан към обикновенна Mesh мрежа"
-
-#: ../shell/view/devices/network/mesh.py:117
-#, fuzzy
-msgid "Starting a Simple Mesh"
-msgstr "Стартиране на обикновенна Mesh мрежа"
-
-#: ../shell/view/devices/network/mesh.py:124
-#, fuzzy
-msgid "Unknown Mesh"
-msgstr "Непозната Mesh мрежа"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/bn.po b/po/bn.po
deleted file mode 100644
index 45ede9f..0000000
--- a/po/bn.po
+++ /dev/null
@@ -1,419 +0,0 @@
-# SOME 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: Update 1\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2007-12-23 10:33+0000\n"
-"Last-Translator: Khandakar Mujahidul Islam <suzan229@gmail.com>\n"
-"Language-Team: Bengali <core@bengalinux.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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "নাম:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "রং পরিবর্তন করতে ক্লিক:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "পেছনে"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "করা হয়েছে"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "পরবর্তী"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "বন্ধু মোছো"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "বন্ধু বানাও"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "%s কে নিমণ্ত্রণ"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "মোছো"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "খোলো"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "জার্নালে লেখ"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "ক্লীপবোর্ড বস্তু: %s।"
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "কী ধরণ:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "পরিচয় প্রমানের ধরণ:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "এনক্রিপশন ধরণ:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "শুরু হচ্ছে..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "পুনরায় শুরু করুন"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "থামাও"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "স্ক্রীণশট"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "পুনরায় চালু"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "বন্ধ করো"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "রেজিস্টার"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "সংযোগ বিচ্ছিন্ন..."
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "মেশ নেটওয়ার্ক"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "যোগ দাও"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "আমার ব্যাটারীর জীবনসীমা"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "ব্যাটারী চার্জ হচ্ছে"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "ব্যাটারী চার্জ কমে যাচ্ছে"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "ব্যাটারী পুরোপুরি চার্জ হয়েছে"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "সংযোগ বিচ্ছিন্ন"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "চ্যানেল"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "ছোটবেলা"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "দল"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "বাড়ি"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "সক্রিয়তা"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "ভাগাভাগি করো:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "ব্যাক্তিগত"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "আমার ছেলেবেলা"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "রাখো"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "বাতিল করো"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "আবার করো"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "কপি"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "সাঁটো"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s সক্রিয়তা"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "ত্রুটি রেখে দাও"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "ত্রুটি রেখে দাও: সব পরিবর্তন হারিয়ে যাবে"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "থামিও না"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "যে কোন ভাবে থামো"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "বাতিল"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "ঠিক আছে"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "এগিয়ে যাও"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "ঠিক আছে"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d বছর"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d বছর"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d মাস"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d মাস"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d সপ্তাহ"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d সপ্তাহ"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d দিন"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d দিন"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d ঘন্টা"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d ঘন্টা"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d মিনিট"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d মিনিট"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d সেকেন্ড"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d সেকেন্ড"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr " এবং "
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ", "
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "তোমার পরিবর্তন কার্যকর করার জন্য সুগার পুনরায় চালু করতে হবে।\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "উল্লেখিত রং পরিবর্তকে ত্রুটি।"
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "উল্লেখিত রং এ ত্রুটি।"
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "off"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "on"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "অবস্থানটি অজানা।"
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "উল্লেখিত রেডিও প্রেরিত মান ব্যবহার on/off তে ত্রুটি।"
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "অনুমতি প্রত্যাখ্যাত। এই পন্থাটি চালাতে তোমাকে root হিসেবে কাজ করতে হবে।"
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "সময় জোন পড়তে ত্রুটি"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "সময় জোন (%s হতে) কপি করায় ত্রুটি: %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "সময় জোনের অনুমতি পরিবর্তন: %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "ত্রুটিযুক্ত সময় জোনের অস্তিত্ব নেই।"
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "%s এ প্রবেশ করতে পারে নি। প্রমাণ মানসমূহ তৈরি করো।"
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "কোড=%s এর জন্য কোন ভাষা নির্ধারণ করা যায় নি।"
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "দুঃখিত আমি '%s' বলতে পারি না।"
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "একটি স্কুলের মেশ পোর্টালে সংযুক্ত"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "একটি স্কুল মেশ পোর্টাল খুজছি..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "একটি জো(XO) মেশ পোর্টালে সংযুক্ত"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "একটি জো(XO) মেশ পোর্টাল খুজছি..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "একটি সাধারণ মেশ এ সংযুক্ত"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "একটি সাধারণ মেশ চালু করছি"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "অজানা মেশ"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr "XO সম্বন্ধে"
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr "পাওয়া যায় নি"
diff --git a/po/bn_IN.po b/po/bn_IN.po
deleted file mode 100644
index 45ede9f..0000000
--- a/po/bn_IN.po
+++ /dev/null
@@ -1,419 +0,0 @@
-# SOME 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: Update 1\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2007-12-23 10:33+0000\n"
-"Last-Translator: Khandakar Mujahidul Islam <suzan229@gmail.com>\n"
-"Language-Team: Bengali <core@bengalinux.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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "নাম:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "রং পরিবর্তন করতে ক্লিক:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "পেছনে"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "করা হয়েছে"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "পরবর্তী"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "বন্ধু মোছো"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "বন্ধু বানাও"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "%s কে নিমণ্ত্রণ"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "মোছো"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "খোলো"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "জার্নালে লেখ"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "ক্লীপবোর্ড বস্তু: %s।"
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "কী ধরণ:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "পরিচয় প্রমানের ধরণ:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "এনক্রিপশন ধরণ:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "শুরু হচ্ছে..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "পুনরায় শুরু করুন"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "থামাও"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "স্ক্রীণশট"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "পুনরায় চালু"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "বন্ধ করো"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "রেজিস্টার"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "সংযোগ বিচ্ছিন্ন..."
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "মেশ নেটওয়ার্ক"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "যোগ দাও"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "আমার ব্যাটারীর জীবনসীমা"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "ব্যাটারী চার্জ হচ্ছে"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "ব্যাটারী চার্জ কমে যাচ্ছে"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "ব্যাটারী পুরোপুরি চার্জ হয়েছে"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "সংযোগ বিচ্ছিন্ন"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "চ্যানেল"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "ছোটবেলা"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "দল"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "বাড়ি"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "সক্রিয়তা"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "ভাগাভাগি করো:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "ব্যাক্তিগত"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "আমার ছেলেবেলা"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "রাখো"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "বাতিল করো"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "আবার করো"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "কপি"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "সাঁটো"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s সক্রিয়তা"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "ত্রুটি রেখে দাও"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "ত্রুটি রেখে দাও: সব পরিবর্তন হারিয়ে যাবে"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "থামিও না"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "যে কোন ভাবে থামো"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "বাতিল"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "ঠিক আছে"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "এগিয়ে যাও"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "ঠিক আছে"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d বছর"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d বছর"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d মাস"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d মাস"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d সপ্তাহ"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d সপ্তাহ"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d দিন"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d দিন"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d ঘন্টা"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d ঘন্টা"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d মিনিট"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d মিনিট"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d সেকেন্ড"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d সেকেন্ড"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr " এবং "
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ", "
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "তোমার পরিবর্তন কার্যকর করার জন্য সুগার পুনরায় চালু করতে হবে।\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "উল্লেখিত রং পরিবর্তকে ত্রুটি।"
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "উল্লেখিত রং এ ত্রুটি।"
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "off"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "on"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "অবস্থানটি অজানা।"
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "উল্লেখিত রেডিও প্রেরিত মান ব্যবহার on/off তে ত্রুটি।"
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "অনুমতি প্রত্যাখ্যাত। এই পন্থাটি চালাতে তোমাকে root হিসেবে কাজ করতে হবে।"
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "সময় জোন পড়তে ত্রুটি"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "সময় জোন (%s হতে) কপি করায় ত্রুটি: %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "সময় জোনের অনুমতি পরিবর্তন: %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "ত্রুটিযুক্ত সময় জোনের অস্তিত্ব নেই।"
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "%s এ প্রবেশ করতে পারে নি। প্রমাণ মানসমূহ তৈরি করো।"
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "কোড=%s এর জন্য কোন ভাষা নির্ধারণ করা যায় নি।"
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "দুঃখিত আমি '%s' বলতে পারি না।"
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "একটি স্কুলের মেশ পোর্টালে সংযুক্ত"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "একটি স্কুল মেশ পোর্টাল খুজছি..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "একটি জো(XO) মেশ পোর্টালে সংযুক্ত"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "একটি জো(XO) মেশ পোর্টাল খুজছি..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "একটি সাধারণ মেশ এ সংযুক্ত"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "একটি সাধারণ মেশ চালু করছি"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "অজানা মেশ"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr "XO সম্বন্ধে"
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr "পাওয়া যায় নি"
diff --git a/po/ca.po b/po/ca.po
deleted file mode 100644
index 3694336..0000000
--- a/po/ca.po
+++ /dev/null
@@ -1,422 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-14 17:19+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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Nom:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Clic per a canviar de color:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Enrere"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Fet"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Següent"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Esborrar amic/ga"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Fer amic/ga"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "Convidar a %s"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Eliminar"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Obrir"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Afegir al diari"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "Objecte del porta-retalls: %s"
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "Tipus de clau:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "Tipus d'autentificació:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "Tipus d'encriptació:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "Arrencant ..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Reprendre"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Aturar"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "Captura de pantalla"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Reiniciar"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Aturar"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "Registre"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "Desconnecta ..."
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-# mmm, potser més simple?
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "Uneix-t'hi"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Vida de la bateria"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Carregant bateria"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Descarregant bateria"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Bateria plena"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "Desconnectat"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "Canal"
-
-# aquí cal pensar si es millorÑ barri, veinatge, maquines veines,....
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Veïns"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Grup"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "Inici"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Activitat"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "Compartir amb:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "Privat"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Els meus veïns"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Desfer"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Refer"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Copia"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Enganxa"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s Activitat"
-
-# revisar
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "Manté l'error"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "Manté l'error: tots els canvis es perdran"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "No t'aturis"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Cancel·lar"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "D'acord"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Continuar"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "D'acord"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d any"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d anys"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d mes"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d mesos"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d setmana"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d setmanes"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d dia"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d dies"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d hora"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d hores"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d minut"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d minuts"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d segon"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d segons"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr "i"
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ","
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "Per aplicar els canvis, cal que reiniciar el sugar.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "Error en els modificadors de color especificats"
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "Error en els colors especificats"
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "apagar"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "arrancar"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "Status deconegut"
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "Permís denegat: cal que ser root per aquesta operació"
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "Error en llegir la zona horària"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "Error en copiar la zona horària (des de %s): %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "Canviant permisos de zona horària: %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "Error: aquesta zona horària no existeix"
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "No es pot accedir a %s. Crea una configuració estàndar."
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "La llengua que té com a codi code=%s no es pot determinar."
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "Ho sento, no parlo '%s'."
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "Connectat al Portal de la Xarxa de l'Escola"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "Cercant el Portal de la Xarxa de l'Escola ..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "Connectat a un Portal de Xarxa XO"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "Cercant un Portal de Xarxa XO ..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "Connectat a una xarxa simple"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "Arrancant una xarxa simple"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "Xarxa desconeguda"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/de.po b/po/de.po
deleted file mode 100644
index 635bfdc..0000000
--- a/po/de.po
+++ /dev/null
@@ -1,432 +0,0 @@
-# This file is distributed under the same license as the PACKAGE package.
-# Fabian Affolter <fab@fedoraproject.org>, 2007.
-msgid ""
-msgstr ""
-"Project-Id-Version: sugar\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-28 03:01-0500\n"
-"Last-Translator: Gerhard Steiner <gerhard.steiner@duichwir.at>\n"
-"Language-Team: German <fedora-trans-de@redhat.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"
-"X-Poedit-Language: German\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Name:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Klicke zum Wechseln der Farbe"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Zurück"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Fertig"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Nächste"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Freund entfernen"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Freunde werden"
-
-#. FIXME check that the buddy is not in the activity already
-#: ../shell/view/BuddyMenu.py:96
-msgid "Invite"
-msgstr "Einladen"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Entfernen"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Öffnen"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Zum Journal hinzufügen"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "Zwischenablage-Objekt: %s."
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Umgebung"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Gruppe"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "Zuhause"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Aktivität"
-
-#: ../services/clipboard/objecttypeservice.py:32
-msgid "Text"
-msgstr "Text"
-
-#: ../services/clipboard/objecttypeservice.py:36
-msgid "Image"
-msgstr "Bild"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "Bildschirmfoto"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Ausschalten"
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "Maschennetzwerk"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Meine Akku-Laufzeit"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Akku wird geladen"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Akku in Benutzung"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Akku vollständig geladen"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "Privat"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Meine Umgebung"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Behalten"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Stopp"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s Aktivität"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "Einladen zu %s"
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "Schlüsseltyp"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "Authentifizierungstyp"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "Verschlüsselungstyp"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "Starten..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Wiederaufnehmen"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Neu starten"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "Registrieren"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "Verbindung trennen..."
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "Mitmachen"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "Nicht verbunden"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "Kanal"
-
-# Alternative: Gemeinsam mit:
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "Gemeinsam mit:"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Rückgängig"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Wiederholen"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Kopieren"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Einfügen"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "Fehler beim Speichern"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "Fehler beim Speichern: Alle Änderungen gehen verloren"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "Nicht stoppen"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "Trotzdem stoppen"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Abbrechen"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "Ok"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Weitermachen"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "OK"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d Jahr"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d Jahre"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d Monat"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d Monate"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d Woche"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d Wochen"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d Tag"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d Tage"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d Stunde"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d Stunden"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d Minute"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d Minuten"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d Sekunde"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d Sekunden"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr " und "
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ", "
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "Um die Änderungen zu übernehmen, muss Sugar neu gestartet werden.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "Fehler in den definierten Farbänderungen."
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "Fehler in den definierten Farben."
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "aus"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "an"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "Status ist unbekannt."
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "Fehler im angegebenen 'radio' Argument - Verwendung von 'an'/'aus'."
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "Zugriffsrechte notwendig. Du musst root sein für diese Aktion."
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "Fehler beim Lesen der Zeitzone"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "Fehler beim Kopieren der Zeitzone (von %s): %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "Änderung der Berechtigung für Zeitzone: %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "Fehler: unbekannte Zeitzone."
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "Kann nicht auf %s zugreifen. Erstelle Standardeinstellungen."
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "Sprache für Code=%s konnte nicht ermittelt werden."
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "Entschuldigung, ich spreche nicht '%s'."
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "Verbunden mit einem Schul-Maschennetzwerk-Portal"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "Suche Schul-Maschennetzwerk-Portal..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "Verbunden mit einem XO Maschennetzwerk-Portal"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "Suche XO Maschennetzwerk-Portal..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "Verbunden mit einem einfachen Maschennetzwerk"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "Starte ein einfaches Maschennetzwerk"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "Unbekanntes Maschennetzwerk"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr "Infos zu diesem XO"
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr "Nicht verfügbar"
diff --git a/po/dz.po b/po/dz.po
deleted file mode 100644
index a79e711..0000000
--- a/po/dz.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+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.0.1\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/el.po b/po/el.po
deleted file mode 100644
index 15a5d16..0000000
--- a/po/el.po
+++ /dev/null
@@ -1,437 +0,0 @@
-# Greek translation of Sugar.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# Simos Xenitellis <simos.lists@googlemail.com>, 2007.
-msgid ""
-msgstr ""
-"Project-Id-Version: Sugar\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2007-07-25 23:17+0100\n"
-"Last-Translator: Simos Xenitellis <simos.lists@googlemail.com>\n"
-"Language-Team: Greek <olpc@grnet.gr>\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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Όνομα:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Πατήστε για να αλλάξτε χρώμα:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Πίσω"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Ολοκληρώθηκε"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Επόμενο"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Διαγραφή φίλου/ης"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Να γίνει φίλος/η"
-
-#. FIXME check that the buddy is not in the activity already
-#: ../shell/view/BuddyMenu.py:96
-msgid "Invite"
-msgstr "Πρόσκληση"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Διαγραφή"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Άνοιγμα"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Προσθήκη στα πράγματά μου"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "Αντικείμενο προχείρου: %s."
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Γειτονιά"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Ομάδα"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "Αρχή"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Δραστηριότητα"
-
-#: ../services/clipboard/objecttypeservice.py:32
-msgid "Text"
-msgstr "Κείμενο"
-
-#: ../services/clipboard/objecttypeservice.py:36
-msgid "Image"
-msgstr "Εικόνα"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "Εικόνα οθόνης"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Παύση λειτουργίας"
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "ΧΟ-δίκτυο"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Η διάρκεια της μπαταρίας μου"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Η μπαταρία φορτίζεται"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Η μπαταρία αποφορτίζεται"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Η μπαταρία έχει φορτιστεί πλήρως"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Διατήρησε"
-
-#: ../sugar/activity/activity.py:74
-msgid "Share"
-msgstr "Μοίρασε"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Σταμάτησε"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "Δραστηριότητα %s"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-#, fuzzy
-msgid "My Neighborhood"
-msgstr "Γειτονιά"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/en.po b/po/en.po
deleted file mode 100644
index a79e711..0000000
--- a/po/en.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+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.0.1\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/es.po b/po/es.po
deleted file mode 100644
index 2b2c52b..0000000
--- a/po/es.po
+++ /dev/null
@@ -1,484 +0,0 @@
-# SOME 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: olpc-sugar\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-02-02 14:56-0500\n"
-"Last-Translator: Sayamindu Dasgupta <sayamindu@gmail.com>\n"
-"Language-Team: Fedora Spanish <fedora-trans-es@redhat.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"
-"X-Poedit-Language: Spanish\n"
-"X-Poedit-SourceCharset: utf-8\n"
-"X-Poedit-Basepath: .\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Nombre:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Clic para cambiar de color:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Atrás"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Hecho"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Siguiente"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Eliminar amigo"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Agregar amigo"
-
-#: ../shell/view/BuddyMenu.py:92
-msgid "Invite"
-msgstr "Invitar"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Eliminar"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Abrir"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Agregar al diario"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "Objeto de portapapel: %s."
-
-#: ../services/shell/objecttypeservice.py:33
-msgid "Text"
-msgstr "Texto"
-
-#: ../services/shell/objecttypeservice.py:39
-msgid "Image"
-msgstr "Imagen"
-
-#: ../services/shell/objecttypeservice.py:42
-msgid "Audio"
-msgstr "Audio"
-
-#: ../services/shell/objecttypeservice.py:45
-msgid "Video"
-msgstr "Video"
-
-#: ../services/shell/objecttypeservice.py:48
-msgid "Etoys project"
-msgstr "Proyecto Etoys"
-
-#: ../services/shell/objecttypeservice.py:52
-msgid "Link"
-msgstr "Enlace"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "Tipo de Autenticación:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "Tipo de Encriptación:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "Iniciando..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Reasumir"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Parar"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "Captura de pantalla"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Reiniciar"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Apagar"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "Desconectar..."
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "Red Malla"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Carga de mi batería"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Batería cargandose"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Batería descargandose"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Batería totalmente cargada"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "Compartir con:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "Privado"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Mi Vecindario"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Guardar"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Deshacer"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Rehacer"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Copiar"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Pegar"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "Actividad %s"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "Desconectado"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "Canal"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Vecindario"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Grupo"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "Hogar"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Actividad"
-
-#, python-format
-#~ msgid "Text snippet"
-#~ "Web Page"
-#~ "PDF file"
-#~ "MS Word file"
-#~ "RTF file"
-#~ "Abiword file"
-#~ "Squeak project"
-#~ "OpenOffice text file"
-#~ "Object"
-#~ "Pick a buddy picture"
-#~ "My Picture:"
-#~ "My Color:"
-#~ "Stop download"
-#~ "Close"
-#~ "No options"
-#~ "Send"
-#~ msgstr "Recorte de texto"
-#~ "Página web"
-#~ "Archivo PDF"
-#~ "Archivo MS-Word"
-#~ "Archivo RTF"
-#~ "Archivo Abiword"
-#~ "Proyecto de Squeak"
-#~ "Archivo de texto de OpenOffice"
-#~ "Objeto"
-#~ "Elegir la imagen de amigo"
-#~ "Mi imagen:"
-#~ "Mi color:"
-#~ "Interrumpir la bajada"
-#~ "Cerrar"
-#~ "Ninguna opción"
-#~ "Enviar"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "invitar a %s"
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "Tipo de Tecla"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "Registro"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "Unirse"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "Error de guardado"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "Error de guardado: todos los cambios se perderan"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "No detener"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "Detener de todas formas"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "Ok"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Continuar"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "OK"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d año"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d años"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d mes"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d meses"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d semana"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d semanas"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d dia"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d dias"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d hora"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d horas"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d minuto"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d minutos"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d segundo"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d segundos"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr " y "
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ", "
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "Para aplicar sus cambios tiene que reiniciar sugar.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "Error en modificadores de color especificados."
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "Error en colores especificados."
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "apagado"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "prendido"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "Estado desconocido."
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "Error en argumento especificado de radio use apagado/prendido."
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "permiso denegado. Usted necesita ser root para correr este metodo."
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "Error en lectura de zona horaria"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "Error copiando zona horaria (desde %s): %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "Cambiando permisos de zona horaria: %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "Error zona horaria no existe."
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "No se puede accesar %s. Crear ajustes standard."
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "El lenguague de codigo=%s no pudo ser determinado."
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "Lo siento yo no hablo '%s'."
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "Conectado a un portal malla de colegio"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "Buscando un portal malla de colegio..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "Conectado a un portal malla XO"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "Buscando un portal malla XO..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "Conectado a una Malla Simple"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "Empezando una Malla Simple"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "Malla Desconocida"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr "Acerca de este XO"
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr "No disponible"
diff --git a/po/fa.po b/po/fa.po
deleted file mode 100644
index 241b08c..0000000
--- a/po/fa.po
+++ /dev/null
@@ -1,419 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-09 10:16+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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "نام:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "برای تبدیلی رنگ تیک کن:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "عقب"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "شد"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "بعدی"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "دوست را پاک کن"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "دوست بسازید"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "دعوت به ( ) %"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "پاک کردن"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "باز کردن"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "به یادداشت اضافه کردن"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "شی در حافظه : %"
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "نوعیت کلید:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "نوعیت تصدیق:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "نوعیت پنهانی کردن:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "در حال شروع شدن...."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "از سر گرفتن"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "توقف"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "عکس صفحه"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "دوباره چالان کردن"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "بند کردن"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "راجستر و ثبت کردن"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "منقطع شدن"
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "شبکه بافته شده"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "پیوستن"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "دوام باطری من"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "باطری پر میشود"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "باطری خالی میشود"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "باطری کاملا پر ش"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "منقطع شد"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "کانال"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "همسایگی"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "گروه"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "خانه"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr " فعالیت"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "تقسیم با:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "شخصی"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "همسایگی من"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "نگه داشتن"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "نکن"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "تکرار کن"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "نقل بگیر"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "بچسپان"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "% فعالیت"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "نگه داشتن اشتباه"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "نگه داشتن اشتباه: همه تغیرات از بین میروند"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "توقف نکن"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "به هر طوری توقف کن"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "لغو کن"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "درست است."
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "جاری"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "درست است."
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d سال"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d سال ها"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d ماه"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d ماه ها"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d هفته"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d هفته ها"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d روز"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d روزها"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d ساعت"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d ساعت ها"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d دقیقه"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d دقایق"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d ثانیه"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d ثانیه ها"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr "_ و _"
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr "_ یا _"
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "برای اجرا نمودن تغیرات تان شما باید شوگر را دوباره چالان کنید\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "اشتباه در تعدیل کننده رنگ معین"
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "اشتباه د رنگ معین"
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "خاموش کردن"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "روشن کردن"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "حالان نامشخص هست"
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "اشتباه دراستدلال معین از خاموش/روشن نمودن رادیو "
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "تردید اجازه. شما برای راندن این روش باید ریشه کار باشید"
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "اشتباه در خواندن منطقه جغرافیایی ساعات"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "اشتباه در نقل برداری منطقه جغرافیایی ساعات (از %): %"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "تبدیلی اجازت منطقه جغرافیایی ساعات: %"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "اشتباه منطقه جغرافیایی ساعات وجود ندارد"
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "دسترسی نمیتواند %. زمینه معیاری بسازید"
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "زبان برای رمز= % تعین نمی گردد"
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "ببخشید من سخن گفته نمیتوانم \"%\""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "با مدخل تنیده مکتب وصل گردید"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "در حال تلاش برای یک مدخل تنیده مکتب"
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "با مدخل تنیده XO وصل گردید"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "در حال تلاش برای یک مدخل تنیده XO"
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "با یک بافته ساده وصل گردید"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "در حال شروع یک بافته ساده"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "بافته نا مشخص"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/fa_AF.po b/po/fa_AF.po
deleted file mode 100644
index 2f08e72..0000000
--- a/po/fa_AF.po
+++ /dev/null
@@ -1,419 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-28 06:24-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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "نام:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "برای تبدیلی رنگ تیک کن:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "عقب"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "شد"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "بعدی"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "دوست را حذف کن"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "دوست بسازید"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "دعوت به %"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "حذف کن"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "باز کن"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "به یادداشت اضافه کن"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "شیی تخته رسم : %."
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "نوعیت کلید:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "نوعیت تصدیق:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "نوعیت پنهانی کردن:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "در حال شروع شدن..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "ادامه"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "توقف"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "عکس صفحه"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "راه اندازي مجدد"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "خاموش کردن"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "ثبت کردن"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "منقطع شدن..."
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "شبکه تنیده"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "پیوستن"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "حیات باطری من"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "باطری در حال پرشدن"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "باطری در حال تخلیه"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "باطری کاملا پر شد"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "منقطع شد"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "کانال"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "همسایگی"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "گروه"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "خانه"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "فعالیت"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "تقسیم با:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "شخصی"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "همسایگی من"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "نگه داشتن"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "نکن"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "تکرار کن"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "نقل بگیر"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "بچسپان"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "فعالیت %"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "خطا را نگه دار"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "خطا را نگه دار: همه تغیرات از بین خواهند رفت"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "توقف نکن"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "به هر صورت توقف کن"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "لغو کن"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "درست است"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "جاری"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "OK"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "سال %"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "سال های %"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "ماه %"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "ماه های %"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "هفته %"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "هفته های %"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "روز %"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "روزهای %"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "ساعت %"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "ساعت های %"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "دقیقه %"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "دقیقه های %"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "ثانیه %"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "ثانیه های %"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr " و "
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr "، "
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "برای اجرا نمودن تغیرات تان شما باید شکر را دوباره آغاز کنید.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "خطا در تعدیل کننده رنگ معین."
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "خطا در رنگ معین."
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "خاموش"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "روشن"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "وضعیت نامشخص است."
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "روشن یا خاموش بودن خطا در استدلال مشخص استعمال رادیویی."
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "اجازه غير قابل دسترس هست. شما برای اجرای این طریقه باید ریشه باشید."
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "خطا در خوانش منطقه زمانی"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "خطا در خوانش منطقه زمانی (از %): %"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "در حال تغییر دادن اجازت منطقه زمانی: %"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "خطای منطقه زمانی وجود ندارد."
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "به % دسترسی نمی تواند. زمینه معیاریی بسازید."
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "زبان برای رمز=% تعیین کرده نمیشود."
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "متأسفم من سخن گفته نمیتوانم '%'."
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "با مدخل تنیده مکتب وصل گردید"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "در حال تلاش برای یک مدخل تنیده مکتب..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "با مدخل تنیده XO وصل گردید"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "در حال تلاش برای یک مدخل تنیده XO..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "با یک شبکه تنیده ساده وصل گردید"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "در حال شروع کردن یک شبکه تنیده ساده"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "شبکه تنیده نامشخص"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr "در مورد این XO"
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr "در دسترس نیست"
diff --git a/po/ff.po b/po/ff.po
deleted file mode 100644
index a79e711..0000000
--- a/po/ff.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+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.0.1\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/fr.po b/po/fr.po
deleted file mode 100644
index 0af5316..0000000
--- a/po/fr.po
+++ /dev/null
@@ -1,467 +0,0 @@
-# translation of sugar.po to french
-# Copyright (C) 2007 the Package Owner
-# This file is distributed under the same license as the sugar graphical shell package.
-# Samuel Bizien <samuel@bizien.info>, 2007.
-msgid ""
-msgstr ""
-"Project-Id-Version: sugar\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-25 14:46-0500\n"
-"Last-Translator: samy boutayeb <s.boutayeb@free.fr>\n"
-"Language-Team: French <traduc@traduc.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"
-
-#: shell/intro/intro.py:77
-msgid "Pick a buddy picture"
-msgstr "Choisir un avatar XO"
-
-#: shell/intro/intro.py:100
-msgid "My Picture:"
-msgstr "Ma photo :"
-
-#: shell/intro/intro.py:180
-msgid "My Name:"
-msgstr "Mon surnom :"
-
-#: shell/intro/intro.py:224
-msgid "My Color:"
-msgstr "Ma couleur :"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Retirer de mes amis"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Ajouter à mes amis"
-
-#: shell/view/BuddyMenu.py:91
-msgid "Invite"
-msgstr "Inviter"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Supprimer"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Ouvrir"
-
-#: shell/view/clipboardmenu.py:70
-msgid "Stop download"
-msgstr "Arrêter de télécharger"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Ajouter au journal"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format,
-#, python-format
-#, python-format,
-msgid "Clipboard object: %s."
-msgstr "Objet dans le presse-papier : %s."
-
-#: services/clipboard/objecttypeservice.py:32
-msgid "Text"
-msgstr "Texte"
-
-#: services/clipboard/objecttypeservice.py:35
-msgid "Image"
-msgstr "Image"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "Capture d'écran"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Éteindre"
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "Réseau maillé"
-
-#: sugar/activity/activity.py:68
-msgid "Save"
-msgstr "Enregistrer"
-
-#: sugar/activity/activity.py:74
-msgid "Share"
-msgstr "Partager"
-
-#: sugar/activity/activity.py:87
-msgid "Close"
-msgstr "Fermer"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "Activité %s"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Nom :"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Cliquer pour changer de couleur :"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Précédent"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Accepter"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Suivant"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "Inviter à %s"
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "Type de clé"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "Type d'authentification :"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "Type d'encryptage :"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "Démarrage..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Reprendre"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Arrêter"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Redémarrer"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "S'enregistrer"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "Déconnexion..."
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "Rejoindre"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Charge de la batterie"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Batterie en charge"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Batterie en décharge"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Batterie chargée"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "Déconnecté"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "Canal"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Voisinage"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Groupe"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "Accueil"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Activité"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "Partager avec :"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "Privé"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Mon voisinage"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Conserver"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Annuler"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Répéter"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Copier"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Coller"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "Conserver l'erreur"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "Conserver l'erreur : tous les changements seront perdus"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "Ne pas arrêter"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "Arrêter malgré tout"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Annuler"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "Ok"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Continuer"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "OK"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d an"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d ans"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d mois"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d mois"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d semaine"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d semaines"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d jour"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d jours"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d heure"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d heures"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d minute"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d minutes"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d seconde"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d secondes"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr "_et_"
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ", "
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "Redémarrer sugar pour que les changements prennent effet.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "Erreur dans les modificateurs de couleur spécifiés."
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "Erreur dans les couleurs spécifiées."
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "arrêt"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "marche"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "État inconnu."
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "Argument 'radio' spécifié incorrect. Utiliser marche/arrêt."
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-"Permission refusée. Vous devez être administrateur afin de lancer cette "
-"méthode."
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "Erreur de lecture de la zone temporelle"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "Erreur en copiant la zone temporelle (de %s): %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "Changement de la permission de zone temporelle : %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "Erreur : la zone temporelle n'existe pas."
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "Acces impossible à %s. Création de paramètres standards."
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "La langue associée au code = %s n'a pas pu être déterminée."
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "Désolé je ne parle pas '%s'."
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "Connecté au portail du réseau maillé d'école"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "Cherche un portail de réseau maillé d'école..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "Connecté au portail de réseau maillé de XO"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "Recherche un portail de réseau maillé de XO..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "Connecté à un réseau maillé simple"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "Démarre un réseau maillé simple"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "Réseau maillé inconnu"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr "Information sur ce XO"
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr "Non disponible"
diff --git a/po/ha.po b/po/ha.po
deleted file mode 100644
index 53ad5cf..0000000
--- a/po/ha.po
+++ /dev/null
@@ -1,447 +0,0 @@
-# translation of sugar.po to hausa
-# This file is distributed under the same license as the PACKAGE package.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
-# saudat mohammed <saudat@wazobialinux>, 2006.
-msgid ""
-msgstr ""
-"Project-Id-Version: sugar\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2006-07-10 16:37+0100\n"
-"Last-Translator: saudat mohammed <saudat@wazobialinux>\n"
-"Language-Team: hausa\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.10\n"
-
-#: ../shell/PresenceWindow.py:62
-msgid "Who's around:"
-msgstr "Wa ke nan:"
-
-#: ../shell/PresenceWindow.py:104
-msgid "Share"
-msgstr "Raba"
-
-#: ../shell/StartPage.py:189
-msgid "Search"
-msgstr "Yi Bincike"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Baya"
-
-#: ../activities/browser/NavigationToolbar.py:23
-msgid "Forward"
-msgstr "Tura"
-
-#: ../activities/browser/NavigationToolbar.py:29
-msgid "Reload"
-msgstr "Sake Lodi"
-
-#: ../shell/shell.py:333
-msgid "Everyone"
-msgstr "Kowa"
-
-#: ../sugar/chat/ChatEditor.py:43
-msgid "Send"
-msgstr "Aika"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/hi.po b/po/hi.po
deleted file mode 100644
index 980cdde..0000000
--- a/po/hi.po
+++ /dev/null
@@ -1,419 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-09 21:05+0000\n"
-"Last-Translator: Shikhar Bhushan <shikhar@schmizz.net>\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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "नाम"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/ig.po b/po/ig.po
deleted file mode 100644
index 7287d5e..0000000
--- a/po/ig.po
+++ /dev/null
@@ -1,448 +0,0 @@
-# translation of sugar.po to Igbo
-# translation of sugar.po to
-# This file is distributed under the same license as the PACKAGE package.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER, 2006.
-# Onye, Sylvester <sylvester@wazobialinux.com>, 2006.
-msgid ""
-msgstr ""
-"Project-Id-Version: sugar\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2006-07-07 10:23+0100\n"
-"Last-Translator: Onye, Sylvester <sylvester@wazobialinux.com>\n"
-"Language-Team: Igbo\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.10.2\n"
-
-#: ../shell/PresenceWindow.py:62
-msgid "Who's around:"
-msgstr "Onye nọ ya:"
-
-#: ../shell/PresenceWindow.py:104
-msgid "Share"
-msgstr "Òkè"
-
-#: ../shell/StartPage.py:189
-msgid "Search"
-msgstr "Chọ̀ọ́"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Àzụ́"
-
-#: ../activities/browser/NavigationToolbar.py:23
-msgid "Forward"
-msgstr "Íhú"
-
-#: ../activities/browser/NavigationToolbar.py:29
-msgid "Reload"
-msgstr "Bubatagharịa"
-
-#: ../shell/shell.py:333
-msgid "Everyone"
-msgstr "Onyeọbụla"
-
-#: ../sugar/chat/ChatEditor.py:43
-msgid "Send"
-msgstr "Ziga"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/is.po b/po/is.po
deleted file mode 100644
index a79e711..0000000
--- a/po/is.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+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.0.1\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/it.po b/po/it.po
deleted file mode 100644
index 5d88713..0000000
--- a/po/it.po
+++ /dev/null
@@ -1,517 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-27 19:22-0500\n"
-"Last-Translator: Carlo Falciola <cfalciola@yahoo.it>\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"
-
-#: ../services/clipboard/typeregistry.py:29
-msgid "Text snippet"
-msgstr "Parte di testo"
-
-#: ../services/clipboard/typeregistry.py:57
-msgid "Image"
-msgstr "Immagine"
-
-#: ../services/clipboard/typeregistry.py:77
-msgid "Web Page"
-msgstr "Pagina web"
-
-#: ../services/clipboard/typeregistry.py:103
-msgid "PDF file"
-msgstr "File PDF"
-
-#: ../services/clipboard/typeregistry.py:123
-msgid "MS Word file"
-msgstr "File MS Word"
-
-#: ../services/clipboard/typeregistry.py:143
-msgid "RTF file"
-msgstr "File RTF"
-
-#: ../services/clipboard/typeregistry.py:154
-msgid "Abiword file"
-msgstr "File Abiword"
-
-#: ../services/clipboard/typeregistry.py:165
-msgid "Squeak project"
-msgstr "Progetto Squeak"
-
-#: ../services/clipboard/typeregistry.py:185
-msgid "OpenOffice text file"
-msgstr "File di testo OpenOffice"
-
-#: ../services/clipboard/typeregistry.py:202
-msgid "Object"
-msgstr "Oggetto"
-
-#: ../shell/intro/intro.py:78
-msgid "Pick a buddy picture"
-msgstr "Scegli un'immagine"
-
-#: ../shell/intro/intro.py:101
-msgid "My Picture:"
-msgstr "La mia immagine:"
-
-#: ../shell/intro/intro.py:181
-msgid "My Name:"
-msgstr "Il mio nome:"
-
-#: ../shell/intro/intro.py:203
-msgid "My Color:"
-msgstr "Il mio color:"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Rimuovi l'amico"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Aggiungi agli amici"
-
-#: ../shell/view/BuddyMenu.py:103
-msgid "Invite"
-msgstr "Invita"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Rimuovi"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Apri"
-
-#: ../shell/view/clipboardmenu.py:93
-msgid "Stop download"
-msgstr "Sospendi il trasferimento"
-
-#: ../shell/view/frame/ZoomBox.py:41
-msgid "Close"
-msgstr "Chiudi"
-
-#: ../sugar/graphics/optionmenu.py:72
-msgid "No options"
-msgstr "Nessuna opzione"
-
-#: ../sugar/chat/ChatEditor.py:56
-msgid "Send"
-msgstr "Invia"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Nome:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Seleziona per cambiare colore:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Indietro"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Fatto"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Prossimo"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "Invito per %s"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Aggiungi al diario"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "Oggetto Clipboard: %s."
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "Tipo Chiave:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "Tipo di Autenticazione:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "Tipo di Crittografia:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "Inizio..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Riprendi"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Stop"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "Schermata"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Riavvia"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Spegni"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "Registra"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "Disconnessione..."
-
-# A complete translation in italian: "rete a maglie" becames a tautology
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "Rete Mesh"
-
-#: ../shell/view/home/MeshBox.py:300
-#, fuzzy
-msgid "Join"
-msgstr "Associa"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Durata Batteria"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Batteria in carica"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Batteria in uso"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Batteria caricata completamente"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "Disconnesso"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "Canale"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Vicinato"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Gruppo"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-#, fuzzy
-msgid "Home"
-msgstr "Inizio"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Attività"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "Condividi con:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "Privato"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Il mio Vicinato"
-
-#: ../lib/sugar/activity/activity.py:126
-#, fuzzy
-msgid "Keep"
-msgstr "Conserva"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Annulla"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Ripeti"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Copia"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Incolla"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "Attività %s"
-
-#: ../lib/sugar/activity/activity.py:824
-#, fuzzy
-msgid "Keep error"
-msgstr "Errore di scrittura"
-
-#: ../lib/sugar/activity/activity.py:825
-#, fuzzy
-msgid "Keep error: all changes will be lost"
-msgstr "Errore di scrittura: tutte le modifiche verranno perse"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "Non interrompere"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "Interrompi comunque"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Cancella"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "Ok"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Continua"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "OK"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d anno"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d anni"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d mese"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d mesi"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d settimana"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d settimane"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d giorno"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d giorni"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d ora"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d ore"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d minuto"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d minuti"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d secondo"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d secondi"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr " e "
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ", "
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "Per applicare le modifiche è necessario riavviare sugar.\n"
-
-#: ../shell/controlpanel/control.py:267
-#, fuzzy
-msgid "Error in specified color modifiers."
-msgstr "Errore nell'alterazione dei colori richiesta"
-
-#: ../shell/controlpanel/control.py:270
-#, fuzzy
-msgid "Error in specified colors."
-msgstr "Errore nella definizione dei colori."
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "spento"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "acceso"
-
-#: ../shell/controlpanel/control.py:310
-#, fuzzy
-msgid "State is unknown."
-msgstr "Stato sconosciuto."
-
-#: ../shell/controlpanel/control.py:332
-#, fuzzy
-msgid "Error in specified radio argument use on/off."
-msgstr "Errore nel campo specificato, utilizzare acceso/spento."
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-"Autorizzazione negata. E' necessario essere \"root\" per eseguire questo "
-"metodo."
-
-#: ../shell/controlpanel/control.py:366
-#, fuzzy
-msgid "Error in reading timezone"
-msgstr "Errore nel timezone"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-#, fuzzy
-msgid "Error copying timezone (from %s): %s"
-msgstr "Errore nella copia del timezone (da %s): %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-#, fuzzy
-msgid "Could not access %s. Create standard settings."
-msgstr "Impossibile accedere a %s. Creazione configurazione standard. "
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "Linguaggio con codice=%s sconosciuto."
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "Spiacente, ma non parlo '%s'."
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "Connesso ad un Portale Mesh di scuola"
-
-#: ../shell/view/devices/network/mesh.py:107
-#, fuzzy
-msgid "Looking for a School Mesh Portal..."
-msgstr "Ricerca di un Portale Mesh di scuola..."
-
-#: ../shell/view/devices/network/mesh.py:110
-#, fuzzy
-msgid "Connected to an XO Mesh Portal"
-msgstr "Connesso ad un Portale Mesh XO"
-
-#: ../shell/view/devices/network/mesh.py:112
-#, fuzzy
-msgid "Looking for an XO Mesh Portal..."
-msgstr "Sto cercando un Portale Mesh XO..."
-
-# Diretto?
-#: ../shell/view/devices/network/mesh.py:115
-#, fuzzy
-msgid "Connected to a Simple Mesh"
-msgstr "Connesso ad un Mesh Semplice"
-
-# Diretto?
-#: ../shell/view/devices/network/mesh.py:117
-#, fuzzy
-msgid "Starting a Simple Mesh"
-msgstr "Attivazione Mesh Semplice"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "Mesh sconosciuto"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr "Informazioni su questo XO"
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr "Non disponibile"
diff --git a/po/ja.po b/po/ja.po
deleted file mode 100644
index 90fe065..0000000
--- a/po/ja.po
+++ /dev/null
@@ -1,494 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-04 09:31+0000\n"
-"Last-Translator: Taizo Shiozaki <taizo@shiozaki.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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "名前:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "クリックして色を変更:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "戻る"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "完了"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "進む"
-
-#: ../shell/view/BuddyMenu.py:59
-#, fuzzy
-msgid "Remove friend"
-msgstr "おともだちを削除"
-
-#: ../shell/view/BuddyMenu.py:62
-#, fuzzy
-msgid "Make friend"
-msgstr "おともだちを追加"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-#, fuzzy
-msgid "Invite to %s"
-msgstr "%sに招待する"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "削除"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "開く"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "ジャーナルに追加"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-#, fuzzy
-msgid "Clipboard object: %s."
-msgstr "クリップボードのオブジェクト: %s."
-
-#: ../shell/hardware/keydialog.py:149
-#, fuzzy
-msgid "Key Type:"
-msgstr "キータイプ:"
-
-#: ../shell/hardware/keydialog.py:169
-#, fuzzy
-msgid "Authentication Type:"
-msgstr "認証タイプ:"
-
-#: ../shell/hardware/keydialog.py:250
-#, fuzzy
-msgid "Encryption Type:"
-msgstr "暗号タイプ:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "起動中..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-#, fuzzy
-msgid "Resume"
-msgstr "再開"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "停止"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "スクリーンショット"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "再起動"
-
-#: ../shell/view/home/HomeBox.py:164
-#, fuzzy
-msgid "Shutdown"
-msgstr "システム終了"
-
-#: ../shell/view/home/HomeBox.py:170
-#, fuzzy
-msgid "Register"
-msgstr "ユーザー登録"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-#, fuzzy
-msgid "Disconnect..."
-msgstr "切り離す..."
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-#, fuzzy
-msgid "Mesh Network"
-msgstr "メッシュネットワーク"
-
-#: ../shell/view/home/MeshBox.py:300
-#, fuzzy
-msgid "Join"
-msgstr "参加"
-
-#: ../shell/view/devices/battery.py:38
-#, fuzzy
-msgid "My Battery life"
-msgstr "バッテリーの残り"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "充電中"
-
-#: ../shell/view/devices/battery.py:96
-#, fuzzy
-msgid "Battery discharging"
-msgstr "放電中"
-
-#: ../shell/view/devices/battery.py:98
-#, fuzzy
-msgid "Battery fully charged"
-msgstr "充電完了"
-
-#: ../shell/view/devices/network/wireless.py:61
-#, fuzzy
-msgid "Disconnected"
-msgstr "切断されました"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "チャンネル"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-#, fuzzy
-msgid "Neighborhood"
-msgstr "自分の周り"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-#, fuzzy
-msgid "Group"
-msgstr "グループ"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-#, fuzzy
-msgid "Home"
-msgstr "ホーム"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-#, fuzzy
-msgid "Activity"
-msgstr "アクティビティ"
-
-#: ../lib/sugar/activity/activity.py:115
-#, fuzzy
-msgid "Share with:"
-msgstr "共有するおともだち:"
-
-#: ../lib/sugar/activity/activity.py:117
-#, fuzzy
-msgid "Private"
-msgstr "プライベート"
-
-#: ../lib/sugar/activity/activity.py:118
-#, fuzzy
-msgid "My Neighborhood"
-msgstr "自分の周り"
-
-#: ../lib/sugar/activity/activity.py:126
-#, fuzzy
-msgid "Keep"
-msgstr "ジャーナルに記録"
-
-#: ../lib/sugar/activity/activity.py:245
-#, fuzzy
-msgid "Undo"
-msgstr "元に戻す"
-
-#: ../lib/sugar/activity/activity.py:250
-#, fuzzy
-msgid "Redo"
-msgstr "やり直す"
-
-#: ../lib/sugar/activity/activity.py:260
-#, fuzzy
-msgid "Copy"
-msgstr "コピー"
-
-#: ../lib/sugar/activity/activity.py:265
-#, fuzzy
-msgid "Paste"
-msgstr "ペースト"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-#, fuzzy
-msgid "%s Activity"
-msgstr "%sアクティビティ"
-
-#: ../lib/sugar/activity/activity.py:824
-#, fuzzy
-msgid "Keep error"
-msgstr "エラーを記録"
-
-#: ../lib/sugar/activity/activity.py:825
-#, fuzzy
-msgid "Keep error: all changes will be lost"
-msgstr "記録エラー発生:全ての変更は失われます"
-
-#: ../lib/sugar/activity/activity.py:828
-#, fuzzy
-msgid "Don't stop"
-msgstr "停止しない"
-
-#: ../lib/sugar/activity/activity.py:831
-#, fuzzy
-msgid "Stop anyway"
-msgstr "強制停止"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-#, fuzzy
-msgid "Cancel"
-msgstr "取りやめ"
-
-#: ../lib/sugar/graphics/alert.py:168
-#, fuzzy
-msgid "Ok"
-msgstr "了解"
-
-#: ../lib/sugar/graphics/alert.py:216
-#, fuzzy
-msgid "Continue"
-msgstr "続ける"
-
-#: ../lib/sugar/graphics/alert.py:244
-#, fuzzy
-msgid "OK"
-msgstr "了解"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-#, fuzzy
-msgid "%d year"
-msgstr "%d年"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-#, fuzzy
-msgid "%d years"
-msgstr "%d年"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-#, fuzzy
-msgid "%d month"
-msgstr "%d月"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-#, fuzzy
-msgid "%d months"
-msgstr "%d月"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-#, fuzzy
-msgid "%d week"
-msgstr "%d週"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-#, fuzzy
-msgid "%d weeks"
-msgstr "%d週"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-#, fuzzy
-msgid "%d day"
-msgstr "%d日"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-#, fuzzy
-msgid "%d days"
-msgstr "%d日"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-#, fuzzy
-msgid "%d hour"
-msgstr "%d時間"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-#, fuzzy
-msgid "%d hours"
-msgstr "%d時間"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-#, fuzzy
-msgid "%d minute"
-msgstr "%d分"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-#, fuzzy
-msgid "%d minutes"
-msgstr "%d分"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-#, fuzzy
-msgid "%d second"
-msgstr "%d秒"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-#, fuzzy
-msgid "%d seconds"
-msgstr "%d秒"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr "と"
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-#, fuzzy
-msgid ", "
-msgstr "、"
-
-#: ../shell/controlpanel/control.py:213
-#, fuzzy
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "変更を適用するにはsugarを再起動しなければいけません。\n"
-
-#: ../shell/controlpanel/control.py:267
-#, fuzzy
-msgid "Error in specified color modifiers."
-msgstr "指定されたカラーモディファイアでエラー"
-
-#: ../shell/controlpanel/control.py:270
-#, fuzzy
-msgid "Error in specified colors."
-msgstr "指定されたカラーでエラー"
-
-#: ../shell/controlpanel/control.py:307
-#, fuzzy
-msgid "off"
-msgstr "オフ"
-
-#: ../shell/controlpanel/control.py:309
-#, fuzzy
-msgid "on"
-msgstr "オン"
-
-#: ../shell/controlpanel/control.py:310
-#, fuzzy
-msgid "State is unknown."
-msgstr "不明な状態"
-
-#: ../shell/controlpanel/control.py:332
-#, fuzzy
-msgid "Error in specified radio argument use on/off."
-msgstr "引数radioでon/off指定エラーです。"
-
-#: ../shell/controlpanel/control.py:336
-#, fuzzy
-msgid "Permission denied. You need to be root to run this method."
-msgstr "実行が拒否されました。このメソッドを実行するにはrootでなければいけません。"
-
-#: ../shell/controlpanel/control.py:366
-#, fuzzy
-msgid "Error in reading timezone"
-msgstr "タイムゾーンの読み取りでエラー"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-#, fuzzy
-msgid "Error copying timezone (from %s): %s"
-msgstr "(%sから)タイムゾーンをコピー中にエラー:%s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-#, fuzzy
-msgid "Changing permission of timezone: %s"
-msgstr "タイムゾーンの権限変更でエラー:%s"
-
-#: ../shell/controlpanel/control.py:412
-#, fuzzy
-msgid "Error timezone does not exist."
-msgstr "エラー:そのタイムゾーンは存在しません。"
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-#, fuzzy
-msgid "Could not access %s. Create standard settings."
-msgstr "%sにアクセスできません。標準設定を作ってください。"
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-#, fuzzy
-msgid "Language for code=%s could not be determined."
-msgstr "コード%sの言語が不明です。"
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-#, fuzzy
-msgid "Sorry I do not speak '%s'."
-msgstr "ごめんなさい。'%s'は話せません。"
-
-#: ../shell/view/devices/network/mesh.py:105
-#, fuzzy
-msgid "Connected to a School Mesh Portal"
-msgstr "スクールメッシュポータルに接続しました。"
-
-#: ../shell/view/devices/network/mesh.py:107
-#, fuzzy
-msgid "Looking for a School Mesh Portal..."
-msgstr "スクールメッシュポータルを探しています..."
-
-#: ../shell/view/devices/network/mesh.py:110
-#, fuzzy
-msgid "Connected to an XO Mesh Portal"
-msgstr "XOメッシュポータルに接続しました。"
-
-#: ../shell/view/devices/network/mesh.py:112
-#, fuzzy
-msgid "Looking for an XO Mesh Portal..."
-msgstr "XOメッシュポータルを探しています..."
-
-#: ../shell/view/devices/network/mesh.py:115
-#, fuzzy
-msgid "Connected to a Simple Mesh"
-msgstr "シンプルメッシュに接続しました"
-
-#: ../shell/view/devices/network/mesh.py:117
-#, fuzzy
-msgid "Starting a Simple Mesh"
-msgstr "シンプルメッシュを開始しています。"
-
-#: ../shell/view/devices/network/mesh.py:124
-#, fuzzy
-msgid "Unknown Mesh"
-msgstr "不明なメッシュ"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/ko.po b/po/ko.po
deleted file mode 100644
index a79e711..0000000
--- a/po/ko.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+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.0.1\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/mk.po b/po/mk.po
deleted file mode 100644
index 4f5a51f..0000000
--- a/po/mk.po
+++ /dev/null
@@ -1,432 +0,0 @@
-# translation of olpc-sugar.master.po to Macedonian
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# Arangel Angov <arangel@linux.net.mk>, 2007.
-msgid ""
-msgstr ""
-"Project-Id-Version: olpc-sugar.master\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2007-08-08 15:40+0200\n"
-"Last-Translator: Arangel Angov <arangel@linux.net.mk>\n"
-"Language-Team: Macedonian <ossm-members@hedona.on.net.mk>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.11.4\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Име:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Кликни да смениш боја:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Назад"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Завршено"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Напред"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Отстрани пријател"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Додај пријател"
-
-#. FIXME check that the buddy is not in the activity already
-#: ../shell/view/BuddyMenu.py:96
-msgid "Invite"
-msgstr "Покани"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Отстрани"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Отвори"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Додај во дневникот"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "Објект од таблата со исечоци: %s"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Соседство"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Група"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "Дома"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Активност"
-
-#: ../services/clipboard/objecttypeservice.py:32
-msgid "Text"
-msgstr "Текст"
-
-#: ../services/clipboard/objecttypeservice.py:36
-msgid "Image"
-msgstr "Слика"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "Слика од екранот"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Исклучи"
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "Соседство"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Мојата батерија"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Батеријата се полни"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Батерјате се празни"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Батеријата е наполнета"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "Приватно"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Мое соседство"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Зачувај"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Стоп"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s активност"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/ml.po b/po/ml.po
deleted file mode 100644
index a79e711..0000000
--- a/po/ml.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+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.0.1\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/mn.po b/po/mn.po
deleted file mode 100644
index 05e4e9c..0000000
--- a/po/mn.po
+++ /dev/null
@@ -1,419 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-30 21:56-0500\n"
-"Last-Translator: Enkhzul <enkhzul@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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Нэр:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Өнгө солихын тулд дарна уу"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Буцах"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Хийж дууслаа"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Дараагийн"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Найзыг арилгах"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Найз болох"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "% урих"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Арилгах"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Нээх"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Бүртгэлийн дэвтэрт нэмэх"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "Санасан зүйлс: %."
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "Үндсэн төрөл: "
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "Таних төрөл:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "Нууцлах төрөл:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "Эхлэж байна..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Сэргээх"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Зогсоох"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "Дэлгэцний зураг"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Дахин ачаалах"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Унтраах"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "Бүртгүүлэх"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "Салгах..."
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "Mesh сүлжээ"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "Нэгдэх"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Миний цэнэгний хугацаа"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Зайг цэнэглэж байна"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Зай цэнэглэгдэхгүй байна"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Зай дүүрэн цэнэглэгдлээ"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "Салгалаа"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "Суваг"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Хөрш"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Бүлэг"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "Нүүр"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "Хуваалцах:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "Хувийн"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Миний хөрш"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Хадгалах"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Болих"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Дахин хийх"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Санах"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Хуулах"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "Алдааг үргэлжлүүлэх"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "Алдааг үргэлжлүүлэх: бүх засвар устана"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "Бүү зогсоо"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "Зогсоох"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Цуцлах"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "Ok"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Үргэлжлүүлэх"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "OK"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "% жил"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "% жилүүд"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "% сар"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "% сарууд"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "% долоо хоног"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "% долоо хоногууд"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "% өдөр "
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "% өдрүүд"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "% цаг"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "% цаг "
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "% минут"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "% минут"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "% секунд"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "% секунд"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr "ба"
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ","
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "Өөрчлөлтийг оруулахын тулд та sugar-ийг дахин асаах шаардлагатай.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "Унтраах"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "Асаах"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "Төлөв тодорхойгүй"
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/ne.po b/po/ne.po
deleted file mode 100644
index 12cbe55..0000000
--- a/po/ne.po
+++ /dev/null
@@ -1,419 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2007-12-18 20:02+0000\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: Translate Toolkit 1.0.1\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "नामः"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "रङ्ग परिवर्तन गर्न क्लिक गरः"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "पछाडि"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "भयो"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "अर्को"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "साथी हटाऊ"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "साथी बनाऊ"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "%s लाई निम्ता देऊ"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "हटाऊ"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "खोल"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "खातामा राख"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "क्लिपपाटी वस्तु: %s."
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "कुञ्जी प्रकार:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "प्रमाणीकरण प्रकार:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "गुप्तीकरण प्रकार:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "शुरु हुदैछ..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "पुनरारम्भ"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "रोक"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "पर्दाछवि"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "पुन:बुट"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "बन्द"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "दर्ता "
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "जडान विच्छेद"
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "मेश सञ्जाल"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "सहभागी होऊ"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "मेरो बेटरी"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "बेटरी चार्ज हुँदै"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "बेटरी डिस्चार्ज हुँदै"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "बेटरीमा पूरा चार्ज छ"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "विच्छेद भयो"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "माध्यम"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "छिमेक"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "समुह"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "गृह"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "क्रियाकलाप"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "साझा गर:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "निजी"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "मेरो छिमेक"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "राख"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "पूर्वस्थिति"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "नयाँस्थिति"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "प्रतिलिपि"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "टाँस"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s क्रियाकलाप"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "त्रुटि राख"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "त्रुटि राख: सवै परिवर्तनहरु हराउनेछन्"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "नरोक"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "जसरी पनि रोक"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "रद्द"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "हुन्छ"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "जारी राख"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "हुन्छ"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d वर्ष"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d वर्ष"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d महिना"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d महिना"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d हप्ता"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d हप्ता"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d दिन"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d दिन"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d घण्टा"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d घण्टा"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d मिनेट"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d मिनेट"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d सेकेण्ड"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d सेकेण्ड"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr "_र_"
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ",_"
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "परिवर्तन लागू गर्न सुगर पुन:शुरु गर्नु पर्छ ।\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "तोकिएको रङ्ग परिमार्जकहरुमा त्रुटी छ।"
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "तोकिएको रङ्गहरुमा त्रुटी छ।"
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "बन्द"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "खुला"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "अवस्था अज्ञात छ।"
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "तोकिएको रेडियो निर्देशनमा त्रुटि छ, बन्द/खुला प्रयोग गर।"
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "अनुमति दिईएन। यो काम गर्न तिमी रुट हुनुपर्छ।"
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "समयक्षेत्र पढ्दा त्रुटि भयो"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "समयक्षेत्र प्रतिलिपि गर्दा त्रुटि भयो (%s बाट): %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "%s समयक्षेत्रको अनुमति परिवर्तन गर्दै "
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "त्रुटि, समयक्षेत्र उपलब्ध छैन।"
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "%s मा पहुँच भएन। मानक सेटिङ्गहरु बनाऊ।"
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "कोड=%sको भाषा निश्चित गर्न सकिएन।"
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "माफ गर्नुस, म '%s' बोल्दिन।"
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "विद्यालय मेश पोर्टलमा जडान भयो"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "विद्यालय मेश पोर्टल खोज्दै..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "XO मेश पोर्टलमा जडान भयो"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "XO मेश पोर्टल खोज्दै..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "साधारण मेशमा जडान भयो"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "साधारण मेश शुरु गर्दै"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "अज्ञात मेश"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr "यो XO को बारेमा"
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr "उपलब्ध छैन"
diff --git a/po/nl.po b/po/nl.po
deleted file mode 100644
index aef007b..0000000
--- a/po/nl.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-07 21:10+0000\n"
-"Last-Translator: Bastiaan Bakker <bastiaan@olpc-nl.org>\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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Naam:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Klik om de kleur te veranderen:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Terug"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Klaar"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Volgende"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Verwijder vriend"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Maak vriend "
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "Nodig uit voor %s"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Verwijder"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Open"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Voeg toe aan dagboek"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Hervat"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Stop"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Herstart"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "Kanaal"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Omgeving"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Groep"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Activiteit"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "Deel met:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Mijn Omgeving"
-
-# lijkt misschien teveel op een "sla op" actie?
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Bewaar"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Maak ongedaan"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Doe opnieuw"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Kopieer"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Plak"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s Activiteit"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "Bewaarfout"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "Bewaarfout: alle wijzigingen gaan verloren"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "Niet stoppen"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "Toch stoppen"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Afbreken"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "Doorgaan"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Doorgaan"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "OK"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d jaar"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d jaren"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/pa.po b/po/pa.po
deleted file mode 100644
index a79e711..0000000
--- a/po/pa.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+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.0.1\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/pl.po b/po/pl.po
deleted file mode 100644
index a48e32e..0000000
--- a/po/pl.po
+++ /dev/null
@@ -1,485 +0,0 @@
-# translation of pl.po to Polish
-# Piotr Drąg <raven@pmail.pl>, 2007.
-msgid ""
-msgstr ""
-"Project-Id-Version: pl\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-07 22:22+0000\n"
-"Last-Translator: Wiktor Idzikowski <wiktor.idzikowski@gmail.com>\n"
-"Language-Team: Polish <pl@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"
-
-#: ../shell/intro/intro.py:77
-msgid "Pick a buddy picture"
-msgstr "Wybierz obrazek znajomego"
-
-#: ../shell/intro/intro.py:100
-msgid "My Picture:"
-msgstr "Mój obrazek:"
-
-#: ../shell/intro/intro.py:180
-msgid "My Name:"
-msgstr "Moje imię:"
-
-#: ../shell/intro/intro.py:224
-msgid "My Color:"
-msgstr "Mój kolor:"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Usuń przyjaciela"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Uczyń przyjacielem"
-
-#. FIXME check that the buddy is not in the activity already
-#: ../shell/view/BuddyMenu.py:96
-msgid "Invite"
-msgstr "Zaproś"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Usuń"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Otwórz"
-
-#: ../shell/view/clipboardmenu.py:76
-msgid "Stop download"
-msgstr "Zatrzymaj pobieranie"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Dodaj do dziennika"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "Obiekt w schowku: %s."
-
-#: ../services/clipboard/objecttypeservice.py:32
-msgid "Text"
-msgstr "Tekst"
-
-#: ../services/clipboard/objecttypeservice.py:36
-msgid "Image"
-msgstr "Obrazek"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "Zrzut ekranu"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Zakończ"
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "Sieć"
-
-#: ../sugar/activity/activity.py:68
-msgid "Save"
-msgstr "Zapisz"
-
-#: ../sugar/activity/activity.py:74
-msgid "Share"
-msgstr "Podziel się"
-
-#: ../sugar/activity/activity.py:87
-msgid "Close"
-msgstr "Zamknij"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "Aktywność %s"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Imię:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Kliknij aby zmienić kolor:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Wstecz"
-
-#: ../shell/intro/intro.py:160
-#, fuzzy
-msgid "Done"
-msgstr "Zakończono"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Dalej"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "Zaproś do %s"
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "Rodzaj klucza:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "Rodzaj uwierzytelniania:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "Rodzaj szyfrowania:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-#, fuzzy
-msgid "Starting..."
-msgstr "Rozpoczynanie..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Wznów"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Zatrzymaj"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Uruchom ponownie"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "Zarejestruj"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-#, fuzzy
-msgid "Disconnect..."
-msgstr "Rozłączanie..."
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "Dołącz"
-
-#: ../shell/view/devices/battery.py:38
-#, fuzzy
-msgid "My Battery life"
-msgstr "Życie mojej baterii"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Ładowanie baterii"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Rozładowywanie baterii"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Bateria w pełni naładowana"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "Rozłączony"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "Kanał"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Sąsiedztwo"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Grupa"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "Dom"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Czynność"
-
-#: ../lib/sugar/activity/activity.py:115
-#, fuzzy
-msgid "Share with:"
-msgstr "Podziel się z:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "Prywatny"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Moje sąsiedztwo"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Zachowaj"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Cofnij"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Ponów"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Kopiuj"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Wklej"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "Zachowaj błąd"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "Zachowaj błąd: wszystkie zmiany zostaną utracone"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "Nie zatrzymuj"
-
-#: ../lib/sugar/activity/activity.py:831
-#, fuzzy
-msgid "Stop anyway"
-msgstr "Zatrzymaj mimo wszystko"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Anuluj"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "Ok"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Kontynuuj"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "OK"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d rok"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d lata"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d miesiąc"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d miesiące"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d tydzień"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d tygodnie"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d dzień"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-#, fuzzy
-msgid "%d days"
-msgstr "%d dni"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d godzina"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d godziny"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d minuta"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d minuty"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d sekunda"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d sekundy"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr "_i_"
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-#, fuzzy
-msgid ", "
-msgstr ", "
-
-#: ../shell/controlpanel/control.py:213
-#, fuzzy
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "Aby zastosować zmiany należy uruchomić ponownie sugar."
-
-#: ../shell/controlpanel/control.py:267
-#, fuzzy
-msgid "Error in specified color modifiers."
-msgstr "Błąd w podanych modifikatorach kolorów."
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "Błąd w podanych kolorach."
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "Wyłączony"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "Włączony"
-
-#: ../shell/controlpanel/control.py:310
-#, fuzzy
-msgid "State is unknown."
-msgstr "Nieokreślony stan."
-
-#: ../shell/controlpanel/control.py:332
-#, fuzzy
-msgid "Error in specified radio argument use on/off."
-msgstr "Błąd w podanych arugumentach radia użyj Włącz/Wyłącz"
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "Brak dostępu. Musisz być superużytkownikiem aby użyć tej metody."
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "Błąd przy wczytywaniu strefy czasowej"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "Bład przy wczytywaniu strefy czasowej (z %s): %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-#, fuzzy
-msgid "Changing permission of timezone: %s"
-msgstr "Zmienianie uprawnień do strefy czasowej: %s"
-
-#: ../shell/controlpanel/control.py:412
-#, fuzzy
-msgid "Error timezone does not exist."
-msgstr "Błąd, strefa czasowa nie istnieje."
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-#, fuzzy
-msgid "Could not access %s. Create standard settings."
-msgstr "Nie można odczytać %s. Stwórz standardowe ustawienia."
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "Nie można określić języka dla kodu=%s."
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-#, fuzzy
-msgid "Sorry I do not speak '%s'."
-msgstr "Przykro mi, nie mówię po '%s'."
-
-#: ../shell/view/devices/network/mesh.py:105
-#, fuzzy
-msgid "Connected to a School Mesh Portal"
-msgstr "Połączono z serwerem szkolnym"
-
-#: ../shell/view/devices/network/mesh.py:107
-#, fuzzy
-msgid "Looking for a School Mesh Portal..."
-msgstr "Szukanie serwera szkolnego..."
-
-#: ../shell/view/devices/network/mesh.py:110
-#, fuzzy
-msgid "Connected to an XO Mesh Portal"
-msgstr "Połączono z portalem XO"
-
-#: ../shell/view/devices/network/mesh.py:112
-#, fuzzy
-msgid "Looking for an XO Mesh Portal..."
-msgstr "Szukanie portalu XO..."
-
-#: ../shell/view/devices/network/mesh.py:115
-#, fuzzy
-msgid "Connected to a Simple Mesh"
-msgstr "Połączono z Simple Mesh"
-
-#: ../shell/view/devices/network/mesh.py:117
-#, fuzzy
-msgid "Starting a Simple Mesh"
-msgstr "Rozpoczynanie Simple Mesh"
-
-#: ../shell/view/devices/network/mesh.py:124
-#, fuzzy
-msgid "Unknown Mesh"
-msgstr "Nieznany Mesh"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/ps.po b/po/ps.po
deleted file mode 100644
index 1af6cf1..0000000
--- a/po/ps.po
+++ /dev/null
@@ -1,424 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-09 11:20+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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "نوم:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "د رنګ بدلون لپاره ټك كړئ:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "شا"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "هوكې"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "بل"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "ملګرې لرکول"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "ملګرې جوړول"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "بلون %s ته"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "لركول"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "پرانېستل"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "ورځپاڼې ته زياتول"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "د ټوټه دړې څيزونه: %s."
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "كلي ځېل:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "د كره توب ځېل:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "د کوډه کښنه ځېل:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "پيلونه..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "کارمخینه"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "تمېدل"
-
-#: ../shell/view/Shell.py:285
-#, fuzzy
-msgid "Screenshot"
-msgstr "پرده انځور"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "بیاپیلون"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "ګلول-بندول"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "نومکښل"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "ناپيوستل"
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "مېش جال"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "يوځايېنه"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "زما د بېټرۍ ژوند"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "بېټرۍ چارجېږي"
-
-#: ../shell/view/devices/battery.py:96
-#, fuzzy
-msgid "Battery discharging"
-msgstr "بېټري نه چارجېږي"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "بېټري بشپړه چارج شوه"
-
-#: ../shell/view/devices/network/wireless.py:61
-#, fuzzy
-msgid "Disconnected"
-msgstr "ناپيوستل"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "چېنل"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "ګاونډېتوب"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "ډله"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "کور"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "چارندتیا"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "ونډول له:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "ځاني"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "زما ګاونډيتوب"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "خوندي كول"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "ناکړ"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "بیاکړ"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "لمېسل"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "سرېښل"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s چارندتیا"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "تېروتنې ساتل"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "تېروتنې ساتل: ټول بدلونونه به له لاسه وركړئ"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "مه تمېږه"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "پ هره توګه تمېدل"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "رنګول"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "هو"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "ادامه وركول"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "هو"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d كال"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d كلونه"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d مياشت"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d مياشتې"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d اونۍ"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d اونۍ"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d ورځ"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d ورځې"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d ساعت"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d ساعتونه"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d دقيقه"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d دقيقې"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d ثانيه"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d ثانيې"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr "_او_"
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr "،_"
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "د بدلونونو كارولو لپاره تاسې بايد شوګر بیاپیل كړئ.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "د بدلوونې رنګ په ټاكنه كۍ تېروتنه."
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "په مالومو رنګونو كې تېروتنې بدلوونې"
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "بندول"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "روښانول"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "ايالت ناڅرګند دى."
-
-#: ../shell/controlpanel/control.py:332
-#, fuzzy
-msgid "Error in specified radio argument use on/off."
-msgstr "په ټاكلي راډيو كې تېروتنې "
-
-#: ../shell/controlpanel/control.py:336
-#, fuzzy
-msgid "Permission denied. You need to be root to run this method."
-msgstr "پرېښلې رد شو. ددې لېلې چلولو لپاره بايد تاسې ريښه اوسـئ"
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "د مهالزون په لوستتنه كې تېروتنې"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "تېروتنه مهالزون لمېسل (له %s): %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "مهالزون پرېښلې د بدلون په حال كې: %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "تېروتنه، مهالزون شتون نلري."
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "%s ته لاسرسې نه كېږي. كره امستنې وپنځوئ"
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "د code=%s لپاره ژبه مالومه نكړاى شوه."
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "بښنه غواړم زه خبرې نه كوم '%s'."
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "د ښوونځي مېش ور سره پيوست شو."
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "د ښوونځي مېش ور لپاره لټون"
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "د XO مېش ور سره پيوست شو."
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "د XO مېش ور لپاره لټون"
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "له ساده مېش سره پيوست شو."
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "د ساده مېش پيلېدنه"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "ناڅرګنده مېش"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/pt.po b/po/pt.po
deleted file mode 100644
index 3a13528..0000000
--- a/po/pt.po
+++ /dev/null
@@ -1,419 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-07 18:59+0000\n"
-"Last-Translator: Ivo Emanuel Gonçalves <justivo@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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Nome:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Clica para mudar a cor:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Anterior"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Finalizado"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Próximo"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Remover amigo"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Fazer amigo"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "Convidar para %s"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Remover"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Abrir"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Adicionar ao Diário"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "Objecto da barra lateral: %s."
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "Tipo de Chave:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "Tipo de Autenticação:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "Tipo de Encriptação:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "Começando..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Continuar"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Parar"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "Fotografia"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Reiniciar"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Desligar"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "Registar"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "Desconectar..."
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "Rede Mesh"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "Juntar"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Energia da bateria"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Bateria a carregar"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Bateria a descarregar"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Bateria totalmente carregada"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "Disconectado"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "Canal"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Vizinhança"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Grupo"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "Zona Principal"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Actividade"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "Partilhar com:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "Privado"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Minha Vizinhança"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Manter"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Desfazer"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Refazer"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Copiar"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Colar"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s Actividade"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "Guardar erro"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "Guardar erro: todas as mudanças serão perdidas"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "Não pares"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "Parar à mesma"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "Ok"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Continuar"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "OK"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d ano"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d anos"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d mês"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d meses"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d semana"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d semanas"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d dia"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d dias"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d hora"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d horas"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d minuto"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d minutos"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d segundo"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d segundos"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr " e "
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ", "
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "Para aplicar as mudanças tens que reiniciar o sistema.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "Erro nos modificadores de cor especificados."
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "Erro nas cores especificadas."
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "desligar"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "ligar"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "Situação é desconhecida."
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "Erro no argumento especificado, usa ligar/desligar."
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "Permissão negada. Tens que ser administrador para correr este método."
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "Erro ao ler a zona horária"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "Erro ao copiar a zona horária (de %s): %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "Modificando permissão da zona horária: %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "Erro: zona horária não existe."
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "Não foi possível aceder a %s. Cria uma configuração básica."
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "Código de linguagem=%s não foi possível determinar."
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "Desculpa, eu não falo '%s'."
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "Conectado a um Portal Mesh de Escola"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "À procura de um Portal Mesh de Escola..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "Conectado a um Portal Mesh de XO"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "À procura de um Portal Mesh de XO"
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "Conectado a uma Mesh Simples"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "A começar uma Mesh Simples"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "Mesh Desconhecida"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/pt_BR.po b/po/pt_BR.po
deleted file mode 100644
index 7c2a33d..0000000
--- a/po/pt_BR.po
+++ /dev/null
@@ -1,445 +0,0 @@
-# translation of olpc-sugar-pt_BR.po to Brazilian Portuguese
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# Diego Búrigo Zacarão <diegobz@gmail.com>, 2007.
-msgid ""
-msgstr ""
-"Project-Id-Version: olpc-sugar-pt_BR\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-21 15:05+0000\n"
-"Last-Translator: Eduardo H. Silva <HoboPrimate@gmail.com>\n"
-"Language-Team: Brazilian Portuguese <fedora-docs-br@redhat.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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Nome:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Clique para mudar a cor:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Voltar"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Pronto"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Próximo"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Remover amigo"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Fazer amigo"
-
-#. FIXME check that the buddy is not in the activity already
-#: ../shell/view/BuddyMenu.py:96
-msgid "Invite"
-msgstr "Convidar"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Remover"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Abrir"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Adicionar ao diário"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "Objeto da prancheta: %s"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Vizinhança"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Grupo"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "Casa"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Atividade"
-
-#: ../services/clipboard/objecttypeservice.py:32
-msgid "Text"
-msgstr "Texto"
-
-#: ../services/clipboard/objecttypeservice.py:36
-msgid "Image"
-msgstr "Imagem"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "Foto da tela"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Desligar"
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "Rede Mesh"
-
-# Meu tempo de bateria (mas não mostra o tempo, mas a carga...)
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Carga de minha Bateria"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Carregando a bateria"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Descarregando a bateria"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Bateria completamente carregada"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Manter"
-
-#: ../sugar/activity/activity.py:74
-msgid "Share"
-msgstr "Compartilhar"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Parar"
-
-# Acho que aqui é usado para falar de "Atividade de Pintar", "Atividade de Pippy", etc.
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "Atividade %s"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "Convidar para %s"
-
-# deve ter a ver com a password do router?
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "Tipo da Chave:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "Tipo de Autenticação:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "Tipo de Encritação:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "Iniciando..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Continuar"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Reiniciar"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "Cadastrar"
-
-# Creio que as reticências são um erro do texto original, porque isto é uma opção. E a msg do programador não é verdade
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "Desconectar"
-
-# Alternativamente poderia ser "Entrar"
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "Juntar-se"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "Desconectado"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "Canal"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "Compartilhar com:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "Privado"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Minha Vizinhança"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Desfazer"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Fazer de novo"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Copiar"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Colar"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "Erro ao manter"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "Erro ao manter: todas as alterações serão desfeitas"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "Não pare"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "Pare mesmo assim"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "Ok"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Continuar"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "OK"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d ano"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d anos"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d mês"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d meses"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d semana"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d semanas"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d dia"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d dias"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d hora"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d horas"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d minuto"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d minutos"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d segundo"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d segundos"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr " e "
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ", "
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "Para terminar suas mudanças você deve reiniciar o sugar.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "Erro nos alteradores de cor selecionados."
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "Erro nas cores especificadas."
-
-# isto é um argumento para o "sugar-control-panel radio off"
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "desligado"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "ligado"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "O estado é desconhecido."
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "Erro no argumento de rádio especificado, use on/off."
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-"Permissão negada. Você precisa ser o usuário root para executar este método."
-
-# isto é a resposta caso "sugar-control-panel g timezone" dê erro
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "Erro ao ler o fuso horário"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "Erro ao copiar o fuso horário (de %s): %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "Mudando a permissão do fuso horário: %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "Erro: fuso horário não existe."
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "Não foi possível acessar %s. Crie configurações padrão."
-
-# code=código? deve-se referir a pt_PT, pt_BR , etc.
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "Não foi possível determinar a língua para o código=%s."
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "Desculpe, eu não falo '%s'."
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "Conectado ao Portal Mesh da Escola"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "Procurando por um Portal Mesh da Escola..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "Conectado ao Portal Mesh de um XO"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "Procurando pelo Portal Mesh de algum XO..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "Conectado a uma Mesh Simples"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "Iniciando uma Mesh Simples"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "Mesh desconhecida"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr "Sobre este XO"
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr "Não disponível"
diff --git a/po/qu.po b/po/qu.po
deleted file mode 100644
index a79e711..0000000
--- a/po/qu.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+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.0.1\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/ro.po b/po/ro.po
deleted file mode 100644
index 69b541f..0000000
--- a/po/ro.po
+++ /dev/null
@@ -1,419 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-07 18:20+0000\n"
-"Last-Translator: David Lazar <david@davidlazar.org>\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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Nume:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Înapoi"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Gata"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Următor"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Şterge prieten"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Adaugă prieten"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Deschide"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Adaugă la jurnal"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Reia"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Oprește"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Reporneşte"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "Înregistrează"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Durata bateriei mele"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Bateria se încarcă"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Bateria se descarcă"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "Acasă"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Activitate"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Păstrează"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Anulează"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Refă"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Copiază"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Lipeşte"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Anulează"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "Ok"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Continuă"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "OK"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d an"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d ani"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d lună"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d luni"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d săptămână"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d săptămâni"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d zi"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d zile"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d oră"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d ore"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d minut"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d minute"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d secundă"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d secunde"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr " şi "
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ", "
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/ru.po b/po/ru.po
deleted file mode 100644
index b49f59a..0000000
--- a/po/ru.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2007-12-23 09:35+0000\n"
-"Last-Translator: Maxim Osipov <maxim.osipov@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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "Имя:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "Кликните для изменения цвета:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Назад"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "Готово"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "Далее"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "Убрать друга"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "Создать друга"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "Пригласить в %s"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "Удалить"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "Открыть"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "Добавить в журнал"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "Объект буфера: %s."
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "Тип ключа:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "Тип аутентификации:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "Тип шифрования:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "Запуск..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Продолжить"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Стоп"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "Снимок экрана"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Перезагрузить"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Выключить"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "Зарегистрироваться"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "Разъединить..."
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "Местная Сеть"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "Присоединиться"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Моя Батарейка"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Батарейка заряжается"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Батарейка разряжается"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Батарейка полностью заряжена"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "Не подключен"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "Канал"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "Соседи"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "Группа"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "Дом"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "Активность"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "Разделить с:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "Личное"
-
-# в русском языке мы не Пишем Каждое Слово с Заглавной Буквы
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Мои соседи"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Хранить"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Отменить"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Повторить"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Копировать"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Вставить"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s Активность"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "Ошибка сохранения"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "Ошибка сохранения: все изменения будут потеряны"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "Не останавливаться"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "Все равно остановиться"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Отмена"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "Ок"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Продолжить"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "ОК"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d год"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d лет"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d месяц"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d месяцев"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d неделя"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d недель"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d день"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d дней"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d час"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d часов"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d минута"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d минут"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d секунда"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d секунд"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr " и "
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ", "
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "Чтобы применить изменения перезапустите sugar.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "Ошибка в определении цветов."
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "Ошибка выбора цветов."
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "выкл"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "вкл"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "Состояние неизвестно."
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "Ошибка выбора, используйте вкл/выкл."
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "Доступ запрещен. Вы должны быть root-ом чтобы выполнить этот метод."
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "Ошибка чтения часового пояса."
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "Ошибка копирования часового пояса (из %s): %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "Изменяются права доступа часового пояса: %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "Ошибка - часовой пояс не существует."
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "Нет доступа к %s. Создайте стандартные настройки."
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "Язык с кодом=%s не определен."
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "Я не говорю по '%s'."
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "Подключен к Местному Школьному Серверу"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "Поиск Местного Школьного Сервера..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "Подключен к Местному Серверу XO"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "Поиск Местного Сервера XO..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "Подключен к Простой Местной Сети"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "Запуск Простой Местной Сети"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "Неизвестная Местная Сеть"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/rw.po b/po/rw.po
deleted file mode 100644
index a79e711..0000000
--- a/po/rw.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+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.0.1\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/sugar.pot b/po/sugar.pot
deleted file mode 100644
index ce989cd..0000000
--- a/po/sugar.pot
+++ /dev/null
@@ -1,342 +0,0 @@
-# SOME 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-01-18 18:19+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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
diff --git a/po/te.po b/po/te.po
deleted file mode 100644
index 483d549..0000000
--- a/po/te.po
+++ /dev/null
@@ -1,425 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-29 11:46-0800\n"
-"Last-Translator: baba <baba_amu@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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "పేరు"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "రంగు మార్చడానికి నొక్కు"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "వెనుకకు"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "పూర్తి అయినది"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "తర్వాత"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "స్నేహం తీసివేయి"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "స్నేహం చేయి"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "%s కు పిలువు"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "తీసివేయి"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "తెరువు"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "పద్దుకి కలుపు"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "క్లిప్ బోర్డు వస్తువు : %s."
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "తాళం రకము"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "దృడపరచుకొనే రకము"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "గుప్త్తీకరి౦చే రకము"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "మొదలవుతుంది..."
-
-#: ../shell/view/home/activitiesdonut.py:104
-#: ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "పునరార౦భి౦చు"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "ఆపు"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "తెరముద్ర"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "తిరిగి బూట్ చేయి"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "ఫూర్తిగా ఆపు"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "దాఖలు చేయి"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90
-#: ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "వేరుచేయి . . ."
-
-#: ../shell/view/home/MeshBox.py:195
-#: ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "మెష్ వల"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "కలువు"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "నా బేటరీ ఆయువు"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "బేటరీ చార్జి అవుతుంది"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "బేటరీ డిచ్చార్జి అవుతుంది"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "బేటరీ పుర్తిగా చార్జి అయింది"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "వేరుచేయబడింది"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "ప్రవాహము"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "చుట్టుపక్కలవారు"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "గుంపు"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "ఇల్లు"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "వ్యాపక౦"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "తో పంచుకో:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "సొంతం"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "నా చుట్టుపక్కలవారు"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "ఉంచు"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "ఆఖరుది రద్దు చేయి"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "తిరిగి చేయి"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "నకలు"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "అతికించు"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s వ్యాపకం"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "పొరబాటు జరిగింది"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "పొరబాటు జరిగింది : అన్ని మార్పులూ పోతాయి"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "ఆపవద్దు"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "ఏదేమైనా ఆపువేయి"
-
-#: ../lib/sugar/graphics/alert.py:164
-#: ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "రద్దు చేయి"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "సరి"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "కొనసాగించు"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "సరి"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d సంవత్సరము"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d సంవత్సరాలు"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d నెల"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d నెలలు"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d వారము"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d వారాలు"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d రోజు"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d రోజులు"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d గంట"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d గంటలు"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d నిమిషము"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d నిమిషాలు"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d సెకను"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d సెకనులు"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr " మరియు "
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ", "
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "మీ మార్పులు పనిచేయడానికి సుగరును తిరిగి మొదలు పెట్టండి.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "నిర్ధేశించి చెప్పిన రంగులు మార్చడంలో పొరబాటు జరిగింది"
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "నిర్ధేశించి చెప్పిన రంగులలో పొరబాటు జరిగింది"
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "లేదు"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "ఉంది"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "ఉనికి తెలియదు"
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "రేడియొ నిర్దేసించడంలో పొరబాటు. ఉంది/లేదు వాడనా ."
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "అనుమతి లేదు. మీరు రూట్ గా మారి ప్రయత్నించాలి"
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "కాలమండలం చదవడంలో పొరబాటు జరిగింది"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "కాలమండలం నకలు చేయడంలో పొరబాటు జరిగింది (%s నుంచి ): %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "కాలమండలం అనుమతి మారుతుంది:%s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "పొరబాటు. కాలమండలమే లేదు."
-
-#: ../shell/controlpanel/control.py:417
-#: ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "%s ప్రవేశము కుదరలేదు. ప్రమాణ మైన సెట్టింగ్ శ్రుష్తించనా."
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "కోడ్=%s కు భాష తెలియ లేదు."
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "మన్నించాలి నేను '%s'మాట్లాడలేను"
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "బడి మెష్ పొర్టల్ తో జతచేయబడింది"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "బడి మెష్ పొర్టల్ కోసమై చూస్తున్నా..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "ఎక్స్ఒ మెష్ పొర్టల్ తో జతచేయబడింది"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "ఎక్స్ఒ మెష్ పొర్టల్ కోసమై చూస్తున్నా..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "సరళమైన మెష్ తో జత కుదిరింది"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "సరళమైన మెష్ మొదలవుతుంది"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "తెలియని మెష్"
-
-#: ../shell/view/home/HomeBox.py:175
-#: ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr "ఈ ఎక్స్ఒ గురించి"
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr "అందుబాటులో లేదు"
diff --git a/po/th.po b/po/th.po
deleted file mode 100644
index a79e711..0000000
--- a/po/th.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+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.0.1\n"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/ur.po b/po/ur.po
deleted file mode 100644
index 7f534e4..0000000
--- a/po/ur.po
+++ /dev/null
@@ -1,419 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-03 09:33+0000\n"
-"Last-Translator: Huda Sarfraz <huda.sarfraz@nu.edu.pk>\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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "نام:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "رنگ تبديل کرنے کے ليے کلک کريں:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "واپس"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "مکمل"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "آگے"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "دوست کو ہٹائيں"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "دوست بنائيں"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "%s کی دعوت دیں"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "ہٹائيں"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "کھوليں"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "جریدے ميں شامل کريں"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "تختہ تراشہ آبجیکٹ: %s۔"
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "کلید قسم:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "توثیق کاری قسم:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "خفیہ کاری قسم:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "شروع ہو رہا ہے ..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "پھر جاری کریں"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "روکیں"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "سکرين شاٹ"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "پھر بوٹ کریں"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "بند کريں"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "رجسٹر کريں"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "منقطع کریں..."
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "ميش نيٹ ورک"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "شرکت کريں"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "ميری بيٹری کی زندگی"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "بيٹری چارج ہو رہی ہے"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "بیٹری ڈسچارج ہو رہی ہے"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "ببيٹری پوری چارج ہے"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "منقطع"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "چينل"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "گرد و نواح"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "گروپ"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "گھر"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "سرگرمی"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "حصہ داری کریں از:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "ذاتی"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "ميرا گرد و نواح"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "رکھيں"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "کالعدم کريں"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "اعادہ کريں"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "نفل کريں"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "جوڑيں"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s سرگرمی"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "رکھنے میں نقص"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "رکھنے میں نقص: تمام تبديلياں ضائع ہو جائیں گی"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "نہیں روکیں"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "پھر بھی روکيں"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "منسوخ کريں"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "ٹھیک ہے"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "جاری رکھیں"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "ٹھیک ہے"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d سال"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d سال"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d مہينہ"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d مہينے"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d ہفتہ"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d ہفتے"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d دن"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d دن"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d گھنٹہ"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d گھنٹے"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d منٹ"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d منٹ"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d سيکن"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d سيکن"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr "_اور_"
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr "،_"
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "اپنی تبديلیاں عمل میں لانے کے لیے آپ کو شوگر پھر شروع کرنا ہو گا۔\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "اختصاص کردہ رنگ ترمیم کاروں میں نقص۔"
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "اختصاص کردہ رنگوں میں نقص۔"
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "آف"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "آن"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "نامعلوم حالت"
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "اختصاص کردہ ریڈیو آرگیومنٹ میں نقص، آن/آف استعمال کریں۔"
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "اجازت سے انکار۔ یہ میتھڈ چلانے کے لیے آپ کو بھر بوٹ کرنا ہو گا۔"
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "ٹائیم زون پڑھنے میں نقص"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "ٹائیم زون نقل کرنے میں (%s سے) نقص: %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "ٹائیم زون کی اجازت بدل رہا ہے: %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "نقص، ٹائیم زون موجود نہیں ہے۔"
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "%s تک رسائی نہیں کر سکا۔ معیاری سیٹنگیں بنائیں۔"
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "کوڈ=%s کی زبان تعین نہیں کی جا سکی۔"
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "معاف کيجيے ميں '%s' نہيں بولتا/بولتی۔"
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "کسی سکول کے ميش پورٹل کے ساتھہ جڑا ہوا ہے"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "کسی سکول کا ميش پورٹل ڈھونڈ رہا ہے ..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "‌XO ميش پورٹل کے ساتھہ جڑا ہوا ہے"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "کوئی XO ميش پورٹل ڈھونڈ رہا ہے ..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "سادہ ميش کے ساتھ جڑا ہوا ہے"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "سادہ ميش شروع کر رہا ہے"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "نامعلوم ميش"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr "اس XO کے بارے ميں"
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr "دستیاب نہيں"
diff --git a/po/yo.po b/po/yo.po
deleted file mode 100644
index 5299db7..0000000
--- a/po/yo.po
+++ /dev/null
@@ -1,448 +0,0 @@
-# translation of sugar.po to Yoruba
-# This file is distributed under the same license as the PACKAGE package.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
-# Fajuyitan, Sunday <ayo@wazobialinux.com>, 2006.
-# Fajuyitan, Sunday Ayo <ayo@wazobialinux.com>, 2006.
-msgid ""
-msgstr ""
-"Project-Id-Version: sugar\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2006-07-07 09:48+0100\n"
-"Last-Translator: Fajuyitan, Sunday Ayo <ayo@wazobialinux.com>\n"
-"Language-Team: Yoruba\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.10\n"
-
-#: ../shell/PresenceWindow.py:62
-msgid "Who's around:"
-msgstr "Ta ló wà níbẹ̀ o o:"
-
-#: ../shell/PresenceWindow.py:104
-msgid "Share"
-msgstr "Ìpín"
-
-#: ../shell/StartPage.py:189
-msgid "Search"
-msgstr "Wádìí"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "Padà Sẹ́yìn"
-
-#: ../activities/browser/NavigationToolbar.py:23
-msgid "Forward"
-msgstr "Lọ síwájú"
-
-#: ../activities/browser/NavigationToolbar.py:29
-msgid "Reload"
-msgstr "Tun kì"
-
-#: ../shell/shell.py:333
-msgid "Everyone"
-msgstr "Gbogbo èèyàn"
-
-#: ../sugar/chat/ChatEditor.py:43
-msgid "Send"
-msgstr "Fi ránṣẹ́"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr ""
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr ""
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr ""
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr ""
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr ""
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr ""
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr ""
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr ""
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr ""
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr ""
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr ""
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr ""
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr ""
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr ""
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr ""
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr ""
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr ""
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ""
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr ""
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr ""
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr ""
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
deleted file mode 100644
index bd5b1b2..0000000
--- a/po/zh_CN.po
+++ /dev/null
@@ -1,420 +0,0 @@
-# SOME 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-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-11 21:14+0000\n"
-"Last-Translator: Yuan Chao <yuanchao@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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "姓名:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "点击来改变颜色:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "后退"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "完成"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "下一步"
-
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "删除好友"
-
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "结交好友"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "邀请到%s"
-
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "删除"
-
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "打开"
-
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "增添到日志中"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "剪贴板物件: %s."
-
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "密钥类型:"
-
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "验证类型:"
-
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "加密类型:"
-
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "开始..."
-
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "继续"
-
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "停止"
-
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "屏幕抓图"
-
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "重新启动"
-
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "关闭系统"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "注册"
-
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "断开..."
-
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "网状网络"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "加入"
-
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "我的电池状态"
-
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "电池充电中"
-
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "电池放电中"
-
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "电池充电完成"
-
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "已切断"
-
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "频道"
-
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "邻居"
-
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "组"
-
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "家"
-
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "活动"
-
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "共享:"
-
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "私人"
-
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "我的邻居"
-
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "保持"
-
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "撤销"
-
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "重复"
-
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "复制"
-
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "粘贴"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s 的活动"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "保持错误"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "保持错误:所有改动都将撤销"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "不停止"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "停止吧"
-
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "取消"
-
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "确定"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "继续"
-
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "确定"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d 年"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d 年"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d 月"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d 月"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d 星期"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d 星期"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d 天"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d 天"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d 小时"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d 小时"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d 分钟"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d 分钟"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d 秒"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d 秒"
-
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr "和"
-
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ","
-
-# 如何翻译sugar?
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "你需要重新启动系统, 让改变生效.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "给定变化色时发生错误"
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "给定颜色时发生错误"
-
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "关闭"
-
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "开启"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "未知状态"
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "给定无线信号开/关时发生错误"
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "权限不足. 你需要管理员权限来执行."
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "阅读时区资料时发生错误"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "从 %s 复制时区资料时发生错误: %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "改变时区设置的权限: %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "错误, 时区资料不存在."
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "不能访问%s. 创建标准设置."
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "无法确定代码为 %s 的语言"
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "对不起,我不会说 '%s'"
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "已连接到一个学校网状网络门户"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "寻找学校网状网络门户中..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "已连接到一个XO网状网络门户"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "寻找XO网状网络门户中..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "已连接到一个简单网状网络"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "创建一个简单网状网络"
-
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "未知网状网络"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
diff --git a/po/zh_TW.po b/po/zh_TW.po
deleted file mode 100644
index 3278d7d..0000000
--- a/po/zh_TW.po
+++ /dev/null
@@ -1,461 +0,0 @@
-# SOME 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: Sugar\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
-"PO-Revision-Date: 2008-01-27 11:15-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"
-
-#: ../shell/intro/intro.py:67
-msgid "Name:"
-msgstr "姓名:"
-
-#: ../shell/intro/intro.py:96
-msgid "Click to change color:"
-msgstr "點選改變顏色:"
-
-#: ../shell/intro/intro.py:146
-msgid "Back"
-msgstr "上一步"
-
-#: ../shell/intro/intro.py:160
-msgid "Done"
-msgstr "完成"
-
-#: ../shell/intro/intro.py:163
-msgid "Next"
-msgstr "下一步"
-
-#
-#: ../shell/view/BuddyMenu.py:59
-msgid "Remove friend"
-msgstr "移除好友"
-
-#
-#: ../shell/view/BuddyMenu.py:62
-msgid "Make friend"
-msgstr "結交好友"
-
-#: ../shell/view/BuddyMenu.py:84
-#, python-format
-msgid "Invite to %s"
-msgstr "邀請 %s"
-
-#
-#: ../shell/view/clipboardmenu.py:58
-msgid "Remove"
-msgstr "移除"
-
-#
-#: ../shell/view/clipboardmenu.py:63
-msgid "Open"
-msgstr "開啟"
-
-#
-#. self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-#. TODO: Implement stopping downloads
-#. self._stop_item.connect('activate', self._stop_item_activate_cb)
-#. self.append_menu_item(self._stop_item)
-#: ../shell/view/clipboardmenu.py:73
-msgid "Add to journal"
-msgstr "增加到日誌"
-
-#: ../shell/view/clipboardmenu.py:213
-#, python-format
-msgid "Clipboard object: %s."
-msgstr "剪貼簿物件: %s."
-
-#
-#: ../shell/hardware/keydialog.py:149
-msgid "Key Type:"
-msgstr "金鑰類型:"
-
-#
-#: ../shell/hardware/keydialog.py:169
-msgid "Authentication Type:"
-msgstr "認證類型:"
-
-#
-#: ../shell/hardware/keydialog.py:250
-msgid "Encryption Type:"
-msgstr "加密類型:"
-
-#
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "啟動中..."
-
-#
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "回復"
-
-#
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "停止"
-
-#
-#: ../shell/view/Shell.py:285
-msgid "Screenshot"
-msgstr "畫面抓圖"
-
-#
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "重新啟動"
-
-#
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "關機"
-
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
-msgstr "註冊"
-
-#
-#. Only show disconnect when there's a mesh device, because mesh takes
-#. priority over the normal wireless device. NM doesn't have a "disconnect"
-#. method for a device either (for various reasons) so this doesn't
-#. have a good mapping
-#: ../shell/view/home/MeshBox.py:90 ../shell/view/home/MeshBox.py:197
-#: ../shell/view/devices/network/wireless.py:113
-#: ../shell/view/devices/network/mesh.py:83
-msgid "Disconnect..."
-msgstr "切斷連線..."
-
-#
-#: ../shell/view/home/MeshBox.py:195 ../shell/view/devices/network/mesh.py:37
-#: ../shell/view/devices/network/mesh.py:62
-#: ../shell/view/devices/network/mesh.py:66
-msgid "Mesh Network"
-msgstr "網狀網路"
-
-#: ../shell/view/home/MeshBox.py:300
-msgid "Join"
-msgstr "加入"
-
-#
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "我的電池狀態"
-
-#
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "電池充電中"
-
-#
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "電池放電中"
-
-#
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "電池已充電完成"
-
-#
-#: ../shell/view/devices/network/wireless.py:61
-msgid "Disconnected"
-msgstr "已切斷"
-
-#
-#: ../shell/view/devices/network/wireless.py:131
-msgid "Channel"
-msgstr "頻道"
-
-#
-#: ../shell/view/frame/zoomtoolbar.py:42
-msgid "Neighborhood"
-msgstr "我的鄰居"
-
-#
-#: ../shell/view/frame/zoomtoolbar.py:54
-msgid "Group"
-msgstr "我的群組"
-
-#
-#: ../shell/view/frame/zoomtoolbar.py:66
-msgid "Home"
-msgstr "我的家"
-
-#
-#: ../shell/view/frame/zoomtoolbar.py:78
-msgid "Activity"
-msgstr "活動"
-
-#
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "分享給:"
-
-#
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "私人"
-
-#
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "我的鄰居"
-
-#
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "保存"
-
-#
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "復原"
-
-#
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "取消復原"
-
-#
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "複製"
-
-#
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "貼上"
-
-#: ../lib/sugar/activity/activity.py:454
-#, python-format
-msgid "%s Activity"
-msgstr "%s活動"
-
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "保存時發生錯誤"
-
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "保存時發生錯誤: 所有的改變將被取消"
-
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "取消關閉"
-
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "直接關閉"
-
-#
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "取消"
-
-#
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "確定"
-
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "繼續活動"
-
-#
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "確定"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d年"
-
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d years"
-msgstr "%d年"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d month"
-msgstr "%d月"
-
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d月"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d週"
-
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d週"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d日"
-
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d日"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d時"
-
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d時"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d分"
-
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d分"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d秒"
-
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d秒"
-
-#
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr "和"
-
-#
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ","
-
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "需要重新啟動系統使變更生效.\n"
-
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "指定增修顏色時發生錯誤"
-
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "指定顏色時發生錯誤"
-
-#
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "關閉"
-
-#
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "開啟"
-
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "未知狀態"
-
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "無線網路信號開關發生錯誤"
-
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
-msgstr "權限不足, 需要有系統管理員權限才可以執行此功能。"
-
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "讀取時區資料時發生錯誤"
-
-#: ../shell/controlpanel/control.py:397
-#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "複製(%s)時區資料時發生錯誤: %s"
-
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "改變時區資料權限: %s"
-
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "錯誤,時區資料不存在."
-
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
-msgstr "無法讀取 %s. 建立預設資料."
-
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "語系編碼 %s 無法判定"
-
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "抱歉我不會說'%s'."
-
-#: ../shell/view/devices/network/mesh.py:105
-msgid "Connected to a School Mesh Portal"
-msgstr "已連接到校園網狀網入口"
-
-#: ../shell/view/devices/network/mesh.py:107
-msgid "Looking for a School Mesh Portal..."
-msgstr "搜尋校園網狀網路中..."
-
-#: ../shell/view/devices/network/mesh.py:110
-msgid "Connected to an XO Mesh Portal"
-msgstr "已連接到XO網狀網入口"
-
-#: ../shell/view/devices/network/mesh.py:112
-msgid "Looking for an XO Mesh Portal..."
-msgstr "搜尋XO網狀網路中..."
-
-#: ../shell/view/devices/network/mesh.py:115
-msgid "Connected to a Simple Mesh"
-msgstr "已連接上簡易網狀網路"
-
-#: ../shell/view/devices/network/mesh.py:117
-msgid "Starting a Simple Mesh"
-msgstr "建立簡易網狀網路"
-
-#
-#: ../shell/view/devices/network/mesh.py:124
-msgid "Unknown Mesh"
-msgstr "未知網狀網路"
-
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr "關於XO"
-
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr "不存在"
diff --git a/pylint.sh b/pylint.sh
deleted file mode 100755
index f055f2e..0000000
--- a/pylint.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-
-TODO="C0111,C0301,C0322,W0311,C0324,W0331,W0212,W0611,W0613,W0201,W0106,W0622,W0403,W0102,W0404,W0704,W0402,W0702,W0401,E0602,E1102,C0321,E0611,E1103,W1001,E0213,W0107,R0921,R0401,E1111,W0101,W0105,W0601,W0602,W0703,W0701,W0312,W0231,W0233,F0401,W0612"
-
-BROKEN="C0103,E1101"
-
-DISABLE="W0142,R0913,W0621,R0903,R0201,R0904,W0511,W0232,R0902,W0603,R0914,C0302,C0102,I0011,R0911,R0912,R0901,R0801,R0923,R0915"
-
-pylint --include-ids=y --disable-msg=$TODO,$BROKEN,$DISABLE shell sugar
diff --git a/service/.gitignore b/service/.gitignore
deleted file mode 100644
index 4acd06b..0000000
--- a/service/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-config.py
diff --git a/service/Makefile.am b/service/Makefile.am
deleted file mode 100644
index fa8e66f..0000000
--- a/service/Makefile.am
+++ /dev/null
@@ -1,33 +0,0 @@
-servicedir = $(datadir)/dbus-1/services
-
-service_in_files = \
- org.laptop.ActivityRegistry.service.in \
- org.laptop.Clipboard.service.in
-
-service_DATA = \
- org.laptop.ActivityRegistry.service \
- org.laptop.Clipboard.service
-
-org.laptop.ActivityRegistry.service: org.laptop.ActivityRegistry.service.in Makefile
- @sed -e "s|\@bindir\@|$(bindir)|" $< > $@
-
-org.laptop.Clipboard.service: org.laptop.Clipboard.service.in Makefile
- @sed -e "s|\@bindir\@|$(bindir)|" $< > $@
-
-org.laptop.ObjectTypeRegistry.service: org.laptop.ObjectTypeRegistry.service.in Makefile
- @sed -e "s|\@bindir\@|$(bindir)|" $< > $@
-
-sugardir = $(pkgdatadir)/service
-
-sugar_PYTHON = \
- __init__.py \
- activityregistryservice.py \
- bundleregistry.py \
- clipboardobject.py \
- clipboardservice.py \
- config.py \
- main.py
-
-DISTCLEANFILES = $(service_DATA)
-
-EXTRA_DIST = $(service_in_files)
diff --git a/service/__init__.py b/service/__init__.py
deleted file mode 100644
index 52b82c8..0000000
--- a/service/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2007, One Laptop Per Child
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
diff --git a/service/activityregistryservice.py b/service/activityregistryservice.py
deleted file mode 100644
index 9c2dda7..0000000
--- a/service/activityregistryservice.py
+++ /dev/null
@@ -1,134 +0,0 @@
-# Copyright (C) 2006-2007 Red Hat, Inc.
-# Copyright (C) 2007 One Laptop Per Child
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import dbus
-import dbus.service
-
-import bundleregistry
-
-_ACTIVITY_REGISTRY_SERVICE_NAME = 'org.laptop.ActivityRegistry'
-_ACTIVITY_REGISTRY_IFACE = 'org.laptop.ActivityRegistry'
-_ACTIVITY_REGISTRY_PATH = '/org/laptop/ActivityRegistry'
-
-class ActivityRegistry(dbus.service.Object):
- def __init__(self):
- bus = dbus.SessionBus()
- bus_name = dbus.service.BusName(_ACTIVITY_REGISTRY_SERVICE_NAME, bus=bus)
- dbus.service.Object.__init__(self, bus_name, _ACTIVITY_REGISTRY_PATH)
-
- bundle_registry = bundleregistry.get_registry()
- bundle_registry.connect('bundle-added', self._bundle_added_cb)
- bundle_registry.connect('bundle-removed', self._bundle_removed_cb)
-
- @dbus.service.method(_ACTIVITY_REGISTRY_IFACE,
- in_signature='s', out_signature='b')
- def AddBundle(self, bundle_path):
- '''Register the activity bundle with the global registry
-
- bundle_path -- path to the root directory of the activity bundle,
- that is, the directory with activity/activity.info as a
- child of the directory.
-
- The bundleregistry.BundleRegistry is responsible for setting
- up a set of d-bus service mappings for each available activity.
- '''
- registry = bundleregistry.get_registry()
- return registry.add_bundle(bundle_path)
-
- @dbus.service.method(_ACTIVITY_REGISTRY_IFACE,
- in_signature='s', out_signature='b')
- def RemoveBundle(self, bundle_path):
- '''Unregister the activity bundle with the global registry
-
- bundle_path -- path to the activity bundle root directory
- '''
- registry = bundleregistry.get_registry()
- return registry.remove_bundle(bundle_path)
-
- @dbus.service.method(_ACTIVITY_REGISTRY_IFACE,
- in_signature='', out_signature='aa{sv}')
- def GetActivities(self):
- result = []
- registry = bundleregistry.get_registry()
- for bundle in registry:
- result.append(self._bundle_to_dict(bundle))
- return result
-
- @dbus.service.method(_ACTIVITY_REGISTRY_IFACE,
- in_signature='s', out_signature='a{sv}')
- def GetActivity(self, bundle_id):
- registry = bundleregistry.get_registry()
- bundle = registry.get_bundle(bundle_id)
- if not bundle:
- return {}
-
- return self._bundle_to_dict(bundle)
-
- @dbus.service.method(_ACTIVITY_REGISTRY_IFACE,
- in_signature='s', out_signature='aa{sv}')
- def FindActivity(self, name):
- result = []
- key = name.lower()
-
- for bundle in bundleregistry.get_registry():
- name = bundle.get_name().lower()
- bundle_id = bundle.get_bundle_id().lower()
- if name.find(key) != -1 or bundle_id.find(key) != -1:
- result.append(self._bundle_to_dict(bundle))
-
- return result
-
- @dbus.service.method(_ACTIVITY_REGISTRY_IFACE,
- in_signature='s', out_signature='aa{sv}')
- def GetActivitiesForType(self, mime_type):
- result = []
- registry = bundleregistry.get_registry()
- for bundle in registry.get_activities_for_type(mime_type):
- result.append(self._bundle_to_dict(bundle))
- return result
-
- @dbus.service.signal(_ACTIVITY_REGISTRY_IFACE, signature='a{sv}')
- def ActivityAdded(self, activity_info):
- pass
-
- @dbus.service.signal(_ACTIVITY_REGISTRY_IFACE, signature='a{sv}')
- def ActivityRemoved(self, activity_info):
- pass
-
- def _bundle_to_dict(self, bundle):
- return {'name': bundle.get_name(),
- 'icon': bundle.get_icon(),
- 'bundle_id': bundle.get_bundle_id(),
- 'version': bundle.get_activity_version(),
- 'path': bundle.get_path(),
- 'command': bundle.get_command(),
- 'show_launcher': bundle.get_show_launcher()}
-
- def _bundle_added_cb(self, bundle_registry, bundle):
- self.ActivityAdded(self._bundle_to_dict(bundle))
-
- def _bundle_removed_cb(self, bundle_registry, bundle):
- self.ActivityRemoved(self._bundle_to_dict(bundle))
-
-_instance = None
-
-def get_instance():
- global _instance
- if not _instance:
- _instance = ActivityRegistry()
- return _instance
-
diff --git a/service/bundleregistry.py b/service/bundleregistry.py
deleted file mode 100644
index 25a3440..0000000
--- a/service/bundleregistry.py
+++ /dev/null
@@ -1,151 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import os
-import logging
-
-import gobject
-
-from sugar.bundle.activitybundle import ActivityBundle
-from sugar.bundle.bundle import MalformedBundleException
-from sugar import env
-from sugar import util
-
-import config
-
-# http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html
-def _get_data_dirs():
- if os.environ.has_key('XDG_DATA_DIRS'):
- return os.environ['XDG_DATA_DIRS'].split(':')
- else:
- return [ '/usr/local/share/', '/usr/share/' ]
-
-def _load_mime_defaults():
- defaults = {}
-
- f = open(os.path.join(config.data_path, 'mime.defaults'), 'r')
- for line in f.readlines():
- line = line.strip()
- if line and not line.startswith('#'):
- mime = line[:line.find(' ')]
- handler = line[line.rfind(' ') + 1:]
- defaults[mime] = handler
- f.close()
-
- return defaults
-
-class BundleRegistry(gobject.GObject):
- """Service that tracks the available activity bundles"""
-
- __gsignals__ = {
- 'bundle-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT])),
- 'bundle-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT]))
- }
-
- def __init__(self):
- gobject.GObject.__init__(self)
-
- self._bundles = []
- self._search_path = []
- self._mime_defaults = _load_mime_defaults()
-
- def get_bundle(self, bundle_id):
- """Returns an bundle given his service name"""
- for bundle in self._bundles:
- if bundle.get_bundle_id() == bundle_id:
- return bundle
- return None
-
- def add_search_path(self, path):
- """Add a directory to the bundles search path"""
- self._search_path.append(path)
- self._scan_directory(path)
-
- def __iter__(self):
- return self._bundles.__iter__()
-
- def _scan_directory(self, path):
- if not os.path.isdir(path):
- return
-
- # Sort by mtime to ensure a stable activity order
- bundles = {}
- for f in os.listdir(path):
- if not f.endswith('.activity'):
- continue
- try:
- bundle_dir = os.path.join(path, f)
- if os.path.isdir(bundle_dir):
- bundles[bundle_dir] = os.stat(bundle_dir).st_mtime
- except Exception, e:
- logging.error('Error while processing installed activity ' \
- 'bundle: %s, %s, %s' % (f, e.__class__, e))
-
- bundle_dirs = bundles.keys()
- bundle_dirs.sort(lambda d1,d2: cmp(bundles[d1], bundles[d2]))
- for dir in bundle_dirs:
- try:
- self.add_bundle(dir)
- except Exception, e:
- logging.error('Error while processing installed activity ' \
- 'bundle: %s, %s, %s' % (dir, e.__class__, e))
-
- def add_bundle(self, bundle_path):
- try:
- bundle = ActivityBundle(bundle_path)
- except MalformedBundleException:
- return False
-
- self._bundles.append(bundle)
- self.emit('bundle-added', bundle)
- return True
-
- def remove_bundle(self, bundle_path):
- for bundle in self._bundles:
- if bundle.get_path() == bundle_path:
- self._bundles.remove(bundle)
- self.emit('bundle-removed', bundle)
- return True
- return False
-
- def get_activities_for_type(self, mime_type):
- result = []
- for bundle in self._bundles:
- if bundle.get_mime_types() and mime_type in bundle.get_mime_types():
- if self.get_default_for_type(mime_type) == bundle.get_bundle_id():
- result.insert(0, bundle)
- else:
- result.append(bundle)
- return result
-
- def get_default_for_type(self, mime_type):
- if self._mime_defaults.has_key(mime_type):
- return self._mime_defaults[mime_type]
- else:
- return None
-
-def get_registry():
- return _bundle_registry
-
-_bundle_registry = BundleRegistry()
-
-for path in _get_data_dirs():
- bundles_path = os.path.join(path, 'activities')
- _bundle_registry.add_search_path(bundles_path)
-
-_bundle_registry.add_search_path(env.get_user_activities_path())
diff --git a/service/clipboardobject.py b/service/clipboardobject.py
deleted file mode 100644
index 70c21a0..0000000
--- a/service/clipboardobject.py
+++ /dev/null
@@ -1,122 +0,0 @@
-# Copyright (C) 2007, One Laptop Per Child
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import os
-import logging
-import urlparse
-
-from sugar import mime
-
-import bundleregistry
-
-class ClipboardObject:
-
- def __init__(self, object_path, name):
- self._id = object_path
- self._name = name
- self._percent = 0
- self._formats = {}
-
- def destroy(self):
- for type, format in self._formats.iteritems():
- format.destroy()
-
- def get_id(self):
- return self._id
-
- def get_name(self):
- name = self._name
- if not name:
- name = mime.get_mime_description(self.get_mime_type())
- if not name:
- name = ''
- return name
-
- def get_icon(self):
- return mime.get_mime_icon(self.get_mime_type())
-
- def get_preview(self):
- # TODO: should previews really be here?
- #return self._get_type_info().get_preview()
- return ''
-
- def get_activities(self):
- mime = self.get_mime_type()
- if not mime:
- return ''
-
- registry = bundleregistry.get_registry()
- activities = registry.get_activities_for_type(self.get_mime_type())
- if activities:
- return [activity.get_bundle_id() for activity in activities]
- else:
- return ''
-
- def get_percent(self):
- return self._percent
-
- def set_percent(self, percent):
- self._percent = percent
-
- def add_format(self, format):
- self._formats[format.get_type()] = format
-
- def get_formats(self):
- return self._formats
-
- def get_mime_type(self):
- if not self._formats:
- return ''
-
- format = mime.choose_most_significant(self._formats.keys())
- if format == 'text/uri-list':
- data = self._formats['text/uri-list'].get_data()
- uri = urlparse.urlparse(mime.split_uri_list(data)[0], 'file')
- if uri.scheme == 'file':
- if os.path.exists(uri.path):
- format = mime.get_for_file(uri.path)
- else:
- format = mime.get_from_file_name(uri.path)
- logging.debug('Choosed %r!' % format)
-
- return format
-
-class Format:
-
- def __init__(self, type, data, on_disk):
- self.owns_disk_data = False
-
- self._type = type
- self._data = data
- self._on_disk = on_disk
-
- def destroy(self):
- if self._on_disk:
- uri = urlparse.urlparse(self._data)
- if os.path.isfile(uri.path):
- os.remove(uri.path)
-
- def get_type(self):
- return self._type
-
- def get_data(self):
- return self._data
-
- def set_data(self, data):
- self._data = data
-
- def is_on_disk(self):
- return self._on_disk
diff --git a/service/clipboardservice.py b/service/clipboardservice.py
deleted file mode 100644
index fec546f..0000000
--- a/service/clipboardservice.py
+++ /dev/null
@@ -1,212 +0,0 @@
-# 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
-
-import logging
-import os
-import shutil
-import urlparse
-import tempfile
-
-import dbus
-import dbus.service
-
-from sugar import env
-from sugar import util
-from sugar import mime
-
-from clipboardobject import ClipboardObject, Format
-
-NAME_KEY = 'NAME'
-PERCENT_KEY = 'PERCENT'
-ICON_KEY = 'ICON'
-PREVIEW_KEY = 'PREVIEW'
-ACTIVITIES_KEY = 'ACTIVITIES'
-FORMATS_KEY = 'FORMATS'
-
-TYPE_KEY = 'TYPE'
-DATA_KEY = 'DATA'
-ON_DISK_KEY = 'ON_DISK'
-
-class ClipboardService(dbus.service.Object):
-
- _CLIPBOARD_DBUS_INTERFACE = "org.laptop.Clipboard"
- _CLIPBOARD_OBJECT_PATH = "/org/laptop/Clipboard"
- _CLIPBOARD_OBJECTS_PATH = _CLIPBOARD_OBJECT_PATH + "/Objects/"
-
- def __init__(self):
- self._objects = {}
- self._next_id = 0
-
- bus = dbus.SessionBus()
- bus_name = dbus.service.BusName(self._CLIPBOARD_DBUS_INTERFACE, bus=bus)
- dbus.service.Object.__init__(self, bus_name, self._CLIPBOARD_OBJECT_PATH)
-
- def _get_next_object_id(self):
- self._next_id += 1
- return self._next_id
-
- # dbus methods
- @dbus.service.method(_CLIPBOARD_DBUS_INTERFACE,
- in_signature="s", out_signature="o")
- def add_object(self, name):
- logging.debug('ClipboardService.add_object')
- op = self._CLIPBOARD_OBJECTS_PATH + "%d" % self._get_next_object_id()
- self._objects[op] = ClipboardObject(op, name)
- self.object_added(dbus.ObjectPath(op), name)
- logging.debug('Added object ' + op + ' with name ' + name)
- return dbus.ObjectPath(op)
-
- @dbus.service.method(_CLIPBOARD_DBUS_INTERFACE,
- in_signature="ssayb", out_signature="", byte_arrays=True)
- def add_object_format(self, object_path, format_type, data, on_disk):
- logging.debug('ClipboardService.add_object_format')
- cb_object = self._objects[str(object_path)]
-
- if format_type == 'XdndDirectSave0':
- format = Format('text/uri-list', data + '\r\n', on_disk)
- format.owns_disk_data = True
- cb_object.add_format(format)
- elif on_disk and cb_object.get_percent() == 100:
- new_uri = self._copy_file(data)
- cb_object.add_format(Format(format_type, new_uri, on_disk))
- logging.debug('Added format of type ' + format_type + ' with path at ' + new_uri)
- else:
- cb_object.add_format(Format(format_type, data, on_disk))
- logging.debug('Added in-memory format of type ' + format_type + '.')
-
- self.object_state_changed(object_path, {NAME_KEY: cb_object.get_name(),
- PERCENT_KEY: cb_object.get_percent(),
- ICON_KEY: cb_object.get_icon(),
- PREVIEW_KEY: cb_object.get_preview(),
- ACTIVITIES_KEY: cb_object.get_activities()})
-
- @dbus.service.method(_CLIPBOARD_DBUS_INTERFACE,
- in_signature="o", out_signature="")
- def delete_object(self, object_path):
- cb_object = self._objects.pop(str(object_path))
- cb_object.destroy()
- self.object_deleted(object_path)
- logging.debug('Deleted object with object_id ' + object_path)
-
- @dbus.service.method(_CLIPBOARD_DBUS_INTERFACE,
- in_signature="oi", out_signature="")
- def set_object_percent(self, object_path, percent):
- cb_object = self._objects[str(object_path)]
- if percent < 0 or percent > 100:
- raise ValueError("invalid percentage")
- if cb_object.get_percent() > percent:
- raise ValueError("invalid percentage; less than current percent")
- if cb_object.get_percent() == percent:
- # ignore setting same percentage
- return
-
- cb_object.set_percent(percent)
-
- if percent == 100:
- formats = cb_object.get_formats()
- for format_name, format in formats.iteritems():
- if format.is_on_disk() and not format.owns_disk_data:
- new_uri = self._copy_file(format.get_data())
- format.set_data(new_uri)
-
- # Add a text/plain format to objects that are text but lack it
- if 'text/plain' not in formats.keys():
- if 'UTF8_STRING' in formats.keys():
- self.add_object_format(object_path,
- 'text/plain',
- data=formats['UTF8_STRING'].get_data(),
- on_disk=False)
- elif 'text/unicode' in formats.keys():
- self.add_object_format(object_path,
- 'text/plain',
- data=formats['UTF8_STRING'].get_data(),
- on_disk=False)
-
- self.object_state_changed(object_path, {NAME_KEY: cb_object.get_name(),
- PERCENT_KEY: percent,
- ICON_KEY: cb_object.get_icon(),
- PREVIEW_KEY: cb_object.get_preview(),
- ACTIVITIES_KEY: cb_object.get_activities()})
-
- @dbus.service.method(_CLIPBOARD_DBUS_INTERFACE,
- in_signature="o", out_signature="a{sv}")
- def get_object(self, object_path):
- logging.debug('ClipboardService.get_object')
-
- if not self._objects.has_key(str(object_path)):
- return dbus.Dictionary({}, signature='sv')
-
- cb_object = self._objects[str(object_path)]
- formats = cb_object.get_formats()
- format_types = dbus.Array([], signature='s')
-
- for type, format in formats.iteritems():
- format_types.append(type)
-
- result_dict = {NAME_KEY: cb_object.get_name(),
- PERCENT_KEY: cb_object.get_percent(),
- ICON_KEY: cb_object.get_icon(),
- PREVIEW_KEY: cb_object.get_preview(),
- ACTIVITIES_KEY: cb_object.get_activities(),
- FORMATS_KEY: format_types}
- return dbus.Dictionary(result_dict)
-
- @dbus.service.method(_CLIPBOARD_DBUS_INTERFACE,
- in_signature="os", out_signature="a{sv}")
- def get_object_data(self, object_path, format_type):
- logging.debug('ClipboardService.get_object_data')
- cb_object = self._objects[str(object_path)]
- format = cb_object.get_formats()[format_type]
- result_dict = {TYPE_KEY: format.get_type(),
- DATA_KEY: dbus.ByteArray(format.get_data()),
- ON_DISK_KEY: format.is_on_disk()}
- return dbus.Dictionary(result_dict)
-
- # dbus signals
- @dbus.service.signal(_CLIPBOARD_DBUS_INTERFACE, signature="os")
- def object_added(self, object_path, name):
- pass
-
- @dbus.service.signal(_CLIPBOARD_DBUS_INTERFACE, signature="o")
- def object_deleted(self, object_path):
- pass
-
- @dbus.service.signal(_CLIPBOARD_DBUS_INTERFACE, signature="oa{sv}")
- def object_state_changed(self, object_path, values):
- pass
-
- def _copy_file(self, original_uri):
- uri = urlparse.urlparse(original_uri)
- path, file_name = os.path.split(uri.path)
-
- root, ext = os.path.splitext(file_name)
- if not ext or ext == '.':
- mime_type = mime.get_for_file(uri.path)
- ext = '.' + mime.get_primary_extension(mime_type)
-
- f, new_file_path = tempfile.mkstemp(ext, root)
- del f
- shutil.copyfile(uri.path, new_file_path)
-
- return 'file://' + new_file_path
-
-_instance = None
-
-def get_instance():
- global _instance
- if not _instance:
- _instance = ClipboardService()
- return _instance
diff --git a/service/config.py.in b/service/config.py.in
deleted file mode 100644
index c617d7e..0000000
--- a/service/config.py.in
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2008 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
-
-data_path = '@prefix@/share/sugar/data'
diff --git a/service/main.py b/service/main.py
deleted file mode 100755
index 679cc09..0000000
--- a/service/main.py
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright (C) 2006, Red Hat, Inc.
-# Copyright (C) 2007, One Laptop Per Child
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import sys
-import os
-import logging
-
-import gobject
-import dbus.glib
-
-from sugar import logger
-from sugar import env
-
-import activityregistryservice
-import clipboardservice
-
-def main():
- logger.start('shellservice')
- logging.info('Starting shell service.')
-
- gobject.threads_init()
- dbus.glib.threads_init()
-
- clipboard_service = clipboardservice.get_instance()
- activity_registry = activityregistryservice.get_instance()
-
- loop = gobject.MainLoop()
- try:
- loop.run()
- except KeyboardInterrupt:
- print 'Ctrl+C pressed, exiting...'
-
diff --git a/service/org.laptop.ActivityRegistry.service.in b/service/org.laptop.ActivityRegistry.service.in
deleted file mode 100644
index ab6647c..0000000
--- a/service/org.laptop.ActivityRegistry.service.in
+++ /dev/null
@@ -1,4 +0,0 @@
-[D-BUS Service]
-Name = org.laptop.ActivityRegistry
-Exec = @bindir@/sugar-shell-service
-
diff --git a/service/org.laptop.Clipboard.service.in b/service/org.laptop.Clipboard.service.in
deleted file mode 100644
index 7ce3f6e..0000000
--- a/service/org.laptop.Clipboard.service.in
+++ /dev/null
@@ -1,4 +0,0 @@
-[D-BUS Service]
-Name = org.laptop.Clipboard
-Exec = @bindir@/sugar-shell-service
-
diff --git a/service/org.laptop.ObjectTypeRegistry.service.in b/service/org.laptop.ObjectTypeRegistry.service.in
deleted file mode 100644
index 563a600..0000000
--- a/service/org.laptop.ObjectTypeRegistry.service.in
+++ /dev/null
@@ -1,4 +0,0 @@
-[D-BUS Service]
-Name = org.laptop.ObjectTypeRegistry
-Exec = @bindir@/sugar-shell-service
-
diff --git a/src/.gitignore b/src/.gitignore
deleted file mode 100644
index 4acd06b..0000000
--- a/src/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-config.py
diff --git a/src/Makefile.am b/src/Makefile.am
deleted file mode 100644
index 36f64b1..0000000
--- a/src/Makefile.am
+++ /dev/null
@@ -1,11 +0,0 @@
-SUBDIRS = controlpanel hardware model view intro
-
-sugardir = $(pkgdatadir)/shell
-sugar_PYTHON = \
- config.py \
- emulator.py \
- logsmanager.py \
- main.py \
- shellservice.py
-
-EXTRA_DIST = $(bin_SCRIPTS) $(conf_DATA)
diff --git a/src/__init__.py b/src/__init__.py
deleted file mode 100644
index 41b4b1c..0000000
--- a/src/__init__.py
+++ /dev/null
@@ -1,26 +0,0 @@
-"""OLPC Sugar Graphical "Shell" Interface
-
-Provides the shell-level operations for managing
-the OLPC laptop computers. It interacts heavily
-with (and depends upon) the Sugar UI libraries.
-
-This is a "graphical" shell, the name does not
-refer to a command-line "shell" interface.
-"""
-
-# Copyright (C) 2006-2007, 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
-
diff --git a/src/config.py.in b/src/config.py.in
deleted file mode 100644
index 3b29a05..0000000
--- a/src/config.py.in
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright (C) 2008 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
-
-prefix = '@prefix@'
-data_path = '@prefix@/share/sugar/data'
diff --git a/src/controlpanel/Makefile.am b/src/controlpanel/Makefile.am
deleted file mode 100644
index f89132c..0000000
--- a/src/controlpanel/Makefile.am
+++ /dev/null
@@ -1,5 +0,0 @@
-sugardir = $(pkgdatadir)/shell/controlpanel
-sugar_PYTHON = \
- __init__.py \
- cmd.py \
- control.py
diff --git a/src/controlpanel/__init__.py b/src/controlpanel/__init__.py
deleted file mode 100644
index a9dd95a..0000000
--- a/src/controlpanel/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2006-2007, 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
-
diff --git a/src/controlpanel/cmd.py b/src/controlpanel/cmd.py
deleted file mode 100644
index 634faa9..0000000
--- a/src/controlpanel/cmd.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright (C) 2007, One Laptop Per Child
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-import sys
-import getopt
-from gettext import gettext as _
-
-from sugar import env
-
-from controlpanel import control
-
-def cmd_help():
- print _('Usage: sugar-control-panel [ option ] key [ args ... ] \n\
- Control for the sugar environment. \n\
- Options: \n\
- -h show this help message and exit \n\
- -l list all the available options \n\
- -h key show information about this key \n\
- -g key get the current value of the key \n\
- -s key set the current value for the key \n\
- ')
-
-def main():
- try:
- opts, args = getopt.getopt(sys.argv[1:], "h:s:g:l", [])
- except getopt.GetoptError:
- cmd_help()
- sys.exit(2)
-
- output = None
- verbose = False
-
- if not opts:
- cmd_help()
- sys.exit()
-
- for opt, key in opts:
- if opt in ("-h"):
- method = getattr(control, 'set_' + key, None)
- if method is None:
- print _("sugar-control-panel: key=%s not an available option"% key)
- sys.exit()
- else:
- print method.__doc__
- if opt in ("-l"):
- elems = dir(control)
- for elem in elems:
- if elem.startswith('set_'):
- print elem[4:]
- if opt in ("-g"):
- method = getattr(control, 'print_' + key, None)
- if method is None:
- print _("sugar-control-panel: key=%s not an available option"% key)
- sys.exit()
- else:
- method()
- if opt in ("-s"):
- method = getattr(control, 'set_' + key, None)
- if method is None:
- print _("sugar-control-panel: key=%s not an available option"% key)
- sys.exit()
- else:
- try:
- method(*args)
- except Exception, e:
- print _("sugar-control-panel: %s"% e)
diff --git a/src/controlpanel/control.py b/src/controlpanel/control.py
deleted file mode 100644
index a26132e..0000000
--- a/src/controlpanel/control.py
+++ /dev/null
@@ -1,481 +0,0 @@
-# Copyright (C) 2007, One Laptop Per Child
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-#
-#
-# The language config is based on the system-config-language
-# (http://fedoraproject.org/wiki/SystemConfig/language) tool
-# and the timezone config on the system-config-date
-# (http://fedoraproject.org/wiki/SystemConfig/date) tool.
-# Parts of the code were reused.
-#
-
-import os
-import string
-import shutil
-from gettext import gettext as _
-import dbus
-
-from sugar import profile
-from sugar.graphics.xocolor import XoColor
-
-NM_SERVICE_NAME = 'org.freedesktop.NetworkManager'
-NM_SERVICE_PATH = '/org/freedesktop/NetworkManager'
-NM_SERVICE_IFACE = 'org.freedesktop.NetworkManager'
-NM_ASLEEP = 1
-
-_COLORS = {'red': {'dark':'#b20008', 'medium':'#e6000a', 'light':'#ffadce'},
- 'orange': {'dark':'#9a5200', 'medium':'#c97e00', 'light':'#ffc169'},
- 'yellow': {'dark':'#807500', 'medium':'#be9e00', 'light':'#fffa00'},
- 'green': {'dark':'#008009', 'medium':'#00b20d', 'light':'#8bff7a'},
- 'blue': {'dark':'#00588c', 'medium':'#005fe4', 'light':'#bccdff'},
- 'purple': {'dark':'#5e008c', 'medium':'#7f00bf', 'light':'#d1a3ff'}
- }
-
-_MODIFIERS = ('dark', 'medium', 'light')
-
-_TIMEZONE_CONFIG = '/etc/sysconfig/clock'
-
-_LANGUAGES = {
- 'Afrikaans/South_Africa': 'af_ZA',
- 'Albanian': 'sq_AL.UTF-8',
- 'Amharic/Ethiopian': 'am_ET.UTF-8',
- 'Arabic/Algeria': 'ar_DZ.UTF-8',
- 'Arabic/Bahrain': 'ar_BH.UTF-8',
- 'Arabic/Egypt': 'ar_EG.UTF-8',
- 'Arabic/India': 'ar_IN.UTF-8',
- 'Arabic/Iraq': 'ar_IQ.UTF-8',
- 'Arabic/Jordan': 'ar_JO.UTF-8',
- 'Arabic/Kuwait': 'ar_KW.UTF-8',
- 'Arabic/Lebanon': 'ar_LB.UTF-8',
- 'Arabic/Libyan_Arab_Jamahiriya': 'ar_LY.UTF-8',
- 'Arabic/Morocco': 'ar_MA.UTF-8',
- 'Arabic/Oman': 'ar_OM.UTF-8',
- 'Arabic/Qatar': 'ar_QA.UTF-8',
- 'Arabic/Saudi_Arabia': 'ar_SA.UTF-8',
- 'Arabic/Sudan': 'ar_SD.UTF-8',
- 'Arabic/Syrian_Arab_Republic': 'ar_SY.UTF-8',
- 'Arabic/Tunisia': 'ar_TN.UTF-8',
- 'Arabic/United_Arab_Emirates': 'ar_AE.UTF-8',
- 'Arabic/Yemen': 'ar_YE.UTF-8',
- 'Basque/Spain': 'eu_ES.UTF-8',
- 'Belarusian': 'be_BY.UTF-8',
- 'Bengali/BD': 'bn_BD.UTF-8',
- 'Bengali/India': 'bn_IN.UTF-8',
- 'Bosnian/Bosnia_and_Herzegowina': 'bs_BA',
- 'Breton/France': 'br_FR',
- 'Bulgarian': 'bg_BG.UTF-8',
- 'Catalan/Spain': 'ca_ES.UTF-8',
- 'Chinese/Hong_Kong': 'zh_HK.UTF-8',
- 'Chinese/P.R._of_China': 'zh_CN.UTF-8',
- 'Chinese/Taiwan': 'zh_TW.UTF-8',
- 'Cornish/Britain': 'kw_GB.UTF-8',
- 'Croatian': 'hr_HR.UTF-8',
- 'Czech': 'cs_CZ.UTF-8',
- 'Danish': 'da_DK.UTF-8',
- 'Dutch/Belgium': 'nl_BE.UTF-8',
- 'Dutch/Netherlands': 'nl_NL.UTF-8',
- 'English/Australia': 'en_AU.UTF-8',
- 'English/Botswana': 'en_BW.UTF-8',
- 'English/Canada': 'en_CA.UTF-8',
- 'English/Denmark': 'en_DK.UTF-8',
- 'English/Great_Britain': 'en_GB.UTF-8',
- 'English/Hong_Kong': 'en_HK.UTF-8',
- 'English/India': 'en_IN.UTF-8',
- 'English/Ireland': 'en_IE.UTF-8',
- 'English/New_Zealand': 'en_NZ.UTF-8',
- 'English/Philippines': 'en_PH.UTF-8',
- 'English/Singapore': 'en_SG.UTF-8',
- 'English/South_Africa': 'en_ZA.UTF-8',
- 'English/USA': 'en_US.UTF-8',
- 'English/Zimbabwe': 'en_ZW.UTF-8',
- 'Estonian': 'et_EE.UTF-8',
- 'Faroese/Faroe_Islands': 'fo_FO.UTF-8',
- 'Finnish': 'fi_FI.UTF-8',
- 'French/Belgium': 'fr_BE.UTF-8',
- 'French/Canada': 'fr_CA.UTF-8',
- 'French/France': 'fr_FR.UTF-8',
- 'French/Luxemburg': 'fr_LU.UTF-8',
- 'French/Switzerland': 'fr_CH.UTF-8',
- 'Galician/Spain': 'gl_ES.UTF-8',
- 'German/Austria': 'de_AT.UTF-8',
- 'German/Belgium': 'de_BE.UTF-8',
- 'German/Germany': 'de_DE.UTF-8',
- 'German/Luxemburg': 'de_LU.UTF-8',
- 'German/Switzerland': 'de_CH.UTF-8',
- 'Greek': 'el_GR.UTF-8',
- 'Greenlandic/Greenland': 'kl_GL.UTF-8',
- 'Gujarati/India': 'gu_IN.UTF-8',
- 'Hausa/Nigeria': 'ha_NG.UTF-8',
- 'Hebrew/Israel': 'he_IL.UTF-8',
- 'Hindi/India': 'hi_IN.UTF-8',
- 'Hungarian': 'hu_HU.UTF-8',
- 'Icelandic': 'is_IS.UTF-8',
- 'Igbo/Nigeria': 'ig_NG.UTF-8',
- 'Indonesian': 'id_ID.UTF-8',
- 'Irish': 'ga_IE.UTF-8',
- 'Italian/Italy': 'it_IT.UTF-8',
- 'Italian/Switzerland': 'it_CH.UTF-8',
- 'Japanese': 'ja_JP.UTF-8',
- 'Korean/Republic_of_Korea': 'ko_KR.UTF-8',
- 'Lao/Laos': 'lo_LA.UTF-8',
- 'Latvian/Latvia': 'lv_LV.UTF-8',
- 'Lithuanian': 'lt_LT.UTF-8',
- 'Macedonian': 'mk_MK.UTF-8',
- 'Malay/Malaysia': 'ms_MY.UTF-8',
- 'Maltese/malta': 'mt_MT.UTF-8',
- 'Manx/Britain': 'gv_GB.UTF-8',
- 'Marathi/India': 'mr_IN.UTF-8',
- 'Mongolian': 'mn_MN.UTF-8',
- 'Nepali': 'ne_NP.UTF-8',
- 'Northern/Norway': 'se_NO',
- 'Norwegian': 'nb_NO.UTF-8',
- 'Norwegian,/Norway': 'nn_NO.UTF-8',
- 'Occitan/France': 'oc_FR',
- 'Oriya/India': 'or_IN.UTF-8',
- 'Persian/Iran': 'fa_IR.UTF-8',
- 'Polish': 'pl_PL.UTF-8',
- 'Portuguese/Brasil': 'pt_BR.UTF-8',
- 'Portuguese/Portugal': 'pt_PT.UTF-8',
- 'Punjabi/India': 'pa_IN.UTF-8',
- 'Romanian': 'ro_RO.UTF-8',
- 'Russian': 'ru_RU.UTF-8',
- 'Russian/Ukraine': 'ru_UA.UTF-8',
- 'Serbian': 'sr_CS.UTF-8',
- 'Serbian/Latin': 'sr_CS.UTF-8@Latn',
- 'Slovak': 'sk_SK.UTF-8',
- 'Slovenian/Slovenia': 'sl_SI.UTF-8',
- 'Spanish/Argentina': 'es_AR.UTF-8',
- 'Spanish/Bolivia': 'es_BO.UTF-8',
- 'Spanish/Chile': 'es_CL.UTF-8',
- 'Spanish/Colombia': 'es_CO.UTF-8',
- 'Spanish/Costa_Rica': 'es_CR.UTF-8',
- 'Spanish/Dominican_Republic': 'es_DO.UTF-8',
- 'Spanish/El_Salvador': 'es_SV.UTF-8',
- 'Spanish/Equador': 'es_EC.UTF-8',
- 'Spanish/Guatemala': 'es_GT.UTF-8',
- 'Spanish/Honduras': 'es_HN.UTF-8',
- 'Spanish/Mexico': 'es_MX.UTF-8',
- 'Spanish/Nicaragua': 'es_NI.UTF-8',
- 'Spanish/Panama': 'es_PA.UTF-8',
- 'Spanish/Paraguay': 'es_PY.UTF-8',
- 'Spanish/Peru': 'es_PE.UTF-8',
- 'Spanish/Puerto_Rico': 'es_PR.UTF-8',
- 'Spanish/Spain': 'es_ES.UTF-8',
- 'Spanish/USA': 'es_US.UTF-8',
- 'Spanish/Uruguay': 'es_UY.UTF-8',
- 'Spanish/Venezuela': 'es_VE.UTF-8',
- 'Swedish/Finland': 'sv_FI.UTF-8',
- 'Swedish/Sweden': 'sv_SE.UTF-8',
- 'Tagalog/Philippines': 'tl_PH',
- 'Tamil/India': 'ta_IN.UTF-8',
- 'Telugu/India': 'te_IN.UTF-8',
- 'Thai': 'th_TH.UTF-8',
- 'Turkish': 'tr_TR.UTF-8',
- 'Ukrainian': 'uk_UA.UTF-8',
- 'Urdu/Pakistan': 'ur_PK',
- 'Uzbek/Uzbekistan': 'uz_UZ',
- 'Walloon/Belgium': 'wa_BE@euro',
- 'Welsh/Great_Britain': 'cy_GB.UTF-8',
- 'Xhosa/South_Africa': 'xh_ZA.UTF-8',
- 'Yoruba/Nigeria': 'yo_NG.UTF-8',
- 'Zulu/South_Africa': 'zu_ZA.UTF-8'
- }
-
-
-def _initialize():
- timezones = _read_zonetab()
-
- j=0
- for timezone in timezones:
- set_timezone.__doc__ += timezone+', '
- j+=1
- if j%3 == 0:
- set_timezone.__doc__ += '\n'
-
- keys = _LANGUAGES.keys()
- keys.sort()
- i = 0
- for key in keys:
- set_language.__doc__ += key+', '
- i+=1
- if i%3 == 0:
- set_language.__doc__ += '\n'
-
-def _note_restart():
- print _('To apply your changes you have to restart sugar.\n' +
- 'Hit at the same time ctrl+alt+erase on the keyboard to do this.')
-
-def get_jabber():
- pro = profile.get_profile()
- return pro.jabber_server
-
-def print_jabber():
- print get_jabber()
-
-def set_jabber(server):
- """Set the jabber server
- server : e.g. 'olpc.collabora.co.uk'
- """
- pro = profile.get_profile()
- pro.jabber_server = server
- pro.jabber_registered = False
- pro.save()
- _note_restart()
-
-def get_color():
- return profile.get_color()
-
-def print_color():
- color = get_color().to_string()
- str = color.split(',')
-
- stroke = None
- fill = None
- for color in _COLORS:
- for hue in _COLORS[color]:
- if _COLORS[color][hue] == str[0]:
- stroke = (color, hue)
- if _COLORS[color][hue] == str[1]:
- fill = (color, hue)
-
- if stroke is not None:
- print 'stroke: color=%s hue=%s'%(stroke[0], stroke[1])
- else:
- print 'stroke: %s'%(str[0])
- if fill is not None:
- print 'fill: color=%s hue=%s'%(fill[0], fill[1])
- else:
- print 'fill: %s'%(str[1])
-
-def set_color(stroke, fill, modstroke='medium', modfill='medium'):
- """Set the system color by setting a fill and stroke color.
- fill : [red, orange, yellow, blue, purple]
- stroke : [red, orange, yellow, blue, purple]
- hue stroke : [dark, medium, light] (optional)
- hue fill : [dark, medium, light] (optional)
- """
-
- if modstroke not in _MODIFIERS or modfill not in _MODIFIERS:
- print (_("Error in specified color modifiers."))
- return
- if stroke not in _COLORS or fill not in _COLORS:
- print (_("Error in specified colors."))
- return
-
- if modstroke == modfill:
- if modfill == 'medium':
- modfill = 'light'
- else:
- modfill = 'medium'
-
- color = _COLORS[stroke][modstroke] + ',' + _COLORS[fill][modfill]
- pro = profile.get_profile()
- pro.color = XoColor(color)
- pro.save()
- _note_restart()
-
-def get_nick():
- return profile.get_nick_name()
-
-def print_nick():
- print get_nick()
-
-def set_nick(nick):
- """Set the nickname.
- nick : e.g. 'walter'
- """
- pro = profile.get_profile()
- pro.nick_name = nick
- pro.save()
- _note_restart()
-
-def get_radio():
- bus = dbus.SystemBus()
- proxy = bus.get_object(NM_SERVICE_NAME, NM_SERVICE_PATH)
- nm = dbus.Interface(proxy, NM_SERVICE_IFACE)
- state = nm.getWirelessEnabled()
- if state == 0:
- return _('off')
- elif state == 1:
- return _('on')
- else:
- return _('State is unknown.')
-
-def print_radio():
- print get_radio()
-
-def set_radio(state):
- """Turn Radio 'on' or 'off'
- state : 'on/off'
- """
- if state == 'on':
- bus = dbus.SystemBus()
- proxy = bus.get_object(NM_SERVICE_NAME, NM_SERVICE_PATH)
- nm = dbus.Interface(proxy, NM_SERVICE_IFACE)
- nm.setWirelessEnabled(True)
- elif state == 'off':
- bus = dbus.SystemBus()
- proxy = bus.get_object(NM_SERVICE_NAME, NM_SERVICE_PATH)
- nm = dbus.Interface(proxy, NM_SERVICE_IFACE)
- nm.setWirelessEnabled(False)
- else:
- print (_("Error in specified radio argument use on/off."))
-
-def _check_for_superuser():
- if os.getuid():
- print _("Permission denied. You need to be root to run this method.")
- return False
- return True
-
-def get_timezone():
- if not os.access(_TIMEZONE_CONFIG, os.R_OK):
- # this is what the default is for the /etc/localtime
- return "America/New_York"
- fd = open(_TIMEZONE_CONFIG, "r")
- lines = fd.readlines()
- fd.close()
- try:
- for line in lines:
- line = string.strip(line)
- if len (line) and line[0] == '#':
- continue
- try:
- tokens = string.split(line, "=")
- if tokens[0] == "ZONE":
- timezone = string.replace(tokens[1], '"', '')
- return timezone
- except Exception, e:
- print "get_timezone: %s" % e
- except Exception, e:
- print "get_timezone: %s" % e
- return None
-
-def print_timezone():
- timezone = get_timezone()
- if timezone is None:
- print (_("Error in reading timezone"))
- else:
- print timezone
-
-def _read_zonetab(fn='/usr/share/zoneinfo/zone.tab'):
- fd = open (fn, 'r')
- lines = fd.readlines()
- fd.close()
- timezones = []
- for line in lines:
- if line.startswith('#'):
- continue
- line = line.split()
- if len(line) > 1:
- timezones.append(line[2])
- timezones.sort()
- return timezones
-
-def set_timezone(timezone):
- """Set the system timezone
- timezone :
- """
- if not _check_for_superuser():
- return
-
- timezones = _read_zonetab()
- if timezone in timezones:
- fromfile = os.path.join("/usr/share/zoneinfo/", timezone)
- try:
- shutil.copyfile(fromfile, "/etc/localtime")
- except OSError, (errno, msg):
- print (_("Error copying timezone (from %s): %s") % (fromfile, msg))
- return
- try:
- os.chmod("/etc/localtime", 0644)
- except OSError, (errno, msg):
- print (_("Changing permission of timezone: %s") % (msg))
- return
-
- # Write info to the /etc/sysconfig/clock file
- fd = open(_TIMEZONE_CONFIG, "w")
- fd.write('# use sugar-control-panel to change this\n')
- fd.write('ZONE="%s"\n' % timezone)
- fd.write('UTC=true\n')
- fd.close()
- else:
- print (_("Error timezone does not exist."))
-
-def _writeI18N(lang):
- path = os.path.join(os.environ.get("HOME"), '.i18n')
- if os.access(path, os.W_OK) == 0:
- print(_("Could not access %s. Create standard settings.") % path)
- fd = open(path, 'w')
- fd.write('LANG="en_US.UTF-8"\n')
- fd.close()
- else:
- fd = open(path, 'r')
- lines = fd.readlines()
- fd.close()
- for i in range(len(lines)):
- if lines[i][:5] == "LANG=":
- lines[i] = 'LANG="' + lang + '"\n'
- fd = open(path, 'w')
- fd.writelines(lines)
- fd.close()
-
-def get_language():
- originalFile = None
- path = os.path.join(os.environ.get("HOME"), '.i18n')
- if os.access(path, os.R_OK) == 0:
- print(_("Could not access %s. Create standard settings.") % path)
- fd = open(path, 'w')
- default = 'en_US.UTF-8'
- fd.write('LANG="%s"\n'%default)
- fd.close()
- return default
-
- fd = open(path, "r")
- lines = fd.readlines()
- fd.close()
-
- lang = None
-
- for line in lines:
- if line[:5] == "LANG=":
- lang = line[5:].replace('"', '')
- lang = lang.strip()
-
- return lang
-
-def print_language():
- code = get_language()
-
- for lang in _LANGUAGES:
- if _LANGUAGES[lang] == code:
- print lang
- return
- print (_("Language for code=%s could not be determined.") % code)
-
-def set_language(language):
- """Set the system language.
- languages :
- """
- if language in _LANGUAGES:
- _writeI18N(_LANGUAGES[language])
- _note_restart()
- else:
- print (_("Sorry I do not speak \'%s\'.") % language)
-
-# inilialize the docstrings for the timezone and language
-_initialize()
-
diff --git a/src/emulator.py b/src/emulator.py
deleted file mode 100755
index 23ceea1..0000000
--- a/src/emulator.py
+++ /dev/null
@@ -1,156 +0,0 @@
-# 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
-
-import os
-import sys
-import socket
-import logging
-from optparse import OptionParser
-
-log = logging.getLogger( 'sugar-emulator' )
-log.setLevel( logging.DEBUG )
-
-import pygtk
-pygtk.require('2.0')
-import gtk
-import gobject
-
-from sugar import env
-
-import config
-
-def _get_display_number():
- """Find a free display number trying to connect to 6000+ ports"""
- log.info( "Attempting to find free port for X11 (Xephyr)" )
- retries = 20
- display_number = 1
- display_is_free = False
-
- while not display_is_free and retries > 0:
- lockstr = "/tmp/.X%d-lock" % display_number
- if not os.path.exists(lockstr):
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- try:
- s.connect(('127.0.0.1', 6000 + display_number))
- s.close()
- except:
- display_is_free = True
- break
-
- display_number += 1
- retries -= 1
-
- if display_is_free:
- log.info(
- ' Found free port: #%s (%s)',
- display_number, display_number+6000
- )
- return display_number
- else:
- logging.error('Cannot find a free display.')
- sys.exit(0)
-
-def _start_xephyr(dpi=None):
- display = _get_display_number()
- log.info( 'Starting the Xephyr nested X display on display %s', display )
-
- cmd = [ 'Xephyr' ]
- cmd.append(':%d' % display)
- cmd.append('-ac')
-
- if gtk.gdk.screen_width() < 1200 or gtk.gdk.screen_height() < 900:
- cmd.append('-fullscreen')
- else:
- cmd.append('-screen')
- cmd.append('%dx%d' % (1200, 900))
-
- if not dpi:
- dpi = gtk.settings_get_default().get_property('gtk-xft-dpi') / 1024
- if dpi > 0:
- cmd.append('-dpi')
- cmd.append('%d' % dpi)
-
- log.debug( 'Xephyr command: %s', " ".join( cmd ) )
- result = gobject.spawn_async(cmd, flags=gobject.SPAWN_SEARCH_PATH)
- pid = result[0]
-
- os.environ['DISPLAY'] = ":%d" % (display)
- os.environ['SUGAR_EMULATOR_PID'] = str(pid)
-
-def _start_matchbox():
- log.info( 'Starting the matchbox window manager' )
- cmd = ['matchbox-window-manager']
-
- cmd.extend(['-use_titlebar', 'no'])
- cmd.extend(['-theme', 'sugar'])
-
- log.debug( 'Matchbox command: %s', " ".join( cmd) )
- gobject.spawn_async(cmd, flags=gobject.SPAWN_SEARCH_PATH)
-
-def _setup_env():
- os.environ['SUGAR_EMULATOR'] = 'yes'
- os.environ['GABBLE_LOGFILE'] = os.path.join(
- env.get_profile_path(), 'logs', 'telepathy-gabble.log')
- os.environ['SALUT_LOGFILE'] = os.path.join(
- env.get_profile_path(), 'logs', 'telepathy-salut.log')
- os.environ['STREAM_ENGINE_LOGFILE'] = os.path.join(
- env.get_profile_path(), 'logs', 'telepathy-stream-engine.log')
-
-def main():
- """Script-level operations"""
-
- parser = OptionParser()
- parser.add_option('-x', '--xo-style', dest='xo_style',
- action='store_true', help='use the XO style')
- (options, args) = parser.parse_args()
-
- logging.basicConfig()
-
- _setup_env()
-
- if options.xo_style:
- _start_xephyr(dpi=201)
- else:
- _start_xephyr()
-
- if options.xo_style:
- os.environ['SUGAR_XO_STYLE'] = 'yes'
- else:
- os.environ['SUGAR_XO_STYLE'] = 'no'
-
- if options.xo_style:
- gtkrc_filename = 'sugar-xo.gtkrc'
- else:
- gtkrc_filename = 'sugar.gtkrc'
- os.environ['SUGAR_XO_STYLE'] = 'no'
-
- gtkrc_path = os.path.join(config.data_path, gtkrc_filename)
- os.environ['GTK2_RC_FILES'] = gtkrc_path
-
- command = ['dbus-launch', 'dbus-launch', '--exit-with-session']
-
- if not args:
- command.append('sugar-shell')
- else:
- _start_matchbox()
-
- if args[0].endswith('.py'):
- command.append('python')
-
- command.append(args[0])
-
- log.info( "Attempting to launch sugar to replace this process: %s", " ".join(command))
- os.execlp( *command )
diff --git a/src/hardware/Makefile.am b/src/hardware/Makefile.am
deleted file mode 100644
index 8cd9c77..0000000
--- a/src/hardware/Makefile.am
+++ /dev/null
@@ -1,13 +0,0 @@
-sugardir = $(pkgdatadir)/shell/hardware
-sugar_PYTHON = \
- __init__.py \
- hardwaremanager.py \
- keydialog.py \
- nmclient.py \
- nminfo.py \
- schoolserver.py
-
-dbusservicedir = $(sysconfdir)/dbus-1/system.d/
-dbusservice_DATA = NetworkManagerInfo.conf
-
-EXTRA_DIST = $(dbusservice_DATA)
diff --git a/src/hardware/NetworkManagerInfo.conf b/src/hardware/NetworkManagerInfo.conf
deleted file mode 100644
index 4fb8270..0000000
--- a/src/hardware/NetworkManagerInfo.conf
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE busconfig PUBLIC
- "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
- "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<busconfig>
- <policy user="root">
- <allow own="org.freedesktop.NetworkManagerInfo"/>
-
- <allow send_destination="org.freedesktop.NetworkManagerInfo"/>
- <allow send_interface="org.freedesktop.NetworkManagerInfo"/>
- </policy>
- <policy at_console="true">
- <allow own="org.freedesktop.NetworkManagerInfo"/>
-
- <allow send_destination="org.freedesktop.NetworkManagerInfo"/>
- <allow send_interface="org.freedesktop.NetworkManagerInfo"/>
- </policy>
- <policy context="default">
- <deny own="org.freedesktop.NetworkManagerInfo"/>
-
- <deny send_destination="org.freedesktop.NetworkManagerInfo"/>
- <deny send_interface="org.freedesktop.NetworkManagerInfo"/>
- </policy>
-
- <limit name="max_replies_per_connection">512</limit>
-</busconfig>
-
diff --git a/src/hardware/__init__.py b/src/hardware/__init__.py
deleted file mode 100644
index a9dd95a..0000000
--- a/src/hardware/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2006-2007, 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
-
diff --git a/src/hardware/hardwaremanager.py b/src/hardware/hardwaremanager.py
deleted file mode 100644
index 4eeac03..0000000
--- a/src/hardware/hardwaremanager.py
+++ /dev/null
@@ -1,143 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import logging
-
-import dbus
-import gst
-import gst.interfaces
-
-from hardware.nmclient import NMClient
-from sugar.profile import get_profile
-from sugar import env
-
-_HARDWARE_MANAGER_INTERFACE = 'org.laptop.HardwareManager'
-_HARDWARE_MANAGER_SERVICE = 'org.laptop.HardwareManager'
-_HARDWARE_MANAGER_OBJECT_PATH = '/org/laptop/HardwareManager'
-
-COLOR_MODE = 0
-B_AND_W_MODE = 1
-
-class HardwareManager(object):
- def __init__(self):
- try:
- bus = dbus.SystemBus()
- proxy = bus.get_object(_HARDWARE_MANAGER_SERVICE,
- _HARDWARE_MANAGER_OBJECT_PATH)
- self._service = dbus.Interface(proxy, _HARDWARE_MANAGER_INTERFACE)
- except dbus.DBusException, e:
- self._service = None
- logging.info('Hardware manager service not found.')
-
- self._mixer = gst.element_factory_make('alsamixer')
- self._mixer.set_state(gst.STATE_PAUSED)
-
- self._master = None
- for track in self._mixer.list_tracks():
- if track.flags & gst.interfaces.MIXER_TRACK_MASTER:
- self._master = track
-
- def get_volume(self):
- if not self._mixer or not self._master:
- logging.error('Cannot get the volume')
- return self._convert_volume(0)
-
- max_volume = self._master.max_volume
- min_volume = self._master.min_volume
- volume = self._mixer.get_volume(self._master)[0]
-
- return volume * 100.0 / (max_volume - min_volume) + min_volume
-
- def set_volume(self, volume):
- if not self._mixer or not self._master:
- logging.error('Cannot set the volume')
-
- if volume < 0 or volume > 100:
- logging.error('Trying to set an invalid volume value.')
- return
-
- max_volume = self._master.max_volume
- min_volume = self._master.min_volume
-
- volume = volume * (max_volume - min_volume) / 100.0 + min_volume
- volume_list = [ volume ] * self._master.num_channels
-
- self._mixer.set_volume(self._master, tuple(volume_list))
-
- def set_mute(self, mute):
- if not self._mixer or not self._master:
- logging.error('Cannot mute the audio channel')
- self._mixer.set_mute(self._master, mute)
-
- def startup(self):
- if env.is_emulator() is False:
- profile = get_profile()
- self.set_volume(profile.sound_volume)
-
- def shutdown(self):
- if env.is_emulator() is False:
- profile = get_profile()
- profile.sound_volume = self.get_volume()
- profile.save()
-
- def set_dcon_freeze(self, frozen):
- if not self._service:
- return
-
- self._service.set_dcon_freeze(frozen)
-
- def set_display_mode(self, mode):
- if not self._service:
- return
-
- self._service.set_display_mode(mode)
-
- def set_display_brightness(self, level):
- if not self._service:
- logging.error('Cannot set display brightness')
- return
-
- self._service.set_display_brightness(level)
-
- def get_display_brightness(self):
- if not self._service:
- logging.error('Cannot get display brightness')
- return
-
- return self._service.get_display_brightness()
-
- def toggle_keyboard_brightness(self):
- if not self._service:
- return
-
- if self._service.get_keyboard_brightness():
- self._service.set_keyboard_brightness(False)
- else:
- self._service.set_keyboard_brightness(True)
-
-def get_manager():
- return _manager
-
-def get_network_manager():
- return _network_manager
-
-_manager = HardwareManager()
-
-try:
- _network_manager = NMClient()
-except dbus.DBusException, e:
- _network_manager = None
- logging.info('Network manager service not found.')
diff --git a/src/hardware/keydialog.py b/src/hardware/keydialog.py
deleted file mode 100644
index d336ab9..0000000
--- a/src/hardware/keydialog.py
+++ /dev/null
@@ -1,351 +0,0 @@
-# vi: ts=4 ai noet
-#
-# Copyright (C) 2006-2007 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
-
-import md5
-from gettext import gettext as _
-
-import gobject, gtk
-
-IW_AUTH_ALG_OPEN_SYSTEM = 0x00000001
-IW_AUTH_ALG_SHARED_KEY = 0x00000002
-
-IW_AUTH_WPA_VERSION_DISABLED = 0x00000001
-IW_AUTH_WPA_VERSION_WPA = 0x00000002
-IW_AUTH_WPA_VERSION_WPA2 = 0x00000004
-
-NM_802_11_CAP_NONE = 0x00000000
-NM_802_11_CAP_PROTO_NONE = 0x00000001
-NM_802_11_CAP_PROTO_WEP = 0x00000002
-NM_802_11_CAP_PROTO_WPA = 0x00000004
-NM_802_11_CAP_PROTO_WPA2 = 0x00000008
-NM_802_11_CAP_KEY_MGMT_PSK = 0x00000040
-NM_802_11_CAP_KEY_MGMT_802_1X = 0x00000080
-NM_802_11_CAP_CIPHER_WEP40 = 0x00001000
-NM_802_11_CAP_CIPHER_WEP104 = 0x00002000
-NM_802_11_CAP_CIPHER_TKIP = 0x00004000
-NM_802_11_CAP_CIPHER_CCMP = 0x00008000
-
-NM_AUTH_TYPE_WPA_PSK_AUTO = 0x00000000
-IW_AUTH_CIPHER_NONE = 0x00000001
-IW_AUTH_CIPHER_WEP40 = 0x00000002
-IW_AUTH_CIPHER_TKIP = 0x00000004
-IW_AUTH_CIPHER_CCMP = 0x00000008
-IW_AUTH_CIPHER_WEP104 = 0x00000010
-
-IW_AUTH_KEY_MGMT_802_1X = 0x1
-IW_AUTH_KEY_MGMT_PSK = 0x2
-
-def string_is_hex(key):
- is_hex = True
- for c in key:
- if not 'a' <= c.lower() <= 'f' and not '0' <= c <= '9':
- is_hex = False
- return is_hex
-
-def string_is_ascii(string):
- try:
- string.encode('ascii')
- return True
- except:
- return False
-
-def string_to_hex(passphrase):
- key = ''
- for c in passphrase:
- key += '%02x' % ord(c)
- return key
-
-def hash_passphrase(passphrase):
- # passphrase must have a length of 64
- if len(passphrase) > 64:
- passphrase = passphrase[:64]
- elif len(passphrase) < 64:
- while len(passphrase) < 64:
- passphrase += passphrase[:64 - len(passphrase)]
- passphrase = md5.new(passphrase).digest()
- return string_to_hex(passphrase)[:26]
-
-class KeyDialog(gtk.Dialog):
- def __init__(self, net, async_cb, async_err_cb):
- gtk.Dialog.__init__(self, flags=gtk.DIALOG_MODAL)
- self.set_title("Wireless Key Required")
-
- self._net = net
- self._async_cb = async_cb
- self._async_err_cb = async_err_cb
-
- self.set_has_separator(False)
-
- label = gtk.Label("A wireless encryption key is required for\n" \
- " the wireless network '%s'." % net.get_ssid())
- self.vbox.pack_start(label)
-
- self.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
- gtk.STOCK_OK, gtk.RESPONSE_OK)
- self.set_default_response(gtk.RESPONSE_OK)
- self.set_has_separator(True)
-
- def add_key_entry(self):
- self._entry = gtk.Entry()
- #self._entry.props.visibility = False
- self._entry.connect('changed', self._update_response_sensitivity)
- self._entry.connect('activate', self._entry_activate_cb)
- self.vbox.pack_start(self._entry)
- self.vbox.set_spacing(6)
- self.vbox.show_all()
-
- self._update_response_sensitivity()
- self._entry.grab_focus()
-
- def _entry_activate_cb(self, entry):
- self.response(gtk.RESPONSE_OK)
-
- def create_security(self):
- raise NotImplementedError
-
- def get_network(self):
- return self._net
-
- def get_callbacks(self):
- return (self._async_cb, self._async_err_cb)
-
-WEP_PASSPHRASE = 1
-WEP_HEX = 2
-WEP_ASCII = 3
-
-class WEPKeyDialog(KeyDialog):
- def __init__(self, net, async_cb, async_err_cb):
- KeyDialog.__init__(self, net, async_cb, async_err_cb)
-
- # WEP key type
- self.key_store = gtk.ListStore(str, int)
- self.key_store.append(["Passphrase (128-bit)", WEP_PASSPHRASE])
- self.key_store.append(["Hex (40/128-bit)", WEP_HEX])
- self.key_store.append(["ASCII (40/128-bit)", WEP_ASCII])
-
- self.key_combo = gtk.ComboBox(self.key_store)
- cell = gtk.CellRendererText()
- self.key_combo.pack_start(cell, True)
- self.key_combo.add_attribute(cell, 'text', 0)
- self.key_combo.set_active(0)
- self.key_combo.connect('changed', self._key_combo_changed_cb)
-
- hbox = gtk.HBox()
- hbox.pack_start(gtk.Label(_("Key Type:")))
- hbox.pack_start(self.key_combo)
- hbox.show_all()
- self.vbox.pack_start(hbox)
-
- # Key entry field
- self.add_key_entry()
-
- # WEP authentication mode
- self.auth_store = gtk.ListStore(str, int)
- self.auth_store.append(["Open System", IW_AUTH_ALG_OPEN_SYSTEM])
- self.auth_store.append(["Shared Key", IW_AUTH_ALG_SHARED_KEY])
-
- self.auth_combo = gtk.ComboBox(self.auth_store)
- cell = gtk.CellRendererText()
- self.auth_combo.pack_start(cell, True)
- self.auth_combo.add_attribute(cell, 'text', 0)
- self.auth_combo.set_active(0)
-
- hbox = gtk.HBox()
- hbox.pack_start(gtk.Label(_("Authentication Type:")))
- hbox.pack_start(self.auth_combo)
- hbox.show_all()
-
- self.vbox.pack_start(hbox)
-
- def _key_combo_changed_cb(self, widget):
- self._update_response_sensitivity()
-
- def _get_security(self):
- key = self._entry.get_text()
-
- it = self.key_combo.get_active_iter()
- (key_type, ) = self.key_store.get(it, 1)
-
- if key_type == WEP_PASSPHRASE:
- key = hash_passphrase(key)
- elif key_type == WEP_ASCII:
- key = string_to_hex(key)
-
- it = self.auth_combo.get_active_iter()
- (auth_alg, ) = self.auth_store.get(it, 1)
-
- we_cipher = None
- if len(key) == 26:
- we_cipher = IW_AUTH_CIPHER_WEP104
- elif len(key) == 10:
- we_cipher = IW_AUTH_CIPHER_WEP40
-
- return (we_cipher, key, auth_alg)
-
- def print_security(self):
- (we_cipher, key, auth_alg) = self._get_security()
- print "Cipher: %d" % we_cipher
- print "Key: %s" % key
- print "Auth: %d" % auth_alg
-
- def create_security(self):
- (we_cipher, key, auth_alg) = self._get_security()
- from nminfo import Security
- return Security.new_from_args(we_cipher, (key, auth_alg))
-
- def _update_response_sensitivity(self, ignored=None):
- key = self._entry.get_text()
- it = self.key_combo.get_active_iter()
- (key_type, ) = self.key_store.get(it, 1)
-
- valid = False
- if key_type == WEP_PASSPHRASE:
- # As the md5 passphrase can be of any length and has no indicator,
- # we cannot check for the validity of the input.
- if len(key) > 0:
- valid = True
- elif key_type == WEP_ASCII:
- if len(key) == 5 or len(key) == 13:
- valid = string_is_ascii(key)
- elif key_type == WEP_HEX:
- if len(key) == 10 or len(key) == 26:
- valid = string_is_hex(key)
-
- self.set_response_sensitive(gtk.RESPONSE_OK, valid)
-
-class WPAKeyDialog(KeyDialog):
- def __init__(self, net, async_cb, async_err_cb):
- KeyDialog.__init__(self, net, async_cb, async_err_cb)
- self.add_key_entry()
-
- self.store = gtk.ListStore(str, int)
- self.store.append(["Automatic", NM_AUTH_TYPE_WPA_PSK_AUTO])
- if net.get_caps() & NM_802_11_CAP_CIPHER_CCMP:
- self.store.append(["AES-CCMP", IW_AUTH_CIPHER_CCMP])
- if net.get_caps() & NM_802_11_CAP_CIPHER_TKIP:
- self.store.append(["TKIP", IW_AUTH_CIPHER_TKIP])
-
- self.combo = gtk.ComboBox(self.store)
- cell = gtk.CellRendererText()
- self.combo.pack_start(cell, True)
- self.combo.add_attribute(cell, 'text', 0)
- self.combo.set_active(0)
-
- self.hbox = gtk.HBox()
- self.hbox.pack_start(gtk.Label(_("Encryption Type:")))
- self.hbox.pack_start(self.combo)
- self.hbox.show_all()
-
- self.vbox.pack_start(self.hbox)
-
- def _get_security(self):
- ssid = self.get_network().get_ssid()
- key = self._entry.get_text()
- is_hex = string_is_hex(key)
-
- real_key = None
- if len(key) == 64 and is_hex:
- # Hex key
- real_key = key
- elif len(key) >= 8 and len(key) <= 63:
- # passphrase
- import commands
- (s, o) = commands.getstatusoutput("/usr/sbin/wpa_passphrase '%s' '%s'" % (ssid, key))
- if s != 0:
- raise RuntimeError("Error hashing passphrase: %s" % o)
- lines = o.split("\n")
- for line in lines:
- if line.strip().startswith("psk="):
- real_key = line.strip()[4:]
- if real_key and len(real_key) != 64:
- real_key = None
-
- if not real_key:
- raise RuntimeError("Invalid key")
-
- it = self.combo.get_active_iter()
- (we_cipher, ) = self.store.get(it, 1)
-
- wpa_ver = IW_AUTH_WPA_VERSION_WPA
- caps = self.get_network().get_caps()
- if caps & NM_802_11_CAP_PROTO_WPA2:
- wpa_ver = IW_AUTH_WPA_VERSION_WPA2
-
- return (we_cipher, real_key, wpa_ver)
-
- def print_security(self):
- (we_cipher, key, wpa_ver) = self._get_security()
- print "Cipher: %d" % we_cipher
- print "Key: %s" % key
- print "WPA Ver: %d" % wpa_ver
-
- def create_security(self):
- (we_cipher, key, wpa_ver) = self._get_security()
- from nminfo import Security
- return Security.new_from_args(we_cipher, (key, wpa_ver, IW_AUTH_KEY_MGMT_PSK))
-
- def _update_response_sensitivity(self, ignored=None):
- key = self._entry.get_text()
- is_hex = string_is_hex(key)
-
- valid = False
- if len(key) == 64 and is_hex:
- # hex key
- valid = True
- elif len(key) >= 8 and len(key) <= 63:
- # passphrase
- valid = True
- self.set_response_sensitive(gtk.RESPONSE_OK, valid)
- return False
-
-def new_key_dialog(net, async_cb, async_err_cb):
- caps = net.get_caps()
- if (caps & NM_802_11_CAP_CIPHER_TKIP or caps & NM_802_11_CAP_CIPHER_CCMP) and \
- (caps & NM_802_11_CAP_PROTO_WPA or caps & NM_802_11_CAP_PROTO_WPA2):
- return WPAKeyDialog(net, async_cb, async_err_cb)
- elif (caps & NM_802_11_CAP_CIPHER_WEP40 or caps & NM_802_11_CAP_CIPHER_WEP104) and \
- (caps & NM_802_11_CAP_PROTO_WEP):
- return WEPKeyDialog(net, async_cb, async_err_cb)
- else:
- raise RuntimeError("Unhandled network capabilities %x" % caps)
-
-
-
-class FakeNet(object):
- def get_ssid(self):
- return "olpcwpa"
-
- def get_caps(self):
-# return NM_802_11_CAP_CIPHER_WEP104 | NM_802_11_CAP_PROTO_WEP
- return NM_802_11_CAP_CIPHER_CCMP | NM_802_11_CAP_CIPHER_TKIP | NM_802_11_CAP_PROTO_WPA
-
-def response_cb(widget, response_id):
- if response_id == gtk.RESPONSE_OK:
- print dialog.print_security()
- else:
- print "canceled"
- widget.hide()
- widget.destroy()
-
-
-if __name__ == "__main__":
- net = FakeNet()
- dialog = new_key_dialog(net, None, None)
- dialog.connect("response", response_cb)
- dialog.run()
-
diff --git a/src/hardware/nmclient.py b/src/hardware/nmclient.py
deleted file mode 100644
index d23a206..0000000
--- a/src/hardware/nmclient.py
+++ /dev/null
@@ -1,721 +0,0 @@
-#
-# Copyright (C) 2006-2007 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
-
-import logging
-import os
-
-import dbus
-import dbus.glib
-import dbus.decorators
-import gobject
-import gtk
-
-from hardware import nminfo
-from sugar.graphics import xocolor
-
-IW_AUTH_ALG_OPEN_SYSTEM = 0x00000001
-IW_AUTH_ALG_SHARED_KEY = 0x00000002
-
-NM_DEVICE_STAGE_STRINGS=("Unknown",
- "Prepare",
- "Config",
- "Need Users Key",
- "IP Config",
- "IP Config Get",
- "IP Config Commit",
- "Activated",
- "Failed",
- "Canceled"
-)
-
-NM_SERVICE = 'org.freedesktop.NetworkManager'
-NM_IFACE = 'org.freedesktop.NetworkManager'
-NM_IFACE_DEVICES = 'org.freedesktop.NetworkManager.Devices'
-NM_PATH = '/org/freedesktop/NetworkManager'
-
-DEVICE_TYPE_UNKNOWN = 0
-DEVICE_TYPE_802_3_ETHERNET = 1
-DEVICE_TYPE_802_11_WIRELESS = 2
-DEVICE_TYPE_802_11_MESH_OLPC = 3
-
-NM_DEVICE_CAP_NONE = 0x00000000
-NM_DEVICE_CAP_NM_SUPPORTED = 0x00000001
-NM_DEVICE_CAP_CARRIER_DETECT = 0x00000002
-NM_DEVICE_CAP_WIRELESS_SCAN = 0x00000004
-
-sys_bus = dbus.SystemBus()
-
-NM_802_11_CAP_NONE = 0x00000000
-NM_802_11_CAP_PROTO_NONE = 0x00000001
-NM_802_11_CAP_PROTO_WEP = 0x00000002
-NM_802_11_CAP_PROTO_WPA = 0x00000004
-NM_802_11_CAP_PROTO_WPA2 = 0x00000008
-NM_802_11_CAP_KEY_MGMT_PSK = 0x00000040
-NM_802_11_CAP_KEY_MGMT_802_1X = 0x00000080
-NM_802_11_CAP_CIPHER_WEP40 = 0x00001000
-NM_802_11_CAP_CIPHER_WEP104 = 0x00002000
-NM_802_11_CAP_CIPHER_TKIP = 0x00004000
-NM_802_11_CAP_CIPHER_CCMP = 0x00008000
-
-NETWORK_STATE_CONNECTING = 0
-NETWORK_STATE_CONNECTED = 1
-NETWORK_STATE_NOTCONNECTED = 2
-
-DEVICE_STATE_ACTIVATING = 0
-DEVICE_STATE_ACTIVATED = 1
-DEVICE_STATE_INACTIVE = 2
-
-IW_MODE_ADHOC = 1
-IW_MODE_INFRA = 2
-
-class Network(gobject.GObject):
- __gsignals__ = {
- 'initialized' : (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([gobject.TYPE_BOOLEAN])),
- 'strength-changed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([])),
- 'state-changed' : (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([]))
- }
-
- def __init__(self, client, op):
- gobject.GObject.__init__(self)
- self._client = client
- self._op = op
- self._ssid = None
- self._mode = None
- self._strength = 0
- self._caps = 0
- self._valid = False
- self._favorite = False
- self._state = NETWORK_STATE_NOTCONNECTED
-
- obj = sys_bus.get_object(NM_SERVICE, self._op)
- net = dbus.Interface(obj, NM_IFACE_DEVICES)
- net.getProperties(reply_handler=self._update_reply_cb,
- error_handler=self._update_error_cb)
-
- def _update_reply_cb(self, *props):
- self._ssid = props[1]
- self._strength = props[3]
- self._mode = props[6]
- self._caps = props[7]
- if self._caps & NM_802_11_CAP_PROTO_WPA or self._caps & NM_802_11_CAP_PROTO_WPA2:
- if not (self._caps & NM_802_11_CAP_KEY_MGMT_PSK):
- # 802.1x is not supported at this time
- logging.debug("Net(%s): ssid '%s' dropping because 802.1x is unsupported" % (self._op,
- self._ssid))
- self._valid = False
- self.emit('initialized', self._valid)
- return
- if self._mode != IW_MODE_INFRA:
- # Don't show Ad-Hoc networks; they usually don't DHCP and therefore
- # won't work well here. This also works around the bug where we show
- # our own mesh SSID on the Mesh view when in mesh mode
- logging.debug("Net(%s): ssid '%s' is adhoc; not showing" % (self._op,
- self._ssid))
- self._valid = False
- self.emit('initialized', self._valid)
- return
-
- fav_nets = []
- if self._client.nminfo:
- fav_nets = self._client.nminfo.get_networks(nminfo.NETWORK_TYPE_ALLOWED)
- if self._ssid in fav_nets:
- self._favorite = True
-
- self._valid = True
- logging.debug("Net(%s): caps 0x%X" % (self._ssid, self._caps))
- self.emit('initialized', self._valid)
-
- def _update_error_cb(self, err):
- logging.debug("Net(%s): failed to update. (%s)" % (self._op, err))
- self._valid = False
- self.emit('initialized', self._valid)
-
- def get_colors(self):
- import sha
- sh = sha.new()
- data = self._ssid + hex(self._caps) + hex(self._mode)
- sh.update(data)
- h = hash(sh.digest())
- idx = h % len(xocolor._colors)
- # stroke, fill
- return (xocolor._colors[idx][0], xocolor._colors[idx][1])
-
- def get_ssid(self):
- return self._ssid
-
- def get_caps(self):
- return self._caps
-
- def get_mode(self):
- return self._mode
-
- def get_state(self):
- return self._state
-
- def set_state(self, state):
- if state == self._state:
- return
- self._state = state
- if self._valid:
- self.emit('state-changed')
-
- def get_op(self):
- return self._op
-
- def get_strength(self):
- return self._strength
-
- def set_strength(self, strength):
- if strength == self._strength:
- return
- self._strength = strength
- if self._valid:
- self.emit('strength-changed')
-
- def is_valid(self):
- return self._valid
-
- def is_favorite(self):
- return self._favorite
-
-class Device(gobject.GObject):
- __gsignals__ = {
- 'initialized': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([])),
- 'init-failed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([])),
- 'ssid-changed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([])),
- 'strength-changed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([])),
- 'state-changed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([])),
- 'activation-stage-changed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([])),
- 'network-appeared': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT])),
- 'network-disappeared': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT]))
- }
-
- def __init__(self, client, op):
- gobject.GObject.__init__(self)
- self._client = client
- self._op = op
- self._iface = None
- self._type = DEVICE_TYPE_UNKNOWN
- self._udi = None
- self._active = False
- self._act_stage = 0
- self._strength = 0
- self._freq = 0.0
- self._link = False
- self._valid = False
- self._networks = {}
- self._caps = 0
- self._state = DEVICE_STATE_INACTIVE
- self._active_network = None
- self._active_net_sigid = 0
-
- obj = sys_bus.get_object(NM_SERVICE, self._op)
- self.dev = dbus.Interface(obj, NM_IFACE_DEVICES)
- self.dev.getProperties(reply_handler=self._update_reply_cb,
- error_handler=self._update_error_cb)
-
- def _is_activating(self):
- if self._active and self._act_stage >= 1 and self._act_stage <= 6:
- return True
- return False
-
- def _is_activated(self):
- if self._active and self._act_stage == 7:
- return True
- return False
-
- def _update_reply_cb(self, *props):
- self._iface = props[1]
- self._type = props[2]
- self._udi = props[3]
- self._active = props[4]
- self._act_stage = props[5]
- self._link = props[15]
- self._caps = props[17]
-
- if self._type == DEVICE_TYPE_802_11_WIRELESS:
- old_strength = self._strength
- self._strength = props[14]
- if self._strength != old_strength:
- if self._valid:
- self.emit('strength-changed')
- self._update_networks(props[20], props[19])
- elif self._type == DEVICE_TYPE_802_11_MESH_OLPC:
- old_strength = self._strength
- self._strength = props[14]
- if self._strength != old_strength:
- if self._valid:
- self.emit('strength-changed')
-
- self._valid = True
-
- if self._is_activating():
- self.set_state(DEVICE_STATE_ACTIVATING)
- elif self._is_activated():
- self.set_state(DEVICE_STATE_ACTIVATED)
- else:
- self.set_state(DEVICE_STATE_INACTIVE)
-
- self.emit('initialized')
-
- def _update_networks(self, net_ops, active_op):
- for op in net_ops:
- net = Network(self._client, op)
- self._networks[op] = net
- net.connect('initialized', lambda *args: self._net_initialized_cb(active_op, *args))
-
- def _update_error_cb(self, err):
- logging.debug("Device(%s): failed to update. (%s)" % (self._op, err))
- self._valid = False
- self.emit('init-failed')
-
- def _net_initialized_cb(self, active_op, net, valid):
- net_op = net.get_op()
- if not self._networks.has_key(net_op):
- return
-
- if not valid:
- # init failure
- del self._networks[net_op]
- return
-
- # init success
- if self._valid:
- self.emit('network-appeared', net)
- if active_op and net_op == active_op:
- self.set_active_network(net)
-
- def get_op(self):
- return self._op
-
- def get_networks(self):
- ret = []
- for net in self._networks.values():
- if net.is_valid():
- ret.append(net)
- return ret
-
- def get_network(self, op):
- if self._networks.has_key(op) and self._networks[op].is_valid():
- return self._networks[op]
- return None
-
- def get_network_ops(self):
- ret = []
- for net in self._networks.values():
- if net.is_valid():
- ret.append(net.get_op())
- return ret
-
- def get_mesh_step(self):
- if self._type != DEVICE_TYPE_802_11_MESH_OLPC:
- raise RuntimeError("Only valid for mesh devices")
- try:
- step = self.dev.getMeshStep(timeout=3)
- except dbus.DBusException, e:
- step = 0
- return step
-
- def get_frequency(self):
- freq = 0.0
- try:
- freq = self.dev.getFrequency(timeout=3)
- except dbus.DBusException, e:
- pass
- # Hz -> GHz
- self._freq = freq / 1000000000.0
- return self._freq
-
- def get_strength(self):
- return self._strength
-
- def set_strength(self, strength):
- if strength == self._strength:
- return False
-
- if strength >= 0 and strength <= 100:
- self._strength = strength
- else:
- self._strength = 0
-
- if self._valid:
- self.emit('strength-changed')
-
- def network_appeared(self, network):
- if self._networks.has_key(network):
- return
- net = Network(self._client, network)
- self._networks[network] = net
- net.connect('initialized', lambda *args: self._net_initialized_cb(None, *args))
-
- def network_disappeared(self, network):
- if not self._networks.has_key(network):
- return
-
- if self._valid:
- self.emit('network-disappeared', self._networks[network])
-
- del self._networks[network]
-
- def set_active_network(self, network):
- if self._active_network == network:
- return
-
- # Make sure the old one doesn't get a stuck state
- if self._active_network:
- self._active_network.set_state(NETWORK_STATE_NOTCONNECTED)
- self._active_network.disconnect(self._active_net_sigid)
-
- self._active_network = network
-
- if self._active_network:
- self._active_net_sigid = self._active_network.connect("initialized",
- self._active_net_initialized);
-
- # don't emit ssid-changed for networks that are not yet valid
- if self._valid:
- if self._active_network and self._active_network.is_valid():
- self.emit('ssid-changed')
- elif not self._active_network:
- self.emit('ssid-changed')
-
- def _active_net_initialized(self, net, user_data=None):
- if self._active_network and self._active_network.is_valid():
- self.emit('ssid-changed')
-
- def _get_active_net_cb(self, state, net_op):
- if not self._networks.has_key(net_op):
- self.set_active_network(None)
- return
-
- self.set_active_network(self._networks[net_op])
-
- _device_to_network_state = {
- DEVICE_STATE_ACTIVATING : NETWORK_STATE_CONNECTING,
- DEVICE_STATE_ACTIVATED : NETWORK_STATE_CONNECTED,
- DEVICE_STATE_INACTIVE : NETWORK_STATE_NOTCONNECTED
- }
-
- network_state = _device_to_network_state[state]
- self._active_network.set_state(network_state)
-
- def _get_active_net_error_cb(self, err):
- logging.debug("Couldn't get active network: %s" % err)
- self.set_active_network(None)
-
- def get_state(self):
- return self._state
-
- def set_state(self, state):
- if state == self._state:
- return
-
- if state == DEVICE_STATE_INACTIVE:
- self._act_stage = 0
-
- self._state = state
- if self._valid:
- self.emit('state-changed')
-
- if self._type == DEVICE_TYPE_802_11_WIRELESS:
- if state == DEVICE_STATE_INACTIVE:
- self.set_active_network(None)
- else:
- self.dev.getActiveNetwork(reply_handler=lambda *args: self._get_active_net_cb(state, *args),
- error_handler=self._get_active_net_error_cb)
-
- def set_activation_stage(self, stage):
- if stage == self._act_stage:
- return
- self._act_stage = stage
- if self._valid:
- self.emit('activation-stage-changed')
-
- def get_activation_stage(self):
- return self._act_stage
-
- def get_ssid(self):
- if self._active_network and self._active_network.is_valid():
- return self._active_network.get_ssid()
- elif not self._active_network:
- return None
-
- def get_active_network(self):
- return self._active_network
-
- def get_type(self):
- return self._type
-
- def is_valid(self):
- return self._valid
-
- def set_carrier(self, on):
- self._link = on
-
- def get_capabilities(self):
- return self._caps
-
-class NMClient(gobject.GObject):
- __gsignals__ = {
- 'device-added' : (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT])),
- 'device-activated' : (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT])),
- 'device-activating': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT])),
- 'device-removed' : (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT]))
- }
-
- def __init__(self):
- gobject.GObject.__init__(self)
-
- self.nminfo = None
- self._nm_present = False
- self._update_timer = 0
- self._devices = {}
-
- try:
- self.nminfo = nminfo.NMInfo(self)
- except RuntimeError:
- pass
- self._setup_dbus()
- if self._nm_present:
- self._get_initial_devices()
-
- def get_devices(self):
- return self._devices.values()
-
- def _get_initial_devices_reply_cb(self, ops):
- for op in ops:
- self._add_device(op)
-
- def _dev_initialized_cb(self, dev):
- self.emit('device-added', dev)
-
- def _dev_init_failed_cb(self, dev):
- # Device failed to initialize, likely due to dbus errors or something
- op = dev.get_op()
- self._remove_device(op)
-
- def _get_initial_devices_error_cb(self, err):
- logging.debug("Error updating devices (%s)" % err)
-
- def _get_initial_devices(self):
- self._nm_obj.getDevices(reply_handler=self._get_initial_devices_reply_cb, \
- error_handler=self._get_initial_devices_error_cb)
-
- def _add_device(self, dev_op):
- if self._devices.has_key(dev_op):
- return
- dev = Device(self, dev_op)
- self._devices[dev_op] = dev
- dev.connect('init-failed', self._dev_init_failed_cb)
- dev.connect('initialized', self._dev_initialized_cb)
- dev.connect('state-changed', self._dev_state_changed_cb)
-
- def _remove_device(self, dev_op):
- if not self._devices.has_key(dev_op):
- return
- dev = self._devices[dev_op]
- if dev.is_valid():
- self.emit('device-removed', dev)
- del self._devices[dev_op]
-
- def _dev_state_changed_cb(self, dev):
- op = dev.get_op()
- if not self._devices.has_key(op) or not dev.is_valid():
- return
- if dev.get_state() == DEVICE_STATE_ACTIVATING:
- self.emit('device-activating', dev)
- elif dev.get_state() == DEVICE_STATE_ACTIVATED:
- self.emit('device-activated', dev)
-
- def get_device(self, dev_op):
- if not self._devices.has_key(dev_op):
- return None
- return self._devices[dev_op]
-
- def _setup_dbus(self):
- self._sig_handlers = {
- 'StateChange': self.state_changed_sig_handler,
- 'DeviceAdded': self.device_added_sig_handler,
- 'DeviceRemoved': self.device_removed_sig_handler,
- 'DeviceActivationStage': self.device_activation_stage_sig_handler,
- 'DeviceActivating': self.device_activating_sig_handler,
- 'DeviceNowActive': self.device_now_active_sig_handler,
- 'DeviceNoLongerActive': self.device_no_longer_active_sig_handler,
- 'DeviceActivationFailed': self.device_activation_failed_sig_handler,
- 'DeviceCarrierOn': self.device_carrier_on_sig_handler,
- 'DeviceCarrierOff': self.device_carrier_off_sig_handler,
- 'DeviceStrengthChanged': self.wireless_device_strength_changed_sig_handler,
- 'WirelessNetworkAppeared': self.wireless_network_appeared_sig_handler,
- 'WirelessNetworkDisappeared': self.wireless_network_disappeared_sig_handler,
- 'WirelessNetworkStrengthChanged': self.wireless_network_strength_changed_sig_handler
- }
-
- try:
- self._nm_proxy = sys_bus.get_object(NM_SERVICE, NM_PATH)
- self._nm_obj = dbus.Interface(self._nm_proxy, NM_IFACE)
- except dbus.DBusException, e:
- logging.debug("Could not connect to NetworkManager!")
- self._nm_present = False
- return
-
- sys_bus.add_signal_receiver(self.name_owner_changed_sig_handler,
- signal_name="NameOwnerChanged",
- dbus_interface="org.freedesktop.DBus")
-
- for (signal, handler) in self._sig_handlers.items():
- sys_bus.add_signal_receiver(handler, signal_name=signal, dbus_interface=NM_IFACE)
-
- # Find out whether or not NMI is running
- try:
- bus_object = sys_bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
- name = bus_object.GetNameOwner("org.freedesktop.NetworkManagerInfo", \
- dbus_interface='org.freedesktop.DBus')
- if name:
- self._nm_present = True
- except dbus.DBusException:
- pass
-
- def set_active_device(self, device, network=None, mesh_freq=None, mesh_start=None):
- ssid = ""
- if network:
- ssid = network.get_ssid()
- if device.get_type() == DEVICE_TYPE_802_11_MESH_OLPC:
- if mesh_freq or mesh_start:
- if mesh_freq and not mesh_start:
- self._nm_obj.setActiveDevice(device.get_op(), dbus.Double(mesh_freq))
- elif mesh_start and not mesh_freq:
- self._nm_obj.setActiveDevice(device.get_op(), dbus.Double(0.0), dbus.UInt32(mesh_start))
- else:
- self._nm_obj.setActiveDevice(device.get_op(), dbus.Double(mesh_freq), dbus.UInt32(mesh_start))
- else:
- self._nm_obj.setActiveDevice(device.get_op())
- else:
- self._nm_obj.setActiveDevice(device.get_op(), ssid)
-
- def state_changed_sig_handler(self, new_state):
- logging.debug('NM State Changed to %d' % new_state)
-
- def device_activation_stage_sig_handler(self, device, stage):
- logging.debug('Device Activation Stage "%s" for device %s' % (NM_DEVICE_STAGE_STRINGS[stage], device))
- if not self._devices.has_key(device):
- logging.debug('DeviceActivationStage, device %s does not exist' % (device))
- return
- self._devices[device].set_activation_stage(stage)
-
- def device_activating_sig_handler(self, device):
- logging.debug('DeviceActivating for %s' % (device))
- if not self._devices.has_key(device):
- logging.debug('DeviceActivating, device %s does not exist' % (device))
- return
- self._devices[device].set_state(DEVICE_STATE_ACTIVATING)
-
- def device_now_active_sig_handler(self, device, ssid=None):
- logging.debug('DeviceNowActive for %s' % (device))
- if not self._devices.has_key(device):
- logging.debug('DeviceNowActive, device %s does not exist' % (device))
- return
- self._devices[device].set_state(DEVICE_STATE_ACTIVATED)
-
- def device_no_longer_active_sig_handler(self, device):
- logging.debug('DeviceNoLongerActive for %s' % (device))
- if not self._devices.has_key(device):
- logging.debug('DeviceNoLongerActive, device %s does not exist' % (device))
- return
- self._devices[device].set_state(DEVICE_STATE_INACTIVE)
-
- def device_activation_failed_sig_handler(self, device, ssid=None):
- logging.debug('DeviceActivationFailed for %s' % (device))
- if not self._devices.has_key(device):
- logging.debug('DeviceActivationFailed, device %s does not exist' % (device))
- return
- self._devices[device].set_state(DEVICE_STATE_INACTIVE)
-
- def name_owner_changed_sig_handler(self, name, old, new):
- if name != NM_SERVICE:
- return
- if (old and len(old)) and (not new and not len(new)):
- # NM went away
- self._nm_present = False
- devs = self._devices.keys()
- for op in devs:
- self._remove_device(op)
- self._devices = {}
- elif (not old and not len(old)) and (new and len(new)):
- # NM started up
- self._nm_present = True
- self._get_initial_devices()
-
- def device_added_sig_handler(self, device):
- logging.debug('DeviceAdded for %s' % (device))
- self._add_device(device)
-
- def device_removed_sig_handler(self, device):
- logging.debug('DeviceRemoved for %s' % (device))
- self._remove_device(device)
-
- def wireless_network_appeared_sig_handler(self, device, network):
- if not self._devices.has_key(device):
- return
- self._devices[device].network_appeared(network)
-
- def wireless_network_disappeared_sig_handler(self, device, network):
- if not self._devices.has_key(device):
- return
- self._devices[device].network_disappeared(network)
-
- def wireless_device_strength_changed_sig_handler(self, device, strength):
- if not self._devices.has_key(device):
- return
- self._devices[device].set_strength(strength)
-
- def wireless_network_strength_changed_sig_handler(self, device, network, strength):
- if not self._devices.has_key(device):
- return
- net = self._devices[device].get_network(network)
- if net:
- net.set_strength(strength)
-
- def device_carrier_on_sig_handler(self, device):
- if not self._devices.has_key(device):
- return
- self._devices[device].set_carrier(True)
-
- def device_carrier_off_sig_handler(self, device):
- if not self._devices.has_key(device):
- return
- self._devices[device].set_carrier(False)
diff --git a/src/hardware/nminfo.py b/src/hardware/nminfo.py
deleted file mode 100644
index 3a93120..0000000
--- a/src/hardware/nminfo.py
+++ /dev/null
@@ -1,525 +0,0 @@
-# vi: ts=4 ai noet
-#
-# Copyright (C) 2006-2007 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
-
-import dbus
-import dbus.service
-import time
-import os
-import binascii
-import ConfigParser
-import logging
-
-import nmclient
-import keydialog
-import gtk
-from sugar import env
-
-IW_AUTH_KEY_MGMT_802_1X = 0x1
-IW_AUTH_KEY_MGMT_PSK = 0x2
-
-IW_AUTH_WPA_VERSION_DISABLED = 0x00000001
-IW_AUTH_WPA_VERSION_WPA = 0x00000002
-IW_AUTH_WPA_VERSION_WPA2 = 0x00000004
-
-NM_AUTH_TYPE_WPA_PSK_AUTO = 0x00000000
-IW_AUTH_CIPHER_NONE = 0x00000001
-IW_AUTH_CIPHER_WEP40 = 0x00000002
-IW_AUTH_CIPHER_TKIP = 0x00000004
-IW_AUTH_CIPHER_CCMP = 0x00000008
-IW_AUTH_CIPHER_WEP104 = 0x00000010
-
-IW_AUTH_ALG_OPEN_SYSTEM = 0x00000001
-IW_AUTH_ALG_SHARED_KEY = 0x00000002
-
-NM_INFO_IFACE='org.freedesktop.NetworkManagerInfo'
-NM_INFO_PATH='/org/freedesktop/NetworkManagerInfo'
-
-
-class NoNetworks(dbus.DBusException):
- def __init__(self):
- dbus.DBusException.__init__(self)
- self._dbus_error_name = NM_INFO_IFACE + '.NoNetworks'
-
-class CanceledKeyRequestError(dbus.DBusException):
- def __init__(self):
- dbus.DBusException.__init__(self)
- self._dbus_error_name = NM_INFO_IFACE + '.CanceledError'
-
-
-class NetworkInvalidError(Exception):
- pass
-
-
-class NMConfig(ConfigParser.ConfigParser):
- def get_bool(self, section, name):
- opt = self.get(section, name)
- if type(opt) == type(""):
- if opt.lower() == 'yes' or opt.lower() == 'true':
- return True
- elif opt.lower() == 'no' or opt.lower() == 'false':
- return False
- raise ValueError("Invalid format for %s/%s. Should be one of [yes, no, true, false]." % (section, name))
-
- def get_list(self, section, name):
- opt = self.get(section, name)
- if type(opt) == type(""):
- if not len(opt):
- return []
- try:
- return opt.split()
- except Exception:
- pass
- raise ValueError("Invalid format for %s/%s. Should be a space-separate list." % (section, name))
-
- def get_int(self, section, name):
- opt = self.get(section, name)
- try:
- return int(opt)
- except Exception:
- pass
- raise ValueError("Invalid format for %s/%s. Should be a valid integer." % (section, name))
-
- def get_float(self, section, name):
- opt = self.get(section, name)
- try:
- return float(opt)
- except Exception:
- pass
- raise ValueError("Invalid format for %s/%s. Should be a valid float." % (section, name))
-
-
-NETWORK_TYPE_UNKNOWN = 0
-NETWORK_TYPE_ALLOWED = 1
-NETWORK_TYPE_INVALID = 2
-
-
-class Security(object):
- def __init__(self, we_cipher):
- self._we_cipher = we_cipher
-
- def read_from_config(self, cfg, name):
- pass
-
- def read_from_args(self, args):
- pass
-
- def new_from_config(cfg, name):
- security = None
- we_cipher = cfg.get_int(name, "we_cipher")
- if we_cipher == IW_AUTH_CIPHER_NONE:
- security = Security(we_cipher)
- elif we_cipher == IW_AUTH_CIPHER_WEP40 or we_cipher == IW_AUTH_CIPHER_WEP104:
- security = WEPSecurity(we_cipher)
- elif we_cipher == NM_AUTH_TYPE_WPA_PSK_AUTO or we_cipher == IW_AUTH_CIPHER_CCMP or we_cipher == IW_AUTH_CIPHER_TKIP:
- security = WPASecurity(we_cipher)
- else:
- raise ValueError("Unsupported security combo")
- security.read_from_config(cfg, name)
- return security
- new_from_config = staticmethod(new_from_config)
-
- def new_from_args(we_cipher, args):
- security = None
- try:
- if we_cipher == IW_AUTH_CIPHER_NONE:
- security = Security(we_cipher)
- elif we_cipher == IW_AUTH_CIPHER_WEP40 or we_cipher == IW_AUTH_CIPHER_WEP104:
- security = WEPSecurity(we_cipher)
- elif we_cipher == NM_AUTH_TYPE_WPA_PSK_AUTO or we_cipher == IW_AUTH_CIPHER_CCMP or we_cipher == IW_AUTH_CIPHER_TKIP:
- security = WPASecurity(we_cipher)
- else:
- raise ValueError("Unsupported security combo")
- security.read_from_args(args)
- except ValueError, e:
- logging.debug("Error reading security information: %s" % e)
- del security
- return None
- return security
- new_from_args = staticmethod(new_from_args)
-
- def get_properties(self):
- return [dbus.Int32(self._we_cipher)]
-
- def write_to_config(self, section, config):
- config.set(section, "we_cipher", self._we_cipher)
-
-
-class WEPSecurity(Security):
- def read_from_args(self, args):
- if len(args) != 2:
- raise ValueError("not enough arguments")
- key = args[0]
- auth_alg = args[1]
- if isinstance(key, unicode):
- key = key.encode()
- if not isinstance(key, str):
- raise ValueError("wrong argument type for key")
- if not isinstance(auth_alg, int):
- raise ValueError("wrong argument type for auth_alg")
- self._key = key
- self._auth_alg = auth_alg
-
- def read_from_config(self, cfg, name):
- # Key should be a hex encoded string
- self._key = cfg.get(name, "key")
- if self._we_cipher == IW_AUTH_CIPHER_WEP40 and len(self._key) != 10:
- raise ValueError("Key length not right for 40-bit WEP")
- if self._we_cipher == IW_AUTH_CIPHER_WEP104 and len(self._key) != 26:
- raise ValueError("Key length not right for 104-bit WEP")
-
- try:
- a = binascii.a2b_hex(self._key)
- except TypeError:
- raise ValueError("Key was not a hexadecimal string.")
-
- self._auth_alg = cfg.get_int(name, "auth_alg")
- if self._auth_alg != IW_AUTH_ALG_OPEN_SYSTEM and self._auth_alg != IW_AUTH_ALG_SHARED_KEY:
- raise ValueError("Invalid authentication algorithm %d" % self._auth_alg)
-
- def get_properties(self):
- args = Security.get_properties(self)
- args.append(dbus.String(self._key))
- args.append(dbus.Int32(self._auth_alg))
- return args
-
- def write_to_config(self, section, config):
- Security.write_to_config(self, section, config)
- config.set(section, "key", self._key)
- config.set(section, "auth_alg", self._auth_alg)
-
-class WPASecurity(Security):
- def read_from_args(self, args):
- if len(args) != 3:
- raise ValueError("not enough arguments")
- key = args[0]
- if isinstance(key, unicode):
- key = key.encode()
- if not isinstance(key, str):
- raise ValueError("wrong argument type for key")
-
- wpa_ver = args[1]
- if not isinstance(wpa_ver, int):
- raise ValueError("wrong argument type for WPA version")
-
- key_mgmt = args[2]
- if not isinstance(key_mgmt, int):
- raise ValueError("wrong argument type for WPA key management")
- if not key_mgmt & IW_AUTH_KEY_MGMT_PSK:
- raise ValueError("Key management types other than PSK are not supported")
-
- self._key = key
- self._wpa_ver = wpa_ver
- self._key_mgmt = key_mgmt
-
- def read_from_config(self, cfg, name):
- # Key should be a hex encoded string
- self._key = cfg.get(name, "key")
- if len(self._key) != 64:
- raise ValueError("Key length not right for WPA-PSK")
-
- try:
- a = binascii.a2b_hex(self._key)
- except TypeError:
- raise ValueError("Key was not a hexadecimal string.")
-
- self._wpa_ver = cfg.get_int(name, "wpa_ver")
- if self._wpa_ver != IW_AUTH_WPA_VERSION_WPA and self._wpa_ver != IW_AUTH_WPA_VERSION_WPA2:
- raise ValueError("Invalid WPA version %d" % self._wpa_ver)
-
- self._key_mgmt = cfg.get_int(name, "key_mgmt")
- if not self._key_mgmt & IW_AUTH_KEY_MGMT_PSK:
- raise ValueError("Invalid WPA key management option %d" % self._key_mgmt)
-
- def get_properties(self):
- args = Security.get_properties(self)
- args.append(dbus.String(self._key))
- args.append(dbus.Int32(self._wpa_ver))
- args.append(dbus.Int32(self._key_mgmt))
- return args
-
- def write_to_config(self, section, config):
- Security.write_to_config(self, section, config)
- config.set(section, "key", self._key)
- config.set(section, "wpa_ver", self._wpa_ver)
- config.set(section, "key_mgmt", self._key_mgmt)
-
-
-class Network:
- def __init__(self, ssid):
- self.ssid = ssid
- self.timestamp = int(time.time())
- self.bssids = []
- self.we_cipher = 0
- self._security = None
-
- def get_properties(self):
- bssid_list = dbus.Array([], signature="s")
- for item in self.bssids:
- bssid_list.append(dbus.String(item))
- args = [dbus.String(self.ssid), dbus.Int32(self.timestamp), dbus.Boolean(True), bssid_list]
- args += self._security.get_properties()
- return tuple(args)
-
- def get_security(self):
- return self._security.get_properties()
-
- def set_security(self, security):
- self._security = security
-
- def read_from_args(self, auto, bssid, we_cipher, args):
- if auto == False:
- self.timestamp = int(time.time())
- if not bssid in self.bssids:
- self.bssids.append(bssid)
-
- self._security = Security.new_from_args(we_cipher, args)
- if not self._security:
- raise NetworkInvalidError("Invalid security information")
-
- def read_from_config(self, config):
- try:
- self.timestamp = config.get_int(self.ssid, "timestamp")
- except (ConfigParser.NoOptionError, ValueError), e:
- raise NetworkInvalidError(e)
-
- try:
- self._security = Security.new_from_config(config, self.ssid)
- except Exception, e:
- raise NetworkInvalidError(e)
-
- # The following don't need to be present
- try:
- self.bssids = config.get_list(self.ssid, "bssids")
- except (ConfigParser.NoOptionError, ValueError), e:
- pass
-
- def write_to_config(self, config):
- try:
- config.add_section(self.ssid)
- config.set(self.ssid, "timestamp", self.timestamp)
- if len(self.bssids) > 0:
- opt = " "
- opt.join(self.bssids)
- config.set(self.ssid, "bssids", opt)
- self._security.write_to_config(self.ssid, config)
- except Exception, e:
- logging.debug("Error writing '%s': %s" % (self.ssid, e))
-
-
-class NotFoundError(dbus.DBusException):
- pass
-class UnsupportedError(dbus.DBusException):
- pass
-
-class NMInfoDBusServiceHelper(dbus.service.Object):
- def __init__(self, parent):
- self._parent = parent
- bus = dbus.SystemBus()
-
- # If NMI is already around, don't grab the NMI service
- bus_object = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
- name = None
- try:
- name = bus_object.GetNameOwner("org.freedesktop.NetworkManagerInfo", \
- dbus_interface='org.freedesktop.DBus')
- except dbus.DBusException:
- pass
- if name:
- logging.debug("NMI service already owned by %s, won't claim it." % name)
- raise RuntimeError
-
- bus_name = dbus.service.BusName(NM_INFO_IFACE, bus=bus)
- dbus.service.Object.__init__(self, bus_name, NM_INFO_PATH)
-
- @dbus.service.method(NM_INFO_IFACE, in_signature='i', out_signature='as')
- def getNetworks(self, net_type):
- ssids = self._parent.get_networks(net_type)
- if len(ssids) > 0:
- return dbus.Array(ssids)
-
- raise NoNetworks()
-
- @dbus.service.method(NM_INFO_IFACE, in_signature='si', async_callbacks=('async_cb', 'async_err_cb'))
- def getNetworkProperties(self, ssid, net_type, async_cb, async_err_cb):
- self._parent.get_network_properties(ssid, net_type, async_cb, async_err_cb)
-
- @dbus.service.method(NM_INFO_IFACE)
- def updateNetworkInfo(self, ssid, bauto, bssid, cipher, *args):
- self._parent.update_network_info(ssid, bauto, bssid, cipher, args)
-
- @dbus.service.method(NM_INFO_IFACE, async_callbacks=('async_cb', 'async_err_cb'))
- def getKeyForNetwork(self, dev_path, net_path, ssid, attempt, new_key, async_cb, async_err_cb):
- self._parent.get_key_for_network(dev_path, net_path, ssid,
- attempt, new_key, async_cb, async_err_cb)
-
- @dbus.service.method(NM_INFO_IFACE)
- def cancelGetKeyForNetwork(self):
- self._parent.cancel_get_key_for_network()
-
-class NMInfo(object):
- def __init__(self, client):
- profile_path = env.get_profile_path()
- self._cfg_file = os.path.join(profile_path, "nm", "networks.cfg")
- self._nmclient = client
- self._allowed_networks = self._read_config()
- self._dbus_helper = NMInfoDBusServiceHelper(self)
- self._key_dialog = None
-
- def save_config(self):
- self._write_config(self._allowed_networks)
-
- def _read_config(self):
- if not os.path.exists(os.path.dirname(self._cfg_file)):
- os.makedirs(os.path.dirname(self._cfg_file), 0755)
- if not os.path.exists(self._cfg_file):
- self._write_config({})
- return {}
-
- config = NMConfig()
- config.read(self._cfg_file)
- networks = {}
- for name in config.sections():
- try:
- net = Network(name)
- net.read_from_config(config)
- networks[name] = net
- except Exception, e:
- logging.error("Error when processing config for the network %s: %r" % (name, e))
-
- del config
- return networks
-
- def _write_config(self, networks):
- fp = open(self._cfg_file, 'w')
- config = NMConfig()
- for net in networks.values():
- net.write_to_config(config)
- config.write(fp)
- fp.close()
- del config
-
- def get_networks(self, net_type):
- if net_type != NETWORK_TYPE_ALLOWED:
- raise ValueError("Bad network type")
- nets = []
- for net in self._allowed_networks.values():
- nets.append(net.ssid)
- logging.debug("Returning networks: %s" % nets)
- return nets
-
- def get_network_properties(self, ssid, net_type, async_cb, async_err_cb):
- if not isinstance(ssid, unicode):
- async_err_cb(ValueError("Invalid arguments; ssid must be unicode."))
- if net_type != NETWORK_TYPE_ALLOWED:
- async_err_cb(ValueError("Bad network type"))
- if not self._allowed_networks.has_key(ssid):
- async_err_cb(NotFoundError("Network '%s' not found." % ssid))
- network = self._allowed_networks[ssid]
- props = network.get_properties()
-
- # DBus workaround: the normal method return handler wraps
- # the returned arguments in a tuple and then converts that to a
- # struct, but NetworkManager expects a plain list of arguments.
- # It turns out that the async callback method return code _doesn't_
- # wrap the returned arguments in a tuple, so as a workaround use
- # the async callback stuff here even though we're not doing it
- # asynchronously.
- async_cb(*props)
-
- def update_network_info(self, ssid, auto, bssid, we_cipher, args):
- if not isinstance(ssid, unicode):
- raise ValueError("Invalid arguments; ssid must be unicode.")
- if self._allowed_networks.has_key(ssid):
- del self._allowed_networks[ssid]
- net = Network(ssid)
- try:
- net.read_from_args(auto, bssid, we_cipher, args)
- logging.debug("Updated network information for '%s'." % ssid)
- self._allowed_networks[ssid] = net
- self.save_config()
- except NetworkInvalidError, e:
- logging.debug("Error updating network information: %s" % e)
- del net
-
- def get_key_for_network(self, dev_op, net_op, ssid, attempt, new_key, async_cb, async_err_cb):
- if not isinstance(ssid, unicode):
- raise ValueError("Invalid arguments; ssid must be unicode.")
- if self._allowed_networks.has_key(ssid) and not new_key:
- # We've got the info already
- net = self._allowed_networks[ssid]
- async_cb(tuple(net.get_security()))
- return
-
- # Otherwise, ask the user for it
- net = None
- dev = self._nmclient.get_device(dev_op)
- if not dev:
- async_err_cb(NotFoundError("Device was unknown."))
- return
-
- if dev.get_type() == nmclient.DEVICE_TYPE_802_3_ETHERNET:
- # We don't support wired 802.1x yet...
- async_err_cb(UnsupportedError("Device type is unsupported by NMI."))
- return
-
- net = dev.get_network(net_op)
- if not net:
- async_err_cb(NotFoundError("Network was unknown."))
- return
-
- self._key_dialog = keydialog.new_key_dialog(net, async_cb, async_err_cb)
- self._key_dialog.connect("response", self._key_dialog_response_cb)
- self._key_dialog.connect("destroy", self._key_dialog_destroy_cb)
- self._key_dialog.show_all()
-
- def _key_dialog_destroy_cb(self, widget, foo=None):
- if widget != self._key_dialog:
- return
- self._key_dialog_response_cb(widget, gtk.RESPONSE_CANCEL)
-
- def _key_dialog_response_cb(self, widget, response_id):
- if widget != self._key_dialog:
- return
-
- (async_cb, async_err_cb) = self._key_dialog.get_callbacks()
- net = self._key_dialog.get_network()
- security = None
- if response_id == gtk.RESPONSE_OK:
- security = self._key_dialog.create_security()
- self._key_dialog = None
- widget.destroy()
-
- if response_id in [gtk.RESPONSE_CANCEL, gtk.RESPONSE_NONE]:
- # key dialog dialog was canceled; send the error back to NM
- async_err_cb(CanceledKeyRequestError())
- elif response_id == gtk.RESPONSE_OK:
- if not security:
- raise RuntimeError("Invalid security arguments.")
- props = security.get_properties()
- a = tuple(props)
- async_cb(*a)
- else:
- raise RuntimeError("Unhandled key dialog response %d" % response_id)
-
- def cancel_get_key_for_network(self):
- # Close the wireless key dialog and just have it return
- # with the 'canceled' argument set to true
- if not self._key_dialog:
- return
- self._key_dialog_destroy_cb(self._key_dialog)
-
diff --git a/src/hardware/schoolserver.py b/src/hardware/schoolserver.py
deleted file mode 100644
index 68d14f7..0000000
--- a/src/hardware/schoolserver.py
+++ /dev/null
@@ -1,45 +0,0 @@
-from sugar.profile import get_profile
-from xmlrpclib import ServerProxy, Error
-import sys
-import os
-
-REGISTER_URL = 'http://schoolserver:8080/'
-
-def register_laptop(url=REGISTER_URL):
- if not have_ofw_tree():
- return False
-
- sn = read_ofw('mfg-data/SN')
- uuid = read_ofw('mfg-data/U#')
- sn = sn or 'SHF00000000'
- uuid = uuid or '00000000-0000-0000-0000-000000000000'
-
- profile = get_profile()
-
- try:
- server = ServerProxy(url)
- data = server.register(sn, profile.nick_name, uuid, profile.pubkey)
- if data['success'] != 'OK':
- print >> sys.stderr, "Error registering laptop: " + data['error']
- return False
-
- profile.jabber_server = data['jabberserver']
- profile.backup1 = data['backupurl']
- profile.save()
- except Error, e:
- print >> sys.stderr, "Error registering laptop: " + str(e)
- return False
-
- return True
-
-def have_ofw_tree():
- return os.path.exists('/ofw')
-
-def read_ofw(path):
- path = os.path.join('/ofw', path)
- if not os.path.exists(path):
- return None
- fh = open(path, 'r')
- data = fh.read().rstrip('\0\n')
- fh.close()
- return data
diff --git a/src/intro/Makefile.am b/src/intro/Makefile.am
deleted file mode 100644
index 3b92ea0..0000000
--- a/src/intro/Makefile.am
+++ /dev/null
@@ -1,10 +0,0 @@
-imagedir = $(pkgdatadir)/shell/intro
-image_DATA = default-picture.png
-
-EXTRA_DIST = $(conf_DATA) $(image_DATA)
-sugardir = $(pkgdatadir)/shell/intro
-sugar_PYTHON = \
- __init__.py \
- colorpicker.py \
- intro.py \
- glive.py
diff --git a/src/intro/__init__.py b/src/intro/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/src/intro/__init__.py
+++ /dev/null
diff --git a/src/intro/colorpicker.py b/src/intro/colorpicker.py
deleted file mode 100644
index 90dbc26..0000000
--- a/src/intro/colorpicker.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (C) 2007, 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
-
-import hippo
-
-from sugar.graphics.icon import CanvasIcon
-from sugar.graphics import style
-from sugar.graphics.xocolor import XoColor
-
-class ColorPicker(hippo.CanvasBox, hippo.CanvasItem):
- def __init__(self, **kwargs):
- hippo.CanvasBox.__init__(self, **kwargs)
- self.props.orientation = hippo.ORIENTATION_HORIZONTAL
-
- self._xo = CanvasIcon(size=style.XLARGE_ICON_SIZE,
- icon_name='computer-xo')
- self._set_random_colors()
- self._xo.connect('activated', self._xo_activated_cb)
- self.append(self._xo)
-
- def _xo_activated_cb(self, item):
- self._set_random_colors()
-
- def get_color(self):
- return self._xo_color
-
- def _set_random_colors(self):
- self._xo_color = XoColor()
- self._xo.props.xo_color = self._xo_color
diff --git a/src/intro/default-picture.png b/src/intro/default-picture.png
deleted file mode 100644
index e26b9b0..0000000
--- a/src/intro/default-picture.png
+++ /dev/null
Binary files differ
diff --git a/src/intro/glive.py b/src/intro/glive.py
deleted file mode 100644
index a875e48..0000000
--- a/src/intro/glive.py
+++ /dev/null
@@ -1,196 +0,0 @@
-# -*- Mode: Python -*-
-# vi:si:et:sw=4:sts=4:ts=4
-
-import gtk
-import pygtk
-pygtk.require('2.0')
-import sys
-
-import pygst
-pygst.require('0.10')
-import gst
-import gst.interfaces
-
-import gobject
-gobject.threads_init()
-
-class Glive(gobject.GObject):
- __gsignals__ = {
- 'new-picture': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])),
- 'sink': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT]))
- }
-
- def __init__(self, parent, width, height):
- gobject.GObject.__init__(self)
- self._parent = parent
-
- #check out the halfpipe, d00d.
- self.pipeline = gst.Pipeline()
-
- self.v4l2src = gst.element_factory_make("v4l2src", "v4l2src")
- self.t = gst.element_factory_make("tee", "tee")
- self.t_src_pad = self.t.get_request_pad( "src%d" )
- self.vscale = gst.element_factory_make("videoscale", "videoscale")
- self.ximagesink = gst.element_factory_make("ximagesink", "ximagesink")
-
- self.pipeline.add(self.v4l2src)
- self.pipeline.add(self.t)
- self.pipeline.add(self.vscale)
- self.pipeline.add(self.ximagesink)
-
- self.v4l2src.link(self.t)
-
- videoscale_structure = gst.Structure("video/x-raw-rgb")
- videoscale_structure['width'] = width
- videoscale_structure['height'] = height
- videoscale_structure['bpp'] = 16
- videoscale_structure['depth'] = 16
- videoscale_caps = gst.Caps(videoscale_structure)
- self.t_src_pad.link(self.vscale.get_pad("sink"))
- self.vscale.link(self.ximagesink, videoscale_caps)
- #self.vscale.link(self.ximagesink)
-
- self.queue = gst.element_factory_make("queue", "queue")
- self.queue.set_property("leaky", True)
- self.queue.set_property("max-size-buffers", 1)
- self.qsrc = self.queue.get_pad( "src" )
- self.qsink = self.queue.get_pad("sink")
- self.ffmpeg = gst.element_factory_make("ffmpegcolorspace", "ffmpegcolorspace")
- self.jpgenc = gst.element_factory_make("jpegenc", "jpegenc")
- self.filesink = gst.element_factory_make("fakesink", "fakesink")
- self.filesink.connect( "handoff", self.copyframe )
- self.filesink.set_property("signal-handoffs", True)
- self.pipeline.add(self.queue, self.ffmpeg, self.jpgenc, self.filesink)
-
- #only link at snapshot time
- #self.t.link(self.queue)
- self.queue.link(self.ffmpeg)
- self.ffmpeg.link(self.jpgenc)
- self.jpgenc.link(self.filesink)
- self.exposureOpen = False
-
- self._bus = self.pipeline.get_bus()
- self._CONNECT_SYNC = -1
- self._CONNECT_MSG = -1
- self.doPostBusStuff()
-
- def copyframe(self, fsink, buffer, pad, user_data=None):
- #for some reason, we get two back to back buffers, even though we
- #ask for only one.
- if (self.exposureOpen):
- self.exposureOpen = False
- piccy = gtk.gdk.pixbuf_loader_new_with_mime_type("image/jpeg")
- piccy.write( buffer )
- piccy.close()
- pixbuf = piccy.get_pixbuf()
- del piccy
-
- self.t.unlink(self.queue)
- self.queue.set_property("leaky", True)
-
- gobject.idle_add(self.loadPic, pixbuf)
-
- def loadPic( self, pixbuf ):
- self.emit('new-picture', pixbuf)
-
- def takeSnapshot( self ):
- if (self.exposureOpen):
- return
- else:
- self.exposureOpen = True
- self.t.link(self.queue)
-
- def doPostBusStuff(self):
- self._bus.enable_sync_message_emission()
- self._bus.add_signal_watch()
- self._CONNECT_SYNC = self._bus.connect('sync-message::element', self.on_sync_message)
- self._CONNECT_MSG = self._bus.connect('message', self.on_message)
-
- def on_sync_message(self, bus, message):
- if message.structure is None:
- return
- if message.structure.get_name() == 'prepare-xwindow-id':
- self.emit('sink', message.src)
- message.src.set_property('force-aspect-ratio', True)
-
- def on_message(self, bus, message):
- t = message.type
- if (t == gst.MESSAGE_ERROR):
- err, debug = message.parse_error()
- if (self.on_eos):
- self.on_eos()
- self._playing = False
- elif (t == gst.MESSAGE_EOS):
- if (self.on_eos):
- self.on_eos()
- self._playing = False
-
- def on_eos( self ):
- pass
-
- def stop(self):
- self.pipeline.set_state(gst.STATE_NULL)
-
- def play(self):
- self.pipeline.set_state(gst.STATE_PLAYING)
-
- def pause(self):
- self.pipeline.set_state(gst.STATE_PAUSED)
-
-
-class LiveVideoSlot(gtk.EventBox):
- __gsignals__ = {
- 'pixbuf': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])),
- }
-
- def __init__(self, width, height):
- gtk.EventBox.__init__(self)
-
- self.imagesink = None
- self.playa = None
- self._width = width
- self._height = height
-
- self.unset_flags(gtk.DOUBLE_BUFFERED)
- self.connect('focus-in-event', self.focus_in)
- self.connect('focus-out-event', self.focus_out)
- self.connect("button-press-event", self._button_press_event_cb)
- self.connect("expose-event", self._expose_event_cb)
-
- def _expose_event_cb(self, widget, event):
- if not self.playa:
- self.playa = Glive(self, self._width, self._height)
- self.playa.connect('new-picture', self._new_picture_cb)
- self.playa.connect('sink', self._new_sink_cb)
-
- def _new_picture_cb(self, playa, pixbuf):
- self.emit('pixbuf', pixbuf)
-
- def _new_sink_cb(self, playa, sink):
- if (self.imagesink != None):
- assert self.window.xid
- self.imagesink = None
- del self.imagesink
- self.imagesink = sink
- self.imagesink.set_xwindow_id(self.window.xid)
-
- def _button_press_event_cb(self, widget, event):
- self.takeSnapshot()
-
- def focus_in(self, widget, event, args=None):
- self.play()
-
- def focus_out(self, widget, event, args=None):
- self.stop()
-
- def play( self ):
- self.playa.play()
-
- def pause( self ):
- self.playa.pause()
-
- def stop( self ):
- self.playa.stop()
-
- def takeSnapshot( self ):
- self.playa.takeSnapshot()
diff --git a/src/intro/intro.py b/src/intro/intro.py
deleted file mode 100644
index 1bd46c7..0000000
--- a/src/intro/intro.py
+++ /dev/null
@@ -1,267 +0,0 @@
-# Copyright (C) 2007, 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
-
-import os
-from ConfigParser import ConfigParser
-from gettext import gettext as _
-
-import gtk
-import gobject
-import dbus
-import hippo
-import logging
-
-from sugar import env
-from sugar.graphics import style
-from sugar.graphics.icon import Icon
-from sugar.graphics.entry import CanvasEntry
-from sugar.profile import get_profile
-
-import colorpicker
-
-_BACKGROUND_COLOR = style.COLOR_PANEL_GREY
-
-class _Page(hippo.CanvasBox):
- __gproperties__ = {
- 'valid' : (bool, None, None, False,
- gobject.PARAM_READABLE)
- }
-
- def __init__(self, **kwargs):
- hippo.CanvasBox.__init__(self, **kwargs)
- self.valid = False
-
- def set_valid(self, valid):
- self.valid = valid
- self.notify('valid')
-
- def do_get_property(self, pspec):
- if pspec.name == 'valid':
- return self.valid
-
- def activate(self):
- pass
-
-class _NamePage(_Page):
- def __init__(self, intro):
- _Page.__init__(self, xalign=hippo.ALIGNMENT_CENTER,
- background_color=_BACKGROUND_COLOR.get_int(),
- spacing=style.DEFAULT_SPACING,
- orientation=hippo.ORIENTATION_HORIZONTAL,)
-
- self._intro = intro
-
- label = hippo.CanvasText(text=_("Name:"))
- self.append(label)
-
- self._entry = CanvasEntry(box_width=style.zoom(300))
- self._entry.set_background(_BACKGROUND_COLOR.get_html())
- self._entry.connect('notify::text', self._text_changed_cb)
-
- widget = self._entry.props.widget
- widget.set_max_length(45)
-
- self.append(self._entry)
-
- def _text_changed_cb(self, entry, pspec):
- valid = len(entry.props.text.strip()) > 0
- self.set_valid(valid)
-
- def get_name(self):
- return self._entry.props.text
-
- def activate(self):
- self._entry.props.widget.grab_focus()
-
-class _ColorPage(_Page):
- def __init__(self, **kwargs):
- _Page.__init__(self, xalign=hippo.ALIGNMENT_CENTER,
- background_color=_BACKGROUND_COLOR.get_int(),
- spacing=style.DEFAULT_SPACING,
- yalign=hippo.ALIGNMENT_CENTER, **kwargs)
-
- self._label = hippo.CanvasText(text=_("Click to change color:"),
- xalign=hippo.ALIGNMENT_CENTER)
- self.append(self._label)
-
- self._cp = colorpicker.ColorPicker(xalign=hippo.ALIGNMENT_CENTER)
- self.append(self._cp)
-
- self._color = self._cp.get_color()
- self.set_valid(True)
-
- def get_color(self):
- return self._cp.get_color()
-
-class _IntroBox(hippo.CanvasBox):
- __gsignals__ = {
- 'done': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT,
- gobject.TYPE_PYOBJECT]))
- }
-
- PAGE_NAME = 0
- PAGE_COLOR = 1
-
- PAGE_FIRST = PAGE_NAME
- PAGE_LAST = PAGE_COLOR
-
- def __init__(self):
- hippo.CanvasBox.__init__(self, padding=style.zoom(30),
- background_color=_BACKGROUND_COLOR.get_int())
-
- self._page = self.PAGE_NAME
- self._name_page = _NamePage(self)
- self._color_page = _ColorPage()
- self._current_page = None
-
- self._setup_page()
-
- def _setup_page(self):
- self.remove_all()
-
- if self._page == self.PAGE_NAME:
- self._current_page = self._name_page
- elif self._page == self.PAGE_COLOR:
- self._current_page = self._color_page
-
- self.append(self._current_page, hippo.PACK_EXPAND)
-
- button_box = hippo.CanvasBox(orientation=hippo.ORIENTATION_HORIZONTAL)
-
- if self._page != self.PAGE_FIRST:
- back_button = hippo.CanvasButton(text=_('Back'))
- image = Icon(icon_name='go-left')
- back_button.props.widget.set_image(image)
- back_button.connect('activated', self._back_activated_cb)
- button_box.append(back_button)
-
- spacer = hippo.CanvasBox()
- button_box.append(spacer, hippo.PACK_EXPAND)
-
- self._next_button = hippo.CanvasButton()
- image = Icon(icon_name='go-right')
- self._next_button.props.widget.set_image(image)
-
- if self._page == self.PAGE_LAST:
- self._next_button.props.text = _('Done')
- self._next_button.connect('activated', self._done_activated_cb)
- else:
- self._next_button.props.text = _('Next')
- self._next_button.connect('activated', self._next_activated_cb)
-
- self._current_page.activate()
-
- self._update_next_button()
- button_box.append(self._next_button)
-
- self._current_page.connect('notify::valid',
- self._page_valid_changed_cb)
- self.append(button_box)
-
- def _update_next_button(self):
- widget = self._next_button.props.widget
- widget.props.sensitive = self._current_page.props.valid
-
- def _page_valid_changed_cb(self, page, pspec):
- self._update_next_button()
-
- def _back_activated_cb(self, item):
- self.back()
-
- def back(self):
- if self._page != self.PAGE_FIRST:
- self._page -= 1
- self._setup_page()
-
- def _next_activated_cb(self, item):
- self.next()
-
- def next(self):
- if self._page == self.PAGE_LAST:
- self.done()
- if self._current_page.props.valid:
- self._page += 1
- self._setup_page()
-
- def _done_activated_cb(self, item):
- self.done()
-
- def done(self):
- path = os.path.join(os.path.dirname(__file__), 'default-picture.png')
- pixbuf = gtk.gdk.pixbuf_new_from_file(path)
- name = self._name_page.get_name()
- color = self._color_page.get_color()
-
- self.emit('done', pixbuf, name, color)
-
- def _key_press_cb(self, widget, event):
- if gtk.gdk.keyval_name(event.keyval) == "Return":
- self.next()
- return True
- elif gtk.gdk.keyval_name(event.keyval) == "Escape":
- self.back()
- return True
- return False
-
-class IntroWindow(gtk.Window):
- def __init__(self):
- gtk.Window.__init__(self)
-
- self._canvas = hippo.Canvas()
- self._intro_box = _IntroBox()
- self._intro_box.connect('done', self._done_cb)
- self._canvas.set_root(self._intro_box)
-
- self.add(self._canvas)
- self._canvas.show()
- self.connect('key-press-event', self._intro_box._key_press_cb)
-
- def _done_cb(self, box, pixbuf, name, color):
- self.hide()
- gobject.idle_add(self._create_profile, pixbuf, name, color)
-
- def _create_profile(self, pixbuf, name, color):
- # Save the buddy icon
- icon_path = os.path.join(env.get_profile_path(), "buddy-icon.jpg")
- scaled = pixbuf.scale_simple(200, 200, gtk.gdk.INTERP_BILINEAR)
- pixbuf.save(icon_path, "jpeg", {"quality":"85"})
-
- profile = get_profile()
- profile.nick_name = name
- profile.color = color
- profile.save()
-
- # Generate keypair
- import commands
- keypath = os.path.join(env.get_profile_path(), "owner.key")
- if not os.path.isfile(keypath):
- cmd = "ssh-keygen -q -t dsa -f %s -C '' -N ''" % keypath
- (s, o) = commands.getstatusoutput(cmd)
- if s != 0:
- logging.error("Could not generate key pair: %d" % s)
- else:
- logging.error("Keypair exists, skip generation.")
-
- gtk.main_quit()
- return False
-
-
-if __name__ == "__main__":
- w = IntroWindow()
- w.show()
- w.connect('destroy', gtk.main_quit)
- gtk.main()
diff --git a/src/logsmanager.py b/src/logsmanager.py
deleted file mode 100644
index caa50d2..0000000
--- a/src/logsmanager.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright (C) 2007 Red Hat, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-import os
-import time
-
-from sugar import env
-
-_MAX_BACKUP_DIRS = 3
-
-def setup():
- logs_dir = env.get_logs_path()
- if not os.path.isdir(logs_dir):
- os.makedirs(logs_dir)
-
- backup_logs = []
- backup_dirs = []
- for f in os.listdir(logs_dir):
- path = os.path.join(logs_dir, f)
- if os.path.isfile(path):
- backup_logs.append(f)
- elif os.path.isdir(path):
- backup_dirs.append(path)
-
- if len(backup_dirs) > _MAX_BACKUP_DIRS:
- backup_dirs.sort()
- root = backup_dirs[0]
- for f in os.listdir(root):
- os.remove(os.path.join(root, f))
- os.rmdir(root)
-
- if len(backup_logs) > 0:
- name = str(int(time.time()))
- backup_dir = os.path.join(logs_dir, name)
- os.mkdir(backup_dir)
- for log in backup_logs:
- source_path = os.path.join(logs_dir, log)
- dest_path = os.path.join(backup_dir, log)
- os.rename(source_path, dest_path)
-
diff --git a/src/main.py b/src/main.py
deleted file mode 100644
index e785707..0000000
--- a/src/main.py
+++ /dev/null
@@ -1,153 +0,0 @@
-# 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
-
-import sys
-import os
-from ConfigParser import ConfigParser
-import gettext
-
-# HACK we need to import numpy before gtk otherwise we traceback in
-# some locales. See http://dev.laptop.org/ticket/5559.
-import numpy
-
-import pygtk
-pygtk.require('2.0')
-import gtk
-import gobject
-
-from sugar import env
-from sugar import logger
-from sugar.profile import get_profile
-
-from view.Shell import Shell
-from model.shellmodel import ShellModel
-from shellservice import ShellService
-from hardware import hardwaremanager
-from intro import intro
-import logsmanager
-import config
-
-def _start_matchbox():
- cmd = ['matchbox-window-manager']
-
- cmd.extend(['-use_titlebar', 'no'])
- cmd.extend(['-theme', 'sugar'])
- cmd.extend(['-kbdconfig', os.path.join(config.data_path, 'kbdconfig')])
-
- gobject.spawn_async(cmd, flags=gobject.SPAWN_SEARCH_PATH)
-
-def _save_session_info():
- # Save our DBus Session Bus address somewhere it can be found
- #
- # WARNING!!! this is going away at some near future point, do not rely on it
- #
- session_info_file = os.path.join(env.get_profile_path(), "session.info")
- f = open(session_info_file, "w")
-
- cp = ConfigParser()
- cp.add_section('Session')
- cp.set('Session', 'dbus_address', os.environ['DBUS_SESSION_BUS_ADDRESS'])
- cp.set('Session', 'display', gtk.gdk.display_get_default().get_name())
- cp.write(f)
-
- f.close()
-
-def _setup_translations():
- locale_path = os.path.join(config.prefix, 'share', 'locale')
- domain = 'sugar'
-
- gettext.bindtextdomain(domain, locale_path)
- gettext.textdomain(domain)
-
-def check_cm(bus_name):
- try:
- import dbus
- bus = dbus.SessionBus()
- bus_object = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
- name = bus_object.GetNameOwner(bus_name, dbus_interface='org.freedesktop.DBus')
- if name:
- return True
- except dbus.DBusException:
- pass
- return False
-
-def _shell_started_cb():
- # Unfreeze the display
- hw_manager = hardwaremanager.get_manager()
- hw_manager.set_dcon_freeze(0)
-
-def main():
- gobject.idle_add(_shell_started_cb)
-
- logsmanager.setup()
- logger.start('shell')
-
- _save_session_info()
- _start_matchbox()
- _setup_translations()
-
- hw_manager = hardwaremanager.get_manager()
- hw_manager.startup()
-
- icons_path = os.path.join(config.data_path, 'icons')
- gtk.icon_theme_get_default().append_search_path(icons_path)
-
- # Do initial setup if needed
- if not get_profile().is_valid():
- win = intro.IntroWindow()
- win.show_all()
- gtk.main()
-
- if os.environ.has_key("SUGAR_TP_DEBUG"):
- # Allow the user time to start up telepathy connection managers
- # using the Sugar DBus bus address
- import time
- from telepathy.client import ManagerRegistry
-
- registry = ManagerRegistry()
- registry.LoadManagers()
-
- debug_flags = os.environ["SUGAR_TP_DEBUG"].split(',')
- for cm_name in debug_flags:
- if cm_name not in ["gabble", "salut"]:
- continue
-
- try:
- cm = registry.services[cm_name]
- except KeyError:
- print RuntimeError("%s connection manager not found!" % cm_name)
-
- while not check_cm(cm['busname']):
- print "Waiting for %s on: DBUS_SESSION_BUS_ADDRESS=%s" % \
- (cm_name, os.environ["DBUS_SESSION_BUS_ADDRESS"])
- try:
- time.sleep(5)
- except KeyboardInterrupt:
- print "Got Ctrl+C, continuing..."
- break
-
- model = ShellModel()
- shell = Shell(model)
- service = ShellService(shell)
-
- try:
- gtk.main()
- except KeyboardInterrupt:
- print 'Ctrl+C pressed, exiting...'
-
- session_info_file = os.path.join(env.get_profile_path(), "session.info")
- os.remove(session_info_file)
-
diff --git a/src/model/BuddyModel.py b/src/model/BuddyModel.py
deleted file mode 100644
index 11c6567..0000000
--- a/src/model/BuddyModel.py
+++ /dev/null
@@ -1,164 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import logging
-
-from sugar.presence import presenceservice
-from sugar.graphics.xocolor import XoColor
-import gobject
-
-_NOT_PRESENT_COLOR = "#888888,#BBBBBB"
-
-class BuddyModel(gobject.GObject):
- __gsignals__ = {
- 'appeared': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
- 'disappeared': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
- 'nick-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT])),
- 'color-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT])),
- 'icon-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
- ([])),
- 'current-activity-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT]))
- }
-
- def __init__(self, key=None, buddy=None, nick=None):
- if (key and buddy) or (not key and not buddy):
- raise RuntimeError("Must specify only _one_ of key or buddy.")
-
- gobject.GObject.__init__(self)
-
- self._ba_handler = None
- self._pc_handler = None
- self._dis_handler = None
- self._bic_handler = None
- self._cac_handler = None
-
- self._pservice = presenceservice.get_instance()
-
- self._buddy = None
-
- if not buddy:
- self._key = key
- # connect to the PS's buddy-appeared signal and
- # wait for the buddy to appear
- self._ba_handler = self._pservice.connect('buddy-appeared',
- self._buddy_appeared_cb)
- # Set color to 'inactive'/'disconnected'
- self._set_color_from_string(_NOT_PRESENT_COLOR)
- self._nick = nick
-
- self._pservice.get_buddies_async(reply_handler=self._get_buddies_cb)
- else:
- self._update_buddy(buddy)
-
- def _get_buddies_cb(self, list):
- buddy = None
- for iter_buddy in list:
- if iter_buddy.props.key == self._key:
- buddy = iter_buddy
- break
-
- if buddy:
- if self._ba_handler:
- # Once we have the buddy, we no longer need to
- # monitor buddy-appeared events
- self._pservice.disconnect(self._ba_handler)
- self._ba_handler = None
-
- self._update_buddy(buddy)
-
- def _set_color_from_string(self, color_string):
- self._color = XoColor(color_string)
-
- def get_key(self):
- return self._key
-
- def get_nick(self):
- return self._nick
-
- def get_color(self):
- return self._color
-
- def get_buddy(self):
- return self._buddy
-
- def is_owner(self):
- if not self._buddy:
- return False
- return self._buddy.props.owner
-
- def is_present(self):
- if self._buddy:
- return True
- return False
-
- def get_current_activity(self):
- if self._buddy:
- return self._buddy.props.current_activity
- return None
-
- def _update_buddy(self, buddy):
- if not buddy:
- raise ValueError("Buddy cannot be None.")
-
- self._buddy = buddy
- self._key = self._buddy.props.key
- self._nick = self._buddy.props.nick
- self._set_color_from_string(self._buddy.props.color)
-
- self._pc_handler = self._buddy.connect('property-changed', self._buddy_property_changed_cb)
- self._bic_handler = self._buddy.connect('icon-changed', self._buddy_icon_changed_cb)
-
- def _buddy_appeared_cb(self, pservice, buddy):
- if self._buddy or buddy.props.key != self._key:
- return
-
- if self._ba_handler:
- # Once we have the buddy, we no longer need to
- # monitor buddy-appeared events
- self._pservice.disconnect(self._ba_handler)
- self._ba_handler = None
-
- self._update_buddy(buddy)
- self.emit('appeared')
-
- def _buddy_property_changed_cb(self, buddy, keys):
- if not self._buddy:
- return
- if 'color' in keys:
- self._set_color_from_string(self._buddy.props.color)
- self.emit('color-changed', self.get_color())
- if 'current-activity' in keys:
- self.emit('current-activity-changed', buddy.props.current_activity)
- if 'nick' in keys:
- self._nick = self._buddy.props.nick
- self.emit('nick-changed', self.get_nick())
-
- def _buddy_disappeared_cb(self, buddy):
- if buddy != self._buddy:
- return
- self._buddy.disconnect(self._pc_handler)
- self._buddy.disconnect(self._dis_handler)
- self._buddy.disconnect(self._bic_handler)
- self._buddy.disconnect(self._cac_handler)
- self._set_color_from_string(_NOT_PRESENT_COLOR)
- self.emit('disappeared')
- self._buddy = None
-
- def _buddy_icon_changed_cb(self, buddy):
- self.emit('icon-changed')
diff --git a/src/model/Friends.py b/src/model/Friends.py
deleted file mode 100644
index 6fc3e97..0000000
--- a/src/model/Friends.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import dbus
-import os
-from ConfigParser import ConfigParser
-
-import gobject
-
-from model.BuddyModel import BuddyModel
-from sugar import env
-import logging
-
-class Friends(gobject.GObject):
- __gsignals__ = {
- 'friend-added': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([object])),
- 'friend-removed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([str])),
- }
-
- def __init__(self):
- gobject.GObject.__init__(self)
-
- self._friends = {}
- self._path = os.path.join(env.get_profile_path(), 'friends')
-
- self.load()
-
- def has_buddy(self, buddy):
- return self._friends.has_key(buddy.get_key())
-
- def add_friend(self, buddy_info):
- self._friends[buddy_info.get_key()] = buddy_info
- self.emit('friend-added', buddy_info)
-
- def make_friend(self, buddy):
- if not self.has_buddy(buddy):
- self.add_friend(buddy)
- self.save()
-
- def remove(self, buddy_info):
- del self._friends[buddy_info.get_key()]
- self.save()
- self.emit('friend-removed', buddy_info.get_key())
-
- def __iter__(self):
- return self._friends.values().__iter__()
-
- def load(self):
- cp = ConfigParser()
-
- try:
- success = cp.read([self._path])
- if success:
- for key in cp.sections():
- # HACK: don't screw up on old friends files
- if len(key) < 20:
- continue
- buddy = BuddyModel(key=key, nick=cp.get(key, 'nick'))
- self.add_friend(buddy)
- except Exception, exc:
- logging.error("Error parsing friends file: %s" % exc)
-
- def save(self):
- cp = ConfigParser()
-
- for friend in self:
- section = friend.get_key()
- cp.add_section(section)
- cp.set(section, 'nick', friend.get_nick())
- cp.set(section, 'color', friend.get_color().to_string())
-
- fileobject = open(self._path, 'w')
- cp.write(fileobject)
- fileobject.close()
-
- self._sync_friends()
-
- def _sync_friends(self):
- # XXX: temporary hack
- # remove this when the shell service has a D-Bus API for buddies
-
- def friends_synced():
- pass
-
- def friends_synced_error(e):
- logging.error("Error asking presence service to sync friends: %s"
- % e)
-
- keys = []
- for friend in self:
- keys.append(friend.get_key())
-
- bus = dbus.SessionBus()
- ps = bus.get_object('org.laptop.Sugar.Presence',
- '/org/laptop/Sugar/Presence')
- psi = dbus.Interface(ps, 'org.laptop.Sugar.Presence')
- psi.SyncFriends(keys,
- reply_handler=friends_synced,
- error_handler=friends_synced_error)
diff --git a/src/model/Invites.py b/src/model/Invites.py
deleted file mode 100644
index 9ffab44..0000000
--- a/src/model/Invites.py
+++ /dev/null
@@ -1,72 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import gobject
-from sugar.presence import presenceservice
-
-class Invite:
- def __init__(self, issuer, bundle_id, activity_id):
- self._issuer = issuer
- self._activity_id = activity_id
- self._bundle_id = bundle_id
-
- def get_activity_id(self):
- return self._activity_id
-
- def get_bundle_id(self):
- return self._bundle_id
-
-class Invites(gobject.GObject):
- __gsignals__ = {
- 'invite-added': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([object])),
- 'invite-removed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([object])),
- }
-
- def __init__(self):
- gobject.GObject.__init__(self)
-
- self._dict = {}
-
- ps = presenceservice.get_instance()
- owner = ps.get_owner()
- owner.connect('joined-activity', self._owner_joined_cb)
-
- def add_invite(self, issuer, bundle_id, activity_id):
- if activity_id in self._dict:
- # there is no point to add more than one time
- # an invite for the same activity
- return
-
- invite = Invite(issuer, bundle_id, activity_id)
- self._dict[activity_id] = invite
- self.emit('invite-added', invite)
-
- def remove_invite(self, invite):
- self._dict.pop(invite.get_activity_id())
- self.emit('invite-removed', invite)
-
- def remove_activity(self, activity_id):
- invite = self._dict.get(activity_id)
- if invite is not None:
- self.remove_invite(invite)
-
- def _owner_joined_cb(self, owner, activity):
- self.remove_activity(activity.props.id)
-
- def __iter__(self):
- return self._dict.values().__iter__()
diff --git a/src/model/Makefile.am b/src/model/Makefile.am
deleted file mode 100644
index 0b7d14c..0000000
--- a/src/model/Makefile.am
+++ /dev/null
@@ -1,14 +0,0 @@
-SUBDIRS = devices
-
-sugardir = $(pkgdatadir)/shell/model
-sugar_PYTHON = \
- __init__.py \
- accesspointmodel.py \
- BuddyModel.py \
- Friends.py \
- Invites.py \
- Owner.py \
- MeshModel.py \
- shellmodel.py \
- homeactivity.py \
- homemodel.py
diff --git a/src/model/MeshModel.py b/src/model/MeshModel.py
deleted file mode 100644
index da5b3c2..0000000
--- a/src/model/MeshModel.py
+++ /dev/null
@@ -1,235 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import gobject
-
-from sugar.graphics.xocolor import XoColor
-from sugar.presence import presenceservice
-from sugar import activity
-
-from model.BuddyModel import BuddyModel
-from model.accesspointmodel import AccessPointModel
-from hardware import hardwaremanager
-from hardware import nmclient
-
-class ActivityModel:
- def __init__(self, activity, bundle):
- self.activity = activity
- self.bundle = bundle
-
- def get_id(self):
- return self.activity.props.id
-
- def get_icon_name(self):
- return self.bundle.icon
-
- def get_color(self):
- return XoColor(self.activity.props.color)
-
- def get_bundle_id(self):
- return self.bundle.bundle_id
-
-class MeshModel(gobject.GObject):
- __gsignals__ = {
- 'activity-added': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])),
- 'activity-removed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])),
- 'buddy-added': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])),
- 'buddy-moved': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT,
- gobject.TYPE_PYOBJECT])),
- 'buddy-removed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])),
- 'access-point-added': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])),
- 'access-point-removed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])),
- 'mesh-added': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])),
- 'mesh-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([]))
- }
-
- def __init__(self):
- gobject.GObject.__init__(self)
-
- self._activities = {}
- self._buddies = {}
- self._access_points = {}
- self._mesh = None
-
- self._pservice = presenceservice.get_instance()
- self._pservice.connect("activity-appeared",
- self._activity_appeared_cb)
- self._pservice.connect('activity-disappeared',
- self._activity_disappeared_cb)
- self._pservice.connect("buddy-appeared",
- self._buddy_appeared_cb)
- self._pservice.connect("buddy-disappeared",
- self._buddy_disappeared_cb)
-
- # Add any buddies the PS knows about already
- self._pservice.get_buddies_async(reply_handler=self._get_buddies_cb)
-
- self._pservice.get_activities_async(reply_handler=self._get_activities_cb)
-
- network_manager = hardwaremanager.get_network_manager()
- if network_manager:
- for nm_device in network_manager.get_devices():
- self._add_network_device(nm_device)
- network_manager.connect('device-added',
- self._nm_device_added_cb)
- network_manager.connect('device-removed',
- self._nm_device_removed_cb)
-
- def _get_buddies_cb(self, list):
- for buddy in list:
- self._buddy_appeared_cb(self._pservice, buddy)
-
- def _get_activities_cb(self, list):
- for activity in list:
- self._check_activity(activity)
-
- def _nm_device_added_cb(self, manager, nm_device):
- self._add_network_device(nm_device)
-
- def _nm_device_removed_cb(self, manager, nm_device):
- self._remove_network_device(nm_device)
-
- def _nm_network_appeared_cb(self, nm_device, nm_network):
- self._add_access_point(nm_device, nm_network)
-
- def _nm_network_disappeared_cb(self, nm_device, nm_network):
- if self._access_points.has_key(nm_network.get_op()):
- ap = self._access_points[nm_network.get_op()]
- self._remove_access_point(ap)
-
- def _add_network_device(self, nm_device):
- dtype = nm_device.get_type()
- if dtype == nmclient.DEVICE_TYPE_802_11_WIRELESS:
- for nm_network in nm_device.get_networks():
- self._add_access_point(nm_device, nm_network)
-
- nm_device.connect('network-appeared',
- self._nm_network_appeared_cb)
- nm_device.connect('network-disappeared',
- self._nm_network_disappeared_cb)
- elif dtype == nmclient.DEVICE_TYPE_802_11_MESH_OLPC:
- self._mesh = nm_device
- self.emit('mesh-added', self._mesh)
-
- def _remove_network_device(self, nm_device):
- if nm_device == self._mesh:
- self._mesh = None
- self.emit('mesh-removed')
- elif nm_device.get_type() == nmclient.DEVICE_TYPE_802_11_WIRELESS:
- aplist = self._access_points.values()
- for ap in aplist:
- if ap.get_nm_device() == nm_device:
- self._remove_access_point(ap)
-
- def _add_access_point(self, nm_device, nm_network):
- model = AccessPointModel(nm_device, nm_network)
- self._access_points[model.get_id()] = model
- self.emit('access-point-added', model)
-
- def _remove_access_point(self, ap):
- if not self._access_points.has_key(ap.get_id()):
- return
- self.emit('access-point-removed', ap)
- del self._access_points[ap.get_id()]
-
- def get_mesh(self):
- return self._mesh
-
- def get_access_points(self):
- return self._access_points.values()
-
- def get_activities(self):
- return self._activities.values()
-
- def get_buddies(self):
- return self._buddies.values()
-
- def _buddy_activity_changed_cb(self, model, cur_activity):
- if not self._buddies.has_key(model.get_key()):
- return
- if cur_activity and self._activities.has_key(cur_activity.props.id):
- activity_model = self._activities[cur_activity.props.id]
- self.emit('buddy-moved', model, activity_model)
- else:
- self.emit('buddy-moved', model, None)
-
- def _buddy_appeared_cb(self, pservice, buddy):
- if self._buddies.has_key(buddy.props.key):
- return
-
- model = BuddyModel(buddy=buddy)
- model.connect('current-activity-changed',
- self._buddy_activity_changed_cb)
- self._buddies[buddy.props.key] = model
- self.emit('buddy-added', model)
-
- cur_activity = buddy.props.current_activity
- if cur_activity:
- self._buddy_activity_changed_cb(model, cur_activity)
-
- def _buddy_disappeared_cb(self, pservice, buddy):
- if not self._buddies.has_key(buddy.props.key):
- return
- self.emit('buddy-removed', self._buddies[buddy.props.key])
- del self._buddies[buddy.props.key]
-
- def _activity_appeared_cb(self, pservice, activity):
- self._check_activity(activity)
-
- def _check_activity(self, presence_activity):
- registry = activity.get_registry()
- bundle = registry.get_activity(presence_activity.props.type)
- if not bundle:
- return
- if self.has_activity(presence_activity.props.id):
- return
- self.add_activity(bundle, presence_activity)
-
- def has_activity(self, activity_id):
- return self._activities.has_key(activity_id)
-
- def get_activity(self, activity_id):
- if self.has_activity(activity_id):
- return self._activities[activity_id]
- else:
- return None
-
- def add_activity(self, bundle, activity):
- model = ActivityModel(activity, bundle)
- self._activities[model.get_id()] = model
- self.emit('activity-added', model)
-
- for buddy in self._pservice.get_buddies():
- cur_activity = buddy.props.current_activity
- key = buddy.props.key
- if cur_activity == activity and self._buddies.has_key(key):
- buddy_model = self._buddies[key]
- self.emit('buddy-moved', buddy_model, model)
-
- def _activity_disappeared_cb(self, pservice, activity):
- if self._activities.has_key(activity.props.id):
- activity_model = self._activities[activity.props.id]
- self.emit('activity-removed', activity_model)
- del self._activities[activity.props.id]
diff --git a/src/model/Owner.py b/src/model/Owner.py
deleted file mode 100644
index b06b391..0000000
--- a/src/model/Owner.py
+++ /dev/null
@@ -1,87 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import gobject
-import os
-import random
-import base64
-import time
-import logging
-import dbus
-
-from sugar import env
-from sugar import profile
-from sugar.presence import presenceservice
-from sugar import util
-from model.Invites import Invites
-
-class ShellOwner(gobject.GObject):
- __gtype_name__ = "ShellOwner"
-
- __gsignals__ = {
- 'nick-changed' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
- ([gobject.TYPE_STRING])),
- 'color-changed' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT])),
- 'icon-changed' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT]))
- }
-
- """Class representing the owner of this machine/instance. This class
- runs in the shell and serves up the buddy icon and other stuff. It's the
- server portion of the Owner, paired with the client portion in Buddy.py."""
- def __init__(self):
- gobject.GObject.__init__(self)
-
- self._nick = profile.get_nick_name()
-
- self._icon = None
- self._icon_hash = ""
- icon = os.path.join(env.get_profile_path(), "buddy-icon.jpg")
- if not os.path.exists(icon):
- raise RuntimeError("missing buddy icon")
-
- fd = open(icon, "r")
- self._icon = fd.read()
- fd.close()
- if not self._icon:
- raise RuntimeError("invalid buddy icon")
-
- # Get the icon's hash
- import md5
- digest = md5.new(self._icon).digest()
- self._icon_hash = util.printable_hash(digest)
-
- self._pservice = presenceservice.get_instance()
- self._pservice.connect('activity-invitation',
- self._activity_invitation_cb)
- self._pservice.connect('activity-disappeared',
- self._activity_disappeared_cb)
-
- self._invites = Invites()
-
- def get_invites(self):
- return self._invites
-
- def get_nick(self):
- return self._nick
-
- def _activity_invitation_cb(self, pservice, activity, buddy, message):
- self._invites.add_invite(buddy, activity.props.type,
- activity.props.id)
-
- def _activity_disappeared_cb(self, pservice, activity):
- self._invites.remove_activity(activity.props.id)
diff --git a/src/model/__init__.py b/src/model/__init__.py
deleted file mode 100644
index a9dd95a..0000000
--- a/src/model/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2006-2007, 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
-
diff --git a/src/model/accesspointmodel.py b/src/model/accesspointmodel.py
deleted file mode 100644
index 1d4d6cb..0000000
--- a/src/model/accesspointmodel.py
+++ /dev/null
@@ -1,81 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import gobject
-import sys
-
-from hardware import nmclient
-
-STATE_CONNECTING = 0
-STATE_CONNECTED = 1
-STATE_NOTCONNECTED = 2
-
-_nm_state_to_state = {
- nmclient.NETWORK_STATE_CONNECTED : STATE_CONNECTED,
- nmclient.NETWORK_STATE_CONNECTING : STATE_CONNECTING,
- nmclient.NETWORK_STATE_NOTCONNECTED : STATE_NOTCONNECTED
-}
-
-class AccessPointModel(gobject.GObject):
- __gproperties__ = {
- 'name' : (str, None, None, None,
- gobject.PARAM_READABLE),
- 'strength' : (int, None, None, 0, 100, 0,
- gobject.PARAM_READABLE),
- 'state' : (int, None, None, STATE_CONNECTING,
- STATE_NOTCONNECTED, 0, gobject.PARAM_READABLE),
- 'capabilities' : (int, None, None, 0, 0x7FFFFFFF, 0,
- gobject.PARAM_READABLE),
- 'mode' : (int, None, None, 0, 6, 0, gobject.PARAM_READABLE)
- }
-
- def __init__(self, nm_device, nm_network):
- gobject.GObject.__init__(self)
- self._nm_network = nm_network
- self._nm_device = nm_device
-
- self._nm_network.connect('strength-changed',
- self._strength_changed_cb)
- self._nm_network.connect('state-changed',
- self._state_changed_cb)
-
- def _strength_changed_cb(self, nm_network):
- self.notify('strength')
-
- def _state_changed_cb(self, nm_network):
- self.notify('state')
-
- def get_id(self):
- return self._nm_network.get_op()
-
- def get_nm_device(self):
- return self._nm_device
-
- def get_nm_network(self):
- return self._nm_network
-
- def do_get_property(self, pspec):
- if pspec.name == 'strength':
- return self._nm_network.get_strength()
- elif pspec.name == 'name':
- return self._nm_network.get_ssid()
- elif pspec.name == 'state':
- nm_state = self._nm_network.get_state()
- return _nm_state_to_state[nm_state]
- elif pspec.name == 'capabilities':
- return self._nm_network.get_caps()
- elif pspec.name == 'mode':
- return self._nm_network.get_mode()
diff --git a/src/model/devices/Makefile.am b/src/model/devices/Makefile.am
deleted file mode 100644
index 5440eeb..0000000
--- a/src/model/devices/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-SUBDIRS = network
-
-sugardir = $(pkgdatadir)/shell/model/devices
-sugar_PYTHON = \
- __init__.py \
- device.py \
- devicesmodel.py \
- battery.py
diff --git a/src/model/devices/__init__.py b/src/model/devices/__init__.py
deleted file mode 100644
index a9dd95a..0000000
--- a/src/model/devices/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2006-2007, 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
-
diff --git a/src/model/devices/battery.py b/src/model/devices/battery.py
deleted file mode 100644
index 853d00e..0000000
--- a/src/model/devices/battery.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# Copyright (C) 2006-2007, 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
-
-import logging
-
-import gobject
-import dbus
-
-from model.devices import device
-
-_LEVEL_PROP = 'battery.charge_level.percentage'
-_CHARGING_PROP = 'battery.rechargeable.is_charging'
-_DISCHARGING_PROP = 'battery.rechargeable.is_discharging'
-
-class Device(device.Device):
- __gproperties__ = {
- 'level' : (int, None, None, 0, 100, 0,
- gobject.PARAM_READABLE),
- 'charging' : (bool, None, None, False,
- gobject.PARAM_READABLE),
- 'discharging' : (bool, None, None, False,
- gobject.PARAM_READABLE)
- }
-
- def __init__(self, udi):
- device.Device.__init__(self, udi)
-
- bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM)
- proxy = bus.get_object('org.freedesktop.Hal', udi)
- self._battery = dbus.Interface(proxy, 'org.freedesktop.Hal.Device')
- bus.add_signal_receiver(self._battery_changed,
- 'PropertyModified',
- 'org.freedesktop.Hal.Device',
- 'org.freedesktop.Hal',
- udi)
-
- self._level = self._get_level()
- self._charging = self._get_charging()
- self._discharging = self._get_discharging()
-
- def _get_level(self):
- try:
- return self._battery.GetProperty(_LEVEL_PROP)
- except dbus.DBusException:
- logging.error('Cannot access %s' % _LEVEL_PROP)
- return 0
-
- def _get_charging(self):
- try:
- return self._battery.GetProperty(_CHARGING_PROP)
- except dbus.DBusException:
- logging.error('Cannot access %s' % _CHARGING_PROP)
- return False
-
- def _get_discharging(self):
- try:
- return self._battery.GetProperty(_DISCHARGING_PROP)
- except dbus.DBusException:
- logging.error('Cannot access %s' % _DISCHARGING_PROP)
- return False
-
- def do_get_property(self, pspec):
- if pspec.name == 'level':
- return self._level
- if pspec.name == 'charging':
- return self._charging
- if pspec.name == 'discharging':
- return self._discharging
-
- def get_type(self):
- return 'battery'
-
- def _battery_changed(self, num_changes, changes_list):
- for change in changes_list:
- if change[0] == _LEVEL_PROP:
- self._level = self._get_level()
- self.notify('level')
- elif change[0] == _CHARGING_PROP:
- self._charging = self._get_charging()
- self.notify('charging')
- elif change[0] == _DISCHARGING_PROP:
- self._discharging = self._get_discharging()
- self.notify('discharging')
diff --git a/src/model/devices/device.py b/src/model/devices/device.py
deleted file mode 100644
index d7105b5..0000000
--- a/src/model/devices/device.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Copyright (C) 2007, 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
-
-import gobject
-from hardware import nmclient
-
-from sugar import util
-
-STATE_ACTIVATING = 0
-STATE_ACTIVATED = 1
-STATE_INACTIVE = 2
-
-_nm_state_to_state = {
- nmclient.DEVICE_STATE_ACTIVATING : STATE_ACTIVATING,
- nmclient.DEVICE_STATE_ACTIVATED : STATE_ACTIVATED,
- nmclient.DEVICE_STATE_INACTIVE : STATE_INACTIVE
-}
-
-class Device(gobject.GObject):
- def __init__(self, device_id=None):
- gobject.GObject.__init__(self)
- if device_id:
- self._id = device_id
- else:
- self._id = util.unique_id()
-
- def get_type(self):
- return 'unknown'
-
- def get_id(self):
- return self._id
diff --git a/src/model/devices/devicesmodel.py b/src/model/devices/devicesmodel.py
deleted file mode 100644
index fab9fa4..0000000
--- a/src/model/devices/devicesmodel.py
+++ /dev/null
@@ -1,136 +0,0 @@
-#
-# Copyright (C) 2007, 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
-
-import logging
-import gobject
-import dbus
-
-from model.devices import device
-from model.devices.network import wired
-from model.devices.network import wireless
-from model.devices.network import mesh
-from model.devices import battery
-from hardware import hardwaremanager
-from hardware import nmclient
-
-class DevicesModel(gobject.GObject):
- __gsignals__ = {
- 'device-appeared' : (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT])),
- 'device-disappeared': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT]))
- }
-
- def __init__(self):
- gobject.GObject.__init__(self)
-
- self._devices = {}
- self._sigids = {}
-
- self._observe_hal_manager()
- self._observe_network_manager()
-
- def _observe_hal_manager(self):
- bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM)
- proxy = bus.get_object('org.freedesktop.Hal',
- '/org/freedesktop/Hal/Manager')
- hal_manager = dbus.Interface(proxy, 'org.freedesktop.Hal.Manager')
-
- for udi in hal_manager.FindDeviceByCapability('battery'):
- self.add_device(battery.Device(udi))
-
- def _observe_network_manager(self):
- network_manager = hardwaremanager.get_network_manager()
- if not network_manager:
- return
-
- for device in network_manager.get_devices():
- self._check_network_device(device)
-
- network_manager.connect('device-added',
- self._network_device_added_cb)
- network_manager.connect('device-activating',
- self._network_device_activating_cb)
- network_manager.connect('device-activated',
- self._network_device_activated_cb)
- network_manager.connect('device-removed',
- self._network_device_removed_cb)
-
- def _network_device_added_cb(self, network_manager, nm_device):
- state = nm_device.get_state()
- if state == nmclient.DEVICE_STATE_ACTIVATING \
- or state == nmclient.DEVICE_STATE_ACTIVATED:
- self._check_network_device(nm_device)
-
- def _network_device_activating_cb(self, network_manager, nm_device):
- self._check_network_device(nm_device)
-
- def _network_device_activated_cb(self, network_manager, nm_device):
- pass
-
- def _network_device_removed_cb(self, network_manager, nm_device):
- if self._devices.has_key(str(nm_device.get_op())):
- self.remove_device(self._get_network_device(nm_device))
-
- def _check_network_device(self, nm_device):
- if not nm_device.is_valid():
- logging.debug("Device %s not valid" % nm_device.get_op())
- return
-
- dtype = nm_device.get_type()
- if dtype == nmclient.DEVICE_TYPE_802_11_WIRELESS \
- or dtype == nmclient.DEVICE_TYPE_802_11_MESH_OLPC:
- self._add_network_device(nm_device)
-
- def _get_network_device(self, nm_device):
- return self._devices[str(nm_device.get_op())]
-
- def _network_device_state_changed_cb(self, dev, param):
- if dev.props.state == device.STATE_INACTIVE:
- self.remove_device(dev)
-
- def _add_network_device(self, nm_device):
- if self._devices.has_key(str(nm_device.get_op())):
- logging.debug("Tried to add device %s twice" % nm_device.get_op())
- return
-
- dtype = nm_device.get_type()
- if dtype == nmclient.DEVICE_TYPE_802_11_WIRELESS:
- dev = wireless.Device(nm_device)
- self.add_device(dev)
- sigid = dev.connect('notify::state', self._network_device_state_changed_cb)
- self._sigids[dev] = sigid
- if dtype == nmclient.DEVICE_TYPE_802_11_MESH_OLPC:
- dev = mesh.Device(nm_device)
- self.add_device(dev)
- sigid = dev.connect('notify::state', self._network_device_state_changed_cb)
- self._sigids[dev] = sigid
-
- def __iter__(self):
- return iter(self._devices.values())
-
- def add_device(self, device):
- self._devices[device.get_id()] = device
- self.emit('device-appeared', device)
-
- def remove_device(self, device):
- self.emit('device-disappeared', self._devices[device.get_id()])
- device.disconnect(self._sigids[device])
- del self._sigids[device]
- del self._devices[device.get_id()]
diff --git a/src/model/devices/network/Makefile.am b/src/model/devices/network/Makefile.am
deleted file mode 100644
index 04074e5..0000000
--- a/src/model/devices/network/Makefile.am
+++ /dev/null
@@ -1,6 +0,0 @@
-sugardir = $(pkgdatadir)/shell/model/devices/network
-sugar_PYTHON = \
- __init__.py \
- mesh.py \
- wired.py \
- wireless.py
diff --git a/src/model/devices/network/__init__.py b/src/model/devices/network/__init__.py
deleted file mode 100644
index a9dd95a..0000000
--- a/src/model/devices/network/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2006-2007, 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
-
diff --git a/src/model/devices/network/mesh.py b/src/model/devices/network/mesh.py
deleted file mode 100644
index 0152d8a..0000000
--- a/src/model/devices/network/mesh.py
+++ /dev/null
@@ -1,75 +0,0 @@
-#
-# Copyright (C) 2006-2007 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
-
-import gobject
-
-from model.devices import device
-from hardware import nmclient
-
-class Device(device.Device):
- __gproperties__ = {
- 'strength' : (int, None, None, 0, 100, 0,
- gobject.PARAM_READABLE),
- 'state' : (int, None, None, device.STATE_ACTIVATING,
- device.STATE_INACTIVE, 0, gobject.PARAM_READABLE),
- 'activation-stage': (int, None, None, 0, 7, 0, gobject.PARAM_READABLE),
- 'frequency': (float, None, None, 0, 2.72, 0, gobject.PARAM_READABLE),
- 'mesh-step': (int, None, None, 0, 4, 0, gobject.PARAM_READABLE),
- }
-
- def __init__(self, nm_device):
- device.Device.__init__(self)
- self._nm_device = nm_device
-
- self._nm_device.connect('strength-changed',
- self._strength_changed_cb)
- self._nm_device.connect('state-changed',
- self._state_changed_cb)
- self._nm_device.connect('activation-stage-changed',
- self._activation_stage_changed_cb)
-
- def _strength_changed_cb(self, nm_device):
- self.notify('strength')
-
- def _state_changed_cb(self, nm_device):
- self.notify('state')
-
- def _activation_stage_changed_cb(self, nm_device):
- self.notify('activation-stage')
-
- def do_get_property(self, pspec):
- if pspec.name == 'strength':
- return self._nm_device.get_strength()
- elif pspec.name == 'state':
- nm_state = self._nm_device.get_state()
- return device._nm_state_to_state[nm_state]
- elif pspec.name == 'activation-stage':
- return self._nm_device.get_activation_stage()
- elif pspec.name == 'frequency':
- return self._nm_device.get_frequency()
- elif pspec.name == 'mesh-step':
- return self._nm_device.get_mesh_step()
-
- def get_type(self):
- return 'network.mesh'
-
- def get_id(self):
- return str(self._nm_device.get_op())
-
- def get_nm_device(self):
- return self._nm_device
-
diff --git a/src/model/devices/network/wired.py b/src/model/devices/network/wired.py
deleted file mode 100644
index 66c5206..0000000
--- a/src/model/devices/network/wired.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (C) 2006-2007, 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 model.devices import device
-
-class Device(device.Device):
- def __init__(self, nm_device):
- device.Device.__init__(self)
- self._nm_device = device
-
- def get_id(self):
- return str(self._nm_device.get_op())
-
- def get_type(self):
- return 'network.wired'
diff --git a/src/model/devices/network/wireless.py b/src/model/devices/network/wireless.py
deleted file mode 100644
index c45a08e..0000000
--- a/src/model/devices/network/wireless.py
+++ /dev/null
@@ -1,96 +0,0 @@
-#
-# Copyright (C) 2006-2007 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
-
-import gobject
-
-from model.devices import device
-from hardware import nmclient
-
-def freq_to_channel(freq):
- ftoc = { 2.412: 1, 2.417: 2, 2.422: 3, 2.427: 4,
- 2.432: 5, 2.437: 6, 2.442: 7, 2.447: 8,
- 2.452: 9, 2.457: 10, 2.462: 11, 2.467: 12,
- 2.472: 13
- }
- return ftoc[freq]
-
-def channel_to_freq(channel):
- ctof = { 1: 2.412, 2: 2.417, 3: 2.422, 4: 2.427,
- 5: 2.432, 6: 2.437, 7: 2.442, 8: 2.447,
- 9: 2.452, 10: 2.457, 11: 2.462, 12: 2.467,
- 13: 2.472
- }
- return ctof[channel]
-
-
-class Device(device.Device):
- __gproperties__ = {
- 'name' : (str, None, None, None,
- gobject.PARAM_READABLE),
- 'strength' : (int, None, None, 0, 100, 0,
- gobject.PARAM_READABLE),
- 'state' : (int, None, None, device.STATE_ACTIVATING,
- device.STATE_INACTIVE, 0, gobject.PARAM_READABLE),
- 'frequency': (float, None, None, 0.0, 9999.99, 0.0,
- gobject.PARAM_READABLE)
- }
-
- def __init__(self, nm_device):
- device.Device.__init__(self)
- self._nm_device = nm_device
-
- self._nm_device.connect('strength-changed',
- self._strength_changed_cb)
- self._nm_device.connect('ssid-changed',
- self._ssid_changed_cb)
- self._nm_device.connect('state-changed',
- self._state_changed_cb)
-
- def _strength_changed_cb(self, nm_device):
- self.notify('strength')
-
- def _ssid_changed_cb(self, nm_device):
- self.notify('name')
-
- def _state_changed_cb(self, nm_device):
- self.notify('state')
-
- def do_get_property(self, pspec):
- if pspec.name == 'strength':
- return self._nm_device.get_strength()
- elif pspec.name == 'name':
- import logging
- logging.debug('wireless.Device.props.name: %s' % self._nm_device.get_ssid())
- return self._nm_device.get_ssid()
- elif pspec.name == 'state':
- nm_state = self._nm_device.get_state()
- return device._nm_state_to_state[nm_state]
- elif pspec.name == 'frequency':
- return self._nm_device.get_frequency()
-
- def get_type(self):
- return 'network.wireless'
-
- def get_id(self):
- return str(self._nm_device.get_op())
-
- def get_active_network_colors(self):
- net = self._nm_device.get_active_network()
- if not net:
- return (None, None)
- return net.get_colors()
-
diff --git a/src/model/homeactivity.py b/src/model/homeactivity.py
deleted file mode 100644
index 7365271..0000000
--- a/src/model/homeactivity.py
+++ /dev/null
@@ -1,215 +0,0 @@
-# Copyright (C) 2006-2007 Owen Williams.
-#
-# 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 time
-import logging
-
-import gobject
-import dbus
-
-from sugar.graphics.xocolor import XoColor
-from sugar.presence import presenceservice
-from sugar import profile
-
-_SERVICE_NAME = "org.laptop.Activity"
-_SERVICE_PATH = "/org/laptop/Activity"
-_SERVICE_INTERFACE = "org.laptop.Activity"
-
-class HomeActivity(gobject.GObject):
- """Activity which appears in the "Home View" of the Sugar shell
-
- This class stores the Sugar Shell's metadata regarding a
- given activity/application in the system. It interacts with
- the sugar.activity.* modules extensively in order to
- accomplish its tasks.
- """
-
- __gtype_name__ = 'SugarHomeActivity'
-
- __gproperties__ = {
- 'launching' : (bool, None, None, False,
- gobject.PARAM_READWRITE),
- }
-
- def __init__(self, activity_info, activity_id):
- """Initialise the HomeActivity
-
- activity_info -- sugar.activity.registry.ActivityInfo instance,
- provides the information required to actually
- create the new instance. This is, in effect,
- the "type" of activity being created.
- activity_id -- unique identifier for this instance
- of the activity type
- """
- gobject.GObject.__init__(self)
-
- self._window = None
- self._xid = None
- self._pid = None
- self._service = None
- self._activity_id = activity_id
- self._activity_info = activity_info
- self._launch_time = time.time()
- self._launching = False
-
- self._retrieve_service()
-
- if not self._service:
- bus = dbus.SessionBus()
- bus.add_signal_receiver(self._name_owner_changed_cb,
- signal_name="NameOwnerChanged",
- dbus_interface="org.freedesktop.DBus")
-
- def set_window(self, window):
- """An activity is 'launched' once we get its window."""
- if self._window or self._xid:
- raise RuntimeError("Activity is already launched!")
- if not window:
- raise ValueError("window must be valid")
-
- self._window = window
- self._xid = window.get_xid()
- self._pid = window.get_pid()
-
- def get_service(self):
- """Get the activity service
-
- Note that non-native Sugar applications will not have
- such a service, so the return value will be None in
- those cases.
- """
-
- return self._service
-
- def get_title(self):
- """Retrieve the application's root window's suggested title"""
- if self._window:
- return self._window.get_name()
- else:
- return ''
-
- def get_icon_path(self):
- """Retrieve the activity's icon (file) name"""
- if self._activity_info:
- return self._activity_info.icon
- else:
- return None
-
- def get_icon_color(self):
- """Retrieve the appropriate icon colour for this activity
-
- Uses activity_id to index into the PresenceService's
- set of activity colours, if the PresenceService does not
- have an entry (implying that this is not a Sugar-shared application)
- uses the local user's profile.get_color() to determine the
- colour for the icon.
- """
- pservice = presenceservice.get_instance()
-
- # HACK to suppress warning in logs when activity isn't found
- # (if it's locally launched and not shared yet)
- activity = None
- for act in pservice.get_activities():
- if self._activity_id == act.props.id:
- activity = act
- break
-
- if activity != None:
- return XoColor(activity.props.color)
- else:
- return profile.get_color()
-
- def get_activity_id(self):
- """Retrieve the "activity_id" passed in to our constructor
-
- This is a "globally likely unique" identifier generated by
- sugar.util.unique_id
- """
- return self._activity_id
-
- def get_xid(self):
- """Retrieve the X-windows ID of our root window"""
- return self._xid
-
- def get_window(self):
- """Retrieve the X-windows root window of this application
-
- This was stored by the set_window method, which was
- called by HomeModel._add_activity, which was called
- via a callback that looks for all 'window-opened'
- events.
-
- HomeModel currently uses a dbus service query on the
- activity to determine to which HomeActivity the newly
- launched window belongs.
- """
- return self._window
-
- def get_type(self):
- """Retrieve the activity bundle id for future reference"""
- if self._activity_info:
- return self._activity_info.bundle_id
- else:
- return None
-
- def get_launch_time(self):
- """Return the time at which the activity was first launched
-
- Format is floating-point time.time() value
- (seconds since the epoch)
- """
- return self._launch_time
-
- def get_pid(self):
- """Returns the activity's PID"""
- return self._pid
-
- def equals(self, activity):
- if self._activity_id and activity.get_activity_id():
- return self._activity_id == activity.get_activity_id()
- if self._xid and activity.get_xid():
- return self._xid == activity.get_xid()
- return False
-
- def do_set_property(self, pspec, value):
- if pspec.name == 'launching':
- self._launching = value
-
- def do_get_property(self, pspec):
- if pspec.name == 'launching':
- return self._launching
-
- def _get_service_name(self):
- if self._activity_id:
- return _SERVICE_NAME + self._activity_id
- else:
- return None
-
- def _retrieve_service(self):
- if not self._activity_id:
- return
-
- try:
- bus = dbus.SessionBus()
- proxy = bus.get_object(self._get_service_name(),
- _SERVICE_PATH + "/" + self._activity_id)
- self._service = dbus.Interface(proxy, _SERVICE_INTERFACE)
- except dbus.DBusException:
- self._service = None
-
- def _name_owner_changed_cb(self, name, old, new):
- if name == self._get_service_name():
- self._retrieve_service()
diff --git a/src/model/homemodel.py b/src/model/homemodel.py
deleted file mode 100644
index 44d5417..0000000
--- a/src/model/homemodel.py
+++ /dev/null
@@ -1,283 +0,0 @@
-# Copyright (C) 2006-2007 Owen Williams.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import logging
-
-import gobject
-import wnck
-import dbus
-
-from sugar import wm
-from sugar import activity
-
-from model.homeactivity import HomeActivity
-
-class HomeModel(gobject.GObject):
- """Model of the "Home" view (activity management)
-
- The HomeModel is basically the point of registration
- for all running activities within Sugar. It traps
- events that tell the system there is a new activity
- being created (generated by the activity factories),
- or removed, as well as those which tell us that the
- currently focussed activity has changed.
-
- The HomeModel tracks a set of HomeActivity instances,
- which are tracking the window to activity mappings
- the activity factories have set up.
- """
- __gsignals__ = {
- 'activity-added': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT])),
- 'activity-started': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT])),
- 'activity-removed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT])),
- 'active-activity-changed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT])),
- 'pending-activity-changed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT]))
- }
-
- def __init__(self):
- gobject.GObject.__init__(self)
-
- self._activities = []
- self._active_activity = None
- self._pending_activity = None
-
- screen = wnck.screen_get_default()
- screen.connect('window-opened', self._window_opened_cb)
- screen.connect('window-closed', self._window_closed_cb)
- screen.connect('active-window-changed',
- self._active_window_changed_cb)
-
- def _get_activities_with_window(self):
- ret = []
- for i in self._activities:
- if i.get_window() is not None:
- ret.append(i)
- return ret
-
- def get_previous_activity(self):
- activities = self._get_activities_with_window()
- i = activities.index(self._pending_activity)
- if len(activities) == 0:
- return None
- elif i - 1 >= 0:
- return activities[i - 1]
- else:
- return activities[len(activities) - 1]
-
- def get_next_activity(self):
- activities = self._get_activities_with_window()
- i = activities.index(self._pending_activity)
- if len(activities) == 0:
- return None
- elif i + 1 < len(activities):
- return activities[i + 1]
- else:
- return activities[0]
-
- def get_pending_activity(self):
- """Returns the activity that would be seen in the Activity zoom level
-
- In the Home (or Neighborhood or Groups) zoom level, this
- indicates the activity that would become active if the user
- switched to the Activity zoom level. (In the Activity zoom
- level, this just returns the currently-active activity.)
- Unlike get_active_activity(), this never returns None as long
- as there is any activity running.
- """
- return self._pending_activity
-
- def _set_pending_activity(self, home_activity):
- if self._pending_activity == home_activity:
- return
-
- self._pending_activity = home_activity
- self.emit('pending-activity-changed', self._pending_activity)
-
- def get_active_activity(self):
- """Returns the activity that the user is currently working in
-
- In the Activity zoom level, this returns the currently-active
- activity. In the other zoom levels, it returns the activity
- that was most-recently active in the Activity zoom level, or
- None if the most-recently-active activity is no longer
- running.
- """
- return self._active_activity
-
- def _set_active_activity(self, home_activity):
- if self._active_activity == home_activity:
- return
-
- if self._active_activity:
- service = self._active_activity.get_service()
- if service:
- service.SetActive(False,
- reply_handler=self._set_active_success,
- error_handler=self._set_active_error)
- if home_activity:
- service = home_activity.get_service()
- if service:
- service.SetActive(True,
- reply_handler=self._set_active_success,
- error_handler=self._set_active_error)
-
- self._active_activity = home_activity
- self.emit('active-activity-changed', self._active_activity)
-
- def __iter__(self):
- return iter(self._activities)
-
- def __len__(self):
- return len(self._activities)
-
- def __getitem__(self, i):
- return self._activities[i]
-
- def index(self, obj):
- return self._activities.index(obj)
-
- def _window_opened_cb(self, screen, window):
- if window.get_window_type() == wnck.WINDOW_NORMAL:
- home_activity = None
-
- activity_id = wm.get_activity_id(window)
-
- service_name = wm.get_bundle_id(window)
- if service_name:
- registry = activity.get_registry()
- activity_info = registry.get_activity(service_name)
- else:
- activity_info = None
-
- if activity_id:
- home_activity = self._get_activity_by_id(activity_id)
-
- if not home_activity:
- home_activity = HomeActivity(activity_info, activity_id)
- self._add_activity(home_activity)
-
- home_activity.set_window(window)
-
- home_activity.props.launching = False
- self.emit('activity-started', home_activity)
-
- if self._pending_activity is None:
- self._set_pending_activity(home_activity)
-
- def _window_closed_cb(self, screen, window):
- if window.get_window_type() == wnck.WINDOW_NORMAL:
- self._remove_activity_by_xid(window.get_xid())
-
- def _get_activity_by_xid(self, xid):
- for home_activity in self._activities:
- if home_activity.get_xid() == xid:
- return home_activity
- return None
-
- def _get_activity_by_id(self, activity_id):
- for home_activity in self._activities:
- if home_activity.get_activity_id() == activity_id:
- return home_activity
- return None
-
- def _set_active_success(self):
- pass
-
- def _set_active_error(self, err):
- logging.error("set_active() failed: %s" % err)
-
- def _active_window_changed_cb(self, screen, previous_window=None):
- window = screen.get_active_window()
- if window is None:
- return
-
- if window.get_window_type() != wnck.WINDOW_DIALOG:
- while window.get_transient() is not None:
- window = window.get_transient()
-
- activity = self._get_activity_by_xid(window.get_xid())
- if activity is not None:
- self._set_pending_activity(activity)
- self._set_active_activity(activity)
-
- def _add_activity(self, home_activity):
- self._activities.append(home_activity)
- self.emit('activity-added', home_activity)
-
- def _remove_activity(self, home_activity):
- if home_activity == self._active_activity:
- self._set_active_activity(None)
-
- if home_activity == self._pending_activity:
- # Figure out the new _pending_activity
- windows = wnck.screen_get_default().get_windows_stacked()
- windows.reverse()
- for window in windows:
- new_activity = self._get_activity_by_xid(window.get_xid())
- if new_activity is not None:
- self._set_pending_activity(new_activity)
- break
- else:
- logging.error('No activities are running')
- self._set_pending_activity(None)
-
- self.emit('activity-removed', home_activity)
- self._activities.remove(home_activity)
-
- def _remove_activity_by_xid(self, xid):
- home_activity = self._get_activity_by_xid(xid)
- if home_activity:
- self._remove_activity(home_activity)
- else:
- logging.error('Model for window %d does not exist.' % xid)
-
- def notify_activity_launch(self, activity_id, service_name):
- registry = activity.get_registry()
- activity_info = registry.get_activity(service_name)
- if not activity_info:
- raise ValueError("Activity service name '%s' was not found in the bundle registry." % service_name)
- home_activity = HomeActivity(activity_info, activity_id)
- home_activity.props.launching = True
- self._add_activity(home_activity)
-
- # FIXME: better learn about finishing processes by receiving a signal.
- # Now just check whether an activity has a window after ~90sec
- gobject.timeout_add(90000, self._check_activity_launched, activity_id)
-
- def notify_activity_launch_failed(self, activity_id):
- home_activity = self._get_activity_by_id(activity_id)
- if home_activity:
- logging.debug("Activity %s (%s) launch failed" % (activity_id, home_activity.get_type()))
- self._remove_activity(home_activity)
- else:
- logging.error('Model for activity id %s does not exist.' % activity_id)
-
- def _check_activity_launched(self, activity_id):
- home_activity = self._get_activity_by_id(activity_id)
- if home_activity and home_activity.props.launching:
- logging.debug('Activity %s still launching, assuming it failed...', activity_id)
- self.notify_activity_launch_failed(activity_id)
- return False
diff --git a/src/model/shellmodel.py b/src/model/shellmodel.py
deleted file mode 100644
index 5462e27..0000000
--- a/src/model/shellmodel.py
+++ /dev/null
@@ -1,112 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import os
-
-import wnck
-import gobject
-
-from sugar.presence import presenceservice
-from model.Friends import Friends
-from model.MeshModel import MeshModel
-from model.homemodel import HomeModel
-from model.Owner import ShellOwner
-from model.devices.devicesmodel import DevicesModel
-from sugar import env
-
-class ShellModel(gobject.GObject):
- STATE_STARTUP = 0
- STATE_RUNNING = 1
- STATE_SHUTDOWN = 2
-
- ZOOM_MESH = 0
- ZOOM_FRIENDS = 1
- ZOOM_HOME = 2
- ZOOM_ACTIVITY = 3
-
- __gproperties__ = {
- 'state' : (int, None, None,
- 0, 2, STATE_RUNNING,
- gobject.PARAM_READWRITE),
- 'zoom-level' : (int, None, None,
- 0, 3, ZOOM_HOME,
- gobject.PARAM_READABLE)
- }
-
- def __init__(self):
- gobject.GObject.__init__(self)
-
- self._current_activity = None
- self._state = self.STATE_RUNNING
- self._zoom_level = self.ZOOM_HOME
- self._showing_desktop = True
-
- self._pservice = presenceservice.get_instance()
-
- self._owner = ShellOwner()
-
- self._friends = Friends()
- self._mesh = MeshModel()
- self._home = HomeModel()
- self._devices = DevicesModel()
-
- self._screen = wnck.screen_get_default()
- self._screen.connect('showing-desktop-changed',
- self._showing_desktop_changed_cb)
-
- def set_zoom_level(self, level):
- self._zoom_level = level
- self.notify('zoom-level')
-
- def get_zoom_level(self):
- if self._screen.get_showing_desktop():
- return self._zoom_level
- else:
- return self.ZOOM_ACTIVITY
-
- def do_set_property(self, pspec, value):
- if pspec.name == 'state':
- self._state = value
-
- def do_get_property(self, pspec):
- if pspec.name == 'state':
- return self._state
- elif pspec.name == 'zoom-level':
- return self.get_zoom_level()
-
- def get_mesh(self):
- return self._mesh
-
- def get_friends(self):
- return self._friends
-
- def get_invites(self):
- return self._owner.get_invites()
-
- def get_home(self):
- return self._home
-
- def get_owner(self):
- return self._owner
-
- def get_devices(self):
- return self._devices
-
- def _showing_desktop_changed_cb(self, screen):
- showing_desktop = self._screen.get_showing_desktop()
- if self._showing_desktop != showing_desktop:
- self._showing_desktop = showing_desktop
- self.notify('zoom-level')
diff --git a/src/shellservice.py b/src/shellservice.py
deleted file mode 100644
index 458f941..0000000
--- a/src/shellservice.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-"""D-bus service providing access to the shell's functionality"""
-import dbus
-import os
-
-_DBUS_SERVICE = "org.laptop.Shell"
-_DBUS_SHELL_IFACE = "org.laptop.Shell"
-_DBUS_OWNER_IFACE = "org.laptop.Shell.Owner"
-_DBUS_PATH = "/org/laptop/Shell"
-
-_DBUS_RAINBOW_IFACE = "org.laptop.security.Rainbow"
-
-class ShellService(dbus.service.Object):
- """Provides d-bus service to script the shell's operations
-
- Uses a shell_model object to observe events such as changes to:
-
- * nickname
- * colour
- * icon
- * currently active activity
-
- and pass the event off to the methods in the dbus signature.
-
- Key method here at the moment is add_bundle, which is used to
- do a run-time registration of a bundle using it's application path.
-
- XXX At the moment the d-bus service methods do not appear to do
- anything other than add_bundle
- """
-
- _rainbow = None
-
- def __init__(self, shell):
- self._shell = shell
- self._shell_model = shell.get_model()
-
- self._owner = self._shell_model.get_owner()
- self._owner.connect('nick-changed', self._owner_nick_changed_cb)
- self._owner.connect('icon-changed', self._owner_icon_changed_cb)
- self._owner.connect('color-changed', self._owner_color_changed_cb)
-
- self._home_model = self._shell_model.get_home()
- self._home_model.connect('active-activity-changed',
- self._cur_activity_changed_cb)
-
- bus = dbus.SessionBus()
- bus_name = dbus.service.BusName(_DBUS_SERVICE, bus=bus)
- dbus.service.Object.__init__(self, bus_name, _DBUS_PATH)
-
- @dbus.service.method(_DBUS_SHELL_IFACE,
- in_signature="s", out_signature="b")
- def ActivateActivity(self, activity_id):
- host = self._shell.get_activity(activity_id)
- if host:
- host.present()
- return True
-
- return False
-
- @dbus.service.method(_DBUS_SHELL_IFACE,
- in_signature="ss", out_signature="")
- def NotifyLaunch(self, bundle_id, activity_id):
- self._shell.notify_launch(bundle_id, activity_id)
-
- @dbus.service.method(_DBUS_SHELL_IFACE,
- in_signature="s", out_signature="")
- def NotifyLaunchFailure(self, activity_id):
- self._shell.notify_launch_failure(activity_id)
-
- @dbus.service.signal(_DBUS_OWNER_IFACE, signature="s")
- def ColorChanged(self, color):
- pass
-
- def _owner_color_changed_cb(self, new_color):
- self.ColorChanged(new_color.to_string())
-
- @dbus.service.signal(_DBUS_OWNER_IFACE, signature="s")
- def NickChanged(self, nick):
- pass
-
- def _owner_nick_changed_cb(self, new_nick):
- self.NickChanged(new_nick)
-
- @dbus.service.signal(_DBUS_OWNER_IFACE, signature="ay")
- def IconChanged(self, icon_data):
- pass
-
- def _owner_icon_changed_cb(self, new_icon):
- self.IconChanged(dbus.ByteArray(new_icon))
-
- def _get_rainbow_service(self):
- """Lazily initializes an interface to the Rainbow security daemon."""
- if self._rainbow is None:
- system_bus = dbus.SystemBus()
- object = system_bus.get_object(_DBUS_RAINBOW_IFACE, '/',
- follow_name_owner_changes=True)
- self._rainbow = dbus.Interface(object,
- dbus_interface=_DBUS_RAINBOW_IFACE)
- return self._rainbow
-
- @dbus.service.signal(_DBUS_OWNER_IFACE, signature="s")
- def CurrentActivityChanged(self, activity_id):
- if os.path.exists('/etc/olpc-security'):
- self._get_rainbow_service().ChangeActivity(
- activity_id,
- dbus_interface=_DBUS_RAINBOW_IFACE)
-
- def _cur_activity_changed_cb(self, owner, new_activity):
- new_id = ""
- if new_activity:
- new_id = new_activity.get_activity_id()
- if new_id:
- self.CurrentActivityChanged(new_id)
-
diff --git a/src/view/ActivityHost.py b/src/view/ActivityHost.py
deleted file mode 100644
index 4332372..0000000
--- a/src/view/ActivityHost.py
+++ /dev/null
@@ -1,118 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import gtk
-import dbus
-import logging
-
-from sugar.presence import presenceservice
-
-import OverlayWindow
-
-class ActivityChatWindow(gtk.Window):
- def __init__(self, gdk_window, chat_widget):
- gtk.Window.__init__(self)
-
- self.realize()
- self.set_decorated(False)
- self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
- self.window.set_accept_focus(True)
- self.window.set_transient_for(gdk_window)
- self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
- self.set_default_size(600, 450)
-
- self.add(chat_widget)
-
-class ActivityHost:
- def __init__(self, model):
- self._model = model
- self._window = model.get_window()
- self._gdk_window = gtk.gdk.window_foreign_new(self.get_xid())
-
- try:
- self._overlay_window = OverlayWindow.OverlayWindow(self._gdk_window)
- win = self._overlay_window.window
- except RuntimeError:
- self._overlay_window = None
- win = self._gdk_window
-
- #self._chat_widget = ActivityChat.ActivityChat(self)
- self._chat_widget = gtk.HBox()
- self._chat_window = ActivityChatWindow(win, self._chat_widget)
-
- self._frame_was_visible = False
-
- def get_id(self):
- return self._model.get_activity_id()
-
- def get_xid(self):
- return self._window.get_xid()
-
- def get_model(self):
- return self._model
-
- def invite(self, buddy_model):
- service = self._model.get_service()
- if service:
- buddy = buddy_model.get_buddy()
- service.Invite(buddy.props.key)
- else:
- logging.error('Invite failed, activity service not ')
-
- def toggle_fullscreen(self):
- fullscreen = not self._window.is_fullscreen()
- self._window.set_fullscreen(fullscreen)
-
- def present(self):
- # wnck.Window.activate() expects a timestamp, but we don't
- # always have one, and libwnck will complain if we pass "0",
- # and matchbox doesn't look at the timestamp anyway. So we
- # just always pass "1".
- self._window.activate(1)
-
- def close(self):
- # The "1" is a fake timestamp as with present()
- self._window.close(1)
-
- def show_dialog(self, dialog):
- dialog.show()
- dialog.window.set_transient_for(self._gdk_window)
-
- def chat_show(self, frame_was_visible):
- if self._overlay_window:
- self._overlay_window.appear()
- self._chat_window.show_all()
- self._frame_was_visible = frame_was_visible
-
- def chat_hide(self):
- self._chat_window.hide()
- if self._overlay_window:
- self._overlay_window.disappear()
- wasvis = self._frame_was_visible
- self._frame_was_visible = False
- return wasvis
-
- def is_chat_visible(self):
- return self._chat_window.get_property('visible')
-
- def set_active(self, active):
- if not active:
- self.chat_hide()
- self._frame_was_visible = False
-
- def destroy(self):
- self._chat_window.destroy()
- self._frame_was_visible = False
diff --git a/src/view/BuddyIcon.py b/src/view/BuddyIcon.py
deleted file mode 100644
index 3734001..0000000
--- a/src/view/BuddyIcon.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright (C) 2006-2007 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.graphics.icon import CanvasIcon
-from sugar.graphics.palette import Palette
-from sugar.graphics import style
-
-from view.BuddyMenu import BuddyMenu
-
-class BuddyIcon(CanvasIcon):
- def __init__(self, shell, buddy, size=style.STANDARD_ICON_SIZE):
- CanvasIcon.__init__(self, icon_name='computer-xo', size=size)
-
- self._greyed_out = False
- self._shell = shell
- self._buddy = buddy
- self._buddy.connect('appeared', self._buddy_presence_change_cb)
- self._buddy.connect('disappeared', self._buddy_presence_change_cb)
- self._buddy.connect('color-changed', self._buddy_presence_change_cb)
-
- palette = BuddyMenu(shell, buddy)
- self.set_palette(palette)
-
- self._update_color()
-
- def _buddy_presence_change_cb(self, buddy, color=None):
- # Update the icon's color when the buddy comes and goes
- self._update_color()
-
- def _update_color(self):
- if self._greyed_out:
- self.props.stroke_color = '#D5D5D5'
- self.props.fill_color = '#E5E5E5'
- else:
- self.props.xo_color = self._buddy.get_color()
-
- def set_filter(self, query):
- self._greyed_out = (self._buddy.get_nick().lower().find(query) == -1) \
- and not self._buddy.is_owner()
- self._update_color()
-
diff --git a/src/view/BuddyMenu.py b/src/view/BuddyMenu.py
deleted file mode 100644
index e7e12ca..0000000
--- a/src/view/BuddyMenu.py
+++ /dev/null
@@ -1,113 +0,0 @@
-# Copyright (C) 2006-2007 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 gettext import gettext as _
-import logging
-
-import gobject
-import hippo
-
-from sugar.graphics.palette import Palette
-from sugar.graphics.menuitem import MenuItem
-from sugar.graphics.icon import Icon
-from sugar.presence import presenceservice
-
-class BuddyMenu(Palette):
- def __init__(self, shell, buddy):
- self._buddy = buddy
- self._shell = shell
-
- Palette.__init__(self, buddy.get_nick())
- self._active_activity_changed_hid = None
- self.connect('destroy', self.__destroy_cb)
-
- self._buddy.connect('icon-changed', self._buddy_icon_changed_cb)
- self._buddy.connect('nick-changed', self._buddy_nick_changed_cb)
-
- owner = self._get_shell_model().get_owner()
- if not buddy.is_owner():
- self._add_items()
-
- def _get_shell_model(self):
- return self._shell.get_model()
-
- def _get_home_model(self):
- return self._get_shell_model().get_home()
-
- def __destroy_cb(self, menu):
- if self._active_activity_changed_hid is not None:
- home_model = self._get_home_model()
- home_model.disconnect(self._active_activity_changed_hid)
-
- def _add_items(self):
- pservice = presenceservice.get_instance()
-
- friends = self._get_shell_model().get_friends()
- if friends.has_buddy(self._buddy):
- menu_item = MenuItem(_('Remove friend'), 'list-remove')
- menu_item.connect('activate', self._remove_friend_cb)
- else:
- menu_item = MenuItem(_('Make friend'), 'list-add')
- menu_item.connect('activate', self._make_friend_cb)
-
- self.menu.append(menu_item)
- menu_item.show()
-
- self._invite_menu = MenuItem('')
- self._invite_menu.connect('activate', self._invite_friend_cb)
- self.menu.append(self._invite_menu)
-
- home_model = self._get_home_model()
- self._active_activity_changed_hid = home_model.connect(
- 'active-activity-changed', self._cur_activity_changed_cb)
- activity = home_model.get_active_activity()
- self._update_invite_menu(activity)
-
- def _update_invite_menu(self, activity):
- if activity is None:
- self._invite_menu.hide()
- else:
- title = activity.get_title()
- label = self._invite_menu.get_children()[0]
- label.set_text(_('Invite to %s') % title)
-
- icon = Icon(file=activity.get_icon_path())
- icon.props.xo_color = activity.get_icon_color()
- self._invite_menu.set_image(icon)
- icon.show()
-
- self._invite_menu.show()
-
- def _cur_activity_changed_cb(self, home_model, activity_model):
- self._update_invite_menu(activity_model)
-
- def _buddy_icon_changed_cb(self, buddy):
- pass
-
- def _buddy_nick_changed_cb(self, buddy, nick):
- self.set_primary_text(nick)
-
- def _make_friend_cb(self, menuitem):
- friends = self._get_shell_model().get_friends()
- friends.make_friend(self._buddy)
-
- def _remove_friend_cb(self, menuitem):
- friends = self._get_shell_model().get_friends()
- friends.remove(self._buddy)
-
- def _invite_friend_cb(self, menuitem):
- activity = self._shell.get_current_activity()
- activity.invite(self._buddy)
-
diff --git a/src/view/Makefile.am b/src/view/Makefile.am
deleted file mode 100644
index abbb230..0000000
--- a/src/view/Makefile.am
+++ /dev/null
@@ -1,14 +0,0 @@
-SUBDIRS = devices frame home
-
-sugardir = $(pkgdatadir)/shell/view
-sugar_PYTHON = \
- __init__.py \
- ActivityHost.py \
- BuddyIcon.py \
- BuddyMenu.py \
- clipboardicon.py \
- clipboardmenu.py \
- keyhandler.py \
- pulsingicon.py \
- OverlayWindow.py \
- Shell.py
diff --git a/src/view/OverlayWindow.py b/src/view/OverlayWindow.py
deleted file mode 100644
index 376ca2f..0000000
--- a/src/view/OverlayWindow.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import gtk
-import cairo
-
-def _grab_pixbuf(window=None):
- if not window:
- screen = gtk.gdk.screen_get_default()
- window = screen.get_root_window()
- color_map = gtk.gdk.colormap_get_system()
- (x, y, w, h, bpp) = window.get_geometry()
- return gtk.gdk.pixbuf_get_from_drawable(None, window, color_map, x, y, 0, 0, w, h)
-
-class OverlayWindow(gtk.Window):
- def __init__(self, lower_window):
- gtk.Window.__init__(self)
- self._lower_window = lower_window
-
- self._img = gtk.Image()
- self.add(self._img)
-
- self.realize()
-
- self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
- self.window.set_accept_focus(False)
- self.window.set_transient_for(lower_window)
-
- self.set_decorated(False)
- self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
- self.set_default_size(gtk.gdk.screen_width(), gtk.gdk.screen_height())
- self.set_app_paintable(True)
-
-# self.connect('expose-event', self._expose_cb)
-
- def appear(self):
- pbuf = _grab_pixbuf(self._lower_window)
- #pbuf.saturate_and_pixelate(pbuf, 0.5, False)
- w = pbuf.get_width()
- h = pbuf.get_height()
- pbuf2 = pbuf.composite_color_simple(w, h, gtk.gdk.INTERP_NEAREST, 100, 1024, 0, 0)
- self._img.set_from_pixbuf(pbuf2)
- self.show_all()
-
- def disappear(self):
- self._img.set_from_pixbuf(None)
- self.hide()
-
- def _expose_cb(self, widget, event):
- cr = widget.window.cairo_create()
- cr.set_source_rgba(0.0, 0.0, 0.0, 0.4) # Transparent
- cr.set_operator(cairo.OPERATOR_SOURCE)
- cr.paint()
- return False
-
diff --git a/src/view/Shell.py b/src/view/Shell.py
deleted file mode 100644
index 72aa3b1..0000000
--- a/src/view/Shell.py
+++ /dev/null
@@ -1,298 +0,0 @@
-# Copyright (C) 2006-2007 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 gettext import gettext as _
-from sets import Set
-import logging
-import tempfile
-import os
-import time
-import shutil
-
-import gobject
-import gtk
-import wnck
-import dbus
-
-from sugar.activity.activityhandle import ActivityHandle
-from sugar import activity
-from sugar.activity import activityfactory
-from sugar.datastore import datastore
-from sugar import profile
-from sugar import env
-
-from view.ActivityHost import ActivityHost
-from view.frame.frame import Frame
-from view.keyhandler import KeyHandler
-from view.home.HomeWindow import HomeWindow
-from model.shellmodel import ShellModel
-
-# #3903 - this constant can be removed and assumed to be 1 when dbus-python
-# 0.82.3 is the only version used
-if dbus.version >= (0, 82, 3):
- DBUS_PYTHON_TIMEOUT_UNITS_PER_SECOND = 1
-else:
- DBUS_PYTHON_TIMEOUT_UNITS_PER_SECOND = 1000
-
-class Shell(gobject.GObject):
- def __init__(self, model):
- gobject.GObject.__init__(self)
-
- self._activities_starting = Set()
- self._model = model
- self._hosts = {}
- self._screen = wnck.screen_get_default()
- self._current_host = None
- self._pending_host = None
- self._screen_rotation = 0
- self._zoom_level = ShellModel.ZOOM_HOME
-
- self._key_handler = KeyHandler(self)
-
- self._frame = Frame(self)
-
- self._home_window = HomeWindow(self)
- self._home_window.show()
-
- home_model = self._model.get_home()
- home_model.connect('activity-started', self._activity_started_cb)
- home_model.connect('activity-removed', self._activity_removed_cb)
- home_model.connect('active-activity-changed',
- self._active_activity_changed_cb)
- home_model.connect('pending-activity-changed',
- self._pending_activity_changed_cb)
-
- self._model.connect('notify::zoom-level', self._zoom_level_changed_cb)
-
- gobject.idle_add(self._start_journal_idle)
-
- def _start_journal_idle(self):
- # Mount the datastore in internal flash
- ds_path = env.get_profile_path('datastore')
- try:
- datastore.mount(ds_path, [], timeout=120 * \
- DBUS_PYTHON_TIMEOUT_UNITS_PER_SECOND)
- except:
- # Don't explode if there's corruption; move the data out of the way
- # and attempt to create a store from scratch.
- shutil.move(ds_path, os.path.abspath(ds_path) + str(time.time()))
- datastore.mount(ds_path, [], timeout=120 * \
- DBUS_PYTHON_TIMEOUT_UNITS_PER_SECOND)
-
- # Checking for the bundle existence will also ensure
- # that the shell service is started up.
- registry = activity.get_registry()
- if registry.get_activity('org.laptop.JournalActivity'):
- self.start_activity('org.laptop.JournalActivity')
-
- def _activity_started_cb(self, home_model, home_activity):
- activity_host = ActivityHost(home_activity)
- self._hosts[activity_host.get_xid()] = activity_host
- if home_activity.get_type() in self._activities_starting:
- self._activities_starting.remove(home_activity.get_type())
-
- def _activity_removed_cb(self, home_model, home_activity):
- if home_activity.get_type() in self._activities_starting:
- self._activities_starting.remove(home_activity.get_type())
- xid = home_activity.get_xid()
- if self._hosts.has_key(xid):
- self._hosts[xid].destroy()
- del self._hosts[xid]
-
- def _active_activity_changed_cb(self, home_model, home_activity):
- if home_activity:
- host = self._hosts[home_activity.get_xid()]
- else:
- host = None
-
- if self._current_host:
- self._current_host.set_active(False)
-
- self._current_host = host
-
- def _pending_activity_changed_cb(self, home_model, home_activity):
- if home_activity:
- self._pending_host = self._hosts[home_activity.get_xid()]
- else:
- self._pending_host = None
-
- def get_model(self):
- return self._model
-
- def get_frame(self):
- return self._frame
-
- def join_activity(self, bundle_id, activity_id):
- activity_host = self.get_activity(activity_id)
- if activity_host:
- activity_host.present()
- return
-
- # Get the service name for this activity, if
- # we have a bundle on the system capable of handling
- # this activity type
- registry = activity.get_registry()
- bundle = registry.get_activity(bundle_id)
- if not bundle:
- logging.error("Couldn't find activity for type %s" % bundle_id)
- return
-
- handle = ActivityHandle(activity_id)
- activityfactory.create(bundle_id, handle)
-
- def notify_launch(self, bundle_id, activity_id):
- # Zoom to Home for launch feedback
- self.set_zoom_level(ShellModel.ZOOM_HOME)
-
- home_model = self._model.get_home()
- home_model.notify_activity_launch(activity_id, bundle_id)
-
- def notify_launch_failure(self, activity_id):
- home_model = self._model.get_home()
- home_model.notify_activity_launch_failed(activity_id)
-
- def start_activity(self, activity_type):
- if activity_type in self._activities_starting:
- logging.debug("This activity is still launching.")
- return
-
- self._activities_starting.add(activity_type)
- activityfactory.create(activity_type)
-
- def take_activity_screenshot(self):
- if self._model.get_zoom_level() != ShellModel.ZOOM_ACTIVITY:
- return
- if self.get_frame().visible:
- return
-
- home_model = self._model.get_home()
- activity = home_model.get_active_activity()
- if activity is not None:
- service = activity.get_service()
- if service is not None:
- try:
- service.TakeScreenshot(timeout=2.0)
- except dbus.DBusException, e:
- logging.debug('Error raised by TakeScreenshot(): %s', e)
-
- def set_zoom_level(self, level):
- if level == self._zoom_level:
- return
-
- self.take_activity_screenshot()
-
- if level == ShellModel.ZOOM_ACTIVITY:
- if self._pending_host is not None:
- self._pending_host.present()
- self._screen.toggle_showing_desktop(False)
- else:
- self._model.set_zoom_level(level)
- self._screen.toggle_showing_desktop(True)
- self._home_window.set_zoom_level(level)
-
- def _zoom_level_changed_cb(self, model, pspec):
- new_level = model.props.zoom_level
-
- if new_level == ShellModel.ZOOM_HOME:
- self._frame.show(Frame.MODE_NON_INTERACTIVE)
-
- if self._zoom_level == ShellModel.ZOOM_HOME:
- self._frame.hide()
-
- self._zoom_level = new_level
-
- def toggle_activity_fullscreen(self):
- if self._model.get_zoom_level() == ShellModel.ZOOM_ACTIVITY:
- self.get_current_activity().toggle_fullscreen()
-
- def activate_previous_activity(self):
- home_model = self._model.get_home()
- activity = home_model.get_previous_activity()
- if activity:
- self.take_activity_screenshot()
- activity.get_window().activate(1)
-
- def activate_next_activity(self):
- home_model = self._model.get_home()
- activity = home_model.get_next_activity()
- if activity:
- self.take_activity_screenshot()
- activity.get_window().activate(1)
-
- def close_current_activity(self):
- if self._model.get_zoom_level() != ShellModel.ZOOM_ACTIVITY:
- return
-
- home_model = self._model.get_home()
- activity = home_model.get_active_activity()
- if activity.get_type() == 'org.laptop.JournalActivity':
- return
-
- self.take_activity_screenshot()
- self.get_current_activity().close()
-
- def get_current_activity(self):
- return self._current_host
-
- def get_activity(self, activity_id):
- for host in self._hosts.values():
- if host.get_id() == activity_id:
- return host
- return None
-
- def toggle_chat_visibility(self):
- act = self.get_current_activity()
- if not act:
- return
- is_visible = self._frame.is_visible()
- if act.is_chat_visible():
- frame_was_visible = act.chat_hide()
- if not frame_was_visible:
- self._frame.do_slide_out()
- else:
- if not is_visible:
- self._frame.do_slide_in()
- act.chat_show(is_visible)
-
- def take_screenshot(self):
- file_path = os.path.join(tempfile.gettempdir(), '%i' % time.time())
-
- window = gtk.gdk.get_default_root_window()
- width, height = window.get_size()
- x_orig, y_orig = window.get_origin()
-
- screenshot = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, has_alpha=False,
- bits_per_sample=8, width=width, height=height)
- screenshot.get_from_drawable(window, window.get_colormap(), x_orig, y_orig, 0, 0,
- width, height)
- screenshot.save(file_path, "png")
- try:
- jobject = datastore.create()
- try:
- jobject.metadata['title'] = _('Screenshot')
- jobject.metadata['keep'] = '0'
- jobject.metadata['buddies'] = ''
- jobject.metadata['preview'] = ''
- jobject.metadata['icon-color'] = profile.get_color().to_string()
- jobject.metadata['mime_type'] = 'image/png'
- jobject.file_path = file_path
- datastore.write(jobject)
- finally:
- jobject.destroy()
- del jobject
- finally:
- os.remove(file_path)
-
diff --git a/src/view/__init__.py b/src/view/__init__.py
deleted file mode 100644
index a9dd95a..0000000
--- a/src/view/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2006-2007, 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
-
diff --git a/src/view/clipboardicon.py b/src/view/clipboardicon.py
deleted file mode 100644
index 4b36395..0000000
--- a/src/view/clipboardicon.py
+++ /dev/null
@@ -1,165 +0,0 @@
-# Copyright (C) 2007, Red Hat, Inc.
-# Copyright (C) 2007, One Laptop Per Child
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import logging
-from gettext import gettext as _
-
-import gobject
-import gtk
-
-from sugar.graphics.radiotoolbutton import RadioToolButton
-from sugar.graphics.xocolor import XoColor
-from sugar.graphics.icon import Icon
-from sugar.graphics import style
-from sugar.clipboard import clipboardservice
-from sugar.bundle.activitybundle import ActivityBundle
-from sugar import util
-from sugar import profile
-
-from view.clipboardmenu import ClipboardMenu
-from view.frame.frameinvoker import FrameWidgetInvoker
-
-class ClipboardIcon(RadioToolButton):
- __gtype_name__ = 'SugarClipboardIcon'
-
- def __init__(self, object_id, name, group):
- RadioToolButton.__init__(self, group=group)
- self._object_id = object_id
- self._name = name
- self._percent = 0
- self._preview = None
- self._activity = None
- self.owns_clipboard = False
- self.props.sensitive = False
- self.props.active = False
-
- self._icon = Icon()
- self._icon.props.xo_color = profile.get_color()
- self.set_icon_widget(self._icon)
- self._icon.show()
-
- cb_service = clipboardservice.get_instance()
- cb_service.connect('object-state-changed', self._object_state_changed_cb)
- obj = cb_service.get_object(self._object_id)
-
- self.palette = ClipboardMenu(self._object_id, self._name, self._percent,
- self._preview, self._activity,
- self._is_bundle(obj['FORMATS']))
- self.palette.props.invoker = FrameWidgetInvoker(self)
-
- self.child.connect('drag_data_get', self._drag_data_get_cb)
- self.connect('notify::active', self._notify_active_cb)
-
- def _is_bundle(self, formats):
- # A bundle will have only one format.
- return formats and formats[0] in [ActivityBundle.MIME_TYPE,
- ActivityBundle.DEPRECATED_MIME_TYPE]
-
- def get_object_id(self):
- return self._object_id
-
- def _drag_data_get_cb(self, widget, context, selection, targetType, eventTime):
- logging.debug('_drag_data_get_cb: requested target ' + selection.target)
-
- cb_service = clipboardservice.get_instance()
- data = cb_service.get_object_data(self._object_id, selection.target)['DATA']
-
- selection.set(selection.target, 8, data)
-
- def _put_in_clipboard(self):
- logging.debug('ClipboardIcon._put_in_clipboard')
-
- if self._percent < 100:
- raise ValueError('Object is not complete, cannot be put into the clipboard.')
-
- targets = self._get_targets()
- if targets:
- clipboard = gtk.Clipboard()
- if not clipboard.set_with_data(targets,
- self._clipboard_data_get_cb,
- self._clipboard_clear_cb,
- targets):
- logging.error('GtkClipboard.set_with_data failed!')
- else:
- self.owns_clipboard = True
-
- def _clipboard_data_get_cb(self, clipboard, selection, info, targets):
- if not selection.target in [target[0] for target in targets]:
- logging.warning('ClipboardIcon._clipboard_data_get_cb: asked %s but' \
- ' only have %r.' % (selection.target, targets))
- return
- cb_service = clipboardservice.get_instance()
- data = cb_service.get_object_data(self._object_id, selection.target)['DATA']
-
- selection.set(selection.target, 8, data)
-
- def _clipboard_clear_cb(self, clipboard, targets):
- logging.debug('ClipboardIcon._clipboard_clear_cb')
- self.owns_clipboard = False
-
- def _object_state_changed_cb(self, cb_service, object_id, name, percent,
- icon_name, preview, activity):
-
- if object_id != self._object_id:
- return
-
- cb_service = clipboardservice.get_instance()
- obj = cb_service.get_object(self._object_id)
-
- if icon_name:
- self._icon.props.icon_name = icon_name
- else:
- self._icon.props.icon_name = 'application-octet-stream'
-
- self.child.drag_source_set(gtk.gdk.BUTTON1_MASK,
- self._get_targets(),
- gtk.gdk.ACTION_COPY)
- self.child.drag_source_set_icon_name(self._icon.props.icon_name)
-
- self._name = name
- self._preview = preview
- self._activity = activity
- self.palette.set_state(name, percent, preview, activity,
- self._is_bundle(obj['FORMATS']))
-
- old_percent = self._percent
- self._percent = percent
- if self._percent == 100:
- self.props.sensitive = True
-
- # Clipboard object became complete. Make it the active one.
- if old_percent < 100 and self._percent == 100:
- self.props.active = True
-
- def _notify_active_cb(self, widget, pspec):
- if self.props.active:
- self._put_in_clipboard()
- else:
- self.owns_clipboard = False
-
- def _get_targets(self):
- cb_service = clipboardservice.get_instance()
-
- attrs = cb_service.get_object(self._object_id)
- format_types = attrs[clipboardservice.FORMATS_KEY]
-
- targets = []
- for format_type in format_types:
- targets.append((format_type, 0, 0))
-
- return targets
-
diff --git a/src/view/clipboardmenu.py b/src/view/clipboardmenu.py
deleted file mode 100644
index b847828..0000000
--- a/src/view/clipboardmenu.py
+++ /dev/null
@@ -1,223 +0,0 @@
-# Copyright (C) 2007, One Laptop Per Child
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-from gettext import gettext as _
-import tempfile
-import urlparse
-import os
-import logging
-
-import gtk
-import hippo
-
-from sugar.graphics.palette import Palette
-from sugar.graphics.menuitem import MenuItem
-from sugar.graphics import style
-from sugar.clipboard import clipboardservice
-from sugar.datastore import datastore
-from sugar import mime
-from sugar import profile
-from sugar import activity
-
-class ClipboardMenu(Palette):
-
- def __init__(self, object_id, name, percent, preview, activities, installable):
- Palette.__init__(self, name)
-
- self._object_id = object_id
- self._percent = percent
- self._activities = activities
-
- self.set_group_id('frame')
-
- self._progress_bar = None
-
- """
- if preview:
- self._preview_text = hippo.CanvasText(text=preview,
- size_mode=hippo.CANVAS_SIZE_WRAP_WORD)
- self._preview_text.props.color = color.LABEL_TEXT.get_int()
- self._preview_text.props.font_desc = \
- style.FONT_NORMAL.get_pango_desc()
- self.append(self._preview_text)
- """
-
- self._remove_item = MenuItem(_('Remove'), 'list-remove')
- self._remove_item.connect('activate', self._remove_item_activate_cb)
- self.menu.append(self._remove_item)
- self._remove_item.show()
-
- self._open_item = MenuItem(_('Open'))
- self._open_item.connect('activate', self._open_item_activate_cb)
- self.menu.append(self._open_item)
- self._open_item.show()
-
- #self._stop_item = MenuItem(_('Stop download'), 'stock-close')
- # TODO: Implement stopping downloads
- #self._stop_item.connect('activate', self._stop_item_activate_cb)
- #self.append_menu_item(self._stop_item)
-
- self._journal_item = MenuItem(_('Add to journal'), 'document-save')
- self._journal_item.connect('activate', self._journal_item_activate_cb)
- self.menu.append(self._journal_item)
- self._journal_item.show()
-
- self._update_items_visibility(installable)
- self._update_open_submenu()
-
- def _update_open_submenu(self):
- logging.debug('_update_open_submenu: %r' % self._activities)
- if self._activities is None or len(self._activities) <= 1:
- if self._open_item.get_submenu() is not None:
- self._open_item.remove_submenu()
- return
-
- submenu = self._open_item.get_submenu()
- if submenu is None:
- submenu = gtk.Menu()
- self._open_item.set_submenu(submenu)
- submenu.show()
- else:
- for item in submenu.get_children():
- submenu.remove(item)
-
- for service_name in self._activities:
- registry = activity.get_registry()
- activity_info = registry.get_activity(service_name)
-
- if not activity_info:
- logging.warning('Activity %s is unknown.' % service_name)
-
- item = gtk.MenuItem(activity_info.name)
- item.connect('activate', self._open_submenu_item_activate_cb, service_name)
- submenu.append(item)
- item.show()
-
- def _update_items_visibility(self, installable):
- if self._percent == 100 and (self._activities or installable):
- self._remove_item.props.sensitive = True
- self._open_item.props.sensitive = True
- #self._stop_item.props.sensitive = False
- self._journal_item.props.sensitive = True
- elif self._percent == 100 and (not self._activities and not installable):
- self._remove_item.props.sensitive = True
- self._open_item.props.sensitive = False
- #self._stop_item.props.sensitive = False
- self._journal_item.props.sensitive = True
- else:
- self._remove_item.props.sensitive = True
- self._open_item.props.sensitive = False
- # TODO: reenable the stop item when we implement stoping downloads.
- #self._stop_item.props.sensitive = True
- self._journal_item.props.sensitive = False
-
- self._update_progress_bar()
-
- def _update_progress_bar(self):
- if self._percent == 100.0:
- if self._progress_bar:
- self._progress_bar = None
- self.set_content(None)
- else:
- if self._progress_bar is None:
- self._progress_bar = gtk.ProgressBar()
- self._progress_bar.show()
- self.set_content(self._progress_bar)
-
- self._progress_bar.props.fraction = self._percent / 100.0
- self._progress_bar.props.text = '%.2f %%' % self._percent
-
- def set_state(self, name, percent, preview, activities, installable):
- self.set_primary_text(name)
- self._percent = percent
- self._activities = activities
- self._update_progress_bar()
- self._update_items_visibility(installable)
- self._update_open_submenu()
-
- def _open_item_activate_cb(self, menu_item):
- logging.debug('_open_item_activate_cb')
- if self._percent < 100 or menu_item.get_submenu() is not None:
- return
- jobject = self._copy_to_journal()
- jobject.resume(self._activities[0])
- jobject.destroy()
-
- def _open_submenu_item_activate_cb(self, menu_item, service_name):
- logging.debug('_open_submenu_item_activate_cb')
- if self._percent < 100:
- return
- jobject = self._copy_to_journal()
- jobject.resume(service_name)
- jobject.destroy()
-
- def _remove_item_activate_cb(self, menu_item):
- cb_service = clipboardservice.get_instance()
- cb_service.delete_object(self._object_id)
-
- def _journal_item_activate_cb(self, menu_item):
- logging.debug('_journal_item_activate_cb')
- jobject = self._copy_to_journal()
- jobject.destroy()
-
- def _write_to_temp_file(self, data):
- f, file_path = tempfile.mkstemp()
- try:
- os.write(f, data)
- finally:
- os.close(f)
- return file_path
-
- def _copy_to_journal(self):
- cb_service = clipboardservice.get_instance()
- obj = cb_service.get_object(self._object_id)
-
- format = mime.choose_most_significant(obj['FORMATS'])
- data = cb_service.get_object_data(self._object_id, format)
-
- transfer_ownership = False
- if format == 'text/uri-list':
- uris = mime.split_uri_list(data['DATA'])
- if len(uris) == 1 and uris[0].startswith('file://'):
- file_path = urlparse.urlparse(uris[0]).path
- transfer_ownership = False
- mime_type = mime.get_for_file(file_path)
- else:
- file_path = self._write_to_temp_file(data['DATA'])
- transfer_ownership = True
- mime_type = 'text/uri-list'
- else:
- if data['ON_DISK']:
- file_path = urlparse.urlparse(data['DATA']).path
- transfer_ownership = False
- mime_type = mime.get_for_file(file_path)
- else:
- file_path = self._write_to_temp_file(data['DATA'])
- transfer_ownership = True
- mime_type = mime.get_for_file(file_path)
-
- jobject = datastore.create()
- jobject.metadata['title'] = _('Clipboard object: %s.') % obj['NAME']
- jobject.metadata['keep'] = '0'
- jobject.metadata['buddies'] = ''
- jobject.metadata['preview'] = ''
- jobject.metadata['icon-color'] = profile.get_color().to_string()
- jobject.metadata['mime_type'] = mime_type
- jobject.file_path = file_path
- datastore.write(jobject, transfer_ownership=transfer_ownership)
-
- return jobject
-
diff --git a/src/view/devices/Makefile.am b/src/view/devices/Makefile.am
deleted file mode 100644
index c040beb..0000000
--- a/src/view/devices/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-SUBDIRS = network
-
-sugardir = $(pkgdatadir)/shell/view/devices
-sugar_PYTHON = \
- __init__.py \
- battery.py \
- deviceview.py
diff --git a/src/view/devices/__init__.py b/src/view/devices/__init__.py
deleted file mode 100644
index a9dd95a..0000000
--- a/src/view/devices/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2006-2007, 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
-
diff --git a/src/view/devices/battery.py b/src/view/devices/battery.py
deleted file mode 100644
index 09c69df..0000000
--- a/src/view/devices/battery.py
+++ /dev/null
@@ -1,100 +0,0 @@
-# Copyright (C) 2006-2007, 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 gettext import gettext as _
-
-import gtk
-
-from sugar import profile
-from sugar.graphics.icon import CanvasIcon
-from sugar.graphics.icon import get_icon_state
-from sugar.graphics import style
-from sugar.graphics.palette import Palette
-
-_ICON_NAME = 'battery'
-
-_STATUS_CHARGING = 0
-_STATUS_DISCHARGING = 1
-_STATUS_FULLY_CHARGED = 2
-
-class DeviceView(CanvasIcon):
- def __init__(self, model):
- CanvasIcon.__init__(self, size=style.MEDIUM_ICON_SIZE,
- xo_color=profile.get_color())
- self._model = model
- self._palette = BatteryPalette(_('My Battery life'))
- self.set_palette(self._palette)
-
- model.connect('notify::level', self._battery_status_changed_cb)
- model.connect('notify::charging', self._battery_status_changed_cb)
- model.connect('notify::discharging', self._battery_status_changed_cb)
- self._update_info()
-
- def _update_info(self):
- name = get_icon_state(_ICON_NAME, self._model.props.level)
- self.props.icon_name = name
-
- # Update palette
- if self._model.props.charging:
- status = _STATUS_CHARGING
- self.props.badge_name = 'emblem-charging'
- elif self._model.props.discharging:
- status = _STATUS_DISCHARGING
- self.props.badge_name = None
- else:
- status = _STATUS_FULLY_CHARGED
- self.props.badge_name = None
-
- self._palette.set_level(self._model.props.level)
- self._palette.set_status(status)
-
- def _battery_status_changed_cb(self, pspec, param):
- self._update_info()
-
-class BatteryPalette(Palette):
-
- def __init__(self, primary_text):
- Palette.__init__(self, primary_text)
-
- self._level = 0
- self._progress_bar = gtk.ProgressBar()
- self._progress_bar.show()
- self._status_label = gtk.Label()
- self._status_label.show()
-
- vbox = gtk.VBox()
- vbox.pack_start(self._progress_bar)
- vbox.pack_start(self._status_label)
- vbox.show()
-
- self.set_content(vbox)
-
- def set_level(self, percent):
- self._level = percent
- fraction = percent/100.0
- self._progress_bar.set_fraction(fraction)
-
- def set_status(self, status):
- percent_string = ' (%s%%)' % self._level
-
- if status == _STATUS_CHARGING:
- charge_text = _('Battery charging') + percent_string
- elif status == _STATUS_DISCHARGING:
- charge_text = _('Battery discharging') + percent_string
- elif status == _STATUS_FULLY_CHARGED:
- charge_text = _('Battery fully charged')
-
- self._status_label.set_text(charge_text)
diff --git a/src/view/devices/deviceview.py b/src/view/devices/deviceview.py
deleted file mode 100644
index f58da02..0000000
--- a/src/view/devices/deviceview.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (C) 2006-2007, 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.graphics.icon import CanvasIcon
-
-def create(model):
- name = 'view.devices.' + model.get_type()
-
- mod = __import__(name)
- components = name.split('.')
- for comp in components[1:]:
- mod = getattr(mod, comp)
-
- return mod.DeviceView(model)
diff --git a/src/view/devices/network/Makefile.am b/src/view/devices/network/Makefile.am
deleted file mode 100644
index 0d215f0..0000000
--- a/src/view/devices/network/Makefile.am
+++ /dev/null
@@ -1,6 +0,0 @@
-sugardir = $(pkgdatadir)/shell/view/devices/network
-sugar_PYTHON = \
- __init__.py \
- mesh.py \
- wired.py \
- wireless.py
diff --git a/src/view/devices/network/__init__.py b/src/view/devices/network/__init__.py
deleted file mode 100644
index a9dd95a..0000000
--- a/src/view/devices/network/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2006-2007, 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
-
diff --git a/src/view/devices/network/mesh.py b/src/view/devices/network/mesh.py
deleted file mode 100644
index 2543957..0000000
--- a/src/view/devices/network/mesh.py
+++ /dev/null
@@ -1,125 +0,0 @@
-#
-# Copyright (C) 2006-2007 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 gettext import gettext as _
-
-import gtk
-
-from sugar import profile
-from sugar.graphics.icon import CanvasIcon
-from sugar.graphics import style
-from model.devices import device
-
-from sugar.graphics.palette import Palette
-from model.devices.network import wireless
-
-from hardware import hardwaremanager
-
-class DeviceView(CanvasIcon):
- def __init__(self, model):
- CanvasIcon.__init__(self, size=style.MEDIUM_ICON_SIZE,
- icon_name='network-mesh')
- self._model = model
- self._palette = MeshPalette(_("Mesh Network"), model)
- self.set_palette(self._palette)
-
- model.connect('notify::state', self._state_changed_cb)
- model.connect('notify::activation-stage', self._state_changed_cb)
- self._update_state()
-
- def _state_changed_cb(self, model, pspec):
- self._update_state()
-
- def _update_state(self):
- # FIXME Change icon colors once we have real icons
- state = self._model.props.state
- self._palette.update_state(state)
-
- if state == device.STATE_ACTIVATING:
- self.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
- self.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
- elif state == device.STATE_ACTIVATED:
- self.props.xo_color = profile.get_color()
- elif state == device.STATE_INACTIVE:
- self.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
- self.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
-
- if state == device.STATE_INACTIVE:
- self._palette.set_primary_text(_("Mesh Network"))
- else:
- chan = wireless.freq_to_channel(self._model.props.frequency)
- if chan > 0:
- self._palette.set_primary_text(_("Mesh Network") + " %d" % chan)
- self._palette.set_mesh_step(self._model.props.mesh_step, state)
-
-class MeshPalette(Palette):
- def __init__(self, primary_text, model):
- Palette.__init__(self, primary_text, menu_after_content=True)
- self._model = model
-
- self._step_label = gtk.Label()
- self._step_label.show()
-
- vbox = gtk.VBox()
- vbox.pack_start(self._step_label)
- vbox.show()
-
- self.set_content(vbox)
-
- self._disconnect_item = gtk.MenuItem(_('Disconnect...'))
- self._disconnect_item.connect('activate', self._disconnect_activate_cb)
- self.menu.append(self._disconnect_item)
-
- def update_state(self, state):
- if state == device.STATE_ACTIVATED:
- self._disconnect_item.show()
- else:
- self._disconnect_item.hide()
-
- def _disconnect_activate_cb(self, menuitem):
- # Disconnection for an mesh means activating the default mesh device
- # again without a channel
- network_manager = hardwaremanager.get_network_manager()
- nm_device = self._model.get_nm_device()
- if network_manager and nm_device:
- network_manager.set_active_device(nm_device)
-
- def set_mesh_step(self, step, state):
- label = ""
- if step == 1:
- if state == device.STATE_ACTIVATED:
- label = _("Connected to a School Mesh Portal")
- elif state == device.STATE_ACTIVATING:
- label = _("Looking for a School Mesh Portal...")
- elif step == 3:
- if state == device.STATE_ACTIVATED:
- label = _("Connected to an XO Mesh Portal")
- elif state == device.STATE_ACTIVATING:
- label = _("Looking for an XO Mesh Portal...")
- elif step == 4:
- if state == device.STATE_ACTIVATED:
- label = _("Connected to a Simple Mesh")
- elif state == device.STATE_ACTIVATING:
- label = _("Starting a Simple Mesh")
-
- if len(label):
- self._step_label.set_text(label)
- else:
- import logging
- logging.debug("Unhandled mesh step %d" % step)
- self._step_label.set_text(_("Unknown Mesh"))
-
diff --git a/src/view/devices/network/wired.py b/src/view/devices/network/wired.py
deleted file mode 100644
index dc83a08..0000000
--- a/src/view/devices/network/wired.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright (C) 2006-2007, 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 view.devices import deviceview
-
-class DeviceView(deviceview.DeviceView):
- def __init__(self, model):
- deviceview.DeviceView.__init__(self, model)
- self.props.icon_name = 'network-wired'
diff --git a/src/view/devices/network/wireless.py b/src/view/devices/network/wireless.py
deleted file mode 100644
index f4f8869..0000000
--- a/src/view/devices/network/wireless.py
+++ /dev/null
@@ -1,132 +0,0 @@
-#
-# Copyright (C) 2006-2007 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 gettext import gettext as _
-
-import gtk
-
-from sugar.graphics.icon import get_icon_state
-from sugar.graphics.icon import CanvasIcon
-from sugar.graphics import style
-from sugar.graphics.palette import Palette
-
-from model.devices.network import wireless
-from model.devices import device
-
-from hardware import hardwaremanager
-from hardware import nmclient
-
-_ICON_NAME = 'network-wireless'
-
-class DeviceView(CanvasIcon):
- def __init__(self, model):
- CanvasIcon.__init__(self, size=style.MEDIUM_ICON_SIZE)
- self._model = model
-
- meshdev = None
- network_manager = hardwaremanager.get_network_manager()
- for device in network_manager.get_devices():
- if device.get_type() == nmclient.DEVICE_TYPE_802_11_MESH_OLPC:
- meshdev = device
- break
-
- self._palette = WirelessPalette(self._get_palette_primary_text(), meshdev)
- self.set_palette(self._palette)
- self._counter = 0
- self._palette.set_frequency(self._model.props.frequency)
-
- model.connect('notify::name', self._name_changed_cb)
- model.connect('notify::strength', self._strength_changed_cb)
- model.connect('notify::state', self._state_changed_cb)
-
- self._update_icon()
- self._update_state()
-
- def _get_palette_primary_text(self):
- if self._model.props.state == device.STATE_INACTIVE:
- return _("Disconnected")
- return self._model.props.name
-
- def _strength_changed_cb(self, model, pspec):
- self._update_icon()
- # Only update frequency periodically
- if self._counter % 4 == 0:
- self._palette.set_frequency(self._model.props.frequency)
- self._counter += 1
-
- def _name_changed_cb(self, model, pspec):
- self.palette.set_primary_text(self._get_palette_primary_text())
-
- def _state_changed_cb(self, model, pspec):
- self._update_state()
- self.palette.set_primary_text(self._get_palette_primary_text())
-
- def _update_icon(self):
- strength = self._model.props.strength
- if self._model.props.state == device.STATE_INACTIVE:
- strength = 0
- icon_name = get_icon_state(_ICON_NAME, strength)
- if icon_name:
- self.props.icon_name = icon_name
-
- def _update_state(self):
- # FIXME Change icon colors once we have real icons
- state = self._model.props.state
- if state == device.STATE_ACTIVATING:
- self.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
- self.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
- elif state == device.STATE_ACTIVATED:
- (stroke, fill) = self._model.get_active_network_colors()
- self.props.stroke_color = stroke
- self.props.fill_color = fill
- elif state == device.STATE_INACTIVE:
- self.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
- self.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
-
-class WirelessPalette(Palette):
- def __init__(self, primary_text, meshdev):
- Palette.__init__(self, primary_text, menu_after_content=True)
- self._meshdev = meshdev
-
- self._chan_label = gtk.Label()
- self._chan_label.show()
-
- vbox = gtk.VBox()
- vbox.pack_start(self._chan_label)
- vbox.show()
-
- if meshdev:
- disconnect_item = gtk.MenuItem(_('Disconnect...'))
- disconnect_item.connect('activate', self._disconnect_activate_cb)
- self.menu.append(disconnect_item)
- disconnect_item.show()
-
- self.set_content(vbox)
-
- def _disconnect_activate_cb(self, menuitem):
- # Disconnection for an AP means activating the default mesh device
- network_manager = hardwaremanager.get_network_manager()
- if network_manager and self._meshdev:
- network_manager.set_active_device(self._meshdev)
-
- def set_frequency(self, freq):
- try:
- chan = wireless.freq_to_channel(freq)
- except KeyError:
- chan = 0
- self._chan_label.set_text("%s: %d" % (_("Channel"), chan))
-
diff --git a/src/view/frame/Makefile.am b/src/view/frame/Makefile.am
deleted file mode 100644
index 02951b9..0000000
--- a/src/view/frame/Makefile.am
+++ /dev/null
@@ -1,14 +0,0 @@
-sugardir = $(pkgdatadir)/shell/view/frame
-sugar_PYTHON = \
- __init__.py \
- activitiestray.py \
- activitybutton.py \
- clipboardbox.py \
- clipboardpanelwindow.py \
- frameinvoker.py \
- friendstray.py \
- eventarea.py \
- frame.py \
- overlaybox.py \
- framewindow.py \
- zoomtoolbar.py
diff --git a/src/view/frame/__init__.py b/src/view/frame/__init__.py
deleted file mode 100644
index a9dd95a..0000000
--- a/src/view/frame/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2006-2007, 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
-
diff --git a/src/view/frame/activitiestray.py b/src/view/frame/activitiestray.py
deleted file mode 100644
index 11e812c..0000000
--- a/src/view/frame/activitiestray.py
+++ /dev/null
@@ -1,159 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import os
-import logging
-
-import hippo
-
-from sugar.graphics.tray import TrayButton
-from sugar.graphics.tray import HTray
-from sugar.graphics.icon import Icon
-from sugar.graphics import style
-from sugar import profile
-from sugar import activity
-from sugar import env
-
-from activitybutton import ActivityButton
-import config
-
-class InviteButton(TrayButton):
- def __init__(self, activity_model, invite):
- TrayButton.__init__(self)
-
- icon = Icon(file=activity_model.get_icon_name(),
- xo_color=activity_model.get_color())
- self.set_icon_widget(icon)
- icon.show()
-
- self._invite = invite
-
- def get_activity_id(self):
- return self._invite.get_activity_id()
-
- def get_bundle_id(self):
- return self._invite.get_bundle_id()
-
- def get_invite(self):
- return self._invite
-
-class ActivitiesTray(hippo.CanvasBox):
- def __init__(self, shell):
- hippo.CanvasBox.__init__(self, orientation=hippo.ORIENTATION_HORIZONTAL)
-
- self._shell = shell
- self._shell_model = self._shell.get_model()
- self._invite_to_item = {}
- self._invites = self._shell_model.get_invites()
- self._config = self._load_config()
-
- self._tray = HTray()
- self.append(hippo.CanvasWidget(widget=self._tray), hippo.PACK_EXPAND)
- self._tray.show()
-
- registry = activity.get_registry()
- registry.get_activities_async(reply_handler=self._get_activities_cb)
-
- registry.connect('activity-added', self._activity_added_cb)
- registry.connect('activity-removed', self._activity_removed_cb)
-
- for invite in self._invites:
- self.add_invite(invite)
- self._invites.connect('invite-added', self._invite_added_cb)
- self._invites.connect('invite-removed', self._invite_removed_cb)
-
- def _load_config(self):
- cfg = []
-
- f = open(os.path.join(config.data_path, 'activities.defaults'), 'r')
- for line in f.readlines():
- line = line.strip()
- if line and not line.startswith('#'):
- cfg.append(line)
- f.close()
-
- return cfg
-
- def _get_activities_cb(self, activity_list):
- known_activities = []
- unknown_activities = []
- name_to_activity = {}
-
- while activity_list:
- info = activity_list.pop()
- name_to_activity[info.bundle_id] = info
-
- if info.bundle_id in self._config:
- known_activities.append(info)
- else:
- unknown_activities.append(info)
-
- sorted_activities = []
- for name in self._config:
- if name in name_to_activity:
- sorted_activities.append(name_to_activity[name])
-
- for info in sorted_activities + unknown_activities:
- if info.show_launcher:
- self.add_activity(info)
-
- def _activity_clicked_cb(self, icon):
- self._shell.start_activity(icon.get_bundle_id())
-
- def _invite_clicked_cb(self, icon):
- self._invites.remove_invite(icon.get_invite())
- self._shell.join_activity(icon.get_bundle_id(),
- icon.get_activity_id())
-
- def _invite_added_cb(self, invites, invite):
- self.add_invite(invite)
-
- def _invite_removed_cb(self, invites, invite):
- self.remove_invite(invite)
-
- def _remove_activity_cb(self, item):
- self._tray.remove_item(item)
-
- def _activity_added_cb(self, activity_registry, activity_info):
- self.add_activity(activity_info)
-
- def _activity_removed_cb(self, activity_registry, activity_info):
- for item in self._tray.get_children():
- if item.get_bundle_id() == activity_info.bundle_id:
- self._tray.remove_item(item)
- return
-
- def add_activity(self, activity_info):
- item = ActivityButton(activity_info)
- item.connect('clicked', self._activity_clicked_cb)
- item.connect('remove_activity', self._remove_activity_cb)
- self._tray.add_item(item, -1)
- item.show()
-
- def add_invite(self, invite):
- mesh = self._shell_model.get_mesh()
- activity_model = mesh.get_activity(invite.get_activity_id())
- if activity:
- item = InviteButton(activity_model, invite)
- item.connect('clicked', self._invite_clicked_cb)
- self._tray.add_item(item, 0)
- item.show()
-
- self._invite_to_item[invite] = item
-
- def remove_invite(self, invite):
- self._tray.remove_item(self._invite_to_item[invite])
- del self._invite_to_item[invite]
diff --git a/src/view/frame/activitybutton.py b/src/view/frame/activitybutton.py
deleted file mode 100644
index 0c7c7fb..0000000
--- a/src/view/frame/activitybutton.py
+++ /dev/null
@@ -1,65 +0,0 @@
-# Copyright (C) 2007, One Laptop Per Child
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-import gtk
-import os
-import gobject
-from gettext import gettext as _
-
-from sugar.graphics.palette import Palette
-from sugar.graphics.tray import TrayButton
-from sugar.graphics.icon import Icon
-from sugar.graphics import style
-
-from view.frame.frameinvoker import FrameWidgetInvoker
-
-class ActivityButton(TrayButton, gobject.GObject):
- __gtype_name__ = 'SugarActivityButton'
- __gsignals__ = {
- 'remove_activity': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([]))
- }
-
- def __init__(self, activity_info):
- TrayButton.__init__(self)
-
- icon = Icon(file=activity_info.icon,
- stroke_color=style.COLOR_WHITE.get_svg(),
- fill_color=style.COLOR_TRANSPARENT.get_svg())
- self.set_icon_widget(icon)
- icon.show()
-
- self._activity_info = activity_info
- self.setup_rollover_options()
-
- def get_bundle_id(self):
- return self._activity_info.bundle_id
-
- def setup_rollover_options(self):
- palette = Palette(self._activity_info.name)
- self.set_palette(palette)
- palette.props.invoker = FrameWidgetInvoker(self)
-
-#TODO: Disabled this until later, see #4967
-# if os.path.dirname(self._activity_info.path) == os.path.expanduser('~/Activities'):
-# menu_item = gtk.MenuItem(_('Remove'))
-# menu_item.connect('activate', self.item_remove_cb)
-# palette.menu.append(menu_item)
-# menu_item.show()
-
- def item_remove_cb(self, widget):
- self.emit('remove_activity')
diff --git a/src/view/frame/clipboardbox.py b/src/view/frame/clipboardbox.py
deleted file mode 100644
index 7702759..0000000
--- a/src/view/frame/clipboardbox.py
+++ /dev/null
@@ -1,193 +0,0 @@
-# Copyright (C) 2007, One Laptop Per Child
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import os
-import logging
-import tempfile
-
-import hippo
-import gtk
-
-from sugar import util
-from sugar.clipboard import clipboardservice
-from sugar.graphics.tray import VTray
-from sugar.graphics import style
-
-from view.clipboardicon import ClipboardIcon
-
-class _ContextMap:
- """Maps a drag context to the clipboard object involved in the dragging."""
- def __init__(self):
- self._context_map = {}
-
- def add_context(self, context, object_id, data_types):
- """Establishes the mapping. data_types will serve us for reference-
- counting this mapping.
- """
- self._context_map[context] = [object_id, data_types]
-
- def get_object_id(self, context):
- """Retrieves the object_id associated with context.
- Will release the association when this function was called as many times
- as the number of data_types that this clipboard object contains.
- """
- [object_id, data_types_left] = self._context_map[context]
-
- data_types_left = data_types_left - 1
- if data_types_left == 0:
- del self._context_map[context]
- else:
- self._context_map[context] = [object_id, data_types_left]
-
- return object_id
-
- def has_context(self, context):
- return context in self._context_map
-
-class ClipboardBox(hippo.CanvasBox):
-
- MAX_ITEMS = gtk.gdk.screen_height() / style.GRID_CELL_SIZE - 2
-
- def __init__(self):
- hippo.CanvasBox.__init__(self)
- self._icons = {}
- self._context_map = _ContextMap()
-
- self._tray = VTray()
- self.append(hippo.CanvasWidget(widget=self._tray), hippo.PACK_EXPAND)
- self._tray.show()
-
- cb_service = clipboardservice.get_instance()
- cb_service.connect('object-added', self._object_added_cb)
- cb_service.connect('object-deleted', self._object_deleted_cb)
-
- def owns_clipboard(self):
- for icon in self._icons.values():
- if icon.owns_clipboard:
- return True
- return False
-
- def _add_selection(self, object_id, selection):
- if not selection.data:
- return
-
- logging.debug('ClipboardBox: adding type ' + selection.type)
-
- cb_service = clipboardservice.get_instance()
- if selection.type == 'text/uri-list':
- uris = selection.data.split('\n')
- if len(uris) > 1:
- raise NotImplementedError('Multiple uris in text/uri-list still not supported.')
-
- cb_service.add_object_format(object_id,
- selection.type,
- uris[0],
- on_disk=True)
- else:
- cb_service.add_object_format(object_id,
- selection.type,
- selection.data,
- on_disk=False)
-
- def _object_added_cb(self, cb_service, object_id, name):
- if self._icons:
- group = self._icons.values()[0]
- else:
- group = None
-
- icon = ClipboardIcon(object_id, name, group)
- self._tray.add_item(icon, 0)
- icon.show()
- self._icons[object_id] = icon
-
- objects_to_delete = self._tray.get_children()[ClipboardBox.MAX_ITEMS:]
- for icon in objects_to_delete:
- logging.debug('ClipboardBox: deleting surplus object')
- cb_service = clipboardservice.get_instance()
- cb_service.delete_object(icon.get_object_id())
-
- logging.debug('ClipboardBox: ' + object_id + ' was added.')
-
- def _object_deleted_cb(self, cb_service, object_id):
- icon = self._icons[object_id]
- self._tray.remove_item(icon)
- del self._icons[object_id]
- logging.debug('ClipboardBox: ' + object_id + ' was deleted.')
-
- def drag_motion_cb(self, widget, context, x, y, time):
- logging.debug('ClipboardBox._drag_motion_cb')
- context.drag_status(gtk.gdk.ACTION_COPY, time)
- return True;
-
- def drag_drop_cb(self, widget, context, x, y, time):
- logging.debug('ClipboardBox._drag_drop_cb')
- cb_service = clipboardservice.get_instance()
- object_id = cb_service.add_object(name="")
-
- self._context_map.add_context(context, object_id, len(context.targets))
-
- if 'XdndDirectSave0' in context.targets:
- window = context.source_window
- prop_type, format, filename = \
- window.property_get('XdndDirectSave0','text/plain')
-
- # FIXME query the clipboard service for a filename?
- base_dir = tempfile.gettempdir()
- dest_filename = util.unique_id()
-
- name, dot, extension = filename.rpartition('.')
- dest_filename += dot + extension
-
- dest_uri = 'file://' + os.path.join(base_dir, dest_filename)
-
- window.property_change('XdndDirectSave0', prop_type, format,
- gtk.gdk.PROP_MODE_REPLACE, dest_uri)
-
- widget.drag_get_data(context, 'XdndDirectSave0', time)
- else:
- for target in context.targets:
- if str(target) not in ('TIMESTAMP', 'TARGETS', 'MULTIPLE'):
- widget.drag_get_data(context, target, time)
-
- cb_service.set_object_percent(object_id, percent=100)
-
- return True
-
- def drag_data_received_cb(self, widget, context, x, y, selection, targetType, time):
- logging.debug('ClipboardBox: got data for target %r' % selection.target)
-
- object_id = self._context_map.get_object_id(context)
- try:
- if selection is None:
- logging.warn('ClipboardBox: empty selection for target ' + selection.target)
- elif selection.target == 'XdndDirectSave0':
- if selection.data == 'S':
- window = context.source_window
-
- prop_type, format, dest = \
- window.property_get('XdndDirectSave0','text/plain')
-
- clipboard = clipboardservice.get_instance()
- clipboard.add_object_format(
- object_id, 'XdndDirectSave0', dest, on_disk=True)
- else:
- self._add_selection(object_id, selection)
-
- finally:
- # If it's the last target to be processed, finish the dnd transaction
- if not self._context_map.has_context(context):
- context.drop_finish(True, gtk.get_current_event_time())
-
diff --git a/src/view/frame/clipboardpanelwindow.py b/src/view/frame/clipboardpanelwindow.py
deleted file mode 100644
index e579b8c..0000000
--- a/src/view/frame/clipboardpanelwindow.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# Copyright (C) 2007, One Laptop Per Child
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import logging
-import urlparse
-
-import gtk
-import hippo
-
-from view.frame.framewindow import FrameWindow
-from view.frame.clipboardbox import ClipboardBox
-from sugar.clipboard import clipboardservice
-from sugar import util
-
-class ClipboardPanelWindow(FrameWindow):
- def __init__(self, frame, orientation):
- FrameWindow.__init__(self, orientation)
-
- self._frame = frame
-
- # Listening for new clipboard objects
- # NOTE: we need to keep a reference to gtk.Clipboard in order to keep
- # listening to it.
- self._clipboard = gtk.Clipboard()
- self._clipboard.connect("owner-change", self._owner_change_cb)
-
- self._clipboard_box = ClipboardBox()
- self.append(self._clipboard_box, hippo.PACK_EXPAND)
-
- # Receiving dnd drops
- self.drag_dest_set(0, [], 0)
- self.connect("drag_motion", self._clipboard_box.drag_motion_cb)
- self.connect("drag_drop", self._clipboard_box.drag_drop_cb)
- self.connect("drag_data_received",
- self._clipboard_box.drag_data_received_cb)
-
- def _owner_change_cb(self, clipboard, event):
- logging.debug("owner_change_cb")
-
- if self._clipboard_box.owns_clipboard():
- return
-
- cb_service = clipboardservice.get_instance()
- key = cb_service.add_object(name="")
- cb_service.set_object_percent(key, percent=0)
-
- targets = clipboard.wait_for_targets()
- for target in targets:
- if target not in ('TIMESTAMP', 'TARGETS', 'MULTIPLE', 'SAVE_TARGETS'):
- logging.debug('Asking for target %s.' % target)
- selection = clipboard.wait_for_contents(target)
- if not selection:
- logging.warning('no data for selection target %s.' % target)
- continue
- self._add_selection(key, selection)
-
- cb_service.set_object_percent(key, percent=100)
-
- def _add_selection(self, key, selection):
- if not selection.data:
- logging.warning('no data for selection target %s.' % selection.type)
- return
-
- logging.debug('adding type ' + selection.type + '.')
-
- cb_service = clipboardservice.get_instance()
- if selection.type == 'text/uri-list':
- uris = selection.get_uris()
-
- if len(uris) > 1:
- raise NotImplementedError('Multiple uris in text/uri-list still not supported.')
- uri = uris[0]
-
- scheme, netloc, path, parameters, query, fragment = urlparse.urlparse(uri)
- on_disk = (scheme == 'file')
-
- cb_service.add_object_format(key,
- selection.type,
- uri,
- on_disk)
- else:
- cb_service.add_object_format(key,
- selection.type,
- selection.data,
- on_disk=False)
-
diff --git a/src/view/frame/eventarea.py b/src/view/frame/eventarea.py
deleted file mode 100644
index 69bb759..0000000
--- a/src/view/frame/eventarea.py
+++ /dev/null
@@ -1,106 +0,0 @@
-# Copyright (C) 2007, 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
-
-import gtk
-import gobject
-import wnck
-
-class EventArea(gobject.GObject):
- __gsignals__ = {
- 'enter': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([])),
- 'leave': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([]))
- }
-
- def __init__(self):
- gobject.GObject.__init__(self)
-
- self._windows = []
- self._hover = False
-
- right = gtk.gdk.screen_width() - 1
- bottom = gtk.gdk.screen_height() -1
-
- invisible = self._create_invisible(0, 0, 1, 1)
- self._windows.append(invisible)
-
- invisible = self._create_invisible(right, 0, 1, 1)
- self._windows.append(invisible)
-
- invisible = self._create_invisible(0, bottom, 1, 1)
- self._windows.append(invisible)
-
- invisible = self._create_invisible(right, bottom, 1, 1)
- self._windows.append(invisible)
-
- screen = wnck.screen_get_default()
- screen.connect('window-stacking-changed',
- self._window_stacking_changed_cb)
-
- def _create_invisible(self, x, y, width, height):
- invisible = gtk.Invisible()
- invisible.connect('enter-notify-event', self._enter_notify_cb)
- invisible.connect('leave-notify-event', self._leave_notify_cb)
-
- invisible.drag_dest_set(0, [], 0)
- invisible.connect('drag_motion', self._drag_motion_cb)
- invisible.connect('drag_leave', self._drag_leave_cb)
-
- invisible.realize()
- invisible.window.set_events(gtk.gdk.POINTER_MOTION_MASK |
- gtk.gdk.ENTER_NOTIFY_MASK |
- gtk.gdk.LEAVE_NOTIFY_MASK)
- invisible.window.move_resize(x, y, width, height)
-
- return invisible
-
- def _notify_enter(self):
- if not self._hover:
- self._hover = True
- self.emit('enter')
-
- def _notify_leave(self):
- if self._hover:
- self._hover = False
- self.emit('leave')
-
- def _enter_notify_cb(self, widget, event):
- self._notify_enter()
-
- def _leave_notify_cb(self, widget, event):
- self._notify_leave()
-
- def _drag_motion_cb(self, widget, drag_context, x, y, timestamp):
- drag_context.drag_status(0, timestamp);
- self._notify_enter()
- return True
-
- def _drag_leave_cb(self, widget, drag_context, timestamp):
- self._notify_leave()
- return True
-
- def show(self):
- for window in self._windows:
- window.show()
-
- def hide(self):
- for window in self._windows:
- window.hide()
-
- def _window_stacking_changed_cb(self, screen):
- for window in self._windows:
- window.window.raise_()
diff --git a/src/view/frame/frame.py b/src/view/frame/frame.py
deleted file mode 100644
index e8f8fa4..0000000
--- a/src/view/frame/frame.py
+++ /dev/null
@@ -1,272 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import logging
-
-import gtk
-import gobject
-import hippo
-
-from sugar.graphics import animator
-from sugar.graphics import style
-from sugar.graphics import palettegroup
-from sugar.clipboard import clipboardservice
-
-from view.frame.eventarea import EventArea
-from view.frame.activitiestray import ActivitiesTray
-from view.frame.zoomtoolbar import ZoomToolbar
-from view.frame.friendstray import FriendsTray
-from view.frame.framewindow import FrameWindow
-from view.frame.clipboardpanelwindow import ClipboardPanelWindow
-from model.shellmodel import ShellModel
-
-_FRAME_HIDING_DELAY = 500
-
-class _Animation(animator.Animation):
- def __init__(self, frame, end):
- start = frame.current_position
- animator.Animation.__init__(self, start, end)
- self._frame = frame
-
- def next_frame(self, current):
- self._frame.move(current)
-
-class _MouseListener(object):
- def __init__(self, frame):
- self._frame = frame
- self._hide_sid = 0
-
- def mouse_enter(self):
- self._show_frame()
-
- def mouse_leave(self):
- if self._frame.mode == Frame.MODE_MOUSE:
- self._hide_frame()
-
- def _show_frame(self):
- if self._hide_sid != 0:
- gobject.source_remove(self._hide_sid)
- self._frame.show(Frame.MODE_MOUSE)
-
- def _hide_frame_timeout_cb(self):
- self._frame.hide()
- return False
-
- def _hide_frame(self):
- if self._hide_sid != 0:
- gobject.source_remove(self._hide_sid)
- self._hide_sid = gobject.timeout_add(
- _FRAME_HIDING_DELAY, self._hide_frame_timeout_cb)
-
-class _KeyListener(object):
- def __init__(self, frame):
- self._frame = frame
-
- def key_press(self):
- if self._frame.visible:
- if self._frame.mode == Frame.MODE_KEYBOARD:
- self._frame.hide()
- else:
- self._frame.show(Frame.MODE_KEYBOARD)
-
-class Frame(object):
- MODE_MOUSE = 0
- MODE_KEYBOARD = 1
- MODE_NON_INTERACTIVE = 2
-
- def __init__(self, shell):
- self.mode = None
-
- self._palette_group = palettegroup.get_group('frame')
- self._palette_group.connect('popdown', self._palette_group_popdown_cb)
-
- self._left_panel = None
- self._right_panel = None
- self._top_panel = None
- self._bottom_panel = None
-
- self._shell = shell
- self.current_position = 0.0
- self._animator = None
-
- self._event_area = EventArea()
- self._event_area.connect('enter', self._enter_corner_cb)
- self._event_area.show()
-
- self._top_panel = self._create_top_panel()
- self._bottom_panel = self._create_bottom_panel()
- self._left_panel = self._create_left_panel()
- self._right_panel = self._create_right_panel()
-
- screen = gtk.gdk.screen_get_default()
- screen.connect('size-changed', self._size_changed_cb)
-
- cb_service = clipboardservice.get_instance()
- cb_service.connect_after('object-added', self._clipboard_object_added_cb)
-
- self._key_listener = _KeyListener(self)
- self._mouse_listener = _MouseListener(self)
-
- self.move(1.0)
-
- def is_visible(self):
- return self.current_position != 0.0
-
- def hide(self):
- if self._animator:
- self._animator.stop()
-
- self._animator = animator.Animator(0.5)
- self._animator.add(_Animation(self, 0.0))
- self._animator.start()
-
- self._event_area.show()
-
- self.mode = None
-
- def show(self, mode):
- if self.visible:
- return
- if self._animator:
- self._animator.stop()
-
- self._shell.take_activity_screenshot()
-
- self.mode = mode
-
- self._animator = animator.Animator(0.5)
- self._animator.add(_Animation(self, 1.0))
- self._animator.start()
-
- self._event_area.hide()
-
- def move(self, pos):
- self.current_position = pos
- self._update_position()
-
- def _is_hover(self):
- return (self._top_panel.hover or \
- self._bottom_panel.hover or \
- self._left_panel.hover or \
- self._right_panel.hover)
-
- def _create_top_panel(self):
- panel = self._create_panel(gtk.POS_TOP)
-
- toolbar = ZoomToolbar(self._shell)
- panel.append(hippo.CanvasWidget(widget=toolbar))
- toolbar.show()
-
- return panel
-
- def _create_bottom_panel(self):
- panel = self._create_panel(gtk.POS_BOTTOM)
-
- box = ActivitiesTray(self._shell)
- panel.append(box, hippo.PACK_EXPAND)
-
- return panel
-
- def _create_right_panel(self):
- panel = self._create_panel(gtk.POS_RIGHT)
-
- tray = FriendsTray(self._shell)
- panel.append(hippo.CanvasWidget(widget=tray), hippo.PACK_EXPAND)
- tray.show()
-
- return panel
-
- def _create_left_panel(self):
- panel = ClipboardPanelWindow(self, gtk.POS_LEFT)
-
- self._connect_to_panel(panel)
- panel.connect('drag-motion', self._drag_motion_cb)
- panel.connect('drag-leave', self._drag_leave_cb)
-
- return panel
-
- def _create_panel(self, orientation):
- panel = FrameWindow(orientation)
- self._connect_to_panel(panel)
-
- return panel
-
- def _move_panel(self, panel, pos, x1, y1, x2, y2):
- x = (x2 - x1) * pos + x1
- y = (y2 - y1) * pos + y1
-
- panel.move(int(x), int(y))
-
- # FIXME we should hide and show as necessary to free memory
- if not panel.props.visible:
- panel.show()
-
- def _connect_to_panel(self, panel):
- panel.connect('enter-notify-event', self._enter_notify_cb)
- panel.connect('leave-notify-event', self._leave_notify_cb)
-
- def _update_position(self):
- screen_h = gtk.gdk.screen_height()
- screen_w = gtk.gdk.screen_width()
-
- self._move_panel(self._top_panel, self.current_position,
- 0, - self._top_panel.size, 0, 0)
-
- self._move_panel(self._bottom_panel, self.current_position,
- 0, screen_h, 0, screen_h - self._bottom_panel.size)
-
- self._move_panel(self._left_panel, self.current_position,
- - self._left_panel.size, 0, 0, 0)
-
- self._move_panel(self._right_panel, self.current_position,
- screen_w, 0, screen_w - self._right_panel.size, 0)
-
- def _size_changed_cb(self, screen):
- self._update_position()
-
- def _clipboard_object_added_cb(self, cb_service, object_id, name):
- if not self.visible:
- self.show(self.MODE_NON_INTERACTIVE)
- gobject.timeout_add(2000, lambda: self.hide())
-
- def _enter_notify_cb(self, window, event):
- if event.detail != gtk.gdk.NOTIFY_INFERIOR:
- self._mouse_listener.mouse_enter()
-
- def _leave_notify_cb(self, window, event):
- if event.detail == gtk.gdk.NOTIFY_INFERIOR:
- return
-
- if not self._is_hover() and not self._palette_group.is_up():
- self._mouse_listener.mouse_leave()
-
- def _palette_group_popdown_cb(self, group):
- if not self._is_hover():
- self._mouse_listener.mouse_leave()
-
- def _drag_motion_cb(self, window, context, x, y, time):
- self._mouse_listener.mouse_enter()
-
- def _drag_leave_cb(self, window, drag_context, timestamp):
- self._mouse_listener.mouse_leave()
-
- def _enter_corner_cb(self, event_area):
- self._mouse_listener.mouse_enter()
-
- def notify_key_press(self):
- self._key_listener.key_press()
-
- visible = property(is_visible, None)
diff --git a/src/view/frame/frameinvoker.py b/src/view/frame/frameinvoker.py
deleted file mode 100644
index 07dc9d8..0000000
--- a/src/view/frame/frameinvoker.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright (C) 2007, Eduardo Silva <edsiper@gmail.com>
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-import gtk
-
-from sugar.graphics import style
-from sugar.graphics.palette import Palette
-from sugar.graphics.palette import CanvasInvoker
-from sugar.graphics.palette import WidgetInvoker
-
-def _get_screen_area():
- frame_thickness = style.GRID_CELL_SIZE
-
- x = y = frame_thickness
- width = gtk.gdk.screen_width() - frame_thickness
- height = gtk.gdk.screen_height() - frame_thickness
-
- return gtk.gdk.Rectangle(x, y, width, height)
-
-class FrameWidgetInvoker(WidgetInvoker):
- def __init__(self, widget):
- WidgetInvoker.__init__(self, widget.child)
-
- self._position_hint = self.ANCHORED
- self._screen_area = _get_screen_area()
diff --git a/src/view/frame/framewindow.py b/src/view/frame/framewindow.py
deleted file mode 100644
index 623d162..0000000
--- a/src/view/frame/framewindow.py
+++ /dev/null
@@ -1,104 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import gtk
-import hippo
-
-from sugar.graphics import style
-
-class FrameWindow(gtk.Window):
- __gtype_name__ = 'SugarFrameWindow'
-
- def __init__(self, position):
- gtk.Window.__init__(self)
- self.hover = False
- self.size = style.GRID_CELL_SIZE + style.LINE_WIDTH
-
- self._position = position
-
- self.set_decorated(False)
- self.connect('realize', self._realize_cb)
- self.connect('enter-notify-event', self._enter_notify_cb)
- self.connect('leave-notify-event', self._leave_notify_cb)
-
- self._canvas = hippo.Canvas()
- self.add(self._canvas)
- self._canvas.show()
-
- box = hippo.CanvasBox()
- self._canvas.set_root(box)
-
- padding = style.GRID_CELL_SIZE
- if self._position == gtk.POS_TOP or self._position == gtk.POS_BOTTOM:
- box.props.orientation = hippo.ORIENTATION_HORIZONTAL
- box.props.padding_left = padding
- box.props.padding_right = padding
- box.props.padding_top = 0
- box.props.padding_bottom = 0
- else:
- box.props.orientation = hippo.ORIENTATION_VERTICAL
- box.props.padding_left = 0
- box.props.padding_right = 0
- box.props.padding_top = padding
- box.props.padding_bottom = padding
-
- self._bg = hippo.CanvasBox(
- border_color=style.COLOR_BUTTON_GREY.get_int())
-
- border = style.LINE_WIDTH
- if position == gtk.POS_TOP:
- self._bg.props.orientation = hippo.ORIENTATION_HORIZONTAL
- self._bg.props.border_bottom = border
- elif position == gtk.POS_BOTTOM:
- self._bg.props.orientation = hippo.ORIENTATION_HORIZONTAL
- self._bg.props.border_top = border
- elif position == gtk.POS_LEFT:
- self._bg.props.orientation = hippo.ORIENTATION_VERTICAL
- self._bg.props.border_right = border
- elif position == gtk.POS_RIGHT:
- self._bg.props.orientation = hippo.ORIENTATION_VERTICAL
- self._bg.props.border_left = border
-
- box.append(self._bg, hippo.PACK_EXPAND)
-
- self._update_size()
-
- screen = gtk.gdk.screen_get_default()
- screen.connect('size-changed', self._size_changed_cb)
-
- def append(self, child, flags=0):
- self._bg.append(child, flags)
-
- def _update_size(self):
- if self._position == gtk.POS_TOP or self._position == gtk.POS_BOTTOM:
- self.resize(gtk.gdk.screen_width(), self.size)
- else:
- self.resize(self.size, gtk.gdk.screen_height())
-
- def _realize_cb(self, widget):
- self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
- self.window.set_accept_focus(False)
-
- def _enter_notify_cb(self, window, event):
- if event.detail != gtk.gdk.NOTIFY_INFERIOR:
- self.hover = True
-
- def _leave_notify_cb(self, window, event):
- if event.detail != gtk.gdk.NOTIFY_INFERIOR:
- self.hover = False
-
- def _size_changed_cb(self, screen):
- self._update_size()
diff --git a/src/view/frame/friendstray.py b/src/view/frame/friendstray.py
deleted file mode 100644
index b34f357..0000000
--- a/src/view/frame/friendstray.py
+++ /dev/null
@@ -1,142 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import hippo
-
-from sugar.presence import presenceservice
-from sugar.graphics.tray import VTray, TrayIcon
-
-from view.BuddyMenu import BuddyMenu
-from view.frame.frameinvoker import FrameWidgetInvoker
-from model.BuddyModel import BuddyModel
-
-class FriendIcon(TrayIcon):
- def __init__(self, shell, buddy):
- TrayIcon.__init__(self, icon_name='computer-xo',
- xo_color=buddy.get_color())
-
- palette = BuddyMenu(shell, buddy)
- self.set_palette(palette)
- palette.set_group_id('frame')
- palette.props.invoker = FrameWidgetInvoker(self)
-
-class FriendsTray(VTray):
- def __init__(self, shell):
- VTray.__init__(self)
-
- self._shell = shell
- self._activity_ps = None
- self._joined_hid = -1
- self._left_hid = -1
- self._buddies = {}
-
- self._pservice = presenceservice.get_instance()
- self._pservice.connect('activity-appeared',
- self.__activity_appeared_cb)
-
- self._owner = self._pservice.get_owner()
-
- # Add initial activities the PS knows about
- self._pservice.get_activities_async(reply_handler=self._get_activities_cb)
-
- home_model = shell.get_model().get_home()
- home_model.connect('pending-activity-changed',
- self._pending_activity_changed_cb)
-
- def _get_activities_cb(self, list):
- for activity in list:
- self.__activity_appeared_cb(self._pservice, activity)
-
- def add_buddy(self, buddy):
- if self._buddies.has_key(buddy.props.key):
- return
-
- model = BuddyModel(buddy=buddy)
-
- icon = FriendIcon(self._shell, model)
- self.add_item(icon)
- icon.show()
-
- self._buddies[buddy.props.key] = icon
-
- def remove_buddy(self, buddy):
- if not self._buddies.has_key(buddy.props.key):
- return
-
- self.remove_item(self._buddies[buddy.props.key])
- del self._buddies[buddy.props.key]
-
- def clear(self):
- for item in self.get_children():
- self.remove_item(item)
- self._buddies = {}
-
- def __activity_appeared_cb(self, pservice, activity_ps):
- activity = self._shell.get_current_activity()
- if activity and activity_ps.props.id == activity.get_id():
- self._set_activity_ps(activity_ps, True)
-
- def _set_activity_ps(self, activity_ps, shared_activity):
- if self._activity_ps == activity_ps:
- return
-
- if self._joined_hid > 0:
- self._activity_ps.disconnect(self._joined_hid)
- self._joined_hid = -1
- if self._left_hid > 0:
- self._activity_ps.disconnect(self._left_hid)
- self._left_hid = -1
-
- self._activity_ps = activity_ps
-
- self.clear()
-
- if shared_activity is True:
- for buddy in activity_ps.get_joined_buddies():
- self.add_buddy(buddy)
-
- self._joined_hid = activity_ps.connect(
- 'buddy-joined', self.__buddy_joined_cb)
- self._left_hid = activity_ps.connect(
- 'buddy-left', self.__buddy_left_cb)
- else:
- # only display myself if not shared
- self.add_buddy(self._owner)
-
- def _pending_activity_changed_cb(self, home_model, home_activity):
- if home_activity is None:
- return
-
- activity_id = home_activity.get_activity_id()
- if activity_id is None:
- return
-
- # check if activity is shared
- activity = None
- for act in self._pservice.get_activities():
- if activity_id == act.props.id:
- activity = act
- break
- if activity:
- self._set_activity_ps(activity, True)
- else:
- self._set_activity_ps(home_activity, False)
-
- def __buddy_joined_cb(self, activity, buddy):
- self.add_buddy(buddy)
-
- def __buddy_left_cb(self, activity, buddy):
- self.remove_buddy(buddy)
diff --git a/src/view/frame/overlaybox.py b/src/view/frame/overlaybox.py
deleted file mode 100644
index bb74f18..0000000
--- a/src/view/frame/overlaybox.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright (C) 2006-2007, 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
-
-import hippo
-
-from sugar.graphics.iconbutton import IconButton
-
-class OverlayBox(hippo.CanvasBox):
- def __init__(self, shell):
- hippo.CanvasBox.__init__(self, orientation=hippo.ORIENTATION_HORIZONTAL)
-
- self._shell = shell
-
- icon = IconButton(icon_name='stock-chat')
- icon.connect('activated', self._overlay_clicked_cb)
- self.append(icon)
-
- def _overlay_clicked_cb(self, item):
- self._shell.toggle_chat_visibility()
diff --git a/src/view/frame/zoomtoolbar.py b/src/view/frame/zoomtoolbar.py
deleted file mode 100644
index 48e63de..0000000
--- a/src/view/frame/zoomtoolbar.py
+++ /dev/null
@@ -1,84 +0,0 @@
-# Copyright (C) 2006-2007 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 gettext import gettext as _
-
-import gtk
-
-from sugar.graphics.palette import Palette
-from sugar.graphics.toolbutton import ToolButton
-
-from view.frame.frameinvoker import FrameWidgetInvoker
-from model.shellmodel import ShellModel
-
-class ZoomToolbar(gtk.Toolbar):
- def __init__(self, shell):
- gtk.Toolbar.__init__(self)
-
- self._shell = shell
-
- self.set_show_arrow(False)
-
- button = ToolButton(icon_name='zoom-neighborhood')
- button.connect('clicked',
- self._level_clicked_cb,
- ShellModel.ZOOM_MESH)
- self.insert(button, -1)
- button.show()
-
- palette = Palette(_('Neighborhood'))
- palette.props.invoker = FrameWidgetInvoker(button)
- palette.set_group_id('frame')
- button.set_palette(palette)
-
- button = ToolButton(icon_name='zoom-groups')
- button.connect('clicked',
- self._level_clicked_cb,
- ShellModel.ZOOM_FRIENDS)
- self.insert(button, -1)
- button.show()
-
- palette = Palette(_('Group'))
- palette.props.invoker = FrameWidgetInvoker(button)
- palette.set_group_id('frame')
- button.set_palette(palette)
-
- button = ToolButton(icon_name='zoom-home')
- button.connect('clicked',
- self._level_clicked_cb,
- ShellModel.ZOOM_HOME)
- self.insert(button, -1)
- button.show()
-
- palette = Palette(_('Home'))
- palette.props.invoker = FrameWidgetInvoker(button)
- palette.set_group_id('frame')
- button.set_palette(palette)
-
- button = ToolButton(icon_name='zoom-activity')
- button.connect('clicked',
- self._level_clicked_cb,
- ShellModel.ZOOM_ACTIVITY)
- self.insert(button, -1)
- button.show()
-
- palette = Palette(_('Activity'))
- palette.props.invoker = FrameWidgetInvoker(button)
- palette.set_group_id('frame')
- button.set_palette(palette)
-
- def _level_clicked_cb(self, button, level):
- self._shell.set_zoom_level(level)
diff --git a/src/view/home/FriendView.py b/src/view/home/FriendView.py
deleted file mode 100644
index 786589f..0000000
--- a/src/view/home/FriendView.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import hippo
-import gobject
-
-from sugar.graphics.icon import CanvasIcon
-from sugar.graphics import style
-from sugar.presence import presenceservice
-from sugar import activity
-
-from view.BuddyIcon import BuddyIcon
-
-class FriendView(hippo.CanvasBox):
- def __init__(self, shell, buddy, **kwargs):
- hippo.CanvasBox.__init__(self, **kwargs)
-
- self._pservice = presenceservice.get_instance()
-
- self._buddy = buddy
- self._buddy_icon = BuddyIcon(shell, buddy)
- self._buddy_icon.props.size = style.LARGE_ICON_SIZE
- self.append(self._buddy_icon)
-
- self._activity_icon = CanvasIcon(size=style.LARGE_ICON_SIZE)
- self._activity_icon_visible = False
-
- if self._buddy.is_present():
- self._buddy_appeared_cb(buddy)
-
- self._buddy.connect('current-activity-changed', self._buddy_activity_changed_cb)
- self._buddy.connect('appeared', self._buddy_appeared_cb)
- self._buddy.connect('disappeared', self._buddy_disappeared_cb)
- self._buddy.connect('color-changed', self._buddy_color_changed_cb)
-
- def _get_new_icon_name(self, ps_activity):
- registry = activity.get_registry()
- activity_info = registry.get_activity(ps_activity.props.type)
- if activity_info:
- return activity_info.icon
- return None
-
- def _remove_activity_icon(self):
- if self._activity_icon_visible:
- self.remove(self._activity_icon)
- self._activity_icon_visible = False
-
- def _buddy_activity_changed_cb(self, buddy, ps_activity=None):
- if not ps_activity:
- self._remove_activity_icon()
- return
-
- # FIXME: use some sort of "unknown activity" icon rather
- # than hiding the icon?
- name = self._get_new_icon_name(ps_activity)
- if name:
- self._activity_icon.props.file_name = name
- self._activity_icon.props.xo_color = buddy.get_color()
- if not self._activity_icon_visible:
- self.append(self._activity_icon, hippo.PACK_EXPAND)
- self._activity_icon_visible = True
- else:
- self._remove_activity_icon()
-
- def _buddy_appeared_cb(self, buddy):
- home_activity = self._buddy.get_current_activity()
- self._buddy_activity_changed_cb(buddy, home_activity)
-
- def _buddy_disappeared_cb(self, buddy):
- self._buddy_activity_changed_cb(buddy, None)
-
- def _buddy_color_changed_cb(self, buddy, color):
- self._activity_icon.props.xo_color = buddy.get_color()
diff --git a/src/view/home/FriendsBox.py b/src/view/home/FriendsBox.py
deleted file mode 100644
index e9efc57..0000000
--- a/src/view/home/FriendsBox.py
+++ /dev/null
@@ -1,67 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import random
-
-import hippo
-import gobject
-
-from sugar import profile
-from sugar.graphics import style
-from sugar.graphics.icon import CanvasIcon
-from sugar.graphics.palette import Palette
-
-from view.home.FriendView import FriendView
-from view.home.spreadlayout import SpreadLayout
-
-class FriendsBox(hippo.CanvasBox):
- __gtype_name__ = 'SugarFriendsBox'
- def __init__(self, shell):
- hippo.CanvasBox.__init__(self, background_color=0xe2e2e2ff)
-
- self._shell = shell
- self._friends = {}
-
- self._layout = SpreadLayout()
- self.set_layout(self._layout)
-
- self._owner_icon = CanvasIcon(icon_name='computer-xo', cache=True,
- xo_color=profile.get_color())
- self._owner_icon.props.size = style.LARGE_ICON_SIZE
- palette = Palette(profile.get_nick_name())
- self._owner_icon.set_palette(palette)
- self._layout.add_center(self._owner_icon)
-
- friends = self._shell.get_model().get_friends()
-
- for friend in friends:
- self.add_friend(friend)
-
- friends.connect('friend-added', self._friend_added_cb)
- friends.connect('friend-removed', self._friend_removed_cb)
-
- def add_friend(self, buddy_info):
- icon = FriendView(self._shell, buddy_info)
- self._layout.add(icon)
-
- self._friends[buddy_info.get_key()] = icon
-
- def _friend_added_cb(self, data_model, buddy_info):
- self.add_friend(buddy_info)
-
- def _friend_removed_cb(self, data_model, key):
- self._layout.remove(self._friends[key])
- del self._friends[key]
diff --git a/src/view/home/HomeBox.py b/src/view/home/HomeBox.py
deleted file mode 100644
index 8764887..0000000
--- a/src/view/home/HomeBox.py
+++ /dev/null
@@ -1,287 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import os
-import logging
-import signal
-from gettext import gettext as _
-import re
-
-import gobject
-import gtk
-import hippo
-import dbus
-
-from hardware import hardwaremanager
-from sugar.graphics import style
-from sugar.graphics.palette import Palette
-from sugar.profile import get_profile
-from sugar import env
-
-from view.home.activitiesdonut import ActivitiesDonut
-from view.devices import deviceview
-from view.home.MyIcon import MyIcon
-from model.shellmodel import ShellModel
-from hardware import schoolserver
-
-_logger = logging.getLogger('HomeBox')
-
-class HomeBox(hippo.CanvasBox, hippo.CanvasItem):
- __gtype_name__ = 'SugarHomeBox'
-
- def __init__(self, shell):
- hippo.CanvasBox.__init__(self, background_color=0xe2e2e2ff)
-
- self._redraw_id = None
-
- shell_model = shell.get_model()
-
- top_box = hippo.CanvasBox(box_height=style.GRID_CELL_SIZE * 2.5)
- self.append(top_box)
-
- center_box = hippo.CanvasBox(yalign=hippo.ALIGNMENT_CENTER)
- self.append(center_box, hippo.PACK_EXPAND)
-
- bottom_box = hippo.CanvasBox(box_height=style.GRID_CELL_SIZE * 2.5)
- self.append(bottom_box)
-
- self._donut = ActivitiesDonut(shell)
- center_box.append(self._donut)
-
- self._my_icon = _MyIcon(shell, style.XLARGE_ICON_SIZE)
- self.append(self._my_icon, hippo.PACK_FIXED)
-
- self._devices_box = _DevicesBox(shell_model.get_devices())
- bottom_box.append(self._devices_box)
-
- shell_model.connect('notify::state',
- self._shell_state_changed_cb)
-
- def _shell_state_changed_cb(self, model, pspec):
- # FIXME implement this
- if model.props.state == ShellModel.STATE_SHUTDOWN:
- pass
-
- def do_allocate(self, width, height, origin_changed):
- hippo.CanvasBox.do_allocate(self, width, height, origin_changed)
-
- [icon_width, icon_height] = self._my_icon.get_allocation()
- self.set_position(self._my_icon, (width - icon_width) / 2,
- (height - icon_height) / 2)
-
- _REDRAW_TIMEOUT = 5 * 60 * 1000 # 5 minutes
-
- def resume(self):
- if self._redraw_id is None:
- self._redraw_id = gobject.timeout_add(self._REDRAW_TIMEOUT,
- self._redraw_activity_ring)
- self._redraw_activity_ring()
-
- def suspend(self):
- if self._redraw_id is not None:
- gobject.source_remove(self._redraw_id)
- self._redraw_id = None
-
- def _redraw_activity_ring(self):
- self._donut.redraw()
- return True
-
- def has_activities(self):
- return self._donut.has_activities()
-
- def enable_xo_palette(self):
- self._my_icon.enable_palette()
-
- def grab_and_rotate(self):
- pass
-
- def rotate(self):
- pass
-
- def release(self):
- pass
-
-class _DevicesBox(hippo.CanvasBox):
- def __init__(self, devices_model):
- gobject.GObject.__init__(self,
- orientation=hippo.ORIENTATION_HORIZONTAL,
- xalign=hippo.ALIGNMENT_CENTER)
-
- self._device_icons = {}
-
- for device in devices_model:
- self._add_device(device)
-
- devices_model.connect('device-appeared',
- self._device_appeared_cb)
- devices_model.connect('device-disappeared',
- self._device_disappeared_cb)
-
- def _add_device(self, device):
- view = deviceview.create(device)
- self.append(view)
- self._device_icons[device.get_id()] = view
-
- def _remove_device(self, device):
- self.remove(self._device_icons[device.get_id()])
- del self._device_icons[device.get_id()]
-
- def _device_appeared_cb(self, model, device):
- self._add_device(device)
-
- def _device_disappeared_cb(self, model, device):
- self._remove_device(device)
-
-class _MyIcon(MyIcon):
- def __init__(self, shell, scale):
- MyIcon.__init__(self, scale)
-
- self._power_manager = None
- self._shell = shell
- self._profile = get_profile()
-
- def enable_palette(self):
- palette = Palette(self._profile.nick_name)
-
- item = gtk.MenuItem(_('Reboot'))
- item.connect('activate', self._reboot_activate_cb)
- palette.menu.append(item)
- item.show()
-
- item = gtk.MenuItem(_('Shutdown'))
- item.connect('activate', self._shutdown_activate_cb)
- palette.menu.append(item)
- item.show()
-
- if not self._profile.is_registered():
- item = gtk.MenuItem(_('Register'))
- item.connect('activate', self._register_activate_cb)
- palette.menu.append(item)
- item.show()
-
- item = gtk.MenuItem(_('About this XO'))
- item.connect('activate', self._about_activate_cb)
- palette.menu.append(item)
- item.show()
-
- self.set_palette(palette)
-
- def _reboot_activate_cb(self, menuitem):
- model = self._shell.get_model()
- model.props.state = ShellModel.STATE_SHUTDOWN
-
- pm = self._get_power_manager()
-
- hw_manager = hardwaremanager.get_manager()
- hw_manager.shutdown()
-
- if env.is_emulator():
- self._close_emulator()
- else:
- pm.Reboot()
-
- def _shutdown_activate_cb(self, menuitem):
- model = self._shell.get_model()
- model.props.state = ShellModel.STATE_SHUTDOWN
-
- pm = self._get_power_manager()
-
- hw_manager = hardwaremanager.get_manager()
- hw_manager.shutdown()
-
- if env.is_emulator():
- self._close_emulator()
- else:
- pm.Shutdown()
-
- def _register_activate_cb(self, menuitem):
- schoolserver.register_laptop()
- if self._profile.is_registered():
- self.get_palette().menu.remove(menuitem)
-
- def _about_activate_cb(self, menuitem):
- dialog = gtk.Dialog(_('About this XO'),
- self.palette,
- gtk.DIALOG_MODAL |
- gtk.DIALOG_DESTROY_WITH_PARENT,
- (gtk.STOCK_OK, gtk.RESPONSE_OK))
-
- not_available = _('Not available')
- build = self._read_file('/boot/olpc_build')
- if build is None:
- build = not_available
- label_build = gtk.Label('Build: %s' % build)
- label_build.set_alignment(0, 0.5)
- label_build.show()
- dialog.vbox.pack_start(label_build)
-
- firmware = self._read_file('/ofw/openprom/model')
- if firmware is None:
- firmware = not_available
- else:
- firmware = re.split(" +", firmware)
- if len(firmware) == 3:
- firmware = firmware[1]
- label_firmware = gtk.Label('Firmware: %s' % firmware)
- label_firmware.set_alignment(0, 0.5)
- label_firmware.show()
- dialog.vbox.pack_start(label_firmware)
-
- serial = self._read_file('/ofw/serial-number')
- if serial is None:
- serial = not_available
- label_serial = gtk.Label('Serial Number: %s' % serial)
- label_serial.set_alignment(0, 0.5)
- label_serial.show()
- dialog.vbox.pack_start(label_serial)
-
- dialog.set_default_response(gtk.RESPONSE_OK)
- dialog.connect('response', self._response_cb)
- dialog.show()
-
- def _read_file(self, path):
- if os.access(path, os.R_OK) == 0:
- _logger.error('read_file() No such file or directory: %s', path)
- return None
-
- fd = open(path, 'r')
- value = fd.read()
- fd.close()
- if value:
- value = value.strip('\n')
- return value
- else:
- _logger.error('read_file() No information in file or directory: %s', path)
- return None
-
- def _response_cb(self, widget, response_id):
- if response_id == gtk.RESPONSE_OK:
- widget.destroy()
-
- def _close_emulator(self):
- if os.environ.has_key('SUGAR_EMULATOR_PID'):
- pid = int(os.environ['SUGAR_EMULATOR_PID'])
- os.kill(pid, signal.SIGTERM)
-
- def _get_power_manager(self):
- if self._power_manager is None:
- bus = dbus.SystemBus()
- proxy = bus.get_object('org.freedesktop.Hal',
- '/org/freedesktop/Hal/devices/computer')
- self._power_manager = dbus.Interface(proxy, \
- 'org.freedesktop.Hal.Device.SystemPowerManagement')
-
- return self._power_manager
diff --git a/src/view/home/HomeWindow.py b/src/view/home/HomeWindow.py
deleted file mode 100644
index f1f46e9..0000000
--- a/src/view/home/HomeWindow.py
+++ /dev/null
@@ -1,141 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import gtk
-import hippo
-import cairo
-
-from sugar.graphics import style
-
-from view.home.MeshBox import MeshBox
-from view.home.HomeBox import HomeBox
-from view.home.FriendsBox import FriendsBox
-from view.home.transitionbox import TransitionBox
-from model.shellmodel import ShellModel
-
-_HOME_PAGE = 0
-_FRIENDS_PAGE = 1
-_MESH_PAGE = 2
-_TRANSITION_PAGE = 3
-
-class HomeWindow(gtk.Window):
- def __init__(self, shell):
- gtk.Window.__init__(self)
-
- self._shell = shell
- self._active = False
- self._level = ShellModel.ZOOM_HOME
-
- self._canvas = hippo.Canvas()
- self.add(self._canvas)
- self._canvas.show()
-
- self.set_default_size(gtk.gdk.screen_width(),
- gtk.gdk.screen_height())
-
- self.realize()
- self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DESKTOP)
- self.connect("key-release-event", self._key_release_cb)
- self.connect('focus-in-event', self._focus_in_cb)
- self.connect('focus-out-event', self._focus_out_cb)
-
- self._enter_sid = self.connect('enter-notify-event',
- self._enter_notify_event_cb)
- self._leave_sid = self.connect('leave-notify-event',
- self._leave_notify_event_cb)
- self._motion_sid = self.connect('motion-notify-event',
- self._motion_notify_event_cb)
-
- self._home_box = HomeBox(shell)
- self._friends_box = FriendsBox(shell)
- self._mesh_box = MeshBox(shell)
- self._transition_box = TransitionBox()
-
- self._activate_view()
- self._canvas.set_root(self._home_box)
-
- self._transition_box.connect('completed',
- self._transition_completed_cb)
-
- def _enter_notify_event_cb(self, window, event):
- if event.x != gtk.gdk.screen_width() / 2 or \
- event.y != gtk.gdk.screen_height() / 2:
- self._mouse_moved()
-
- def _leave_notify_event_cb(self, window, event):
- self._mouse_moved()
-
- def _motion_notify_event_cb(self, window, event):
- self._mouse_moved()
-
- # We want to enable the XO palette only when the user
- # moved away from the default mouse position (screen center).
- def _mouse_moved(self):
- self._home_box.enable_xo_palette()
- self.disconnect(self._leave_sid)
- self.disconnect(self._motion_sid)
- self.disconnect(self._enter_sid)
-
- def _key_release_cb(self, widget, event):
- keyname = gtk.gdk.keyval_name(event.keyval)
- if keyname == "Alt_L":
- self._home_box.release()
-
- def _deactivate_view(self):
- if self._level == ShellModel.ZOOM_HOME:
- self._home_box.suspend()
- elif self._level == ShellModel.ZOOM_MESH:
- self._mesh_box.suspend()
-
- def _activate_view(self):
- if self._level == ShellModel.ZOOM_HOME:
- self._home_box.resume()
- elif self._level == ShellModel.ZOOM_MESH:
- self._mesh_box.resume()
-
- def _focus_in_cb(self, widget, event):
- self._activate_view()
-
- def _focus_out_cb(self, widget, event):
- self._deactivate_view()
-
- def set_zoom_level(self, level):
- self._deactivate_view()
- self._level = level
- self._activate_view()
-
- self._canvas.set_root(self._transition_box)
-
- if level == ShellModel.ZOOM_HOME:
- size = style.XLARGE_ICON_SIZE
- elif level == ShellModel.ZOOM_FRIENDS:
- size = style.LARGE_ICON_SIZE
- elif level == ShellModel.ZOOM_MESH:
- size = style.STANDARD_ICON_SIZE
-
- self._transition_box.set_size(size)
-
- def _transition_completed_cb(self, transition_box):
- if self._level == ShellModel.ZOOM_HOME:
- self._canvas.set_root(self._home_box)
- elif self._level == ShellModel.ZOOM_FRIENDS:
- self._canvas.set_root(self._friends_box)
- elif self._level == ShellModel.ZOOM_MESH:
- self._canvas.set_root(self._mesh_box)
- self._mesh_box.focus_search_entry()
-
- def get_home_box(self):
- return self._home_box
diff --git a/src/view/home/Makefile.am b/src/view/home/Makefile.am
deleted file mode 100644
index 6916806..0000000
--- a/src/view/home/Makefile.am
+++ /dev/null
@@ -1,14 +0,0 @@
-sugardir = $(pkgdatadir)/shell/view/home
-sugar_PYTHON = \
- __init__.py \
- activitiesdonut.py \
- FriendView.py \
- FriendsBox.py \
- HomeBox.py \
- HomeWindow.py \
- MeshBox.py \
- MyIcon.py \
- proc_smaps.py \
- snowflakelayout.py \
- spreadlayout.py \
- transitionbox.py
diff --git a/src/view/home/MeshBox.py b/src/view/home/MeshBox.py
deleted file mode 100644
index 3b7c4a7..0000000
--- a/src/view/home/MeshBox.py
+++ /dev/null
@@ -1,615 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import random
-from gettext import gettext as _
-import logging
-
-import hippo
-import gobject
-import gtk
-
-from sugar.graphics.icon import CanvasIcon
-from sugar.graphics import style
-from sugar.graphics.icon import get_icon_state
-from sugar.graphics import style
-from sugar.graphics import palette
-from sugar.graphics import iconentry
-from sugar.graphics.menuitem import MenuItem
-from sugar import profile
-
-from model import accesspointmodel
-from model.devices.network import mesh
-from model.devices.network import wireless
-from hardware import hardwaremanager
-from hardware import nmclient
-from view.BuddyIcon import BuddyIcon
-from view.pulsingicon import PulsingIcon
-from view.home.snowflakelayout import SnowflakeLayout
-from view.home.spreadlayout import SpreadLayout
-
-from hardware.nmclient import NM_802_11_CAP_PROTO_WEP, NM_802_11_CAP_PROTO_WPA, NM_802_11_CAP_PROTO_WPA2
-
-
-_ICON_NAME = 'network-wireless'
-
-class AccessPointView(PulsingIcon):
- def __init__(self, model, mesh_device=None):
- PulsingIcon.__init__(self, size=style.STANDARD_ICON_SIZE, cache=True)
- self._model = model
- self._meshdev = mesh_device
- self._disconnect_item = None
- self._greyed_out = False
-
- self.connect('activated', self._activate_cb)
-
- model.connect('notify::strength', self._strength_changed_cb)
- model.connect('notify::name', self._name_changed_cb)
- model.connect('notify::state', self._state_changed_cb)
-
- (stroke, fill) = model.get_nm_network().get_colors()
- self._device_stroke = stroke
- self._device_fill = fill
-
- self._palette = self._create_palette()
- self.set_palette(self._palette)
-
- self._update_icon()
- self._update_name()
- self._update_state()
-
- # Update badge
- caps = model.props.capabilities
- if model.get_nm_network().is_favorite():
- self.props.badge_name = "emblem-favorite"
- elif (caps & NM_802_11_CAP_PROTO_WEP) or (caps & NM_802_11_CAP_PROTO_WPA) or (caps & NM_802_11_CAP_PROTO_WPA2):
- self.props.badge_name = "emblem-locked"
-
- def _create_palette(self):
- p = palette.Palette(self._model.props.name, menu_after_content=True)
- if not self._meshdev:
- return p
-
- # Only show disconnect when there's a mesh device, because mesh takes
- # priority over the normal wireless device. NM doesn't have a "disconnect"
- # method for a device either (for various reasons) so this doesn't
- # have a good mapping
- self._disconnect_item = gtk.MenuItem(_('Disconnect...'))
- self._disconnect_item.connect('activate', self._disconnect_activate_cb)
- p.menu.append(self._disconnect_item)
- if self._model.props.state == accesspointmodel.STATE_CONNECTED:
- self._disconnect_item.show()
- return p
-
- def _disconnect_activate_cb(self, menuitem):
- # Disconnection for an AP means activating the default mesh device
- network_manager = hardwaremanager.get_network_manager()
- if network_manager and self._meshdev:
- network_manager.set_active_device(self._meshdev)
-
- def _strength_changed_cb(self, model, pspec):
- self._update_icon()
-
- def _name_changed_cb(self, model, pspec):
- self._update_name()
-
- def _state_changed_cb(self, model, pspec):
- self._update_state()
-
- def _activate_cb(self, icon):
- network_manager = hardwaremanager.get_network_manager()
- if network_manager:
- device = self._model.get_nm_device()
- network = self._model.get_nm_network()
- network_manager.set_active_device(device, network)
-
- def _update_name(self):
- self._palette.set_primary_text(self._model.props.name)
-
- def _update_icon(self):
- icon_name = get_icon_state(_ICON_NAME, self._model.props.strength)
- if icon_name:
- self.props.icon_name = icon_name
-
- def _update_state(self):
- if self._model.props.state == accesspointmodel.STATE_CONNECTING:
- if self._disconnect_item:
- self._disconnect_item.hide()
- self.props.pulse_time = 1.0
- self.props.colors = [
- [ style.Color(self._device_stroke).get_svg(),
- style.Color(self._device_fill).get_svg() ],
- [ style.Color(self._device_stroke).get_svg(),
- '#e2e2e2' ]
- ]
- elif self._model.props.state == accesspointmodel.STATE_CONNECTED:
- if self._disconnect_item:
- self._disconnect_item.show()
- self.props.pulse_time = 0.0
- self.props.colors = [
- [ '#ffffff',
- style.Color(self._device_fill).get_svg() ],
- [ '#ffffff',
- style.Color(self._device_fill).get_svg() ]
- ]
- elif self._model.props.state == accesspointmodel.STATE_NOTCONNECTED:
- if self._disconnect_item:
- self._disconnect_item.hide()
- self.props.pulse_time = 0.0
- self.props.colors = [
- [ style.Color(self._device_stroke).get_svg(),
- style.Color(self._device_fill).get_svg() ]
- ]
-
- if self._greyed_out:
- self.props.pulse_time = 0.0
- self.props.colors = [['#D5D5D5', '#D5D5D5']]
-
- def set_filter(self, query):
- self._greyed_out = self._model.props.name.lower().find(query) == -1
- self._update_state()
-
-_MESH_ICON_NAME = 'network-mesh'
-
-class MeshDeviceView(PulsingIcon):
- def __init__(self, nm_device, channel):
- if not channel in [1, 6, 11]:
- raise ValueError("Invalid channel %d" % channel)
-
- PulsingIcon.__init__(self, size=style.STANDARD_ICON_SIZE,
- icon_name=_MESH_ICON_NAME, cache=True)
-
- self._nm_device = nm_device
- self.channel = channel
- self.props.badge_name = "badge-channel-%d" % self.channel
- self._greyed_out = False
-
- self._disconnect_item = None
- self._palette = self._create_palette()
- self.set_palette(self._palette)
-
- mycolor = profile.get_color()
- self._device_fill = mycolor.get_fill_color()
- self._device_stroke = mycolor.get_stroke_color()
-
- self.connect('activated', self._activate_cb)
-
- self._nm_device.connect('state-changed', self._state_changed_cb)
- self._nm_device.connect('activation-stage-changed', self._state_changed_cb)
- self._update_state()
-
- def _create_palette(self):
- p = palette.Palette(_("Mesh Network") + " " + str(self.channel), menu_after_content=True)
-
- self._disconnect_item = gtk.MenuItem(_('Disconnect...'))
- self._disconnect_item.connect('activate', self._disconnect_activate_cb)
- p.menu.append(self._disconnect_item)
-
- state = self._nm_device.get_state()
- chan = wireless.freq_to_channel(self._nm_device.get_frequency())
- if state == nmclient.DEVICE_STATE_ACTIVATED and chan == self.channel:
- self._disconnect_item.show()
- return p
-
- def _disconnect_activate_cb(self, menuitem):
- network_manager = hardwaremanager.get_network_manager()
- if network_manager:
- network_manager.set_active_device(self._nm_device)
-
- def _activate_cb(self, icon):
- network_manager = hardwaremanager.get_network_manager()
- if network_manager:
- freq = wireless.channel_to_freq(self.channel)
- network_manager.set_active_device(self._nm_device, mesh_freq=freq)
-
- def _state_changed_cb(self, model):
- self._update_state()
-
- def _update_state(self):
- state = self._nm_device.get_state()
- chan = wireless.freq_to_channel(self._nm_device.get_frequency())
- if self._greyed_out:
- self.props.colors = [['#D5D5D5', '#D5D5D5']]
- elif state == nmclient.DEVICE_STATE_ACTIVATING and chan == self.channel:
- self._disconnect_item.hide()
- self.props.pulse_time = 0.75
- self.props.colors = [
- [ style.Color(self._device_stroke).get_svg(),
- style.Color(self._device_fill).get_svg() ],
- [ style.Color(self._device_stroke).get_svg(),
- '#e2e2e2' ]
- ]
- elif state == nmclient.DEVICE_STATE_ACTIVATED and chan == self.channel:
- self._disconnect_item.show()
- self.props.pulse_time = 0.0
- self.props.colors = [
- [ '#ffffff',
- style.Color(self._device_fill).get_svg() ],
- [ '#ffffff',
- style.Color(self._device_fill).get_svg() ]
- ]
- elif state == nmclient.DEVICE_STATE_INACTIVE or chan != self.channel:
- self._disconnect_item.hide()
- self.props.pulse_time = 0.0
- self.props.colors = [
- [ style.Color(self._device_stroke).get_svg(),
- style.Color(self._device_fill).get_svg() ]
- ]
- else:
- raise RuntimeError("Shouldn't get here")
-
- def set_filter(self, query):
- self._greyed_out = (query != '')
- self._update_state()
-
-class ActivityView(hippo.CanvasBox):
- def __init__(self, shell, model):
- hippo.CanvasBox.__init__(self)
-
- self._shell = shell
- self._model = model
- self._icons = {}
-
- self._layout = SnowflakeLayout()
- self.set_layout(self._layout)
-
- self._icon = self._create_icon()
- self._layout.add(self._icon, center=True)
-
- self._update_palette()
-
- activity = self._model.activity
- activity.connect('notify::name', self._name_changed_cb)
- activity.connect('notify::color', self._color_changed_cb)
- activity.connect('notify::private', self._private_changed_cb)
- activity.connect('joined', self._joined_changed_cb)
- #FIXME: 'joined' signal not working, see #5032
-
- def _create_icon(self):
- icon = CanvasIcon(file_name=self._model.get_icon_name(),
- xo_color=self._model.get_color(), cache=True,
- size=style.STANDARD_ICON_SIZE)
- icon.connect('activated', self._clicked_cb)
- return icon
-
- def _create_palette(self):
- p = palette.Palette(self._model.activity.props.name)
-
- private = self._model.activity.props.private
- joined = self._model.activity.props.joined
-
- if joined:
- item = MenuItem(_('Resume'), 'activity-start')
- item.connect('activate', self._clicked_cb)
- item.show()
- p.menu.append(item)
- elif not private:
- item = MenuItem(_('Join'), 'activity-start')
- item.connect('activate', self._clicked_cb)
- item.show()
- p.menu.append(item)
-
- return p
-
- def _update_palette(self):
- self._palette = self._create_palette()
- self._icon.set_palette(self._palette)
-
- def has_buddy_icon(self, key):
- return self._icons.has_key(key)
-
- def add_buddy_icon(self, key, icon):
- self._icons[key] = icon
- self._layout.add(icon)
-
- def remove_buddy_icon(self, key):
- icon = self._icons[key]
- del self._icons[key]
- icon.destroy()
-
- def _clicked_cb(self, item):
- bundle_id = self._model.get_bundle_id()
- self._shell.join_activity(bundle_id, self._model.get_id())
-
- def set_filter(self, query):
- text_to_check = self._model.activity.props.name.lower() + \
- self._model.activity.props.type.lower()
- if text_to_check.find(query) == -1:
- self._icon.props.stroke_color = '#D5D5D5'
- self._icon.props.fill_color = '#E5E5E5'
- else:
- self._icon.props.xo_color = self._model.get_color()
-
- for key, icon in self._icons.iteritems():
- if hasattr(icon, 'set_filter'):
- icon.set_filter(query)
-
- def _name_changed_cb(self, activity, pspec):
- self._update_palette()
-
- def _color_changed_cb(self, activity, pspec):
- self._layout.remove(self._icon)
- self._icon = self._create_icon()
- self._layout.add(self._icon, center=True)
- self._icon.set_palette(self._palette)
-
- def _private_changed_cb(self, activity, pspec):
- self._update_palette()
-
- def _joined_changed_cb(self, widget, event):
- logging.debug('ActivityView._joined_changed_cb: AAAA!!!!')
-
-_AUTOSEARCH_TIMEOUT = 1000
-
-class MeshToolbar(gtk.Toolbar):
- __gtype_name__ = 'MeshToolbar'
-
- __gsignals__ = {
- 'query-changed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([str]))
- }
-
- def __init__(self):
- gtk.Toolbar.__init__(self)
-
- self._query = None
- self._autosearch_timer = None
-
- self._add_separator()
-
- tool_item = gtk.ToolItem()
- tool_item.set_expand(True)
- self.insert(tool_item, -1)
- tool_item.show()
-
- self._search_entry = iconentry.IconEntry()
- self._search_entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY, 'system-search')
- self._search_entry.add_clear_button()
- self._search_entry.connect('activate', self._entry_activated_cb)
- self._search_entry.connect('changed', self._entry_changed_cb)
- tool_item.add(self._search_entry)
- self._search_entry.show()
-
- self._add_separator()
-
- def _add_separator(self):
- separator = gtk.SeparatorToolItem()
- separator.set_size_request(style.GRID_CELL_SIZE, style.GRID_CELL_SIZE)
- separator.props.draw = False
- self.insert(separator, -1)
- separator.show()
-
- def _entry_activated_cb(self, entry):
- if self._autosearch_timer:
- gobject.source_remove(self._autosearch_timer)
- new_query = entry.props.text
- if self._query != new_query:
- self._query = new_query
- self.emit('query-changed', self._query)
-
- def _entry_changed_cb(self, entry):
- if not entry.props.text:
- entry.activate()
- return
-
- if self._autosearch_timer:
- gobject.source_remove(self._autosearch_timer)
- self._autosearch_timer = gobject.timeout_add(_AUTOSEARCH_TIMEOUT,
- self._autosearch_timer_cb)
-
- def _autosearch_timer_cb(self):
- logging.debug('_autosearch_timer_cb')
- self._autosearch_timer = None
- self._search_entry.activate()
- return False
-
-class MeshBox(hippo.CanvasBox):
- def __init__(self, shell):
- hippo.CanvasBox.__init__(self)
-
- self._shell = shell
- self._model = shell.get_model().get_mesh()
- self._buddies = {}
- self._activities = {}
- self._access_points = {}
- self._mesh = {}
- self._buddy_to_activity = {}
- self._suspended = True
- self._query = ''
-
- self._toolbar = MeshToolbar()
- self._toolbar.connect('query-changed', self._toolbar_query_changed_cb)
- self.append(hippo.CanvasWidget(widget=self._toolbar))
-
- self._layout_box = hippo.CanvasBox(background_color=0xe2e2e2ff)
- self.append(self._layout_box, hippo.PACK_EXPAND)
-
- self._layout = SpreadLayout()
- self._layout_box.set_layout(self._layout)
-
- for buddy_model in self._model.get_buddies():
- self._add_alone_buddy(buddy_model)
-
- self._model.connect('buddy-added', self._buddy_added_cb)
- self._model.connect('buddy-removed', self._buddy_removed_cb)
- self._model.connect('buddy-moved', self._buddy_moved_cb)
-
- for activity_model in self._model.get_activities():
- self._add_activity(activity_model)
-
- self._model.connect('activity-added', self._activity_added_cb)
- self._model.connect('activity-removed', self._activity_removed_cb)
-
- for ap_model in self._model.get_access_points():
- self._add_access_point(ap_model)
-
- self._model.connect('access-point-added',
- self._access_point_added_cb)
- self._model.connect('access-point-removed',
- self._access_point_removed_cb)
-
- if self._model.get_mesh():
- self._mesh_added_cb(self._model, self._model.get_mesh())
-
- self._model.connect('mesh-added',
- self._mesh_added_cb)
- self._model.connect('mesh-removed',
- self._mesh_removed_cb)
-
- def _mesh_added_cb(self, model, meshdev):
- self._add_mesh_icon(meshdev, 1)
- self._add_mesh_icon(meshdev, 6)
- self._add_mesh_icon(meshdev, 11)
-
- def _mesh_removed_cb(self, model):
- self._remove_mesh_icon(1)
- self._remove_mesh_icon(6)
- self._remove_mesh_icon(11)
-
- def _buddy_added_cb(self, model, buddy_model):
- self._add_alone_buddy(buddy_model)
-
- def _buddy_removed_cb(self, model, buddy_model):
- self._remove_buddy(buddy_model)
-
- def _buddy_moved_cb(self, model, buddy_model, activity_model):
- # Owner doesn't move from the center
- if buddy_model.is_owner():
- return
- self._move_buddy(buddy_model, activity_model)
-
- def _activity_added_cb(self, model, activity_model):
- self._add_activity(activity_model)
-
- def _activity_removed_cb(self, model, activity_model):
- self._remove_activity(activity_model)
-
- def _access_point_added_cb(self, model, ap_model):
- self._add_access_point(ap_model)
-
- def _access_point_removed_cb(self, model, ap_model):
- self._remove_access_point(ap_model)
-
- def _add_mesh_icon(self, meshdev, channel):
- if self._mesh.has_key(channel):
- self._remove_mesh_icon(channel)
- if not meshdev:
- return
- self._mesh[channel] = MeshDeviceView(meshdev, channel)
- self._layout.add(self._mesh[channel])
-
- def _remove_mesh_icon(self, channel):
- if not self._mesh.has_key(channel):
- return
- self._layout.remove(self._mesh[channel])
- del self._mesh[channel]
-
- def _add_alone_buddy(self, buddy_model):
- icon = BuddyIcon(self._shell, buddy_model)
- if buddy_model.is_owner():
- vertical_offset = - style.GRID_CELL_SIZE
- self._layout.add_center(icon, vertical_offset)
- else:
- self._layout.add(icon)
-
- if hasattr(icon, 'set_filter'):
- icon.set_filter(self._query)
-
- self._buddies[buddy_model.get_key()] = icon
-
- def _remove_alone_buddy(self, buddy_model):
- icon = self._buddies[buddy_model.get_key()]
- self._layout.remove(icon)
- del self._buddies[buddy_model.get_key()]
- icon.destroy()
-
- def _remove_buddy(self, buddy_model):
- key = buddy_model.get_key()
- if self._buddies.has_key(key):
- self._remove_alone_buddy(buddy_model)
- else:
- for activity in self._activities.values():
- if activity.has_buddy_icon(key):
- activity.remove_buddy_icon(key)
-
- def _move_buddy(self, buddy_model, activity_model):
- key = buddy_model.get_key()
-
- self._remove_buddy(buddy_model)
-
- if activity_model == None:
- self._add_alone_buddy(buddy_model)
- elif activity_model.get_id() in self._activities:
- activity = self._activities[activity_model.get_id()]
-
- icon = BuddyIcon(self._shell, buddy_model,
- style.SMALL_ICON_SIZE)
- activity.add_buddy_icon(buddy_model.get_key(), icon)
-
- if hasattr(icon, 'set_filter'):
- icon.set_filter(self._query)
-
- def _add_activity(self, activity_model):
- icon = ActivityView(self._shell, activity_model)
- self._layout.add(icon)
-
- if hasattr(icon, 'set_filter'):
- icon.set_filter(self._query)
-
- self._activities[activity_model.get_id()] = icon
-
- def _remove_activity(self, activity_model):
- icon = self._activities[activity_model.get_id()]
- self._layout.remove(icon)
- del self._activities[activity_model.get_id()]
- icon.destroy()
-
- def _add_access_point(self, ap_model):
- meshdev = self._model.get_mesh()
- icon = AccessPointView(ap_model, meshdev)
- self._layout.add(icon)
-
- if hasattr(icon, 'set_filter'):
- icon.set_filter(self._query)
-
- self._access_points[ap_model.get_id()] = icon
-
- def _remove_access_point(self, ap_model):
- icon = self._access_points[ap_model.get_id()]
- self._layout.remove(icon)
- del self._access_points[ap_model.get_id()]
-
- def suspend(self):
- if not self._suspended:
- self._suspended = True
- for ap in self._access_points.values():
- ap.props.paused = True
-
- def resume(self):
- if self._suspended:
- self._suspended = False
- for ap in self._access_points.values():
- ap.props.paused = False
-
- def _toolbar_query_changed_cb(self, toolbar, query):
- self._query = query.lower()
- for icon in self._layout_box.get_children():
- if hasattr(icon, 'set_filter'):
- icon.set_filter(self._query)
-
- def focus_search_entry(self):
- self._toolbar._search_entry.grab_focus()
diff --git a/src/view/home/MyIcon.py b/src/view/home/MyIcon.py
deleted file mode 100644
index af0f6ce..0000000
--- a/src/view/home/MyIcon.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright (C) 2006-2007 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.graphics.icon import CanvasIcon
-from sugar import profile
-
-class MyIcon(CanvasIcon):
- def __init__(self, size):
- CanvasIcon.__init__(self, size=size,
- icon_name='computer-xo',
- xo_color=profile.get_color())
diff --git a/src/view/home/__init__.py b/src/view/home/__init__.py
deleted file mode 100644
index a9dd95a..0000000
--- a/src/view/home/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2006-2007, 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
-
diff --git a/src/view/home/activitiesdonut.py b/src/view/home/activitiesdonut.py
deleted file mode 100755
index 8e09006..0000000
--- a/src/view/home/activitiesdonut.py
+++ /dev/null
@@ -1,556 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import colorsys
-from gettext import gettext as _
-import logging
-import math
-import os
-
-import hippo
-import gobject
-import gtk
-
-from sugar.graphics.icon import CanvasIcon
-from sugar.graphics.menuitem import MenuItem
-from sugar.graphics.palette import Palette
-from sugar.graphics import style
-from sugar.graphics import xocolor
-from sugar import profile
-import proc_smaps
-
-_MAX_ACTIVITIES = 6
-_MIN_WEDGE_SIZE = 1.0 / _MAX_ACTIVITIES
-_DONUT_SIZE = style.zoom(450)
-
-# TODO: rgb_to_html and html_to_rgb are useful elsewhere
-# we should put this in a common module
-def rgb_to_html(r, g, b):
- """ (r, g, b) tuple (in float format) -> #RRGGBB """
- return '#%02x%02x%02x' % (int(r * 255), int(g * 255), int(b * 255))
-
-def html_to_rgb(html_color):
- """ #RRGGBB -> (r, g, b) tuple (in float format) """
- html_color = html_color.strip()
- if html_color[0] == '#':
- html_color = html_color[1:]
- if len(html_color) != 6:
- raise ValueError, "input #%s is not in #RRGGBB format" % html_color
- r, g, b = html_color[:2], html_color[2:4], html_color[4:]
- r, g, b = [int(n, 16) for n in (r, g, b)]
- r, g, b = (r / 255.0, g / 255.0, b / 255.0)
- return (r, g, b)
-
-class ActivityIcon(CanvasIcon):
- _INTERVAL = 200
-
- __gsignals__ = {
- 'resume': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([])),
- 'stop': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([]))
- }
-
- def __init__(self, activity):
- self._orig_color = activity.get_icon_color()
- self._icon_colors = self._compute_icon_colors()
-
- self._direction = 0
- self._level_max = len(self._icon_colors) - 1
- self._level = self._level_max
- color = self._icon_colors[self._level]
-
- CanvasIcon.__init__(self, xo_color=color, cache=True,
- size=style.MEDIUM_ICON_SIZE)
-
- icon_path = activity.get_icon_path()
- if icon_path:
- self.props.file_name = icon_path
- else:
- self.props.icon_name = 'image-missing'
-
- self._activity = activity
- self._pulse_id = 0
-
- self.size = _MIN_WEDGE_SIZE
-
- palette = Palette(_('Starting...'))
- self.set_palette(palette)
-
- if activity.props.launching:
- self._start_pulsing()
- activity.connect('notify::launching', self._launching_changed_cb)
- else:
- self._setup_palette()
-
- def _setup_palette(self):
- palette = self.get_palette()
-
- palette.set_primary_text(self._activity.get_title())
-
- resume_menu_item = MenuItem(_('Resume'), 'activity-start')
- resume_menu_item.connect('activate', self._resume_activate_cb)
- palette.menu.append(resume_menu_item)
- resume_menu_item.show()
-
- # FIXME: kludge
- if self._activity.get_type() != "org.laptop.JournalActivity":
- stop_menu_item = MenuItem(_('Stop'), 'activity-stop')
- stop_menu_item.connect('activate', self._stop_activate_cb)
- palette.menu.append(stop_menu_item)
- stop_menu_item.show()
-
- def _launching_changed_cb(self, activity, pspec):
- if not activity.props.launching:
- self._stop_pulsing()
- self._setup_palette()
-
- def __del__(self):
- self._cleanup()
-
- def _cleanup(self):
- if self._pulse_id:
- gobject.source_remove(self._pulse_id)
- self._pulse_id = 0
-
- def _compute_icon_colors(self):
- _LEVEL_MAX = 1.6
- _LEVEL_STEP = 0.16
- _LEVEL_MIN = 0.0
- icon_colors = {}
- level = _LEVEL_MIN
- for i in range(0, int(_LEVEL_MAX / _LEVEL_STEP)):
- icon_colors[i] = self._get_icon_color_for_level(level)
- level += _LEVEL_STEP
- return icon_colors
-
- def _get_icon_color_for_level(self, level):
- factor = math.sin(level)
- h, s, v = colorsys.rgb_to_hsv(*html_to_rgb(self._orig_color.get_fill_color()))
- new_fill = rgb_to_html(*colorsys.hsv_to_rgb(h, s * factor, v))
- h, s, v = colorsys.rgb_to_hsv(*html_to_rgb(self._orig_color.get_stroke_color()))
- new_stroke = rgb_to_html(*colorsys.hsv_to_rgb(h, s * factor, v))
- return xocolor.XoColor("%s,%s" % (new_stroke, new_fill))
-
- def _pulse_cb(self):
- if self._direction == 1:
- self._level += 1
- if self._level > self._level_max:
- self._direction = 0
- self._level = self._level_max
- elif self._direction == 0:
- self._level -= 1
- if self._level <= 0:
- self._direction = 1
- self._level = 0
-
- self.props.xo_color = self._icon_colors[self._level]
- self.emit_paint_needed(0, 0, -1, -1)
- return True
-
- def _start_pulsing(self):
- if self._pulse_id:
- return
-
- self._pulse_id = gobject.timeout_add(self._INTERVAL, self._pulse_cb)
-
- def _stop_pulsing(self):
- if not self._pulse_id:
- return
-
- self._cleanup()
- self._level = 100.0
- self.props.xo_color = self._orig_color
-
- def _resume_activate_cb(self, menuitem):
- self.emit('resume')
-
- def _stop_activate_cb(self, menuitem):
- self.emit('stop')
-
- def get_activity(self):
- return self._activity
-
-class ActivitiesDonut(hippo.CanvasBox, hippo.CanvasItem):
- __gtype_name__ = 'SugarActivitiesDonut'
- def __init__(self, shell, **kwargs):
- hippo.CanvasBox.__init__(self, **kwargs)
-
- self._activities = []
- self._shell = shell
- self._angles = []
- self._shell_mappings = proc_smaps.get_shared_mapping_names(os.getpid())
-
- self._layout = _Layout()
- self.set_layout(self._layout)
-
- self._model = shell.get_model().get_home()
- self._model.connect('activity-added', self._activity_added_cb)
- self._model.connect('activity-removed', self._activity_removed_cb)
- self._model.connect('pending-activity-changed', self._activity_changed_cb)
-
- self.connect('button-release-event', self._button_release_event_cb)
-
- def _get_icon_from_activity(self, activity):
- for icon in self._activities:
- if icon.get_activity().equals(activity):
- return icon
-
- def _activity_added_cb(self, model, activity):
- self._add_activity(activity)
-
- def _activity_removed_cb(self, model, activity):
- self._remove_activity(activity)
-
- def _activity_changed_cb(self, model, activity):
- self.emit_paint_needed(0, 0, -1, -1)
-
- def _remove_activity(self, activity):
- icon = self._get_icon_from_activity(activity)
- if icon:
- self.remove(icon)
- icon._cleanup()
- self._activities.remove(icon)
- self._compute_angles()
-
- def _add_activity(self, activity):
- icon = ActivityIcon(activity)
- icon.connect('resume', self._activity_icon_resumed_cb)
- icon.connect('stop', self._activity_icon_stop_cb)
- self.append(icon, hippo.PACK_FIXED)
-
- self._activities.append(icon)
- self._compute_angles()
-
- def _activity_icon_resumed_cb(self, icon):
- activity = icon.get_activity()
- activity_host = self._shell.get_activity(activity.get_activity_id())
- if activity_host:
- activity_host.present()
- else:
- logging.error("Could not find ActivityHost for activity %s" %
- activity.get_activity_id())
-
- def _activity_icon_stop_cb(self, icon):
- activity = icon.get_activity()
- activity_host = self._shell.get_activity(activity.get_activity_id())
- if activity_host:
- activity_host.close()
- else:
- logging.error("Could not find ActivityHost for activity %s" %
- activity.get_activity_id())
-
- def _get_activity(self, x, y):
- # Compute the distance from the center.
- [width, height] = self.get_allocation()
- x -= width / 2
- y -= height / 2
- r = math.hypot(x, y)
-
- # Ignore the click if it's not inside the donut
- if r < self._get_inner_radius() or r > self._get_radius():
- return None
-
- # Now figure out where in the donut the click was.
- angle = math.atan2(-y, -x) + math.pi
-
- # Unfortunately, _get_angles() doesn't count from 0 to 2pi, it
- # counts from roughly pi/2 to roughly 5pi/2. So we have to
- # compare its return values against both angle and angle+2pi
- high_angle = angle + 2 * math.pi
-
- for index, activity in enumerate(self._model):
- [angle_start, angle_end] = self._get_angles(index)
- if angle_start < angle and angle_end > angle:
- return activity
- elif angle_start < high_angle and angle_end > high_angle:
- return activity
-
- return None
-
- def _button_release_event_cb(self, item, event):
- activity = self._get_activity(event.x, event.y)
- if activity is None:
- return False
-
- activity_host = self._shell.get_activity(activity.get_activity_id())
- if activity_host:
- activity_host.present()
- return True
-
- def _set_fixed_arc_size(self):
- """Set fixed arc size"""
-
- n = len(self._activities)
- if n > _MAX_ACTIVITIES:
- size = 1.0 / n
- else:
- size = 1.0 / _MAX_ACTIVITIES
-
- for act in self._activities:
- act.size = size
-
- def _update_activity_sizes(self):
- """Currently the size of an activity on the donut does not
- represent it's memory usage. This is disabled because it was
- either not working perfectly or a little confusing. See #3605"""
- self._set_fixed_arc_size()
- return
-
- # Get the memory mappings of each process that hosts an
- # activity, and count how many activity instances each
- # activity process hosts, and how many processes are mapping
- # each shared library, etc
- process_mappings = {}
- num_activities = {}
- num_mappings = {}
- unknown_size_activities = 0
- for activity in self._model:
- pid = activity.get_pid()
- if not pid:
- # Still starting up, hasn't opened a window yet
- unknown_size_activities += 1
- continue
-
- if num_activities.has_key(pid):
- num_activities[pid] += 1
- continue
-
- try:
- mappings = proc_smaps.get_mappings(pid, self._shell_mappings)
- for mapping in mappings:
- if mapping.shared > 0:
- if num_mappings.has_key(mapping.name):
- num_mappings[mapping.name] += 1
- else:
- num_mappings[mapping.name] = 1
- process_mappings[pid] = mappings
- num_activities[pid] = 1
- except Exception, e:
- logging.warn('ActivitiesDonut: could not read /proc/%s/smaps: %r'
- % (pid, e))
-
- # Compute total memory used per process
- process_size = {}
- total_activity_size = 0
- for activity in self._model:
- pid = activity.get_pid()
- if not process_mappings.has_key(pid):
- continue
-
- mappings = process_mappings[pid]
- size = 0
- for mapping in mappings:
- size += mapping.private
- if mapping.shared > 0:
- num = num_mappings[mapping.name]
- size += mapping.shared / num
- process_size[pid] = size
- total_activity_size += size / num_activities[pid]
-
- # Now, see how much free memory is left.
- free_memory = 0
- try:
- meminfo = open('/proc/meminfo')
- for line in meminfo.readlines():
- if line.startswith('MemFree:') or line.startswith('SwapFree:'):
- free_memory += int(line[9:-3])
- meminfo.close()
- except IOError:
- logging.warn('ActivitiesDonut: could not read /proc/meminfo')
- except (IndexError, ValueError):
- logging.warn('ActivitiesDonut: /proc/meminfo was not in ' +
- 'expected format')
-
- total_memory = float(total_activity_size + free_memory)
-
- # Each activity has an ideal size of:
- # process_size[pid] / num_activities[pid] / total_memory
- # (And the free memory wedge is ideally free_memory /
- # total_memory) However, no activity wedge is allowed to be
- # smaller than _MIN_WEDGE_SIZE. This means the small
- # activities will use up extra space, which would make the
- # ring overflow. We fix that by reducing the large activities
- # and the free space proportionately. If there are activities
- # of unknown size, they are simply carved out of the free
- # space.
-
- free_percent = free_memory / total_memory
- activity_sizes = []
- overflow = 0.0
- reducible = free_percent
- for icon in self._activities:
- pid = icon.get_activity().get_pid()
- if process_size.has_key(pid):
- icon.size = (process_size[pid] / num_activities[pid] /
- total_memory)
- if icon.size < _MIN_WEDGE_SIZE:
- overflow += _MIN_WEDGE_SIZE - icon.size
- icon.size = _MIN_WEDGE_SIZE
- else:
- reducible += icon.size - _MIN_WEDGE_SIZE
- else:
- icon.size = _MIN_WEDGE_SIZE
-
- if reducible > 0.0:
- reduction = overflow / reducible
- if unknown_size_activities > 0:
- unknown_percent = _MIN_WEDGE_SIZE * unknown_size_activities
- if (free_percent * (1 - reduction) < unknown_percent):
- # The free wedge won't be large enough to fit the
- # unknown-size activities. So adjust things
- overflow += unknown_percent - free_percent
- reducible -= free_percent
- reduction = overflow / reducible
-
- if reduction > 0.0:
- for icon in self._activities:
- if icon.size > _MIN_WEDGE_SIZE:
- icon.size -= (icon.size - _MIN_WEDGE_SIZE) * reduction
-
- def _compute_angles(self):
- self._angles = []
- if len(self._activities) == 0:
- return
-
- # Normally we don't _update_activity_sizes() when launching a
- # new activity; but if the new wedge would overflow the ring
- # then we have no choice.
- total = reduce(lambda s1,s2: s1 + s2,
- [icon.size for icon in self._activities])
- if total > 1.0:
- self._update_activity_sizes()
-
- # The first wedge (Journal) should be centered at 6 o'clock
- size = self._activities[0].size or _MIN_WEDGE_SIZE
- angle = (math.pi - size * 2 * math.pi) / 2
- self._angles.append(angle)
-
- for icon in self._activities:
- size = icon.size or _MIN_WEDGE_SIZE
- self._angles.append(self._angles[-1] + size * 2 * math.pi)
-
- def redraw(self):
- self._update_activity_sizes()
- self._compute_angles()
- self.emit_request_changed()
-
- def _get_angles(self, index):
- return [self._angles[index],
- self._angles[(index + 1) % len(self._angles)]]
-
- def _get_radius(self):
- [width, height] = self.get_allocation()
- return min(width, height) / 2
-
- def _get_inner_radius(self):
- return self._get_radius() * 0.5
-
- def do_paint_below_children(self, cr, damaged_box):
- [width, height] = self.get_allocation()
-
- cr.translate(width / 2, height / 2)
-
- radius = self._get_radius()
-
- # Outer Ring
- cr.set_source_rgb(0xf1 / 255.0, 0xf1 / 255.0, 0xf1 / 255.0)
- cr.arc(0, 0, radius, 0, 2 * math.pi)
- cr.fill()
-
- # Selected Wedge
- current_activity = self._model.get_pending_activity()
- if current_activity is not None:
- selected_index = self._model.index(current_activity)
- [angle_start, angle_end] = self._get_angles(selected_index)
-
- cr.new_path()
- cr.move_to(0, 0)
- cr.line_to(radius * math.cos(angle_start),
- radius * math.sin(angle_start))
- cr.arc(0, 0, radius, angle_start, angle_end)
- cr.line_to(0, 0)
- cr.set_source_rgb(1, 1, 1)
- cr.fill()
-
- # Edges
- if len(self._model):
- n_edges = len(self._model) + 1
- else:
- n_edges = 0
-
- for i in range(0, n_edges):
- cr.new_path()
- cr.move_to(0, 0)
- [angle, unused_angle] = self._get_angles(i)
- cr.line_to(radius * math.cos(angle),
- radius * math.sin(angle))
-
- cr.set_source_rgb(0xe2 / 255.0, 0xe2 / 255.0, 0xe2 / 255.0)
- cr.set_line_width(4)
- cr.stroke_preserve()
-
- # Inner Ring
- cr.new_path()
- cr.arc(0, 0, self._get_inner_radius(), 0, 2 * math.pi)
- cr.set_source_rgb(0xe2 / 255.0, 0xe2 / 255.0, 0xe2 / 255.0)
- cr.fill()
-
- def do_allocate(self, width, height, origin_changed):
- hippo.CanvasBox.do_allocate(self, width, height, origin_changed)
-
- radius = (self._get_inner_radius() + self._get_radius()) / 2
-
- for i, icon in enumerate(self._activities):
- [angle_start, angle_end] = self._get_angles(i)
- angle = angle_start + (angle_end - angle_start) / 2
-
- [icon_width, icon_height] = icon.get_allocation()
-
- x = int(radius * math.cos(angle)) - icon_width / 2
- y = int(radius * math.sin(angle)) - icon_height / 2
-
- self.set_position(icon, x + width / 2, y + height / 2)
-
-class _Layout(gobject.GObject,hippo.CanvasLayout):
- __gtype_name__ = 'SugarDonutLayout'
- def __init__(self):
- gobject.GObject.__init__(self)
-
- def do_set_box(self, box):
- self._box = box
-
- def do_get_height_request(self, for_width):
- return _DONUT_SIZE, _DONUT_SIZE
-
- def do_get_width_request(self):
- return _DONUT_SIZE, _DONUT_SIZE
-
- def do_allocate(self, x, y, width, height,
- req_width, req_height, origin_changed):
- for child in self._box.get_layout_children():
- min_width, child_width = child.get_width_request()
- min_height, child_height = child.get_height_request(child_width)
-
- [angle_start, angle_end] = self._box._get_angles(i)
- angle = angle_start + (angle_end - angle_start) / 2
-
- x = int(radius * math.cos(angle)) - icon_width / 2
- y = int(radius * math.sin(angle)) - icon_height / 2
-
- child.allocate(x + (width - child_width) / 2,
- y + (height - child_height) / 2,
- icon_width, icon_height, origin_changed)
diff --git a/src/view/home/proc_smaps.py b/src/view/home/proc_smaps.py
deleted file mode 100755
index 6e1680f..0000000
--- a/src/view/home/proc_smaps.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# Copyright (C) 2007 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
-
-import os
-
-# /proc/PID/maps consists of a number of lines like this:
-# 00400000-004b1000 r-xp 00000000 fd:00 5767206 /bin/bash
-# 006b1000-006bb000 rw-p 000b1000 fd:00 5767206 /bin/bash
-# 006bb000-006c0000 rw-p 006bb000 00:00 0
-# ...
-# The fields are: address, permissions, offset, device, inode, and
-# (for non-anonymous mappings) pathname.
-#
-# /proc/PID/smaps gives additional information for each mapping:
-# 00400000-004b1000 r-xp 00000000 fd:00 5767206 /bin/bash
-# Size: 708 kB
-# Rss: 476 kB
-# Shared_Clean: 468 kB
-# Shared_Dirty: 0 kB
-# Private_Clean: 8 kB
-# Private_Dirty: 0 kB
-# Referenced: 0 kb
-#
-# The "Referenced" line only appears in kernel 2.6.22 and later.
-
-def get_shared_mapping_names(pid):
- """Returns a set of the files for which PID has a shared mapping"""
-
- mappings = set()
- infile = open("/proc/%s/maps" % pid, "r")
- for line in infile:
- # sharable mappings are non-anonymous and either read-only
- # (permissions "r-..") or writable but explicitly marked
- # shared ("rw.s")
- fields = line.split()
- if len(fields) < 6 or not fields[5].startswith('/'):
- continue
- if fields[1][0] != 'r' or (fields[1][1] == 'w' and fields[1][3] != 's'):
- continue
- mappings.add(fields[5])
- infile.close()
- return mappings
-
-_smaps_lines_per_entry = None
-
-def get_mappings(pid, ignored_shared_mappings):
- """Returns a list of (name, private, shared) tuples describing the
- memory mappings of PID. Shared mappings named in
- ignored_shared_mappings are ignored
- """
-
- global _smaps_lines_per_entry
- if _smaps_lines_per_entry is None:
- if os.path.isfile('/proc/%s/clear_refs' % os.getpid()):
- _smaps_lines_per_entry = 8
- else:
- _smaps_lines_per_entry = 7
-
- mappings = []
-
- smapfile = "/proc/%s/smaps" % pid
- infile = open(smapfile, "r")
- input = infile.read()
- infile.close()
- lines = input.splitlines()
-
- for line_idx in range(0, len(lines), _smaps_lines_per_entry):
- name_idx = lines[line_idx].find('/')
- if name_idx == -1:
- name = None
- else:
- name = lines[line_idx][name_idx:]
-
- private_clean = int(lines[line_idx + 5][14:-3])
- private_dirty = int(lines[line_idx + 6][14:-3])
- if name in ignored_shared_mappings:
- shared_clean = 0
- shared_dirty = 0
- else:
- shared_clean = int(lines[line_idx + 3][14:-3])
- shared_dirty = int(lines[line_idx + 4][14:-3])
-
- mapping = Mapping(name, private_clean + private_dirty,
- shared_clean + shared_dirty)
- mappings.append (mapping)
-
- return mappings
-
-class Mapping:
- def __init__ (self, name, private, shared):
- self.name = name
- self.private = private
- self.shared = shared
diff --git a/src/view/home/snowflakelayout.py b/src/view/home/snowflakelayout.py
deleted file mode 100644
index 1eb58cf..0000000
--- a/src/view/home/snowflakelayout.py
+++ /dev/null
@@ -1,108 +0,0 @@
-# Copyright (C) 2006-2007 Red Hat, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-import math
-
-import gobject
-import hippo
-
-from sugar.graphics import style
-
-_BASE_DISTANCE = style.zoom(15)
-_CHILDREN_FACTOR = style.zoom(3)
-
-class SnowflakeLayout(gobject.GObject,hippo.CanvasLayout):
- __gtype_name__ = 'SugarSnowflakeLayout'
- def __init__(self):
- gobject.GObject.__init__(self)
- self._nflakes = 0
-
- def add(self, child, center=False):
- if not center:
- self._nflakes += 1
-
- self._box.append(child)
-
- box_child = self._box.find_box_child(child)
- box_child.is_center = center
-
- def remove(self, child):
- box_child = self._box.find_box_child(child)
- if not box_child.is_center:
- self._nflakes -= 1
-
- self._box.remove(child)
-
- def do_set_box(self, box):
- self._box = box
-
- def do_get_height_request(self, for_width):
- size = self._calculate_size()
- return (size, size)
-
- def do_get_width_request(self):
- size = self._calculate_size()
- return (size, size)
-
- def do_allocate(self, x, y, width, height,
- req_width, req_height, origin_changed):
- r = self._get_radius()
- index = 0
-
- for child in self._box.get_layout_children():
- cx = x + width / 2
- cy = x + height / 2
-
- min_width, child_width = child.get_width_request()
- min_height, child_height = child.get_height_request(child_width)
-
- if child.is_center:
- child.allocate(x + (width - child_width) / 2,
- y + (height - child_height) / 2,
- child_width, child_height, origin_changed)
- else:
- angle = 2 * math.pi * index / self._nflakes
-
- dx = math.cos(angle) * r
- dy = math.sin(angle) * r
-
- child_x = int(x + (width - child_width) / 2 + dx)
- child_y = int(y + (height - child_height) / 2 + dy)
-
- child.allocate(child_x, child_y, child_width,
- child_height, origin_changed)
-
- index += 1
-
- def _get_radius(self):
- radius = int(_BASE_DISTANCE + _CHILDREN_FACTOR * self._nflakes)
- for child in self._box.get_layout_children():
- if child.is_center:
- [min_w, child_w] = child.get_width_request()
- [min_h, child_h] = child.get_height_request(child_w)
- radius += max(child_w, child_h) / 2
-
- return radius
-
- def _calculate_size(self):
- thickness = 0
- for child in self._box.get_layout_children():
- [min_width, child_width] = child.get_width_request()
- [min_height, child_height] = child.get_height_request(child_width)
- thickness = max(thickness, max(child_width, child_height))
-
- return self._get_radius() * 2 + thickness
diff --git a/src/view/home/spreadlayout.py b/src/view/home/spreadlayout.py
deleted file mode 100644
index 3463169..0000000
--- a/src/view/home/spreadlayout.py
+++ /dev/null
@@ -1,246 +0,0 @@
-# Copyright (C) 2007 Red Hat, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-from numpy import array
-from random import random
-
-import hippo
-import gobject
-import gtk
-
-from sugar.graphics import style
-
-_PLACE_TRIALS = 20
-_MAX_WEIGHT = 255
-_CELL_SIZE = 4
-
-class _Grid(gobject.GObject):
- __gsignals__ = {
- 'child-changed' : (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT]))
- }
- def __init__(self, width, height):
- gobject.GObject.__init__(self)
-
- self.width = width
- self.height = height
- self._children = []
- self._collisions = []
- self._collisions_sid = 0
-
- self._array = array([0], dtype='b')
- self._array.resize(width * height)
-
- def add(self, child, width, height):
- trials = _PLACE_TRIALS
- weight = _MAX_WEIGHT
- while trials > 0 and weight:
- x = int(random() * (self.width - width))
- y = int(random() * (self.height - height))
-
- rect = gtk.gdk.Rectangle(x, y, width, height)
- new_weight = self._compute_weight(rect)
- if weight > new_weight:
- weight = new_weight
-
- trials -= 1
-
- child.grid_rect = rect
- child.locked = False
-
- self._add_child(child)
-
- if weight > 0:
- self._detect_collisions(child)
-
- def remove(self, child):
- self._children.remove(child)
- self._remove_weight(child.grid_rect)
- child.grid_rect = None
-
- def _add_child(self, child):
- self._children.append(child)
- self.add_weight(child.grid_rect)
-
- def _move_child(self, child, new_rect):
- self._remove_weight(child.grid_rect)
- self.add_weight(new_rect)
-
- child.grid_rect = new_rect
-
- self.emit('child-changed', child)
-
- def _shift_child(self, child):
- rect = child.grid_rect
- weight = self._compute_weight(rect)
- new_rects = []
-
- if (rect.x + rect.width < self.width - 1):
- new_rects.append(gtk.gdk.Rectangle(rect.x + 1, rect.y,
- rect.width, rect.height))
-
- if (rect.x - 1 > 0):
- new_rects.append(gtk.gdk.Rectangle(rect.x - 1, rect.y,
- rect.width, rect.height))
-
- if (rect.y + rect.height < self.height - 1):
- new_rects.append(gtk.gdk.Rectangle(rect.x, rect.y + 1,
- rect.width, rect.height))
-
- if (rect.y - 1 > 0):
- new_rects.append(gtk.gdk.Rectangle(rect.x, rect.y - 1,
- rect.width, rect.height))
-
- best_rect = None
- for new_rect in new_rects:
- new_weight = self._compute_weight(new_rect)
- if new_weight < weight:
- best_rect = new_rect
- weight = new_weight
-
- if best_rect:
- self._move_child(child, best_rect)
-
- return weight
-
-
- def _solve_collisions(self):
- for collision in self._collisions[:]:
- weight = self._shift_child(collision)
- if not weight:
- self._collisions.remove(collision)
-
- return (len(self._collisions) > 0)
-
- def _detect_collisions(self, child):
- collision_found = False
- for c in self._children:
- intersection = child.grid_rect.intersect(c.grid_rect)
- if c != child and intersection.width > 0:
- if c not in self._collisions:
- collision_found = True
- self._collisions.append(c)
-
- if collision_found:
- if child not in self._collisions:
- self._collisions.append(child)
-
-# if len(self._collisions) and not self._collisions_sid:
-# self._collisions_sid = gobject.idle_add(self._solve_collisions)
-
- def add_weight(self, rect):
- for i in range(rect.x, rect.x + rect.width):
- for j in range(rect.y, rect.y + rect.height):
- self[j, i] += 1
-
- def _remove_weight(self, rect):
- for i in range(rect.x, rect.x + rect.width):
- for j in range(rect.y, rect.y + rect.height):
- self[j, i] -= 1
-
- def _compute_weight(self, rect):
- weight = 0
-
- for i in range(rect.x, rect.x + rect.width):
- for j in range(rect.y, rect.y + rect.height):
- weight += self[j, i]
-
- return weight
-
- def __getitem__(self, (row, col)):
- return self._array[col + row * self.width]
-
- def __setitem__(self, (row, col), value):
- self._array[col + row * self.width] = value
-
-
-class SpreadLayout(gobject.GObject, hippo.CanvasLayout):
- __gtype_name__ = 'SugarSpreadLayout'
- def __init__(self):
- gobject.GObject.__init__(self)
-
- min_width, width = self.do_get_width_request()
- min_height, height = self.do_get_height_request(width)
-
- self._grid = _Grid(width / _CELL_SIZE, height / _CELL_SIZE)
- self._grid.connect('child-changed', self._grid_child_changed_cb)
-
- def add_center(self, child, vertical_offset=0):
- self._box.append(child)
-
- width, height = self._get_child_grid_size(child)
- rect = gtk.gdk.Rectangle(int((self._grid.width - width) / 2),
- int((self._grid.height - height) / 2),
- width + 1, height + 1)
- self._grid.add_weight(rect)
-
- box_child = self._box.find_box_child(child)
- box_child.grid_rect = None
- box_child.vertical_offset = vertical_offset
-
- def add(self, child):
- self._box.append(child)
-
- width, height = self._get_child_grid_size(child)
- box_child = self._box.find_box_child(child)
- self._grid.add(box_child, width, height)
-
- def remove(self, child):
- box_child = self._box.find_box_child(child)
- self._grid.remove(box_child)
-
- self._box.remove(child)
-
- def do_set_box(self, box):
- self._box = box
-
- def do_get_height_request(self, for_width):
- return 0, gtk.gdk.screen_height() - style.GRID_CELL_SIZE
-
- def do_get_width_request(self):
- return 0, gtk.gdk.screen_width()
-
- def do_allocate(self, x, y, width, height,
- req_width, req_height, origin_changed):
- for child in self._box.get_layout_children():
- # We need to always get requests to not confuse hippo
- min_w, child_width = child.get_width_request()
- min_h, child_height = child.get_height_request(child_width)
-
- rect = child.grid_rect
- if child.grid_rect:
- child.allocate(rect.x * _CELL_SIZE,
- rect.y * _CELL_SIZE,
- rect.width * _CELL_SIZE,
- rect.height * _CELL_SIZE,
- origin_changed)
- else:
- vertical_offset = child.vertical_offset
- child_x = x + (width - child_width) / 2
- child_y = y + (height - child_height + vertical_offset) / 2
- child.allocate(child_x, child_y, child_width, child_height,
- origin_changed)
-
- def _get_child_grid_size(self, child):
- min_width, width = child.get_width_request()
- min_height, height = child.get_height_request(width)
-
- return int(width / _CELL_SIZE), int(height / _CELL_SIZE)
-
- def _grid_child_changed_cb(self, grid, box_child):
- box_child.item.emit_request_changed()
diff --git a/src/view/home/transitionbox.py b/src/view/home/transitionbox.py
deleted file mode 100644
index f1ba4fb..0000000
--- a/src/view/home/transitionbox.py
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright (C) 2007, 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
-
-import hippo
-import gobject
-
-from sugar.graphics import style
-from sugar.graphics import animator
-
-from view.home.MyIcon import MyIcon
-from view.home.spreadlayout import SpreadLayout
-
-class _Animation(animator.Animation):
- def __init__(self, icon, start_size, end_size):
- animator.Animation.__init__(self, 0.0, 1.0)
-
- self._icon = icon
- self.start_size = start_size
- self.end_size = end_size
-
- def next_frame(self, current):
- d = (self.end_size - self.start_size) * current
- self._icon.props.size = self.start_size + d
-
-class _Layout(gobject.GObject,hippo.CanvasLayout):
- __gtype_name__ = 'SugarTransitionBoxLayout'
- def __init__(self):
- gobject.GObject.__init__(self)
-
- def do_set_box(self, box):
- self._box = box
-
- def do_get_height_request(self, for_width):
- return 0, 0
-
- def do_get_width_request(self):
- return 0, 0
-
- def do_allocate(self, x, y, width, height,
- req_width, req_height, origin_changed):
- for child in self._box.get_layout_children():
- min_width, child_width = child.get_width_request()
- min_height, child_height = child.get_height_request(child_width)
-
- child.allocate(x + (width - child_width) / 2,
- y + (height - child_height) / 2,
- child_width, child_height, origin_changed)
-
-class TransitionBox(hippo.CanvasBox):
- __gtype_name__ = 'SugarTransitionBox'
-
- __gsignals__ = {
- 'completed': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([]))
- }
-
- def __init__(self):
- hippo.CanvasBox.__init__(self, background_color=0xe2e2e2ff)
-
- self._size = style.XLARGE_ICON_SIZE
-
- self._layout = _Layout()
- self.set_layout(self._layout)
-
- self._my_icon = MyIcon(self._size)
- self.append(self._my_icon)
-
- self._animator = animator.Animator(0.3)
- self._animator.connect('completed', self._animation_completed_cb)
-
- def _animation_completed_cb(self, anim):
- self.emit('completed')
-
- def set_size(self, size):
- self._animator.remove_all()
- self._animator.add(_Animation(self._my_icon, self._size, size))
- self._animator.start()
-
- self._size = size
-
diff --git a/src/view/keyhandler.py b/src/view/keyhandler.py
deleted file mode 100644
index b07f46c..0000000
--- a/src/view/keyhandler.py
+++ /dev/null
@@ -1,237 +0,0 @@
-# Copyright (C) 2006-2007, 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
-
-import os
-import signal
-import logging
-import subprocess
-
-import dbus
-import gtk
-
-from hardware import hardwaremanager
-from model.shellmodel import ShellModel
-from sugar._sugarext import KeyGrabber
-
-_BRIGHTNESS_STEP = 2
-_VOLUME_STEP = 10
-_BRIGHTNESS_MAX = 15
-_VOLUME_MAX = 100
-
-_actions_table = {
- 'F1' : 'zoom_mesh',
- 'F2' : 'zoom_friends',
- 'F3' : 'zoom_home',
- 'F4' : 'zoom_activity',
- 'F9' : 'brightness_down',
- 'F10' : 'brightness_up',
- '<ctrl>F9' : 'brightness_min',
- '<ctrl>F10' : 'brightness_max',
- 'F11' : 'volume_down',
- 'F12' : 'volume_up',
- '<ctrl>F11' : 'volume_min',
- '<ctrl>F12' : 'volume_max',
- '<alt>1' : 'screenshot',
- '<alt>f' : 'frame',
- '0x93' : 'frame',
- '<alt>o' : 'overlay',
- '0xE0' : 'overlay',
- '0xEB' : 'rotate',
- '<alt>r' : 'rotate',
- '<alt>q' : 'quit_emulator',
- '<alt>Tab' : 'next_window',
- '<alt>n' : 'next_window',
- '<ctrl><alt>Tab' : 'previous_window',
- '<alt>p' : 'previous_window',
- '<ctrl>Escape' : 'close_window',
- '<ctrl>q' : 'close_window',
- '0xDC' : 'open_search',
- '<ctrl>o' : 'open_search',
- '<alt>s' : 'say_text'
-}
-
-J_DBUS_SERVICE = 'org.laptop.Journal'
-J_DBUS_PATH = '/org/laptop/Journal'
-J_DBUS_INTERFACE = 'org.laptop.Journal'
-
-SPEECH_DBUS_SERVICE = 'org.laptop.Speech'
-SPEECH_DBUS_PATH = '/org/laptop/Speech'
-SPEECH_DBUS_INTERFACE = 'org.laptop.Speech'
-
-class KeyHandler(object):
- def __init__(self, shell):
- self._shell = shell
- self._screen_rotation = 0
- self._key_pressed = None
- self._keycode_pressed = 0
- self._keystate_pressed = 0
- self._speech_proxy = None
-
- self._key_grabber = KeyGrabber()
- self._key_grabber.connect('key-pressed',
- self._key_pressed_cb)
-
- for key in _actions_table.keys():
- self._key_grabber.grab(key)
-
- def _change_volume(self, step=None, value=None):
- hw_manager = hardwaremanager.get_manager()
-
- if step is not None:
- volume = hw_manager.get_volume() + step
- elif value is not None:
- volume = value
-
- volume = min(max(0, volume), _VOLUME_MAX)
-
- hw_manager.set_volume(volume)
- hw_manager.set_mute(volume == 0)
-
- def _change_brightness(self, step=None, value=None):
- hw_manager = hardwaremanager.get_manager()
-
- if step is not None:
- level = hw_manager.get_display_brightness() + step
- elif value is not None:
- level = value
-
- level = min(max(0, level), _BRIGHTNESS_MAX)
-
- hw_manager.set_display_brightness(level)
- if level == 0:
- hw_manager.set_display_mode(hardwaremanager.B_AND_W_MODE)
- else:
- hw_manager.set_display_mode(hardwaremanager.COLOR_MODE)
-
- def _get_speech_proxy(self):
- if self._speech_proxy is None:
- bus = dbus.SessionBus()
- speech_obj = bus.get_object(SPEECH_DBUS_SERVICE, SPEECH_DBUS_PATH)
- self._speech_proxy = dbus.Interface(speech_obj, SPEECH_DBUS_INTERFACE)
- return self._speech_proxy
-
- def _on_speech_err(self, ex):
- logging.error("An error occurred with the ESpeak service: %r" % (ex, ))
-
- def _primary_selection_cb(self, clipboard, text, user_data):
- logging.debug('KeyHandler._primary_selection_cb: %r' % text)
- if text:
- self._get_speech_proxy().SayText(text, reply_handler=lambda: None, \
- error_handler=self._on_speech_err)
-
- def handle_say_text(self):
- clipboard = gtk.clipboard_get(selection="PRIMARY")
- clipboard.request_text(self._primary_selection_cb)
-
- def handle_previous_window(self):
- self._shell.activate_previous_activity()
-
- def handle_next_window(self):
- self._shell.activate_next_activity()
-
- def handle_close_window(self):
- self._shell.close_current_activity()
-
- def handle_zoom_mesh(self):
- self._shell.set_zoom_level(ShellModel.ZOOM_MESH)
-
- def handle_zoom_friends(self):
- self._shell.set_zoom_level(ShellModel.ZOOM_FRIENDS)
-
- def handle_zoom_home(self):
- self._shell.set_zoom_level(ShellModel.ZOOM_HOME)
-
- def handle_zoom_activity(self):
- self._shell.set_zoom_level(ShellModel.ZOOM_ACTIVITY)
-
- def handle_brightness_max(self):
- self._change_brightness(value=_BRIGHTNESS_MAX)
-
- def handle_brightness_min(self):
- self._change_brightness(value=0)
-
- def handle_volume_max(self):
- self._change_volume(value=_VOLUME_MAX)
-
- def handle_volume_min(self):
- self._change_volume(value=0)
-
- def handle_brightness_up(self):
- self._change_brightness(step=_BRIGHTNESS_STEP)
-
- def handle_brightness_down(self):
- self._change_brightness(step=-_BRIGHTNESS_STEP)
-
- def handle_volume_up(self):
- self._change_volume(step=_VOLUME_STEP)
-
- def handle_volume_down(self):
- self._change_volume(step=-_VOLUME_STEP)
-
- def handle_screenshot(self):
- self._shell.take_screenshot()
-
- def handle_frame(self):
- self._shell.get_frame().notify_key_press()
-
- def handle_overlay(self):
- self._shell.toggle_chat_visibility()
-
- def handle_rotate(self):
- states = [ 'normal', 'left', 'inverted', 'right']
-
- self._screen_rotation += 1
- if self._screen_rotation == len(states):
- self._screen_rotation = 0
-
- subprocess.Popen(['xrandr', '-o', states[self._screen_rotation]])
-
- def handle_quit_emulator(self):
- if os.environ.has_key('SUGAR_EMULATOR_PID'):
- pid = int(os.environ['SUGAR_EMULATOR_PID'])
- os.kill(pid, signal.SIGTERM)
-
- def focus_journal_search(self):
- bus = dbus.SessionBus()
- obj = bus.get_object(J_DBUS_SERVICE, J_DBUS_PATH)
- journal = dbus.Interface(obj, J_DBUS_INTERFACE)
- journal.FocusSearch({})
-
- def handle_open_search(self):
- self.focus_journal_search()
-
- def _key_pressed_cb(self, grabber, keycode, state):
- key = grabber.get_key(keycode, state)
- logging.debug('_key_pressed_cb: %i %i %s' % (keycode, state, key))
- if key:
- self._key_pressed = key
- self._keycode_pressed = keycode
- self._keystate_pressed = state
-
- """
- status = gtk.gdk.keyboard_grab(gtk.gdk.get_default_root_window(),
- owner_events=False, time=0L)
- if status != gtk.gdk.GRAB_SUCCESS:
- logging.error("KeyHandler._key_pressed_cb(): keyboard grab failed: " + status)
- """
-
- action = _actions_table[key]
- method = getattr(self, 'handle_' + action)
- method()
-
- return True
-
- return False
diff --git a/src/view/pulsingicon.py b/src/view/pulsingicon.py
deleted file mode 100644
index 9e7b3d9..0000000
--- a/src/view/pulsingicon.py
+++ /dev/null
@@ -1,90 +0,0 @@
-# Copyright (C) 2006-2007 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
-
-import gobject
-
-from sugar.graphics.icon import CanvasIcon
-
-class PulsingIcon(CanvasIcon):
- __gproperties__ = {
- 'paused' : (bool, None, None, False,
- gobject.PARAM_READWRITE),
- 'colors' : (object, None, None,
- gobject.PARAM_READWRITE),
- 'pulse-time' : (float, None, None,
- 0.0, 500.0, 0.0,
- gobject.PARAM_READWRITE),
- }
-
- def __init__(self, **kwargs):
- self._paused = False
- self._pulse_time = 0.0
- self._colors = None
- self._pulse_sid = 0
- self._pos = 0
-
- CanvasIcon.__init__(self, **kwargs)
-
- def do_set_property(self, pspec, value):
- CanvasIcon.do_set_property(self, pspec, value)
-
- if pspec.name == 'pulse-time':
- self._pulse_time = value
- self._stop()
- if not self._paused and self._pulse_time > 0.0:
- self._start()
- elif pspec.name == 'colors':
- self._colors = value
- self._pos = 0
- self._update_colors()
- elif pspec.name == 'paused':
- self._paused = value
- if not self._paused and self._pulse_time > 0.0:
- self._start()
- else:
- self._stop()
-
- def do_get_property(self, pspec):
- CanvasIcon.do_get_property(self, pspec)
-
- if pspec.name == 'pulse-time':
- return self._pulse_time
- elif pspec.name == 'colors':
- return self._colors
-
- def _update_colors(self):
- self.props.stroke_color = self._colors[self._pos][0]
- self.props.fill_color = self._colors[self._pos][1]
-
- def _pulse_timeout(self):
- if self._colors:
- self._update_colors()
-
- self._pos += 1
- if self._pos == len(self._colors):
- self._pos = 0
-
- return True
-
- def _start(self):
- if self._pulse_sid == 0:
- self._pulse_sid = gobject.timeout_add(
- int(self._pulse_time * 1000), self._pulse_timeout)
-
- def _stop(self):
- if self._pulse_sid:
- gobject.source_remove(self._pulse_sid)
- self._pulse_sid = 0
diff --git a/sugar/.gitignore b/sugar/.gitignore
new file mode 100644
index 0000000..de24e35
--- /dev/null
+++ b/sugar/.gitignore
@@ -0,0 +1,4 @@
+sugar-marshal.c
+sugar-marshal.h
+_sugarext.c
+_sugarext.c
diff --git a/lib/sugar/.license b/sugar/.license
index 6989ebe..6989ebe 100644
--- a/lib/sugar/.license
+++ b/sugar/.license
diff --git a/lib/sugar/Makefile.am b/sugar/Makefile.am
index e9b92f7..e45ead9 100644
--- a/lib/sugar/Makefile.am
+++ b/sugar/Makefile.am
@@ -13,11 +13,11 @@ pkgpyexecdir = $(pythondir)/sugar
pkgpyexec_LTLIBRARIES = _sugarext.la
_sugarext_la_CFLAGS = \
- $(LIB_CFLAGS) \
+ $(EXT_CFLAGS) \
$(PYTHON_INCLUDES)
_sugarext_la_LDFLAGS = -module -avoid-version
-_sugarext_la_LIBADD = $(LIB_LIBS)
+_sugarext_la_LIBADD = $(EXT_LIBS)
_sugarext_la_SOURCES = \
$(BUILT_SOURCES) \
diff --git a/lib/sugar/_sugarext.defs b/sugar/_sugarext.defs
index 1c9812e..1c9812e 100644
--- a/lib/sugar/_sugarext.defs
+++ b/sugar/_sugarext.defs
diff --git a/lib/sugar/_sugarext.override b/sugar/_sugarext.override
index 61fb815..61fb815 100644
--- a/lib/sugar/_sugarext.override
+++ b/sugar/_sugarext.override
diff --git a/lib/sugar/_sugarextmodule.c b/sugar/_sugarextmodule.c
index 6f6af6d..6f6af6d 100644
--- a/lib/sugar/_sugarextmodule.c
+++ b/sugar/_sugarextmodule.c
diff --git a/lib/sugar/activity/Makefile.am b/sugar/activity/Makefile.am
index 9dfc8de..9dfc8de 100644
--- a/lib/sugar/activity/Makefile.am
+++ b/sugar/activity/Makefile.am
diff --git a/lib/sugar/activity/__init__.py b/sugar/activity/__init__.py
index 8a984ad..8a984ad 100644
--- a/lib/sugar/activity/__init__.py
+++ b/sugar/activity/__init__.py
diff --git a/lib/sugar/activity/__init__py b/sugar/activity/__init__py
index e69de29..e69de29 100644
--- a/lib/sugar/activity/__init__py
+++ b/sugar/activity/__init__py
diff --git a/lib/sugar/activity/activity.py b/sugar/activity/activity.py
index 9d87e9e..9d87e9e 100644
--- a/lib/sugar/activity/activity.py
+++ b/sugar/activity/activity.py
diff --git a/lib/sugar/activity/activityfactory.py b/sugar/activity/activityfactory.py
index 1638197..1638197 100644
--- a/lib/sugar/activity/activityfactory.py
+++ b/sugar/activity/activityfactory.py
diff --git a/lib/sugar/activity/activityhandle.py b/sugar/activity/activityhandle.py
index f91651e..f91651e 100644
--- a/lib/sugar/activity/activityhandle.py
+++ b/sugar/activity/activityhandle.py
diff --git a/lib/sugar/activity/activityservice.py b/sugar/activity/activityservice.py
index c884fcb..c884fcb 100644
--- a/lib/sugar/activity/activityservice.py
+++ b/sugar/activity/activityservice.py
diff --git a/lib/sugar/activity/bundlebuilder.py b/sugar/activity/bundlebuilder.py
index e992557..e992557 100644
--- a/lib/sugar/activity/bundlebuilder.py
+++ b/sugar/activity/bundlebuilder.py
diff --git a/lib/sugar/activity/registry.py b/sugar/activity/registry.py
index ac672d5..ac672d5 100644
--- a/lib/sugar/activity/registry.py
+++ b/sugar/activity/registry.py
diff --git a/lib/sugar/bundle/Makefile.am b/sugar/bundle/Makefile.am
index f1af791..f1af791 100644
--- a/lib/sugar/bundle/Makefile.am
+++ b/sugar/bundle/Makefile.am
diff --git a/lib/sugar/bundle/__init__.py b/sugar/bundle/__init__.py
index 85ebced..85ebced 100644
--- a/lib/sugar/bundle/__init__.py
+++ b/sugar/bundle/__init__.py
diff --git a/lib/sugar/bundle/activitybundle.py b/sugar/bundle/activitybundle.py
index ee72f80..ee72f80 100644
--- a/lib/sugar/bundle/activitybundle.py
+++ b/sugar/bundle/activitybundle.py
diff --git a/lib/sugar/bundle/bundle.py b/sugar/bundle/bundle.py
index f7f18c9..f7f18c9 100644
--- a/lib/sugar/bundle/bundle.py
+++ b/sugar/bundle/bundle.py
diff --git a/lib/sugar/bundle/contentbundle.py b/sugar/bundle/contentbundle.py
index 9e2d36e..9e2d36e 100644
--- a/lib/sugar/bundle/contentbundle.py
+++ b/sugar/bundle/contentbundle.py
diff --git a/lib/sugar/clipboard/Makefile.am b/sugar/clipboard/Makefile.am
index 0d61c29..0d61c29 100644
--- a/lib/sugar/clipboard/Makefile.am
+++ b/sugar/clipboard/Makefile.am
diff --git a/lib/sugar/clipboard/__init__.py b/sugar/clipboard/__init__.py
index deee8dd..deee8dd 100644
--- a/lib/sugar/clipboard/__init__.py
+++ b/sugar/clipboard/__init__.py
diff --git a/lib/sugar/clipboard/clipboardservice.py b/sugar/clipboard/clipboardservice.py
index d975330..d975330 100644
--- a/lib/sugar/clipboard/clipboardservice.py
+++ b/sugar/clipboard/clipboardservice.py
diff --git a/lib/sugar/datastore/Makefile.am b/sugar/datastore/Makefile.am
index a5f16b7..a5f16b7 100644
--- a/lib/sugar/datastore/Makefile.am
+++ b/sugar/datastore/Makefile.am
diff --git a/lib/sugar/datastore/__init__.py b/sugar/datastore/__init__.py
index bdb658b..bdb658b 100644
--- a/lib/sugar/datastore/__init__.py
+++ b/sugar/datastore/__init__.py
diff --git a/lib/sugar/datastore/datastore.py b/sugar/datastore/datastore.py
index 334c866..334c866 100644
--- a/lib/sugar/datastore/datastore.py
+++ b/sugar/datastore/datastore.py
diff --git a/lib/sugar/datastore/dbus_helpers.py b/sugar/datastore/dbus_helpers.py
index a5ce9c8..a5ce9c8 100644
--- a/lib/sugar/datastore/dbus_helpers.py
+++ b/sugar/datastore/dbus_helpers.py
diff --git a/lib/sugar/eggaccelerators.c b/sugar/eggaccelerators.c
index 0a39d51..0a39d51 100644
--- a/lib/sugar/eggaccelerators.c
+++ b/sugar/eggaccelerators.c
diff --git a/lib/sugar/eggaccelerators.h b/sugar/eggaccelerators.h
index d2276d2..d2276d2 100644
--- a/lib/sugar/eggaccelerators.h
+++ b/sugar/eggaccelerators.h
diff --git a/lib/sugar/env.py b/sugar/env.py
index e0b6fa9..e0b6fa9 100644
--- a/lib/sugar/env.py
+++ b/sugar/env.py
diff --git a/lib/sugar/graphics/Makefile.am b/sugar/graphics/Makefile.am
index 0a3a846..0a3a846 100644
--- a/lib/sugar/graphics/Makefile.am
+++ b/sugar/graphics/Makefile.am
diff --git a/lib/sugar/graphics/__init__.py b/sugar/graphics/__init__.py
index 1e7e0f9..1e7e0f9 100644
--- a/lib/sugar/graphics/__init__.py
+++ b/sugar/graphics/__init__.py
diff --git a/lib/sugar/graphics/alert.py b/sugar/graphics/alert.py
index ef649b2..ef649b2 100644
--- a/lib/sugar/graphics/alert.py
+++ b/sugar/graphics/alert.py
diff --git a/lib/sugar/graphics/animator.py b/sugar/graphics/animator.py
index 459851b..459851b 100644
--- a/lib/sugar/graphics/animator.py
+++ b/sugar/graphics/animator.py
diff --git a/lib/sugar/graphics/combobox.py b/sugar/graphics/combobox.py
index 5584267..5584267 100644
--- a/lib/sugar/graphics/combobox.py
+++ b/sugar/graphics/combobox.py
diff --git a/lib/sugar/graphics/entry.py b/sugar/graphics/entry.py
index 95510e5..95510e5 100644
--- a/lib/sugar/graphics/entry.py
+++ b/sugar/graphics/entry.py
diff --git a/lib/sugar/graphics/icon.py b/sugar/graphics/icon.py
index 81a8232..81a8232 100644
--- a/lib/sugar/graphics/icon.py
+++ b/sugar/graphics/icon.py
diff --git a/lib/sugar/graphics/iconentry.py b/sugar/graphics/iconentry.py
index a1fed31..a1fed31 100644
--- a/lib/sugar/graphics/iconentry.py
+++ b/sugar/graphics/iconentry.py
diff --git a/lib/sugar/graphics/menuitem.py b/sugar/graphics/menuitem.py
index 908cc1f..908cc1f 100644
--- a/lib/sugar/graphics/menuitem.py
+++ b/sugar/graphics/menuitem.py
diff --git a/lib/sugar/graphics/notebook.py b/sugar/graphics/notebook.py
index 2d49b1f..2d49b1f 100644
--- a/lib/sugar/graphics/notebook.py
+++ b/sugar/graphics/notebook.py
diff --git a/lib/sugar/graphics/objectchooser.py b/sugar/graphics/objectchooser.py
index 59f1a8a..59f1a8a 100644
--- a/lib/sugar/graphics/objectchooser.py
+++ b/sugar/graphics/objectchooser.py
diff --git a/lib/sugar/graphics/palette.py b/sugar/graphics/palette.py
index 85e60ac..85e60ac 100644
--- a/lib/sugar/graphics/palette.py
+++ b/sugar/graphics/palette.py
diff --git a/lib/sugar/graphics/palettegroup.py b/sugar/graphics/palettegroup.py
index bdae76b..bdae76b 100644
--- a/lib/sugar/graphics/palettegroup.py
+++ b/sugar/graphics/palettegroup.py
diff --git a/lib/sugar/graphics/panel.py b/sugar/graphics/panel.py
index bf3ed24..bf3ed24 100644
--- a/lib/sugar/graphics/panel.py
+++ b/sugar/graphics/panel.py
diff --git a/lib/sugar/graphics/radiotoolbutton.py b/sugar/graphics/radiotoolbutton.py
index cb4ae25..cb4ae25 100644
--- a/lib/sugar/graphics/radiotoolbutton.py
+++ b/sugar/graphics/radiotoolbutton.py
diff --git a/lib/sugar/graphics/roundbox.py b/sugar/graphics/roundbox.py
index 51b9e7d..51b9e7d 100644
--- a/lib/sugar/graphics/roundbox.py
+++ b/sugar/graphics/roundbox.py
diff --git a/lib/sugar/graphics/style.py b/sugar/graphics/style.py
index 1f97adc..1f97adc 100644
--- a/lib/sugar/graphics/style.py
+++ b/sugar/graphics/style.py
diff --git a/lib/sugar/graphics/toggletoolbutton.py b/sugar/graphics/toggletoolbutton.py
index 3d05cc0..3d05cc0 100644
--- a/lib/sugar/graphics/toggletoolbutton.py
+++ b/sugar/graphics/toggletoolbutton.py
diff --git a/lib/sugar/graphics/toolbox.py b/sugar/graphics/toolbox.py
index 4171d00..4171d00 100644
--- a/lib/sugar/graphics/toolbox.py
+++ b/sugar/graphics/toolbox.py
diff --git a/lib/sugar/graphics/toolbutton.py b/sugar/graphics/toolbutton.py
index 26acc83..26acc83 100644
--- a/lib/sugar/graphics/toolbutton.py
+++ b/sugar/graphics/toolbutton.py
diff --git a/lib/sugar/graphics/toolcombobox.py b/sugar/graphics/toolcombobox.py
index 460dcee..460dcee 100644
--- a/lib/sugar/graphics/toolcombobox.py
+++ b/sugar/graphics/toolcombobox.py
diff --git a/lib/sugar/graphics/tray.py b/sugar/graphics/tray.py
index da40501..da40501 100644
--- a/lib/sugar/graphics/tray.py
+++ b/sugar/graphics/tray.py
diff --git a/lib/sugar/graphics/window.py b/sugar/graphics/window.py
index 3189400..3189400 100644
--- a/lib/sugar/graphics/window.py
+++ b/sugar/graphics/window.py
diff --git a/lib/sugar/graphics/xocolor.py b/sugar/graphics/xocolor.py
index d37eab1..d37eab1 100644
--- a/lib/sugar/graphics/xocolor.py
+++ b/sugar/graphics/xocolor.py
diff --git a/lib/sugar/network.py b/sugar/network.py
index 49d4882..49d4882 100644
--- a/lib/sugar/network.py
+++ b/sugar/network.py
diff --git a/lib/sugar/presence/Makefile.am b/sugar/presence/Makefile.am
index cb52a41..cb52a41 100644
--- a/lib/sugar/presence/Makefile.am
+++ b/sugar/presence/Makefile.am
diff --git a/lib/sugar/presence/__init__.py b/sugar/presence/__init__.py
index 3834ab2..3834ab2 100644
--- a/lib/sugar/presence/__init__.py
+++ b/sugar/presence/__init__.py
diff --git a/lib/sugar/presence/activity.py b/sugar/presence/activity.py
index b0110a0..b0110a0 100644
--- a/lib/sugar/presence/activity.py
+++ b/sugar/presence/activity.py
diff --git a/lib/sugar/presence/buddy.py b/sugar/presence/buddy.py
index 1030cfc..1030cfc 100644
--- a/lib/sugar/presence/buddy.py
+++ b/sugar/presence/buddy.py
diff --git a/lib/sugar/presence/presenceservice.py b/sugar/presence/presenceservice.py
index cb47a3a..cb47a3a 100644
--- a/lib/sugar/presence/presenceservice.py
+++ b/sugar/presence/presenceservice.py
diff --git a/lib/sugar/presence/test_presence.txt b/sugar/presence/test_presence.txt
index d0736a9..d0736a9 100644
--- a/lib/sugar/presence/test_presence.txt
+++ b/sugar/presence/test_presence.txt
diff --git a/lib/sugar/presence/tubeconn.py b/sugar/presence/tubeconn.py
index b487391..b487391 100644
--- a/lib/sugar/presence/tubeconn.py
+++ b/sugar/presence/tubeconn.py
diff --git a/lib/sugar/profile.py b/sugar/profile.py
index 11991dd..11991dd 100644
--- a/lib/sugar/profile.py
+++ b/sugar/profile.py
diff --git a/lib/sugar/sexy-icon-entry.c b/sugar/sexy-icon-entry.c
index ca35209..ca35209 100644
--- a/lib/sugar/sexy-icon-entry.c
+++ b/sugar/sexy-icon-entry.c
diff --git a/lib/sugar/sexy-icon-entry.h b/sugar/sexy-icon-entry.h
index eb83fed..eb83fed 100644
--- a/lib/sugar/sexy-icon-entry.h
+++ b/sugar/sexy-icon-entry.h
diff --git a/lib/sugar/sugar-address-entry.c b/sugar/sugar-address-entry.c
index 7b6d525..7b6d525 100644
--- a/lib/sugar/sugar-address-entry.c
+++ b/sugar/sugar-address-entry.c
diff --git a/lib/sugar/sugar-address-entry.h b/sugar/sugar-address-entry.h
index 60c56ab..60c56ab 100644
--- a/lib/sugar/sugar-address-entry.h
+++ b/sugar/sugar-address-entry.h
diff --git a/lib/sugar/sugar-key-grabber.c b/sugar/sugar-key-grabber.c
index baddab5..baddab5 100644
--- a/lib/sugar/sugar-key-grabber.c
+++ b/sugar/sugar-key-grabber.c
diff --git a/lib/sugar/sugar-key-grabber.h b/sugar/sugar-key-grabber.h
index 5b734e7..5b734e7 100644
--- a/lib/sugar/sugar-key-grabber.h
+++ b/sugar/sugar-key-grabber.h
diff --git a/lib/sugar/sugar-marshal.list b/sugar/sugar-marshal.list
index 41ce620..41ce620 100644
--- a/lib/sugar/sugar-marshal.list
+++ b/sugar/sugar-marshal.list
diff --git a/lib/sugar/sugar-menu.c b/sugar/sugar-menu.c
index f19dc4b..f19dc4b 100644
--- a/lib/sugar/sugar-menu.c
+++ b/sugar/sugar-menu.c
diff --git a/lib/sugar/sugar-menu.h b/sugar/sugar-menu.h
index 8773a31..8773a31 100644
--- a/lib/sugar/sugar-menu.h
+++ b/sugar/sugar-menu.h
diff --git a/lib/sugar/sugar-preview.c b/sugar/sugar-preview.c
index f54045b..f54045b 100644
--- a/lib/sugar/sugar-preview.c
+++ b/sugar/sugar-preview.c
diff --git a/lib/sugar/sugar-preview.h b/sugar/sugar-preview.h
index 6029cc1..6029cc1 100644
--- a/lib/sugar/sugar-preview.h
+++ b/sugar/sugar-preview.h
diff --git a/lib/sugar/util.py b/sugar/util.py
index 8a3fb4a..8a3fb4a 100644
--- a/lib/sugar/util.py
+++ b/sugar/util.py
diff --git a/lib/sugar/wm.py b/sugar/wm.py
index 47356a5..47356a5 100644
--- a/lib/sugar/wm.py
+++ b/sugar/wm.py