From ad3c4f465e24458d8940e4674270ae39bfff378f Mon Sep 17 00:00:00 2001 From: Jonas Smedegaard Date: Sun, 19 Oct 2008 12:03:11 +0000 Subject: Merge commit 'v0.82.8' into upstream --- 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 \n" "Language-Team: Arabic \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 "2" msgstr "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 "1" msgstr "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 "R" #~ msgstr "ح" 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 \n" "Language-Team: German \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 "2" msgstr "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 "1" msgstr "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 \n" "Language-Team: LANGUAGE \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 "2" +msgstr "" + +#: ../src/view/home/HomeBox.py:321 +msgid "Favorites view" +msgstr "" + +#: ../src/view/home/HomeBox.py:322 +msgid "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 \n" "Language-Team: Fedora Spanish \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 "2" -msgstr "L" +msgstr "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 "1" -msgstr "L" +msgstr "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 \n" "Language-Team: French \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 "2" msgstr "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 "1" msgstr "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 "R" #~ msgstr "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 \n" +"POT-Creation-Date: 2008-08-19 17:12-0400\n" +"PO-Revision-Date: 2008-08-18 16:47-0400\n" +"Last-Translator: lacrete \n" "Language-Team: LANGUAGE \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 "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 "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 "2" +msgstr "2" + +#: ../src/view/home/HomeBox.py:325 +msgid "Favorites view" +msgstr "Fas prefere" + +#: ../src/view/home/HomeBox.py:326 +msgid "1" +msgstr "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 "R" +#~ msgstr "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 \n" "Language-Team: LANGUAGE \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 "2" msgstr "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 "1" msgstr "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 "R" #~ msgstr "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 \n" "Language-Team: LANGUAGE \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 "2" msgstr "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 "1" msgstr "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 \n" "Language-Team: LANGUAGE \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 "2" msgstr "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 "1" msgstr "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 \n" "Language-Team: LANGUAGE \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 "2" msgstr "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 "1" msgstr "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 \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 \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Pootle 1.0.2\n" +"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 "2" +msgstr "2" + +#: ../src/view/home/HomeBox.py:321 +msgid "Favorites view" +msgstr "Vista de Favoritos" + +#: ../src/view/home/HomeBox.py:322 +msgid "1" +msgstr "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 \n" "Language-Team: LANGUAGE \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 "2" -msgstr "L" +msgstr "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 "1" -msgstr "L" +msgstr "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) -- cgit v0.9.1