Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2008-10-19 12:03:11 (GMT)
committer Jonas Smedegaard <dr@jones.dk>2008-10-19 12:03:11 (GMT)
commitad3c4f465e24458d8940e4674270ae39bfff378f (patch)
tree361bca6fc2881595c8dff3e2cc613a10cb3fe998
parent5786a5d9938ee5b713d8a2a790c5a387947dd431 (diff)
parentcbd0509f4bcfe1b3e52f8898b1cb83d522337ab8 (diff)
Merge commit 'v0.82.8' into upstream
-rw-r--r--bin/sugar-activity123
-rw-r--r--configure.ac5
-rw-r--r--po/ar.po256
-rw-r--r--po/de.po211
-rw-r--r--po/en.po566
-rw-r--r--po/es.po217
-rw-r--r--po/fr.po207
-rw-r--r--po/ht.po436
-rw-r--r--po/it.po267
-rw-r--r--po/ja.po260
-rw-r--r--po/mn.po131
-rw-r--r--po/nl.po199
-rw-r--r--po/pt.po915
-rw-r--r--po/sl.po195
-rw-r--r--service/activityregistryservice.py6
-rw-r--r--service/bundleregistry.py29
-rw-r--r--src/config.py.in4
-rw-r--r--src/controlpanel/cmd.py20
-rw-r--r--src/controlpanel/gui.py24
-rw-r--r--src/controlpanel/model/aboutxo.py24
-rw-r--r--src/controlpanel/model/datetime.py4
-rw-r--r--src/controlpanel/model/language.py10
-rw-r--r--src/controlpanel/model/network.py20
-rw-r--r--src/controlpanel/toolbar.py10
-rw-r--r--src/controlpanel/view/aboutme.py19
-rw-r--r--src/controlpanel/view/aboutxo.py91
-rw-r--r--src/controlpanel/view/datetime.py14
-rw-r--r--src/controlpanel/view/frame.py20
-rw-r--r--src/controlpanel/view/language.py14
-rw-r--r--src/controlpanel/view/network.py68
-rw-r--r--src/controlpanel/view/power.py18
-rw-r--r--src/hardware/hardwaremanager.py80
-rw-r--r--src/hardware/nmclient.py50
-rw-r--r--src/hardware/nminfo.py7
-rw-r--r--src/main.py32
-rw-r--r--src/model/devices/network/mesh.py12
-rw-r--r--src/model/devices/network/wireless.py9
-rw-r--r--src/model/homeactivity.py38
-rw-r--r--src/model/homemodel.py44
-rw-r--r--src/view/BuddyMenu.py5
-rw-r--r--src/view/Shell.py37
-rw-r--r--src/view/devices/network/mesh.py63
-rw-r--r--src/view/devices/network/wireless.py79
-rw-r--r--src/view/frame/activitiestray.py2
-rw-r--r--src/view/frame/frame.py2
-rw-r--r--src/view/frame/friendstray.py1
-rw-r--r--src/view/home/HomeBox.py130
-rw-r--r--src/view/home/HomeWindow.py1
-rw-r--r--src/view/home/MeshBox.py9
-rw-r--r--src/view/home/activitieslist.py12
-rw-r--r--src/view/home/favoriteslayout.py231
-rw-r--r--src/view/home/favoritesview.py27
-rw-r--r--src/view/home/grid.py60
-rw-r--r--src/view/home/spreadlayout.py12
-rw-r--r--src/view/keyhandler.py2
-rw-r--r--src/view/launchwindow.py65
-rw-r--r--src/view/palettes.py8
-rw-r--r--src/view/tabbinghandler.py1
58 files changed, 3524 insertions, 1878 deletions
diff --git a/bin/sugar-activity b/bin/sugar-activity
index 0761387..4abdd80 100644
--- a/bin/sugar-activity
+++ b/bin/sugar-activity
@@ -1,6 +1,6 @@
#!/usr/bin/env python
-# Copyright (C) 2006, Red Hat, Inc.
+# Copyright (C) 2006-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
@@ -16,123 +16,6 @@
# 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
+from sugar.activity import main
-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 logger
-
-def create_activity_instance(constructor, handle):
- activity = constructor(handle)
- activity.show()
-
-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, name_service, constructor):
- self.constructor = constructor
-
- bus = dbus.SessionBus()
- bus_name = dbus.service.BusName(name_service, bus=bus)
- object_path = get_single_process_path(name_service)
- 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)
-
-activity_constructor = getattr(module, class_name)
-activity_handle = activityhandle.ActivityHandle(
- activity_id=options.activity_id,
- object_id=options.object_id, uri=options.uri)
-
-if options.single_process is True:
- sessionbus = dbus.SessionBus()
-
- service_name = get_single_process_name(options.bundle_id)
- service_path = get_single_process_path(options.bundle_id)
-
- bus_object = sessionbus.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, activity_constructor)
- else:
- single_process = sessionbus.get_object(service_name, service_path)
- single_process.create(activity_handle.get_dict())
-
- print 'Created %s in a single process.' % service_name
- sys.exit(0)
-
-if hasattr(module, 'start'):
- module.start()
-
-create_activity_instance(activity_constructor, activity_handle)
-
-gtk.main()
+main.main()
diff --git a/configure.ac b/configure.ac
index 9e4f21b..6ab63d3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,10 +1,13 @@
-AC_INIT([Sugar],[0.82.0],[],[sugar])
+AC_INIT([Sugar],[0.82.7],[],[sugar])
AC_PREREQ([2.59])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_SRCDIR([configure.ac])
+SUCROSE_VERSION="0.82.1"
+AC_SUBST(SUCROSE_VERSION)
+
AM_INIT_AUTOMAKE([1.9 foreign dist-bzip2 no-dist-gzip])
AM_PATH_PYTHON
diff --git a/po/ar.po b/po/ar.po
index ac10c67..d799347 100644
--- a/po/ar.po
+++ b/po/ar.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: sugar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-07-23 07:44-0400\n"
-"PO-Revision-Date: 2008-07-30 05:23-0400\n"
+"POT-Creation-Date: 2008-09-19 00:30-0400\n"
+"PO-Revision-Date: 2008-09-19 16:02-0400\n"
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
"Language-Team: Arabic <doc@arabeyes.org>\n"
"MIME-Version: 1.0\n"
@@ -23,31 +23,31 @@ msgstr ""
msgid "Name:"
msgstr "الاسم:"
-#: ../src/intro/intro.py:94
+#: ../src/intro/intro.py:97
msgid "Click to change color:"
msgstr "انقر لتغيير اللون:"
-#: ../src/intro/intro.py:145
+#: ../src/intro/intro.py:148
msgid "Back"
msgstr "السابق"
-#: ../src/intro/intro.py:159 ../src/controlpanel/toolbar.py:61
+#: ../src/intro/intro.py:162 ../src/controlpanel/toolbar.py:61
msgid "Done"
msgstr "تمّ"
-#: ../src/intro/intro.py:162
+#: ../src/intro/intro.py:165
msgid "Next"
msgstr "التالي"
-#: ../src/view/BuddyMenu.py:58
+#: ../src/view/BuddyMenu.py:60
msgid "Remove friend"
msgstr "أزل صديق"
-#: ../src/view/BuddyMenu.py:61
+#: ../src/view/BuddyMenu.py:63
msgid "Make friend"
msgstr "اصنع صديق"
-#: ../src/view/BuddyMenu.py:91
+#: ../src/view/BuddyMenu.py:92
#, python-format
msgid "Invite to %s"
msgstr "ادعُ إلى %s"
@@ -68,7 +68,7 @@ msgstr "افتح"
#. TODO: Implement stopping downloads
#. self._stop_item.connect('activate', self._stop_item_activate_cb)
#. self.append_menu_item(self._stop_item)
-#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:86
+#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:85
msgid "Keep"
msgstr "احفظ"
@@ -93,51 +93,71 @@ msgstr "نوع الاستيثاق:"
msgid "Encryption Type:"
msgstr "نوع التعمية:"
-#: ../src/view/Shell.py:240
+#: ../src/hardware/schoolserver.py:17
+msgid "Cannot obtain data needed for registration."
+msgstr "تعذّر الحصول على البيانات المطلوبة للتسجيل."
+
+#: ../src/hardware/schoolserver.py:31
+msgid "Cannot connect to the server."
+msgstr "تعذّر الاتصال بالخادوم."
+
+#: ../src/hardware/schoolserver.py:36
+msgid "The server could not complete the request."
+msgstr "لم يستطع الخادوم إكمال الطلب."
+
+#: ../src/view/Shell.py:251
msgid "Screenshot"
msgstr "لقطة شاشة"
-#: ../src/view/home/HomeBox.py:80
+#: ../src/view/home/HomeBox.py:79
msgid "Confirm erase"
msgstr "أكّد المسح"
-#: ../src/view/home/HomeBox.py:82
+#: ../src/view/home/HomeBox.py:81
#, python-format
msgid "Confirm erase: Do you want to permanently erase %s?"
msgstr "أكّد المسح: أتريد مسح %s نهائيا؟"
-#: ../src/view/home/HomeBox.py:89 ../src/view/palettes.py:120
+#: ../src/view/home/HomeBox.py:88 ../src/view/palettes.py:120
msgid "Erase"
msgstr "امسح"
-#: ../src/view/home/HomeBox.py:215
+#: ../src/view/home/HomeBox.py:118
+msgid "Software Update"
+msgstr "تحديث البرمجيات"
+
+#: ../src/view/home/HomeBox.py:119
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr "حدّث نشاطاتك لتضمن التوافقية مع البرمجيات الجديدة"
+
+#: ../src/view/home/HomeBox.py:123 ../src/controlpanel/toolbar.py:115
+msgid "Cancel"
+msgstr "ألغِ"
+
+#: ../src/view/home/HomeBox.py:125 ../src/controlpanel/gui.py:286
+msgid "Later"
+msgstr "لاحقا"
+
+#: ../src/view/home/HomeBox.py:128
+msgid "Check now"
+msgstr "التمس الآن"
+
+#: ../src/view/home/HomeBox.py:262
msgid "List view"
msgstr "منظور القائمة"
-#: ../src/view/home/HomeBox.py:216
+#: ../src/view/home/HomeBox.py:263
msgid "<Ctrl>2"
msgstr "<Ctrl>2"
-#: ../src/view/home/HomeBox.py:273
+#: ../src/view/home/HomeBox.py:321
msgid "Favorites view"
msgstr "المنظور المفضل"
-#: ../src/view/home/HomeBox.py:274
+#: ../src/view/home/HomeBox.py:322
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
-# TRANS: label for the freeform layout in the favorites view
-#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/HomeBox.py:282
-msgid "Freeform"
-msgstr "حُر"
-
-# TRANS: label for the ring layout in the favorites view
-#. TRANS: label for the ring layout in the favorites view
-#: ../src/view/home/HomeBox.py:289
-msgid "Ring"
-msgstr "حلقة"
-
#: ../src/view/home/MeshBox.py:97
msgid "Connect"
msgstr "اتصل"
@@ -164,9 +184,10 @@ msgstr "يجري الاتصال..."
msgid "Connected"
msgstr "مُتّصل"
-#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:41
-#: ../src/view/devices/network/mesh.py:68
-#: ../src/view/devices/network/mesh.py:72
+#. only temporarily
+#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:51
+#: ../src/view/devices/network/mesh.py:92
+#: ../src/view/devices/network/mesh.py:96
msgid "Mesh Network"
msgstr "شبكة عُروِيّة"
@@ -174,8 +195,8 @@ msgstr "شبكة عُروِيّة"
# 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
-#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:119
-#: ../src/view/devices/network/mesh.py:89
+#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:160
+#: ../src/view/devices/network/mesh.py:125
msgid "Disconnect..."
msgstr "افصِل..."
@@ -220,27 +241,32 @@ msgstr "افتح"
msgid "Mute"
msgstr "أصمِت"
-#: ../src/view/devices/network/wireless.py:67
+#: ../src/view/devices/network/wireless.py:37
+#, python-format
+msgid "IP address: %s"
+msgstr "عنوان الإنترنت: %s"
+
+#: ../src/view/devices/network/wireless.py:86
msgid "Disconnected"
msgstr "مفصول"
-#: ../src/view/devices/network/wireless.py:137
+#: ../src/view/devices/network/wireless.py:178
msgid "Channel"
msgstr "قناة"
-#: ../src/view/frame/zoomtoolbar.py:34
+#: ../src/view/frame/zoomtoolbar.py:37
msgid "Neighborhood"
msgstr "الجِوَار"
-#: ../src/view/frame/zoomtoolbar.py:36
+#: ../src/view/frame/zoomtoolbar.py:39
msgid "Group"
msgstr "المجموعة"
-#: ../src/view/frame/zoomtoolbar.py:38
+#: ../src/view/frame/zoomtoolbar.py:41
msgid "Home"
msgstr "المنزل"
-#: ../src/view/frame/zoomtoolbar.py:40
+#: ../src/view/frame/zoomtoolbar.py:43
msgid "Activity"
msgstr "النشاط"
@@ -271,38 +297,31 @@ msgid ""
" -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"
+" -c key clear the current value for the key \n"
" "
msgstr ""
-#: ../src/controlpanel/cmd.py:45
+#: ../src/controlpanel/cmd.py:46
msgid "To apply your changes you have to restart sugar.\n"
msgstr "تحتاج لإعادة تشغيل «سُكّر» لتُطبق التغييرات.\n"
-#: ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr "ألغِ"
-
-#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:294
+#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:305
msgid "Ok"
msgstr "حسنا"
-#: ../src/controlpanel/sectionview.py:34 ../src/controlpanel/gui.py:260
+#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:278
msgid "Changes require restart"
msgstr "تتطلب التغييرات إعادة التشغيل"
-#: ../src/controlpanel/gui.py:259
+#: ../src/controlpanel/gui.py:277
msgid "Warning"
msgstr "تحذير"
-#: ../src/controlpanel/gui.py:263
+#: ../src/controlpanel/gui.py:281
msgid "Cancel changes"
msgstr "ألغِ التغييرات"
-#: ../src/controlpanel/gui.py:267
-msgid "Later"
-msgstr "لاحقا"
-
-#: ../src/controlpanel/gui.py:271
+#: ../src/controlpanel/gui.py:290
msgid "Restart now"
msgstr "أعِد التشغيل الآن"
@@ -342,7 +361,7 @@ msgstr "خطأ في الألوان المحددة."
msgid "Not available"
msgstr "غير مُتاح"
-#: ../src/controlpanel/model/datetime.py:85
+#: ../src/controlpanel/model/datetime.py:89
msgid "Error timezone does not exist."
msgstr "خطأ: المنطقة الزمنية لا وجود لها."
@@ -354,25 +373,21 @@ msgstr "يجب أن تكون القيمة عددا صحيحا."
msgid "Could not access ~/.i18n. Create standard settings."
msgstr "تعذّر الوصول إلى ‭~/.i18n‬. سأنشئ إعدادات قياسية."
-#: ../src/controlpanel/model/language.py:104
+#: ../src/controlpanel/model/language.py:114
#, python-format
msgid "Language for code=%s could not be determined."
msgstr "لا يمكن تحديد لغة الرمز=%s."
-#: ../src/controlpanel/model/language.py:121
+#: ../src/controlpanel/model/language.py:131
#, python-format
msgid "Sorry I do not speak '%s'."
msgstr "آسف، لا أتحدث '%s'."
-#: ../src/controlpanel/model/network.py:48
-msgid "You must enter a server."
-msgstr "يجب أن تُدخِل خادوما."
-
-#: ../src/controlpanel/model/network.py:63
+#: ../src/controlpanel/model/network.py:62
msgid "State is unknown."
msgstr "الحالة مجهولة."
-#: ../src/controlpanel/model/network.py:83
+#: ../src/controlpanel/model/network.py:82
msgid "Error in specified radio argument use on/off."
msgstr "خطأ في معامل الإذاعة المحدد، استخدم مُفعّل/مُعطّل."
@@ -392,30 +407,58 @@ msgstr "عنّي"
msgid "Click to change your color:"
msgstr "انقر لتغيير اللون:"
-#: ../src/controlpanel/view/aboutxo.py:26
+#: ../src/controlpanel/view/aboutxo.py:28
msgid "About my XO"
msgstr "عن حاسوبي"
-#: ../src/controlpanel/view/aboutxo.py:47
+#: ../src/controlpanel/view/aboutxo.py:59
msgid "Identity"
msgstr "المعرّف"
-#: ../src/controlpanel/view/aboutxo.py:56
+#: ../src/controlpanel/view/aboutxo.py:68
msgid "Serial Number:"
msgstr "الرقم التسلسلي"
-#: ../src/controlpanel/view/aboutxo.py:79
+#: ../src/controlpanel/view/aboutxo.py:91
msgid "Software"
msgstr "البرمجيات"
-#: ../src/controlpanel/view/aboutxo.py:88
+#: ../src/controlpanel/view/aboutxo.py:100
msgid "Build:"
msgstr "البناء:"
-#: ../src/controlpanel/view/aboutxo.py:103
+#: ../src/controlpanel/view/aboutxo.py:115
+msgid "Sugar:"
+msgstr "سُكّر:"
+
+#: ../src/controlpanel/view/aboutxo.py:130
msgid "Firmware:"
msgstr "البرمجيات الثابتة (Firmware):"
+#: ../src/controlpanel/view/aboutxo.py:152
+msgid "Copyright and License"
+msgstr "حقوق النشر والترخيص"
+
+#: ../src/controlpanel/view/aboutxo.py:160
+msgid ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
+msgstr "حقوق النشر محفوظة 2008 لجمعية حاسوب محمول لكل طفل؛ ردهات؛ والمساهمين."
+
+#: ../src/controlpanel/view/aboutxo.py:167
+msgid ""
+"Sugar is the graphical user interface that you are looking at. Sugar is free "
+"software, covered by the GNU General Public License, and you are welcome to "
+"change it and/or distribute copies of it under certain conditions described "
+"therein."
+msgstr ""
+"سُكّر هي واجهة المستخدم الرسومية التي تنظر لها الآن. سُكّر برمجية حرّة تخضع "
+"لرخصة جنو للتأميم عامّة الأغراض، ويمكنك تعديلها و/أو توزيع نسخ منها وفق شروط "
+"معينة مذكورة هنا."
+
+#: ../src/controlpanel/view/aboutxo.py:179
+msgid "Full license:"
+msgstr "الترخيص كاملا:"
+
#: ../src/controlpanel/view/datetime.py:29
msgid "Date & Time"
msgstr "التاريخ والوقت"
@@ -462,19 +505,31 @@ msgstr "اللغة"
msgid "Network"
msgstr "الشبكة"
-#: ../src/controlpanel/view/network.py:53
+#: ../src/controlpanel/view/network.py:54
msgid "Wireless"
msgstr "اللاسلكي"
-#: ../src/controlpanel/view/network.py:61
-msgid "Radio:"
-msgstr "الإذاعة:"
+#: ../src/controlpanel/view/network.py:62
+msgid "Turn of the wireless radio to save battery life"
+msgstr "أغلق الإذاعة اللاسلكية لإطالة عمر البطارية"
+
+#: ../src/controlpanel/view/network.py:75
+msgid "Radio"
+msgstr "الإذاعة"
+
+#: ../src/controlpanel/view/network.py:91
+msgid "Discard network history if you have trouble connecting to the network"
+msgstr "تجاهل تأريخ الشبكة إذا كانت لديك مشاكل في الاتصال بالشبكة"
+
+#: ../src/controlpanel/view/network.py:100
+msgid "Discard network history"
+msgstr "تجاهل تأريخ الشبكة"
-#: ../src/controlpanel/view/network.py:94
+#: ../src/controlpanel/view/network.py:113
msgid "Mesh"
msgstr "الشبكة العروية"
-#: ../src/controlpanel/view/network.py:103
+#: ../src/controlpanel/view/network.py:122
msgid "Server:"
msgstr "الخادوم"
@@ -495,31 +550,31 @@ msgid ""
"Extreme power management (disables wireless radio, increases battery life)"
msgstr "إدارة قصوى للطاقة (تعطّل اللاسلكي وتطيل عمر البطارية)"
-#: ../src/view/devices/network/mesh.py:111
+#: ../src/view/devices/network/mesh.py:154
msgid "Connected to a School Mesh Portal"
msgstr "اتصل ببوابة شبكة مدرسة"
-#: ../src/view/devices/network/mesh.py:113
+#: ../src/view/devices/network/mesh.py:156
msgid "Looking for a School Mesh Portal..."
msgstr "يبحث عن بوابة شبكة مدرسة..."
-#: ../src/view/devices/network/mesh.py:116
+#: ../src/view/devices/network/mesh.py:159
msgid "Connected to an XO Mesh Portal"
msgstr "اتصل ببوابة شبكة XO"
-#: ../src/view/devices/network/mesh.py:118
+#: ../src/view/devices/network/mesh.py:161
msgid "Looking for an XO Mesh Portal..."
msgstr "يبحث عن بوابة شبكة XO..."
-#: ../src/view/devices/network/mesh.py:121
+#: ../src/view/devices/network/mesh.py:164
msgid "Connected to a Simple Mesh"
msgstr "اتصل بشبكة بسيطة"
-#: ../src/view/devices/network/mesh.py:123
+#: ../src/view/devices/network/mesh.py:166
msgid "Starting a Simple Mesh"
msgstr "يبدأ شبكة بسيطة"
-#: ../src/view/devices/network/mesh.py:130
+#: ../src/view/devices/network/mesh.py:173
msgid "Unknown Mesh"
msgstr "شبكة مجهولة"
@@ -527,36 +582,36 @@ msgstr "شبكة مجهولة"
msgid "Decline"
msgstr "ارفض"
-#: ../src/view/home/favoritesview.py:285
+#: ../src/view/home/favoritesview.py:296
msgid "Registration Failed"
msgstr "فشل التسجيل"
-#: ../src/view/home/favoritesview.py:286
+#: ../src/view/home/favoritesview.py:297
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/view/home/favoritesview.py:288
+#: ../src/view/home/favoritesview.py:299
msgid "Registration Successful"
msgstr "نجح التسجيل"
-#: ../src/view/home/favoritesview.py:289
+#: ../src/view/home/favoritesview.py:300
msgid "You are now registered with your school server."
msgstr "الآن، أنت مسجّل في خادوم مدرستك."
-#: ../src/view/home/favoritesview.py:405
+#: ../src/view/home/favoritesview.py:420
msgid "Control Panel"
msgstr "لوحة التحكم"
-#: ../src/view/home/favoritesview.py:416
+#: ../src/view/home/favoritesview.py:425
msgid "Restart"
msgstr "أعد التشغيل"
-#: ../src/view/home/favoritesview.py:421
+#: ../src/view/home/favoritesview.py:430
msgid "Shutdown"
msgstr "أطفئ"
-#: ../src/view/home/favoritesview.py:427
+#: ../src/view/home/favoritesview.py:436
msgid "Register"
msgstr "سجّل"
@@ -572,23 +627,34 @@ msgstr "قف"
msgid "Start"
msgstr "ابدأ"
-#: ../src/view/palettes.py:132
+#: ../src/view/palettes.py:138
msgid "Remove favorite"
msgstr "احذف المفضلة"
-#: ../src/view/palettes.py:136
+#: ../src/view/palettes.py:142
msgid "Make favorite"
msgstr "اصنع مفضلة"
-#: ../src/view/palettes.py:185
+#: ../src/view/palettes.py:191
msgid "Show contents"
msgstr "أظهر المحتويات"
-#: ../src/view/palettes.py:209
+#: ../src/view/palettes.py:215
#, python-format
msgid "%(free_space)d MB Free"
msgstr "%(free_space)d م.بايت خالية"
+# TRANS: label for the freeform layout in the favorites view
+#~ msgid "Freeform"
+#~ msgstr "حُر"
+
+# TRANS: label for the ring layout in the favorites view
+#~ msgid "Ring"
+#~ msgstr "حلقة"
+
+#~ msgid "You must enter a server."
+#~ msgstr "يجب أن تُدخِل خادوما."
+
#~ msgid "<Ctrl>R"
#~ msgstr "<Ctrl>ح"
diff --git a/po/de.po b/po/de.po
index 724e3f5..a32998e 100644
--- a/po/de.po
+++ b/po/de.po
@@ -4,8 +4,8 @@ msgid ""
msgstr ""
"Project-Id-Version: sugar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-07-23 07:44-0400\n"
-"PO-Revision-Date: 2008-08-05 17:45-0400\n"
+"POT-Creation-Date: 2008-09-01 18:31-0400\n"
+"PO-Revision-Date: 2008-09-07 17:38-0400\n"
"Last-Translator: Markus Schlager <m.slg@gmx.de>\n"
"Language-Team: German <fedora-trans-de@redhat.com>\n"
"MIME-Version: 1.0\n"
@@ -18,19 +18,19 @@ msgstr ""
msgid "Name:"
msgstr "Name:"
-#: ../src/intro/intro.py:94
+#: ../src/intro/intro.py:97
msgid "Click to change color:"
msgstr "Klicken zum Wechseln der Farbe:"
-#: ../src/intro/intro.py:145
+#: ../src/intro/intro.py:148
msgid "Back"
msgstr "Zurück"
-#: ../src/intro/intro.py:159 ../src/controlpanel/toolbar.py:61
+#: ../src/intro/intro.py:162 ../src/controlpanel/toolbar.py:61
msgid "Done"
msgstr "Fertig"
-#: ../src/intro/intro.py:162
+#: ../src/intro/intro.py:165
msgid "Next"
msgstr "Nächste"
@@ -42,7 +42,7 @@ msgstr "Freund entfernen"
msgid "Make friend"
msgstr "Freunde werden"
-#: ../src/view/BuddyMenu.py:91
+#: ../src/view/BuddyMenu.py:90
#, python-format
msgid "Invite to %s"
msgstr "Einladen zu %s"
@@ -63,7 +63,7 @@ msgstr "Öffnen"
#. TODO: Implement stopping downloads
#. self._stop_item.connect('activate', self._stop_item_activate_cb)
#. self.append_menu_item(self._stop_item)
-#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:86
+#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:87
msgid "Keep"
msgstr "Behalten"
@@ -88,48 +88,82 @@ msgstr "Authentifizierungstyp:"
msgid "Encryption Type:"
msgstr "Verschlüsselungstyp:"
-#: ../src/view/Shell.py:240
+#: ../src/hardware/schoolserver.py:17
+msgid "Cannot obtain data needed for registration."
+msgstr "Notwendige Daten für die Registrierung sind nicht verfügbar."
+
+#: ../src/hardware/schoolserver.py:31
+msgid "Cannot connect to the server."
+msgstr "Kann nicht mit dem Server verbinden."
+
+#: ../src/hardware/schoolserver.py:36
+msgid "The server could not complete the request."
+msgstr "Der Server konnte die Anforderung nicht erfüllen."
+
+#: ../src/view/Shell.py:262
msgid "Screenshot"
msgstr "Bildschirmfoto"
-#: ../src/view/home/HomeBox.py:80
+#: ../src/view/home/HomeBox.py:81
msgid "Confirm erase"
msgstr "Löschen bestätigen"
-#: ../src/view/home/HomeBox.py:82
+#: ../src/view/home/HomeBox.py:83
#, python-format
msgid "Confirm erase: Do you want to permanently erase %s?"
msgstr "Löschen bestätigen: Willst du %s wirklich dauerhaft löschen?"
-#: ../src/view/home/HomeBox.py:89 ../src/view/palettes.py:120
+#: ../src/view/home/HomeBox.py:90 ../src/view/palettes.py:120
msgid "Erase"
msgstr "Löschen"
-#: ../src/view/home/HomeBox.py:215
+#: ../src/view/home/HomeBox.py:120
+msgid "Software Update"
+msgstr "Software-Aktualisierung"
+
+#: ../src/view/home/HomeBox.py:121
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr ""
+"Aktualisiere deine Aktivitäten, um die Kompatibilität mit deiner neuen "
+"Software sicher zu stellen."
+
+#: ../src/view/home/HomeBox.py:125 ../src/controlpanel/toolbar.py:115
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: ../src/view/home/HomeBox.py:127 ../src/controlpanel/gui.py:276
+msgid "Later"
+msgstr "Später"
+
+#: ../src/view/home/HomeBox.py:130
+msgid "Check now"
+msgstr "Jetzt prüfen"
+
+#: ../src/view/home/HomeBox.py:266
msgid "List view"
msgstr "Listenansicht"
-#: ../src/view/home/HomeBox.py:216
+#: ../src/view/home/HomeBox.py:267
msgid "<Ctrl>2"
msgstr "<Ctrl>2"
-#: ../src/view/home/HomeBox.py:273
+#: ../src/view/home/HomeBox.py:325
msgid "Favorites view"
msgstr "Favoritenansicht"
-#: ../src/view/home/HomeBox.py:274
+#: ../src/view/home/HomeBox.py:326
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/HomeBox.py:282
+#: ../src/view/home/HomeBox.py:334
msgid "Freeform"
msgstr "Freie Form"
# TRANS: label for the ring layout in the favorites view
#. TRANS: label for the ring layout in the favorites view
-#: ../src/view/home/HomeBox.py:289
+#: ../src/view/home/HomeBox.py:341
msgid "Ring"
msgstr "Ring"
@@ -164,9 +198,10 @@ msgstr "Verbinde..."
msgid "Connected"
msgstr "Verbunden"
-#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:41
-#: ../src/view/devices/network/mesh.py:68
-#: ../src/view/devices/network/mesh.py:72
+#. only temporarily
+#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:51
+#: ../src/view/devices/network/mesh.py:92
+#: ../src/view/devices/network/mesh.py:96
msgid "Mesh Network"
msgstr "Maschennetzwerk"
@@ -174,8 +209,8 @@ msgstr "Maschennetzwerk"
# 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
-#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:119
-#: ../src/view/devices/network/mesh.py:89
+#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:160
+#: ../src/view/devices/network/mesh.py:125
msgid "Disconnect..."
msgstr "Verbindung trennen..."
@@ -220,27 +255,32 @@ msgstr "Laut schalten"
msgid "Mute"
msgstr "Stumm schalten"
-#: ../src/view/devices/network/wireless.py:67
+#: ../src/view/devices/network/wireless.py:37
+#, python-format
+msgid "IP address: %s"
+msgstr "IP-Addresse: %s"
+
+#: ../src/view/devices/network/wireless.py:86
msgid "Disconnected"
msgstr "Nicht verbunden"
-#: ../src/view/devices/network/wireless.py:137
+#: ../src/view/devices/network/wireless.py:178
msgid "Channel"
msgstr "Kanal"
-#: ../src/view/frame/zoomtoolbar.py:34
+#: ../src/view/frame/zoomtoolbar.py:37
msgid "Neighborhood"
msgstr "Umgebung"
-#: ../src/view/frame/zoomtoolbar.py:36
+#: ../src/view/frame/zoomtoolbar.py:39
msgid "Group"
msgstr "Gruppe"
-#: ../src/view/frame/zoomtoolbar.py:38
+#: ../src/view/frame/zoomtoolbar.py:41
msgid "Home"
msgstr "Zuhause"
-#: ../src/view/frame/zoomtoolbar.py:40
+#: ../src/view/frame/zoomtoolbar.py:43
msgid "Activity"
msgstr "Aktivität"
@@ -263,6 +303,7 @@ msgstr "sugar-control-panel: key=%s ist keine verfügbare Option"
msgid "sugar-control-panel: %s"
msgstr "sugar-control-panel: %s"
+# (Markus S.) war 'Benutzung: sugar-control-panel [ option ] key [ args ... ] \n'; 'Parameter' war 'Key'.
#: ../src/controlpanel/cmd.py:33
msgid ""
"Usage: sugar-control-panel [ option ] key [ args ... ] \n"
@@ -273,47 +314,41 @@ msgid ""
" -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"
+" -c key clear the current value for the key \n"
" "
msgstr ""
-"Benutzung: sugar-control-panel [ option ] key [ args ... ] \n"
+"Benutzung: sugar-control-panel [ Option ] Parameter [ Argumente ... ] \n"
" Einstellungen für Sugar. \n"
" Optionen: \n"
-" -h Diese Hilfe anzeigen und beenden\n"
-" -l Alle verfügbaren Optionen auflisten\n"
-" -h key Informationen zu diesem Key zeigen\n"
-" -g key Den aktuellen Wert für diesen Key auslesen\n"
-" -s key Den aktuellen Wert für diesen Key festlegen\n"
+" -h Diese Hilfe anzeigen und beenden\n"
+" -l Alle verfügbaren Optionen auflisten\n"
+" -h Parameter Informationen zu diesem Parameter zeigen\n"
+" -g Parameter Den aktuellen Wert für diesen Parameter auslesen\n"
+" -s Parameter Den aktuellen Wert für diesen Parameter festlegen\n"
+" -c Parameter Den aktuellen Wert für diesen Parameter zurücksetzen\n"
" "
-#: ../src/controlpanel/cmd.py:45
+#: ../src/controlpanel/cmd.py:46
msgid "To apply your changes you have to restart sugar.\n"
msgstr "Um die Änderungen zu übernehmen, muss Sugar neu gestartet werden.\n"
-#: ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr "Abbrechen"
-
-#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:294
+#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:296
msgid "Ok"
msgstr "Ok"
-#: ../src/controlpanel/sectionview.py:34 ../src/controlpanel/gui.py:260
+#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:268
msgid "Changes require restart"
msgstr "Neustart zur Übernahme der Änderungen notwendig"
-#: ../src/controlpanel/gui.py:259
+#: ../src/controlpanel/gui.py:267
msgid "Warning"
msgstr "Warnung"
-#: ../src/controlpanel/gui.py:263
+#: ../src/controlpanel/gui.py:271
msgid "Cancel changes"
msgstr "Änderungen aufheben"
-#: ../src/controlpanel/gui.py:267
-msgid "Later"
-msgstr "Später"
-
-#: ../src/controlpanel/gui.py:271
+#: ../src/controlpanel/gui.py:280
msgid "Restart now"
msgstr "Jetzt neustarten"
@@ -365,12 +400,12 @@ msgstr "Der Wert muss ganzzahlig sein."
msgid "Could not access ~/.i18n. Create standard settings."
msgstr "Zugriff auf %s nicht möglich. Erzeuge daher Standardeinstellungen."
-#: ../src/controlpanel/model/language.py:104
+#: ../src/controlpanel/model/language.py:110
#, python-format
msgid "Language for code=%s could not be determined."
msgstr "Sprache für Code=%s konnte nicht ermittelt werden."
-#: ../src/controlpanel/model/language.py:121
+#: ../src/controlpanel/model/language.py:127
#, python-format
msgid "Sorry I do not speak '%s'."
msgstr "Entschuldigung, ich spreche nicht '%s'."
@@ -385,7 +420,6 @@ msgstr "Status ist nicht bekannt."
# (Markus S.) vgl. http://lists.laptop.org/pipermail/localization/2008-July/001232.html
#: ../src/controlpanel/model/network.py:83
-#, fuzzy
msgid "Error in specified radio argument use on/off."
msgstr "Fehler im angegebenen radio-Parameter (Funknetz) -- on/off verwenden."
@@ -408,30 +442,60 @@ msgstr "Über mich"
msgid "Click to change your color:"
msgstr "Klicken, um deine Farbe zu wechseln:"
-#: ../src/controlpanel/view/aboutxo.py:26
+#: ../src/controlpanel/view/aboutxo.py:28
msgid "About my XO"
msgstr "Über meinen XO"
-#: ../src/controlpanel/view/aboutxo.py:47
+#: ../src/controlpanel/view/aboutxo.py:59
msgid "Identity"
msgstr "Identität"
-#: ../src/controlpanel/view/aboutxo.py:56
+#: ../src/controlpanel/view/aboutxo.py:68
msgid "Serial Number:"
msgstr "Seriennummer:"
-#: ../src/controlpanel/view/aboutxo.py:79
+#: ../src/controlpanel/view/aboutxo.py:91
msgid "Software"
msgstr "Software"
-#: ../src/controlpanel/view/aboutxo.py:88
+#: ../src/controlpanel/view/aboutxo.py:100
msgid "Build:"
msgstr "Version:"
-#: ../src/controlpanel/view/aboutxo.py:103
+#: ../src/controlpanel/view/aboutxo.py:115
+msgid "Sugar:"
+msgstr "Sugar:"
+
+#: ../src/controlpanel/view/aboutxo.py:130
msgid "Firmware:"
msgstr "Firmware:"
+#: ../src/controlpanel/view/aboutxo.py:152
+msgid "Copyright and License"
+msgstr "Copyright und Lizenz"
+
+#: ../src/controlpanel/view/aboutxo.py:160
+msgid ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
+msgstr ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
+
+#: ../src/controlpanel/view/aboutxo.py:166
+msgid ""
+"Sugar is the graphical user interface that you are looking at. Sugar is free "
+"software, covered by the GNU General Public License, and you are welcome to "
+"change it and/or distribute copies of it under certain conditions described "
+"therein."
+msgstr ""
+"Sugar ist die grafische Benutzeroberfläche, die du vor die siehst. Sugar ist "
+"freie Software und unterliegt der GNU General Public License. Im Rahmen der "
+"darin festgelegten Bedingungen ist es erlaubt, die Software zu verändern "
+"und/oder Kopien davon zu erstellen und zu verteilen."
+
+#: ../src/controlpanel/view/aboutxo.py:178
+msgid "Full license:"
+msgstr "Vollständige Lizenz:"
+
#: ../src/controlpanel/view/datetime.py:29
msgid "Date & Time"
msgstr "Datum & Uhrzeit"
@@ -486,7 +550,6 @@ msgstr "Drahtlosnetzwerk"
# (Markus S,) war 'Radio:'
#: ../src/controlpanel/view/network.py:61
-#, fuzzy
msgid "Radio:"
msgstr "Funknetz:"
@@ -518,31 +581,31 @@ msgstr ""
"Extreme Energieverwaltung (deaktiviert das Funknetz, erhöht die Lebensdauer "
"der Batterie)"
-#: ../src/view/devices/network/mesh.py:111
+#: ../src/view/devices/network/mesh.py:154
msgid "Connected to a School Mesh Portal"
msgstr "Verbunden mit einem Schul-Maschennetzwerk-Portal"
-#: ../src/view/devices/network/mesh.py:113
+#: ../src/view/devices/network/mesh.py:156
msgid "Looking for a School Mesh Portal..."
msgstr "Suche Schul-Maschennetzwerk-Portal..."
-#: ../src/view/devices/network/mesh.py:116
+#: ../src/view/devices/network/mesh.py:159
msgid "Connected to an XO Mesh Portal"
msgstr "Verbunden mit einem XO Maschennetzwerk-Portal"
-#: ../src/view/devices/network/mesh.py:118
+#: ../src/view/devices/network/mesh.py:161
msgid "Looking for an XO Mesh Portal..."
msgstr "Suche XO Maschennetzwerk-Portal..."
-#: ../src/view/devices/network/mesh.py:121
+#: ../src/view/devices/network/mesh.py:164
msgid "Connected to a Simple Mesh"
msgstr "Verbunden mit einem einfachen Maschennetzwerk"
-#: ../src/view/devices/network/mesh.py:123
+#: ../src/view/devices/network/mesh.py:166
msgid "Starting a Simple Mesh"
msgstr "Starte ein einfaches Maschennetzwerk"
-#: ../src/view/devices/network/mesh.py:130
+#: ../src/view/devices/network/mesh.py:173
msgid "Unknown Mesh"
msgstr "Unbekanntes Maschennetzwerk"
@@ -550,37 +613,37 @@ msgstr "Unbekanntes Maschennetzwerk"
msgid "Decline"
msgstr "Ablehnen"
-#: ../src/view/home/favoritesview.py:285
+#: ../src/view/home/favoritesview.py:287
msgid "Registration Failed"
msgstr "Registrierung fehlgeschlagen"
-#: ../src/view/home/favoritesview.py:286
+#: ../src/view/home/favoritesview.py:288
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/view/home/favoritesview.py:288
+#: ../src/view/home/favoritesview.py:290
msgid "Registration Successful"
msgstr "Registrierung erfolgreich"
-#: ../src/view/home/favoritesview.py:289
+#: ../src/view/home/favoritesview.py:291
msgid "You are now registered with your school server."
msgstr "Du bist nun bei deinem Schulserver registriert."
# (Markus S.) war 'Kontrollfeld'
-#: ../src/view/home/favoritesview.py:405
+#: ../src/view/home/favoritesview.py:407
msgid "Control Panel"
msgstr "Kontrollleiste"
-#: ../src/view/home/favoritesview.py:416
+#: ../src/view/home/favoritesview.py:418
msgid "Restart"
msgstr "Neustart"
-#: ../src/view/home/favoritesview.py:421
+#: ../src/view/home/favoritesview.py:423
msgid "Shutdown"
msgstr "Ausschalten"
-#: ../src/view/home/favoritesview.py:427
+#: ../src/view/home/favoritesview.py:429
msgid "Register"
msgstr "Registrieren"
diff --git a/po/en.po b/po/en.po
index a79e711..0b17faf 100644
--- a/po/en.po
+++ b/po/en.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-01-18 18:19+0000\n"
+"POT-Creation-Date: 2008-09-19 00:30-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,44 +16,44 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Translate Toolkit 1.0.1\n"
-#: ../shell/intro/intro.py:67
+#: ../src/intro/intro.py:65 ../src/controlpanel/view/aboutme.py:100
msgid "Name:"
msgstr ""
-#: ../shell/intro/intro.py:96
+#: ../src/intro/intro.py:97
msgid "Click to change color:"
msgstr ""
-#: ../shell/intro/intro.py:146
+#: ../src/intro/intro.py:148
msgid "Back"
msgstr ""
-#: ../shell/intro/intro.py:160
+#: ../src/intro/intro.py:162 ../src/controlpanel/toolbar.py:61
msgid "Done"
msgstr ""
-#: ../shell/intro/intro.py:163
+#: ../src/intro/intro.py:165
msgid "Next"
msgstr ""
-#: ../shell/view/BuddyMenu.py:59
+#: ../src/view/BuddyMenu.py:60
msgid "Remove friend"
msgstr ""
-#: ../shell/view/BuddyMenu.py:62
+#: ../src/view/BuddyMenu.py:63
msgid "Make friend"
msgstr ""
-#: ../shell/view/BuddyMenu.py:84
+#: ../src/view/BuddyMenu.py:92
#, python-format
msgid "Invite to %s"
msgstr ""
-#: ../shell/view/clipboardmenu.py:58
+#: ../src/view/clipboardmenu.py:48
msgid "Remove"
msgstr ""
-#: ../shell/view/clipboardmenu.py:63
+#: ../src/view/clipboardmenu.py:53 ../src/view/clipboardmenu.py:79
msgid "Open"
msgstr ""
@@ -61,360 +61,566 @@ msgstr ""
#. 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"
+#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:85
+msgid "Keep"
+msgstr ""
+
+#: ../src/view/clipboardmenu.py:84
+msgid "Open with"
msgstr ""
-#: ../shell/view/clipboardmenu.py:213
+#: ../src/view/clipboardmenu.py:216
#, python-format
msgid "Clipboard object: %s."
msgstr ""
-#: ../shell/hardware/keydialog.py:149
+#: ../src/hardware/keydialog.py:150
msgid "Key Type:"
msgstr ""
-#: ../shell/hardware/keydialog.py:169
+#: ../src/hardware/keydialog.py:170
msgid "Authentication Type:"
msgstr ""
-#: ../shell/hardware/keydialog.py:250
+#: ../src/hardware/keydialog.py:251
msgid "Encryption Type:"
msgstr ""
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
+#: ../src/hardware/schoolserver.py:17
+msgid "Cannot obtain data needed for registration."
msgstr ""
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
+#: ../src/hardware/schoolserver.py:31
+msgid "Cannot connect to the server."
msgstr ""
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
+#: ../src/hardware/schoolserver.py:36
+msgid "The server could not complete the request."
msgstr ""
-#: ../shell/view/Shell.py:285
+#: ../src/view/Shell.py:251
msgid "Screenshot"
msgstr ""
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
+#: ../src/view/home/HomeBox.py:79
+msgid "Confirm erase"
msgstr ""
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
+#: ../src/view/home/HomeBox.py:81
+#, python-format
+msgid "Confirm erase: Do you want to permanently erase %s?"
msgstr ""
-#: ../shell/view/home/HomeBox.py:170
-msgid "Register"
+#: ../src/view/home/HomeBox.py:88 ../src/view/palettes.py:120
+msgid "Erase"
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..."
+#: ../src/view/home/HomeBox.py:118
+msgid "Software Update"
+msgstr ""
+
+#: ../src/view/home/HomeBox.py:119
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr ""
+
+#: ../src/view/home/HomeBox.py:123 ../src/controlpanel/toolbar.py:115
+msgid "Cancel"
+msgstr ""
+
+#: ../src/view/home/HomeBox.py:125 ../src/controlpanel/gui.py:286
+msgid "Later"
+msgstr ""
+
+#: ../src/view/home/HomeBox.py:128
+msgid "Check now"
+msgstr ""
+
+#: ../src/view/home/HomeBox.py:262
+msgid "List view"
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
+#: ../src/view/home/HomeBox.py:263
+msgid "<Ctrl>2"
+msgstr ""
+
+#: ../src/view/home/HomeBox.py:321
+msgid "Favorites view"
+msgstr ""
+
+#: ../src/view/home/HomeBox.py:322
+msgid "<Ctrl>1"
+msgstr ""
+
+#: ../src/view/home/MeshBox.py:97
+msgid "Connect"
+msgstr ""
+
+#: ../src/view/home/MeshBox.py:106
+msgid "Disconnect"
+msgstr ""
+
+#: ../src/view/home/MeshBox.py:118
+msgid "Disconnecting..."
+msgstr ""
+
+#: ../src/view/home/MeshBox.py:152
+msgid "Connecting..."
+msgstr ""
+
+#. TODO: show the channel number
+#: ../src/view/home/MeshBox.py:159
+msgid "Connected"
+msgstr ""
+
+#. only temporarily
+#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:51
+#: ../src/view/devices/network/mesh.py:92
+#: ../src/view/devices/network/mesh.py:96
msgid "Mesh Network"
msgstr ""
-#: ../shell/view/home/MeshBox.py:300
+#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:160
+#: ../src/view/devices/network/mesh.py:125
+msgid "Disconnect..."
+msgstr ""
+
+#: ../src/view/home/MeshBox.py:302 ../src/view/palettes.py:61
+msgid "Resume"
+msgstr ""
+
+#: ../src/view/home/MeshBox.py:307 ../src/view/frame/activitiestray.py:205
msgid "Join"
msgstr ""
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
+#: ../src/view/devices/battery.py:45
+msgid "My Battery"
+msgstr ""
+
+#: ../src/view/devices/battery.py:114
+msgid "Charging"
+msgstr ""
+
+#: ../src/view/devices/battery.py:117
+msgid "Very little power remaining"
+msgstr ""
+
+#: ../src/view/devices/battery.py:123
+#, python-format
+msgid "%(hour)d:%(min).2d remaining"
+msgstr ""
+
+#: ../src/view/devices/battery.py:127
+msgid "Charged"
msgstr ""
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
+#: ../src/view/devices/speaker.py:44
+msgid "My Speakers"
msgstr ""
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
+#: ../src/view/devices/speaker.py:119
+msgid "Unmute"
msgstr ""
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
+#: ../src/view/devices/speaker.py:122
+msgid "Mute"
msgstr ""
-#: ../shell/view/devices/network/wireless.py:61
+#: ../src/view/devices/network/wireless.py:37
+#, python-format
+msgid "IP address: %s"
+msgstr ""
+
+#: ../src/view/devices/network/wireless.py:86
msgid "Disconnected"
msgstr ""
-#: ../shell/view/devices/network/wireless.py:131
+#: ../src/view/devices/network/wireless.py:178
msgid "Channel"
msgstr ""
-#: ../shell/view/frame/zoomtoolbar.py:42
+#: ../src/view/frame/zoomtoolbar.py:37
msgid "Neighborhood"
msgstr ""
-#: ../shell/view/frame/zoomtoolbar.py:54
+#: ../src/view/frame/zoomtoolbar.py:39
msgid "Group"
msgstr ""
-#: ../shell/view/frame/zoomtoolbar.py:66
+#: ../src/view/frame/zoomtoolbar.py:41
msgid "Home"
msgstr ""
-#: ../shell/view/frame/zoomtoolbar.py:78
+#: ../src/view/frame/zoomtoolbar.py:43
msgid "Activity"
msgstr ""
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
+#: ../src/controlpanel/cmd.py:26
+#, python-format
+msgid ""
+"sugar-control-panel: WARNING, found more than one option with the same name: "
+"%s module: %r"
msgstr ""
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
+#: ../src/controlpanel/cmd.py:28
+#, python-format
+msgid "sugar-control-panel: key=%s not an available option"
msgstr ""
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
+#: ../src/controlpanel/cmd.py:29
+#, python-format
+msgid "sugar-control-panel: %s"
msgstr ""
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
+#: ../src/controlpanel/cmd.py:33
+msgid ""
+"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"
+" -c key clear the current value for the key \n"
+" "
+msgstr ""
+
+#: ../src/controlpanel/cmd.py:46
+msgid "To apply your changes you have to restart sugar.\n"
+msgstr ""
+
+#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:305
+msgid "Ok"
+msgstr ""
+
+#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:278
+msgid "Changes require restart"
msgstr ""
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
+#: ../src/controlpanel/gui.py:277
+msgid "Warning"
msgstr ""
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
+#: ../src/controlpanel/gui.py:281
+msgid "Cancel changes"
msgstr ""
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
+#: ../src/controlpanel/gui.py:290
+msgid "Restart now"
msgstr ""
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
+#: ../src/controlpanel/model/aboutme.py:44
+msgid "You must enter a name."
msgstr ""
-#: ../lib/sugar/activity/activity.py:454
+#: ../src/controlpanel/model/aboutme.py:69
#, python-format
-msgid "%s Activity"
+msgid "stroke: color=%s hue=%s"
msgstr ""
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
+#: ../src/controlpanel/model/aboutme.py:72
+#, python-format
+msgid "stroke: %s"
msgstr ""
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
+#: ../src/controlpanel/model/aboutme.py:74
+#, python-format
+msgid "fill: color=%s hue=%s"
msgstr ""
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
+#: ../src/controlpanel/model/aboutme.py:76
+#, python-format
+msgid "fill: %s"
msgstr ""
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
+#: ../src/controlpanel/model/aboutme.py:87
+msgid "Error in specified color modifiers."
msgstr ""
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
+#: ../src/controlpanel/model/aboutme.py:90
+msgid "Error in specified colors."
msgstr ""
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
+#: ../src/controlpanel/model/aboutxo.py:24
+msgid "Not available"
msgstr ""
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
+#: ../src/controlpanel/model/datetime.py:89
+msgid "Error timezone does not exist."
msgstr ""
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
+#: ../src/controlpanel/model/frame.py:38 ../src/controlpanel/model/frame.py:60
+msgid "Value must be an integer."
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
+#: ../src/controlpanel/model/language.py:28
+msgid "Could not access ~/.i18n. Create standard settings."
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:175
+#: ../src/controlpanel/model/language.py:114
#, python-format
-msgid "%d years"
+msgid "Language for code=%s could not be determined."
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:176
+#: ../src/controlpanel/model/language.py:131
#, python-format
-msgid "%d month"
+msgid "Sorry I do not speak '%s'."
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
+#: ../src/controlpanel/model/network.py:62
+msgid "State is unknown."
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
+#: ../src/controlpanel/model/network.py:82
+msgid "Error in specified radio argument use on/off."
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
+#: ../src/controlpanel/model/power.py:57
+msgid "Error in automatic pm argument, use on/off."
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
+#: ../src/controlpanel/model/power.py:86
+msgid "Error in extreme pm argument, use on/off."
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
+#: ../src/controlpanel/view/aboutme.py:32
+msgid "About Me"
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
+#: ../src/controlpanel/view/aboutme.py:134
+msgid "Click to change your color:"
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
+#: ../src/controlpanel/view/aboutxo.py:28
+msgid "About my XO"
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
+#: ../src/controlpanel/view/aboutxo.py:59
+msgid "Identity"
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
+#: ../src/controlpanel/view/aboutxo.py:68
+msgid "Serial Number:"
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
+#: ../src/controlpanel/view/aboutxo.py:91
+msgid "Software"
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
+#: ../src/controlpanel/view/aboutxo.py:100
+msgid "Build:"
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
+#: ../src/controlpanel/view/aboutxo.py:115
+msgid "Sugar:"
msgstr ""
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
+#: ../src/controlpanel/view/aboutxo.py:130
+msgid "Firmware:"
msgstr ""
-#: ../shell/controlpanel/control.py:213
-msgid "To apply your changes you have to restart sugar.\n"
+#: ../src/controlpanel/view/aboutxo.py:152
+msgid "Copyright and License"
msgstr ""
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
+#: ../src/controlpanel/view/aboutxo.py:160
+msgid ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
msgstr ""
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
+#: ../src/controlpanel/view/aboutxo.py:167
+msgid ""
+"Sugar is the graphical user interface that you are looking at. Sugar is free "
+"software, covered by the GNU General Public License, and you are welcome to "
+"change it and/or distribute copies of it under certain conditions described "
+"therein."
msgstr ""
-#: ../shell/controlpanel/control.py:307
-msgid "off"
+#: ../src/controlpanel/view/aboutxo.py:179
+msgid "Full license:"
msgstr ""
-#: ../shell/controlpanel/control.py:309
-msgid "on"
+#: ../src/controlpanel/view/datetime.py:29
+msgid "Date & Time"
msgstr ""
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
+#: ../src/controlpanel/view/datetime.py:72
+msgid "Timezone"
msgstr ""
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
+#: ../src/controlpanel/view/frame.py:28
+msgid "Frame"
msgstr ""
-#: ../shell/controlpanel/control.py:336
-msgid "Permission denied. You need to be root to run this method."
+#: ../src/controlpanel/view/frame.py:30
+msgid "never"
msgstr ""
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
+#: ../src/controlpanel/view/frame.py:31
+msgid "instantaneous"
msgstr ""
-#: ../shell/controlpanel/control.py:397
+#: ../src/controlpanel/view/frame.py:32
#, python-format
-msgid "Error copying timezone (from %s): %s"
+msgid "%s seconds"
msgstr ""
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
+#: ../src/controlpanel/view/frame.py:56
+msgid "Activation Delay"
msgstr ""
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
+#: ../src/controlpanel/view/frame.py:80
+msgid "Corner"
msgstr ""
-#: ../shell/controlpanel/control.py:417 ../shell/controlpanel/control.py:436
-#, python-format
-msgid "Could not access %s. Create standard settings."
+#: ../src/controlpanel/view/frame.py:115
+msgid "Edge"
msgstr ""
-#: ../shell/controlpanel/control.py:463
-#, python-format
-msgid "Language for code=%s could not be determined."
+#: ../src/controlpanel/view/language.py:29
+#: ../src/controlpanel/view/language.py:74
+msgid "Language"
msgstr ""
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
+#: ../src/controlpanel/view/network.py:28
+msgid "Network"
+msgstr ""
+
+#: ../src/controlpanel/view/network.py:54
+msgid "Wireless"
+msgstr ""
+
+#: ../src/controlpanel/view/network.py:62
+msgid "Turn of the wireless radio to save battery life"
+msgstr "Turn off the wireless radio to save battery life"
+
+#: ../src/controlpanel/view/network.py:75
+msgid "Radio"
+msgstr ""
+
+#: ../src/controlpanel/view/network.py:91
+msgid "Discard network history if you have trouble connecting to the network"
+msgstr ""
+
+#: ../src/controlpanel/view/network.py:100
+msgid "Discard network history"
+msgstr ""
+
+#: ../src/controlpanel/view/network.py:113
+msgid "Mesh"
msgstr ""
-#: ../shell/view/devices/network/mesh.py:105
+#: ../src/controlpanel/view/network.py:122
+msgid "Server:"
+msgstr ""
+
+#: ../src/controlpanel/view/power.py:27
+msgid "Power"
+msgstr ""
+
+#: ../src/controlpanel/view/power.py:51
+msgid "Power management"
+msgstr ""
+
+#: ../src/controlpanel/view/power.py:61
+msgid "Automatic power management (increases battery life)"
+msgstr "Automatic power management (experimental, increases battery life)"
+
+#: ../src/controlpanel/view/power.py:89
+msgid ""
+"Extreme power management (disables wireless radio, increases battery life)"
+msgstr ""
+
+#: ../src/view/devices/network/mesh.py:154
msgid "Connected to a School Mesh Portal"
msgstr ""
-#: ../shell/view/devices/network/mesh.py:107
+#: ../src/view/devices/network/mesh.py:156
msgid "Looking for a School Mesh Portal..."
msgstr ""
-#: ../shell/view/devices/network/mesh.py:110
+#: ../src/view/devices/network/mesh.py:159
msgid "Connected to an XO Mesh Portal"
msgstr ""
-#: ../shell/view/devices/network/mesh.py:112
+#: ../src/view/devices/network/mesh.py:161
msgid "Looking for an XO Mesh Portal..."
msgstr ""
-#: ../shell/view/devices/network/mesh.py:115
+#: ../src/view/devices/network/mesh.py:164
msgid "Connected to a Simple Mesh"
msgstr ""
-#: ../shell/view/devices/network/mesh.py:117
+#: ../src/view/devices/network/mesh.py:166
msgid "Starting a Simple Mesh"
msgstr ""
-#: ../shell/view/devices/network/mesh.py:124
+#: ../src/view/devices/network/mesh.py:173
msgid "Unknown Mesh"
msgstr ""
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
+#: ../src/view/frame/activitiestray.py:210
+msgid "Decline"
msgstr ""
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
+#: ../src/view/home/favoritesview.py:296
+msgid "Registration Failed"
+msgstr ""
+
+#: ../src/view/home/favoritesview.py:297
+#, python-format
+msgid "%s"
+msgstr ""
+
+#: ../src/view/home/favoritesview.py:299
+msgid "Registration Successful"
+msgstr ""
+
+#: ../src/view/home/favoritesview.py:300
+msgid "You are now registered with your school server."
+msgstr ""
+
+#: ../src/view/home/favoritesview.py:420
+msgid "Control Panel"
+msgstr ""
+
+#: ../src/view/home/favoritesview.py:425
+msgid "Restart"
+msgstr ""
+
+#: ../src/view/home/favoritesview.py:430
+msgid "Shutdown"
+msgstr ""
+
+#: ../src/view/home/favoritesview.py:436
+msgid "Register"
+msgstr ""
+
+#: ../src/view/palettes.py:42
+msgid "Starting..."
+msgstr ""
+
+#: ../src/view/palettes.py:72
+msgid "Stop"
+msgstr ""
+
+#: ../src/view/palettes.py:104
+msgid "Start"
+msgstr ""
+
+#: ../src/view/palettes.py:138
+msgid "Remove favorite"
+msgstr ""
+
+#: ../src/view/palettes.py:142
+msgid "Make favorite"
+msgstr ""
+
+#: ../src/view/palettes.py:191
+msgid "Show contents"
+msgstr ""
+
+#: ../src/view/palettes.py:215
+#, python-format
+msgid "%(free_space)d MB Free"
msgstr ""
diff --git a/po/es.po b/po/es.po
index 7ef4a0a..28c7d24 100644
--- a/po/es.po
+++ b/po/es.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: olpc-sugar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-07-23 07:44-0400\n"
-"PO-Revision-Date: 2008-07-24 12:27-0400\n"
+"POT-Creation-Date: 2008-09-01 18:31-0400\n"
+"PO-Revision-Date: 2008-08-28 19:35-0400\n"
"Last-Translator: Rafael Ortiz <rafael@laptop.org>\n"
"Language-Team: Fedora Spanish <fedora-trans-es@redhat.com>\n"
"MIME-Version: 1.0\n"
@@ -22,19 +22,19 @@ msgstr ""
msgid "Name:"
msgstr "Nombre:"
-#: ../src/intro/intro.py:94
+#: ../src/intro/intro.py:97
msgid "Click to change color:"
msgstr "Clic para cambiar de color:"
-#: ../src/intro/intro.py:145
+#: ../src/intro/intro.py:148
msgid "Back"
msgstr "Atrás"
-#: ../src/intro/intro.py:159 ../src/controlpanel/toolbar.py:61
+#: ../src/intro/intro.py:162 ../src/controlpanel/toolbar.py:61
msgid "Done"
msgstr "Hecho"
-#: ../src/intro/intro.py:162
+#: ../src/intro/intro.py:165
msgid "Next"
msgstr "Siguiente"
@@ -46,10 +46,10 @@ msgstr "Eliminar amigo"
msgid "Make friend"
msgstr "Agregar amigo"
-#: ../src/view/BuddyMenu.py:91
+#: ../src/view/BuddyMenu.py:90
#, python-format
msgid "Invite to %s"
-msgstr "invitar a %s"
+msgstr "Invitar a %s"
#: ../src/view/clipboardmenu.py:48
msgid "Remove"
@@ -67,7 +67,7 @@ msgstr "Abrir"
#. TODO: Implement stopping downloads
#. self._stop_item.connect('activate', self._stop_item_activate_cb)
#. self.append_menu_item(self._stop_item)
-#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:86
+#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:87
msgid "Keep"
msgstr "Guardar"
@@ -92,48 +92,80 @@ msgstr "Tipo de Autenticación:"
msgid "Encryption Type:"
msgstr "Tipo de Encriptación:"
-#: ../src/view/Shell.py:240
+#: ../src/hardware/schoolserver.py:17
+msgid "Cannot obtain data needed for registration."
+msgstr "No se pueden obtener los datos necesarios para el registro"
+
+#: ../src/hardware/schoolserver.py:31
+msgid "Cannot connect to the server."
+msgstr "No se puede conectar al servidor"
+
+#: ../src/hardware/schoolserver.py:36
+msgid "The server could not complete the request."
+msgstr "El servidor no pudo completar la petición "
+
+#: ../src/view/Shell.py:262
msgid "Screenshot"
msgstr "Captura de pantalla"
-#: ../src/view/home/HomeBox.py:80
+#: ../src/view/home/HomeBox.py:81
msgid "Confirm erase"
msgstr "Confirmar borrado"
-#: ../src/view/home/HomeBox.py:82
+#: ../src/view/home/HomeBox.py:83
#, python-format
msgid "Confirm erase: Do you want to permanently erase %s?"
-msgstr "Confirmar borrado:Quiere borrar permanentemente%s?"
+msgstr "Confirmar borrado: Quiere borrar permanentemente %s?"
-#: ../src/view/home/HomeBox.py:89 ../src/view/palettes.py:120
+#: ../src/view/home/HomeBox.py:90 ../src/view/palettes.py:120
msgid "Erase"
msgstr "Borrar"
-#: ../src/view/home/HomeBox.py:215
+#: ../src/view/home/HomeBox.py:120
+msgid "Software Update"
+msgstr "Actualización de Software"
+
+#: ../src/view/home/HomeBox.py:121
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr "Actualice sus actividades para asegurar compatibilidad con su nuevo software."
+
+#: ../src/view/home/HomeBox.py:125 ../src/controlpanel/toolbar.py:115
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: ../src/view/home/HomeBox.py:127 ../src/controlpanel/gui.py:276
+msgid "Later"
+msgstr "Después"
+
+#: ../src/view/home/HomeBox.py:130
+msgid "Check now"
+msgstr "Probar ahora"
+
+#: ../src/view/home/HomeBox.py:266
msgid "List view"
msgstr "Vista en lista"
-#: ../src/view/home/HomeBox.py:216
-#, fuzzy
+#: ../src/view/home/HomeBox.py:267
msgid "<Ctrl>2"
-msgstr "<Ctrl>L"
+msgstr "<Ctrl>2"
-#: ../src/view/home/HomeBox.py:273
+#: ../src/view/home/HomeBox.py:325
msgid "Favorites view"
msgstr "Vista de Favoritos"
-#: ../src/view/home/HomeBox.py:274
-#, fuzzy
+#: ../src/view/home/HomeBox.py:326
msgid "<Ctrl>1"
-msgstr "<Ctrl>L"
+msgstr "<Ctrl>1"
+# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/HomeBox.py:282
+#: ../src/view/home/HomeBox.py:334
msgid "Freeform"
msgstr "Forma libre"
+# TRANS: label for the ring layout in the favorites view
#. TRANS: label for the ring layout in the favorites view
-#: ../src/view/home/HomeBox.py:289
+#: ../src/view/home/HomeBox.py:341
msgid "Ring"
msgstr "Anillo"
@@ -164,9 +196,10 @@ msgstr "Conectando..."
msgid "Connected"
msgstr "Conectado"
-#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:41
-#: ../src/view/devices/network/mesh.py:68
-#: ../src/view/devices/network/mesh.py:72
+#. only temporarily
+#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:51
+#: ../src/view/devices/network/mesh.py:92
+#: ../src/view/devices/network/mesh.py:96
msgid "Mesh Network"
msgstr "Red Malla"
@@ -174,8 +207,8 @@ msgstr "Red Malla"
# 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
-#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:119
-#: ../src/view/devices/network/mesh.py:89
+#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:160
+#: ../src/view/devices/network/mesh.py:125
msgid "Disconnect..."
msgstr "Desconectando..."
@@ -214,7 +247,6 @@ msgstr "Mis parlantes"
# la traducción la tome del AlsaMixer de Gnome.
#: ../src/view/devices/speaker.py:119
-#, fuzzy
msgid "Unmute"
msgstr "Dar voz"
@@ -222,27 +254,32 @@ msgstr "Dar voz"
msgid "Mute"
msgstr "Silenciar"
-#: ../src/view/devices/network/wireless.py:67
+#: ../src/view/devices/network/wireless.py:37
+#, python-format
+msgid "IP address: %s"
+msgstr ""
+
+#: ../src/view/devices/network/wireless.py:86
msgid "Disconnected"
msgstr "Desconectado"
-#: ../src/view/devices/network/wireless.py:137
+#: ../src/view/devices/network/wireless.py:178
msgid "Channel"
msgstr "Canal"
-#: ../src/view/frame/zoomtoolbar.py:34
+#: ../src/view/frame/zoomtoolbar.py:37
msgid "Neighborhood"
msgstr "Vecindario"
-#: ../src/view/frame/zoomtoolbar.py:36
+#: ../src/view/frame/zoomtoolbar.py:39
msgid "Group"
msgstr "Grupo"
-#: ../src/view/frame/zoomtoolbar.py:38
+#: ../src/view/frame/zoomtoolbar.py:41
msgid "Home"
msgstr "Hogar"
-#: ../src/view/frame/zoomtoolbar.py:40
+#: ../src/view/frame/zoomtoolbar.py:43
msgid "Activity"
msgstr "Actividad"
@@ -266,6 +303,7 @@ msgid "sugar-control-panel: %s"
msgstr "sugar-control-panel: %s"
#: ../src/controlpanel/cmd.py:33
+#, fuzzy
msgid ""
"Usage: sugar-control-panel [ option ] key [ args ... ] \n"
" Control for the sugar environment. \n"
@@ -275,6 +313,7 @@ msgid ""
" -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"
+" -c key clear the current value for the key \n"
" "
msgstr ""
"Uso: sugar-control-panel [opción] clave [args ...] \n"
@@ -287,35 +326,27 @@ msgstr ""
" -s clave establece el valor actual para la clave \n"
" "
-#: ../src/controlpanel/cmd.py:45
+#: ../src/controlpanel/cmd.py:46
msgid "To apply your changes you have to restart sugar.\n"
msgstr "Para aplicar sus cambios tiene que reiniciar sugar.\n"
-#: ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:294
+#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:296
msgid "Ok"
msgstr "Ok"
-#: ../src/controlpanel/sectionview.py:34 ../src/controlpanel/gui.py:260
+#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:268
msgid "Changes require restart"
msgstr "Los cambios requieren reiniciar"
-#: ../src/controlpanel/gui.py:259
+#: ../src/controlpanel/gui.py:267
msgid "Warning"
msgstr "Advertencia"
-#: ../src/controlpanel/gui.py:263
+#: ../src/controlpanel/gui.py:271
msgid "Cancel changes"
msgstr "Cancelar cambios"
-#: ../src/controlpanel/gui.py:267
-msgid "Later"
-msgstr "Después"
-
-#: ../src/controlpanel/gui.py:271
+#: ../src/controlpanel/gui.py:280
msgid "Restart now"
msgstr "Reiniciar ahora"
@@ -368,12 +399,12 @@ msgid "Could not access ~/.i18n. Create standard settings."
msgstr ""
"No se puede acceder a ~/.i18n. Crear configuración internacional estándar."
-#: ../src/controlpanel/model/language.py:104
+#: ../src/controlpanel/model/language.py:110
#, python-format
msgid "Language for code=%s could not be determined."
msgstr "El lenguaje del código=%s no pudo ser determinado."
-#: ../src/controlpanel/model/language.py:121
+#: ../src/controlpanel/model/language.py:127
#, python-format
msgid "Sorry I do not speak '%s'."
msgstr "Lo siento yo no hablo '%s'."
@@ -403,35 +434,59 @@ msgid "About Me"
msgstr "Acerca de mí."
#: ../src/controlpanel/view/aboutme.py:134
-#, fuzzy
msgid "Click to change your color:"
-msgstr "Clic para cambiar sus colores:"
+msgstr "Clic para cambiar su color:"
-#: ../src/controlpanel/view/aboutxo.py:26
+#: ../src/controlpanel/view/aboutxo.py:28
msgid "About my XO"
msgstr "Acerca de mi XO"
-#: ../src/controlpanel/view/aboutxo.py:47
+#: ../src/controlpanel/view/aboutxo.py:59
msgid "Identity"
msgstr "Identidad"
-#: ../src/controlpanel/view/aboutxo.py:56
+#: ../src/controlpanel/view/aboutxo.py:68
msgid "Serial Number:"
msgstr "Número de Serie:"
-#: ../src/controlpanel/view/aboutxo.py:79
+#: ../src/controlpanel/view/aboutxo.py:91
msgid "Software"
msgstr "Software"
-#: ../src/controlpanel/view/aboutxo.py:88
-#, fuzzy
+# Por ahora..
+#: ../src/controlpanel/view/aboutxo.py:100
msgid "Build:"
-msgstr "Ensamble"
+msgstr "Ensamble:"
+
+#: ../src/controlpanel/view/aboutxo.py:115
+msgid "Sugar:"
+msgstr ""
-#: ../src/controlpanel/view/aboutxo.py:103
+#: ../src/controlpanel/view/aboutxo.py:130
msgid "Firmware:"
msgstr "Firmware"
+#: ../src/controlpanel/view/aboutxo.py:152
+msgid "Copyright and License"
+msgstr ""
+
+#: ../src/controlpanel/view/aboutxo.py:160
+msgid ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
+msgstr ""
+
+#: ../src/controlpanel/view/aboutxo.py:166
+msgid ""
+"Sugar is the graphical user interface that you are looking at. Sugar is free "
+"software, covered by the GNU General Public License, and you are welcome to "
+"change it and/or distribute copies of it under certain conditions described "
+"therein."
+msgstr ""
+
+#: ../src/controlpanel/view/aboutxo.py:178
+msgid "Full license:"
+msgstr ""
+
#: ../src/controlpanel/view/datetime.py:29
msgid "Date & Time"
msgstr "Fecha y Hora"
@@ -513,34 +568,32 @@ msgstr ""
"Manejo extremo de energía (deshabilita el radio wireless, incrementa la vida "
"de la batería)"
-#: ../src/view/devices/network/mesh.py:111
+#: ../src/view/devices/network/mesh.py:154
msgid "Connected to a School Mesh Portal"
msgstr "Conectado a un enlace escolar de red malla"
# "portal malla de colegio", en Castellano de España suena fatal... ¿Realmente se quiere decir malla?
-#: ../src/view/devices/network/mesh.py:113
+#: ../src/view/devices/network/mesh.py:156
msgid "Looking for a School Mesh Portal..."
msgstr "Buscando un enlace escolar de red malla..."
-#: ../src/view/devices/network/mesh.py:116
-#, fuzzy
+#: ../src/view/devices/network/mesh.py:159
msgid "Connected to an XO Mesh Portal"
-msgstr "Conectado a un enlace individual de red malla"
+msgstr "Conectado a un Portal Malla XO"
-#: ../src/view/devices/network/mesh.py:118
-#, fuzzy
+#: ../src/view/devices/network/mesh.py:161
msgid "Looking for an XO Mesh Portal..."
-msgstr "Buscando un enlace individual de red malla..."
+msgstr "Buscando un Portal Malla XO..."
-#: ../src/view/devices/network/mesh.py:121
+#: ../src/view/devices/network/mesh.py:164
msgid "Connected to a Simple Mesh"
msgstr "Conectado a una Red Malla Simple"
-#: ../src/view/devices/network/mesh.py:123
+#: ../src/view/devices/network/mesh.py:166
msgid "Starting a Simple Mesh"
msgstr "Empezando una Red Malla Simple"
-#: ../src/view/devices/network/mesh.py:130
+#: ../src/view/devices/network/mesh.py:173
msgid "Unknown Mesh"
msgstr "Red Malla Desconocida"
@@ -548,36 +601,36 @@ msgstr "Red Malla Desconocida"
msgid "Decline"
msgstr "Rechazar"
-#: ../src/view/home/favoritesview.py:285
+#: ../src/view/home/favoritesview.py:287
msgid "Registration Failed"
msgstr "Registro Fallido"
-#: ../src/view/home/favoritesview.py:286
+#: ../src/view/home/favoritesview.py:288
#, python-format
msgid "%s"
-msgstr ""
+msgstr "%s"
-#: ../src/view/home/favoritesview.py:288
+#: ../src/view/home/favoritesview.py:290
msgid "Registration Successful"
msgstr "Registro Exitoso"
-#: ../src/view/home/favoritesview.py:289
+#: ../src/view/home/favoritesview.py:291
msgid "You are now registered with your school server."
msgstr "Ahora estas registrado en el servidor de colegio"
-#: ../src/view/home/favoritesview.py:405
+#: ../src/view/home/favoritesview.py:407
msgid "Control Panel"
msgstr "Panel de Control"
-#: ../src/view/home/favoritesview.py:416
+#: ../src/view/home/favoritesview.py:418
msgid "Restart"
msgstr "Reiniciar"
-#: ../src/view/home/favoritesview.py:421
+#: ../src/view/home/favoritesview.py:423
msgid "Shutdown"
msgstr "Apagar"
-#: ../src/view/home/favoritesview.py:427
+#: ../src/view/home/favoritesview.py:429
msgid "Register"
msgstr "Registro"
diff --git a/po/fr.po b/po/fr.po
index 2dbf037..dad93ca 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: sugar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-07-23 07:44-0400\n"
-"PO-Revision-Date: 2008-07-28 17:02-0400\n"
+"POT-Creation-Date: 2008-09-01 18:31-0400\n"
+"PO-Revision-Date: 2008-09-10 00:12-0400\n"
"Last-Translator: samy boutayeb <s.boutayeb@free.fr>\n"
"Language-Team: French <traduc@traduc.org>\n"
"MIME-Version: 1.0\n"
@@ -19,19 +19,19 @@ msgstr ""
msgid "Name:"
msgstr "Nom :"
-#: ../src/intro/intro.py:94
+#: ../src/intro/intro.py:97
msgid "Click to change color:"
msgstr "Cliquer pour changer de couleur :"
-#: ../src/intro/intro.py:145
+#: ../src/intro/intro.py:148
msgid "Back"
msgstr "Précédent"
-#: ../src/intro/intro.py:159 ../src/controlpanel/toolbar.py:61
+#: ../src/intro/intro.py:162 ../src/controlpanel/toolbar.py:61
msgid "Done"
msgstr "Accepter"
-#: ../src/intro/intro.py:162
+#: ../src/intro/intro.py:165
msgid "Next"
msgstr "Suivant"
@@ -43,7 +43,7 @@ msgstr "Retirer de mes amis"
msgid "Make friend"
msgstr "Ajouter à mes amis"
-#: ../src/view/BuddyMenu.py:91
+#: ../src/view/BuddyMenu.py:90
#, python-format
msgid "Invite to %s"
msgstr "Inviter à %s"
@@ -64,7 +64,7 @@ msgstr "Ouvrir"
#. TODO: Implement stopping downloads
#. self._stop_item.connect('activate', self._stop_item_activate_cb)
#. self.append_menu_item(self._stop_item)
-#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:86
+#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:87
msgid "Keep"
msgstr "Conserver"
@@ -89,49 +89,81 @@ msgstr "Type d'authentification :"
msgid "Encryption Type:"
msgstr "Type d'encryptage :"
-#: ../src/view/Shell.py:240
+#: ../src/hardware/schoolserver.py:17
+msgid "Cannot obtain data needed for registration."
+msgstr "Impossible d'obtenir certaines données nécessaires à l'enregistrement."
+
+#: ../src/hardware/schoolserver.py:31
+msgid "Cannot connect to the server."
+msgstr "Impossible de se connecter au serveu."
+
+#: ../src/hardware/schoolserver.py:36
+msgid "The server could not complete the request."
+msgstr "Le serveur n'a pas pu achever la requête."
+
+#: ../src/view/Shell.py:262
msgid "Screenshot"
msgstr "Capture d'écran"
-#: ../src/view/home/HomeBox.py:80
+#: ../src/view/home/HomeBox.py:81
msgid "Confirm erase"
msgstr "Confirmer la suppression"
# Conformer la suppression : faut-il supprimer %s définitivement ?
-#: ../src/view/home/HomeBox.py:82
+#: ../src/view/home/HomeBox.py:83
#, python-format
msgid "Confirm erase: Do you want to permanently erase %s?"
msgstr "Confirmer la suppression : faut-il supprimer %s définitivement ?"
-#: ../src/view/home/HomeBox.py:89 ../src/view/palettes.py:120
+#: ../src/view/home/HomeBox.py:90 ../src/view/palettes.py:120
msgid "Erase"
msgstr "Supprimer"
-#: ../src/view/home/HomeBox.py:215
+#: ../src/view/home/HomeBox.py:120
+msgid "Software Update"
+msgstr "Mise à jour logicielle"
+
+#: ../src/view/home/HomeBox.py:121
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr "Actualiser les activités pour assurer la compatibilité logicielle"
+
+#: ../src/view/home/HomeBox.py:125 ../src/controlpanel/toolbar.py:115
+msgid "Cancel"
+msgstr "Annuler"
+
+#: ../src/view/home/HomeBox.py:127 ../src/controlpanel/gui.py:276
+msgid "Later"
+msgstr "Plus tard"
+
+#: ../src/view/home/HomeBox.py:130
+msgid "Check now"
+msgstr "Vérifier maintenant"
+
+#: ../src/view/home/HomeBox.py:266
msgid "List view"
msgstr "Écran liste"
-#: ../src/view/home/HomeBox.py:216
+#: ../src/view/home/HomeBox.py:267
msgid "<Ctrl>2"
msgstr "<Ctrl>2"
-#: ../src/view/home/HomeBox.py:273
+#: ../src/view/home/HomeBox.py:325
msgid "Favorites view"
msgstr "Écran favoris"
-#: ../src/view/home/HomeBox.py:274
+#: ../src/view/home/HomeBox.py:326
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/HomeBox.py:282
+#: ../src/view/home/HomeBox.py:334
msgid "Freeform"
msgstr "Libre"
# TRANS: label for the ring layout in the favorites view
#. TRANS: label for the ring layout in the favorites view
-#: ../src/view/home/HomeBox.py:289
+#: ../src/view/home/HomeBox.py:341
msgid "Ring"
msgstr "Concentrique"
@@ -161,9 +193,10 @@ msgstr "Connexion..."
msgid "Connected"
msgstr "Connecté"
-#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:41
-#: ../src/view/devices/network/mesh.py:68
-#: ../src/view/devices/network/mesh.py:72
+#. only temporarily
+#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:51
+#: ../src/view/devices/network/mesh.py:92
+#: ../src/view/devices/network/mesh.py:96
msgid "Mesh Network"
msgstr "Réseau maillé"
@@ -171,8 +204,8 @@ msgstr "Réseau maillé"
# 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
-#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:119
-#: ../src/view/devices/network/mesh.py:89
+#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:160
+#: ../src/view/devices/network/mesh.py:125
msgid "Disconnect..."
msgstr "Déconnexion..."
@@ -217,27 +250,32 @@ msgstr "Activer le son"
msgid "Mute"
msgstr "Mettre en sourdine"
-#: ../src/view/devices/network/wireless.py:67
+#: ../src/view/devices/network/wireless.py:37
+#, python-format
+msgid "IP address: %s"
+msgstr "Adresse IP : %s"
+
+#: ../src/view/devices/network/wireless.py:86
msgid "Disconnected"
msgstr "Déconnecté"
-#: ../src/view/devices/network/wireless.py:137
+#: ../src/view/devices/network/wireless.py:178
msgid "Channel"
msgstr "Canal"
-#: ../src/view/frame/zoomtoolbar.py:34
+#: ../src/view/frame/zoomtoolbar.py:37
msgid "Neighborhood"
msgstr "Voisinage"
-#: ../src/view/frame/zoomtoolbar.py:36
+#: ../src/view/frame/zoomtoolbar.py:39
msgid "Group"
msgstr "Groupe"
-#: ../src/view/frame/zoomtoolbar.py:38
+#: ../src/view/frame/zoomtoolbar.py:41
msgid "Home"
msgstr "Accueil"
-#: ../src/view/frame/zoomtoolbar.py:40
+#: ../src/view/frame/zoomtoolbar.py:43
msgid "Activity"
msgstr "Activité"
@@ -270,6 +308,7 @@ msgid ""
" -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"
+" -c key clear the current value for the key \n"
" "
msgstr ""
"Usage: sugar-control-panel [ option ] key [ args ... ] \n"
@@ -277,40 +316,32 @@ msgstr ""
" Options: \n"
" -h afficher ce message d'aide et quitter \n"
" -l afficher la liste des options disponibles \n"
-" -h key afficher les informations sur cette clé \n"
-" -g key obtenir la valeur courante associée à cette clé \n"
-" -s key définir la valeur courante de cette clé \n"
+" -h clef afficher les informations sur cette clé \n"
+" -g clef obtenir la valeur actuelle associée à cette clé \n"
+" -s clef définir la valeur actuelle de cette clé \n"
" "
-#: ../src/controlpanel/cmd.py:45
+#: ../src/controlpanel/cmd.py:46
msgid "To apply your changes you have to restart sugar.\n"
msgstr "Redémarrer sugar pour que les changements prennent effet.\n"
-#: ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr "Annuler"
-
-#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:294
+#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:296
msgid "Ok"
msgstr "Ok"
-#: ../src/controlpanel/sectionview.py:34 ../src/controlpanel/gui.py:260
+#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:268
msgid "Changes require restart"
msgstr "Relancer pour valider"
-#: ../src/controlpanel/gui.py:259
+#: ../src/controlpanel/gui.py:267
msgid "Warning"
msgstr "Attention"
-#: ../src/controlpanel/gui.py:263
+#: ../src/controlpanel/gui.py:271
msgid "Cancel changes"
msgstr "Abandonner"
-#: ../src/controlpanel/gui.py:267
-msgid "Later"
-msgstr "Plus tard"
-
-#: ../src/controlpanel/gui.py:271
+#: ../src/controlpanel/gui.py:280
msgid "Restart now"
msgstr "Maintenant"
@@ -362,12 +393,12 @@ msgstr "La valeur doit être un entier."
msgid "Could not access ~/.i18n. Create standard settings."
msgstr "Accès impossible à ~/.i18n. Création de paramètres par défaut."
-#: ../src/controlpanel/model/language.py:104
+#: ../src/controlpanel/model/language.py:110
#, 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."
-#: ../src/controlpanel/model/language.py:121
+#: ../src/controlpanel/model/language.py:127
#, python-format
msgid "Sorry I do not speak '%s'."
msgstr "Désolé je ne parle pas '%s'."
@@ -400,30 +431,61 @@ msgstr "Moi"
msgid "Click to change your color:"
msgstr "Cliquer pour changer de couleur :"
-#: ../src/controlpanel/view/aboutxo.py:26
+#: ../src/controlpanel/view/aboutxo.py:28
msgid "About my XO"
msgstr "Mon XO"
-#: ../src/controlpanel/view/aboutxo.py:47
+#: ../src/controlpanel/view/aboutxo.py:59
msgid "Identity"
msgstr "Identité"
-#: ../src/controlpanel/view/aboutxo.py:56
+#: ../src/controlpanel/view/aboutxo.py:68
msgid "Serial Number:"
msgstr "Numéro de série :"
-#: ../src/controlpanel/view/aboutxo.py:79
+#: ../src/controlpanel/view/aboutxo.py:91
msgid "Software"
msgstr "Logiciel"
-#: ../src/controlpanel/view/aboutxo.py:88
+#: ../src/controlpanel/view/aboutxo.py:100
msgid "Build:"
msgstr "Version :"
-#: ../src/controlpanel/view/aboutxo.py:103
+#: ../src/controlpanel/view/aboutxo.py:115
+msgid "Sugar:"
+msgstr "Sugar :"
+
+#: ../src/controlpanel/view/aboutxo.py:130
msgid "Firmware:"
msgstr "Micrologiciel :"
+#: ../src/controlpanel/view/aboutxo.py:152
+msgid "Copyright and License"
+msgstr "Copyright et licence"
+
+#: ../src/controlpanel/view/aboutxo.py:160
+msgid ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
+msgstr ""
+"© 2008 One Laptop per Child Association Inc ; Red Hat Inc ; et "
+"contributeurs."
+
+#: ../src/controlpanel/view/aboutxo.py:166
+msgid ""
+"Sugar is the graphical user interface that you are looking at. Sugar is free "
+"software, covered by the GNU General Public License, and you are welcome to "
+"change it and/or distribute copies of it under certain conditions described "
+"therein."
+msgstr ""
+"Sugar est l'interface graphique utilisateur que vous utilisez actuellement. "
+"Sugar est un logiciel libre couvert par la licence GNU/GPL (General Public "
+"License). Vous êtes autorisé à le modifier et/ou à en distribuer des copies "
+"aux conditions spécifiées."
+
+#: ../src/controlpanel/view/aboutxo.py:178
+msgid "Full license:"
+msgstr "Licence complète :"
+
#: ../src/controlpanel/view/datetime.py:29
msgid "Date & Time"
msgstr "Date & heure"
@@ -505,31 +567,31 @@ msgstr ""
"Gestion extrême de l'alimentation (désactive la radio sans fil, prolonge la "
"batterie)"
-#: ../src/view/devices/network/mesh.py:111
+#: ../src/view/devices/network/mesh.py:154
msgid "Connected to a School Mesh Portal"
msgstr "Connecté au portail du réseau maillé d'école"
-#: ../src/view/devices/network/mesh.py:113
+#: ../src/view/devices/network/mesh.py:156
msgid "Looking for a School Mesh Portal..."
msgstr "Recherche un portail de réseau maillé d'école..."
-#: ../src/view/devices/network/mesh.py:116
+#: ../src/view/devices/network/mesh.py:159
msgid "Connected to an XO Mesh Portal"
msgstr "Connecté au portail de réseau maillé de XO"
-#: ../src/view/devices/network/mesh.py:118
+#: ../src/view/devices/network/mesh.py:161
msgid "Looking for an XO Mesh Portal..."
msgstr "Recherche un portail de réseau maillé de XO..."
-#: ../src/view/devices/network/mesh.py:121
+#: ../src/view/devices/network/mesh.py:164
msgid "Connected to a Simple Mesh"
msgstr "Connecté à un réseau maillé simple"
-#: ../src/view/devices/network/mesh.py:123
+#: ../src/view/devices/network/mesh.py:166
msgid "Starting a Simple Mesh"
msgstr "Démarre un réseau maillé simple"
-#: ../src/view/devices/network/mesh.py:130
+#: ../src/view/devices/network/mesh.py:173
msgid "Unknown Mesh"
msgstr "Réseau maillé inconnu"
@@ -537,36 +599,36 @@ msgstr "Réseau maillé inconnu"
msgid "Decline"
msgstr "Refuser"
-#: ../src/view/home/favoritesview.py:285
+#: ../src/view/home/favoritesview.py:287
msgid "Registration Failed"
msgstr "Echec de l'enregistrement"
-#: ../src/view/home/favoritesview.py:286
+#: ../src/view/home/favoritesview.py:288
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/view/home/favoritesview.py:288
+#: ../src/view/home/favoritesview.py:290
msgid "Registration Successful"
msgstr "Enregistrement réussi"
-#: ../src/view/home/favoritesview.py:289
+#: ../src/view/home/favoritesview.py:291
msgid "You are now registered with your school server."
msgstr "Vous êtes maintenant enregistré sur le serveur de l'école"
-#: ../src/view/home/favoritesview.py:405
+#: ../src/view/home/favoritesview.py:407
msgid "Control Panel"
msgstr "Panneau de contrôle"
-#: ../src/view/home/favoritesview.py:416
+#: ../src/view/home/favoritesview.py:418
msgid "Restart"
msgstr "Redémarrer"
-#: ../src/view/home/favoritesview.py:421
+#: ../src/view/home/favoritesview.py:423
msgid "Shutdown"
msgstr "Éteindre"
-#: ../src/view/home/favoritesview.py:427
+#: ../src/view/home/favoritesview.py:429
msgid "Register"
msgstr "S'enregistrer"
@@ -599,6 +661,13 @@ msgstr "Afficher les contenus"
msgid "%(free_space)d MB Free"
msgstr "%(free_space)d Mo de libre"
+#~ msgid "© 2008 One Laptop per Child Assocation "
+#~ msgstr "© 2008 One Laptop per Child Assocation "
+
+#, fuzzy
+#~ msgid "Sugar is the graphical user interface that "
+#~ msgstr "Sugar est l'interface utiliateur graphique que"
+
#~ msgid "<Ctrl>R"
#~ msgstr "<Ctrl>R"
diff --git a/po/ht.po b/po/ht.po
index 86a54e2..e3d2500 100644
--- a/po/ht.po
+++ b/po/ht.po
@@ -6,9 +6,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-06-21 00:30-0400\n"
-"PO-Revision-Date: 2008-03-12 09:14-0400\n"
-"Last-Translator: Jude Augusma <jayme2901@yahoo.com>\n"
+"POT-Creation-Date: 2008-08-19 17:12-0400\n"
+"PO-Revision-Date: 2008-08-18 16:47-0400\n"
+"Last-Translator: lacrete <le_teaseur@hotmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,36 +17,36 @@ msgstr ""
#: ../src/intro/intro.py:65 ../src/controlpanel/view/aboutme.py:100
msgid "Name:"
-msgstr "Non"
+msgstr "Non:"
-#: ../src/intro/intro.py:94
+#: ../src/intro/intro.py:97
msgid "Click to change color:"
-msgstr "Klike pou chanje koulè"
+msgstr "Klike pou chanje koulè:"
-#: ../src/intro/intro.py:145
+#: ../src/intro/intro.py:148
msgid "Back"
msgstr "Retounen"
-#: ../src/intro/intro.py:159 ../src/controlpanel/toolbar.py:61
+#: ../src/intro/intro.py:162 ../src/controlpanel/toolbar.py:61
msgid "Done"
msgstr "Fini"
-#: ../src/intro/intro.py:162
+#: ../src/intro/intro.py:165
msgid "Next"
-msgstr "Prochen"
+msgstr "Pwochen"
#: ../src/view/BuddyMenu.py:58
msgid "Remove friend"
-msgstr "Retire zanmi"
+msgstr "Retire zanmi "
#: ../src/view/BuddyMenu.py:61
msgid "Make friend"
-msgstr "Fè zanmi"
+msgstr "Fè zanmi "
#: ../src/view/BuddyMenu.py:91
#, python-format
msgid "Invite to %s"
-msgstr "Envite sou %s"
+msgstr "Envite nan %s"
#: ../src/view/clipboardmenu.py:48
msgid "Remove"
@@ -54,73 +54,119 @@ msgstr "Retire"
#: ../src/view/clipboardmenu.py:53 ../src/view/clipboardmenu.py:79
msgid "Open"
-msgstr "Louvri"
+msgstr "Ouvri"
#. 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)
-#: ../src/view/clipboardmenu.py:63
+#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:87
msgid "Keep"
-msgstr ""
+msgstr "Kenbe"
#: ../src/view/clipboardmenu.py:84
msgid "Open with"
-msgstr ""
+msgstr "Ouvri ak"
-#: ../src/view/clipboardmenu.py:212
+#: ../src/view/clipboardmenu.py:216
#, python-format
msgid "Clipboard object: %s."
msgstr "Objè ekritwa: %s."
#: ../src/hardware/keydialog.py:150
msgid "Key Type:"
-msgstr "Tip kle:"
+msgstr "kalite kle:"
#: ../src/hardware/keydialog.py:170
msgid "Authentication Type:"
-msgstr "Tip otantifikasyon:"
+msgstr "Kalite otantifikasyon:"
#: ../src/hardware/keydialog.py:251
msgid "Encryption Type:"
-msgstr "Tip kod sekrè"
+msgstr "Kalite kod sekrè"
+
+#: ../src/hardware/schoolserver.py:17
+msgid "Cannot obtain data needed for registration."
+msgstr ""
+
+#: ../src/hardware/schoolserver.py:31
+msgid "Cannot connect to the server."
+msgstr ""
-#: ../src/view/Shell.py:262
+#: ../src/hardware/schoolserver.py:36
+msgid "The server could not complete the request."
+msgstr ""
+
+#: ../src/view/Shell.py:240
msgid "Screenshot"
msgstr "Ekran projektwa"
-#: ../src/view/home/HomeBox.py:147
-msgid "List view"
-msgstr ""
+#: ../src/view/home/HomeBox.py:81
+msgid "Confirm erase"
+msgstr "Konfime sa ou efase a"
-#: ../src/view/home/HomeBox.py:148
-msgid "<Ctrl>L"
+#: ../src/view/home/HomeBox.py:83
+#, python-format
+msgid "Confirm erase: Do you want to permanently erase %s?"
+msgstr "Konfime sa ou efase a: ou vle retire'l net %s?"
+
+#: ../src/view/home/HomeBox.py:90 ../src/view/palettes.py:120
+msgid "Erase"
+msgstr "Efase"
+
+#: ../src/view/home/HomeBox.py:120
+msgid "Software Update"
msgstr ""
-#: ../src/view/home/HomeBox.py:204
-msgid "Favorites view"
+#: ../src/view/home/HomeBox.py:121
+msgid "Update your activities to ensure compatibility with your new software"
msgstr ""
-#: ../src/view/home/HomeBox.py:205
-msgid "<Ctrl>R"
+#: ../src/view/home/HomeBox.py:125 ../src/controlpanel/toolbar.py:115
+msgid "Cancel"
+msgstr "Anile"
+
+#: ../src/view/home/HomeBox.py:127 ../src/controlpanel/gui.py:275
+msgid "Later"
+msgstr "Pi ta"
+
+#: ../src/view/home/HomeBox.py:130
+msgid "Check now"
msgstr ""
+#: ../src/view/home/HomeBox.py:266
+msgid "List view"
+msgstr "Gade lis"
+
+#: ../src/view/home/HomeBox.py:267
+msgid "<Ctrl>2"
+msgstr "<Ctrl>2"
+
+#: ../src/view/home/HomeBox.py:325
+msgid "Favorites view"
+msgstr "Fas prefere"
+
+#: ../src/view/home/HomeBox.py:326
+msgid "<Ctrl>1"
+msgstr "<Ctrl>1"
+
+# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/HomeBox.py:211
+#: ../src/view/home/HomeBox.py:334
msgid "Freeform"
-msgstr ""
+msgstr "Fòm lib"
+# TRANS: label for the ring layout in the favorites view
#. TRANS: label for the ring layout in the favorites view
-#: ../src/view/home/HomeBox.py:218
+#: ../src/view/home/HomeBox.py:341
msgid "Ring"
-msgstr ""
+msgstr "Zanno"
#: ../src/view/home/MeshBox.py:97
msgid "Connect"
-msgstr ""
+msgstr "Konekte"
#: ../src/view/home/MeshBox.py:106
-#, fuzzy
msgid "Disconnect"
msgstr "Dekonekte"
@@ -129,101 +175,99 @@ msgstr "Dekonekte"
# method for a device either (for various reasons) so this doesn't
# have a good mapping
#: ../src/view/home/MeshBox.py:118
-#, fuzzy
msgid "Disconnecting..."
-msgstr "Dekonekte..."
+msgstr "An dekoneksyon..."
# 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
#: ../src/view/home/MeshBox.py:152
-#, fuzzy
msgid "Connecting..."
-msgstr "Dekonekte..."
+msgstr "An koneksyon..."
#. TODO: show the channel number
#: ../src/view/home/MeshBox.py:159
msgid "Connected"
-msgstr ""
+msgstr "Konekte"
-#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:38
-#: ../src/view/devices/network/mesh.py:65
-#: ../src/view/devices/network/mesh.py:69
+#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:41
+#: ../src/view/devices/network/mesh.py:68
+#: ../src/view/devices/network/mesh.py:72
msgid "Mesh Network"
-msgstr "Rezo "
+msgstr "Rezo maye"
# 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
-#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:116
-#: ../src/view/devices/network/mesh.py:86
+#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:119
+#: ../src/view/devices/network/mesh.py:89
msgid "Disconnect..."
msgstr "Dekonekte..."
-#: ../src/view/home/MeshBox.py:302 ../src/view/palettes.py:60
+#: ../src/view/home/MeshBox.py:302 ../src/view/palettes.py:61
msgid "Resume"
msgstr "Repwann"
-#: ../src/view/home/MeshBox.py:307 ../src/view/frame/activitiestray.py:219
+#: ../src/view/home/MeshBox.py:307 ../src/view/frame/activitiestray.py:205
msgid "Join"
-msgstr "Rankontre"
+msgstr "Rejwen'n"
-#: ../src/view/devices/battery.py:42
+#: ../src/view/devices/battery.py:45
msgid "My Battery"
-msgstr ""
+msgstr "Batri-m"
-#: ../src/view/devices/battery.py:111
+#: ../src/view/devices/battery.py:114
msgid "Charging"
-msgstr ""
+msgstr "Ap chaje"
-#: ../src/view/devices/battery.py:114
+#: ../src/view/devices/battery.py:117
msgid "Very little power remaining"
-msgstr ""
+msgstr "Yon ti kras chaj ki rete"
-#: ../src/view/devices/battery.py:120
+#: ../src/view/devices/battery.py:123
#, python-format
msgid "%(hour)d:%(min).2d remaining"
-msgstr ""
+msgstr "%(hour)d:%(min).2d ki rete"
-#: ../src/view/devices/battery.py:124
+#: ../src/view/devices/battery.py:127
msgid "Charged"
-msgstr ""
+msgstr "Fin chaje"
-#: ../src/view/devices/speaker.py:40
+#: ../src/view/devices/speaker.py:44
msgid "My Speakers"
-msgstr ""
+msgstr "Opalè m' yo"
-#: ../src/view/devices/speaker.py:104
+#: ../src/view/devices/speaker.py:119
msgid "Unmute"
-msgstr ""
+msgstr "Aktive son an"
-#: ../src/view/devices/speaker.py:107
+#: ../src/view/devices/speaker.py:122
msgid "Mute"
-msgstr ""
+msgstr "Dezaktive son an"
-#: ../src/view/devices/network/wireless.py:64
+#: ../src/view/devices/network/wireless.py:67
msgid "Disconnected"
msgstr "Dekonekte"
-#: ../src/view/devices/network/wireless.py:134
+#: ../src/view/devices/network/wireless.py:137
msgid "Channel"
msgstr "Chanèl"
-#: ../src/view/frame/zoomtoolbar.py:34
+#: ../src/view/frame/zoomtoolbar.py:37
msgid "Neighborhood"
msgstr "Vwazinaj"
-#: ../src/view/frame/zoomtoolbar.py:36
+#: ../src/view/frame/zoomtoolbar.py:39
msgid "Group"
msgstr "Gwoup"
-#: ../src/view/frame/zoomtoolbar.py:38
+#: ../src/view/frame/zoomtoolbar.py:41
msgid "Home"
msgstr "Lakay"
-#: ../src/view/frame/zoomtoolbar.py:40
+#: ../src/view/frame/zoomtoolbar.py:43
msgid "Activity"
msgstr "Aktivite"
@@ -233,6 +277,8 @@ msgid ""
"sugar-control-panel: WARNING, found more than one option with the same name: "
"%s module: %r"
msgstr ""
+"Sugar-control-panel: Atansyon, yo jwenn plizyè opsyon ak yon menm non: %s "
+"modil: %r"
#: ../src/controlpanel/cmd.py:28
#, python-format
@@ -245,6 +291,7 @@ msgid "sugar-control-panel: %s"
msgstr "Sugar-kontwòl-panèl: %s"
#: ../src/controlpanel/cmd.py:33
+#, fuzzy
msgid ""
"Usage: sugar-control-panel [ option ] key [ args ... ] \n"
" Control for the sugar environment. \n"
@@ -254,81 +301,74 @@ msgid ""
" -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"
+" -c key clear the current value for the key \n"
" "
msgstr ""
"Sèvi: Sugar-Kontwòl-panèl [opsyon] kle [args ... ]\n"
-" Kontwòl pou anvironman sugar. \n"
-" opsyon: \n"
-" -h montre mesaj èd sa epi soti \n"
-" -l fè lis tout opsyon disponib yo \n"
-" -h kle montre enfòmasyon sou kle sa \n"
-" -g kle pwan valè kouran kle-a \n"
-" -s kle fikse valè Kouran pou kle-a \n"
-" "
-
-#: ../src/controlpanel/cmd.py:45
+"\tKontwòl pou anvironman sugar. \n"
+"\topsyon: \n"
+"\t-h\tmontre mesaj èd sa epi soti \n"
+"\t-l\tfè lis tout opsyon disponib yo \n"
+"\t-h kle\tmontre enfòmasyon sou kle sa \n"
+"\t-g kle\tpwan valè kouran kle-a \n"
+"\t-s kle\tfikse valè Kouran pou kle-a \n"
+"\t"
+
+#: ../src/controlpanel/cmd.py:46
msgid "To apply your changes you have to restart sugar.\n"
msgstr "Pou aplike chanjman ou yo ou bezwen reyinisyalize program nan.\n"
-#: ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr ""
-
-#: ../src/controlpanel/toolbar.py:121
+#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:296
msgid "Ok"
-msgstr ""
+msgstr "Ok"
-#: ../src/controlpanel/sectionview.py:34 ../src/controlpanel/gui.py:250
+#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:267
msgid "Changes require restart"
-msgstr ""
+msgstr "Redemare pou aplike chanjman yo"
-#: ../src/controlpanel/gui.py:249
+#: ../src/controlpanel/gui.py:266
msgid "Warning"
-msgstr ""
+msgstr "Avètisman"
-#: ../src/controlpanel/gui.py:253
+#: ../src/controlpanel/gui.py:270
msgid "Cancel changes"
-msgstr ""
-
-#: ../src/controlpanel/gui.py:257
-msgid "Later"
-msgstr ""
+msgstr "Anile chanjman yo"
-#: ../src/controlpanel/gui.py:261
+#: ../src/controlpanel/gui.py:279
msgid "Restart now"
-msgstr ""
+msgstr "Redemare kounye a menm"
#: ../src/controlpanel/model/aboutme.py:44
msgid "You must enter a name."
-msgstr ""
+msgstr "Ou dwe rantre yon non."
-#: ../src/controlpanel/model/aboutme.py:67
+#: ../src/controlpanel/model/aboutme.py:69
#, python-format
msgid "stroke: color=%s hue=%s"
-msgstr ""
+msgstr "stroke:_ koulè=%s hue=%s"
-#: ../src/controlpanel/model/aboutme.py:70
+#: ../src/controlpanel/model/aboutme.py:72
#, python-format
msgid "stroke: %s"
-msgstr ""
+msgstr "stroke:_ %s"
-#: ../src/controlpanel/model/aboutme.py:72
+#: ../src/controlpanel/model/aboutme.py:74
#, python-format
msgid "fill: color=%s hue=%s"
-msgstr ""
+msgstr "fill:_ koulè=%s hue=%s"
-#: ../src/controlpanel/model/aboutme.py:74
+#: ../src/controlpanel/model/aboutme.py:76
#, python-format
msgid "fill: %s"
-msgstr ""
+msgstr "fill: _ %s"
-#: ../src/controlpanel/model/aboutme.py:85
+#: ../src/controlpanel/model/aboutme.py:87
msgid "Error in specified color modifiers."
-msgstr "Erè nan modifikatè endike koulè yo"
+msgstr "Erè nan modifikatè koulè espesifye yo"
-#: ../src/controlpanel/model/aboutme.py:88
+#: ../src/controlpanel/model/aboutme.py:90
msgid "Error in specified colors."
-msgstr "Erè nan koulè endike yo"
+msgstr "Erè nan koulè espesifye yo"
#: ../src/controlpanel/model/aboutxo.py:24
msgid "Not available"
@@ -340,12 +380,11 @@ msgstr "Erè lè lokal pa egziste."
#: ../src/controlpanel/model/frame.py:38 ../src/controlpanel/model/frame.py:60
msgid "Value must be an integer."
-msgstr ""
+msgstr "Valè-a dwe yon antye."
#: ../src/controlpanel/model/language.py:28
-#, fuzzy
msgid "Could not access ~/.i18n. Create standard settings."
-msgstr "Pa ka rantre %s. Kreye reglaj estanda"
+msgstr "Aksè enposib ~/.i18n. Kreye paramèt pa defo yo"
#: ../src/controlpanel/model/language.py:104
#, python-format
@@ -355,11 +394,11 @@ msgstr "Lang pou kod=%s pa ka tèmine."
#: ../src/controlpanel/model/language.py:121
#, python-format
msgid "Sorry I do not speak '%s'."
-msgstr "Mwen regrèt mwen pa pale '%s'."
+msgstr "Dezole mwen pa pale '%s'."
#: ../src/controlpanel/model/network.py:48
msgid "You must enter a server."
-msgstr ""
+msgstr "Ou dwe endike yon sèvè."
#: ../src/controlpanel/model/network.py:63
msgid "State is unknown."
@@ -367,179 +406,224 @@ msgstr "Yo pa konnen eta l'"
#: ../src/controlpanel/model/network.py:83
msgid "Error in specified radio argument use on/off."
-msgstr "Erè nan itilizasyon limen/etenn agiman radio endike-a. "
+msgstr "Agiman radio espesifye-a pa kòrèk sèvi limen/etenn. "
+
+#: ../src/controlpanel/model/power.py:57
+msgid "Error in automatic pm argument, use on/off."
+msgstr "Agiman pou jere alimantasyon otomatik la pa kòrèk sèvi ak limen/etenn"
+
+#: ../src/controlpanel/model/power.py:86
+msgid "Error in extreme pm argument, use on/off."
+msgstr "Agiman pou gere alimantasyon ak dèyo pa kòrèk sèvi ak limen/etenn"
#: ../src/controlpanel/view/aboutme.py:32
msgid "About Me"
-msgstr ""
+msgstr "Enfòmasyon pèsonèl"
#: ../src/controlpanel/view/aboutme.py:134
-#, fuzzy
msgid "Click to change your color:"
msgstr "Klike pou chanje koulè"
#: ../src/controlpanel/view/aboutxo.py:26
msgid "About my XO"
-msgstr ""
+msgstr "Enfòmasyon sou XO mwen"
#: ../src/controlpanel/view/aboutxo.py:47
msgid "Identity"
-msgstr ""
+msgstr "Idantite"
#: ../src/controlpanel/view/aboutxo.py:56
msgid "Serial Number:"
-msgstr ""
+msgstr "Nimero seri:"
#: ../src/controlpanel/view/aboutxo.py:79
msgid "Software"
-msgstr ""
+msgstr "Pwogram"
#: ../src/controlpanel/view/aboutxo.py:88
msgid "Build:"
-msgstr ""
+msgstr "Bati:"
#: ../src/controlpanel/view/aboutxo.py:103
msgid "Firmware:"
-msgstr ""
+msgstr "Mikrolojisyèl:"
#: ../src/controlpanel/view/datetime.py:29
msgid "Date & Time"
-msgstr ""
+msgstr "Dat ak lè"
#: ../src/controlpanel/view/datetime.py:72
msgid "Timezone"
-msgstr ""
+msgstr "Lè lokal"
#: ../src/controlpanel/view/frame.py:28
msgid "Frame"
-msgstr ""
+msgstr "Ankadreman"
#: ../src/controlpanel/view/frame.py:30
msgid "never"
-msgstr ""
+msgstr "Jamè"
#: ../src/controlpanel/view/frame.py:31
msgid "instantaneous"
-msgstr ""
+msgstr "imediat"
#: ../src/controlpanel/view/frame.py:32
#, python-format
msgid "%s seconds"
-msgstr ""
+msgstr "%s segond"
#: ../src/controlpanel/view/frame.py:56
msgid "Activation Delay"
-msgstr ""
+msgstr "Reta aktivasyon"
#: ../src/controlpanel/view/frame.py:80
msgid "Corner"
-msgstr ""
+msgstr "Kwen"
#: ../src/controlpanel/view/frame.py:115
msgid "Edge"
-msgstr ""
+msgstr "Bò"
#: ../src/controlpanel/view/language.py:29
#: ../src/controlpanel/view/language.py:74
msgid "Language"
-msgstr ""
+msgstr "Lang"
#: ../src/controlpanel/view/network.py:28
msgid "Network"
-msgstr ""
+msgstr "Rezo"
#: ../src/controlpanel/view/network.py:53
msgid "Wireless"
-msgstr ""
+msgstr "San fil"
#: ../src/controlpanel/view/network.py:61
msgid "Radio:"
-msgstr ""
+msgstr "Radio"
#: ../src/controlpanel/view/network.py:94
msgid "Mesh"
-msgstr ""
+msgstr "Rezo maye"
#: ../src/controlpanel/view/network.py:103
msgid "Server:"
-msgstr ""
+msgstr "Sèvè:"
+
+#: ../src/controlpanel/view/power.py:27
+msgid "Power"
+msgstr "Alimantasyon"
+
+#: ../src/controlpanel/view/power.py:51
+msgid "Power management"
+msgstr "Jere alimantasyon"
-#: ../src/view/devices/network/mesh.py:108
+#: ../src/controlpanel/view/power.py:61
+msgid "Automatic power management (increases battery life)"
+msgstr "automatic power management(ogmante tan batri a ap bay)"
+
+#: ../src/controlpanel/view/power.py:89
+msgid ""
+"Extreme power management (disables wireless radio, increases battery life)"
+msgstr "(retire posibilite capte ond wireless, ogmante tan batri a ap bay)"
+
+#: ../src/view/devices/network/mesh.py:111
msgid "Connected to a School Mesh Portal"
-msgstr "Konekte sou rezo lekòl la"
+msgstr "Konekte sou pòtay rezo lekòl la"
-#: ../src/view/devices/network/mesh.py:110
+#: ../src/view/devices/network/mesh.py:113
msgid "Looking for a School Mesh Portal..."
-msgstr "Ap chache rezo lekòl la"
+msgstr "Ap chache pòtay rezo lekòl la"
-#: ../src/view/devices/network/mesh.py:113
+#: ../src/view/devices/network/mesh.py:116
msgid "Connected to an XO Mesh Portal"
-msgstr "Konekte sou yon rezo XO"
+msgstr "Konekte sou pòtal yon rezo XO"
-#: ../src/view/devices/network/mesh.py:115
+#: ../src/view/devices/network/mesh.py:118
msgid "Looking for an XO Mesh Portal..."
msgstr "Ap chache yon rezo XO..."
-#: ../src/view/devices/network/mesh.py:118
+#: ../src/view/devices/network/mesh.py:121
msgid "Connected to a Simple Mesh"
msgstr "Konekte sou yon senp rezo"
-#: ../src/view/devices/network/mesh.py:120
+#: ../src/view/devices/network/mesh.py:123
msgid "Starting a Simple Mesh"
msgstr "Kòmanse yon senp rezo"
-#: ../src/view/devices/network/mesh.py:127
+#: ../src/view/devices/network/mesh.py:130
msgid "Unknown Mesh"
-msgstr "Rezo non idantifye"
+msgstr "Rezo maye inkoni"
-#: ../src/view/frame/activitiestray.py:224
+#: ../src/view/frame/activitiestray.py:210
msgid "Decline"
-msgstr ""
+msgstr "Refize"
+
+#: ../src/view/home/favoritesview.py:287
+msgid "Registration Failed"
+msgstr "enskripsyon an pa fèt"
+
+# se yon kòd enfòmatik li pa dwe chanje
+#: ../src/view/home/favoritesview.py:288
+#, python-format
+msgid "%s"
+msgstr "%s"
-#: ../src/view/home/favoritesview.py:351
+#: ../src/view/home/favoritesview.py:290
+msgid "Registration Successful"
+msgstr "enskripsyon an fèt"
+
+#: ../src/view/home/favoritesview.py:291
+msgid "You are now registered with your school server."
+msgstr "ou pa enskri avek sèvè lekol ou a"
+
+#: ../src/view/home/favoritesview.py:407
msgid "Control Panel"
-msgstr ""
+msgstr "Pano kontwòl"
-#: ../src/view/home/favoritesview.py:362
+#: ../src/view/home/favoritesview.py:418
msgid "Restart"
-msgstr ""
+msgstr "Redemare"
-#: ../src/view/home/favoritesview.py:367
+#: ../src/view/home/favoritesview.py:423
msgid "Shutdown"
-msgstr "Fèmen"
+msgstr "Eten'n"
-#: ../src/view/home/favoritesview.py:373
+#: ../src/view/home/favoritesview.py:429
msgid "Register"
msgstr "Enskri"
-#: ../src/view/palettes.py:41
+#: ../src/view/palettes.py:42
msgid "Starting..."
-msgstr "ap louvri"
+msgstr "Demaraj...."
-#: ../src/view/palettes.py:71
+#: ../src/view/palettes.py:72
msgid "Stop"
msgstr "Stope, rete"
-#: ../src/view/palettes.py:96
+#: ../src/view/palettes.py:104
msgid "Start"
-msgstr ""
+msgstr "Demare"
-#: ../src/view/palettes.py:119
+#: ../src/view/palettes.py:132
msgid "Remove favorite"
-msgstr ""
+msgstr "Siprime favori"
-#: ../src/view/palettes.py:123
+#: ../src/view/palettes.py:136
msgid "Make favorite"
-msgstr ""
+msgstr "Ajoute nan favori"
-#: ../src/view/palettes.py:169
+#: ../src/view/palettes.py:185
msgid "Show contents"
-msgstr ""
+msgstr "Afiche kontni yo"
-#: ../src/view/palettes.py:193
+#: ../src/view/palettes.py:209
#, python-format
msgid "%(free_space)d MB Free"
-msgstr ""
+msgstr "%(free_space)d MB vid"
+
+#~ msgid "<Ctrl>R"
+#~ msgstr "<Ctrl>R"
#~ msgid "off"
#~ msgstr "Etenn"
diff --git a/po/it.po b/po/it.po
index 3bdf280..b7cd241 100644
--- a/po/it.po
+++ b/po/it.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-07-23 07:44-0400\n"
-"PO-Revision-Date: 2008-07-25 11:08-0400\n"
+"POT-Creation-Date: 2008-09-19 00:30-0400\n"
+"PO-Revision-Date: 2008-09-19 17:32-0400\n"
"Last-Translator: Carlo Falciola <cfalciola@yahoo.it>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,31 +19,31 @@ msgstr ""
msgid "Name:"
msgstr "Nome:"
-#: ../src/intro/intro.py:94
+#: ../src/intro/intro.py:97
msgid "Click to change color:"
msgstr "Seleziona per cambiare colore:"
-#: ../src/intro/intro.py:145
+#: ../src/intro/intro.py:148
msgid "Back"
msgstr "Indietro"
-#: ../src/intro/intro.py:159 ../src/controlpanel/toolbar.py:61
+#: ../src/intro/intro.py:162 ../src/controlpanel/toolbar.py:61
msgid "Done"
msgstr "Fatto"
-#: ../src/intro/intro.py:162
+#: ../src/intro/intro.py:165
msgid "Next"
msgstr "Prossimo"
-#: ../src/view/BuddyMenu.py:58
+#: ../src/view/BuddyMenu.py:60
msgid "Remove friend"
msgstr "Rimuovi l'amico"
-#: ../src/view/BuddyMenu.py:61
+#: ../src/view/BuddyMenu.py:63
msgid "Make friend"
msgstr "Aggiungi agli amici"
-#: ../src/view/BuddyMenu.py:91
+#: ../src/view/BuddyMenu.py:92
#, python-format
msgid "Invite to %s"
msgstr "Invito per %s"
@@ -64,7 +64,7 @@ msgstr "Apri"
#. TODO: Implement stopping downloads
#. self._stop_item.connect('activate', self._stop_item_activate_cb)
#. self.append_menu_item(self._stop_item)
-#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:86
+#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:85
msgid "Keep"
msgstr "Memorizza"
@@ -89,52 +89,74 @@ msgstr "Tipo di Autenticazione:"
msgid "Encryption Type:"
msgstr "Tipo di Crittografia:"
-#: ../src/view/Shell.py:240
+#: ../src/hardware/schoolserver.py:17
+msgid "Cannot obtain data needed for registration."
+msgstr "Non riesco ad ottenere i dati necessari alla registrazione."
+
+#: ../src/hardware/schoolserver.py:31
+msgid "Cannot connect to the server."
+msgstr "Impossibile connettersi al server."
+
+#: ../src/hardware/schoolserver.py:36
+msgid "The server could not complete the request."
+msgstr "Il server non può completare la richiesta."
+
+#: ../src/view/Shell.py:251
msgid "Screenshot"
msgstr "Schermata"
-#: ../src/view/home/HomeBox.py:80
+#: ../src/view/home/HomeBox.py:79
msgid "Confirm erase"
msgstr "Conferma cancellazione"
-#: ../src/view/home/HomeBox.py:82
+#: ../src/view/home/HomeBox.py:81
#, python-format
msgid "Confirm erase: Do you want to permanently erase %s?"
msgstr ""
"Conferma cancellazione: Sei sicuro di voler eliminare definitivamente %s?"
-#: ../src/view/home/HomeBox.py:89 ../src/view/palettes.py:120
+#: ../src/view/home/HomeBox.py:88 ../src/view/palettes.py:120
msgid "Erase"
msgstr "Cancella"
-#: ../src/view/home/HomeBox.py:215
+#: ../src/view/home/HomeBox.py:118
+msgid "Software Update"
+msgstr "Aggiornamento software"
+
+#: ../src/view/home/HomeBox.py:119
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr ""
+"Aggiorna le tue attività perchè siano compatibili con il tuo sistema "
+"aggiornato."
+
+#: ../src/view/home/HomeBox.py:123 ../src/controlpanel/toolbar.py:115
+msgid "Cancel"
+msgstr "Annulla"
+
+#: ../src/view/home/HomeBox.py:125 ../src/controlpanel/gui.py:286
+msgid "Later"
+msgstr "Dopo"
+
+#: ../src/view/home/HomeBox.py:128
+msgid "Check now"
+msgstr "Verifica adesso"
+
+#: ../src/view/home/HomeBox.py:262
msgid "List view"
msgstr "Vista Elenco"
-#: ../src/view/home/HomeBox.py:216
+#: ../src/view/home/HomeBox.py:263
msgid "<Ctrl>2"
msgstr "<Ctrl>2"
-#: ../src/view/home/HomeBox.py:273
+#: ../src/view/home/HomeBox.py:321
msgid "Favorites view"
msgstr "Visualizza i Preferiti"
-#: ../src/view/home/HomeBox.py:274
+#: ../src/view/home/HomeBox.py:322
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
-# TRANS: label for the freeform layout in the favorites view
-#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/HomeBox.py:282
-msgid "Freeform"
-msgstr "Formato libero"
-
-# TRANS: label for the ring layout in the favorites view
-#. TRANS: label for the ring layout in the favorites view
-#: ../src/view/home/HomeBox.py:289
-msgid "Ring"
-msgstr "Anello"
-
#: ../src/view/home/MeshBox.py:97
msgid "Connect"
msgstr "Connetti"
@@ -162,9 +184,10 @@ msgid "Connected"
msgstr "Connesso"
# A complete translation in italian: "rete a maglie" becames a tautology
-#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:41
-#: ../src/view/devices/network/mesh.py:68
-#: ../src/view/devices/network/mesh.py:72
+#. only temporarily
+#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:51
+#: ../src/view/devices/network/mesh.py:92
+#: ../src/view/devices/network/mesh.py:96
msgid "Mesh Network"
msgstr "Rete Mesh"
@@ -172,8 +195,8 @@ msgstr "Rete Mesh"
# 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
-#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:119
-#: ../src/view/devices/network/mesh.py:89
+#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:160
+#: ../src/view/devices/network/mesh.py:125
msgid "Disconnect..."
msgstr "Disconnessione..."
@@ -218,28 +241,33 @@ msgstr "riAttiva"
msgid "Mute"
msgstr "Silenzia"
-#: ../src/view/devices/network/wireless.py:67
+#: ../src/view/devices/network/wireless.py:37
+#, python-format
+msgid "IP address: %s"
+msgstr "indirizzo IP: %s"
+
+#: ../src/view/devices/network/wireless.py:86
msgid "Disconnected"
msgstr "Disconnesso"
-#: ../src/view/devices/network/wireless.py:137
+#: ../src/view/devices/network/wireless.py:178
msgid "Channel"
msgstr "Canale"
# Letterale "Vicinato", sperimentale: I miei vicini
-#: ../src/view/frame/zoomtoolbar.py:34
+#: ../src/view/frame/zoomtoolbar.py:37
msgid "Neighborhood"
msgstr "I miei vicini"
-#: ../src/view/frame/zoomtoolbar.py:36
+#: ../src/view/frame/zoomtoolbar.py:39
msgid "Group"
msgstr "Gruppo"
-#: ../src/view/frame/zoomtoolbar.py:38
+#: ../src/view/frame/zoomtoolbar.py:41
msgid "Home"
msgstr "Casa"
-#: ../src/view/frame/zoomtoolbar.py:40
+#: ../src/view/frame/zoomtoolbar.py:43
msgid "Activity"
msgstr "Attività"
@@ -273,6 +301,7 @@ msgid ""
" -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"
+" -c key clear the current value for the key \n"
" "
msgstr ""
"Utilizzo: sugar-control-panel [ opzioni ] key [ args ... ] \n"
@@ -285,35 +314,27 @@ msgstr ""
" -s key assegna il valore corrente alla \"key\" \n"
" "
-#: ../src/controlpanel/cmd.py:45
+#: ../src/controlpanel/cmd.py:46
msgid "To apply your changes you have to restart sugar.\n"
msgstr "Per applicare le modifiche è necessario riavviare sugar.\n"
-#: ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr "Annulla"
-
-#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:294
+#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:305
msgid "Ok"
msgstr "Ok"
-#: ../src/controlpanel/sectionview.py:34 ../src/controlpanel/gui.py:260
+#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:278
msgid "Changes require restart"
msgstr "Le modifiche rendono necessario un riavvio"
-#: ../src/controlpanel/gui.py:259
+#: ../src/controlpanel/gui.py:277
msgid "Warning"
msgstr "Attenzione"
-#: ../src/controlpanel/gui.py:263
+#: ../src/controlpanel/gui.py:281
msgid "Cancel changes"
msgstr "Annulla modifiche"
-#: ../src/controlpanel/gui.py:267
-msgid "Later"
-msgstr "Dopo"
-
-#: ../src/controlpanel/gui.py:271
+#: ../src/controlpanel/gui.py:290
msgid "Restart now"
msgstr "Riavvia adesso"
@@ -353,7 +374,7 @@ msgstr "Errore nella definizione dei colori."
msgid "Not available"
msgstr "Non disponibile"
-#: ../src/controlpanel/model/datetime.py:85
+#: ../src/controlpanel/model/datetime.py:89
msgid "Error timezone does not exist."
msgstr "Errore, timezone non esistente."
@@ -365,25 +386,21 @@ msgstr "Valore deve essere un intero."
msgid "Could not access ~/.i18n. Create standard settings."
msgstr "Impossibile accedere a ~/.i18n. Creazione configurazione standard."
-#: ../src/controlpanel/model/language.py:104
+#: ../src/controlpanel/model/language.py:114
#, python-format
msgid "Language for code=%s could not be determined."
msgstr "Linguaggio con codice=%s sconosciuto."
-#: ../src/controlpanel/model/language.py:121
+#: ../src/controlpanel/model/language.py:131
#, python-format
msgid "Sorry I do not speak '%s'."
msgstr "Spiacente, ma non parlo '%s'."
-#: ../src/controlpanel/model/network.py:48
-msgid "You must enter a server."
-msgstr "Devi inserire un server."
-
-#: ../src/controlpanel/model/network.py:63
+#: ../src/controlpanel/model/network.py:62
msgid "State is unknown."
msgstr "Stato sconosciuto."
-#: ../src/controlpanel/model/network.py:83
+#: ../src/controlpanel/model/network.py:82
msgid "Error in specified radio argument use on/off."
msgstr "Errore nel campo specificato, utilizzare on/off."
@@ -404,30 +421,60 @@ msgstr "Informazioni su"
msgid "Click to change your color:"
msgstr "Seleziona per cambiare il tuo colore:"
-#: ../src/controlpanel/view/aboutxo.py:26
+#: ../src/controlpanel/view/aboutxo.py:28
msgid "About my XO"
msgstr "Informazioni sul mio XO"
-#: ../src/controlpanel/view/aboutxo.py:47
+#: ../src/controlpanel/view/aboutxo.py:59
msgid "Identity"
msgstr "Identità"
-#: ../src/controlpanel/view/aboutxo.py:56
+#: ../src/controlpanel/view/aboutxo.py:68
msgid "Serial Number:"
msgstr "Numero di Serie:"
-#: ../src/controlpanel/view/aboutxo.py:79
+#: ../src/controlpanel/view/aboutxo.py:91
msgid "Software"
msgstr "Software"
-#: ../src/controlpanel/view/aboutxo.py:88
+#: ../src/controlpanel/view/aboutxo.py:100
msgid "Build:"
msgstr "Build:"
-#: ../src/controlpanel/view/aboutxo.py:103
+#: ../src/controlpanel/view/aboutxo.py:115
+msgid "Sugar:"
+msgstr "Sugar:"
+
+#: ../src/controlpanel/view/aboutxo.py:130
msgid "Firmware:"
msgstr "Firmware:"
+#: ../src/controlpanel/view/aboutxo.py:152
+msgid "Copyright and License"
+msgstr "Copyright e Licenza"
+
+#: ../src/controlpanel/view/aboutxo.py:160
+msgid ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
+msgstr ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; e Contributori."
+
+#: ../src/controlpanel/view/aboutxo.py:167
+msgid ""
+"Sugar is the graphical user interface that you are looking at. Sugar is free "
+"software, covered by the GNU General Public License, and you are welcome to "
+"change it and/or distribute copies of it under certain conditions described "
+"therein."
+msgstr ""
+"Sugar è l'interfaccia utente che stai utilizzando in questo istante. Sugar è "
+"Software Libero, protetto dalla licenza General Public License di GNU, e "
+"chiunque è il benvenuto per apportare modifiche e migliorie e/o distribuirne "
+"copie, alle condizioni descritte nella licenza medesima."
+
+#: ../src/controlpanel/view/aboutxo.py:179
+msgid "Full license:"
+msgstr "Testo della Licenza:"
+
#: ../src/controlpanel/view/datetime.py:29
msgid "Date & Time"
msgstr "Data e Ora"
@@ -474,19 +521,32 @@ msgstr "Lingua"
msgid "Network"
msgstr "Network"
-#: ../src/controlpanel/view/network.py:53
+#: ../src/controlpanel/view/network.py:54
msgid "Wireless"
msgstr "Wireless"
-#: ../src/controlpanel/view/network.py:61
-msgid "Radio:"
-msgstr "Radio:"
+#: ../src/controlpanel/view/network.py:62
+msgid "Turn of the wireless radio to save battery life"
+msgstr "Spegni il trasmettitore radio di rete per risparmiare la batteria"
-#: ../src/controlpanel/view/network.py:94
+#: ../src/controlpanel/view/network.py:75
+msgid "Radio"
+msgstr "Radio"
+
+#: ../src/controlpanel/view/network.py:91
+msgid "Discard network history if you have trouble connecting to the network"
+msgstr ""
+"Elimina lo storico delle connessioni di rete se hai problemi di connessione"
+
+#: ../src/controlpanel/view/network.py:100
+msgid "Discard network history"
+msgstr "Elimina lo storico delle connessioni"
+
+#: ../src/controlpanel/view/network.py:113
msgid "Mesh"
msgstr "Mesh"
-#: ../src/controlpanel/view/network.py:103
+#: ../src/controlpanel/view/network.py:122
msgid "Server:"
msgstr "Server:"
@@ -511,33 +571,33 @@ msgstr ""
"Gestione Risparmio Energetico Estrema (spegne la connessione radio wireless, "
"incrementa la durata delle batterie)"
-#: ../src/view/devices/network/mesh.py:111
+#: ../src/view/devices/network/mesh.py:154
msgid "Connected to a School Mesh Portal"
msgstr "Connesso ad un Portale Mesh di scuola"
-#: ../src/view/devices/network/mesh.py:113
+#: ../src/view/devices/network/mesh.py:156
msgid "Looking for a School Mesh Portal..."
msgstr "Ricerca di un Portale Mesh di scuola..."
-#: ../src/view/devices/network/mesh.py:116
+#: ../src/view/devices/network/mesh.py:159
msgid "Connected to an XO Mesh Portal"
msgstr "Connesso ad un Portale Mesh XO"
-#: ../src/view/devices/network/mesh.py:118
+#: ../src/view/devices/network/mesh.py:161
msgid "Looking for an XO Mesh Portal..."
msgstr "Sto cercando un Portale Mesh XO..."
# Diretto?
-#: ../src/view/devices/network/mesh.py:121
+#: ../src/view/devices/network/mesh.py:164
msgid "Connected to a Simple Mesh"
msgstr "Connesso ad un Mesh Semplice"
# Diretto?
-#: ../src/view/devices/network/mesh.py:123
+#: ../src/view/devices/network/mesh.py:166
msgid "Starting a Simple Mesh"
msgstr "Attivazione Mesh Semplice"
-#: ../src/view/devices/network/mesh.py:130
+#: ../src/view/devices/network/mesh.py:173
msgid "Unknown Mesh"
msgstr "Mesh sconosciuto"
@@ -545,36 +605,36 @@ msgstr "Mesh sconosciuto"
msgid "Decline"
msgstr "Rinuncia"
-#: ../src/view/home/favoritesview.py:285
+#: ../src/view/home/favoritesview.py:296
msgid "Registration Failed"
msgstr "Registrazione Fallita"
-#: ../src/view/home/favoritesview.py:286
+#: ../src/view/home/favoritesview.py:297
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/view/home/favoritesview.py:288
+#: ../src/view/home/favoritesview.py:299
msgid "Registration Successful"
msgstr "Registrazione Effettuata"
-#: ../src/view/home/favoritesview.py:289
+#: ../src/view/home/favoritesview.py:300
msgid "You are now registered with your school server."
msgstr "Ora sei registrato sul tuo server di scuola"
-#: ../src/view/home/favoritesview.py:405
+#: ../src/view/home/favoritesview.py:420
msgid "Control Panel"
msgstr "Pannello di Controllo"
-#: ../src/view/home/favoritesview.py:416
+#: ../src/view/home/favoritesview.py:425
msgid "Restart"
msgstr "Riavvia"
-#: ../src/view/home/favoritesview.py:421
+#: ../src/view/home/favoritesview.py:430
msgid "Shutdown"
msgstr "Spegni"
-#: ../src/view/home/favoritesview.py:427
+#: ../src/view/home/favoritesview.py:436
msgid "Register"
msgstr "Registra"
@@ -590,23 +650,40 @@ msgstr "Chiudi"
msgid "Start"
msgstr "Avvia"
-#: ../src/view/palettes.py:132
+#: ../src/view/palettes.py:138
msgid "Remove favorite"
msgstr "Rimuovi preferito"
-#: ../src/view/palettes.py:136
+#: ../src/view/palettes.py:142
msgid "Make favorite"
msgstr "Definisci preferito"
-#: ../src/view/palettes.py:185
+#: ../src/view/palettes.py:191
msgid "Show contents"
msgstr "Mostra i contenuti"
-#: ../src/view/palettes.py:209
+#: ../src/view/palettes.py:215
#, python-format
msgid "%(free_space)d MB Free"
msgstr "%(free_space)d MB Liberi"
+# TRANS: label for the freeform layout in the favorites view
+#~ msgid "Freeform"
+#~ msgstr "Formato libero"
+
+# TRANS: label for the ring layout in the favorites view
+#~ msgid "Ring"
+#~ msgstr "Anello"
+
+#~ msgid "You must enter a server."
+#~ msgstr "Devi inserire un server."
+
+#~ msgid "© 2008 One Laptop per Child Assocation "
+#~ msgstr "© 2008 One Laptop per Child Association "
+
+#~ msgid "Sugar is the graphical user interface that "
+#~ msgstr "Sugar è l'interfaccia grafica utente che "
+
#~ msgid "<Ctrl>R"
#~ msgstr "<Ctrl>R"
diff --git a/po/ja.po b/po/ja.po
index e5903b0..54a6586 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-07-23 07:44-0400\n"
-"PO-Revision-Date: 2008-07-27 10:08-0400\n"
+"POT-Creation-Date: 2008-09-19 00:30-0400\n"
+"PO-Revision-Date: 2008-09-20 01:13-0400\n"
"Last-Translator: korakurider <korakurider@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,31 +19,31 @@ msgstr ""
msgid "Name:"
msgstr "名前:"
-#: ../src/intro/intro.py:94
+#: ../src/intro/intro.py:97
msgid "Click to change color:"
msgstr "クリックして色を変更:"
-#: ../src/intro/intro.py:145
+#: ../src/intro/intro.py:148
msgid "Back"
msgstr "戻る"
-#: ../src/intro/intro.py:159 ../src/controlpanel/toolbar.py:61
+#: ../src/intro/intro.py:162 ../src/controlpanel/toolbar.py:61
msgid "Done"
msgstr "完了"
-#: ../src/intro/intro.py:162
+#: ../src/intro/intro.py:165
msgid "Next"
msgstr "進む"
-#: ../src/view/BuddyMenu.py:58
+#: ../src/view/BuddyMenu.py:60
msgid "Remove friend"
msgstr "お友だちの登録削除"
-#: ../src/view/BuddyMenu.py:61
+#: ../src/view/BuddyMenu.py:63
msgid "Make friend"
msgstr "お友だちを登録"
-#: ../src/view/BuddyMenu.py:91
+#: ../src/view/BuddyMenu.py:92
#, python-format
msgid "Invite to %s"
msgstr "%s に招待する"
@@ -64,7 +64,7 @@ msgstr "開く"
#. TODO: Implement stopping downloads
#. self._stop_item.connect('activate', self._stop_item_activate_cb)
#. self.append_menu_item(self._stop_item)
-#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:86
+#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:85
msgid "Keep"
msgstr "ジャーナルに保存"
@@ -89,49 +89,71 @@ msgstr "認証タイプ:"
msgid "Encryption Type:"
msgstr "暗号タイプ:"
-#: ../src/view/Shell.py:240
+#: ../src/hardware/schoolserver.py:17
+msgid "Cannot obtain data needed for registration."
+msgstr "登録に必要なデータを取得できません"
+
+#: ../src/hardware/schoolserver.py:31
+msgid "Cannot connect to the server."
+msgstr "サーバーに接続できません"
+
+#: ../src/hardware/schoolserver.py:36
+msgid "The server could not complete the request."
+msgstr "サーバーは要求の処理を完了できませんでした"
+
+#: ../src/view/Shell.py:251
msgid "Screenshot"
msgstr "スクリーンショット"
-#: ../src/view/home/HomeBox.py:80
+#: ../src/view/home/HomeBox.py:79
msgid "Confirm erase"
msgstr "消去の確認"
-#: ../src/view/home/HomeBox.py:82
+#: ../src/view/home/HomeBox.py:81
#, python-format
msgid "Confirm erase: Do you want to permanently erase %s?"
msgstr "消去の確認: %s を完全に消去しますか?"
-#: ../src/view/home/HomeBox.py:89 ../src/view/palettes.py:120
+#: ../src/view/home/HomeBox.py:88 ../src/view/palettes.py:120
msgid "Erase"
msgstr "消去する"
-#: ../src/view/home/HomeBox.py:215
+#: ../src/view/home/HomeBox.py:118
+msgid "Software Update"
+msgstr "ソフトウェアの更新"
+
+#: ../src/view/home/HomeBox.py:119
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr "新しいソフトウェアとの互換性を保つため、アクティビティを更新してください"
+
+#: ../src/view/home/HomeBox.py:123 ../src/controlpanel/toolbar.py:115
+msgid "Cancel"
+msgstr "中止"
+
+#: ../src/view/home/HomeBox.py:125 ../src/controlpanel/gui.py:286
+msgid "Later"
+msgstr "あとで"
+
+#: ../src/view/home/HomeBox.py:128
+msgid "Check now"
+msgstr "今すぐ調べる"
+
+#: ../src/view/home/HomeBox.py:262
msgid "List view"
msgstr "リスト表示"
-#: ../src/view/home/HomeBox.py:216
+#: ../src/view/home/HomeBox.py:263
msgid "<Ctrl>2"
msgstr "<Ctrl>2"
-#: ../src/view/home/HomeBox.py:273
+#: ../src/view/home/HomeBox.py:321
msgid "Favorites view"
msgstr "お気に入り"
-#: ../src/view/home/HomeBox.py:274
+#: ../src/view/home/HomeBox.py:322
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
-#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/HomeBox.py:282
-msgid "Freeform"
-msgstr "自由に並べる"
-
-#. TRANS: label for the ring layout in the favorites view
-#: ../src/view/home/HomeBox.py:289
-msgid "Ring"
-msgstr "円に並べる"
-
#: ../src/view/home/MeshBox.py:97
msgid "Connect"
msgstr "接続"
@@ -161,9 +183,10 @@ msgstr "接続しています..."
msgid "Connected"
msgstr "接続しました"
-#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:41
-#: ../src/view/devices/network/mesh.py:68
-#: ../src/view/devices/network/mesh.py:72
+#. only temporarily
+#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:51
+#: ../src/view/devices/network/mesh.py:92
+#: ../src/view/devices/network/mesh.py:96
msgid "Mesh Network"
msgstr "メッシュネットワーク"
@@ -171,8 +194,8 @@ msgstr "メッシュネットワーク"
# 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
-#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:119
-#: ../src/view/devices/network/mesh.py:89
+#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:160
+#: ../src/view/devices/network/mesh.py:125
msgid "Disconnect..."
msgstr "切断..."
@@ -217,27 +240,32 @@ msgstr "音を出す"
msgid "Mute"
msgstr "音を消す"
-#: ../src/view/devices/network/wireless.py:67
+#: ../src/view/devices/network/wireless.py:37
+#, python-format
+msgid "IP address: %s"
+msgstr "IPアドレス: %s"
+
+#: ../src/view/devices/network/wireless.py:86
msgid "Disconnected"
msgstr "切断されました"
-#: ../src/view/devices/network/wireless.py:137
+#: ../src/view/devices/network/wireless.py:178
msgid "Channel"
msgstr "チャンネル"
-#: ../src/view/frame/zoomtoolbar.py:34
+#: ../src/view/frame/zoomtoolbar.py:37
msgid "Neighborhood"
msgstr "お隣さん"
-#: ../src/view/frame/zoomtoolbar.py:36
+#: ../src/view/frame/zoomtoolbar.py:39
msgid "Group"
msgstr "グループ"
-#: ../src/view/frame/zoomtoolbar.py:38
+#: ../src/view/frame/zoomtoolbar.py:41
msgid "Home"
msgstr "ホーム"
-#: ../src/view/frame/zoomtoolbar.py:40
+#: ../src/view/frame/zoomtoolbar.py:43
msgid "Activity"
msgstr "アクティビティ"
@@ -268,47 +296,41 @@ msgid ""
" -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"
+" -c key clear the current value for the key \n"
" "
msgstr ""
"使い方: sugar-control-panel [ option ] key [ args ... ] \n"
-" Control for the sugar environment. \n"
+" Sugarの環境を設定する。 \n"
" Options: \n"
" -h このヘルプメッセージを表示して終了する\n"
" -l 全ての有効なオプションを表示\n"
" -h key このキーについての情報を表示\n"
" -g key このキーの現在の設定値を取得\n"
" -s key このキーの値を設定 \n"
-" "
+" -c key このキーの設定を消去\n"
+" "
-#: ../src/controlpanel/cmd.py:45
+#: ../src/controlpanel/cmd.py:46
msgid "To apply your changes you have to restart sugar.\n"
msgstr "変更を適用するにはsugarを再起動しなければいけません。\n"
-#: ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr "中止"
-
-#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:294
+#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:305
msgid "Ok"
msgstr "了解"
-#: ../src/controlpanel/sectionview.py:34 ../src/controlpanel/gui.py:260
+#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:278
msgid "Changes require restart"
msgstr "変更には再起動が必要です"
-#: ../src/controlpanel/gui.py:259
+#: ../src/controlpanel/gui.py:277
msgid "Warning"
msgstr "注意"
-#: ../src/controlpanel/gui.py:263
+#: ../src/controlpanel/gui.py:281
msgid "Cancel changes"
msgstr "変更を取りやめる"
-#: ../src/controlpanel/gui.py:267
-msgid "Later"
-msgstr "あとで"
-
-#: ../src/controlpanel/gui.py:271
+#: ../src/controlpanel/gui.py:290
msgid "Restart now"
msgstr "今すぐ再起動"
@@ -348,7 +370,7 @@ msgstr "色の指定でエラー"
msgid "Not available"
msgstr "不明です"
-#: ../src/controlpanel/model/datetime.py:85
+#: ../src/controlpanel/model/datetime.py:89
msgid "Error timezone does not exist."
msgstr "エラー:そのタイムゾーンは存在しません。"
@@ -360,25 +382,21 @@ msgstr "値は整数でなくてはなりません"
msgid "Could not access ~/.i18n. Create standard settings."
msgstr "~/.i18nにアクセスできませんでした。標準設定を作ってください。"
-#: ../src/controlpanel/model/language.py:104
+#: ../src/controlpanel/model/language.py:114
#, python-format
msgid "Language for code=%s could not be determined."
msgstr "コード%sの言語が不明です。"
-#: ../src/controlpanel/model/language.py:121
+#: ../src/controlpanel/model/language.py:131
#, python-format
msgid "Sorry I do not speak '%s'."
msgstr "ごめんなさい。'%s'は話せません。"
-#: ../src/controlpanel/model/network.py:48
-msgid "You must enter a server."
-msgstr "サーバーの指定が必要です"
-
-#: ../src/controlpanel/model/network.py:63
+#: ../src/controlpanel/model/network.py:62
msgid "State is unknown."
msgstr "状態が不明です"
-#: ../src/controlpanel/model/network.py:83
+#: ../src/controlpanel/model/network.py:82
msgid "Error in specified radio argument use on/off."
msgstr "radio引数指定でエラー、on/offを使ってください。"
@@ -398,30 +416,59 @@ msgstr "私について"
msgid "Click to change your color:"
msgstr "クリックして色を変更:"
-#: ../src/controlpanel/view/aboutxo.py:26
+#: ../src/controlpanel/view/aboutxo.py:28
msgid "About my XO"
msgstr "私のXOについて"
-#: ../src/controlpanel/view/aboutxo.py:47
+#: ../src/controlpanel/view/aboutxo.py:59
msgid "Identity"
msgstr "個体の識別"
-#: ../src/controlpanel/view/aboutxo.py:56
+#: ../src/controlpanel/view/aboutxo.py:68
msgid "Serial Number:"
msgstr "シリアル番号:"
-#: ../src/controlpanel/view/aboutxo.py:79
+#: ../src/controlpanel/view/aboutxo.py:91
msgid "Software"
msgstr "ソフトウェア"
-#: ../src/controlpanel/view/aboutxo.py:88
+#: ../src/controlpanel/view/aboutxo.py:100
msgid "Build:"
msgstr "ビルド:"
-#: ../src/controlpanel/view/aboutxo.py:103
+#: ../src/controlpanel/view/aboutxo.py:115
+msgid "Sugar:"
+msgstr "Sugar:"
+
+#: ../src/controlpanel/view/aboutxo.py:130
msgid "Firmware:"
msgstr "ファームウェア:"
+#: ../src/controlpanel/view/aboutxo.py:152
+msgid "Copyright and License"
+msgstr "著作権とライセンス"
+
+#: ../src/controlpanel/view/aboutxo.py:160
+msgid ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
+msgstr ""
+"(C) 2008 One Laptop per Child Association Inc; Red Hat Inc; and "
+"Contributors."
+
+#: ../src/controlpanel/view/aboutxo.py:167
+msgid ""
+"Sugar is the graphical user interface that you are looking at. Sugar is free "
+"software, covered by the GNU General Public License, and you are welcome to "
+"change it and/or distribute copies of it under certain conditions described "
+"therein."
+msgstr ""
+"Sugarは、あなたが見ているグラフィカルユーザインターフェースです。Sugarはフリーソフトウェアで、GNU General Public Licen"
+"se(一般公衆利用許諾契約書)による保護対象です。ここに記載されている条件の範囲で、Sugarを変更したりコピーを配布することが自由に行えます。"
+
+#: ../src/controlpanel/view/aboutxo.py:179
+msgid "Full license:"
+msgstr "ライセンス全文:"
+
#: ../src/controlpanel/view/datetime.py:29
msgid "Date & Time"
msgstr "日付・時刻"
@@ -468,19 +515,31 @@ msgstr "言語"
msgid "Network"
msgstr "ネットワーク"
-#: ../src/controlpanel/view/network.py:53
+#: ../src/controlpanel/view/network.py:54
msgid "Wireless"
msgstr "無線"
-#: ../src/controlpanel/view/network.py:61
-msgid "Radio:"
-msgstr "電波:"
+#: ../src/controlpanel/view/network.py:62
+msgid "Turn of the wireless radio to save battery life"
+msgstr "電池を節約するため、無線を止める"
+
+#: ../src/controlpanel/view/network.py:75
+msgid "Radio"
+msgstr "電波"
-#: ../src/controlpanel/view/network.py:94
+#: ../src/controlpanel/view/network.py:91
+msgid "Discard network history if you have trouble connecting to the network"
+msgstr "ネットワーク接続で問題がある場合、接続履歴を破棄します"
+
+#: ../src/controlpanel/view/network.py:100
+msgid "Discard network history"
+msgstr "ネットワーク接続履歴を破棄"
+
+#: ../src/controlpanel/view/network.py:113
msgid "Mesh"
msgstr "メッシュ"
-#: ../src/controlpanel/view/network.py:103
+#: ../src/controlpanel/view/network.py:122
msgid "Server:"
msgstr "サーバー:"
@@ -501,31 +560,31 @@ msgid ""
"Extreme power management (disables wireless radio, increases battery life)"
msgstr "最大の電源管理(無線の電波を停めて、電池を長持ちさせます)"
-#: ../src/view/devices/network/mesh.py:111
+#: ../src/view/devices/network/mesh.py:154
msgid "Connected to a School Mesh Portal"
msgstr "スクールメッシュポータルに接続しました。"
-#: ../src/view/devices/network/mesh.py:113
+#: ../src/view/devices/network/mesh.py:156
msgid "Looking for a School Mesh Portal..."
msgstr "スクールメッシュポータルを探しています..."
-#: ../src/view/devices/network/mesh.py:116
+#: ../src/view/devices/network/mesh.py:159
msgid "Connected to an XO Mesh Portal"
msgstr "XOメッシュポータルに接続しました"
-#: ../src/view/devices/network/mesh.py:118
+#: ../src/view/devices/network/mesh.py:161
msgid "Looking for an XO Mesh Portal..."
msgstr "XOメッシュポータルを探しています..."
-#: ../src/view/devices/network/mesh.py:121
+#: ../src/view/devices/network/mesh.py:164
msgid "Connected to a Simple Mesh"
msgstr "シンプルメッシュに接続しました"
-#: ../src/view/devices/network/mesh.py:123
+#: ../src/view/devices/network/mesh.py:166
msgid "Starting a Simple Mesh"
msgstr "シンプルメッシュを開始しています"
-#: ../src/view/devices/network/mesh.py:130
+#: ../src/view/devices/network/mesh.py:173
msgid "Unknown Mesh"
msgstr "不明なメッシュ"
@@ -533,36 +592,36 @@ msgstr "不明なメッシュ"
msgid "Decline"
msgstr "断る"
-#: ../src/view/home/favoritesview.py:285
+#: ../src/view/home/favoritesview.py:296
msgid "Registration Failed"
msgstr "登録失敗"
-#: ../src/view/home/favoritesview.py:286
+#: ../src/view/home/favoritesview.py:297
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/view/home/favoritesview.py:288
+#: ../src/view/home/favoritesview.py:299
msgid "Registration Successful"
msgstr "登録成功"
-#: ../src/view/home/favoritesview.py:289
+#: ../src/view/home/favoritesview.py:300
msgid "You are now registered with your school server."
msgstr "あなたはスクールサーバーに登録されました"
-#: ../src/view/home/favoritesview.py:405
+#: ../src/view/home/favoritesview.py:420
msgid "Control Panel"
msgstr "コントロールパネル"
-#: ../src/view/home/favoritesview.py:416
+#: ../src/view/home/favoritesview.py:425
msgid "Restart"
msgstr "再起動"
-#: ../src/view/home/favoritesview.py:421
+#: ../src/view/home/favoritesview.py:430
msgid "Shutdown"
msgstr "シャットダウン"
-#: ../src/view/home/favoritesview.py:427
+#: ../src/view/home/favoritesview.py:436
msgid "Register"
msgstr "登録"
@@ -578,23 +637,34 @@ msgstr "停止"
msgid "Start"
msgstr "開始"
-#: ../src/view/palettes.py:132
+#: ../src/view/palettes.py:138
msgid "Remove favorite"
msgstr "お気に入りから削除"
-#: ../src/view/palettes.py:136
+#: ../src/view/palettes.py:142
msgid "Make favorite"
msgstr "お気に入りに登録"
-#: ../src/view/palettes.py:185
+#: ../src/view/palettes.py:191
msgid "Show contents"
msgstr "内容を表示"
-#: ../src/view/palettes.py:209
+#: ../src/view/palettes.py:215
#, python-format
msgid "%(free_space)d MB Free"
msgstr "%(free_space)d MB 空き"
+# TRANS: label for the freeform layout in the favorites view
+#~ msgid "Freeform"
+#~ msgstr "自由に並べる"
+
+# TRANS: label for the ring layout in the favorites view
+#~ msgid "Ring"
+#~ msgstr "円に並べる"
+
+#~ msgid "You must enter a server."
+#~ msgstr "サーバーの指定が必要です"
+
#, fuzzy
#~ msgid "off"
#~ msgstr "オフ"
diff --git a/po/mn.po b/po/mn.po
index ec3dfb6..9948204 100644
--- a/po/mn.po
+++ b/po/mn.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-07-23 07:44-0400\n"
-"PO-Revision-Date: 2008-08-07 01:30-0400\n"
+"POT-Creation-Date: 2008-08-19 17:12-0400\n"
+"PO-Revision-Date: 2008-09-18 17:06-0400\n"
"Last-Translator: Odontsetseg Bat-Erdene <obat-erdene@suffolk.edu>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,19 +19,19 @@ msgstr ""
msgid "Name:"
msgstr "Нэр:"
-#: ../src/intro/intro.py:94
+#: ../src/intro/intro.py:97
msgid "Click to change color:"
msgstr "Энд дарж өнгөө солино уу"
-#: ../src/intro/intro.py:145
+#: ../src/intro/intro.py:148
msgid "Back"
msgstr "Буцах"
-#: ../src/intro/intro.py:159 ../src/controlpanel/toolbar.py:61
+#: ../src/intro/intro.py:162 ../src/controlpanel/toolbar.py:61
msgid "Done"
msgstr "Боллоо"
-#: ../src/intro/intro.py:162
+#: ../src/intro/intro.py:165
msgid "Next"
msgstr "Дараах"
@@ -64,7 +64,7 @@ msgstr "Нээх"
#. TODO: Implement stopping downloads
#. self._stop_item.connect('activate', self._stop_item_activate_cb)
#. self.append_menu_item(self._stop_item)
-#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:86
+#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:87
msgid "Keep"
msgstr "Хадгалах"
@@ -89,48 +89,80 @@ msgstr "Нэвтрэх нууцлалын төрөл:"
msgid "Encryption Type:"
msgstr "Нууцлалын төрөл:"
+#: ../src/hardware/schoolserver.py:17
+msgid "Cannot obtain data needed for registration."
+msgstr "Бүртгүүлэхэд хэрэгтэй мэдээлэл аваж чадахгүй."
+
+#: ../src/hardware/schoolserver.py:31
+msgid "Cannot connect to the server."
+msgstr "Серверт холбогдож чадахгүй байна."
+
+#: ../src/hardware/schoolserver.py:36
+msgid "The server could not complete the request."
+msgstr "Сервер хүсэлт биэлүүлэж чадаагүй."
+
#: ../src/view/Shell.py:240
msgid "Screenshot"
msgstr "Дэлгэцний зураг"
-#: ../src/view/home/HomeBox.py:80
+#: ../src/view/home/HomeBox.py:81
msgid "Confirm erase"
msgstr "Арилгахыг зөвшөөрөх"
-#: ../src/view/home/HomeBox.py:82
+#: ../src/view/home/HomeBox.py:83
#, python-format
msgid "Confirm erase: Do you want to permanently erase %s?"
msgstr "Арилгахыг зөвшөөрөх: Та %s бүр мөсөн арилгахыг хүсч байна уу?"
-#: ../src/view/home/HomeBox.py:89 ../src/view/palettes.py:120
+#: ../src/view/home/HomeBox.py:90 ../src/view/palettes.py:120
msgid "Erase"
msgstr "Арилгах"
-#: ../src/view/home/HomeBox.py:215
+#: ../src/view/home/HomeBox.py:120
+msgid "Software Update"
+msgstr "Хангамж Шинэчлэх"
+
+#: ../src/view/home/HomeBox.py:121
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr "Шинэ хангамжид тохируулахыг батлахын тулд үйл ажилагаануудаа шинэчлэх"
+
+#: ../src/view/home/HomeBox.py:125 ../src/controlpanel/toolbar.py:115
+msgid "Cancel"
+msgstr "Болих"
+
+#: ../src/view/home/HomeBox.py:127 ../src/controlpanel/gui.py:275
+msgid "Later"
+msgstr "Дараа"
+
+#: ../src/view/home/HomeBox.py:130
+msgid "Check now"
+msgstr "Одоо шалгах"
+
+#: ../src/view/home/HomeBox.py:266
msgid "List view"
msgstr "Жагсаалтыг харах"
-#: ../src/view/home/HomeBox.py:216
+#: ../src/view/home/HomeBox.py:267
msgid "<Ctrl>2"
msgstr "<Ctrl>2"
-#: ../src/view/home/HomeBox.py:273
+#: ../src/view/home/HomeBox.py:325
msgid "Favorites view"
msgstr "Дуртай зүйлсийг үзэх"
-#: ../src/view/home/HomeBox.py:274
+#: ../src/view/home/HomeBox.py:326
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/HomeBox.py:282
+#: ../src/view/home/HomeBox.py:334
msgid "Freeform"
msgstr "Дурын хэлбэр"
# TRANS: label for the ring layout in the favorites view
#. TRANS: label for the ring layout in the favorites view
-#: ../src/view/home/HomeBox.py:289
+#: ../src/view/home/HomeBox.py:341
msgid "Ring"
msgstr "Цагираг"
@@ -201,7 +233,7 @@ msgstr "Цэнэг маш бага байна"
#: ../src/view/devices/battery.py:123
#, python-format
msgid "%(hour)d:%(min).2d remaining"
-msgstr "%(цаг)d:%(мин).2d үлдлээ"
+msgstr "%(hour)d:%(min).2d үлдлээ"
#: ../src/view/devices/battery.py:127
msgid "Charged"
@@ -227,19 +259,19 @@ msgstr "Салгагдсан"
msgid "Channel"
msgstr "Суваг"
-#: ../src/view/frame/zoomtoolbar.py:34
+#: ../src/view/frame/zoomtoolbar.py:37
msgid "Neighborhood"
msgstr "Хөршүүд"
-#: ../src/view/frame/zoomtoolbar.py:36
+#: ../src/view/frame/zoomtoolbar.py:39
msgid "Group"
msgstr "Бүлэг"
-#: ../src/view/frame/zoomtoolbar.py:38
+#: ../src/view/frame/zoomtoolbar.py:41
msgid "Home"
msgstr "Нүүр хуудас"
-#: ../src/view/frame/zoomtoolbar.py:40
+#: ../src/view/frame/zoomtoolbar.py:43
msgid "Activity"
msgstr "Үйл ажиллагаа"
@@ -270,47 +302,40 @@ msgid ""
" -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"
+" -c key clear the current value for the key \n"
" "
msgstr ""
-"Хэрэглээ: sugar-удирдах-самбар [ сонголт ] товч [ аргумент ... ] \n"
-"Sugar-ийн орчны хяналт. \n"
-"Сонголтууд: \n"
-"-х Энэ тусламжын мэдээ үзүүлэх ба гаргах\n"
-"-л Боломжит сонголтын үзүүлэлтүүд \n"
-"-х товч Товчны тухай мэдээлэл \n"
-"-а товч Товчны одоогийн ач холбогдлыг мэдэх \n"
-"-ы товч Товчны одоогийн ач холбогдлыг тохируулах \n"
-" "
-
-#: ../src/controlpanel/cmd.py:45
+"Хэрэглээ: sugar-удирдах-самбар [ сонголт ] товч [ аргумент ... ] \r\n"
+" Sugar-ийн орчны хяналт. \r\n"
+" Сонголтууд: \r\n"
+" -х Энэ тусламжын мэдээ үзүүлэх ба гаргах\r\n"
+" -л Боломжит сонголтын үзүүлэлтүүд \r\n"
+" -х товч Товчны тухай мэдээлэл \r\n"
+" -а товч Товчны одоогийн ач холбогдлыг мэдэх \r\n"
+" -ы товч Товчны одоогийн ач холбогдлыг тохируулах \r\n"
+" "
+
+#: ../src/controlpanel/cmd.py:46
msgid "To apply your changes you have to restart sugar.\n"
msgstr "Өөрчлөлтийг идэвхжүүлэхийн тулд та дахин эхлүүлэх шаардлагатай.\n"
-#: ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr "Болих"
-
-#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:294
+#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:296
msgid "Ok"
msgstr "Тийм"
-#: ../src/controlpanel/sectionview.py:34 ../src/controlpanel/gui.py:260
+#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:267
msgid "Changes require restart"
msgstr "Өөрчлөхийн тулд дахин эхлүүлэх хэрэгтэй"
-#: ../src/controlpanel/gui.py:259
+#: ../src/controlpanel/gui.py:266
msgid "Warning"
msgstr "Анхаар"
-#: ../src/controlpanel/gui.py:263
+#: ../src/controlpanel/gui.py:270
msgid "Cancel changes"
msgstr "Өөрчлөлтийг цуцлах"
-#: ../src/controlpanel/gui.py:267
-msgid "Later"
-msgstr "Дараа"
-
-#: ../src/controlpanel/gui.py:271
+#: ../src/controlpanel/gui.py:279
msgid "Restart now"
msgstr "Одоо эхлүүлэх үү"
@@ -536,36 +561,36 @@ msgstr "Үл мэдэгдэх тархалтын сүлжээ"
msgid "Decline"
msgstr "Үл зөвшөөрөх"
-#: ../src/view/home/favoritesview.py:285
+#: ../src/view/home/favoritesview.py:287
msgid "Registration Failed"
msgstr "Бүртгэл бүтэлгүйтлээ"
-#: ../src/view/home/favoritesview.py:286
+#: ../src/view/home/favoritesview.py:288
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/view/home/favoritesview.py:288
+#: ../src/view/home/favoritesview.py:290
msgid "Registration Successful"
msgstr "Бүртгэл амжилттай"
-#: ../src/view/home/favoritesview.py:289
+#: ../src/view/home/favoritesview.py:291
msgid "You are now registered with your school server."
msgstr "Та одоо сургуулийн серверт бүртгэгдлээ."
-#: ../src/view/home/favoritesview.py:405
+#: ../src/view/home/favoritesview.py:407
msgid "Control Panel"
msgstr "Удирдах Самбар"
-#: ../src/view/home/favoritesview.py:416
+#: ../src/view/home/favoritesview.py:418
msgid "Restart"
msgstr "Дахин эхлүүлэх"
-#: ../src/view/home/favoritesview.py:421
+#: ../src/view/home/favoritesview.py:423
msgid "Shutdown"
msgstr "Унтраах"
-#: ../src/view/home/favoritesview.py:427
+#: ../src/view/home/favoritesview.py:429
msgid "Register"
msgstr "Бүртгүүлэх"
diff --git a/po/nl.po b/po/nl.po
index 00e3bf6..44b423b 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-07-23 07:44-0400\n"
-"PO-Revision-Date: 2008-07-23 13:26-0400\n"
+"POT-Creation-Date: 2008-09-01 18:31-0400\n"
+"PO-Revision-Date: 2008-09-02 15:10-0400\n"
"Last-Translator: Myckel Habets <myckel@sdf.lonestar.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,19 +19,19 @@ msgstr ""
msgid "Name:"
msgstr "Naam:"
-#: ../src/intro/intro.py:94
+#: ../src/intro/intro.py:97
msgid "Click to change color:"
msgstr "Klik om de kleur te veranderen:"
-#: ../src/intro/intro.py:145
+#: ../src/intro/intro.py:148
msgid "Back"
msgstr "Terug"
-#: ../src/intro/intro.py:159 ../src/controlpanel/toolbar.py:61
+#: ../src/intro/intro.py:162 ../src/controlpanel/toolbar.py:61
msgid "Done"
msgstr "Klaar"
-#: ../src/intro/intro.py:162
+#: ../src/intro/intro.py:165
msgid "Next"
msgstr "Volgende"
@@ -43,14 +43,14 @@ msgstr "Verwijder vriend"
msgid "Make friend"
msgstr "Maak vriend"
-#: ../src/view/BuddyMenu.py:91
+#: ../src/view/BuddyMenu.py:90
#, python-format
msgid "Invite to %s"
msgstr "Nodig uit voor %s"
#: ../src/view/clipboardmenu.py:48
msgid "Remove"
-msgstr "Verwijder"
+msgstr "Verwijderen"
#: ../src/view/clipboardmenu.py:53 ../src/view/clipboardmenu.py:79
msgid "Open"
@@ -65,7 +65,7 @@ msgstr "Openen"
#. TODO: Implement stopping downloads
#. self._stop_item.connect('activate', self._stop_item_activate_cb)
#. self.append_menu_item(self._stop_item)
-#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:86
+#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:87
msgid "Keep"
msgstr "Bewaar"
@@ -90,48 +90,82 @@ msgstr "Authenticatie type:"
msgid "Encryption Type:"
msgstr "Encryptie type:"
-#: ../src/view/Shell.py:240
+#: ../src/hardware/schoolserver.py:17
+msgid "Cannot obtain data needed for registration."
+msgstr "Kan vereiste gegevens voor registratie niet verkrijgen."
+
+#: ../src/hardware/schoolserver.py:31
+msgid "Cannot connect to the server."
+msgstr "Kan niet met server verbinden."
+
+#: ../src/hardware/schoolserver.py:36
+msgid "The server could not complete the request."
+msgstr "De server kon de aanvraag niet voltooien."
+
+#: ../src/view/Shell.py:262
msgid "Screenshot"
msgstr "Schermafdruk"
-#: ../src/view/home/HomeBox.py:80
+#: ../src/view/home/HomeBox.py:81
msgid "Confirm erase"
msgstr "Bevestig wissen"
-#: ../src/view/home/HomeBox.py:82
+#: ../src/view/home/HomeBox.py:83
#, python-format
msgid "Confirm erase: Do you want to permanently erase %s?"
msgstr "Bevestig wissen: Wilt u permanent %s wissen?"
-#: ../src/view/home/HomeBox.py:89 ../src/view/palettes.py:120
+#: ../src/view/home/HomeBox.py:90 ../src/view/palettes.py:120
msgid "Erase"
msgstr "Wissen"
-#: ../src/view/home/HomeBox.py:215
+#: ../src/view/home/HomeBox.py:120
+msgid "Software Update"
+msgstr "Software update"
+
+#: ../src/view/home/HomeBox.py:121
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr ""
+"Update je activiteiten om er zeker van te zijn dat ze met je nieuwe software "
+"compatibel zijn."
+
+#: ../src/view/home/HomeBox.py:125 ../src/controlpanel/toolbar.py:115
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: ../src/view/home/HomeBox.py:127 ../src/controlpanel/gui.py:276
+msgid "Later"
+msgstr "Later"
+
+#: ../src/view/home/HomeBox.py:130
+msgid "Check now"
+msgstr "Controleer nu"
+
+#: ../src/view/home/HomeBox.py:266
msgid "List view"
msgstr "Lijstweergave"
-#: ../src/view/home/HomeBox.py:216
+#: ../src/view/home/HomeBox.py:267
msgid "<Ctrl>2"
msgstr "<Ctrl>2"
-#: ../src/view/home/HomeBox.py:273
+#: ../src/view/home/HomeBox.py:325
msgid "Favorites view"
msgstr "Favorietenweergave"
-#: ../src/view/home/HomeBox.py:274
+#: ../src/view/home/HomeBox.py:326
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/HomeBox.py:282
+#: ../src/view/home/HomeBox.py:334
msgid "Freeform"
msgstr "VrijeVorm"
# TRANS: label for the ring layout in the favorites view
#. TRANS: label for the ring layout in the favorites view
-#: ../src/view/home/HomeBox.py:289
+#: ../src/view/home/HomeBox.py:341
msgid "Ring"
msgstr "Ring"
@@ -156,14 +190,15 @@ msgstr "Verbinden..."
msgid "Connected"
msgstr "Verbonden"
-#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:41
-#: ../src/view/devices/network/mesh.py:68
-#: ../src/view/devices/network/mesh.py:72
+#. only temporarily
+#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:51
+#: ../src/view/devices/network/mesh.py:92
+#: ../src/view/devices/network/mesh.py:96
msgid "Mesh Network"
msgstr "Mesh netwerk"
-#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:119
-#: ../src/view/devices/network/mesh.py:89
+#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:160
+#: ../src/view/devices/network/mesh.py:125
msgid "Disconnect..."
msgstr "Verbinding verbreken..."
@@ -208,27 +243,32 @@ msgstr "Ontdempen"
msgid "Mute"
msgstr "Dempen"
-#: ../src/view/devices/network/wireless.py:67
+#: ../src/view/devices/network/wireless.py:37
+#, python-format
+msgid "IP address: %s"
+msgstr "IP adres: %s"
+
+#: ../src/view/devices/network/wireless.py:86
msgid "Disconnected"
msgstr "Verbinding verbroken"
-#: ../src/view/devices/network/wireless.py:137
+#: ../src/view/devices/network/wireless.py:178
msgid "Channel"
msgstr "Kanaal"
-#: ../src/view/frame/zoomtoolbar.py:34
+#: ../src/view/frame/zoomtoolbar.py:37
msgid "Neighborhood"
msgstr "Omgeving"
-#: ../src/view/frame/zoomtoolbar.py:36
+#: ../src/view/frame/zoomtoolbar.py:39
msgid "Group"
msgstr "Groep"
-#: ../src/view/frame/zoomtoolbar.py:38
+#: ../src/view/frame/zoomtoolbar.py:41
msgid "Home"
msgstr "Thuis"
-#: ../src/view/frame/zoomtoolbar.py:40
+#: ../src/view/frame/zoomtoolbar.py:43
msgid "Activity"
msgstr "Activiteit"
@@ -261,6 +301,7 @@ msgid ""
" -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"
+" -c key clear the current value for the key \n"
" "
msgstr ""
"Gebruik: sugar-control-panel [ optie ] sleutel [ args ... ] \n"
@@ -271,37 +312,30 @@ msgstr ""
" -h sleutel geef informatie over deze sleutel \n"
" -g sleutel verkrijg de huidige waarde van de sleutel \n"
" -s sleutel zet de huidige waarde naar de sleutel \n"
+" -c sleutel wis de huidige waarde van de sleutel \n"
" "
-#: ../src/controlpanel/cmd.py:45
+#: ../src/controlpanel/cmd.py:46
msgid "To apply your changes you have to restart sugar.\n"
msgstr "Om uw veranderingen toe te passen moet u sugar herstarten.\r\n"
-#: ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:294
+#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:296
msgid "Ok"
msgstr "Ok"
-#: ../src/controlpanel/sectionview.py:34 ../src/controlpanel/gui.py:260
+#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:268
msgid "Changes require restart"
msgstr "Verandering vereist een herstart"
-#: ../src/controlpanel/gui.py:259
+#: ../src/controlpanel/gui.py:267
msgid "Warning"
msgstr "Waarschuwing"
-#: ../src/controlpanel/gui.py:263
+#: ../src/controlpanel/gui.py:271
msgid "Cancel changes"
msgstr "Veranderingen annuleren"
-#: ../src/controlpanel/gui.py:267
-msgid "Later"
-msgstr "Later"
-
-#: ../src/controlpanel/gui.py:271
+#: ../src/controlpanel/gui.py:280
msgid "Restart now"
msgstr "Herstart nu"
@@ -353,12 +387,12 @@ msgstr "Waarde moet een geheel getal zijn."
msgid "Could not access ~/.i18n. Create standard settings."
msgstr "Kon niet bij ~/.i18n komen. Standaard instellingen aanmaken."
-#: ../src/controlpanel/model/language.py:104
+#: ../src/controlpanel/model/language.py:110
#, python-format
msgid "Language for code=%s could not be determined."
msgstr "Taal voor code=%s kon niet bepaald worden."
-#: ../src/controlpanel/model/language.py:121
+#: ../src/controlpanel/model/language.py:127
#, python-format
msgid "Sorry I do not speak '%s'."
msgstr "Sorry, I spreek geen '%s'."
@@ -391,30 +425,61 @@ msgstr "Over mij"
msgid "Click to change your color:"
msgstr "Klik om de kleur te veranderen:"
-#: ../src/controlpanel/view/aboutxo.py:26
+#: ../src/controlpanel/view/aboutxo.py:28
msgid "About my XO"
msgstr "Over mijn XO"
-#: ../src/controlpanel/view/aboutxo.py:47
+#: ../src/controlpanel/view/aboutxo.py:59
msgid "Identity"
msgstr "Identiteit"
-#: ../src/controlpanel/view/aboutxo.py:56
+#: ../src/controlpanel/view/aboutxo.py:68
msgid "Serial Number:"
msgstr "Serienummer:"
-#: ../src/controlpanel/view/aboutxo.py:79
+#: ../src/controlpanel/view/aboutxo.py:91
msgid "Software"
msgstr "Software"
-#: ../src/controlpanel/view/aboutxo.py:88
+#: ../src/controlpanel/view/aboutxo.py:100
msgid "Build:"
msgstr "Bouw:"
-#: ../src/controlpanel/view/aboutxo.py:103
+#: ../src/controlpanel/view/aboutxo.py:115
+msgid "Sugar:"
+msgstr "Sugar:"
+
+#: ../src/controlpanel/view/aboutxo.py:130
msgid "Firmware:"
msgstr "Firmware:"
+#: ../src/controlpanel/view/aboutxo.py:152
+msgid "Copyright and License"
+msgstr "Copyright en licentie"
+
+#: ../src/controlpanel/view/aboutxo.py:160
+msgid ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
+msgstr ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; en anderen die "
+"bijgedragen hebben."
+
+#: ../src/controlpanel/view/aboutxo.py:166
+msgid ""
+"Sugar is the graphical user interface that you are looking at. Sugar is free "
+"software, covered by the GNU General Public License, and you are welcome to "
+"change it and/or distribute copies of it under certain conditions described "
+"therein."
+msgstr ""
+"Sugar is de grafische gebruikersinterface waar je momenteel naar kijkt. "
+"Sugar is vrije software, uitgegeven onder de GNU General Public License, en "
+"u mag het aanpassen en/of kopieën distribueren onder de condities vermeld "
+"in de licentie."
+
+#: ../src/controlpanel/view/aboutxo.py:178
+msgid "Full license:"
+msgstr "Volledige licentie:"
+
#: ../src/controlpanel/view/datetime.py:29
msgid "Date & Time"
msgstr "Datum en Tijd"
@@ -496,31 +561,31 @@ msgstr ""
"Extreem energiebeheer (deactiveert draadloze radio, verhoogt gebruiksduur "
"accu)"
-#: ../src/view/devices/network/mesh.py:111
+#: ../src/view/devices/network/mesh.py:154
msgid "Connected to a School Mesh Portal"
msgstr "Verbonden met een School Mesh Portaal"
-#: ../src/view/devices/network/mesh.py:113
+#: ../src/view/devices/network/mesh.py:156
msgid "Looking for a School Mesh Portal..."
msgstr "Zoeken naar een School Mesh Portaal..."
-#: ../src/view/devices/network/mesh.py:116
+#: ../src/view/devices/network/mesh.py:159
msgid "Connected to an XO Mesh Portal"
msgstr "Verbonden met een XO Mesh Portaal"
-#: ../src/view/devices/network/mesh.py:118
+#: ../src/view/devices/network/mesh.py:161
msgid "Looking for an XO Mesh Portal..."
msgstr "Zoeken naar een XO Mesh Portaal..."
-#: ../src/view/devices/network/mesh.py:121
+#: ../src/view/devices/network/mesh.py:164
msgid "Connected to a Simple Mesh"
msgstr "Verbinden met een Eenvoudige Mesh"
-#: ../src/view/devices/network/mesh.py:123
+#: ../src/view/devices/network/mesh.py:166
msgid "Starting a Simple Mesh"
msgstr "Start een Eenvoudige Mesh"
-#: ../src/view/devices/network/mesh.py:130
+#: ../src/view/devices/network/mesh.py:173
msgid "Unknown Mesh"
msgstr "Onbekende Mesh"
@@ -528,36 +593,36 @@ msgstr "Onbekende Mesh"
msgid "Decline"
msgstr "Weigeren"
-#: ../src/view/home/favoritesview.py:285
+#: ../src/view/home/favoritesview.py:287
msgid "Registration Failed"
msgstr "Registratie mislukt"
-#: ../src/view/home/favoritesview.py:286
+#: ../src/view/home/favoritesview.py:288
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/view/home/favoritesview.py:288
+#: ../src/view/home/favoritesview.py:290
msgid "Registration Successful"
msgstr "Registratie succesvol uitgevoerd"
-#: ../src/view/home/favoritesview.py:289
+#: ../src/view/home/favoritesview.py:291
msgid "You are now registered with your school server."
msgstr "Je bent nu geregistreerd bij je schoolserver."
-#: ../src/view/home/favoritesview.py:405
+#: ../src/view/home/favoritesview.py:407
msgid "Control Panel"
msgstr "Configuratiepaneel"
-#: ../src/view/home/favoritesview.py:416
+#: ../src/view/home/favoritesview.py:418
msgid "Restart"
msgstr "Herstarten"
-#: ../src/view/home/favoritesview.py:421
+#: ../src/view/home/favoritesview.py:423
msgid "Shutdown"
msgstr "Afsluiten"
-#: ../src/view/home/favoritesview.py:427
+#: ../src/view/home/favoritesview.py:429
msgid "Register"
msgstr "Registreren"
diff --git a/po/pt.po b/po/pt.po
index 3a13528..f301db2 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -6,414 +6,813 @@ 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"
+"POT-Creation-Date: 2008-09-19 00:30-0400\n"
+"PO-Revision-Date: 2008-09-19 14:58-0400\n"
+"Last-Translator: Eduardo H. Silva <HoboPrimate@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Pootle 1.0.2\n"
+"X-Generator: Pootle 1.1.0rc2\n"
-#: ../shell/intro/intro.py:67
+#: ../src/intro/intro.py:65 ../src/controlpanel/view/aboutme.py:100
msgid "Name:"
msgstr "Nome:"
-#: ../shell/intro/intro.py:96
+#: ../src/intro/intro.py:97
msgid "Click to change color:"
msgstr "Clica para mudar a cor:"
-#: ../shell/intro/intro.py:146
+#: ../src/intro/intro.py:148
msgid "Back"
-msgstr "Anterior"
+msgstr "Voltar"
-#: ../shell/intro/intro.py:160
+#: ../src/intro/intro.py:162 ../src/controlpanel/toolbar.py:61
msgid "Done"
-msgstr "Finalizado"
+msgstr "Finalizar"
-#: ../shell/intro/intro.py:163
+#: ../src/intro/intro.py:165
msgid "Next"
msgstr "Próximo"
-#: ../shell/view/BuddyMenu.py:59
+#: ../src/view/BuddyMenu.py:60
msgid "Remove friend"
msgstr "Remover amigo"
-#: ../shell/view/BuddyMenu.py:62
+#: ../src/view/BuddyMenu.py:63
msgid "Make friend"
msgstr "Fazer amigo"
-#: ../shell/view/BuddyMenu.py:84
+#: ../src/view/BuddyMenu.py:92
#, python-format
msgid "Invite to %s"
msgstr "Convidar para %s"
-#: ../shell/view/clipboardmenu.py:58
+#: ../src/view/clipboardmenu.py:48
msgid "Remove"
msgstr "Remover"
-#: ../shell/view/clipboardmenu.py:63
+#: ../src/view/clipboardmenu.py:53 ../src/view/clipboardmenu.py:79
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)
#. 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"
+#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:85
+msgid "Keep"
+msgstr "Guardar"
+
+#: ../src/view/clipboardmenu.py:84
+msgid "Open with"
+msgstr "Abrir com"
-#: ../shell/view/clipboardmenu.py:213
+#: ../src/view/clipboardmenu.py:216
#, python-format
msgid "Clipboard object: %s."
-msgstr "Objecto da barra lateral: %s."
+msgstr "Objecto da Área de Transferência: %s"
-#: ../shell/hardware/keydialog.py:149
+#: ../src/hardware/keydialog.py:150
msgid "Key Type:"
msgstr "Tipo de Chave:"
-#: ../shell/hardware/keydialog.py:169
+#: ../src/hardware/keydialog.py:170
msgid "Authentication Type:"
msgstr "Tipo de Autenticação:"
-#: ../shell/hardware/keydialog.py:250
+#: ../src/hardware/keydialog.py:251
msgid "Encryption Type:"
msgstr "Tipo de Encriptação:"
-#: ../shell/view/home/activitiesdonut.py:90
-msgid "Starting..."
-msgstr "Começando..."
+#: ../src/hardware/schoolserver.py:17
+msgid "Cannot obtain data needed for registration."
+msgstr "Não foi possível obter os dados necessários para o registro."
-#: ../shell/view/home/activitiesdonut.py:104 ../shell/view/home/MeshBox.py:295
-msgid "Resume"
-msgstr "Continuar"
+#: ../src/hardware/schoolserver.py:31
+msgid "Cannot connect to the server."
+msgstr "Não foi possível ligar ao servidor."
-#: ../shell/view/home/activitiesdonut.py:111
-#: ../lib/sugar/activity/activity.py:132
-msgid "Stop"
-msgstr "Parar"
+#: ../src/hardware/schoolserver.py:36
+msgid "The server could not complete the request."
+msgstr "Não foi possível ao servidor completar o pedido."
-#: ../shell/view/Shell.py:285
+#: ../src/view/Shell.py:251
msgid "Screenshot"
-msgstr "Fotografia"
+msgstr "Imagem do Ecrã"
-#: ../shell/view/home/HomeBox.py:159
-msgid "Reboot"
-msgstr "Reiniciar"
+#: ../src/view/home/HomeBox.py:79
+msgid "Confirm erase"
+msgstr "Confirmação de apagar"
-#: ../shell/view/home/HomeBox.py:164
-msgid "Shutdown"
-msgstr "Desligar"
+#: ../src/view/home/HomeBox.py:81
+#, python-format
+msgid "Confirm erase: Do you want to permanently erase %s?"
+msgstr "Confirmação de apagar: Queres apagar permanentemente %s?"
-#: ../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..."
+#: ../src/view/home/HomeBox.py:88 ../src/view/palettes.py:120
+msgid "Erase"
+msgstr "Apagar"
+
+#: ../src/view/home/HomeBox.py:118
+msgid "Software Update"
+msgstr "Actualização do Software"
+
+#: ../src/view/home/HomeBox.py:119
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr ""
+"Actualiza as tuas actividades para assegurar compatibilidade com o teu novo "
+"software"
+
+#: ../src/view/home/HomeBox.py:123 ../src/controlpanel/toolbar.py:115
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: ../src/view/home/HomeBox.py:125 ../src/controlpanel/gui.py:286
+msgid "Later"
+msgstr "Mais tarde"
+
+#: ../src/view/home/HomeBox.py:128
+msgid "Check now"
+msgstr "Verificar agora"
+
+#: ../src/view/home/HomeBox.py:262
+msgid "List view"
+msgstr "Vista de Lista"
+
+#: ../src/view/home/HomeBox.py:263
+msgid "<Ctrl>2"
+msgstr "<Ctrl>2"
+
+#: ../src/view/home/HomeBox.py:321
+msgid "Favorites view"
+msgstr "Vista de Favoritos"
+
+#: ../src/view/home/HomeBox.py:322
+msgid "<Ctrl>1"
+msgstr "<Ctrl>1"
+
+#: ../src/view/home/MeshBox.py:97
+msgid "Connect"
+msgstr "Ligar"
-#: ../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
+#: ../src/view/home/MeshBox.py:106
+msgid "Disconnect"
+msgstr "Desligar"
+
+# 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
+#: ../src/view/home/MeshBox.py:118
+msgid "Disconnecting..."
+msgstr "A Desligar..."
+
+# 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
+#: ../src/view/home/MeshBox.py:152
+msgid "Connecting..."
+msgstr "A Ligar..."
+
+#. TODO: show the channel number
+#: ../src/view/home/MeshBox.py:159
+msgid "Connected"
+msgstr "Ligado"
+
+#. only temporarily
+#: ../src/view/home/MeshBox.py:211 ../src/view/devices/network/mesh.py:51
+#: ../src/view/devices/network/mesh.py:92
+#: ../src/view/devices/network/mesh.py:96
msgid "Mesh Network"
msgstr "Rede Mesh"
-#: ../shell/view/home/MeshBox.py:300
+# 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
+#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:160
+#: ../src/view/devices/network/mesh.py:125
+msgid "Disconnect..."
+msgstr "Desligar"
+
+#: ../src/view/home/MeshBox.py:302 ../src/view/palettes.py:61
+msgid "Resume"
+msgstr "Continuar"
+
+#: ../src/view/home/MeshBox.py:307 ../src/view/frame/activitiestray.py:205
msgid "Join"
-msgstr "Juntar"
+msgstr "Juntar-se"
+
+#: ../src/view/devices/battery.py:45
+msgid "My Battery"
+msgstr "Minha Bateria"
+
+#: ../src/view/devices/battery.py:114
+msgid "Charging"
+msgstr "A Carregar"
+
+#: ../src/view/devices/battery.py:117
+msgid "Very little power remaining"
+msgstr "Muito pouca energia restante"
+
+#: ../src/view/devices/battery.py:123
+#, python-format
+msgid "%(hour)d:%(min).2d remaining"
+msgstr "%(hour)d:%(min).2d restantes"
-#: ../shell/view/devices/battery.py:38
-msgid "My Battery life"
-msgstr "Energia da bateria"
+#: ../src/view/devices/battery.py:127
+msgid "Charged"
+msgstr "Carregada"
-#: ../shell/view/devices/battery.py:94
-msgid "Battery charging"
-msgstr "Bateria a carregar"
+#: ../src/view/devices/speaker.py:44
+msgid "My Speakers"
+msgstr "Meus Altifalantes"
-#: ../shell/view/devices/battery.py:96
-msgid "Battery discharging"
-msgstr "Bateria a descarregar"
+#: ../src/view/devices/speaker.py:119
+msgid "Unmute"
+msgstr "Retirar do Silêncio"
-#: ../shell/view/devices/battery.py:98
-msgid "Battery fully charged"
-msgstr "Bateria totalmente carregada"
+#: ../src/view/devices/speaker.py:122
+msgid "Mute"
+msgstr "Silenciar"
-#: ../shell/view/devices/network/wireless.py:61
+#: ../src/view/devices/network/wireless.py:37
+#, python-format
+msgid "IP address: %s"
+msgstr "Endereço IP: %s"
+
+#: ../src/view/devices/network/wireless.py:86
msgid "Disconnected"
-msgstr "Disconectado"
+msgstr "Desligado"
-#: ../shell/view/devices/network/wireless.py:131
+#: ../src/view/devices/network/wireless.py:178
msgid "Channel"
msgstr "Canal"
-#: ../shell/view/frame/zoomtoolbar.py:42
+#: ../src/view/frame/zoomtoolbar.py:37
msgid "Neighborhood"
msgstr "Vizinhança"
-#: ../shell/view/frame/zoomtoolbar.py:54
+#: ../src/view/frame/zoomtoolbar.py:39
msgid "Group"
msgstr "Grupo"
-#: ../shell/view/frame/zoomtoolbar.py:66
+#: ../src/view/frame/zoomtoolbar.py:41
msgid "Home"
-msgstr "Zona Principal"
+msgstr "Casa"
-#: ../shell/view/frame/zoomtoolbar.py:78
+#: ../src/view/frame/zoomtoolbar.py:43
msgid "Activity"
msgstr "Actividade"
-#: ../lib/sugar/activity/activity.py:115
-msgid "Share with:"
-msgstr "Partilhar com:"
+#: ../src/controlpanel/cmd.py:26
+#, python-format
+msgid ""
+"sugar-control-panel: WARNING, found more than one option with the same name: "
+"%s module: %r"
+msgstr ""
+"sugar-control-panel: AVISO, foram encontradas mais que uma opção com o mesmo "
+"nome: módulo %s: %r "
-#: ../lib/sugar/activity/activity.py:117
-msgid "Private"
-msgstr "Privado"
+#: ../src/controlpanel/cmd.py:28
+#, python-format
+msgid "sugar-control-panel: key=%s not an available option"
+msgstr "sugar-control-panel: key=%s não é uma opção disponível"
-#: ../lib/sugar/activity/activity.py:118
-msgid "My Neighborhood"
-msgstr "Minha Vizinhança"
+#: ../src/controlpanel/cmd.py:29
+#, python-format
+msgid "sugar-control-panel: %s"
+msgstr "sugar-control-panel: %s"
-#: ../lib/sugar/activity/activity.py:126
-msgid "Keep"
-msgstr "Manter"
+#: ../src/controlpanel/cmd.py:33
+msgid ""
+"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"
+" -c key clear the current value for the key \n"
+" "
+msgstr ""
+"Utilização: sugar-control-panel [ opção] key [ args ...] \n"
+" Controle do ambiente sugar. \n"
+" Opções: \n"
+" -h mostrar esta mensagem de ajuda e sair \n"
+" -l listar todas as opções disponíveis \n"
+" -h key mostrar informação sobre esta chave \n"
+" -g key obter o valor actual desta chave \n"
+" -s key colocar o valor actual desta chave \n"
+" -c key eliminar o valor actual desta chave \n"
+" "
+
+#: ../src/controlpanel/cmd.py:46
+msgid "To apply your changes you have to restart sugar.\n"
+msgstr "Para aplicar as alterações tens que reiniciar o sugar.\n"
-#: ../lib/sugar/activity/activity.py:245
-msgid "Undo"
-msgstr "Desfazer"
+#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:305
+msgid "Ok"
+msgstr "Ok"
-#: ../lib/sugar/activity/activity.py:250
-msgid "Redo"
-msgstr "Refazer"
+#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:278
+msgid "Changes require restart"
+msgstr "As alterações feitas necessitam que reinicies"
-#: ../lib/sugar/activity/activity.py:260
-msgid "Copy"
-msgstr "Copiar"
+#: ../src/controlpanel/gui.py:277
+msgid "Warning"
+msgstr "Aviso"
-#: ../lib/sugar/activity/activity.py:265
-msgid "Paste"
-msgstr "Colar"
+#: ../src/controlpanel/gui.py:281
+msgid "Cancel changes"
+msgstr "Cancelar alterações"
-#: ../lib/sugar/activity/activity.py:454
+#: ../src/controlpanel/gui.py:290
+msgid "Restart now"
+msgstr "Reiniciar agora"
+
+#: ../src/controlpanel/model/aboutme.py:44
+msgid "You must enter a name."
+msgstr "Precisas de introduzir um nome."
+
+#: ../src/controlpanel/model/aboutme.py:69
#, python-format
-msgid "%s Activity"
-msgstr "%s Actividade"
+msgid "stroke: color=%s hue=%s"
+msgstr "traço: cor=%s tonalidade=%s"
-#: ../lib/sugar/activity/activity.py:824
-msgid "Keep error"
-msgstr "Guardar erro"
+#: ../src/controlpanel/model/aboutme.py:72
+#, python-format
+msgid "stroke: %s"
+msgstr "traço: %s"
-#: ../lib/sugar/activity/activity.py:825
-msgid "Keep error: all changes will be lost"
-msgstr "Guardar erro: todas as mudanças serão perdidas"
+#: ../src/controlpanel/model/aboutme.py:74
+#, python-format
+msgid "fill: color=%s hue=%s"
+msgstr "preenchimento: cor=%s tonalidade=%s"
-#: ../lib/sugar/activity/activity.py:828
-msgid "Don't stop"
-msgstr "Não pares"
+#: ../src/controlpanel/model/aboutme.py:76
+#, python-format
+msgid "fill: %s"
+msgstr "preenchimento: %s"
-#: ../lib/sugar/activity/activity.py:831
-msgid "Stop anyway"
-msgstr "Parar à mesma"
+#: ../src/controlpanel/model/aboutme.py:87
+msgid "Error in specified color modifiers."
+msgstr "Erro nos modificadores de cor especificados."
-#: ../lib/sugar/graphics/alert.py:164 ../lib/sugar/graphics/alert.py:206
-msgid "Cancel"
-msgstr "Cancelar"
+#: ../src/controlpanel/model/aboutme.py:90
+msgid "Error in specified colors."
+msgstr "Erro nas cores especificadas."
-#: ../lib/sugar/graphics/alert.py:168
-msgid "Ok"
-msgstr "Ok"
+#: ../src/controlpanel/model/aboutxo.py:24
+msgid "Not available"
+msgstr "Não disponível"
-#: ../lib/sugar/graphics/alert.py:216
-msgid "Continue"
-msgstr "Continuar"
+#: ../src/controlpanel/model/datetime.py:89
+msgid "Error timezone does not exist."
+msgstr "Erro: fuso horário não existe."
-#: ../lib/sugar/graphics/alert.py:244
-msgid "OK"
-msgstr "OK"
+#: ../src/controlpanel/model/frame.py:38 ../src/controlpanel/model/frame.py:60
+msgid "Value must be an integer."
+msgstr "Valor tem que ser um número inteiro."
-#: ../lib/sugar/graphics/objectchooser.py:175
-#, python-format
-msgid "%d year"
-msgstr "%d ano"
+#: ../src/controlpanel/model/language.py:28
+msgid "Could not access ~/.i18n. Create standard settings."
+msgstr "Não foi possível aceder a ~/.i18n. Cria definições normais."
-#: ../lib/sugar/graphics/objectchooser.py:175
+#: ../src/controlpanel/model/language.py:114
#, python-format
-msgid "%d years"
-msgstr "%d anos"
+msgid "Language for code=%s could not be determined."
+msgstr "Não foi possível determinar a linguagem para o código=%s."
-#: ../lib/sugar/graphics/objectchooser.py:176
+#: ../src/controlpanel/model/language.py:131
#, python-format
-msgid "%d month"
-msgstr "%d mês"
+msgid "Sorry I do not speak '%s'."
+msgstr "Desculpa, eu não falo '%s'."
-#: ../lib/sugar/graphics/objectchooser.py:176
-#, python-format
-msgid "%d months"
-msgstr "%d meses"
+#: ../src/controlpanel/model/network.py:62
+msgid "State is unknown."
+msgstr "O estado é desconhecido."
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d week"
-msgstr "%d semana"
+#: ../src/controlpanel/model/network.py:82
+msgid "Error in specified radio argument use on/off."
+msgstr "Erro no argumento de rádio especificado, utiliza on/off."
-#: ../lib/sugar/graphics/objectchooser.py:177
-#, python-format
-msgid "%d weeks"
-msgstr "%d semanas"
+#: ../src/controlpanel/model/power.py:57
+msgid "Error in automatic pm argument, use on/off."
+msgstr "Erro no argumento automático pm, utiliza on/off."
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d day"
-msgstr "%d dia"
+#: ../src/controlpanel/model/power.py:86
+msgid "Error in extreme pm argument, use on/off."
+msgstr "Erro no argumento extremo pm, utiliza on/off."
-#: ../lib/sugar/graphics/objectchooser.py:178
-#, python-format
-msgid "%d days"
-msgstr "%d dias"
+#: ../src/controlpanel/view/aboutme.py:32
+msgid "About Me"
+msgstr "Sobre Mim"
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hour"
-msgstr "%d hora"
+#: ../src/controlpanel/view/aboutme.py:134
+msgid "Click to change your color:"
+msgstr "Clica para mudar a tua cor:"
-#: ../lib/sugar/graphics/objectchooser.py:179
-#, python-format
-msgid "%d hours"
-msgstr "%d horas"
+#: ../src/controlpanel/view/aboutxo.py:28
+msgid "About my XO"
+msgstr "Sobre o meu XO"
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minute"
-msgstr "%d minuto"
+#: ../src/controlpanel/view/aboutxo.py:59
+msgid "Identity"
+msgstr "Identidade"
-#: ../lib/sugar/graphics/objectchooser.py:180
-#, python-format
-msgid "%d minutes"
-msgstr "%d minutos"
+#: ../src/controlpanel/view/aboutxo.py:68
+msgid "Serial Number:"
+msgstr "Número de Série:"
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d second"
-msgstr "%d segundo"
+#: ../src/controlpanel/view/aboutxo.py:91
+msgid "Software"
+msgstr "Software"
-#: ../lib/sugar/graphics/objectchooser.py:181
-#, python-format
-msgid "%d seconds"
-msgstr "%d segundos"
+#: ../src/controlpanel/view/aboutxo.py:100
+msgid "Build:"
+msgstr "Versão do software:"
-#: ../lib/sugar/graphics/objectchooser.py:191
-msgid " and "
-msgstr " e "
+#: ../src/controlpanel/view/aboutxo.py:115
+msgid "Sugar:"
+msgstr "Sugar:"
-#: ../lib/sugar/graphics/objectchooser.py:193
-msgid ", "
-msgstr ", "
+#: ../src/controlpanel/view/aboutxo.py:130
+msgid "Firmware:"
+msgstr "Firmware:"
-#: ../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"
+#: ../src/controlpanel/view/aboutxo.py:152
+msgid "Copyright and License"
+msgstr "Copyright e Licença"
-#: ../shell/controlpanel/control.py:267
-msgid "Error in specified color modifiers."
-msgstr "Erro nos modificadores de cor especificados."
+#: ../src/controlpanel/view/aboutxo.py:160
+msgid ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
+msgstr ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; e Contribuidores."
-#: ../shell/controlpanel/control.py:270
-msgid "Error in specified colors."
-msgstr "Erro nas cores especificadas."
+#: ../src/controlpanel/view/aboutxo.py:167
+msgid ""
+"Sugar is the graphical user interface that you are looking at. Sugar is free "
+"software, covered by the GNU General Public License, and you are welcome to "
+"change it and/or distribute copies of it under certain conditions described "
+"therein."
+msgstr ""
+"O Sugar é a interface gráfica de utilizador que estás a utilizar. O Sugar é "
+"software livre, licenciado sob a GNU General Public License, e és bem vindo "
+"a fazer alterações a ele e/ou a distribuir cópias dele, segundo certas "
+"condições descritas a seguir."
-#: ../shell/controlpanel/control.py:307
-msgid "off"
-msgstr "desligar"
+#: ../src/controlpanel/view/aboutxo.py:179
+msgid "Full license:"
+msgstr "Licença Completa:"
-#: ../shell/controlpanel/control.py:309
-msgid "on"
-msgstr "ligar"
+#: ../src/controlpanel/view/datetime.py:29
+msgid "Date & Time"
+msgstr "Data & Hora"
-#: ../shell/controlpanel/control.py:310
-msgid "State is unknown."
-msgstr "Situação é desconhecida."
+#: ../src/controlpanel/view/datetime.py:72
+msgid "Timezone"
+msgstr "Fuso horário"
-#: ../shell/controlpanel/control.py:332
-msgid "Error in specified radio argument use on/off."
-msgstr "Erro no argumento especificado, usa ligar/desligar."
+#: ../src/controlpanel/view/frame.py:28
+msgid "Frame"
+msgstr "Moldura"
-#: ../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."
+#: ../src/controlpanel/view/frame.py:30
+msgid "never"
+msgstr "nunca"
-#: ../shell/controlpanel/control.py:366
-msgid "Error in reading timezone"
-msgstr "Erro ao ler a zona horária"
+#: ../src/controlpanel/view/frame.py:31
+msgid "instantaneous"
+msgstr "instantâneo"
-#: ../shell/controlpanel/control.py:397
+#: ../src/controlpanel/view/frame.py:32
#, python-format
-msgid "Error copying timezone (from %s): %s"
-msgstr "Erro ao copiar a zona horária (de %s): %s"
+msgid "%s seconds"
+msgstr "%s segundos"
-#: ../shell/controlpanel/control.py:402
-#, python-format
-msgid "Changing permission of timezone: %s"
-msgstr "Modificando permissão da zona horária: %s"
+#: ../src/controlpanel/view/frame.py:56
+msgid "Activation Delay"
+msgstr "Atraso na Activação"
-#: ../shell/controlpanel/control.py:412
-msgid "Error timezone does not exist."
-msgstr "Erro: zona horária não existe."
+#: ../src/controlpanel/view/frame.py:80
+msgid "Corner"
+msgstr "Canto"
-#: ../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."
+#: ../src/controlpanel/view/frame.py:115
+msgid "Edge"
+msgstr "Borda"
-#: ../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."
+#: ../src/controlpanel/view/language.py:29
+#: ../src/controlpanel/view/language.py:74
+msgid "Language"
+msgstr "Linguagem"
-#: ../shell/controlpanel/control.py:473
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "Desculpa, eu não falo '%s'."
+#: ../src/controlpanel/view/network.py:28
+msgid "Network"
+msgstr "Rede"
+
+#: ../src/controlpanel/view/network.py:54
+msgid "Wireless"
+msgstr "Rede sem fios"
+
+#: ../src/controlpanel/view/network.py:62
+msgid "Turn of the wireless radio to save battery life"
+msgstr "Desliga o rádio da rede sem fios para aumentar o tempo de bateria"
+
+#: ../src/controlpanel/view/network.py:75
+msgid "Radio"
+msgstr "Rádio"
+
+#: ../src/controlpanel/view/network.py:91
+msgid "Discard network history if you have trouble connecting to the network"
+msgstr ""
+"Descarta o histórico da configuração de rede se tiveres problemas em ligar-"
+"te à rede"
+
+#: ../src/controlpanel/view/network.py:100
+msgid "Discard network history"
+msgstr "Descartar histórico da configuração de rede"
+
+#: ../src/controlpanel/view/network.py:113
+msgid "Mesh"
+msgstr "Mesh"
+
+#: ../src/controlpanel/view/network.py:122
+msgid "Server:"
+msgstr "Servidor:"
+
+#: ../src/controlpanel/view/power.py:27
+msgid "Power"
+msgstr "Energia"
+
+#: ../src/controlpanel/view/power.py:51
+msgid "Power management"
+msgstr "Gestão de energia"
+
+#: ../src/controlpanel/view/power.py:61
+msgid "Automatic power management (increases battery life)"
+msgstr "Gestão automática de energia (aumenta o tempo de bateria)"
+
+#: ../src/controlpanel/view/power.py:89
+msgid ""
+"Extreme power management (disables wireless radio, increases battery life)"
+msgstr ""
+"Gestão extrema de energia (desliga o rádio da rede sem fios, aumenta o tempo "
+"de bateria)"
-#: ../shell/view/devices/network/mesh.py:105
+#: ../src/view/devices/network/mesh.py:154
msgid "Connected to a School Mesh Portal"
-msgstr "Conectado a um Portal Mesh de Escola"
+msgstr "Ligado a um Portal Mesh de Escola"
-#: ../shell/view/devices/network/mesh.py:107
+#: ../src/view/devices/network/mesh.py:156
msgid "Looking for a School Mesh Portal..."
msgstr "À procura de um Portal Mesh de Escola..."
-#: ../shell/view/devices/network/mesh.py:110
+#: ../src/view/devices/network/mesh.py:159
msgid "Connected to an XO Mesh Portal"
-msgstr "Conectado a um Portal Mesh de XO"
+msgstr "Ligado a um Portal Mesh de XO"
-#: ../shell/view/devices/network/mesh.py:112
+#: ../src/view/devices/network/mesh.py:161
msgid "Looking for an XO Mesh Portal..."
-msgstr "À procura de um Portal Mesh de XO"
+msgstr "À procura de um Portal Mesh de XO..."
-#: ../shell/view/devices/network/mesh.py:115
+#: ../src/view/devices/network/mesh.py:164
msgid "Connected to a Simple Mesh"
-msgstr "Conectado a uma Mesh Simples"
+msgstr "Ligado a uma Mesh Simples"
-#: ../shell/view/devices/network/mesh.py:117
+#: ../src/view/devices/network/mesh.py:166
msgid "Starting a Simple Mesh"
-msgstr "A começar uma Mesh Simples"
+msgstr "A iniciar uma Mesh Simples"
-#: ../shell/view/devices/network/mesh.py:124
+#: ../src/view/devices/network/mesh.py:173
msgid "Unknown Mesh"
msgstr "Mesh Desconhecida"
-#: ../shell/view/home/HomeBox.py:175 ../shell/view/home/HomeBox.py:216
-msgid "About this XO"
-msgstr ""
+#: ../src/view/frame/activitiestray.py:210
+msgid "Decline"
+msgstr "Recusar"
-#: ../shell/view/home/HomeBox.py:222
-msgid "Not available"
-msgstr ""
+#: ../src/view/home/favoritesview.py:296
+msgid "Registration Failed"
+msgstr "O Registro Falhou"
+
+#: ../src/view/home/favoritesview.py:297
+#, python-format
+msgid "%s"
+msgstr "%s"
+
+#: ../src/view/home/favoritesview.py:299
+msgid "Registration Successful"
+msgstr "O Registro teve Sucesso"
+
+#: ../src/view/home/favoritesview.py:300
+msgid "You are now registered with your school server."
+msgstr "Estás agora registrado com o teu servidor de escola."
+
+#: ../src/view/home/favoritesview.py:420
+msgid "Control Panel"
+msgstr "Painel de Controlo"
+
+#: ../src/view/home/favoritesview.py:425
+msgid "Restart"
+msgstr "Reiniciar"
+
+#: ../src/view/home/favoritesview.py:430
+msgid "Shutdown"
+msgstr "Desligar"
+
+#: ../src/view/home/favoritesview.py:436
+msgid "Register"
+msgstr "Registrar"
+
+#: ../src/view/palettes.py:42
+msgid "Starting..."
+msgstr "A Iniciar..."
+
+#: ../src/view/palettes.py:72
+msgid "Stop"
+msgstr "Parar"
+
+#: ../src/view/palettes.py:104
+msgid "Start"
+msgstr "Iniciar"
+
+#: ../src/view/palettes.py:138
+msgid "Remove favorite"
+msgstr "Remover favorito"
+
+#: ../src/view/palettes.py:142
+msgid "Make favorite"
+msgstr "Tornar favorito"
+
+#: ../src/view/palettes.py:191
+msgid "Show contents"
+msgstr "Mostrar os conteúdos"
+
+#: ../src/view/palettes.py:215
+#, python-format
+msgid "%(free_space)d MB Free"
+msgstr "%(free_space)d MB Livres"
+
+#~ msgid "Freeform"
+#~ msgstr "Livre"
+
+#~ msgid "Ring"
+#~ msgstr "Anel"
+
+#~ msgid "You must enter a server."
+#~ msgstr "Precisas de introduzir um servidor."
+
+#~ msgid "© 2008 One Laptop per Child Assocation "
+#~ msgstr "© 2008 One Laptop per Child Association"
+
+#~ msgid "Sugar is the graphical user interface that "
+#~ msgstr "Sugar é a interface gráfica que estás a utilizar."
+
+#~ msgid "off"
+#~ msgstr "desligar"
+
+#~ msgid "on"
+#~ msgstr "ligar"
+
+#~ 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."
+
+#~ msgid "Error in reading timezone"
+#~ msgstr "Erro ao ler a zona horária"
+
+#, python-format
+#~ msgid "Error copying timezone (from %s): %s"
+#~ msgstr "Erro ao copiar a zona horária (de %s): %s"
+
+#, python-format
+#~ msgid "Changing permission of timezone: %s"
+#~ msgstr "Modificando permissão da zona horária: %s"
+
+#~ msgid "Add to journal"
+#~ msgstr "Adicionar ao Diário"
+
+#~ msgid "Reboot"
+#~ msgstr "Reiniciar"
+
+#~ msgid "My Battery life"
+#~ msgstr "Energia da bateria"
+
+#~ msgid "Battery charging"
+#~ msgstr "Bateria a carregar"
+
+#~ msgid "Battery discharging"
+#~ msgstr "Bateria a descarregar"
+
+#~ msgid "Battery fully charged"
+#~ msgstr "Bateria totalmente carregada"
+
+#~ msgid "Share with:"
+#~ msgstr "Partilhar com:"
+
+#~ msgid "Private"
+#~ msgstr "Privado"
+
+#~ msgid "My Neighborhood"
+#~ msgstr "Minha Vizinhança"
+
+#~ msgid "Undo"
+#~ msgstr "Desfazer"
+
+#~ msgid "Redo"
+#~ msgstr "Refazer"
+
+#~ msgid "Copy"
+#~ msgstr "Copiar"
+
+#~ msgid "Paste"
+#~ msgstr "Colar"
+
+#, python-format
+#~ msgid "%s Activity"
+#~ msgstr "%s Actividade"
+
+#~ msgid "Keep error"
+#~ msgstr "Guardar erro"
+
+#~ msgid "Keep error: all changes will be lost"
+#~ msgstr "Guardar erro: todas as mudanças serão perdidas"
+
+#~ msgid "Don't stop"
+#~ msgstr "Não pares"
+
+#~ msgid "Stop anyway"
+#~ msgstr "Parar à mesma"
+
+#~ msgid "Continue"
+#~ msgstr "Continuar"
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#, python-format
+#~ msgid "%d year"
+#~ msgstr "%d ano"
+
+#, python-format
+#~ msgid "%d years"
+#~ msgstr "%d anos"
+
+#, python-format
+#~ msgid "%d month"
+#~ msgstr "%d mês"
+
+#, python-format
+#~ msgid "%d months"
+#~ msgstr "%d meses"
+
+#, python-format
+#~ msgid "%d week"
+#~ msgstr "%d semana"
+
+#, python-format
+#~ msgid "%d weeks"
+#~ msgstr "%d semanas"
+
+#, python-format
+#~ msgid "%d day"
+#~ msgstr "%d dia"
+
+#, python-format
+#~ msgid "%d days"
+#~ msgstr "%d dias"
+
+#, python-format
+#~ msgid "%d hour"
+#~ msgstr "%d hora"
+
+#, python-format
+#~ msgid "%d hours"
+#~ msgstr "%d horas"
+
+#, python-format
+#~ msgid "%d minute"
+#~ msgstr "%d minuto"
+
+#, python-format
+#~ msgid "%d minutes"
+#~ msgstr "%d minutos"
+
+#, python-format
+#~ msgid "%d second"
+#~ msgstr "%d segundo"
+
+#~ msgid " and "
+#~ msgstr " e "
+
+#~ msgid ", "
+#~ msgstr ", "
diff --git a/po/sl.po b/po/sl.po
index ab62d18..c3fca85 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-07-23 07:44-0400\n"
-"PO-Revision-Date: 2008-07-18 00:32-0400\n"
+"POT-Creation-Date: 2008-09-01 18:31-0400\n"
+"PO-Revision-Date: 2008-09-11 03:30-0400\n"
"Last-Translator: Denis Oštir <denis.ostir@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -15,23 +15,23 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Pootle 1.1.0rc2\n"
-#: ../src/intro/intro.py:65 ../src/controlpanel/view/aboutme.py:100
+#: ../src/intro/window.py:93 ../src/controlpanel/view/aboutme.py:100
msgid "Name:"
msgstr "Ime:"
-#: ../src/intro/intro.py:94
+#: ../src/intro/window.py:125
msgid "Click to change color:"
msgstr "Klikni za spremembo barve:"
-#: ../src/intro/intro.py:145
+#: ../src/intro/window.py:175
msgid "Back"
msgstr "Nazaj"
-#: ../src/intro/intro.py:159 ../src/controlpanel/toolbar.py:61
+#: ../src/intro/window.py:189 ../src/controlpanel/toolbar.py:61
msgid "Done"
msgstr "Končano"
-#: ../src/intro/intro.py:162
+#: ../src/intro/window.py:192
msgid "Next"
msgstr "Naslednji"
@@ -43,7 +43,7 @@ msgstr "Odstrani prijatelja"
msgid "Make friend"
msgstr "Dodaj prijatelja"
-#: ../src/view/BuddyMenu.py:91
+#: ../src/view/BuddyMenu.py:90
#, python-format
msgid "Invite to %s"
msgstr "Povabi na %s"
@@ -60,7 +60,7 @@ msgstr "Odpri"
#. TODO: Implement stopping downloads
#. self._stop_item.connect('activate', self._stop_item_activate_cb)
#. self.append_menu_item(self._stop_item)
-#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:86
+#: ../src/view/clipboardmenu.py:63 ../src/view/home/HomeBox.py:87
msgid "Keep"
msgstr "Obdrži"
@@ -85,50 +85,81 @@ msgstr "Tip prepoznave:"
msgid "Encryption Type:"
msgstr "Tip kodiranja:"
-#: ../src/view/Shell.py:240
+#: ../src/hardware/schoolserver.py:17
+msgid "Cannot obtain data needed for registration."
+msgstr "Ne morem pridobiti podatkov, potrebnih za registracijo."
+
+#: ../src/hardware/schoolserver.py:31
+msgid "Cannot connect to the server."
+msgstr "Povezava s strežnikom ni mogoča."
+
+#: ../src/hardware/schoolserver.py:36
+msgid "The server could not complete the request."
+msgstr "Strežnik ne more izpolniti zahteve."
+
+#: ../src/view/Shell.py:261
msgid "Screenshot"
msgstr "Slika zaslona"
-#: ../src/view/home/HomeBox.py:80
+#: ../src/view/home/HomeBox.py:81
msgid "Confirm erase"
msgstr "Potrdi brisanje"
-#: ../src/view/home/HomeBox.py:82
+#: ../src/view/home/HomeBox.py:83
#, python-format
msgid "Confirm erase: Do you want to permanently erase %s?"
msgstr "Potrdi brisanje: Želiš dokočno izbrisati %s?"
-#: ../src/view/home/HomeBox.py:89 ../src/view/palettes.py:120
+#: ../src/view/home/HomeBox.py:90 ../src/view/palettes.py:120
msgid "Erase"
msgstr "Izbriši"
-#: ../src/view/home/HomeBox.py:215
+#: ../src/view/home/HomeBox.py:120
+msgid "Software Update"
+msgstr "Nadgradnja programa"
+
+#: ../src/view/home/HomeBox.py:121
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr ""
+"Nadgradite aktivnosti, da zagotovite ustreznost z novo programsko opremo."
+
+#: ../src/view/home/HomeBox.py:125 ../src/controlpanel/toolbar.py:115
+msgid "Cancel"
+msgstr "Prekliči"
+
+#: ../src/view/home/HomeBox.py:127 ../src/controlpanel/gui.py:276
+msgid "Later"
+msgstr "Kasneje"
+
+#: ../src/view/home/HomeBox.py:130
+msgid "Check now"
+msgstr "Preveri zdaj"
+
+#: ../src/view/home/HomeBox.py:266
msgid "List view"
msgstr "Seznam"
-#: ../src/view/home/HomeBox.py:216
-#, fuzzy
+#: ../src/view/home/HomeBox.py:267
msgid "<Ctrl>2"
-msgstr "<Ctrl>L"
+msgstr "<Ctrl>2"
-#: ../src/view/home/HomeBox.py:273
+#: ../src/view/home/HomeBox.py:325
msgid "Favorites view"
msgstr "Priljubljene"
-#: ../src/view/home/HomeBox.py:274
-#, fuzzy
+#: ../src/view/home/HomeBox.py:326
msgid "<Ctrl>1"
-msgstr "<Ctrl>L"
+msgstr "<Ctrl>1"
# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/HomeBox.py:282
+#: ../src/view/home/HomeBox.py:334
msgid "Freeform"
msgstr "Prostoročno"
# TRANS: label for the ring layout in the favorites view
#. TRANS: label for the ring layout in the favorites view
-#: ../src/view/home/HomeBox.py:289
+#: ../src/view/home/HomeBox.py:341
msgid "Ring"
msgstr "Obroč"
@@ -198,11 +229,11 @@ msgid "My Speakers"
msgstr "Moji zvočniki"
# malo težko je UNMUTE prevest drugače
-#: ../src/view/devices/speaker.py:119
+#: ../src/view/devices/speaker.py:125
msgid "Unmute"
msgstr "Glasno"
-#: ../src/view/devices/speaker.py:122
+#: ../src/view/devices/speaker.py:128
msgid "Mute"
msgstr "Tiho"
@@ -214,19 +245,19 @@ msgstr "Odklopljen"
msgid "Channel"
msgstr "Kanal"
-#: ../src/view/frame/zoomtoolbar.py:34
+#: ../src/view/frame/zoomtoolbar.py:37
msgid "Neighborhood"
msgstr "Soseščina"
-#: ../src/view/frame/zoomtoolbar.py:36
+#: ../src/view/frame/zoomtoolbar.py:39
msgid "Group"
msgstr "Skupina"
-#: ../src/view/frame/zoomtoolbar.py:38
+#: ../src/view/frame/zoomtoolbar.py:41
msgid "Home"
msgstr "Domov"
-#: ../src/view/frame/zoomtoolbar.py:40
+#: ../src/view/frame/zoomtoolbar.py:43
msgid "Activity"
msgstr "Aktivnost"
@@ -249,7 +280,9 @@ msgstr "nadzorna plošča programa sugar: ključ=%s ni veljavna možnost"
msgid "sugar-control-panel: %s"
msgstr "nadzorna plošča programa sugar: %s"
-#: ../src/controlpanel/cmd.py:33
+#. TRANS: Translators, there's a empty line at the end of this string,
+#. which must appear in the translated string (msgstr) as well.
+#: ../src/controlpanel/cmd.py:35
msgid ""
"Usage: sugar-control-panel [ option ] key [ args ... ] \n"
" Control for the sugar environment. \n"
@@ -259,47 +292,41 @@ msgid ""
" -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"
+" -c key clear the current value for the key \n"
" "
msgstr ""
-"Uporaba: nadzorna plošča programa sugar [ možnost ] key [ ukaz ... ] \n"
+"Uporaba: nadzorna plošča programa sugar [ možnost ] tipka [ ukaz ... ] \n"
" Nadzor v okolju sugar. \n"
" Možnosti: \n"
" -h prikaži to sporočilo in končaj \n"
" -l prikaži vse možnosti, ki so na voljo \n"
-" -h key prikaži informacije za posamezen ključ \n"
-" -g key pridobi trenutno vrednost ključa \n"
-" -s key nastavi trenutno vrednost za ključ \n"
+" -h tipka prikaži informacije za to tipko \n"
+" -g tipka pridobi trenutno vrednost tipke \n"
+" -s tipka nastavi trenutno vrednost tipke \n"
+" -c tipka izbriši trenurno vrednost tipke \n"
" "
-#: ../src/controlpanel/cmd.py:45
+#: ../src/controlpanel/cmd.py:48
msgid "To apply your changes you have to restart sugar.\n"
msgstr "Za uveljavitev sprememb je potreben ponovni zagon programa sugar.\n"
-#: ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr "Prekliči"
-
-#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:294
+#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:296
msgid "Ok"
msgstr "V redu"
-#: ../src/controlpanel/sectionview.py:34 ../src/controlpanel/gui.py:260
+#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:268
msgid "Changes require restart"
msgstr "Sprembe zahtevajo ponovni zagon"
-#: ../src/controlpanel/gui.py:259
+#: ../src/controlpanel/gui.py:267
msgid "Warning"
msgstr "Opozorilo"
-#: ../src/controlpanel/gui.py:263
+#: ../src/controlpanel/gui.py:271
msgid "Cancel changes"
msgstr "Prekliči spremembe"
-#: ../src/controlpanel/gui.py:267
-msgid "Later"
-msgstr "Kasneje"
-
-#: ../src/controlpanel/gui.py:271
+#: ../src/controlpanel/gui.py:280
msgid "Restart now"
msgstr "Ponovni zagon"
@@ -351,12 +378,12 @@ msgstr "Vrednost mora biti številka."
msgid "Could not access ~/.i18n. Create standard settings."
msgstr "Dostop do ~/.i18n ni mogoče. Ustvari standardne nastavitve."
-#: ../src/controlpanel/model/language.py:104
+#: ../src/controlpanel/model/language.py:110
#, python-format
msgid "Language for code=%s could not be determined."
msgstr "Jezika za kodo=%s ni bilo mogoče določiti."
-#: ../src/controlpanel/model/language.py:121
+#: ../src/controlpanel/model/language.py:127
#, python-format
msgid "Sorry I do not speak '%s'."
msgstr "Oprosti, ne govorim '%s'."
@@ -374,7 +401,6 @@ msgid "Error in specified radio argument use on/off."
msgstr "Napaka pri določanju stanja radijske povezave (vključen/izključen)."
#: ../src/controlpanel/model/power.py:57
-#, fuzzy
msgid "Error in automatic pm argument, use on/off."
msgstr "Napaka pri samodejni rabi ukaza pm, uporabi izklop/vklop."
@@ -390,30 +416,59 @@ msgstr "O meni"
msgid "Click to change your color:"
msgstr "Klikni za spremembo barve:"
-#: ../src/controlpanel/view/aboutxo.py:26
+#: ../src/controlpanel/view/aboutxo.py:28
msgid "About my XO"
msgstr "O mojem XO"
-#: ../src/controlpanel/view/aboutxo.py:47
+#: ../src/controlpanel/view/aboutxo.py:59
msgid "Identity"
msgstr "Identiteta"
-#: ../src/controlpanel/view/aboutxo.py:56
+#: ../src/controlpanel/view/aboutxo.py:68
msgid "Serial Number:"
msgstr "Serijska številka:"
-#: ../src/controlpanel/view/aboutxo.py:79
+#: ../src/controlpanel/view/aboutxo.py:91
msgid "Software"
msgstr "Program"
-#: ../src/controlpanel/view/aboutxo.py:88
+#: ../src/controlpanel/view/aboutxo.py:100
msgid "Build:"
msgstr "Različica:"
-#: ../src/controlpanel/view/aboutxo.py:103
+#: ../src/controlpanel/view/aboutxo.py:115
+msgid "Sugar:"
+msgstr "Sugar:"
+
+#: ../src/controlpanel/view/aboutxo.py:130
msgid "Firmware:"
msgstr "Firmware:"
+#: ../src/controlpanel/view/aboutxo.py:152
+msgid "Copyright and License"
+msgstr "Lastnik pravic"
+
+#: ../src/controlpanel/view/aboutxo.py:160
+msgid ""
+"© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
+msgstr "© 2008 One Laptop per Child Association Inc, Red Hat Inc in sodelavci."
+
+#: ../src/controlpanel/view/aboutxo.py:166
+msgid ""
+"Sugar is the graphical user interface that you are looking at. Sugar is free "
+"software, covered by the GNU General Public License, and you are welcome to "
+"change it and/or distribute copies of it under certain conditions described "
+"therein."
+msgstr ""
+"Sugar je grafični vmesnik, ki ga uporabljate. Je brezplačen, avtorske "
+"pravice glede njegove uporabe pa ureja GNU General Public License. Zato ga "
+"lahko spreminjate in/ali distribuirate, a pod nekaterimi pogoji, zapisanimi "
+"v omenjeni licenci."
+
+#: ../src/controlpanel/view/aboutxo.py:178
+msgid "Full license:"
+msgstr "Licenčne pravice:"
+
#: ../src/controlpanel/view/datetime.py:29
msgid "Date & Time"
msgstr "Datum in ura"
@@ -492,7 +547,7 @@ msgstr ""
#: ../src/controlpanel/view/power.py:89
msgid ""
-"Extreme power management (disables wireless radio, increases battery life)"
+"Extreme power management (disableswireless radio, increases battery life)"
msgstr ""
"Ekstremni nadzor porabe električne energije (ugasnjen radijski del, podaljša "
"življenjsko dobo baterije)"
@@ -529,36 +584,36 @@ msgstr "Neznano Mesh omrežje"
msgid "Decline"
msgstr "Zavrni"
-#: ../src/view/home/favoritesview.py:285
+#: ../src/view/home/favoritesview.py:286
msgid "Registration Failed"
-msgstr ""
+msgstr "Registracija ni uspela"
-#: ../src/view/home/favoritesview.py:286
+#: ../src/view/home/favoritesview.py:287
#, python-format
msgid "%s"
-msgstr ""
+msgstr "%s"
-#: ../src/view/home/favoritesview.py:288
+#: ../src/view/home/favoritesview.py:289
msgid "Registration Successful"
-msgstr ""
+msgstr "Uspešna registracija"
-#: ../src/view/home/favoritesview.py:289
+#: ../src/view/home/favoritesview.py:290
msgid "You are now registered with your school server."
-msgstr ""
+msgstr "Vpisan si v šolski strežnik."
-#: ../src/view/home/favoritesview.py:405
+#: ../src/view/home/favoritesview.py:407
msgid "Control Panel"
msgstr "Nadzorna plošča"
-#: ../src/view/home/favoritesview.py:416
+#: ../src/view/home/favoritesview.py:418
msgid "Restart"
msgstr "Ponovni zagon"
-#: ../src/view/home/favoritesview.py:421
+#: ../src/view/home/favoritesview.py:423
msgid "Shutdown"
msgstr "Zaustavitev"
-#: ../src/view/home/favoritesview.py:427
+#: ../src/view/home/favoritesview.py:429
msgid "Register"
msgstr "Registracija"
diff --git a/service/activityregistryservice.py b/service/activityregistryservice.py
index 6ba5598..c8a8efa 100644
--- a/service/activityregistryservice.py
+++ b/service/activityregistryservice.py
@@ -37,7 +37,8 @@ class ActivityRegistry(dbus.service.Object):
bundle_registry.connect('bundle-changed', self._bundle_changed_cb)
@dbus.service.method(_ACTIVITY_REGISTRY_IFACE,
- in_signature='s', out_signature='b')
+ in_signature='s', out_signature='b',
+ utf8_strings=True)
def AddBundle(self, bundle_path):
'''Register the activity bundle with the global registry
@@ -52,7 +53,8 @@ class ActivityRegistry(dbus.service.Object):
return registry.add_bundle(bundle_path)
@dbus.service.method(_ACTIVITY_REGISTRY_IFACE,
- in_signature='s', out_signature='b')
+ in_signature='s', out_signature='b',
+ utf8_strings=True)
def RemoveBundle(self, bundle_path):
'''Unregister the activity bundle with the global registry
diff --git a/service/bundleregistry.py b/service/bundleregistry.py
index e7c30a8..dd26f56 100644
--- a/service/bundleregistry.py
+++ b/service/bundleregistry.py
@@ -174,20 +174,30 @@ class BundleRegistry(gobject.GObject):
bundle_dirs.sort(lambda d1, d2: cmp(bundles[d1], bundles[d2]))
for folder in bundle_dirs:
try:
- self.add_bundle(folder)
+ self._add_bundle(folder)
except Exception, e:
logging.error('Error while processing installed activity ' \
'bundle: %s, %s, %s' % (folder, e.__class__, e))
def add_bundle(self, bundle_path):
+ bundle = self._add_bundle(bundle_path)
+ if bundle is not None:
+ self._set_bundle_favorite(bundle.get_bundle_id(),
+ bundle.get_activity_version(),
+ True)
+ self.emit('bundle-added', bundle)
+ return True
+ else:
+ return False
+
+ def _add_bundle(self, bundle_path):
try:
bundle = ActivityBundle(bundle_path)
except MalformedBundleException:
- return False
+ return None
self._bundles.append(bundle)
- self.emit('bundle-added', bundle)
- return True
+ return bundle
def remove_bundle(self, bundle_path):
for bundle in self._bundles:
@@ -223,17 +233,22 @@ class BundleRegistry(gobject.GObject):
(bundle_id, version))
def set_bundle_favorite(self, bundle_id, version, favorite):
+ changed = self._set_bundle_favorite(bundle_id, version, favorite)
+ if changed:
+ bundle = self._find_bundle(bundle_id, version)
+ self.emit('bundle-changed', bundle)
+
+ def _set_bundle_favorite(self, bundle_id, version, favorite):
key = self._get_favorite_key(bundle_id, version)
if favorite and not key in self._favorite_bundles:
self._favorite_bundles[key] = None
elif not favorite and key in self._favorite_bundles:
del self._favorite_bundles[key]
else:
- return
+ return False
self._write_favorites_file()
- bundle = self._find_bundle(bundle_id, version)
- self.emit('bundle-changed', bundle)
+ return True
def is_bundle_favorite(self, bundle_id, version):
key = self._get_favorite_key(bundle_id, version)
diff --git a/src/config.py.in b/src/config.py.in
index fb26181..f8e776f 100644
--- a/src/config.py.in
+++ b/src/config.py.in
@@ -16,4 +16,6 @@
prefix = '@prefix@'
data_path = '@prefix@/share/sugar/data'
-shell_path = '@prefix@/share/sugar/shell' \ No newline at end of file
+shell_path = '@prefix@/share/sugar/shell'
+version = '@SUCROSE_VERSION@'
+
diff --git a/src/controlpanel/cmd.py b/src/controlpanel/cmd.py
index 7cb40da..ae5d298 100644
--- a/src/controlpanel/cmd.py
+++ b/src/controlpanel/cmd.py
@@ -38,6 +38,7 @@ def cmd_help():
-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\
+ -c key clear the current value for the key \n\
')
def note_restart():
@@ -64,7 +65,7 @@ def load_modules():
def main():
try:
- options, args = getopt.getopt(sys.argv[1:], "h:s:g:l", [])
+ options, args = getopt.getopt(sys.argv[1:], "h:s:g:c:l", [])
except getopt.GetoptError:
cmd_help()
sys.exit(2)
@@ -126,3 +127,20 @@ def main():
print _(_same_option_warning % (key, module))
if found == 0:
print _(_no_option_error % key)
+ if option in ("-c"):
+ for module in modules:
+ method = getattr(module, 'clear_' + key, None)
+ if method:
+ note = 0
+ found += 1
+ if found == 1:
+ try:
+ note = method(*args)
+ except Exception, detail:
+ print _(_general_error % detail)
+ if note == _RESTART:
+ note_restart()
+ else:
+ print _(_same_option_warning % (key, module))
+ if found == 0:
+ print _(_no_option_error % key)
diff --git a/src/controlpanel/gui.py b/src/controlpanel/gui.py
index b72cbc6..527f3b7 100644
--- a/src/controlpanel/gui.py
+++ b/src/controlpanel/gui.py
@@ -51,6 +51,7 @@ class ControlPanel(gtk.Window):
self._toolbar = None
self._canvas = None
self._table = None
+ self._scrolledwindow = None
self._separator = None
self._section_view = None
self._section_toolbar = None
@@ -107,6 +108,14 @@ class ControlPanel(gtk.Window):
self._table = gtk.Table()
self._table.set_col_spacings(style.GRID_CELL_SIZE)
self._table.set_border_width(style.GRID_CELL_SIZE)
+
+ self._scrolledwindow = gtk.ScrolledWindow()
+ self._scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC,
+ gtk.POLICY_AUTOMATIC)
+ self._scrolledwindow.add_with_viewport(self._table)
+ child = self._scrolledwindow.get_child()
+ child.modify_bg(gtk.STATE_NORMAL, style.COLOR_BLACK.get_gdk_color())
+
self._setup_options()
self._main_toolbar.connect('stop-clicked',
self.__stop_clicked_cb)
@@ -146,10 +155,11 @@ class ControlPanel(gtk.Window):
def _show_main_view(self):
self._set_toolbar(self._main_toolbar)
self._main_toolbar.show()
- self._set_canvas(self._table)
+ self._set_canvas(self._scrolledwindow)
self._main_view.modify_bg(gtk.STATE_NORMAL,
style.COLOR_BLACK.get_gdk_color())
self._table.show()
+ self._scrolledwindow.show()
entry = self._main_toolbar.get_entry()
entry.grab_focus()
entry.set_text('')
@@ -182,7 +192,6 @@ class ControlPanel(gtk.Window):
title = self._section_toolbar.get_title()
title.set_text(self._options[option]['title'])
self._section_toolbar.show()
- self._section_toolbar.accept_button.set_sensitive(True)
self._current_option = option
view_class = self._options[option]['view']
@@ -257,11 +266,13 @@ class ControlPanel(gtk.Window):
def __cancel_clicked_cb(self, widget):
self._section_view.undo()
self._options[self._current_option]['alerts'] = []
+ self._section_toolbar.accept_button.set_sensitive(True)
self._show_main_view()
def __accept_clicked_cb(self, widget):
if self._section_view.needs_restart:
self._section_toolbar.accept_button.set_sensitive(False)
+ self._section_toolbar.cancel_button.set_sensitive(False)
alert = Alert()
alert.props.title = _('Warning')
alert.props.msg = _('Changes require restart')
@@ -287,12 +298,13 @@ class ControlPanel(gtk.Window):
self._show_main_view()
def __response_cb(self, alert, response_id):
- self._vbox.remove(alert)
+ self._vbox.remove(alert)
+ self._section_toolbar.accept_button.set_sensitive(True)
+ self._section_toolbar.cancel_button.set_sensitive(True)
if response_id is gtk.RESPONSE_CANCEL:
self._section_view.undo()
self._section_view.setup()
self._options[self._current_option]['alerts'] = []
- self._section_toolbar.accept_button.set_sensitive(True)
elif response_id is gtk.RESPONSE_ACCEPT:
self._options[self._current_option]['alerts'] = \
self._section_view.restart_alerts
@@ -333,9 +345,7 @@ class ModelWrapper(object):
self._options[method[4:]] = None
def __getattr__(self, name):
- if name.startswith('get_') or name.startswith('set_') or \
- name.startswith('read_'):
- return getattr(self._module, name)
+ return getattr(self._module, name)
def undo(self):
for key in self._options.keys():
diff --git a/src/controlpanel/model/aboutxo.py b/src/controlpanel/model/aboutxo.py
index 5d17cca..10815ef 100644
--- a/src/controlpanel/model/aboutxo.py
+++ b/src/controlpanel/model/aboutxo.py
@@ -75,3 +75,27 @@ def _read_file(path):
else:
_logger.debug('No information in file or directory: %s' % path)
return None
+
+def get_license():
+ license_file = "/usr/share/licenses/common-licenses/GPL-2"
+ lang = os.environ['LANG']
+ if lang.endswith("UTF-8"):
+ lang = lang[:-6]
+
+ try_file = license_file + "." + lang
+ if os.path.isfile(try_file):
+ license_file = try_file
+ else:
+ try_file = license_file + "." + lang.split("_")[0]
+ if os.path.isfile(try_file):
+ license_file = try_file
+
+ try:
+ fd = open(license_file)
+ # remove 0x0c page breaks which can't be rendered in text views
+ license_text = fd.read().replace('\x0c', '')
+ fd.close()
+ except IOError:
+ license_text = _not_available
+ return license_text
+
diff --git a/src/controlpanel/model/datetime.py b/src/controlpanel/model/datetime.py
index a449fd0..4a4c560 100644
--- a/src/controlpanel/model/datetime.py
+++ b/src/controlpanel/model/datetime.py
@@ -29,6 +29,10 @@ _zone_tab = '/usr/share/zoneinfo/zone.tab'
def _initialize():
'''Initialize the docstring of the set function'''
+ if set_timezone.__doc__ is None:
+ # when running under 'python -OO', all __doc__ fields are None,
+ # so += would fail -- and this function would be unnecessary anyway.
+ return
timezones = read_all_timezones()
for timezone in timezones:
set_timezone.__doc__ += timezone + '\n'
diff --git a/src/controlpanel/model/language.py b/src/controlpanel/model/language.py
index 3215465..404d9dd 100644
--- a/src/controlpanel/model/language.py
+++ b/src/controlpanel/model/language.py
@@ -43,10 +43,20 @@ def read_all_languages():
if locale.endswith('utf8') and len(lang):
locales.append((lang, territory, locale))
+ #FIXME: This is a temporary workaround for locales that are essential to
+ # OLPC, but are not in Glibc yet.
+ locales.append(('Kreyol', 'Haiti', 'ht_HT.utf8'))
+ locales.append(('Dari', 'Afghanistan', 'fa_AF.utf8'))
+ locales.append(('Pashto', 'Afghanistan', 'ps_AF.utf8'))
+
locales.sort()
return locales
def _initialize():
+ if set_language.__doc__ is None:
+ # when running under 'python -OO', all __doc__ fields are None,
+ # so += would fail -- and this function would be unnecessary anyway.
+ return
languages = read_all_languages()
set_language.__doc__ += '\n'
for lang in languages:
diff --git a/src/controlpanel/model/network.py b/src/controlpanel/model/network.py
index d24c986..cbe0473 100644
--- a/src/controlpanel/model/network.py
+++ b/src/controlpanel/model/network.py
@@ -19,6 +19,7 @@ import dbus
from gettext import gettext as _
from sugar import profile
+from hardware import hardwaremanager
NM_SERVICE_NAME = 'org.freedesktop.NetworkManager'
NM_SERVICE_PATH = '/org/freedesktop/NetworkManager'
@@ -44,8 +45,6 @@ def set_jabber(server):
"""Set the jabber server
server : e.g. 'olpc.collabora.co.uk'
"""
- if not server:
- raise ValueError(_("You must enter a server."))
pro = profile.get_profile()
pro.jabber_server = server
pro.jabber_registered = False
@@ -83,3 +82,20 @@ def set_radio(state):
raise ValueError(_("Error in specified radio argument use on/off."))
return 0
+
+def clear_registration():
+ """Clear the registration with the schoolserver
+ """
+ pro = profile.get_profile()
+ pro.backup1 = None
+ pro.save()
+ return 1
+
+def clear_networks():
+ """Clear saved passwords and network configurations.
+ """
+ network_manager = hardwaremanager.get_network_manager()
+ if not network_manager:
+ return
+ network_manager.nminfo.delete_all_networks()
+ return 1
diff --git a/src/controlpanel/toolbar.py b/src/controlpanel/toolbar.py
index 98d3792..6bb8328 100644
--- a/src/controlpanel/toolbar.py
+++ b/src/controlpanel/toolbar.py
@@ -111,11 +111,11 @@ class SectionToolbar(gtk.Toolbar):
self._add_separator(True)
- cancel_button = ToolButton('dialog-cancel')
- cancel_button.set_tooltip(_('Cancel'))
- cancel_button.connect('clicked', self.__cancel_button_clicked_cb)
- self.insert(cancel_button, -1)
- cancel_button.show()
+ self.cancel_button = ToolButton('dialog-cancel')
+ self.cancel_button.set_tooltip(_('Cancel'))
+ self.cancel_button.connect('clicked', self.__cancel_button_clicked_cb)
+ self.insert(self.cancel_button, -1)
+ self.cancel_button.show()
self.accept_button = ToolButton('dialog-ok')
self.accept_button.set_tooltip(_('Ok'))
diff --git a/src/controlpanel/view/aboutme.py b/src/controlpanel/view/aboutme.py
index 2245540..a871871 100644
--- a/src/controlpanel/view/aboutme.py
+++ b/src/controlpanel/view/aboutme.py
@@ -177,6 +177,12 @@ class AboutMe(SectionView):
self._nick_alert.hide()
self._color_alert.hide()
+ def _validate(self):
+ if self._nick_valid and self._color_valid:
+ self.props.is_valid = True
+ else:
+ self.props.is_valid = False
+
def __nick_changed_cb(self, widget, data=None):
if self._nick_sid:
gobject.source_remove(self._nick_sid)
@@ -193,18 +199,13 @@ class AboutMe(SectionView):
except ValueError, detail:
self._nick_alert.props.msg = detail
self._nick_valid = False
- self.needs_restart = False
else:
self._nick_alert.props.msg = self.restart_msg
self._nick_valid = True
self.needs_restart = True
self.restart_alerts.append('nick')
-
- if self._nick_valid and self._color_valid:
- self.props.is_valid = True
- else:
- self.props.is_valid = False
+ self._validate()
self._nick_alert.show()
return False
@@ -215,11 +216,7 @@ class AboutMe(SectionView):
self._color_valid = True
self.restart_alerts.append('color')
- if self._nick_valid and self._color_valid:
- self.props.is_valid = True
- else:
- self.props.is_valid = False
-
+ self._validate()
self._color_alert.show()
diff --git a/src/controlpanel/view/aboutxo.py b/src/controlpanel/view/aboutxo.py
index 04833f0..4c1d299 100644
--- a/src/controlpanel/view/aboutxo.py
+++ b/src/controlpanel/view/aboutxo.py
@@ -1,3 +1,4 @@
+# coding=utf-8
# Copyright (C) 2008, OLPC
#
# This program is free software; you can redistribute it and/or modify
@@ -17,6 +18,7 @@
import gtk
from gettext import gettext as _
+import config
from sugar.graphics import style
from controlpanel.sectionview import SectionView
@@ -36,17 +38,27 @@ class AboutXO(SectionView):
self._group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
+ scrollwindow = gtk.ScrolledWindow()
+ scrollwindow.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+ self.pack_start(scrollwindow, expand=True)
+ scrollwindow.show()
+
+ self._vbox = gtk.VBox()
+ scrollwindow.add_with_viewport(self._vbox)
+ self._vbox.show()
+
self._setup_identity()
self._setup_software()
+ self._setup_copyright()
def _setup_identity(self):
separator_identity = gtk.HSeparator()
- self.pack_start(separator_identity, expand=False)
+ self._vbox.pack_start(separator_identity, expand=False)
separator_identity.show()
label_identity = gtk.Label(_('Identity'))
label_identity.set_alignment(0, 0)
- self.pack_start(label_identity, expand=False)
+ self._vbox.pack_start(label_identity, expand=False)
label_identity.show()
vbox_identity = gtk.VBox()
vbox_identity.set_border_width(style.DEFAULT_SPACING * 2)
@@ -67,18 +79,18 @@ class AboutXO(SectionView):
vbox_identity.pack_start(box_identity, expand=False)
box_identity.show()
- self.pack_start(vbox_identity, expand=False)
+ self._vbox.pack_start(vbox_identity, expand=False)
vbox_identity.show()
def _setup_software(self):
separator_software = gtk.HSeparator()
- self.pack_start(separator_software, expand=False)
+ self._vbox.pack_start(separator_software, expand=False)
separator_software.show()
label_software = gtk.Label(_('Software'))
label_software.set_alignment(0, 0)
- self.pack_start(label_software, expand=False)
+ self._vbox.pack_start(label_software, expand=False)
label_software.show()
box_software = gtk.VBox()
box_software.set_border_width(style.DEFAULT_SPACING * 2)
@@ -99,6 +111,21 @@ class AboutXO(SectionView):
box_software.pack_start(box_build, expand=False)
box_build.show()
+ box_sugar = gtk.HBox(spacing=style.DEFAULT_SPACING)
+ label_sugar = gtk.Label(_('Sugar:'))
+ label_sugar.set_alignment(1, 0)
+ label_sugar.modify_fg(gtk.STATE_NORMAL,
+ style.COLOR_SELECTION_GREY.get_gdk_color())
+ box_sugar.pack_start(label_sugar, expand=False)
+ self._group.add_widget(label_sugar)
+ label_sugar.show()
+ label_sugar_ver = gtk.Label(config.version)
+ label_sugar_ver.set_alignment(0, 0)
+ box_sugar.pack_start(label_sugar_ver, expand=False)
+ label_sugar_ver.show()
+ box_software.pack_start(box_sugar, expand=False)
+ box_sugar.show()
+
box_firmware = gtk.HBox(spacing=style.DEFAULT_SPACING)
label_firmware = gtk.Label(_('Firmware:'))
label_firmware.set_alignment(1, 0)
@@ -114,5 +141,57 @@ class AboutXO(SectionView):
box_software.pack_start(box_firmware, expand=False)
box_firmware.show()
- self.pack_start(box_software, expand=False)
+ self._vbox.pack_start(box_software, expand=False)
box_software.show()
+
+ def _setup_copyright(self):
+ separator_copyright = gtk.HSeparator()
+ self._vbox.pack_start(separator_copyright, expand=False)
+ separator_copyright.show()
+
+ label_copyright = gtk.Label(_('Copyright and License'))
+ label_copyright.set_alignment(0, 0)
+ self._vbox.pack_start(label_copyright, expand=False)
+ label_copyright.show()
+ vbox_copyright = gtk.VBox()
+ vbox_copyright.set_border_width(style.DEFAULT_SPACING * 2)
+ vbox_copyright.set_spacing(style.DEFAULT_SPACING)
+
+ label_copyright = gtk.Label(_("© 2008 One Laptop per Child "
+ "Association Inc; Red Hat Inc; "
+ "and Contributors."))
+ label_copyright.set_alignment(0, 0)
+ label_copyright.show()
+ vbox_copyright.pack_start(label_copyright, expand=False)
+
+ label_info = gtk.Label(_("Sugar is the graphical user interface that "
+ "you are looking at. Sugar is free software, "
+ "covered by the GNU General Public License, "
+ "and you are welcome to change it and/or "
+ "distribute copies of it under certain "
+ "conditions described therein."))
+ label_info.set_alignment(0, 0)
+ label_info.set_line_wrap(True)
+ label_info.set_size_request(gtk.gdk.screen_width() / 2, -1)
+ label_info.show()
+ vbox_copyright.pack_start(label_info, expand=False)
+
+ expander = gtk.Expander(_("Full license:"))
+ expander.connect("notify::expanded", self.license_expander_cb)
+ expander.show()
+ vbox_copyright.pack_start(expander, expand=True)
+
+ self._vbox.pack_start(vbox_copyright, expand=True)
+ vbox_copyright.show()
+
+ def license_expander_cb(self, expander, param_spec):
+ # load/destroy the license viewer on-demand, to avoid storing the
+ # GPL in memory at all times
+ if expander.get_expanded():
+ view_license = gtk.TextView()
+ view_license.set_editable(False)
+ view_license.get_buffer().set_text(self._model.get_license())
+ view_license.show()
+ expander.add(view_license)
+ else:
+ expander.get_child().destroy()
diff --git a/src/controlpanel/view/datetime.py b/src/controlpanel/view/datetime.py
index 47ba433..f178515 100644
--- a/src/controlpanel/view/datetime.py
+++ b/src/controlpanel/view/datetime.py
@@ -113,15 +113,11 @@ class TimeZone(SectionView):
def __realize_cb(self, widget):
self._entry.grab_focus()
- def _search(self, model, column_, key, iter_, data=None):
- for row in model:
- if key.lower() in row[0].lower():
- self._treeview.set_cursor(row.path, self._timezone_column,
- False)
- self._treeview.scroll_to_cell(row.path, self._timezone_column,
- True, 0.5, 0.5)
- return True
- return False
+ def _search(self, model, column, key, iterator, data=None):
+ value = model.get_value(iterator, column)
+ if key.lower() in value.lower():
+ return False
+ return True
def __zone_changed_cd(self, treeview, data=None):
list_, row = treeview.get_selection().get_selected()
diff --git a/src/controlpanel/view/frame.py b/src/controlpanel/view/frame.py
index f085b0d..09b973e 100644
--- a/src/controlpanel/view/frame.py
+++ b/src/controlpanel/view/frame.py
@@ -163,6 +163,12 @@ class Frame(SectionView):
self._corner_delay_alert.hide()
self._edge_delay_alert.hide()
+ def _validate(self):
+ if self._edge_delay_is_valid and self._corner_delay_is_valid:
+ self.props.is_valid = True
+ else:
+ self.props.is_valid = False
+
def __corner_delay_changed_cb(self, scale, data=None):
if self._corner_delay_sid:
gobject.source_remove(self._corner_delay_sid)
@@ -178,18 +184,13 @@ class Frame(SectionView):
except ValueError, detail:
self._corner_delay_alert.props.msg = detail
self._corner_delay_is_valid = False
- self.needs_restart = False
else:
self._corner_delay_alert.props.msg = self.restart_msg
self._corner_delay_is_valid = True
self.needs_restart = True
self.restart_alerts.append('corner_delay')
- if self._corner_delay_is_valid:
- self.props.is_valid = True
- else:
- self.props.is_valid = False
-
+ self._validate()
self._corner_delay_alert.show()
return False
@@ -216,18 +217,13 @@ class Frame(SectionView):
except ValueError, detail:
self._edge_delay_alert.props.msg = detail
self._edge_delay_is_valid = False
- self.needs_restart = False
else:
self._edge_delay_alert.props.msg = self.restart_msg
self._edge_delay_is_valid = True
self.needs_restart = True
self.restart_alerts.append('edge_delay')
- if self._edge_delay_is_valid:
- self.props.is_valid = True
- else:
- self.props.is_valid = False
-
+ self._validate()
self._edge_delay_alert.show()
return False
diff --git a/src/controlpanel/view/language.py b/src/controlpanel/view/language.py
index 3c47691..db2042e 100644
--- a/src/controlpanel/view/language.py
+++ b/src/controlpanel/view/language.py
@@ -117,15 +117,11 @@ class Language(SectionView):
def __realize_cb(self, widget):
self._entry.grab_focus()
- def _search(self, model, column_, key, iter_, data=None):
- for row in model:
- if key.lower() in row[1].lower():
- self._treeview.set_cursor(row.path, self._language_column,
- False)
- self._treeview.scroll_to_cell(row.path, self._language_column,
- True, 0.5, 0.5)
- return True
- return False
+ def _search(self, model, column, key, iterator, data=None):
+ value = model.get_value(iterator, column)
+ if key.lower() in value.lower():
+ return False
+ return True
def __lang_changed_cd(self, treeview, data=None):
row = treeview.get_selection().get_selected()
diff --git a/src/controlpanel/view/network.py b/src/controlpanel/view/network.py
index af64a1a..2b19656 100644
--- a/src/controlpanel/view/network.py
+++ b/src/controlpanel/view/network.py
@@ -38,6 +38,7 @@ class Network(SectionView):
self._radio_valid = True
self._jabber_change_handler = None
self._radio_change_handler = None
+ self._network_configuration_reset_handler = None
self.set_border_width(style.DEFAULT_SPACING * 2)
self.set_spacing(style.DEFAULT_SPACING)
@@ -57,33 +58,51 @@ class Network(SectionView):
box_wireless = gtk.VBox()
box_wireless.set_border_width(style.DEFAULT_SPACING * 2)
box_wireless.set_spacing(style.DEFAULT_SPACING)
+
+ radio_info = gtk.Label(_("Turn of the wireless radio to save "
+ "battery life"))
+ radio_info.set_alignment(0, 0)
+ radio_info.set_line_wrap(True)
+ radio_info.show()
+ box_wireless.pack_start(radio_info, expand=False)
+
box_radio = gtk.HBox(spacing=style.DEFAULT_SPACING)
- label_radio = gtk.Label(_('Radio:'))
- label_radio.set_alignment(1, 0.5)
- label_radio.modify_fg(gtk.STATE_NORMAL,
- style.COLOR_SELECTION_GREY.get_gdk_color())
- box_radio.pack_start(label_radio, expand=False)
- group.add_widget(label_radio)
- label_radio.show()
self._button = gtk.CheckButton()
self._button.set_alignment(0, 0)
box_radio.pack_start(self._button, expand=False)
self._button.show()
+
+ label_radio = gtk.Label(_('Radio'))
+ label_radio.set_alignment(0, 0.5)
+ box_radio.pack_start(label_radio, expand=False)
+ label_radio.show()
+
box_wireless.pack_start(box_radio, expand=False)
box_radio.show()
self._radio_alert = InlineAlert()
- label_radio_error = gtk.Label()
- group.add_widget(label_radio_error)
- self._radio_alert_box.pack_start(label_radio_error, expand=False)
- label_radio_error.show()
self._radio_alert_box.pack_start(self._radio_alert, expand=False)
- box_wireless.pack_end(self._radio_alert_box, expand=False)
+ box_radio.pack_end(self._radio_alert_box, expand=False)
self._radio_alert_box.show()
if 'radio' in self.restart_alerts:
self._radio_alert.props.msg = self.restart_msg
self._radio_alert.show()
+ history_info = gtk.Label(_("Discard network history if you "
+ "have trouble connecting to the network"))
+ history_info.set_alignment(0, 0)
+ history_info.set_line_wrap(True)
+ history_info.show()
+ box_wireless.pack_start(history_info, expand=False)
+
+ box_clear_history = gtk.HBox(spacing=style.DEFAULT_SPACING)
+ self._clear_history_button = gtk.Button()
+ self._clear_history_button.set_label(_('Discard network history'))
+ box_clear_history.pack_start(self._clear_history_button, expand=False)
+ self._clear_history_button.show()
+ box_wireless.pack_start(box_clear_history, expand=False)
+ box_clear_history.show()
+
self.pack_start(box_wireless, expand=False)
box_wireless.show()
@@ -153,6 +172,9 @@ class Network(SectionView):
'toggled', self.__radio_toggled_cb)
self._jabber_change_handler = self._entry.connect( \
'changed', self.__jabber_changed_cb)
+ self._network_configuration_reset_handler = \
+ self._clear_history_button.connect( \
+ 'clicked', self.__network_configuration_reset_cb)
def undo(self):
self._button.disconnect(self._radio_change_handler)
@@ -161,6 +183,12 @@ class Network(SectionView):
self._jabber_alert.hide()
self._radio_alert.hide()
+ def _validate(self):
+ if self._jabber_valid and self._radio_valid:
+ self.props.is_valid = True
+ else:
+ self.props.is_valid = False
+
def __radio_toggled_cb(self, widget, data=None):
radio_state = widget.get_active()
try:
@@ -171,11 +199,7 @@ class Network(SectionView):
else:
self._radio_valid = True
- if self._radio_valid and self._jabber_valid:
- self.props.is_valid = True
- else:
- self.props.is_valid = False
-
+ self._validate()
return False
def __jabber_changed_cb(self, widget, data=None):
@@ -193,17 +217,15 @@ class Network(SectionView):
except ValueError, detail:
self._jabber_alert.props.msg = detail
self._jabber_valid = False
- self.needs_restart = False
else:
self._jabber_alert.props.msg = self.restart_msg
self._jabber_valid = True
self.needs_restart = True
self.restart_alerts.append('jabber')
- if self._jabber_valid and self._radio_valid:
- self.props.is_valid = True
- else:
- self.props.is_valid = False
-
+ self._validate()
self._jabber_alert.show()
return False
+
+ def __network_configuration_reset_cb(self, widget):
+ self._model.clear_networks()
diff --git a/src/controlpanel/view/power.py b/src/controlpanel/view/power.py
index 38d2b24..f4d817b 100644
--- a/src/controlpanel/view/power.py
+++ b/src/controlpanel/view/power.py
@@ -147,6 +147,12 @@ class Power(SectionView):
self._extreme_pm_alert.hide()
self._automatic_pm_alert.hide()
+ def _validate(self):
+ if self._extreme_pm_valid and self._automatic_pm_valid:
+ self.props.is_valid = True
+ else:
+ self.props.is_valid = False
+
def __automatic_pm_toggled_cb(self, widget, data=None):
state = widget.get_active()
try:
@@ -157,11 +163,7 @@ class Power(SectionView):
else:
self._automatic_pm_valid = True
- if self._automatic_pm_valid and self._extreme_pm_valid:
- self.props.is_valid = True
- else:
- self.props.is_valid = False
-
+ self._validate()
return False
def __extreme_pm_toggled_cb(self, widget, data=None):
@@ -174,9 +176,5 @@ class Power(SectionView):
else:
self._extreme_pm_valid = True
- if self._extreme_pm_valid and self._extreme_pm_valid:
- self.props.is_valid = True
- else:
- self.props.is_valid = False
-
+ self._validate()
return False
diff --git a/src/hardware/hardwaremanager.py b/src/hardware/hardwaremanager.py
index d5a16ef..c4f9f75 100644
--- a/src/hardware/hardwaremanager.py
+++ b/src/hardware/hardwaremanager.py
@@ -18,12 +18,11 @@ import logging
import dbus
import gobject
-import gst
-import gst.interfaces
from hardware.nmclient import NMClient
from sugar.profile import get_profile
from sugar import env
+from sugar import _sugarext
_HARDWARE_MANAGER_INTERFACE = 'org.freedesktop.ohm.Keystore'
_HARDWARE_MANAGER_SERVICE = 'org.freedesktop.ohm'
@@ -53,85 +52,24 @@ class HardwareManager(gobject.GObject):
follow_name_owner_changes=True)
self._service = dbus.Interface(proxy, _HARDWARE_MANAGER_INTERFACE)
- 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 __muted_changed_cb(self, old_state, new_state):
- if old_state != new_state:
- self.emit('muted-changed', old_state, new_state)
-
- def __volume_changed_cb(self, old_volume, new_volume):
- if old_volume != new_volume:
- self.emit('volume-changed', old_volume, new_volume)
+ self._volume = _sugarext.VolumeAlsa()
def get_muted(self):
- if not self._mixer or not self._master:
- logging.error('Cannot get the mute status')
- return True
- return self._master.flags & gst.interfaces.MIXER_TRACK_MUTE \
- == gst.interfaces.MIXER_TRACK_MUTE
+ return self._volume.get_mute()
def get_volume(self):
- if not self._mixer or not self._master:
- logging.error('Cannot get the volume')
- return 0
-
- max_volume = self._master.max_volume
- min_volume = self._master.min_volume
-
- volumes = self._mixer.get_volume(self._master)
-
- #sometimes we get a spurious zero from one/more channel(s)
- #TODO: consider removing this when trac #6933 is resolved
- nonzero_volumes = [v for v in volumes if v > 0]
-
- if len(nonzero_volumes) > 0:
- #we could just pick the first nonzero volume, but this converges
- volume = sum(nonzero_volumes) / len(nonzero_volumes)
- return volume * 100.0 / (max_volume - min_volume) + min_volume
- else:
- return 0
+ return self._volume.get_volume()
def set_volume(self, new_volume):
- if not self._mixer or not self._master:
- logging.error('Cannot set the volume')
- return
-
- if new_volume < 0 or new_volume > 100:
- logging.error('Trying to set an invalid volume value.')
- return
-
- old_volume = self.get_volume()
- max_volume = self._master.max_volume
- min_volume = self._master.min_volume
-
- new_volume_mixer_range = min_volume + \
- (new_volume * ((max_volume - min_volume) / 100.0))
- volume_list = [ new_volume_mixer_range ] * self._master.num_channels
-
- #sometimes alsa sets one/more channels' volume to zero instead
- # of what we asked for, so try a few times
- #TODO: consider removing this loop when trac #6934 is resolved
- last_volumes_read = [0]
- read_count = 0
- while (0 in last_volumes_read) and (read_count < 3):
- self._mixer.set_volume(self._master, tuple(volume_list))
- last_volumes_read = self._mixer.get_volume(self._master)
- read_count += 1
+ old_volume = self._volume.get_volume()
+ self._volume.set_volume(new_volume)
self.emit('volume-changed', old_volume, new_volume)
def set_muted(self, new_state):
- if not self._mixer or not self._master:
- logging.error('Cannot mute the audio channel')
- return
- old_state = self.get_muted()
- self._mixer.set_mute(self._master, new_state)
+ old_state = self._volume.get_mute()
+ self._volume.set_mute(new_state)
+
self.emit('muted-changed', old_state, new_state)
def startup(self):
diff --git a/src/hardware/nmclient.py b/src/hardware/nmclient.py
index 5a92176..c517391 100644
--- a/src/hardware/nmclient.py
+++ b/src/hardware/nmclient.py
@@ -214,7 +214,9 @@ class Device(gobject.GObject):
([gobject.TYPE_PYOBJECT])),
'network-disappeared': (gobject.SIGNAL_RUN_FIRST,
gobject.TYPE_NONE,
- ([gobject.TYPE_PYOBJECT]))
+ ([gobject.TYPE_PYOBJECT])),
+ 'ip-changed': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE, ([])),
}
def __init__(self, client, op):
@@ -235,6 +237,7 @@ class Device(gobject.GObject):
self._state = DEVICE_STATE_INACTIVE
self._active_network = None
self._active_net_sigid = 0
+ self._ip_address = None
obj = sys_bus.get_object(NM_SERVICE, self._op)
self.dev = dbus.Interface(obj, NM_IFACE_DEVICES)
@@ -251,6 +254,18 @@ class Device(gobject.GObject):
return True
return False
+ # 6248: remove for NM0.7; http://dev.laptop.org/ticket/6248#comment:2
+ def _getproperties_for_ip_only_reply_cb(self, *props):
+ current_ip = props[6]
+ if current_ip != self._ip_address:
+ self._ip_address = current_ip
+ if self._valid:
+ self.emit('ip-changed')
+
+ # 6248: remove for NM0.7; http://dev.laptop.org/ticket/6248#comment:2
+ def _getproperties_for_ip_only_error_cb(self, err):
+ logging.warning("Device(%s): failed to update. (%s)" % (self._op, err))
+
def _update_reply_cb(self, *props):
self._iface = props[1]
self._type = props[2]
@@ -276,6 +291,11 @@ class Device(gobject.GObject):
self._valid = True
+ # 6248: remove for NM0.7; http://dev.laptop.org/ticket/6248#comment:2
+ if props[6] != self._ip_address:
+ self._ip_address = props[6]
+ self.emit('ip-changed')
+
if self._is_activating():
self.set_state(DEVICE_STATE_ACTIVATING)
elif self._is_activated():
@@ -353,6 +373,9 @@ class Device(gobject.GObject):
self._freq = freq / 1000000000.0
return self._freq
+ def get_ip_address(self):
+ return self._ip_address
+
def get_strength(self):
return self._strength
@@ -369,6 +392,18 @@ class Device(gobject.GObject):
self.emit('strength-changed')
def network_appeared(self, network):
+ # NM may emit NetworkAppeared messages before the initialization-time
+ # getProperties call completes. This means that we are in danger of
+ # instantiating the "appeared" network here, and then instantiating
+ # the same network later on when getProperties completes
+ # (_update_reply_cb calls _update_networks).
+ # We avoid this race by confirming that getProperties has completed
+ # before listening to any NetworkAppeared messages. We assume that
+ # any networks that get reported as appeared in this race window
+ # will be included in the getProperties response.
+ if not self._valid:
+ return
+
if self._networks.has_key(network):
return
net = Network(self._client, network)
@@ -454,6 +489,13 @@ class Device(gobject.GObject):
self._get_active_net_cb(state, *args),
error_handler=self._get_active_net_error_cb)
+ if state == DEVICE_STATE_ACTIVATED:
+ # 6248: reimplement for NM0.7
+ # see http://dev.laptop.org/ticket/6248#comment:2
+ self.dev.getProperties(
+ reply_handler=self._getproperties_for_ip_only_reply_cb,
+ error_handler=self._getproperties_for_ip_only_error_cb)
+
def set_activation_stage(self, stage):
if stage == self._act_stage:
return
@@ -461,6 +503,12 @@ class Device(gobject.GObject):
if self._valid:
self.emit('activation-stage-changed')
+ # 6248: reimplement for NM0.7
+ # see http://dev.laptop.org/ticket/6248#comment:2
+ self.dev.getProperties(
+ reply_handler=self._getproperties_for_ip_only_reply_cb,
+ error_handler=self._getproperties_for_ip_only_error_cb)
+
def get_activation_stage(self):
return self._act_stage
diff --git a/src/hardware/nminfo.py b/src/hardware/nminfo.py
index e561ff1..9f427e0 100644
--- a/src/hardware/nminfo.py
+++ b/src/hardware/nminfo.py
@@ -333,7 +333,7 @@ class Network:
config.set(self.ssid, "timestamp", self.timestamp)
if len(self.bssids) > 0:
opt = " "
- opt.join(self.bssids)
+ opt = opt.join(self.bssids)
config.set(self.ssid, "bssids", opt)
self._security.write_to_config(self.ssid, config)
except Exception, e:
@@ -549,3 +549,8 @@ class NMInfo(object):
return
self._key_dialog_destroy_cb(self._key_dialog)
+ # this method is invoked directly in-process (not by DBus).
+ def delete_all_networks(self):
+ self._allowed_networks = {}
+ self.save_config()
+
diff --git a/src/main.py b/src/main.py
index b37d75c..1bb91af 100644
--- a/src/main.py
+++ b/src/main.py
@@ -16,11 +16,6 @@
import os
import gettext
-import logging
-
-# 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')
@@ -73,22 +68,12 @@ def _shell_started_cb():
hw_manager = hardwaremanager.get_manager()
hw_manager.set_dcon_freeze(0)
-def _open_control_panel_cb(cp_section_name):
- '''Open the `cp_section_name` control panel module and enable
- auto-close
+def _software_update_cb():
+ '''Ask the homeview to display an alert about available software updates
'''
-
- # FIXME: should be replaced by a mechanism based on the notification system,
- # once the notification system is in place; clicking on a button
- # in the notification window would do the actual control panel open.
-
- from controlpanel.gui import ControlPanel
shell = view.Shell.get_instance()
- panel = ControlPanel()
- panel.set_transient_for(shell.home_window)
- panel.show()
- panel.show_section_view(cp_section_name)
- panel.set_section_view_auto_close()
+ home_box = shell.home_window.get_home_box()
+ home_box.show_software_updates_alert()
def main():
gobject.idle_add(_shell_started_cb)
@@ -118,7 +103,7 @@ def main():
gtk.main()
# set timezone
- if os.environ.has_key('TZ'):
+ if get_profile().timezone is not None:
os.environ['TZ'] = get_profile().timezone
if os.environ.has_key("SUGAR_TP_DEBUG"):
@@ -160,12 +145,7 @@ def main():
# to update activities.
update_trigger_file = os.path.expanduser('~/.sugar-update')
if os.path.isfile(update_trigger_file):
- gobject.idle_add(_open_control_panel_cb, 'updater')
- try:
- os.unlink(update_trigger_file)
- except OSError:
- logging.error('Software-update: Can not remove file %s' %
- update_trigger_file)
+ gobject.idle_add(_software_update_cb)
try:
gtk.main()
diff --git a/src/model/devices/network/mesh.py b/src/model/devices/network/mesh.py
index 36626e6..ec2ca7b 100644
--- a/src/model/devices/network/mesh.py
+++ b/src/model/devices/network/mesh.py
@@ -28,11 +28,14 @@ class Device(device.Device):
'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),
+ 'ip-address' : (str, None, None, None, gobject.PARAM_READABLE),
}
def __init__(self, nm_device):
device.Device.__init__(self)
self._nm_device = nm_device
+ self._nm_device.connect('ip-changed', self._ip_changed_cb)
+ self.notify('ip-address')
self._nm_device.connect('strength-changed',
self._strength_changed_cb)
@@ -47,6 +50,9 @@ class Device(device.Device):
def _state_changed_cb(self, nm_device):
self.notify('state')
+ def _ip_changed_cb(self, nm_device):
+ self.notify('ip-address')
+
def _activation_stage_changed_cb(self, nm_device):
self.notify('activation-stage')
@@ -62,6 +68,12 @@ class Device(device.Device):
return self._nm_device.get_frequency()
elif pspec.name == 'mesh-step':
return self._nm_device.get_mesh_step()
+ elif pspec.name == 'ip-address':
+ return self.get_ip_address()
+
+ def get_ip_address(self):
+ if self._nm_device is not None:
+ return self._nm_device.get_ip_address()
def get_type(self):
return 'network.mesh'
diff --git a/src/model/devices/network/wireless.py b/src/model/devices/network/wireless.py
index 8bf407e..b2efb49 100644
--- a/src/model/devices/network/wireless.py
+++ b/src/model/devices/network/wireless.py
@@ -44,7 +44,8 @@ class Device(device.Device):
'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)
+ gobject.PARAM_READABLE),
+ 'ip-address' : (str, None, None, None, gobject.PARAM_READABLE),
}
def __init__(self, nm_device):
@@ -57,6 +58,7 @@ class Device(device.Device):
self._ssid_changed_cb)
self._nm_device.connect('state-changed',
self._state_changed_cb)
+ self._nm_device.connect('ip-changed', self._ip_changed_cb)
def _strength_changed_cb(self, nm_device):
self.notify('strength')
@@ -67,6 +69,9 @@ class Device(device.Device):
def _state_changed_cb(self, nm_device):
self.notify('state')
+ def _ip_changed_cb(self, nm_device):
+ self.notify('ip-address')
+
def do_get_property(self, pspec):
if pspec.name == 'strength':
return self._nm_device.get_strength()
@@ -80,6 +85,8 @@ class Device(device.Device):
return device.nm_state_to_state[nm_state]
elif pspec.name == 'frequency':
return self._nm_device.get_frequency()
+ elif pspec.name == 'ip-address':
+ return self._nm_device.get_ip_address()
def get_type(self):
return 'network.wireless'
diff --git a/src/model/homeactivity.py b/src/model/homeactivity.py
index fa50932..6df4ddd 100644
--- a/src/model/homeactivity.py
+++ b/src/model/homeactivity.py
@@ -15,6 +15,7 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import time
+import logging
import gobject
import dbus
@@ -66,16 +67,20 @@ class HomeActivity(gobject.GObject):
self._retrieve_service()
+ self._name_owner_changed_handler = None
if not self._service:
bus = dbus.SessionBus()
- bus.add_signal_receiver(self._name_owner_changed_cb,
- signal_name="NameOwnerChanged",
- dbus_interface="org.freedesktop.DBus")
+ self._name_owner_changed_handler = 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!")
+ """Set the window for the activity
+
+ We allow resetting the window for an activity so that we
+ can replace the launcher once we get its real window.
+ """
if not window:
raise ValueError("window must be valid")
@@ -164,6 +169,10 @@ class HomeActivity(gobject.GObject):
else:
return None
+ def is_journal(self):
+ """Returns boolean if the activity is of type JournalActivity"""
+ return self.get_type() == 'org.laptop.JournalActivity'
+
def get_launch_time(self):
"""Return the time at which the activity was first launched
@@ -212,3 +221,20 @@ class HomeActivity(gobject.GObject):
def _name_owner_changed_cb(self, name, old, new):
if name == self._get_service_name():
self._retrieve_service()
+ self.set_active(True)
+ self._name_owner_changed_handler.remove()
+ self._name_owner_changed_handler = None
+
+ def set_active(self, state):
+ """Propagate the current state to the activity object"""
+ if self._service is not None:
+ self._service.SetActive(state,
+ reply_handler=self._set_active_success,
+ error_handler=self._set_active_error)
+
+ def _set_active_success(self):
+ pass
+
+ def _set_active_error(self, err):
+ logging.error("set_active() failed: %s" % err)
+
diff --git a/src/model/homemodel.py b/src/model/homemodel.py
index 8267584..aab99c0 100644
--- a/src/model/homemodel.py
+++ b/src/model/homemodel.py
@@ -18,12 +18,21 @@ import logging
import gobject
import wnck
+import gtk
from sugar import wm
from sugar import activity
from model.homeactivity import HomeActivity
+def _get_sugar_window_type(wnck_window):
+ window = gtk.gdk.window_foreign_new(wnck_window.get_xid())
+ prop_info = window.property_get('_SUGAR_WINDOW_TYPE', 'STRING')
+ if prop_info is None:
+ return None
+ else:
+ return prop_info[2]
+
class HomeModel(gobject.GObject):
"""Model of the "Home" view (activity management)
@@ -125,18 +134,11 @@ class HomeModel(gobject.GObject):
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)
+ home_activity.set_active(True)
+
+ if self._active_activity:
+ self._active_activity.set_active(False)
self._active_activity = home_activity
self.emit('active-activity-changed', self._active_activity)
@@ -152,7 +154,7 @@ class HomeModel(gobject.GObject):
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
@@ -175,8 +177,9 @@ class HomeModel(gobject.GObject):
home_activity.set_window(window)
- home_activity.props.launching = False
- self.emit('launch-completed', home_activity)
+ if _get_sugar_window_type(window) != 'launcher':
+ home_activity.props.launching = False
+ self.emit('launch-completed', home_activity)
if self._active_activity is None:
self._set_active_activity(home_activity)
@@ -197,12 +200,6 @@ class HomeModel(gobject.GObject):
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:
@@ -277,7 +274,12 @@ class HomeModel(gobject.GObject):
def _check_activity_launched(self, activity_id):
home_activity = self._get_activity_by_id(activity_id)
- if home_activity and home_activity.props.launching:
+
+ if not home_activity:
+ logging.debug('Activity %s has been closed already.' % activity_id)
+ return False
+
+ if home_activity.props.launching:
logging.debug('Activity %s still launching, assuming it failed...'
% activity_id)
self.notify_launch_failed(activity_id)
diff --git a/src/view/BuddyMenu.py b/src/view/BuddyMenu.py
index 069f7b6..427ac3d 100644
--- a/src/view/BuddyMenu.py
+++ b/src/view/BuddyMenu.py
@@ -51,6 +51,8 @@ class BuddyMenu(Palette):
if self._active_activity_changed_hid is not None:
home_model = self._get_home_model()
home_model.disconnect(self._active_activity_changed_hid)
+ self._buddy.disconnect_by_func(self._buddy_icon_changed_cb)
+ self._buddy.disconnect_by_func(self._buddy_nick_changed_cb)
def _add_items(self):
friends = shellmodel.get_instance().get_friends()
@@ -81,8 +83,7 @@ class BuddyMenu(Palette):
else:
buddy_activity_id = None
- if activity is None or \
- activity.get_type() == 'org.laptop.JournalActivity' or \
+ if activity is None or activity.is_journal() or \
activity.get_activity_id() == buddy_activity_id:
self._invite_menu.hide()
else:
diff --git a/src/view/Shell.py b/src/view/Shell.py
index 146889b..41778d0 100644
--- a/src/view/Shell.py
+++ b/src/view/Shell.py
@@ -54,6 +54,7 @@ class Shell(gobject.GObject):
self._model = shellmodel.get_instance()
self._hosts = {}
+ self._launchers = {}
self._screen = wnck.screen_get_default()
self._screen_rotation = 0
@@ -64,8 +65,6 @@ class Shell(gobject.GObject):
self.home_window = HomeWindow()
self.home_window.show()
- self._launch_window = LaunchWindow()
-
home_model = self._model.get_home()
home_model.connect('launch-started', self.__launch_started_cb)
home_model.connect('launch-failed', self.__launch_failed_cb)
@@ -94,18 +93,35 @@ class Shell(gobject.GObject):
self.start_activity('org.laptop.JournalActivity')
def __launch_started_cb(self, home_model, home_activity):
- if home_activity.get_type() != 'org.laptop.JournalActivity':
- self._launch_window.show()
+ if home_activity.is_journal():
+ return
+
+ launch_window = LaunchWindow(home_activity)
+ launch_window.show()
+
+ self._launchers[home_activity.get_activity_id()] = launch_window
+ self._model.set_zoom_level(shellmodel.ShellModel.ZOOM_ACTIVITY)
def __launch_failed_cb(self, home_model, home_activity):
- self._launch_window.hide()
+ if not home_activity.is_journal():
+ self._destroy_launcher(home_activity)
def __launch_completed_cb(self, home_model, home_activity):
- self._launch_window.hide()
-
activity_host = ActivityHost(home_activity)
self._hosts[activity_host.get_xid()] = activity_host
+ if not home_activity.is_journal():
+ self._destroy_launcher(home_activity)
+
+ def _destroy_launcher(self, home_activity):
+ activity_id = home_activity.get_activity_id()
+
+ if activity_id in self._launchers:
+ self._launchers[activity_id].destroy()
+ del self._launchers[activity_id]
+ else:
+ logging.error('Launcher for %s is missing' % activity_id)
+
def _activity_removed_cb(self, home_model, home_activity):
xid = home_activity.get_xid()
if self._hosts.has_key(xid):
@@ -169,8 +185,6 @@ class Shell(gobject.GObject):
if level == self._model.get_zoom_level():
return
- self.take_activity_screenshot()
-
if level == shellmodel.ShellModel.ZOOM_ACTIVITY:
host = self.get_current_activity()
if host is not None:
@@ -187,7 +201,6 @@ class Shell(gobject.GObject):
home_model = self._model.get_home()
previous_activity = home_model.get_previous_activity()
if previous_activity:
- self.take_activity_screenshot()
previous_activity.get_window().activate(
gtk.get_current_event_time())
@@ -195,7 +208,6 @@ class Shell(gobject.GObject):
home_model = self._model.get_home()
next_activity = home_model.get_next_activity()
if next_activity:
- self.take_activity_screenshot()
next_activity.get_window().activate(gtk.get_current_event_time())
def close_current_activity(self):
@@ -204,10 +216,9 @@ class Shell(gobject.GObject):
home_model = self._model.get_home()
active_activity = home_model.get_active_activity()
- if active_activity.get_type() == 'org.laptop.JournalActivity':
+ if active_activity.is_journal():
return
- self.take_activity_screenshot()
self.get_current_activity().close()
def get_current_activity(self):
diff --git a/src/view/devices/network/mesh.py b/src/view/devices/network/mesh.py
index 1d115e9..40746ce 100644
--- a/src/view/devices/network/mesh.py
+++ b/src/view/devices/network/mesh.py
@@ -20,24 +20,34 @@ from gettext import gettext as _
import gtk
from sugar import profile
-from sugar.graphics.tray import TrayIcon
from sugar.graphics import style
from sugar.graphics.palette import Palette
+from sugar.graphics.toolbutton import ToolButton
+from sugar.graphics.xocolor import XoColor
from model.devices import device
from model.devices.network import wireless
from hardware import hardwaremanager
+from view.devices.network.wireless import IP_ADDRESS_TEXT_TEMPLATE
from view.frame.frameinvoker import FrameWidgetInvoker
+from view.pulsingicon import PulsingIcon
-class DeviceView(TrayIcon):
+class DeviceView(ToolButton):
FRAME_POSITION_RELATIVE = 400
def __init__(self, model):
- TrayIcon.__init__(self, icon_name='network-mesh')
+ ToolButton.__init__(self)
self._model = model
+ self._icon = PulsingIcon()
+ self._icon.props.icon_name = 'network-mesh'
+ pulse_color = XoColor("%s,%s" % (style.COLOR_BUTTON_GREY.get_svg(),
+ style.COLOR_TRANSPARENT.get_svg()))
+ self._icon.props.pulse_color = pulse_color
+ self._icon.props.base_color = pulse_color # only temporarily
+
self.palette = MeshPalette(_("Mesh Network"), model)
self.set_palette(self.palette)
self.palette.props.invoker = FrameWidgetInvoker(self)
@@ -45,24 +55,38 @@ class DeviceView(TrayIcon):
model.connect('notify::state', self._state_changed_cb)
model.connect('notify::activation-stage', self._state_changed_cb)
+ model.connect('notify::ip-address', self._ip_address_changed_cb)
+
self._update_state()
+ self._update_ip_address()
+ self.set_icon_widget(self._icon)
+ self._icon.show()
+
+ def _ip_address_changed_cb(self, model, pspec):
+ self._update_ip_address()
def _state_changed_cb(self, model, pspec):
self._update_state()
+ def _update_ip_address(self):
+ self.palette.set_ip_address(self._model.props.ip_address)
+
def _update_state(self):
# FIXME Change icon colors once we have real icons
state = self._model.props.state
self.palette.update_state(state)
+ self._icon.props.pulsing = state == device.STATE_ACTIVATING
if state == device.STATE_ACTIVATING:
- self.icon.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
- self.icon.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
+ self._icon.props.base_color = \
+ XoColor("%s,%s" % (style.COLOR_INACTIVE_STROKE.get_svg(),
+ style.COLOR_INACTIVE_FILL.get_svg()))
elif state == device.STATE_ACTIVATED:
- self.icon.props.xo_color = profile.get_color()
+ self._icon.props.base_color = profile.get_color()
elif state == device.STATE_INACTIVE:
- self.icon.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
- self.icon.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
+ self._icon.props.base_color = \
+ XoColor("%s,%s" % (style.COLOR_INACTIVE_STROKE.get_svg(),
+ style.COLOR_INACTIVE_FILL.get_svg()))
if state == device.STATE_INACTIVE:
self.palette.set_primary_text(_("Mesh Network"))
@@ -80,9 +104,21 @@ class MeshPalette(Palette):
self._step_label = gtk.Label()
self._step_label.show()
+ self._ip_address_label = gtk.Label()
+ def _padded(child, xalign=0, yalign=0.5):
+ padder = gtk.Alignment(xalign=xalign, yalign=yalign,
+ xscale=1, yscale=0.33)
+ padder.set_padding(style.DEFAULT_SPACING,
+ style.DEFAULT_SPACING,
+ style.DEFAULT_SPACING,
+ style.DEFAULT_SPACING)
+ padder.add(child)
+ return padder
+
vbox = gtk.VBox()
- vbox.pack_start(self._step_label)
- vbox.show()
+ vbox.pack_start(_padded(self._step_label))
+ vbox.pack_start(_padded(self._ip_address_label))
+ vbox.show_all()
self.set_content(vbox)
@@ -104,6 +140,13 @@ class MeshPalette(Palette):
if network_manager and nm_device:
network_manager.set_active_device(nm_device)
+ def set_ip_address(self, ip_address):
+ if ip_address is not None and ip_address != "0.0.0.0":
+ ip_address_text = IP_ADDRESS_TEXT_TEMPLATE % ip_address
+ else:
+ ip_address_text = ""
+ self._ip_address_label.set_text(ip_address_text)
+
def set_mesh_step(self, step, state):
label = ""
if step == 1:
diff --git a/src/view/devices/network/wireless.py b/src/view/devices/network/wireless.py
index a339928..5bef0bb 100644
--- a/src/view/devices/network/wireless.py
+++ b/src/view/devices/network/wireless.py
@@ -20,26 +20,40 @@ from gettext import gettext as _
import gtk
from sugar.graphics.icon import get_icon_state
-from sugar.graphics.tray import TrayIcon
from sugar.graphics import style
from sugar.graphics.palette import Palette
+from sugar.graphics.toolbutton import ToolButton
+from sugar.graphics.xocolor import XoColor
from model.devices.network import wireless
from model.devices import device
from hardware import hardwaremanager
from hardware import nmclient
from view.frame.frameinvoker import FrameWidgetInvoker
+from view.pulsingicon import PulsingIcon
_ICON_NAME = 'network-wireless'
-class DeviceView(TrayIcon):
+IP_ADDRESS_TEXT_TEMPLATE = _("IP address: %s")
+
+class DeviceView(ToolButton):
FRAME_POSITION_RELATIVE = 300
def __init__(self, model):
- TrayIcon.__init__(self, icon_name=_ICON_NAME)
+ ToolButton.__init__(self)
self._model = model
+ self._icon = PulsingIcon()
+ self._icon.props.icon_name = _ICON_NAME
+ pulse_color = XoColor("%s,%s" % (style.COLOR_BUTTON_GREY.get_svg(),
+ style.COLOR_TRANSPARENT.get_svg()))
+ self._icon.props.pulse_color = pulse_color
+ self._icon.props.base_color = pulse_color # only temporarily
+ self._inactive_color = XoColor("%s,%s" % (
+ style.COLOR_INACTIVE_STROKE.get_html(),
+ style.COLOR_INACTIVE_FILL.get_html()))
+
meshdev = None
network_manager = hardwaremanager.get_network_manager()
for dev in network_manager.get_devices():
@@ -56,11 +70,16 @@ class DeviceView(TrayIcon):
self.palette.set_frequency(self._model.props.frequency)
model.connect('notify::name', self._name_changed_cb)
+ model.connect('notify::ip-address', self._ip_address_changed_cb)
model.connect('notify::strength', self._strength_changed_cb)
model.connect('notify::state', self._state_changed_cb)
self._update_icon()
self._update_state()
+ self._update_ip_address()
+
+ self.set_icon_widget(self._icon)
+ self._icon.show()
def _get_palette_primary_text(self):
if self._model.props.state == device.STATE_INACTIVE:
@@ -74,34 +93,47 @@ class DeviceView(TrayIcon):
self.palette.set_frequency(self._model.props.frequency)
self._counter += 1
+ def _ip_address_changed_cb(self, model, pspec):
+ self._update_ip_address()
+
def _name_changed_cb(self, model, pspec):
self.palette.set_primary_text(self._get_palette_primary_text())
+ self._update_state()
def _state_changed_cb(self, model, pspec):
+ self._update_icon()
self._update_state()
self.palette.set_primary_text(self._get_palette_primary_text())
def _update_icon(self):
+ # keep this code in sync with view/home/MeshBox.py
strength = self._model.props.strength
if self._model.props.state == device.STATE_INACTIVE:
strength = 0
- icon_name = get_icon_state(_ICON_NAME, strength)
+ if self._model.props.state == device.STATE_ACTIVATED:
+ icon_name = '%s-connected' % _ICON_NAME
+ else:
+ icon_name = _ICON_NAME
+ icon_name = get_icon_state(icon_name, strength)
if icon_name:
- self.icon.props.icon_name = icon_name
+ self._icon.props.icon_name = icon_name
def _update_state(self):
# FIXME Change icon colors once we have real icons
state = self._model.props.state
+ self._icon.props.pulsing = state == device.STATE_ACTIVATING
if state == device.STATE_ACTIVATING:
- self.icon.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
- self.icon.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
+ fill = style.COLOR_INACTIVE_FILL.get_svg()
+ stroke = style.COLOR_INACTIVE_STROKE.get_svg()
elif state == device.STATE_ACTIVATED:
(stroke, fill) = self._model.get_active_network_colors()
- self.icon.props.stroke_color = stroke
- self.icon.props.fill_color = fill
elif state == device.STATE_INACTIVE:
- self.icon.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
- self.icon.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
+ fill = style.COLOR_INACTIVE_FILL.get_svg()
+ stroke = style.COLOR_INACTIVE_STROKE.get_svg()
+ self._icon.props.base_color = XoColor("%s,%s" % (stroke, fill))
+
+ def _update_ip_address(self):
+ self.palette.set_ip_address(self._model.props.ip_address)
class WirelessPalette(Palette):
def __init__(self, primary_text, meshdev):
@@ -109,11 +141,26 @@ class WirelessPalette(Palette):
self._meshdev = meshdev
self._chan_label = gtk.Label()
+ self._chan_label.props.xalign = 0.0
self._chan_label.show()
+ self._ip_address_label = gtk.Label()
+
vbox = gtk.VBox()
- vbox.pack_start(self._chan_label)
- vbox.show()
+
+ def _padded(child, xalign=0, yalign=0.5):
+ padder = gtk.Alignment(xalign=xalign, yalign=yalign,
+ xscale=1, yscale=0.33)
+ padder.set_padding(style.DEFAULT_SPACING,
+ style.DEFAULT_SPACING,
+ style.DEFAULT_SPACING,
+ style.DEFAULT_SPACING)
+ padder.add(child)
+ return padder
+
+ vbox.pack_start(_padded(self._chan_label))
+ vbox.pack_start(_padded(self._ip_address_label))
+ vbox.show_all()
if meshdev:
disconnect_item = gtk.MenuItem(_('Disconnect...'))
@@ -136,3 +183,9 @@ class WirelessPalette(Palette):
chan = 0
self._chan_label.set_text("%s: %d" % (_("Channel"), chan))
+ def set_ip_address(self, ip_address):
+ if ip_address is not None and ip_address != "0.0.0.0":
+ ip_address_text = IP_ADDRESS_TEXT_TEMPLATE % ip_address
+ else:
+ ip_address_text = ""
+ self._ip_address_label.set_text(ip_address_text)
diff --git a/src/view/frame/activitiestray.py b/src/view/frame/activitiestray.py
index 72a03fd..1311f07 100644
--- a/src/view/frame/activitiestray.py
+++ b/src/view/frame/activitiestray.py
@@ -55,7 +55,7 @@ class ActivityButton(RadioToolButton):
self.set_icon_widget(self._icon)
self._icon.show()
- if self._home_activity.get_type() == "org.laptop.JournalActivity":
+ if self._home_activity.is_journal():
palette = JournalPalette(self._home_activity)
else:
palette = CurrentActivityPalette(self._home_activity)
diff --git a/src/view/frame/frame.py b/src/view/frame/frame.py
index 6009e7f..c3f0de9 100644
--- a/src/view/frame/frame.py
+++ b/src/view/frame/frame.py
@@ -146,8 +146,6 @@ class Frame(object):
if self._animator:
self._animator.stop()
- view.Shell.get_instance().take_activity_screenshot()
-
self.mode = mode
self._animator = animator.Animator(0.5)
diff --git a/src/view/frame/friendstray.py b/src/view/frame/friendstray.py
index b9d8c07..7236d75 100644
--- a/src/view/frame/friendstray.py
+++ b/src/view/frame/friendstray.py
@@ -83,6 +83,7 @@ class FriendsTray(VTray):
def clear(self):
for item in self.get_children():
self.remove_item(item)
+ item.destroy()
self._buddies = {}
def __activity_appeared_cb(self, pservice, activity_ps):
diff --git a/src/view/home/HomeBox.py b/src/view/home/HomeBox.py
index d079145..0655253 100644
--- a/src/view/home/HomeBox.py
+++ b/src/view/home/HomeBox.py
@@ -16,6 +16,7 @@
from gettext import gettext as _
import logging
+import os
import gobject
import gtk
@@ -39,14 +40,12 @@ _LIST_VIEW = 1
_AUTOSEARCH_TIMEOUT = 1000
def _convert_layout_constant(profile_constant):
- if profile_constant == profile.RANDOM_LAYOUT:
- return favoritesview.RANDOM_LAYOUT
- elif profile_constant == profile.RING_LAYOUT:
- return favoritesview.RING_LAYOUT
- else:
- logging.warning('Incorrect favorites_layout value: %r' % \
- profile_constant)
- return favoritesview.RING_LAYOUT
+ for layoutid, layoutclass in favoritesview._LAYOUT_MAP.items():
+ if profile_constant == layoutclass.profile_key:
+ return layoutid
+ logging.warning('Incorrect favorites_layout value: %r' % \
+ profile_constant)
+ return favoritesview.RING_LAYOUT
class HomeBox(gtk.VBox):
__gtype_name__ = 'SugarHomeBox'
@@ -109,6 +108,52 @@ class HomeBox(gtk.VBox):
registry = activity.get_registry()
activity_info = registry.get_activity(bundle_id)
ActivityBundle(activity_info.path).uninstall()
+
+ def show_software_updates_alert(self):
+ alert = Alert()
+ updater_icon = Icon(icon_name='module-updater',
+ pixel_size = style.STANDARD_ICON_SIZE)
+ alert.props.icon = updater_icon
+ updater_icon.show()
+ alert.props.title = _('Software Update')
+ alert.props.msg = _('Update your activities to ensure'
+ ' compatibility with your new software')
+
+ cancel_icon = Icon(icon_name='dialog-cancel')
+ alert.add_button(gtk.RESPONSE_CANCEL, _('Cancel'), cancel_icon)
+
+ alert.add_button(gtk.RESPONSE_REJECT, _('Later'))
+
+ erase_icon = Icon(icon_name='dialog-ok')
+ alert.add_button(gtk.RESPONSE_OK, _('Check now'), erase_icon)
+
+ if self._list_view in self.get_children():
+ self._list_view.add_alert(alert)
+ else:
+ self._favorites_view.add_alert(alert)
+ alert.connect('response', self.__software_update_response_cb)
+
+ def __software_update_response_cb(self, alert, response_id):
+ if self._list_view in self.get_children():
+ self._list_view.remove_alert()
+ else:
+ self._favorites_view.remove_alert()
+
+ if response_id != gtk.RESPONSE_REJECT:
+ update_trigger_file = os.path.expanduser('~/.sugar-update')
+ try:
+ os.unlink(update_trigger_file)
+ except OSError:
+ logging.error('Software-update: Can not remove file %s' %
+ update_trigger_file)
+
+ if response_id == gtk.RESPONSE_OK:
+ from controlpanel.gui import ControlPanel
+ panel = ControlPanel()
+ panel.set_transient_for(self.get_toplevel())
+ panel.show()
+ panel.show_section_view('updater')
+ panel.set_section_view_auto_close()
def __toolbar_query_changed_cb(self, toolbar, query):
query = query.lower()
@@ -118,11 +163,9 @@ class HomeBox(gtk.VBox):
self._set_view(view, layout)
if layout is not None:
current_profile = profile.get_profile()
- if layout == favoritesview.RANDOM_LAYOUT:
- current_profile.favorites_layout = profile.RANDOM_LAYOUT
- current_profile.save()
- elif layout == favoritesview.RING_LAYOUT:
- current_profile.favorites_layout = profile.RING_LAYOUT
+ profile_key = favoritesview._LAYOUT_MAP[layout].profile_key
+ if profile_key != current_profile.favorites_layout:
+ current_profile.favorites_layout = profile_key
current_profile.save()
else:
logging.warning('Incorrect layout requested: %r' % layout)
@@ -168,6 +211,10 @@ class HomeBox(gtk.VBox):
if self._favorites_view is not None:
self._favorites_view.enable_xo_palette()
+ def focus_search_entry(self):
+ self._toolbar.search_entry.grab_focus()
+
+
class HomeToolbar(gtk.Toolbar):
__gtype_name__ = 'SugarHomeToolbar'
@@ -192,15 +239,15 @@ class HomeToolbar(gtk.Toolbar):
self.insert(tool_item, -1)
tool_item.show()
- self._search_entry = iconentry.IconEntry()
- self._search_entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY,
+ 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.set_width_chars(25)
- 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.search_entry.add_clear_button()
+ self.search_entry.set_width_chars(25)
+ 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(expand=True)
@@ -246,7 +293,8 @@ class HomeToolbar(gtk.Toolbar):
if self._query != new_query:
self._query = new_query
- self._list_button.props.active = True
+ if self._query is not '':
+ self._list_button.props.active = True
self.emit('query-changed', self._query)
def __entry_changed_cb(self, entry):
@@ -261,7 +309,7 @@ class HomeToolbar(gtk.Toolbar):
def __autosearch_timer_cb(self):
self._autosearch_timer = None
- self._search_entry.activate()
+ self.search_entry.activate()
return False
class FavoritesButton(RadioToolButton):
@@ -278,21 +326,25 @@ class FavoritesButton(RadioToolButton):
self._layout = _convert_layout_constant(profile_layout_constant)
self._update_icon()
- # TRANS: label for the freeform layout in the favorites view
- menu_item = MenuItem(_('Freeform'), 'view-freeform')
- menu_item.connect('activate', self.__layout_activate_cb,
- favoritesview.RANDOM_LAYOUT)
- self.props.palette.menu.append(menu_item)
- menu_item.show()
+ # someday, this will be a gtk.Table()
+ layouts_grid = gtk.HBox()
+ layout_item = None
+ for layoutid, layoutclass in sorted(favoritesview._LAYOUT_MAP.items()):
+ layout_item = RadioToolButton(icon_name=layoutclass.icon_name,
+ group=layout_item, active=False)
+ if layoutid == self._layout:
+ layout_item.set_active(True)
+ layouts_grid.add(layout_item)
+ layout_item.connect('toggled', self.__layout_activate_cb,
+ layoutid)
+ layouts_grid.show_all()
+ self.props.palette.set_content(layouts_grid)
+ self.props.palette._update_separators()
- # TRANS: label for the ring layout in the favorites view
- menu_item = MenuItem(_('Ring'), 'view-radial')
- menu_item.connect('activate', self.__layout_activate_cb,
- favoritesview.RING_LAYOUT)
- self.props.palette.menu.append(menu_item)
- menu_item.show()
def __layout_activate_cb(self, menu_item, layout):
+ if not menu_item.get_active():
+ return
if self._layout == layout and self.props.active:
return
elif self._layout != layout:
@@ -304,12 +356,8 @@ class FavoritesButton(RadioToolButton):
self.emit('toggled')
def _update_icon(self):
- if self._layout == favoritesview.RANDOM_LAYOUT:
- self.props.named_icon = 'view-freeform'
- elif self._layout == favoritesview.RING_LAYOUT:
- self.props.named_icon = 'view-radial'
- else:
- raise ValueError('Invalid layout: %r' % self._layout)
+ self.props.named_icon = favoritesview._LAYOUT_MAP[self._layout]\
+ .icon_name
def _get_layout(self):
return self._layout
diff --git a/src/view/home/HomeWindow.py b/src/view/home/HomeWindow.py
index 4ff0620..316d572 100644
--- a/src/view/home/HomeWindow.py
+++ b/src/view/home/HomeWindow.py
@@ -140,6 +140,7 @@ class HomeWindow(gtk.Window):
if self._level == ShellModel.ZOOM_HOME:
self.add(self._home_box)
self._home_box.show()
+ self._home_box.focus_search_entry()
elif self._level == ShellModel.ZOOM_FRIENDS:
self.add(self._friends_box)
self._friends_box.show()
diff --git a/src/view/home/MeshBox.py b/src/view/home/MeshBox.py
index c2b4efd..8cf8af6 100644
--- a/src/view/home/MeshBox.py
+++ b/src/view/home/MeshBox.py
@@ -125,6 +125,7 @@ class AccessPointView(CanvasPulsingIcon):
self._update_name()
def _state_changed_cb(self, model, pspec):
+ self._update_icon()
self._update_state()
def _activate_cb(self, icon):
@@ -138,7 +139,13 @@ class AccessPointView(CanvasPulsingIcon):
self._palette.props.primary_text = self._model.props.name
def _update_icon(self):
- icon_name = get_icon_state(_ICON_NAME, self._model.props.strength)
+ # keep this code in sync with view/devices/network/wireless.py
+ strength = self._model.props.strength
+ if self._model.props.state == accesspointmodel.STATE_CONNECTED:
+ icon_name = '%s-connected' % _ICON_NAME
+ else:
+ icon_name = _ICON_NAME
+ icon_name = get_icon_state(icon_name, strength)
if icon_name:
self.props.icon_name = icon_name
icon = self._palette.props.icon
diff --git a/src/view/home/activitieslist.py b/src/view/home/activitieslist.py
index 2f0860c..4222d38 100644
--- a/src/view/home/activitieslist.py
+++ b/src/view/home/activitieslist.py
@@ -203,8 +203,13 @@ class ActivityEntry(hippo.CanvasBox, hippo.CanvasItem):
self.__icon_button_release_event_cb)
self.append(self.icon)
+ if gtk.widget_get_default_direction() == gtk.TEXT_DIR_RTL:
+ align = hippo.ALIGNMENT_END
+ else:
+ align = hippo.ALIGNMENT_START
+
title = hippo.CanvasText(text=activity_info.name,
- xalign=hippo.ALIGNMENT_START,
+ xalign=align,
font_desc=style.FONT_BOLD.get_pango_desc(),
box_width=ActivityEntry._TITLE_COL_WIDTH)
self.append(title)
@@ -221,11 +226,14 @@ class ActivityEntry(hippo.CanvasBox, hippo.CanvasItem):
timestamp = activity_info.installation_time
date = hippo.CanvasText(
text=util.timestamp_to_elapsed_string(timestamp),
- xalign=hippo.ALIGNMENT_START,
+ xalign=align,
font_desc=style.FONT_NORMAL.get_pango_desc(),
box_width=ActivityEntry._DATE_COL_WIDTH)
self.append(date)
+ if gtk.widget_get_default_direction() == gtk.TEXT_DIR_RTL:
+ self.reverse()
+
def __favorite_changed_cb(self, favorite_icon, pspec):
registry = activity.get_registry()
registry.set_activity_favorite(self._bundle_id, self._version,
diff --git a/src/view/home/favoriteslayout.py b/src/view/home/favoriteslayout.py
index 9329fe1..937f370 100644
--- a/src/view/home/favoriteslayout.py
+++ b/src/view/home/favoriteslayout.py
@@ -17,6 +17,7 @@
import logging
import math
import hashlib
+from gettext import gettext as _
import gobject
import gtk
@@ -33,6 +34,8 @@ _CELL_SIZE = 4
_BASE_SCALE = 1000
class FavoritesLayout(gobject.GObject, hippo.CanvasLayout):
+ """Base class of the different layout types."""
+
__gtype_name__ = 'FavoritesLayout'
def __init__(self):
@@ -90,8 +93,16 @@ class FavoritesLayout(gobject.GObject, hippo.CanvasLayout):
return False
class RandomLayout(FavoritesLayout):
+ """Lay out icons randomly; try to nudge them around to resolve overlaps."""
+
__gtype_name__ = 'RandomLayout'
+ icon_name = 'view-freeform'
+ """Name of icon used in home view dropdown palette."""
+
+ profile_key = 'random-layout'
+ """String used in profile to represent this view."""
+
def __init__(self):
FavoritesLayout.__init__(self)
@@ -163,7 +174,13 @@ _MAXIMUM_RADIUS = (gtk.gdk.screen_height() - style.GRID_CELL_SIZE) / 2 - \
style.STANDARD_ICON_SIZE - style.DEFAULT_SPACING
class RingLayout(FavoritesLayout):
+ """Lay out icons in a ring around the XO man."""
+
__gtype_name__ = 'RingLayout'
+ icon_name = 'view-radial'
+ """Name of icon used in home view dropdown palette."""
+ profile_key = 'ring-layout'
+ """String used in profile to represent this view."""
def __init__(self):
FavoritesLayout.__init__(self)
@@ -188,38 +205,31 @@ class RingLayout(FavoritesLayout):
self._locked_children[child] = (x, y)
def _calculate_radius_and_icon_size(self, children_count):
- angle = 2 * math.pi / children_count
-
# what's the radius required without downscaling?
distance = style.STANDARD_ICON_SIZE + style.DEFAULT_SPACING
icon_size = style.STANDARD_ICON_SIZE
-
- if children_count == 1:
- radius = 0
- else:
- radius = math.sqrt(distance ** 2 /
- (math.sin(angle) ** 2 + (math.cos(angle) - 1) ** 2))
-
- if radius < _MINIMUM_RADIUS:
- # we can upscale, if we want
- icon_size += style.STANDARD_ICON_SIZE * \
- (0.5 * (_MINIMUM_RADIUS - radius) / _MINIMUM_RADIUS)
- radius = _MINIMUM_RADIUS
- elif radius > _MAXIMUM_RADIUS:
- radius = _MAXIMUM_RADIUS
- # need to downscale. what's the icon size required?
- distance = math.sqrt((radius * math.sin(angle)) ** 2 + \
- (radius * (math.cos(angle) - 1)) ** 2)
- icon_size = distance - style.DEFAULT_SPACING
-
+ # circumference is 2*pi*r; we want this to be at least
+ # 'children_count * distance'
+ radius = children_count * distance / (2 * math.pi)
+ # limit computed radius to reasonable bounds.
+ radius = max(radius, _MINIMUM_RADIUS)
+ radius = min(radius, _MAXIMUM_RADIUS)
+ # recompute icon size from limited radius
+ if children_count > 0:
+ icon_size = (2 * math.pi * radius / children_count) \
+ - style.DEFAULT_SPACING
+ # limit adjusted icon size.
+ icon_size = max(icon_size, style.SMALL_ICON_SIZE)
+ icon_size = min(icon_size, style.MEDIUM_ICON_SIZE)
return radius, icon_size
- def _calculate_position(self, radius, icon_size, index, children_count):
+ def _calculate_position(self, radius, icon_size, index, children_count,
+ sin=math.sin, cos=math.cos):
width, height = self.box.get_allocation()
angle = index * (2 * math.pi / children_count) - math.pi / 2
- x = radius * math.cos(angle) + (width - icon_size) / 2
- y = radius * math.sin(angle) + (height - icon_size -
- style.GRID_CELL_SIZE) / 2
+ x = radius * cos(angle) + (width - icon_size) / 2
+ y = radius * sin(angle) + (height - icon_size -
+ (style.GRID_CELL_SIZE/2) ) / 2
return x, y
def _get_children_in_ring(self):
@@ -228,6 +238,7 @@ class RingLayout(FavoritesLayout):
return children_in_ring
def _update_icon_sizes(self):
+ # XXX: THIS METHOD IS NEVER CALLED
children_in_ring = self._get_children_in_ring()
radius_, icon_size = \
self._calculate_radius_and_icon_size(len(children_in_ring))
@@ -254,6 +265,7 @@ class RingLayout(FavoritesLayout):
child.allocate(int(x), int(y), child_width, child_height,
origin_changed)
+ child.item.props.size = icon_size
for child in self._locked_children.keys():
x, y = self._locked_children[child]
@@ -272,3 +284,172 @@ class RingLayout(FavoritesLayout):
else:
return 0
+_SUNFLOWER_CONSTANT = style.STANDARD_ICON_SIZE * .75
+"""Chose a constant such that STANDARD_ICON_SIZE icons are nicely spaced."""
+
+_SUNFLOWER_OFFSET = \
+ math.pow((style.XLARGE_ICON_SIZE / 2 + style.STANDARD_ICON_SIZE) /
+ _SUNFLOWER_CONSTANT, 2)
+"""
+Compute a starting index for the `SunflowerLayout` which leaves space for
+the XO man in the center. Since r = _SUNFLOWER_CONSTANT * sqrt(n),
+solve for n when r is (XLARGE_ICON_SIZE + STANDARD_ICON_SIZE)/2.
+"""
+
+_GOLDEN_RATIO = 1.6180339887498949
+"""
+Golden ratio: http://en.wikipedia.org/wiki/Golden_ratio
+Calculation: (math.sqrt(5) + 1) / 2
+"""
+
+_SUNFLOWER_ANGLE = 2.3999632297286531
+"""
+The sunflower angle is approximately 137.5 degrees.
+This is the golden angle: http://en.wikipedia.org/wiki/Golden_angle
+Calculation: math.radians(360) / ( _GOLDEN_RATIO * _GOLDEN_RATIO )
+"""
+
+class SunflowerLayout(RingLayout):
+ """Spiral layout based on Fibonacci ratio in phyllotaxis.
+
+ See http://algorithmicbotany.org/papers/abop/abop-ch4.pdf
+ for details of Vogel's model of florets in a sunflower head."""
+
+ __gtype_name__ = 'SunflowerLayout'
+
+ icon_name = 'view-spiral'
+ """Name of icon used in home view dropdown palette."""
+
+ profile_key = 'spiral-layout'
+ """String used in profile to represent this view."""
+
+ def __init__(self):
+ RingLayout.__init__(self)
+ self.skipped_indices = []
+
+ def _calculate_radius_and_icon_size(self, children_count):
+ """Stub out this method; not used in `SunflowerLayout`."""
+ return None, style.STANDARD_ICON_SIZE
+
+ def adjust_index(self, i):
+ """Skip floret indices which end up outside the desired bounding box."""
+ for idx in self.skipped_indices:
+ if i < idx: break
+ i += 1
+ return i
+
+ def _calculate_position(self, radius, icon_size, oindex, children_count):
+ """Calculate the position of sunflower floret number 'oindex'.
+ If the result is outside the bounding box, use the next index which
+ is inside the bounding box."""
+
+ width, height = self.box.get_allocation()
+
+ while True:
+
+ index = self.adjust_index(oindex)
+
+ # tweak phi to get a nice gap lined up where the "active activity"
+ # icon is, below the central XO man.
+ phi = index * _SUNFLOWER_ANGLE + math.radians(-130)
+
+ # we offset index when computing r to make space for the XO man.
+ r = _SUNFLOWER_CONSTANT * math.sqrt(index + _SUNFLOWER_OFFSET)
+
+ # x,y are the top-left corner of the icon, so remove icon_size
+ # from width/height to compensate. y has an extra GRID_CELL_SIZE/2
+ # removed to make room for the "active activity" icon.
+ x = r * math.cos(phi) + (width - icon_size) / 2
+ y = r * math.sin(phi) + (height - icon_size - \
+ (style.GRID_CELL_SIZE / 2) ) / 2
+
+ # skip allocations outside the allocation box.
+ # give up once we can't fit
+ if r < math.hypot(width / 2, height / 2):
+ if y < 0 or y > (height - icon_size) or \
+ x < 0 or x > (width - icon_size):
+ self.skipped_indices.append(index)
+ continue # try again
+
+ return x, y
+
+class BoxLayout(RingLayout):
+ """Lay out icons in a square around the XO man."""
+
+ __gtype_name__ = 'BoxLayout'
+
+ icon_name = 'view-box'
+ """Name of icon used in home view dropdown palette."""
+
+ profile_key = 'box-layout'
+ """String used in profile to represent this view."""
+
+ def __init__(self):
+ RingLayout.__init__(self)
+
+ def _calculate_position(self, radius, icon_size, index, children_count):
+
+ # use "orthogonal" versions of cos and sin in order to square the
+ # circle and turn the 'ring view' into a 'box view'
+ def cos_d(d):
+ while d < 0:
+ d += 360
+ if d < 45: return 1
+ if d < 135: return (90 - d) / 45.
+ if d < 225: return -1
+ return cos_d(360 - d) # mirror around 180
+
+ cos = lambda r: cos_d(math.degrees(r))
+ sin = lambda r: cos_d(math.degrees(r) - 90)
+
+ return RingLayout._calculate_position\
+ (self, radius, icon_size, index, children_count,
+ sin=sin, cos=cos)
+
+class TriangleLayout(RingLayout):
+ """Lay out icons in a triangle around the XO man."""
+
+ __gtype_name__ = 'TriangleLayout'
+
+ icon_name = 'view-triangle'
+ """Name of icon used in home view dropdown palette."""
+
+ profile_key = 'triangle-layout'
+ """String used in profile to represent this view."""
+
+ def __init__(self):
+ RingLayout.__init__(self)
+
+ def _calculate_radius_and_icon_size(self, children_count):
+ # use slightly larger minimum radius than parent, because sides
+ # of triangle come awful close to the center.
+ radius, icon_size = \
+ RingLayout._calculate_radius_and_icon_size(self, children_count)
+ return max(radius, _MINIMUM_RADIUS + style.MEDIUM_ICON_SIZE), icon_size
+
+ def _calculate_position(self, radius, icon_size, index, children_count):
+ # tweak cos and sin in order to make the 'ring' into an equilateral
+ # triangle.
+
+ def cos_d(d):
+ while d < -90:
+ d += 360
+ if d <= 30: return (d + 90) / 120.
+ if d <= 90: return (90 - d) / 60.
+ return -cos_d(180 - d) # mirror around 90
+
+ sqrt_3 = math.sqrt(3)
+
+ def sin_d(d):
+ while d < -90:
+ d += 360
+ if d <= 30: return ((d + 90) / 120.) * sqrt_3 - 1
+ if d <= 90: return sqrt_3 - 1
+ return sin_d(180 - d) # mirror around 90
+
+ cos = lambda r: cos_d(math.degrees(r))
+ sin = lambda r: sin_d(math.degrees(r))
+
+ return RingLayout._calculate_position\
+ (self, radius, icon_size, index, children_count,
+ sin=sin, cos=cos)
diff --git a/src/view/home/favoritesview.py b/src/view/home/favoritesview.py
index b549b12..c1fce27 100644
--- a/src/view/home/favoritesview.py
+++ b/src/view/home/favoritesview.py
@@ -46,11 +46,20 @@ _logger = logging.getLogger('FavoritesView')
_ICON_DND_TARGET = ('activity-icon', gtk.TARGET_SAME_WIDGET, 0)
-RING_LAYOUT = 0
-RANDOM_LAYOUT = 1
+# enumerate the various layout types we will display in the dropdown palette.
+# add a constant for your layout here, and add it to the _LAYOUT_MAP to get
+# it to appear in the palette.
+RING_LAYOUT, BOX_LAYOUT, TRIANGLE_LAYOUT, SUNFLOWER_LAYOUT, RANDOM_LAYOUT = \
+ xrange(5)
_LAYOUT_MAP = {RING_LAYOUT: favoriteslayout.RingLayout,
+ #BOX_LAYOUT: favoriteslayout.BoxLayout,
+ #TRIANGLE_LAYOUT: favoriteslayout.TriangleLayout,
+ #SUNFLOWER_LAYOUT: favoriteslayout.SunflowerLayout,
RANDOM_LAYOUT: favoriteslayout.RandomLayout}
+"""Map numeric layout identifiers to uninstantiated subclasses of
+`FavoritesLayout` which implement the layouts. Additional information
+about the layout can be accessed with fields of the class."""
class FavoritesView(hippo.Canvas):
__gtype_name__ = 'SugarFavoritesView'
@@ -379,7 +388,11 @@ class CurrentActivityIcon(CanvasIcon, hippo.CanvasItem):
self.props.xo_color = home_activity.get_icon_color()
self.props.size = style.STANDARD_ICON_SIZE
- if home_activity.get_type() == 'org.laptop.JournalActivity':
+ if self.palette is not None:
+ self.palette.destroy()
+ self.palette = None
+
+ if home_activity.is_journal():
palette = JournalPalette(home_activity)
else:
palette = CurrentActivityPalette(home_activity)
@@ -404,13 +417,7 @@ class _MyIcon(MyIcon):
#secondary_text='Sample secondary label',
icon=palette_icon)
- item = MenuItem(_('Control Panel'))
-
- icon = Icon(icon_name='computer-xo', icon_size=gtk.ICON_SIZE_MENU,
- xo_color=self._profile.color)
- item.set_image(icon)
- icon.show()
-
+ item = MenuItem(_('Control Panel'), 'preferences-system')
item.connect('activate', self.__controlpanel_activate_cb)
palette.menu.append(item)
item.show()
diff --git a/src/view/home/grid.py b/src/view/home/grid.py
index abea706..97f9229 100644
--- a/src/view/home/grid.py
+++ b/src/view/home/grid.py
@@ -15,18 +15,19 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-from numpy import array
import random
import gobject
import gtk
+from sugar import _sugarext
+
_PLACE_TRIALS = 20
_MAX_WEIGHT = 255
_REFRESH_RATE = 200
_MAX_COLLISIONS_PER_REFRESH = 20
-class Grid(gobject.GObject):
+class Grid(_sugarext.Grid):
__gsignals__ = {
'child-changed' : (gobject.SIGNAL_RUN_FIRST,
gobject.TYPE_NONE,
@@ -43,13 +44,12 @@ class Grid(gobject.GObject):
self._collisions = []
self._collisions_sid = 0
- self._array = array([0], dtype='b')
- self._array.resize(width * height)
+ self.setup(self.width, self.height)
def add(self, child, width, height, x=None, y=None, locked=False):
if x is not None and y is not None:
rect = gtk.gdk.Rectangle(x, y, width, height)
- weight = self._compute_weight(rect)
+ weight = self.compute_weight(rect)
else:
trials = _PLACE_TRIALS
weight = _MAX_WEIGHT
@@ -58,7 +58,7 @@ class Grid(gobject.GObject):
y = int(random.random() * (self.height - height))
rect = gtk.gdk.Rectangle(x, y, width, height)
- new_weight = self._compute_weight(rect)
+ new_weight = self.compute_weight(rect)
if weight > new_weight:
weight = new_weight
@@ -66,7 +66,7 @@ class Grid(gobject.GObject):
self._child_rects[child] = rect
self._children.append(child)
- self._add_weight(self._child_rects[child])
+ self.add_weight(self._child_rects[child])
if locked:
self._locked_children.add(child)
@@ -75,19 +75,22 @@ class Grid(gobject.GObject):
def remove(self, child):
self._children.remove(child)
- self._remove_weight(self._child_rects[child])
+ self.remove_weight(self._child_rects[child])
self._locked_children.discard(child)
del self._child_rects[child]
+ if child in self._collisions:
+ self._collisions.remove(child)
+
def move(self, child, x, y, locked=False):
- self._remove_weight(self._child_rects[child])
+ self.remove_weight(self._child_rects[child])
rect = self._child_rects[child]
rect.x = x
rect.y = y
- weight = self._compute_weight(rect)
- self._add_weight(self._child_rects[child])
+ weight = self.compute_weight(rect)
+ self.add_weight(self._child_rects[child])
if locked:
self._locked_children.add(child)
@@ -141,7 +144,7 @@ class Grid(gobject.GObject):
best_rect = None
for new_rect in new_rects:
- new_weight = self._compute_weight(new_rect)
+ new_weight = self.compute_weight(new_rect)
if new_weight < weight:
best_rect = new_rect
weight = new_weight
@@ -157,10 +160,10 @@ class Grid(gobject.GObject):
collision = self._collisions.pop(0)
old_rect = self._child_rects[collision]
- self._remove_weight(old_rect)
- weight = self._compute_weight(old_rect)
+ self.remove_weight(old_rect)
+ weight = self.compute_weight(old_rect)
weight = self._shift_child(collision, weight)
- self._add_weight(self._child_rects[collision])
+ self.add_weight(self._child_rects[collision])
# TODO: we shouldn't give up the first time we failed to find a
# better position.
@@ -190,34 +193,9 @@ class Grid(gobject.GObject):
if child not in self._collisions:
self._collisions.append(child)
- if len(self._collisions) and not self._collisions_sid:
+ if self._collisions and not self._collisions_sid:
self._collisions_sid = gobject.timeout_add(_REFRESH_RATE,
self.__solve_collisions_cb, priority=gobject.PRIORITY_LOW)
- 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
-
def get_child_rect(self, child):
return self._child_rects[child]
diff --git a/src/view/home/spreadlayout.py b/src/view/home/spreadlayout.py
index f7584ab..0faabca 100644
--- a/src/view/home/spreadlayout.py
+++ b/src/view/home/spreadlayout.py
@@ -22,7 +22,7 @@ from sugar.graphics import style
from view.home.grid import Grid
-_CELL_SIZE = 4
+_CELL_SIZE = 4.0
class SpreadLayout(gobject.GObject, hippo.CanvasLayout):
__gtype_name__ = 'SugarSpreadLayout'
@@ -33,7 +33,7 @@ class SpreadLayout(gobject.GObject, hippo.CanvasLayout):
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 = Grid(int(width / _CELL_SIZE), int(height / _CELL_SIZE))
self._grid.connect('child-changed', self._grid_child_changed_cb)
def add(self, child):
@@ -66,10 +66,10 @@ class SpreadLayout(gobject.GObject, hippo.CanvasLayout):
min_h, child_height = child.get_height_request(child_width)
rect = self._grid.get_child_rect(child.item)
- child.allocate(rect.x * _CELL_SIZE,
- rect.y * _CELL_SIZE,
- rect.width * _CELL_SIZE,
- rect.height * _CELL_SIZE,
+ child.allocate(int(round(rect.x * _CELL_SIZE)),
+ int(round(rect.y * _CELL_SIZE)),
+ child_width,
+ child_height,
origin_changed)
def _get_child_grid_size(self, child):
diff --git a/src/view/keyhandler.py b/src/view/keyhandler.py
index ffed97c..993d09d 100644
--- a/src/view/keyhandler.py
+++ b/src/view/keyhandler.py
@@ -209,7 +209,7 @@ class KeyHandler(object):
keycodes = (80, 85, 88, 83, 80, 85, 88, 83)
keysyms = ("KP_Up", "KP_Right", "KP_Down", "KP_Left")
- self._screen_rotation += 1
+ self._screen_rotation -= 1
self._screen_rotation %= 4
actual_keycodes = keycodes[self._screen_rotation:self._screen_rotation
diff --git a/src/view/launchwindow.py b/src/view/launchwindow.py
index ee3ccfa..d954abc 100644
--- a/src/view/launchwindow.py
+++ b/src/view/launchwindow.py
@@ -17,8 +17,8 @@
import gtk
import hippo
import gobject
-import logging
+from sugar import wm
from sugar.graphics import style
from sugar.graphics import animator
from sugar.graphics.xocolor import XoColor
@@ -27,14 +27,15 @@ from model import shellmodel
from view.pulsingicon import CanvasPulsingIcon
class LaunchWindow(hippo.CanvasWindow):
- def __init__(self):
+ def __init__(self, home_activity):
gobject.GObject.__init__(
- self, type_hint=gtk.gdk.WINDOW_TYPE_HINT_SPLASHSCREEN)
+ self, type_hint=gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
- self._box = LaunchBox()
+ self._activity_id = home_activity.get_activity_id()
+ self._box = LaunchBox(home_activity)
self.set_root(self._box)
- self.connect('focus-out-event', self.__focus_out_event_cb)
+ self.connect('realize', self.__realize_cb)
screen = gtk.gdk.screen_get_default()
screen.connect('size-changed', self.__size_changed_cb)
@@ -48,18 +49,23 @@ class LaunchWindow(hippo.CanvasWindow):
def _update_size(self):
self.resize(gtk.gdk.screen_width(), gtk.gdk.screen_height())
- def __focus_out_event_cb(self, widget, event):
- self.hide()
-
+ def __realize_cb(self, widget):
+ wm.set_activity_id(widget.window, str(self._activity_id))
+ widget.window.property_change('_SUGAR_WINDOW_TYPE', 'STRING', 8,
+ gtk.gdk.PROP_MODE_REPLACE, 'launcher')
+
def __size_changed_cb(self, screen):
self._update_size()
class LaunchBox(hippo.CanvasBox):
- def __init__(self):
+ def __init__(self, home_activity):
gobject.GObject.__init__(self, orientation=hippo.ORIENTATION_VERTICAL,
background_color=style.COLOR_WHITE.get_int())
- self._activity_icon = CanvasPulsingIcon()
+ self._home_activity = home_activity
+ self._activity_icon = CanvasPulsingIcon(
+ file_name=home_activity.get_icon_path(),
+ pulse_color=home_activity.get_icon_color())
self.append(self._activity_icon, hippo.PACK_EXPAND)
# FIXME support non-xo colors in CanvasPulsingIcon
@@ -72,14 +78,13 @@ class LaunchBox(hippo.CanvasBox):
self._home = shellmodel.get_instance().get_home()
self._home.connect('active-activity-changed',
self.__active_activity_changed_cb)
- self._home.connect('launch-failed', self.__launch_ended_cb)
- self._home.connect('launch-completed', self.__launch_ended_cb)
- self._update_icon()
+ self.connect('destroy', self.__destroy_cb)
- def zoom_in(self):
- logging.debug('zooming in to activity')
+ def __destroy_cb(self, box):
+ self._home.disconnect_by_func(self.__active_activity_changed_cb)
+ def zoom_in(self):
self._activity_icon.props.size = style.STANDARD_ICON_SIZE
self._animator.remove_all()
@@ -87,35 +92,13 @@ class LaunchBox(hippo.CanvasBox):
style.STANDARD_ICON_SIZE,
style.XLARGE_ICON_SIZE))
self._animator.start()
-
- logging.debug('starting pulse')
-
self._activity_icon.props.pulsing = True
- def suspend(self):
- self._activity_icon.props.paused = True
-
- def resume(self):
- self._activity_icon.props.paused = False
-
- def _update_icon(self):
- activity = self._home.get_active_activity()
- if activity is not None:
- self._activity_icon.props.file_name = activity.get_icon_path()
- self._activity_icon.props.pulse_color = activity.get_icon_color()
- else:
- self._activity_icon.props.file_name = None
-
- if activity is not None and activity.props.launching:
- self.resume()
- else:
- self.suspend()
-
def __active_activity_changed_cb(self, model, activity):
- self._update_icon()
-
- def __launch_ended_cb(self, model, activity):
- self._update_icon()
+ if activity == self._home_activity:
+ self._activity_icon.props.paused = False
+ else:
+ self._activity_icon.props.paused = True
class _Animation(animator.Animation):
def __init__(self, icon, start_size, end_size):
diff --git a/src/view/palettes.py b/src/view/palettes.py
index dc04af8..416ff0f 100644
--- a/src/view/palettes.py
+++ b/src/view/palettes.py
@@ -123,9 +123,15 @@ class ActivityPalette(Palette):
menu_item.show()
registry = activity.get_registry()
- registry.connect('activity_changed', self.__activity_changed_cb)
+ self._activity_changed_sid = registry.connect('activity_changed',
+ self.__activity_changed_cb)
self._update_favorite_item()
+ self.connect('destroy', self.__destroy_cb)
+
+ def __destroy_cb(self, palette):
+ self.disconnect(self._activity_changed_sid)
+
def _update_favorite_item(self):
label = self._favorite_item.child
if self._favorite:
diff --git a/src/view/tabbinghandler.py b/src/view/tabbinghandler.py
index 03ce275..e3153b0 100644
--- a/src/view/tabbinghandler.py
+++ b/src/view/tabbinghandler.py
@@ -58,7 +58,6 @@ class TabbingHandler(object):
self._tabbing = False
else:
shell = view.Shell.get_instance()
- shell.take_activity_screenshot()
self._frame.show(self._frame.MODE_NON_INTERACTIVE)